Files
TG_autoposter/app/__init__.py
2025-12-18 05:55:32 +09:00

123 lines
4.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import os
import logging
from dotenv import load_dotenv
from telegram.ext import (
Application,
CommandHandler,
CallbackQueryHandler,
ChatMemberHandler,
ConversationHandler,
MessageHandler,
filters,
)
from app.database import init_db
from app.handlers import (
start,
help_command,
start_callback,
manage_messages,
manage_groups,
list_messages,
list_groups,
send_message,
my_chat_member,
)
from app.handlers.message_manager import (
create_message_start,
create_message_title,
create_message_text,
select_groups,
CREATE_MSG_TITLE,
CREATE_MSG_TEXT,
SELECT_GROUPS,
)
from app.handlers.telethon_client import telethon_manager
from app.utils.keyboards import CallbackType
from app.settings import Config
# Загружаем переменные окружения
load_dotenv()
# Настройка логирования
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO
)
logger = logging.getLogger(__name__)
# Получаем конфигурацию
if not Config.validate():
raise ValueError("❌ Конфигурация некорректна. Проверьте .env файл")
async def main() -> None:
"""Запуск бота с поддержкой гибридного режима"""
# Инициализируем БД
logger.info("Инициализация базы данных...")
await init_db()
logger.info("✅ База данных инициализирована")
# Инициализируем Telethon если включен
if Config.USE_TELETHON:
logger.info("Инициализация Telethon клиента...")
success = await telethon_manager.initialize()
if success:
logger.info("✅ Telethon клиент инициализирован")
else:
logger.warning("⚠️ Ошибка инициализации Telethon, продолжим с режимом бота")
# Выводим информацию о режиме
mode = Config.get_mode()
logger.info(f"📡 Режим работы: {mode}")
if mode == 'hybrid':
logger.info("🔀 Бот будет использовать Telethon как fallback для закрытых групп")
# Создаем приложение
application = Application.builder().token(Config.TELEGRAM_BOT_TOKEN).build()
# Добавляем обработчики команд
application.add_handler(CommandHandler("start", start))
application.add_handler(CommandHandler("help", help_command))
# ConversationHandler для создания сообщения
create_message_handler = ConversationHandler(
entry_points=[CallbackQueryHandler(create_message_start, pattern=f"^{CallbackType.CREATE_MESSAGE}$")],
states={
CREATE_MSG_TITLE: [MessageHandler(filters.TEXT & ~filters.COMMAND, create_message_title)],
CREATE_MSG_TEXT: [MessageHandler(filters.TEXT & ~filters.COMMAND, create_message_text)],
SELECT_GROUPS: [CallbackQueryHandler(select_groups, pattern=r"^(select_group_\d+|done_groups|main_menu)$")],
},
fallbacks=[CommandHandler("cancel", start)],
)
application.add_handler(create_message_handler)
# Добавляем обработчики callback'ов
application.add_handler(CallbackQueryHandler(start_callback, pattern=f"^{CallbackType.MAIN_MENU}$"))
application.add_handler(CallbackQueryHandler(manage_messages, pattern=f"^{CallbackType.MANAGE_MESSAGES}$"))
application.add_handler(CallbackQueryHandler(manage_groups, pattern=f"^{CallbackType.MANAGE_GROUPS}$"))
application.add_handler(CallbackQueryHandler(list_messages, pattern=f"^{CallbackType.LIST_MESSAGES}$"))
application.add_handler(CallbackQueryHandler(list_groups, pattern=f"^{CallbackType.LIST_GROUPS}$"))
# Отправка сообщений
application.add_handler(CallbackQueryHandler(send_message, pattern=r"^send_msg_\d+$"))
# Обработчик добавления/удаления бота из групп
application.add_handler(ChatMemberHandler(my_chat_member, ChatMemberHandler.MY_CHAT_MEMBER))
# Запускаем бота
logger.info("🚀 Бот запущен. Ожидание команд...")
try:
await application.run_polling(allowed_updates=["message", "callback_query", "my_chat_member"])
finally:
# Завершить Telethon клиент при выходе
if Config.USE_TELETHON:
logger.info("Завершение работы Telethon клиента...")
await telethon_manager.shutdown()
logger.info("✅ Telethon клиент остановлен")
if __name__ == "__main__":
import asyncio
asyncio.run(main())