From a62b38eda7741152ac9d742070c645579be2a502 Mon Sep 17 00:00:00 2001 From: fdc <2213070223@qq.com> Date: Mon, 4 Aug 2025 16:33:13 +0800 Subject: [PATCH] fix: In the reply_message_chunk of the adapter, the message is only streamed into the card or edited at the end of the 8th chunk return or streaming --- pkg/platform/sources/dingtalk.py | 21 ++++--- pkg/platform/sources/telegram.py | 95 +++++++++++++++++--------------- 2 files changed, 64 insertions(+), 52 deletions(-) diff --git a/pkg/platform/sources/dingtalk.py b/pkg/platform/sources/dingtalk.py index 8bd6e187..eacc2a23 100644 --- a/pkg/platform/sources/dingtalk.py +++ b/pkg/platform/sources/dingtalk.py @@ -1,3 +1,4 @@ +from re import S import traceback import typing from libs.dingtalk_api.dingtalkevent import DingTalkEvent @@ -99,13 +100,15 @@ class DingTalkAdapter(adapter.MessagePlatformAdapter): message_converter: DingTalkMessageConverter = DingTalkMessageConverter() event_converter: DingTalkEventConverter = DingTalkEventConverter() config: dict - card_instance_id_dict: dict + card_instance_id_dict: dict # 回复卡片消息字典,key为消息id,value为回复卡片实例id,用于在流式消息时判断是否发送到指定卡片 + seq: int # 消息顺序,直接以seq作为标识 def __init__(self, config: dict, ap: app.Application, logger: EventLogger): self.config = config self.ap = ap self.logger = logger self.card_instance_id_dict = {} + self.seq = 1 required_keys = [ 'client_id', 'client_secret', @@ -155,14 +158,16 @@ class DingTalkAdapter(adapter.MessagePlatformAdapter): # incoming_message = event.incoming_message # msg_id = incoming_message.message_id + self.seq += 1 + if (self.seq - 1) % 8 == 0 or is_final: + content, at = await DingTalkMessageConverter.yiri2target(message) - content, at = await DingTalkMessageConverter.yiri2target(message) - - card_instance, card_instance_id = self.card_instance_id_dict[message_id] - # print(card_instance_id) - await self.bot.send_card_message(card_instance, card_instance_id, content, is_final) - if is_final: - self.card_instance_id_dict.pop(message_id) + card_instance, card_instance_id = self.card_instance_id_dict[message_id] + # print(card_instance_id) + await self.bot.send_card_message(card_instance, card_instance_id, content, is_final) + if is_final: + self.seq = 1 # 消息回复结束之后重置seq + self.card_instance_id_dict.pop(message_id) # 消息回复结束之后删除卡片实例id async def send_message(self, target_type: str, target_id: str, message: platform_message.MessageChain): content = await DingTalkMessageConverter.yiri2target(message) diff --git a/pkg/platform/sources/telegram.py b/pkg/platform/sources/telegram.py index d39bf23d..3c81fd6b 100644 --- a/pkg/platform/sources/telegram.py +++ b/pkg/platform/sources/telegram.py @@ -144,7 +144,9 @@ class TelegramAdapter(adapter.MessagePlatformAdapter): config: dict ap: app.Application - msg_stream_id: dict + msg_stream_id: dict # 流式消息id字典,key为流式消息id,value为首次消息源id,用于在流式消息时判断编辑那条消息 + + seq: int # 消息中识别消息顺序,直接以seq作为标识 listeners: typing.Dict[ typing.Type[platform_events.Event], @@ -156,6 +158,7 @@ class TelegramAdapter(adapter.MessagePlatformAdapter): self.ap = ap self.logger = logger self.msg_stream_id = {} + self.seq = 1 async def telegram_callback(update: Update, context: ContextTypes.DEFAULT_TYPE): if update.message.from_user.is_bot: @@ -213,52 +216,56 @@ class TelegramAdapter(adapter.MessagePlatformAdapter): quote_origin: bool = False, is_final: bool = False, ): - assert isinstance(message_source.source_platform_object, Update) - components = await TelegramMessageConverter.yiri2target(message, self.bot) - args = {} - message_id = message_source.source_platform_object.message.id - if quote_origin: - args['reply_to_message_id'] = message_source.source_platform_object.message.id + self.seq += 1 + if (self.seq - 1) % 8 == 0 or is_final: - component = components[0] - if message_id not in self.msg_stream_id: - # time.sleep(0.6) - if component['type'] == 'text': - if self.config['markdown_card'] is True: - content = telegramify_markdown.markdownify( - content=component['text'], - ) - else: - content = component['text'] - args = { - 'chat_id': message_source.source_platform_object.effective_chat.id, - 'text': content, - } - if self.config['markdown_card'] is True: - args['parse_mode'] = 'MarkdownV2' + assert isinstance(message_source.source_platform_object, Update) + components = await TelegramMessageConverter.yiri2target(message, self.bot) + args = {} + message_id = message_source.source_platform_object.message.id + if quote_origin: + args['reply_to_message_id'] = message_source.source_platform_object.message.id - send_msg = await self.bot.send_message(**args) - send_msg_id = send_msg.message_id - self.msg_stream_id[message_id] = send_msg_id - else: - if component['type'] == 'text': - if self.config['markdown_card'] is True: - content = telegramify_markdown.markdownify( - content=component['text'], - ) - else: - content = component['text'] - args = { - 'message_id': self.msg_stream_id[message_id], - 'chat_id': message_source.source_platform_object.effective_chat.id, - 'text': content, - } - if self.config['markdown_card'] is True: - args['parse_mode'] = 'MarkdownV2' + component = components[0] + if message_id not in self.msg_stream_id: # 当消息回复第一次时,发送新消息 + # time.sleep(0.6) + if component['type'] == 'text': + if self.config['markdown_card'] is True: + content = telegramify_markdown.markdownify( + content=component['text'], + ) + else: + content = component['text'] + args = { + 'chat_id': message_source.source_platform_object.effective_chat.id, + 'text': content, + } + if self.config['markdown_card'] is True: + args['parse_mode'] = 'MarkdownV2' - await self.bot.edit_message_text(**args) - if is_final: - self.msg_stream_id.pop(message_id) + send_msg = await self.bot.send_message(**args) + send_msg_id = send_msg.message_id + self.msg_stream_id[message_id] = send_msg_id + else: # 存在消息的时候直接编辑消息1 + if component['type'] == 'text': + if self.config['markdown_card'] is True: + content = telegramify_markdown.markdownify( + content=component['text'], + ) + else: + content = component['text'] + args = { + 'message_id': self.msg_stream_id[message_id], + 'chat_id': message_source.source_platform_object.effective_chat.id, + 'text': content, + } + if self.config['markdown_card'] is True: + args['parse_mode'] = 'MarkdownV2' + + await self.bot.edit_message_text(**args) + if is_final: + self.seq = 1 # 消息回复结束之后重置seq + self.msg_stream_id.pop(message_id) # 消息回复结束之后删除流式消息id async def is_stream_output_supported(self) -> bool: is_stream = False