Админка: показ/скрытие кнопок меню + экстренный стоп бота (/favi-stop)
1) Кнопки меню: раздел «Кнопки меню 🧩» в админке — показать/скрыть любую кнопку главного меню (Подобрать/Интенсив/Цены/Вопрос/Вебинар). Флаги в БД (bot_flags), дефолты в config.MENU_FEATURES (вебинар по умолчанию скрыт). Скрытый раздел не реагирует и на кодовые слова (интенсив выкл → «лето» игнорируется). Вебинар получил кнопку в меню (для теста ветки) + вход по callback из поста работает всегда. 2) Экстренное отключение (только супер-админ): /favi-stop → запрос пароля → бот уходит в аварийный режим и молчит для всех; /favi-start возвращает. Пароль хранится как PBKDF2-хэш в .env (FAVI_STOP_HASH), не в коде; сравнение константное, 3 попытки. pytest 43 passed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+29
@@ -183,6 +183,15 @@ class DatabaseManager:
|
||||
)
|
||||
""")
|
||||
|
||||
# Table for feature flags (показ/скрытие кнопок меню и разделов)
|
||||
cursor.execute("""
|
||||
CREATE TABLE IF NOT EXISTS bot_flags (
|
||||
key TEXT PRIMARY KEY,
|
||||
enabled INTEGER NOT NULL,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
)
|
||||
""")
|
||||
|
||||
conn.commit()
|
||||
|
||||
# ---------- Редактируемые ссылки (кнопки записи/оплаты) ----------
|
||||
@@ -212,6 +221,26 @@ class DatabaseManager:
|
||||
)
|
||||
conn.commit()
|
||||
|
||||
# ---------- Фиче-флаги (показ/скрытие кнопок меню) ----------
|
||||
def get_flag(self, key: str, default: bool = True) -> bool:
|
||||
"""Включён ли раздел/кнопка. Если в БД нет записи — возвращает default."""
|
||||
with self._get_connection() as conn:
|
||||
cursor = conn.cursor()
|
||||
cursor.execute("SELECT enabled FROM bot_flags WHERE key = ?", (key,))
|
||||
row = cursor.fetchone()
|
||||
return bool(row[0]) if row is not None else default
|
||||
|
||||
def set_flag(self, key: str, enabled: bool):
|
||||
"""Включить/выключить раздел или кнопку."""
|
||||
with self._get_connection() as conn:
|
||||
cursor = conn.cursor()
|
||||
cursor.execute(
|
||||
"INSERT INTO bot_flags (key, enabled) VALUES (?, ?) "
|
||||
"ON CONFLICT(key) DO UPDATE SET enabled = excluded.enabled, updated_at = CURRENT_TIMESTAMP",
|
||||
(key, 1 if enabled else 0)
|
||||
)
|
||||
conn.commit()
|
||||
|
||||
def get_user_data(self, user_id: int) -> Dict[str, Any]:
|
||||
"""Retrieve user state and collected data."""
|
||||
with self._get_connection() as conn:
|
||||
|
||||
Reference in New Issue
Block a user