✅ Проведено полное тестирование функционала: - Меню жильца (11 кнопок) - Меню админа (17 кнопок) - База данных (проверка записей) - Уникальность callback_data - Сообщения в личку (без спама) 📝 Созданные файлы: - tests/run_tests.py — автотесты - tests/TEST_REPORT.md — отчёт о тестировании - tests/COMPREHENSIVE_TEST_PLAN.md — план тестов - send_test_report.py — отправка отчёта 📊 Результаты: - Все кнопки работают - Участковский работает через БД (2 записи) - Сообщения только в личку - Веб-админка работает со всеми разделами 🎯 ВСЁ РАБОТАЕТ! Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
82 lines
2.8 KiB
Python
82 lines
2.8 KiB
Python
"""
|
|
Конфигурация бота
|
|
"""
|
|
import os
|
|
from dotenv import load_dotenv
|
|
from pathlib import Path
|
|
|
|
# Загружаем переменные окружения (override=True для перезагрузки)
|
|
load_dotenv(override=True)
|
|
|
|
# Telegram
|
|
BOT_TOKEN = os.getenv('BOT_TOKEN', '')
|
|
ADMIN_CHAT_ID = int(os.getenv('ADMIN_CHAT_ID', '0'))
|
|
ADMIN_USER_ID = int(os.getenv('ADMIN_USER_ID', '0'))
|
|
|
|
# База данных
|
|
BASE_DIR = Path(__file__).resolve().parent
|
|
DATABASE_PATH = os.getenv('DATABASE_PATH', str(BASE_DIR / 'database' / 'domovoy.db'))
|
|
|
|
# Экспорт
|
|
EXPORT_DIR = os.getenv('EXPORT_DIR', str(BASE_DIR / 'exports'))
|
|
EXPORT_SCHEDULE = os.getenv('EXPORT_SCHEDULE', '0 3 * * 0')
|
|
|
|
# Детект шпионов
|
|
SPY_DETECTION_ENABLED = os.getenv('SPY_DETECTION_ENABLED', 'true').lower() == 'true'
|
|
SPY_ALERT_USER_ID = int(os.getenv('SPY_ALERT_USER_ID', '0'))
|
|
|
|
# Логирование
|
|
LOG_LEVEL = os.getenv('LOG_LEVEL', 'INFO')
|
|
LOG_FILE = os.getenv('LOG_FILE', str(BASE_DIR / 'logs' / 'bot.log'))
|
|
|
|
# ===== ПРОКСИ =====
|
|
USE_PROXY = os.getenv('USE_PROXY', 'false').lower() == 'true'
|
|
PROXY_TYPE = os.getenv('PROXY_TYPE', 'socks5').lower()
|
|
PROXY_HOST = os.getenv('PROXY_HOST', '127.0.0.1')
|
|
PROXY_PORT = int(os.getenv('PROXY_PORT', '10808'))
|
|
|
|
# ===== ВЕБ-ИНТЕРФЕЙС =====
|
|
WEB_ADMIN_LOGIN = os.getenv('WEB_ADMIN_LOGIN', 'admin')
|
|
WEB_ADMIN_PASSWORD = os.getenv('WEB_ADMIN_PASSWORD', 'admin')
|
|
WEB_ADMIN_HOST = os.getenv('WEB_ADMIN_HOST', '0.0.0.0')
|
|
WEB_ADMIN_PORT = int(os.getenv('WEB_ADMIN_PORT', '8000'))
|
|
|
|
# Проверка критичных настроек
|
|
if not BOT_TOKEN:
|
|
raise ValueError('BOT_TOKEN не настроен! Проверьте .env файл')
|
|
|
|
if not ADMIN_CHAT_ID:
|
|
raise ValueError('ADMIN_CHAT_ID не настроен!')
|
|
|
|
if not ADMIN_USER_ID:
|
|
raise ValueError('ADMIN_USER_ID не настроен! Укажите ваш Telegram ID')
|
|
|
|
|
|
def get_proxy_url() -> str | None:
|
|
"""Получить URL прокси для aiohttp"""
|
|
if not USE_PROXY:
|
|
return None
|
|
|
|
if PROXY_TYPE == 'http':
|
|
return f'http://{PROXY_HOST}:{PROXY_PORT}'
|
|
elif PROXY_TYPE == 'socks5':
|
|
return f'socks5://{PROXY_HOST}:{PROXY_PORT}'
|
|
elif PROXY_TYPE == 'socks4':
|
|
return f'socks4://{PROXY_HOST}:{PROXY_PORT}'
|
|
else:
|
|
return f'socks5://{PROXY_HOST}:{PROXY_PORT}'
|
|
|
|
|
|
# Вспомогательные функции
|
|
def get_admin_ids():
|
|
"""Список ID администраторов"""
|
|
ids = [ADMIN_USER_ID]
|
|
extra_ids = os.getenv('EXTRA_ADMIN_IDS', '')
|
|
if extra_ids:
|
|
ids.extend([int(x.strip()) for x in extra_ids.split(',')])
|
|
return ids
|
|
|
|
|
|
def is_admin(user_id: int) -> bool:
|
|
"""Проверка, является ли пользователь админом"""
|
|
return user_id in get_admin_ids()
|