Commit 6c82f68
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)