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:
80
bot.py
Normal file
80
bot.py
Normal 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)
|
||||
Reference in New Issue
Block a user