Skip to content

Commit ee2165d

Browse files
committed
feat:on_websocket_receive
fix commt typo fix await bug I forgot the fxxking await AGAIN!!!
1 parent 4602e39 commit ee2165d

1 file changed

Lines changed: 35 additions & 4 deletions

File tree

aiocqhttp/__init__.py

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ async def handler(event):
130130
self._sync_api = None
131131
self._bus = EventBus()
132132
self._before_sending_funcs = set()
133+
self._after_wsr_func = None
133134
self._loop = None
134135

135136
self._server_app = Quart(import_name, **(server_app_kwargs or {}))
@@ -454,7 +455,8 @@ async def startup():
454455

455456
def on_websocket_connection(self, func: Callable) -> Callable:
456457
"""
457-
注册 WebSocket 连接元事件处理函数,等价于 ``on_meta_event('lifecycle.connect')``,例如:
458+
注册 WebSocket 连接元事件处理函数,等价于 ``on_meta_event('lifecycle.connect')``
459+
注意:若 OneBot 端不可信,请使用 bot.server_app.before_websocket
458460
459461
```py
460462
@bot.on_websocket_connection
@@ -465,6 +467,25 @@ async def handler(event):
465467
"""
466468
return self.on_meta_event('lifecycle.connect')(func)
467469

470+
def on_websocket_receive(self, func: Callable) -> Callable:
471+
"""
472+
注册 WebSocket 调用 receive() 后对 payload 的后处理函数,
473+
可用于对 WebSocket 每次上报内容的鉴权/验证
474+
暂时仅支持注册1个
475+
476+
注:对于 HTTP 上报,你可以使用 bot.server_app.before_request;
477+
对于 WebSocket 的首次连接,你可以使用 bot.server_app.before_websocket 验证其 Header
478+
479+
```py
480+
@bot.on_websocket_receive
481+
async def handler(payload: bytes):
482+
return payload
483+
"""
484+
if self._after_wsr_func:
485+
raise RuntimeError("`on_websocket_receive` can only register once.")
486+
self._after_wsr_func = func
487+
return func
488+
468489
async def _handle_http_event(self) -> Response:
469490
if self._secret:
470491
if 'X-Signature' not in request.headers:
@@ -517,8 +538,11 @@ async def _handle_wsr_event(self) -> None:
517538
self._add_wsr_event_client()
518539
try:
519540
while True:
541+
payload = await websocket.receive()
542+
if self._after_wsr_func:
543+
payload = await self._after_wsr_func(payload)
520544
try:
521-
payload = json.loads(await websocket.receive())
545+
payload = json.loads(payload)
522546
except ValueError:
523547
payload = None
524548

@@ -534,10 +558,14 @@ async def _handle_wsr_api(self) -> None:
534558
self._add_wsr_api_client()
535559
try:
536560
while True:
561+
payload = await websocket.receive()
562+
if self._after_wsr_func:
563+
payload = await self._after_wsr_func(payload)
537564
try:
538-
ResultStore.add(json.loads(await websocket.receive()))
565+
payload = json.loads(payload)
539566
except ValueError:
540567
pass
568+
ResultStore.add(payload)
541569
finally:
542570
self._remove_wsr_api_client()
543571

@@ -546,8 +574,11 @@ async def _handle_wsr_universal(self) -> None:
546574
self._add_wsr_event_client()
547575
try:
548576
while True:
577+
payload = await websocket.receive()
578+
if self._after_wsr_func:
579+
payload = await self._after_wsr_func(payload)
549580
try:
550-
payload = json.loads(await websocket.receive())
581+
payload = json.loads(payload)
551582
except ValueError:
552583
payload = None
553584

0 commit comments

Comments
 (0)