Skip to content

Commit e9a45c6

Browse files
committed
<onebot>[feat]support Event: FriendRecallNoticeEvent
1 parent 535485a commit e9a45c6

File tree

6 files changed

+80
-8
lines changed

6 files changed

+80
-8
lines changed

app.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,17 @@
1212
GroupMemberJoinRequest
1313
)
1414
from lagrange.client.events.friend import (
15-
FriendMessage
15+
FriendMessage,
16+
FriendRecall
1617
)
1718

1819
from onebot.handlers import (
1920
GroupMessageEventHandler,
2021
PrivateMessageEventHandler,
2122
GroupDecreaseEventHandler,
2223
GroupRecallEventHandler,
23-
GroupRequestEventHandler
24+
GroupRequestEventHandler,
25+
FriendRecallEventHandler
2426
)
2527
from onebot.utils.database import db
2628
from onebot.utils.datamodels import UserInformation
@@ -70,4 +72,5 @@ async def handle_kick(client: "Client", event: "ServerKick"):
7072
lag.subscribe(GroupRecall, GroupRecallEventHandler)
7173
lag.subscribe(GroupInvite, GroupRequestEventHandler)
7274
lag.subscribe(GroupMemberJoinRequest, GroupRequestEventHandler)
75+
lag.subscribe(FriendRecall, FriendRecallEventHandler)
7376
lag.subscribe(ServerKick, handle_kick)

lagrange/client/events/friend.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,10 @@ class FriendMessage(FriendEvent):
2323
timestamp: int
2424
msg: str
2525
msg_chain: list[Element]
26+
27+
28+
@dataclass
29+
class FriendRecall(FriendEvent):
30+
seq: int
31+
msg_id: int
32+
timestamp: int

lagrange/client/server_push/msg.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
PBGroupAlbumUpdate,
1818
PBGroupInvite,
1919
)
20+
from lagrange.pb.status.friend import (
21+
PBFriendRecall
22+
)
2023
from lagrange.utils.binary.protobuf import proto_decode, ProtoStruct, proto_encode
2124
from lagrange.utils.binary.reader import Reader
2225
from lagrange.utils.operator import unpack_dict, timestamp
@@ -35,6 +38,9 @@
3538
GroupSign,
3639
GroupAlbumUpdate,
3740
)
41+
from ..events.friend import (
42+
FriendRecall
43+
)
3844
from ..wtlogin.sso import SSOPacket
3945
from .log import logger
4046

@@ -90,7 +96,18 @@ async def msg_push_handler(client: "Client", sso: SSOPacket):
9096
if pb.cmd == 87:
9197
inn = pb.info.inner
9298
return GroupMemberJoinRequest(grp_id=inn.grp_id, uid=inn.uid, invitor_uid=inn.invitor_uid)
93-
elif typ == 0x210: # friend event / group file upload notice event
99+
elif typ == 0x210: # friend event, 528 / group file upload notice event
100+
if sub_typ == 138: # friend recall
101+
pb = PBFriendRecall.decode(pkg.message.buf2)
102+
return FriendRecall(
103+
pkg.response_head.from_uin,
104+
pb.info.from_uid,
105+
pkg.response_head.to_uin,
106+
pb.info.to_uid,
107+
pb.info.seq,
108+
pb.info.random,
109+
pb.info.time
110+
)
94111
logger.debug(f"unhandled friend event / group file upload notice event: {pkg}") # TODO: paste
95112
elif typ == 0x2DC: # grp event, 732
96113
if sub_typ == 20: # nudge and group_sign(群打卡)

lagrange/pb/status/friend.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from lagrange.utils.binary.protobuf import proto_field, ProtoStruct
2+
3+
class FriendRecallInfo(ProtoStruct):
4+
from_uid: str = proto_field(1)
5+
to_uid: str = proto_field(2)
6+
seq: int = proto_field(3)
7+
new_id: int = proto_field(4)
8+
time: int = proto_field(5)
9+
random: int = proto_field(6)
10+
package_num: int = proto_field(7)
11+
package_index: int = proto_field(8)
12+
div_seq: int = proto_field(9)
13+
14+
class PBFriendRecall(ProtoStruct):
15+
info: FriendRecallInfo = proto_field(1)

onebot/event/NoticeEvent.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,9 @@ class GroupRecallNoticeEvent(NoticeEvent):
1717
group_id: int = 0
1818
user_id: int = 0
1919
operator_id: int = 0
20+
message_id: int = 0
21+
22+
class FriendRecallNoticeEvent(NoticeEvent):
23+
notice_type: str = "friend_recall"
24+
user_id: int = 0
2025
message_id: int = 0

onebot/handlers.py

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
GroupMemberJoinRequest
1111
)
1212
from lagrange.client.events.friend import (
13-
FriendMessage
13+
FriendMessage,
14+
FriendRecall
1415
)
1516
from onebot.event.MessageEvent import (
1617
GroupMessageSender,
@@ -19,7 +20,8 @@
1920
)
2021
from onebot.event.NoticeEvent import (
2122
GroupDecreaseNoticeEvent,
22-
GroupRecallNoticeEvent
23+
GroupRecallNoticeEvent,
24+
FriendRecallNoticeEvent
2325
)
2426
from onebot.event.RequestEvent import (
2527
GroupRequestEvent
@@ -32,7 +34,7 @@
3234
from onebot.utils.message_chain import MessageConverter
3335
from onebot.cache import get_info
3436

35-
from config import Config
37+
from config import Config, logger
3638

3739
import json
3840
import ws
@@ -52,6 +54,9 @@ async def GroupMessageEventHandler(client: Client, converter: MessageConverter,
5254
message_id = generate_message_id(event.grp_id, event.seq)
5355
if Config.ignore_self and event.uin == client.uin:
5456
return
57+
58+
logger.onebot.info(f"Received message ({message_id}/{event.seq}) from group ({event.grp_id}): {event.msg}")
59+
5560
event_content = event.__dict__
5661
record_data = MessageEvent(
5762
msg_id=message_id,
@@ -85,6 +90,7 @@ async def PrivateMessageEventHandler(client: Client, converter: MessageConverter
8590
return
8691
content = await converter.convert_to_segments(event.msg_chain, "friend")
8792
message_id = generate_message_id(event.from_uin, event.seq)
93+
logger.onebot.info(f"Received message ({message_id}/{event.seq}) from friend ({event.from_uin}): {event.msg}")
8894
event_content = event.__dict__
8995
record_data = MessageEvent(
9096
msg_id=message_id,
@@ -96,7 +102,7 @@ async def PrivateMessageEventHandler(client: Client, converter: MessageConverter
96102
)
97103
db.save(record_data)
98104
formatted_event = PrivateMessageEvent(
99-
message_id=event.msg_id,
105+
message_id=message_id,
100106
time=event.timestamp,
101107
user_id=event.from_uin,
102108
self_id=event.to_uin,
@@ -181,4 +187,23 @@ async def GroupRequestEventHandler(client: Client, converter: MessageConverter,
181187
converter.convert_to_dict(formatted_event),
182188
ensure_ascii=False
183189
)
184-
)
190+
)
191+
192+
@init_handler
193+
async def FriendRecallEventHandler(client: Client, converter: MessageConverter, event: FriendRecall):
194+
uin = event.from_uin
195+
seq = event.seq
196+
message: MessageEvent | Any = db.where_one(MessageEvent(), "uin = ? AND seq = ?", uin, seq, default=None)
197+
if message is None:
198+
return
199+
formatted_event = FriendRecallNoticeEvent(
200+
self_id = client.uin,
201+
user_id = uin,
202+
message_id = message.msg_id
203+
)
204+
await ws.websocket_connection.send(
205+
json.dumps(
206+
converter.convert_to_dict(formatted_event),
207+
ensure_ascii=False
208+
)
209+
)

0 commit comments

Comments
 (0)