refactor: 提取缓冲处理逻辑到astr_message_event

This commit is contained in:
Raven95676
2025-04-13 15:37:22 +08:00
parent 2a92c4d5de
commit 648c125697
4 changed files with 23 additions and 39 deletions

View File

@@ -1,5 +1,6 @@
import abc
import asyncio
import re
from dataclasses import dataclass
from typing import List, Union, Optional, AsyncGenerator
@@ -205,6 +206,20 @@ class AstrMessageEvent(abc.ABC):
"""
return self.role == "admin"
async def process_buffer(self, buffer: str, pattern: re.Pattern) -> str:
"""
将消息缓冲区中的文本按指定正则表达式分割后发送至消息平台作为不支持流式输出平台的Fallback。
"""
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.8) # 限速
return buffer
async def send_streaming(self, generator: AsyncGenerator[MessageChain, None]):
"""发送流式消息到消息平台,使用异步生成器。
目前仅支持: telegramqq official 私聊。

View File

@@ -1,11 +1,10 @@
import asyncio
from typing import AsyncGenerator, List, Dict
import re
from astrbot.api.event import AstrMessageEvent, MessageChain
from astrbot.api.platform import Group, MessageMember
from astrbot.api.message_components import Plain, Image, Record, At, Node, Nodes
from typing import AsyncGenerator, Dict, List
from aiocqhttp import CQHttp
from astrbot.api.event import AstrMessageEvent, MessageChain
from astrbot.api.message_components import At, Image, Node, Nodes, Plain, Record
from astrbot.api.platform import Group, MessageMember
class AiocqhttpMessageEvent(AstrMessageEvent):
@@ -84,17 +83,6 @@ 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 = re.compile(r"[^。?!~…]+[。?!~…]+")
@@ -108,6 +96,7 @@ class AiocqhttpMessageEvent(AstrMessageEvent):
buffer = await self.process_buffer(buffer, pattern)
else:
await self.send(MessageChain(chain=[comp]))
await asyncio.sleep(0.8) # 限速
if buffer.strip():
await self.send(MessageChain([Plain(buffer)]))

View File

@@ -4,8 +4,8 @@ import wave
import uuid
import traceback
import os
from typing import AsyncGenerator
from typing import AsyncGenerator
from astrbot.core.utils.io import save_temp_img, download_file
from astrbot.core.utils.tencent_record_helper import wav_to_tencent_silk
from astrbot.api import logger
@@ -220,17 +220,6 @@ 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 = re.compile(r"[^。?!~…]+[。?!~…]+")
@@ -244,6 +233,7 @@ class GewechatPlatformEvent(AstrMessageEvent):
buffer = await self.process_buffer(buffer, pattern)
else:
await self.send(MessageChain(chain=[comp]))
await asyncio.sleep(0.8) # 限速
if buffer.strip():
await self.send(MessageChain([Plain(buffer)]))

View File

@@ -94,17 +94,6 @@ 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 = re.compile(r"[^。?!~…]+[。?!~…]+")
@@ -118,6 +107,7 @@ class LarkMessageEvent(AstrMessageEvent):
buffer = await self.process_buffer(buffer, pattern)
else:
await self.send(MessageChain(chain=[comp]))
await asyncio.sleep(0.8) # 限速
if buffer.strip():
await self.send(MessageChain([Plain(buffer)]))