feat: 重构发送流以提高代码可读性

This commit is contained in:
Raven95676
2025-04-13 11:19:40 +08:00
parent b6963c1bf9
commit bb6e892657
5 changed files with 69 additions and 50 deletions
@@ -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]))
@@ -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)
@@ -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)
@@ -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)
@@ -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)