init commit

This commit is contained in:
2025-12-18 05:55:32 +09:00
commit a6817e487e
72 changed files with 13847 additions and 0 deletions

122
app/__init__.py Normal file
View File

@@ -0,0 +1,122 @@
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())