import logging import signal import sys from telegram.ext import ( Application, CallbackQueryHandler, CommandHandler, MessageHandler, filters, ) from bot.config import BOT_TOKEN, LOG_LEVEL from bot.handlers import ( handle_callback, handle_snooze_input, help_command, list_reminders, reminder_conv_handler, start, ) from bot.models import init_db from bot.scheduler import init_scheduler, shutdown_scheduler logging.basicConfig( format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", level=getattr(logging, LOG_LEVEL, logging.INFO), ) logger = logging.getLogger(__name__) def main() -> None: # Initialize database init_db() logger.info("Database initialized") # Build application app = Application.builder().token(BOT_TOKEN).build() # Initialize scheduler init_scheduler(app.bot) # Register handlers (group=0) app.add_handler(CommandHandler("start", start)) app.add_handler(CommandHandler("help", help_command)) app.add_handler(MessageHandler(filters.Regex("^❓ 帮助$"), help_command)) app.add_handler(reminder_conv_handler) app.add_handler(CommandHandler("list", list_reminders)) app.add_handler(MessageHandler(filters.Regex("^📋 我的提醒$"), list_reminders)) app.add_handler(CallbackQueryHandler(handle_callback)) # Snooze minutes input in group=1, after ConversationHandler. # handle_snooze_input checks user_data and returns early if not waiting for input. app.add_handler( MessageHandler(filters.TEXT & ~filters.COMMAND, handle_snooze_input), group=1, ) # Graceful shutdown def signal_handler(sig, frame): logger.info("Shutting down...") shutdown_scheduler() sys.exit(0) signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) # Start bot logger.info("Bot started") app.run_polling(allowed_updates=["message", "callback_query"]) if __name__ == "__main__": main()