|
1 | 1 | """Entry point for the Python Italy Telegram Bot.""" |
2 | 2 |
|
3 | 3 | import logging |
| 4 | +from datetime import datetime, timezone |
4 | 5 |
|
5 | 6 | from telegram.ext import ApplicationBuilder |
6 | 7 |
|
|
11 | 12 | from .handlers.moderation import create_moderation_handlers |
12 | 13 | from .handlers.ping import create_ping_handlers |
13 | 14 | from .handlers.settings import create_settings_handlers |
| 15 | + |
14 | 16 | # from .handlers.spam import create_spam_handler |
15 | 17 | from .handlers.utils import create_user_tracking_handler |
16 | | -from .handlers.welcome import create_welcome_handlers |
| 18 | +from .handlers.welcome import ( |
| 19 | + DEFAULT_WELCOME_DELAY_MINUTES, |
| 20 | + _delete_welcome_message, |
| 21 | + create_welcome_handlers, |
| 22 | +) |
17 | 23 | from .services.captcha import CaptchaService |
18 | 24 | from .services.moderation import ModerationService |
19 | 25 | # from .services.spam_detector import SpamDetector |
@@ -61,6 +67,51 @@ async def _post_init(application) -> None: |
61 | 67 | application.add_handler(handler) |
62 | 68 | # application.add_handler(create_spam_handler(spam_detector)) |
63 | 69 |
|
| 70 | + # Re-schedule deletion for welcome messages persisted before a restart |
| 71 | + await _reschedule_welcome_deletions(application, captcha_service) |
| 72 | + |
| 73 | + |
| 74 | +async def _reschedule_welcome_deletions( |
| 75 | + application, captcha_service: CaptchaService |
| 76 | +) -> None: |
| 77 | + """Re-schedule deletion jobs for welcome messages that survived a bot restart.""" |
| 78 | + job_queue = application.job_queue |
| 79 | + if job_queue is None: |
| 80 | + return |
| 81 | + |
| 82 | + messages = await captcha_service.get_all_welcome_messages() |
| 83 | + if not messages: |
| 84 | + return |
| 85 | + |
| 86 | + now = datetime.now(timezone.utc) |
| 87 | + welcome_map = application.bot_data.setdefault("welcome_message_map", {}) |
| 88 | + scheduled = 0 |
| 89 | + |
| 90 | + for chat_id, message_id, user_id, created_at in messages: |
| 91 | + # Restore in-memory mapping for ban-by-reply |
| 92 | + welcome_map[(chat_id, message_id)] = user_id |
| 93 | + |
| 94 | + delay_minutes = await captcha_service.get_welcome_delay(chat_id) |
| 95 | + if delay_minutes is None: |
| 96 | + delay_minutes = DEFAULT_WELCOME_DELAY_MINUTES |
| 97 | + if delay_minutes <= 0: |
| 98 | + continue |
| 99 | + |
| 100 | + # Calculate remaining time; delete immediately if overdue |
| 101 | + elapsed = (now - created_at).total_seconds() |
| 102 | + remaining = max(delay_minutes * 60 - elapsed, 0) |
| 103 | + |
| 104 | + job_queue.run_once( |
| 105 | + _delete_welcome_message, |
| 106 | + when=remaining, |
| 107 | + data=(chat_id, message_id), |
| 108 | + name=f"del_welcome_{chat_id}_{message_id}", |
| 109 | + ) |
| 110 | + scheduled += 1 |
| 111 | + |
| 112 | + if scheduled: |
| 113 | + logger.info("Re-scheduled deletion for %d welcome message(s)", scheduled) |
| 114 | + |
64 | 115 |
|
65 | 116 | async def _post_shutdown(application) -> None: |
66 | 117 | """Clean up resources on shutdown.""" |
|
0 commit comments