import logging from telegram.ext import ApplicationBuilder, CommandHandler, MessageHandler, CallbackQueryHandler, ChatMemberHandler, filters from app.config import load_config from app.bot.handlers.start import start, help_cmd, groups_cmd from app.bot.handlers.add_group import add_group_cmd, add_group_capture from app.bot.handlers.drafts import new_cmd, on_text from app.bot.handlers.media import on_media from app.bot.handlers.callbacks import on_callback from app.bot.handlers.join_info import on_my_chat_member from app.bot.handlers.chat_id_cmd import chat_id_cmd from app.bot.handlers.bind_chat import bind_chat_cb from app.bot.handlers.security import security_cmd, security_cb, spam_import_cmd, spam_import_capture from app.bot.handlers.moderation import moderate_message from app.bot.handlers.errors import on_error from app.bot.handlers.mod_status import mod_status_cmd from app.infra.metrics import start_metrics_server from app.bot.handlers.security import dicts_cmd, dicts_cb def main(): cfg = load_config() logging.basicConfig(level=getattr(logging, cfg.log_level.upper(), logging.INFO)) app = ApplicationBuilder().token(cfg.bot_token).build() # Commands app.add_handler(CommandHandler("start", start)) app.add_handler(CommandHandler("help", help_cmd)) app.add_handler(CommandHandler("groups", groups_cmd)) app.add_handler(CommandHandler("add_group", add_group_cmd)) app.add_handler(CommandHandler("new", new_cmd)) app.add_handler(CommandHandler("id", chat_id_cmd)) app.add_handler(CommandHandler("mod_status", mod_status_cmd)) # команды app.add_handler(CommandHandler("dicts", dicts_cmd)) # коллбэки словарей app.add_handler(CallbackQueryHandler(dicts_cb, pattern=r"^dict:")) # Callbacks (order matters!) app.add_handler(CallbackQueryHandler(security_cb, pattern=r"^pol:")) app.add_handler(CallbackQueryHandler(bind_chat_cb, pattern=r"^bind:")) app.add_handler(CallbackQueryHandler(on_callback, pattern=r"^(draft_|tgl:|selall:|clear:|sendmulti:)")) # Private chat helpers app.add_handler(MessageHandler(filters.ChatType.PRIVATE & filters.FORWARDED, add_group_capture)) app.add_handler(MessageHandler(filters.ChatType.PRIVATE & (filters.PHOTO | filters.VIDEO | filters.ANIMATION), on_media)) # Join/rights updates app.add_handler(ChatMemberHandler(on_my_chat_member, chat_member_types=ChatMemberHandler.MY_CHAT_MEMBER)) # Security / Dict app.add_handler(CommandHandler("security", security_cmd)) app.add_handler(CommandHandler("spam_import", spam_import_cmd, filters.ChatType.PRIVATE)) async def spam_import_redirect(update, ctx): await update.effective_message.reply_text("Эту команду нужно выполнять в ЛС. Откройте чат со мной и пришлите /spam_import.") app.add_handler(CommandHandler("spam_import", spam_import_redirect, filters.ChatType.GROUPS)) app.add_handler(MessageHandler(filters.ChatType.PRIVATE & filters.Document.ALL, spam_import_capture)) from app.bot.handlers.security import spam_import_text_capture app.add_handler(MessageHandler(filters.ChatType.PRIVATE & filters.TEXT & ~filters.COMMAND, spam_import_text_capture, block=False)) # Moderation app.add_handler(MessageHandler(filters.ChatType.GROUPS & ~filters.COMMAND, moderate_message)) # Draft editor (after import handlers) app.add_handler(MessageHandler(filters.ChatType.PRIVATE & filters.TEXT & ~filters.COMMAND, on_text)) start_metrics_server(cfg.metrics_port) app.run_polling(allowed_updates=None) if __name__ == "__main__": main()