Skip to content

Commit e98eb92

Browse files
he-yufengSoulter
andauthored
fix: prevent Telegram media group exceptions from being silently swallowed (#7537)
* fix: prevent Telegram media group exceptions from being silently swallowed process_media_group() is invoked by APScheduler via add_job(). If convert_message() or handle_msg() raises (e.g. get_file() network timeout, file download failure), APScheduler catches the exception internally and only logs it through its own logger, which is often not configured in AstrBot. The result is that the media group silently disappears with no trace in the application logs. Two changes: - Wrap the body of process_media_group() in try/except so failures are logged through AstrBot's own logger with full traceback. - Register an EVENT_JOB_ERROR listener on the scheduler as a safety net, so any future scheduled job that throws will also surface in the logs. Fixes #7512 * ruff format --------- Co-authored-by: Soulter <905617992@qq.com>
1 parent 3524551 commit e98eb92

1 file changed

Lines changed: 36 additions & 21 deletions

File tree

astrbot/core/platform/sources/telegram/tg_adapter.py

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from contextlib import suppress
77
from typing import cast
88

9+
from apscheduler.events import EVENT_JOB_ERROR
910
from apscheduler.schedulers.asyncio import AsyncIOScheduler
1011
from telegram import BotCommand, Update
1112
from telegram.constants import ChatType
@@ -80,6 +81,15 @@ def __init__(
8081
self.last_command_hash = None
8182

8283
self.scheduler = AsyncIOScheduler()
84+
self.scheduler.add_listener(
85+
lambda ev: logger.error(
86+
"Scheduled job %s raised: %s",
87+
ev.job_id,
88+
ev.exception,
89+
exc_info=ev.exception,
90+
),
91+
EVENT_JOB_ERROR,
92+
)
8393
self._terminating = False
8494
self._loop: asyncio.AbstractEventLoop | None = None
8595
self._polling_recovery_requested = asyncio.Event()
@@ -695,31 +705,36 @@ async def process_media_group(self, media_group_id: str) -> None:
695705
f"Processing media group {media_group_id}, total {len(updates_and_contexts)} items"
696706
)
697707

698-
# Use the first update to create the base message (with reply, caption, etc.)
699-
first_update, first_context = updates_and_contexts[0]
700-
abm = await self.convert_message(first_update, first_context)
708+
try:
709+
# Use the first update to create the base message (with reply, caption, etc.)
710+
first_update, first_context = updates_and_contexts[0]
711+
abm = await self.convert_message(first_update, first_context)
701712

702-
if not abm:
703-
logger.warning(
704-
f"Failed to convert the first message of media group {media_group_id}"
705-
)
706-
return
713+
if not abm:
714+
logger.warning(
715+
f"Failed to convert the first message of media group {media_group_id}"
716+
)
717+
return
707718

708-
# Add additional media from remaining updates by reusing convert_message
709-
for update, context in updates_and_contexts[1:]:
710-
# Convert the message but skip reply chains (get_reply=False)
711-
extra = await self.convert_message(update, context, get_reply=False)
712-
if not extra:
713-
continue
719+
# Add additional media from remaining updates by reusing convert_message
720+
for update, context in updates_and_contexts[1:]:
721+
# Convert the message but skip reply chains (get_reply=False)
722+
extra = await self.convert_message(update, context, get_reply=False)
723+
if not extra:
724+
continue
714725

715-
# Merge only the message components (keep base session/meta from first)
716-
abm.message.extend(extra.message)
717-
logger.debug(
718-
f"Added {len(extra.message)} components to media group {media_group_id}"
719-
)
726+
# Merge only the message components (keep base session/meta from first)
727+
abm.message.extend(extra.message)
728+
logger.debug(
729+
f"Added {len(extra.message)} components to media group {media_group_id}"
730+
)
720731

721-
# Process the merged message
722-
await self.handle_msg(abm)
732+
# Process the merged message
733+
await self.handle_msg(abm)
734+
except Exception:
735+
logger.error(
736+
f"Failed to process media group {media_group_id}", exc_info=True
737+
)
723738

724739
async def handle_msg(self, message: AstrBotMessage) -> None:
725740
message_event = TelegramPlatformEvent(

0 commit comments

Comments
 (0)