# app/main.py import logging from telegram.ext import ApplicationBuilder from app.config import load_config from app.infra.metrics import start_metrics_server # глобальные колбэки (узкие паттерны) и ошибки — держим в main from app.bot.handlers.callbacks import on_callback from app.bot.handlers.bind_chat import bind_chat_cb from app.bot.handlers.security import security_cb from app.bot.handlers.dict_commands import ( dicts_link_cmd, dicts_unlink_cmd, dicts_link_all_cmd, dicts_unlink_all_cmd, dicts_linked_cmd, ) from app.bot.handlers.errors import on_error # роутеры from app.bot.routers.private import register_private_handlers from app.bot.routers.group import register_group_handlers from app.bot.routers.channel import register_channel_handlers def main(): cfg = load_config() logging.basicConfig(level=getattr(logging, cfg.log_level.upper(), logging.INFO)) # приглушим шум httpx/httpcore logging.getLogger("httpx").setLevel(logging.WARNING) logging.getLogger("httpx").propagate = False logging.getLogger("httpcore").setLevel(logging.WARNING) logging.getLogger("httpcore").propagate = False # метрики Prometheus start_metrics_server(cfg.metrics_port) app = ApplicationBuilder().token(cfg.bot_token).build() # === РОУТЕРЫ по типам чатов === register_private_handlers(app) # ЛС register_group_handlers(app) # группы/супергруппы register_channel_handlers(app) # каналы # === УЗКИЕ callback-и, общий для редактора === from telegram.ext import CallbackQueryHandler # настройки защитника app.add_handler(CallbackQueryHandler(security_cb, pattern=r"^pol:")) # привязка канала кнопкой «Привязать этот канал» app.add_handler(CallbackQueryHandler(bind_chat_cb, pattern=r"^bind:")) # редактор/мультивыбор (включаем все draft_* и тумблеры) app.add_handler(CallbackQueryHandler( on_callback, pattern=r"^(draft_.*|tgl:|selall:|clear:|sendmulti:)" )) # (опционально) текстовые команды управления словарями (и в ЛС, и в группе) from telegram.ext import CommandHandler app.add_handler(CommandHandler("dicts_link", dicts_link_cmd)) app.add_handler(CommandHandler("dicts_unlink", dicts_unlink_cmd)) app.add_handler(CommandHandler("dicts_link_all", dicts_link_all_cmd)) app.add_handler(CommandHandler("dicts_unlink_all", dicts_unlink_all_cmd)) app.add_handler(CommandHandler("dicts_linked", dicts_linked_cmd)) # ошибки app.add_error_handler(on_error) app.run_polling(allowed_updates=None) if __name__ == "__main__": main()