diff --git a/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_message_event.py b/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_message_event.py index 24591d3e8..499b6e54d 100644 --- a/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_message_event.py +++ b/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_message_event.py @@ -84,25 +84,28 @@ class AiocqhttpMessageEvent(AstrMessageEvent): await super().send(message) + async def process_buffer(self, buffer: str, pattern: re.Pattern) -> str: + while True: + match = re.search(pattern, buffer) + if not match: + break + matched_text = match.group() + await self.send(MessageChain([Plain(matched_text)])) + buffer = buffer[match.end() :] + await asyncio.sleep(0.5) # 限速 + return buffer + async def send_streaming(self, generator: AsyncGenerator): buffer = "" - pattern = r"[^。?!~…]+[。?!~…]+" + pattern = re.compile(r"[^。?!~…]+[。?!~…]+") async for chain in generator: if isinstance(chain, MessageChain): for comp in chain.chain: if isinstance(comp, Plain): buffer += comp.text - if any(p in buffer for p in "。?!~…"): - while True: - match = re.search(pattern, buffer) - if not match: - break - matched_text = match.group() - await self.send(MessageChain([Plain(matched_text)])) - buffer = buffer[match.end() :] - await asyncio.sleep(0.5) # 限速 + buffer = await self.process_buffer(buffer, pattern) else: await self.send(MessageChain(chain=[comp])) diff --git a/astrbot/core/platform/sources/dingtalk/dingtalk_event.py b/astrbot/core/platform/sources/dingtalk/dingtalk_event.py index 8292e5521..5c981d5dd 100644 --- a/astrbot/core/platform/sources/dingtalk/dingtalk_event.py +++ b/astrbot/core/platform/sources/dingtalk/dingtalk_event.py @@ -65,27 +65,31 @@ class DingtalkMessageEvent(AstrMessageEvent): await self.send_with_client(self.client, message) await super().send(message) + async def process_buffer(self, buffer: str, pattern: re.Pattern) -> str: + while True: + match = re.search(pattern, buffer) + if not match: + break + matched_text = match.group() + await self.send(MessageChain([Plain(matched_text)])) + buffer = buffer[match.end() :] + await asyncio.sleep(0.5) # 限速 + return buffer + async def send_streaming(self, generator: AsyncGenerator): buffer = "" - pattern = r"[^。?!~…]+[。?!~…]+" + pattern = re.compile(r"[^。?!~…]+[。?!~…]+") async for chain in generator: if isinstance(chain, MessageChain): for comp in chain.chain: if isinstance(comp, Plain): buffer += comp.text - if any(p in buffer for p in "。?!~…"): - while True: - match = re.search(pattern, buffer) - if not match: - break - matched_text = match.group() - await self.send(MessageChain([Plain(matched_text)])) - buffer = buffer[match.end() :] - await asyncio.sleep(0.5) # 限速 + buffer = await self.process_buffer(buffer, pattern) else: await self.send(MessageChain(chain=[comp])) + if buffer.strip(): await self.send(MessageChain([Plain(buffer)])) return await super().send_streaming(generator) diff --git a/astrbot/core/platform/sources/gewechat/gewechat_event.py b/astrbot/core/platform/sources/gewechat/gewechat_event.py index 01e58880a..b38f797ac 100644 --- a/astrbot/core/platform/sources/gewechat/gewechat_event.py +++ b/astrbot/core/platform/sources/gewechat/gewechat_event.py @@ -220,27 +220,31 @@ class GewechatPlatformEvent(AstrMessageEvent): members=members, ) + async def process_buffer(self, buffer: str, pattern: re.Pattern) -> str: + while True: + match = re.search(pattern, buffer) + if not match: + break + matched_text = match.group() + await self.send(MessageChain([Plain(matched_text)])) + buffer = buffer[match.end() :] + await asyncio.sleep(0.5) # 限速 + return buffer + async def send_streaming(self, generator: AsyncGenerator): buffer = "" - pattern = r"[^。?!~…]+[。?!~…]+" + pattern = re.compile(r"[^。?!~…]+[。?!~…]+") async for chain in generator: if isinstance(chain, MessageChain): for comp in chain.chain: if isinstance(comp, Plain): buffer += comp.text - if any(p in buffer for p in "。?!~…"): - while True: - match = re.search(pattern, buffer) - if not match: - break - matched_text = match.group() - await self.send(MessageChain([Plain(matched_text)])) - buffer = buffer[match.end() :] - await asyncio.sleep(0.5) # 限速 + buffer = await self.process_buffer(buffer, pattern) else: await self.send(MessageChain(chain=[comp])) + if buffer.strip(): await self.send(MessageChain([Plain(buffer)])) return await super().send_streaming(generator) diff --git a/astrbot/core/platform/sources/lark/lark_event.py b/astrbot/core/platform/sources/lark/lark_event.py index de0759710..fd87f57bc 100644 --- a/astrbot/core/platform/sources/lark/lark_event.py +++ b/astrbot/core/platform/sources/lark/lark_event.py @@ -94,27 +94,31 @@ class LarkMessageEvent(AstrMessageEvent): await super().send(message) + async def process_buffer(self, buffer: str, pattern: re.Pattern) -> str: + while True: + match = re.search(pattern, buffer) + if not match: + break + matched_text = match.group() + await self.send(MessageChain([Plain(matched_text)])) + buffer = buffer[match.end() :] + await asyncio.sleep(0.5) # 限速 + return buffer + async def send_streaming(self, generator: AsyncGenerator): buffer = "" - pattern = r"[^。?!~…]+[。?!~…]+" + pattern = re.compile(r"[^。?!~…]+[。?!~…]+") async for chain in generator: if isinstance(chain, MessageChain): for comp in chain.chain: if isinstance(comp, Plain): buffer += comp.text - if any(p in buffer for p in "。?!~…"): - while True: - match = re.search(pattern, buffer) - if not match: - break - matched_text = match.group() - await self.send(MessageChain([Plain(matched_text)])) - buffer = buffer[match.end() :] - await asyncio.sleep(0.5) # 限速 + buffer = await self.process_buffer(buffer, pattern) else: await self.send(MessageChain(chain=[comp])) + if buffer.strip(): await self.send(MessageChain([Plain(buffer)])) return await super().send_streaming(generator) diff --git a/astrbot/core/platform/sources/wecom/wecom_event.py b/astrbot/core/platform/sources/wecom/wecom_event.py index 3c383024e..2f53e1519 100644 --- a/astrbot/core/platform/sources/wecom/wecom_event.py +++ b/astrbot/core/platform/sources/wecom/wecom_event.py @@ -89,27 +89,31 @@ class WecomPlatformEvent(AstrMessageEvent): await super().send(message) + async def process_buffer(self, buffer: str, pattern: re.Pattern) -> str: + while True: + match = re.search(pattern, buffer) + if not match: + break + matched_text = match.group() + await self.send(MessageChain([Plain(matched_text)])) + buffer = buffer[match.end() :] + await asyncio.sleep(0.5) # 限速 + return buffer + async def send_streaming(self, generator: AsyncGenerator): buffer = "" - pattern = r"[^。?!~…]+[。?!~…]+" + pattern = re.compile(r"[^。?!~…]+[。?!~…]+") async for chain in generator: if isinstance(chain, MessageChain): for comp in chain.chain: if isinstance(comp, Plain): buffer += comp.text - if any(p in buffer for p in "。?!~…"): - while True: - match = re.search(pattern, buffer) - if not match: - break - matched_text = match.group() - await self.send(MessageChain([Plain(matched_text)])) - buffer = buffer[match.end() :] - await asyncio.sleep(0.5) # 限速 + buffer = await self.process_buffer(buffer, pattern) else: await self.send(MessageChain(chain=[comp])) + if buffer.strip(): await self.send(MessageChain([Plain(buffer)])) return await super().send_streaming(generator)