diff --git a/astrbot/core/platform/astr_message_event.py b/astrbot/core/platform/astr_message_event.py index 96a7ad6f1..68ab887d9 100644 --- a/astrbot/core/platform/astr_message_event.py +++ b/astrbot/core/platform/astr_message_event.py @@ -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]): """发送流式消息到消息平台,使用异步生成器。 目前仅支持: telegram,qq official 私聊。 diff --git a/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_message_event.py b/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_message_event.py index a798360d5..ae79a3bf4 100644 --- a/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_message_event.py +++ b/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_message_event.py @@ -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)])) diff --git a/astrbot/core/platform/sources/gewechat/gewechat_event.py b/astrbot/core/platform/sources/gewechat/gewechat_event.py index b38f797ac..ffca8b59f 100644 --- a/astrbot/core/platform/sources/gewechat/gewechat_event.py +++ b/astrbot/core/platform/sources/gewechat/gewechat_event.py @@ -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)])) diff --git a/astrbot/core/platform/sources/lark/lark_event.py b/astrbot/core/platform/sources/lark/lark_event.py index fd87f57bc..ae0d55ab7 100644 --- a/astrbot/core/platform/sources/lark/lark_event.py +++ b/astrbot/core/platform/sources/lark/lark_event.py @@ -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)]))