from __future__ import annotations import logging from telegram.ext import Application, CommandHandler from app.core.config import settings from app.handlers.conversation import build_conversation from app.handlers.profile import my_profile_handler, edit_hint_handler from app.handlers.admin import ( list_candidates_handler, candlist_pager, callback_router, view_candidate_handler, list_start, list_gender, list_city, list_verified, list_active, list_results_pager ) logging.basicConfig(level=logging.INFO, format="%(levelname)s %(name)s: %(message)s") log = logging.getLogger("bot") async def start_cmd(update, context): await update.message.reply_text("Бот запущен. Набери /new, чтобы заполнить анкету.") def build_app() -> Application: if not settings.BOT_TOKEN: raise RuntimeError("BOT_TOKEN is empty. Set it in .env") app = Application.builder().token(settings.BOT_TOKEN).build() # визард пользователя app.add_handler(build_conversation()) # базовые app.add_handler(CommandHandler("start", start_cmd)) app.add_handler(CommandHandler("my", my_profile_handler)) app.add_handler(CommandHandler("edit", edit_hint_handler)) # админские app.add_handler(CommandHandler("candidates", list_candidates_handler)) app.add_handler(CommandHandler("view", view_candidate_handler)) app.add_handler(CommandHandler("list", list_start)) app.add_handler(CommandHandler("verify", lambda u, c: None)) # заглушка если где-то есть старая команда # callback-и from telegram.ext import CallbackQueryHandler, ConversationHandler, MessageHandler, filters app.add_handler(CallbackQueryHandler(candlist_pager, pattern=r"^candlist:page:")) app.add_handler(CallbackQueryHandler(callback_router, pattern=r"^cand:")) list_conv = ConversationHandler( entry_points=[CommandHandler("list", list_start)], states={ 0: [CallbackQueryHandler(list_gender, pattern=r"^list:gender:")], 1: [CallbackQueryHandler(list_city, pattern=r"^list:city:"), MessageHandler(filters.TEXT & ~filters.COMMAND, list_city)], 2: [CallbackQueryHandler(list_verified, pattern=r"^list:verified:")], 3: [CallbackQueryHandler(list_active, pattern=r"^list:active:")], }, fallbacks=[], allow_reentry=True, ) app.add_handler(list_conv) app.add_handler(CallbackQueryHandler(list_results_pager, pattern=r"^listres:page:")) return app if __name__ == "__main__": try: log.info("Starting bot…") log.info("DB URL masked is set: %s", "***" if settings.DATABASE_URL else "") application = build_app() application.run_polling(close_loop=False) except Exception as e: log.exception("Bot crashed on startup: %s", e) raise