11import os
22import struct
3+ import asyncio
34from io import BytesIO
4- from typing import BinaryIO , Callable , Coroutine , List , Optional , Union , overload
5+ from typing import BinaryIO , Callable , Coroutine , List , Optional , Union , overload , Literal
56
67from lagrange .info import AppInfo , DeviceInfo , SigInfo
78from lagrange .pb .message .msg_push import MsgPushBody
3233 PBGetInfoFromUidReq ,
3334)
3435from lagrange .pb .service .oidb import OidbRequest , OidbResponse
36+ from lagrange .pb .highway .comm import IndexNode
3537from lagrange .utils .binary .protobuf import proto_decode , proto_encode
3638from lagrange .utils .log import log
3739from lagrange .utils .operator import timestamp
4850from .message .encoder import build_message
4951from .message .types import Element
5052from .models import UserInfo
51- from .server_push import push_handler
53+ from .server_push . binder import PushDeliver
5254from .wtlogin .sso import SSOPacket
5355
5456
@@ -65,12 +67,17 @@ def __init__(
6567 super ().__init__ (uin , app_info , device_info , sig_info , sign_provider , use_ipv6 )
6668
6769 self ._events = Events ()
70+ self ._push_deliver = PushDeliver (self )
6871 self ._highway = HighWaySession (self )
6972
7073 @property
7174 def events (self ) -> Events :
7275 return self ._events
7376
77+ @property
78+ def push_deliver (self ) -> PushDeliver :
79+ return self ._push_deliver
80+
7481 async def register (self ) -> bool :
7582 if await super ().register ():
7683 self ._events .emit (ClientOnline (), self )
@@ -155,8 +162,7 @@ async def send_oidb_svc(
155162 return rsp
156163
157164 async def push_handler (self , sso : SSOPacket ):
158- rsp = await push_handler .execute (sso .cmd , sso )
159- if rsp :
165+ if rsp := await self ._push_deliver .execute (sso .cmd , sso ):
160166 self ._events .emit (rsp , self )
161167
162168 async def _send_msg_raw (self , pb : dict , * , grp_id = 0 , uid = "" ) -> SendMsgRsp :
@@ -229,6 +235,20 @@ async def down_grp_audio(self, audio: Audio, grp_id: int) -> BytesIO:
229235 async def down_friend_audio (self , audio : Audio ) -> BytesIO :
230236 return await self ._highway .download_audio (audio , uid = self .uid )
231237
238+ async def fetch_image_url (self , bus_type : Literal [10 , 20 ], node : "IndexNode" , uid = None , gid = None ):
239+ if bus_type == 10 :
240+ return await self ._get_pri_img_url (uid , node )
241+ elif bus_type == 20 :
242+ return await self ._get_grp_img_url (gid , node )
243+ else :
244+ raise ValueError ("bus_type must be 10 or 20" )
245+
246+ async def _get_grp_img_url (self , grp_id : int , node : "IndexNode" ) -> str :
247+ return await self ._highway .get_grp_img_url (grp_id = grp_id , node = node )
248+
249+ async def _get_pri_img_url (self , uid : str , node : "IndexNode" ) -> str :
250+ return await self ._highway .get_pri_img_url (uid = uid , node = node )
251+
232252 async def get_grp_list (self ) -> GetGrpListResponse :
233253 rsp = await self .send_oidb_svc (0xFE5 , 2 , PBGetGrpListRequest .build ().encode ())
234254 if rsp .ret_code :
@@ -292,7 +312,9 @@ async def get_grp_msg(
292312 and payload .end_seq == end
293313 ), "return args not matched"
294314
295- rsp = [parse_grp_msg (MsgPushBody .decode (i )) for i in payload .elems ]
315+ rsp = list (
316+ await asyncio .gather (* [parse_grp_msg (self , MsgPushBody .decode (i )) for i in payload .elems ])
317+ )
296318 if filter_deleted_msg :
297319 return [* filter (lambda msg : msg .rand != - 1 , rsp )]
298320 return rsp
0 commit comments