11import json
22import re
3- from typing import TYPE_CHECKING
3+ from typing import TYPE_CHECKING , Type , Tuple , TypeVar , Union , Dict
44
55from lagrange .client .message .decoder import parse_grp_msg , parse_friend_msg
66from lagrange .pb .message .msg_push import MsgPush
1111 MemberGotTitleBody ,
1212 MemberInviteRequest ,
1313 MemberJoinRequest ,
14- MemberRecallMsg ,
14+ MemberRecallMsg , GroupSub20Head ,
1515)
16- from lagrange .utils .binary .protobuf import proto_decode
16+ from lagrange .utils .binary .protobuf import proto_decode , ProtoStruct
1717from lagrange .utils .binary .reader import Reader
1818from lagrange .utils .operator import unpack_dict
1919
20+ from ..events import BaseEvent
2021from ..events .group import (
2122 GroupMemberGotSpecialTitle ,
2223 GroupMemberJoined ,
2324 GroupMemberJoinRequest ,
2425 GroupMemberQuit ,
2526 GroupMuteMember ,
2627 GroupNameChanged ,
27- GroupRecall ,
28+ GroupRecall , GroupNudge , GroupReaction ,
2829)
2930from ..wtlogin .sso import SSOPacket
3031from .log import logger
3132
3233if TYPE_CHECKING :
3334 from lagrange .client .client import Client
3435
36+ T = TypeVar ("T" , bound = ProtoStruct )
37+
38+
39+ def unpack (buf2 : bytes , decoder : Type [T ]) -> Tuple [int , T ]:
40+ reader = Reader (buf2 )
41+ grp_id = reader .read_u32 ()
42+ reader .read_u8 ()
43+ return grp_id , decoder .decode (reader .read_bytes_with_length ("u16" , False ))
44+
3545
3646async def msg_push_handler (client : "Client" , sso : SSOPacket ):
3747 pkg = MsgPush .decode (sso .data ).body
@@ -76,13 +86,30 @@ async def msg_push_handler(client: "Client", sso: SSOPacket):
7686 logger .debug ("unhandled friend event: %s" % pkg )
7787 elif typ == 0x2DC : # grp event, 732
7888 if sub_typ == 20 : # nudget(grp_id only)
79- return
80- elif sub_typ == 16 : # rename and special_title and reaction(server not impl)
81- if pkg .message : # rename and special_title
82- reader = Reader (pkg .message .buf2 )
83- grp_id = reader .read_u32 ()
84- reader .read_u8 () # reserve
85- pb = GroupSub16Head .decode (reader .read_bytes_with_length ("u16" , False ))
89+ if pkg .message :
90+ grp_id , pb = unpack (pkg .message .buf2 , GroupSub20Head )
91+ attrs : Dict [str , Union [str , int ]] = {}
92+ for x in pb .body .attrs : # type: dict[bytes, bytes]
93+ k , v = x .values ()
94+ if v .isdigit ():
95+ attrs [k .decode ()] = int (v .decode ())
96+ else :
97+ attrs [k .decode ()] = v .decode ()
98+ return GroupNudge (
99+ grp_id ,
100+ attrs ["uin_str1" ],
101+ attrs ["uin_str2" ],
102+ attrs ["action_str" ],
103+ attrs ["suffix_str" ],
104+ attrs ,
105+ pb .body .attrs_xml
106+ )
107+ else :
108+ # print(pkg.encode().hex(), 2)
109+ return
110+ elif sub_typ == 16 : # rename and special_title and reaction
111+ if pkg .message :
112+ grp_id , pb = unpack (pkg .message .buf2 , GroupSub16Head )
86113 if pb .flag == 6 : # special_title
87114 body = MemberGotTitleBody .decode (pb .body )
88115 for el in re .findall (r"<(\{.*?})>" , body .string ):
@@ -107,15 +134,24 @@ async def msg_push_handler(client: "Client", sso: SSOPacket):
107134 timestamp = pb .timestamp ,
108135 operator_uid = pb .operator_uid ,
109136 )
137+ elif pb .flag == 35 : # add reaction
138+ body = pb .f44 .inner .body
139+ return GroupReaction (
140+ grp_id = grp_id ,
141+ uid = body .detail .sender_uid ,
142+ seq = body .msg .id ,
143+ emoji_id = int (body .detail .emo_id ),
144+ emoji_type = body .detail .emo_type ,
145+ emoji_count = body .detail .count ,
146+ type = body .detail .send_type ,
147+ total_operations = body .msg .total_operations
148+ )
110149 else :
111150 raise ValueError (
112151 f"Unknown subtype_12 flag: { pb .flag } : { pb .body .hex () if pb .body else pb } "
113152 )
114153 elif sub_typ == 17 : # recall
115- reader = Reader (pkg .message .buf2 )
116- grp_id = reader .read_u32 ()
117- reader .read_u8 () # reserve
118- pb = MemberRecallMsg .decode (reader .read_bytes_with_length ("u16" , False ))
154+ grp_id , pb = unpack (pkg .message .buf2 , MemberRecallMsg )
119155
120156 info = pb .body .info
121157 return GroupRecall (
0 commit comments