Соцсети: добавлена кнопка-ссылка на сайт infocyber.pro
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+21
-3
@@ -76,10 +76,21 @@ _rate_hits = defaultdict(list)
|
||||
_submit_lock = threading.Lock()
|
||||
|
||||
|
||||
_last_rate_cleanup = 0.0
|
||||
|
||||
|
||||
def is_rate_limited(ip: str) -> bool:
|
||||
"""True, если с этого IP было слишком много заявок за окно времени."""
|
||||
global _last_rate_cleanup
|
||||
now = time.time()
|
||||
with _rate_lock:
|
||||
# Периодически выметаем протухшие IP, чтобы словарь не рос бесконечно
|
||||
if now - _last_rate_cleanup > RATE_LIMIT_WINDOW:
|
||||
for old_ip in [k for k, v in _rate_hits.items()
|
||||
if not v or now - v[-1] >= RATE_LIMIT_WINDOW]:
|
||||
del _rate_hits[old_ip]
|
||||
_last_rate_cleanup = now
|
||||
|
||||
hits = [t for t in _rate_hits[ip] if now - t < RATE_LIMIT_WINDOW]
|
||||
if len(hits) >= RATE_LIMIT_MAX:
|
||||
_rate_hits[ip] = hits
|
||||
@@ -196,7 +207,8 @@ def generate_next_id():
|
||||
"""Генерирует следующий ID заявки. Источник правды — SQLite; Excel используется как запасной."""
|
||||
if db:
|
||||
try:
|
||||
return f"id_{db.count_web_registrations() + 1:03d}"
|
||||
# По max(номеру), а не по COUNT — иначе при удалении записей возможна коллизия PRIMARY KEY
|
||||
return db.next_web_registration_id()
|
||||
except Exception as e:
|
||||
print(f"Не удалось получить счётчик из SQLite ({e}), используем Excel как запасной источник.")
|
||||
# Запасной вариант — по строкам Excel
|
||||
@@ -265,9 +277,15 @@ def _add_registration_locked(data):
|
||||
# Промокод пока выключен флагом config.PROMO_ENABLED
|
||||
promo = gen_promo() if (config and getattr(config, "PROMO_ENABLED", False)) else None
|
||||
|
||||
# 1. Запись в SQLite базу данных — основной приёмник, выполняется первым
|
||||
# 1. Запись в SQLite базу данных — основной приёмник, выполняется первым.
|
||||
# Ошибка записи (например, коллизия ID) НЕ должна срывать остальные каналы
|
||||
# доставки (Excel/VK/почта) — иначе заявка теряется целиком.
|
||||
if db:
|
||||
db.add_web_registration(next_id, data)
|
||||
try:
|
||||
db.add_web_registration(next_id, data)
|
||||
except Exception as reg_err:
|
||||
print(f"[{current_time}] ⚠️ Не удалось записать web_registration {next_id}: {reg_err}. "
|
||||
f"Продолжаем доставку через Excel/VK/почту.")
|
||||
# Единый журнал заявок для статистики (source='web')
|
||||
try:
|
||||
db.add_lead(
|
||||
|
||||
Reference in New Issue
Block a user