11import asyncio
2- import typing
2+ import re
3+ from typing import AsyncGenerator , Dict , List
4+ from aiocqhttp import CQHttp
35from astrbot .api .event import AstrMessageEvent , MessageChain
6+ from astrbot .api .message_components import At , Image , Node , Nodes , Plain , Record
47from astrbot .api .platform import Group , MessageMember
5- from astrbot .api .message_components import Plain , Image , Record , At , Node , Nodes
6- from aiocqhttp import CQHttp
78
89
910class AiocqhttpMessageEvent (AstrMessageEvent ):
@@ -82,18 +83,39 @@ async def send(self, message: MessageChain):
8283
8384 await super ().send (message )
8485
85- async def send_streaming (self , generator ):
86- buffer = None
87- async for chain in generator :
86+ async def send_streaming (
87+ self , generator : AsyncGenerator , use_fallback : bool = False
88+ ):
89+ if not use_fallback :
90+ buffer = None
91+ async for chain in generator :
92+ if not buffer :
93+ buffer = chain
94+ else :
95+ buffer .chain .extend (chain .chain )
8896 if not buffer :
89- buffer = chain
90- else :
91- buffer .chain .extend (chain .chain )
92- if not buffer :
93- return
94- buffer .squash_plain ()
95- await self .send (buffer )
96- return await super ().send_streaming (generator )
97+ return
98+ buffer .squash_plain ()
99+ await self .send (buffer )
100+ return await super ().send_streaming (generator , use_fallback )
101+
102+ buffer = ""
103+ pattern = re .compile (r"[^。?!~…]+[。?!~…]+" )
104+
105+ async for chain in generator :
106+ if isinstance (chain , MessageChain ):
107+ for comp in chain .chain :
108+ if isinstance (comp , Plain ):
109+ buffer += comp .text
110+ if any (p in buffer for p in "。?!~…" ):
111+ buffer = await self .process_buffer (buffer , pattern )
112+ else :
113+ await self .send (MessageChain (chain = [comp ]))
114+ await asyncio .sleep (1.5 ) # 限速
115+
116+ if buffer .strip ():
117+ await self .send (MessageChain ([Plain (buffer )]))
118+ return await super ().send_streaming (generator , use_fallback )
97119
98120 async def get_group (self , group_id = None , ** kwargs ):
99121 if isinstance (group_id , str ) and group_id .isdigit ():
@@ -108,7 +130,7 @@ async def get_group(self, group_id=None, **kwargs):
108130 group_id = group_id ,
109131 )
110132
111- members : typing . List [typing . Dict ] = await self .bot .call_action (
133+ members : List [Dict ] = await self .bot .call_action (
112134 "get_group_member_list" ,
113135 group_id = group_id ,
114136 )
0 commit comments