From 4fbb3970fabe8d68202a0131127fe33061cee894 Mon Sep 17 00:00:00 2001 From: XYCode Kerman Date: Sat, 15 Jun 2024 23:09:38 +0800 Subject: [PATCH] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mirai_onebot/adapters/reverse_websocket_adapter.py | 4 +++- mirai_onebot/event/bus.py | 10 ++++++---- test/test_event_bus.py | 6 +++--- test/test_rwebsocket.py | 14 +++++++------- 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/mirai_onebot/adapters/reverse_websocket_adapter.py b/mirai_onebot/adapters/reverse_websocket_adapter.py index 32bd0c3..284be63 100644 --- a/mirai_onebot/adapters/reverse_websocket_adapter.py +++ b/mirai_onebot/adapters/reverse_websocket_adapter.py @@ -43,8 +43,10 @@ def stop(self): if self.server is None: return + tasks: List[asyncio.Task] = [] for ws in self.ws_connections: - asyncio.get_event_loop().run_until_complete(ws.close()) + tasks.append(asyncio.create_task(ws.close())) + asyncio.get_event_loop().run_until_complete(asyncio.wait(tasks)) async def handler(self, websocket: websockets.WebSocketServerProtocol, path: str): # 检测OneBot标准版本 diff --git a/mirai_onebot/event/bus.py b/mirai_onebot/event/bus.py index 7818c21..6fbc137 100644 --- a/mirai_onebot/event/bus.py +++ b/mirai_onebot/event/bus.py @@ -47,14 +47,16 @@ def decorator(func: Callable) -> Callable: return decorator - async def emit(self, event: Union[Type[EventBase], str], *args, **kwargs) -> None: + async def emit(self, event: Union[Type[EventBase], str], background: bool = True, *args, **kwargs) -> None: """触发事件 Args: event (str | Type[EventBase]): 事件 + background (bool, optional): 是否在后台触发事件,设置为False会等待事件完成. Defaults to True. args/kwargs: 传递给事件处理器的参数 """ if event in self._subscribers.keys(): - [asyncio.create_task(subscriber(*args, **kwargs)) - for subscriber in self._subscribers[event]] - # await asyncio.wait(tasks) + tasks = [asyncio.create_task(subscriber(*args, **kwargs)) + for subscriber in self._subscribers[event]] + if not background: + await asyncio.wait(tasks) diff --git a/test/test_event_bus.py b/test/test_event_bus.py index d7d3fd0..b44f4df 100644 --- a/test/test_event_bus.py +++ b/test/test_event_bus.py @@ -28,8 +28,8 @@ async def handle_message_group_event(): bus.subscribe('print_message', handle_print_message) - await bus.emit(MessageGroupEvent) - await bus.emit('print_message', 'hello') + await bus.emit(MessageGroupEvent, background=False) + await bus.emit(event='print_message', background=False, message='hello') assert run1 is True assert run2 is True @@ -60,7 +60,7 @@ async def test31(): global run2 run2 = True - await bus.emit('test3') + await bus.emit('test3', background=False) assert run1 is True assert run2 is True diff --git a/test/test_rwebsocket.py b/test/test_rwebsocket.py index b8e28d4..9889e70 100644 --- a/test/test_rwebsocket.py +++ b/test/test_rwebsocket.py @@ -70,21 +70,21 @@ async def subscribe(data: dict): assert data['id'] == id # 错误事件 - await ws_client.send('hello?') + await ws_client.send('{"good": "nice"}') # 调用api - asyncio.create_task(adapter.call_api('hello', test='test')) + asyncio.create_task(adapter._call_api('hello', {'test': 'test'})) # 发送响应 echo = json.loads(await ws_client.recv())['echo'] await ws_client.send(json.dumps({'echo': echo, 'resp': 'test'})) # 调用api超时 - await adapter.call_api('hello', test='test') + await adapter._call_api('hello', {'test': 'test'}) await asyncio.sleep(1.5) - # 关闭连接 - await ws_client.close() - # 再次调用handler函数,引发错误 - await adapter.handler(adapter.ws_connections[0], '/') +def test_new_adapter(): + adapter = ReverseWebsocketAdapter('hello', '0.0.0.0', 4561, 1) + adapter.start() + adapter.stop()