Implement user-specific question numbering and update database schema. Added triggers for automatic question numbering and adjustments upon deletion. Enhanced CRUD operations to manage user_question_number effectively.

This commit is contained in:
2025-09-06 18:35:12 +03:00
parent 50be010026
commit 596a2fa813
111 changed files with 16847 additions and 65 deletions

80
bot.py Normal file
View File

@@ -0,0 +1,80 @@
"""
Основной файл для запуска Telegram бота анонимных вопросов
"""
import asyncio
import sys
from pathlib import Path
# Добавляем корневую директорию в путь для импортов
sys.path.append(str(Path(__file__).parent))
from config import config
from loader import loader
from services.infrastructure.http_server import start_http_server, stop_http_server
from services.infrastructure.logger import get_logger
from services.infrastructure.pid_manager import get_pid_manager, cleanup_pid_file
from config.constants import DEFAULT_HTTP_HOST, DEFAULT_HTTP_PORT
# Настройка логирования
logger = get_logger(__name__)
async def main():
"""Главная функция для запуска бота"""
http_runner = None
pid_manager = None
try:
logger.info("🤖 Запуск бота анонимных вопросов...")
logger.info(f"📊 Режим отладки: {'Включен' if config.DEBUG else 'Выключен'}")
logger.info(f"💾 База данных: {config.DATABASE_PATH}")
logger.info(f"👑 Администраторы: {config.ADMINS}")
# Создаем PID файл для отслеживания процесса
logger.info("📄 Создание PID файла...")
pid_manager = get_pid_manager("anon_bot")
if not pid_manager.create_pid_file():
logger.error("Не удалось создать PID файл, завершаем работу")
return
logger.info(f"✅ PID файл создан: {pid_manager.get_pid_file_path()}")
# Запускаем HTTP сервер для метрик и health check
logger.info("🌐 Запуск HTTP сервера для метрик...")
http_runner = await start_http_server(host=DEFAULT_HTTP_HOST, port=DEFAULT_HTTP_PORT)
# Запускаем бота
await loader.start_polling()
except KeyboardInterrupt:
logger.info("⏹️ Получен сигнал остановки (Ctrl+C)")
except Exception as e:
logger.error(f"💥 Критическая ошибка: {e}")
raise
finally:
# Останавливаем HTTP сервер
if http_runner:
logger.info("🛑 Остановка HTTP сервера...")
await stop_http_server(http_runner)
# Очищаем PID файл
if pid_manager:
logger.info("📄 Очистка PID файла...")
pid_manager.cleanup_pid_file()
logger.info("🛑 Бот остановлен")
if __name__ == "__main__":
try:
# Проверяем конфигурацию перед запуском
config.validate()
# Запускаем бота
asyncio.run(main())
except ValueError as e:
logger.error(f"❌ Ошибка конфигурации: {e}")
sys.exit(1)
except Exception as e:
logger.error(f"💥 Неожиданная ошибка: {e}")
sys.exit(1)