ReminderBot/bot/main.py
leo 9ac7e88ac6 feat: replace fixed 10-min snooze with user-defined snooze duration
- Add snooze.py handler: prompts user for snooze minutes and schedules
  a one-shot job with a cancel button (cancel_snooze_<id>)
- Refactor callback.py: support compound action prefix parsing for
  cancel_snooze_*, switch snooze action to prompt-based flow
- Add snooze_action_keyboard() in keyboards.py; update snooze button label
- Register handle_snooze_input in group=1 to avoid ConversationHandler conflict
- Filter completed once-type reminders from get_user_reminders()
- Fix DateTrigger: compare and localize once_time in UTC consistently

Co-Authored-By: claude-sonnet-4-6 <noreply@anthropic.com>
2026-03-05 15:19:02 +08:00

78 lines
2.0 KiB
Python

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()