Commit 6c82f68

benny-dou <60535774+benny-dou@users.noreply.github.com>
2025-09-30 00:21:54
fix(sender): handle errors when `copy_media_group` is failed
1 parent 463a1ca
Changed files (1)
src
messages
src/messages/sender.py
@@ -236,33 +236,38 @@ async def send_media_group(
     To avoid this, we first send the media group to a temperary chat, and then copy the messages to the target chat.
     """
 
-    async def send_to_temp(client: Client, media_group: list) -> list[Message]:
+    async def send(chat_id: int | str, media_group: list, reply_parameters: ReplyParameters | None = None, retry: int = 0) -> list[Message]:
+        if retry > 2:
+            return []
         try:
-            return await client.send_media_group(to_int(TID.TEMP), media=media_group)
+            return await client.send_media_group(chat_id, media=media_group, reply_parameters=reply_parameters)  # type: ignore
         except FloodWait as e:
             logger.warning(e)
             await asyncio.sleep(e.value)  # type: ignore
-            return await send_to_temp(client, media_group)
         except Exception as e:
-            logger.warning(f"Failed to send_media_group: {e}")
-        return []
+            logger.error(f"Failed to send_media_group: {e}")
+        return await send(chat_id, media_group, reply_parameters, retry=retry + 1)
+
+    async def copy_media_group(message_id: int, retry: int = 0) -> list[Message]:
+        if retry > 2:
+            return []
+        try:
+            return await client.copy_media_group(to_int(target_chat), from_chat_id=to_int(TID.TEMP), message_id=message_id, reply_parameters=reply_parameters)
+        except FloodWait as e:
+            logger.warning(e)
+            await asyncio.sleep(e.value)  # type: ignore
+        except Exception as e:
+            logger.error(f"Failed to copy_media_group: {e}")
+        return await copy_media_group(message_id, retry=retry + 1)
 
     # According to our observation, FloodWait usually occurs when len(media_group) > 6
     if force_use_temp_chat or len(media_group) > 6:
         sent = []
-        temp_msgs = await send_to_temp(client, media_group)
+        temp_msgs = await send(to_int(TID.TEMP), media_group)
         if len(temp_msgs) > 0 and isinstance(temp_msgs[0], Message) and temp_msgs[0].media_group_id:
-            sent = await client.copy_media_group(to_int(target_chat), from_chat_id=temp_msgs[0].chat.id, message_id=temp_msgs[0].id, reply_parameters=reply_parameters)
+            sent = await copy_media_group(message_id=temp_msgs[0].id)
         [await delete_message(m) for m in temp_msgs]
         return [m for m in sent if isinstance(m, Message)]
 
     # len(media_group) <= 6, send directly
-    try:
-        return await client.send_media_group(to_int(target_chat), media=media_group, reply_parameters=reply_parameters)
-    except FloodWait as e:
-        logger.warning(e)
-        await asyncio.sleep(e.value)  # type: ignore
-        return await send_media_group(client, target_chat, media_group, reply_parameters, force_use_temp_chat=True)
-    except Exception as e:
-        logger.warning(f"Failed to send_media_group: {e}")
-    return []
+    return await send(to_int(target_chat), media_group, reply_parameters)