diff --git a/src/plugins/chat/message_sender.py b/src/plugins/chat/message_sender.py index a0d171504..a189cbbdd 100644 --- a/src/plugins/chat/message_sender.py +++ b/src/plugins/chat/message_sender.py @@ -24,6 +24,14 @@ class Message_Sender: def set_bot(self, bot: Bot): """设置当前bot实例""" self._current_bot = bot + + def get_recalled_messages(self, stream_id: str) -> list: + """获取所有撤回的消息""" + recalled_messages = [] + + recalled_messages = list(db.recalled_messages.find({"stream_id": stream_id}, {"message_id": 1})) + # 按thinking_start_time排序,时间早的在前面 + return recalled_messages async def send_message( self, @@ -32,33 +40,41 @@ class Message_Sender: """发送消息""" if isinstance(message, MessageSending): - message_json = message.to_dict() - message_send = MessageSendCQ(data=message_json) - # logger.debug(message_send.message_info,message_send.raw_message) - message_preview = truncate_message(message.processed_plain_text) - if message_send.message_info.group_info and message_send.message_info.group_info.group_id: - try: - await self._current_bot.send_group_msg( - group_id=message.message_info.group_info.group_id, - message=message_send.raw_message, - auto_escape=False, - ) - logger.success(f"[调试] 发送消息“{message_preview}”成功") - except Exception as e: - logger.error(f"[调试] 发生错误 {e}") - logger.error(f"[调试] 发送消息“{message_preview}”失败") - else: - try: - logger.debug(message.message_info.user_info) - await self._current_bot.send_private_msg( - user_id=message.sender_info.user_id, - message=message_send.raw_message, - auto_escape=False, - ) - logger.success(f"[调试] 发送消息“{message_preview}”成功") - except Exception as e: - logger.error(f"[调试] 发生错误 {e}") - logger.error(f"[调试] 发送消息“{message_preview}”失败") + recalled_messages = self.get_recalled_messages(message.chat_stream.stream_id) + is_recalled = False + for recalled_message in recalled_messages: + if message.reply_to_message_id == recalled_message["message_id"]: + is_recalled = True + logger.warning(f"消息“{message.processed_plain_text}”已被撤回,不发送") + break + if not is_recalled: + message_json = message.to_dict() + message_send = MessageSendCQ(data=message_json) + # logger.debug(message_send.message_info,message_send.raw_message) + message_preview = truncate_message(message.processed_plain_text) + if message_send.message_info.group_info and message_send.message_info.group_info.group_id: + try: + await self._current_bot.send_group_msg( + group_id=message.message_info.group_info.group_id, + message=message_send.raw_message, + auto_escape=False, + ) + logger.success(f"[调试] 发送消息“{message_preview}”成功") + except Exception as e: + logger.error(f"[调试] 发生错误 {e}") + logger.error(f"[调试] 发送消息“{message_preview}”失败") + else: + try: + logger.debug(message.message_info.user_info) + await self._current_bot.send_private_msg( + user_id=message.sender_info.user_id, + message=message_send.raw_message, + auto_escape=False, + ) + logger.success(f"[调试] 发送消息“{message_preview}”成功") + except Exception as e: + logger.error(f"[调试] 发生错误 {e}") + logger.error(f"[调试] 发送消息“{message_preview}”失败") class MessageContainer: @@ -71,23 +87,6 @@ class MessageContainer: self.last_send_time = 0 self.thinking_timeout = 20 # 思考超时时间(秒) - def get_recalled_messages(self) -> List[MessageSending]: - """获取所有撤回的Message_Sending对象""" - recalled_messages = [] - - for msg in self.messages: - if isinstance(msg, MessageSending): - # 检查是否撤回,对应stream_id和message_id - if ( - db.recalled_messages.find({"stream_id": msg.chat_stream.stream_id}, {"message_id": msg.message_info.message_id}) - is not None - ): - recalled_messages.append(msg) - - # 按thinking_start_time排序,时间早的在前面 - recalled_messages.sort(key=lambda x: x.thinking_start_time) - return recalled_messages - def get_timeout_messages(self) -> List[MessageSending]: """获取所有超时的Message_Sending对象(思考时间超过30秒),按thinking_start_time排序""" current_time = time.time() @@ -186,13 +185,6 @@ class MessageManager: logger.warning(f"消息思考超时({thinking_time}秒),移除该消息") container.remove_message(message_earliest) - # 检查消息是否被撤回 - recalled_messages = container.get_recalled_messages() - for msg in recalled_messages: - if message_earliest.message_info.message_id == msg.message_info.message_id: - logger.warning(f"消息已被撤回,移除该消息: {message_earliest.message_info.message_id}") - container.remove_message(message_earliest) - else: if ( message_earliest.is_head