From b9870fa28be6a74269bc65d0b92c702fcc1b6d91 Mon Sep 17 00:00:00 2001 From: Redmomn <109732988+Redmomn@users.noreply.github.com> Date: Sat, 29 Jun 2024 12:47:36 +0800 Subject: [PATCH] feat: auto conversion event uid -> uin --- client/event/friend.go | 14 ++++++++++++-- client/event/group.go | 42 +++++++++++++++++++++++++++++++++++++---- client/listener.go | 43 +++++++++++++++++++++++++++++++++--------- 3 files changed, 84 insertions(+), 15 deletions(-) diff --git a/client/event/friend.go b/client/event/friend.go index ab86e20a..76e97aaf 100644 --- a/client/event/friend.go +++ b/client/event/friend.go @@ -13,6 +13,7 @@ type ( } FriendRecall struct { + FromUin uint32 FromUid string Sequence uint64 Time uint32 @@ -22,6 +23,7 @@ type ( Rename struct { SubType uint32 // self 0 friend 1 Uin uint32 + Uid string Nickname string } ) @@ -36,6 +38,10 @@ func ParseFriendRequestNotice(event *message.FriendRequest, msg *message.PushMsg } } +func (fe *FriendRecall) Preprocess(f func(uid string) uint32) { + fe.FromUin = f(fe.FromUid) +} + func ParseFriendRecallEvent(event *message.FriendRecall) *FriendRecall { info := event.Info return &FriendRecall{ @@ -46,10 +52,14 @@ func ParseFriendRecallEvent(event *message.FriendRecall) *FriendRecall { } } -func ParseFriendRenameEvent(event *message.FriendRenameMsg, uin uint32) *Rename { +func (fe *Rename) Preprocess(f func(uid string) uint32) { + fe.Uin = f(fe.Uid) +} + +func ParseFriendRenameEvent(event *message.FriendRenameMsg) *Rename { return &Rename{ SubType: 1, - Uin: uin, + Uid: event.Body.Data.Uid, Nickname: event.Body.Data.RenameData.NickName, } } diff --git a/client/event/group.go b/client/event/group.go index b18d5e02..0518c789 100644 --- a/client/event/group.go +++ b/client/event/group.go @@ -64,12 +64,22 @@ type GroupInvite struct { InvitorUin uint32 } -func (gm *GroupMute) MuteAll() bool { - return gm.OperatorUid == "" +// CanPreprocess 实现预处理接口,对事件的uid进行转换等操作 +type CanPreprocess interface { + Preprocess(func(uid string) uint32) } -func (gmd *GroupMemberDecrease) IsKicked() bool { - return gmd.ExitType == 131 || gmd.ExitType == 3 +func (g *GroupMute) MuteAll() bool { + return g.OperatorUid == "" +} + +func (g *GroupMemberDecrease) IsKicked() bool { + return g.ExitType == 131 || g.ExitType == 3 +} + +func (g *GroupMemberJoinRequest) Preprocess(f func(uid string) uint32) { + g.InvitorUin = f(g.InvitorUid) + g.TargetUin = f(g.TargetUid) } // ParseRequestJoinNotice 主动加群 @@ -98,6 +108,10 @@ func ParseRequestInvitationNotice(event *message.GroupInvitation) *GroupMemberJo return nil } +func (g *GroupInvite) Preprocess(f func(uid string) uint32) { + g.InvitorUin = f(g.InvitorUid) +} + // ParseInviteNotice 被邀请加群 func ParseInviteNotice(event *message.GroupInvite) *GroupInvite { return &GroupInvite{ @@ -106,6 +120,11 @@ func ParseInviteNotice(event *message.GroupInvite) *GroupInvite { } } +func (g *GroupMemberIncrease) Preprocess(f func(uid string) uint32) { + g.InvitorUin = f(g.InvitorUid) + g.MemberUin = f(g.MemberUid) +} + func ParseMemberIncreaseEvent(event *message.GroupChange) *GroupMemberIncrease { return &GroupMemberIncrease{ GroupEvent: GroupEvent{ @@ -117,6 +136,11 @@ func ParseMemberIncreaseEvent(event *message.GroupChange) *GroupMemberIncrease { } } +func (g *GroupMemberDecrease) Preprocess(f func(uid string) uint32) { + g.OperatorUin = f(g.OperatorUid) + g.MemberUin = f(g.MemberUid) +} + func ParseMemberDecreaseEvent(event *message.GroupChange) *GroupMemberDecrease { return &GroupMemberDecrease{ GroupEvent: GroupEvent{ @@ -128,6 +152,11 @@ func ParseMemberDecreaseEvent(event *message.GroupChange) *GroupMemberDecrease { } } +func (g *GroupRecall) Preprocess(f func(uid string) uint32) { + g.OperatorUin = f(g.OperatorUid) + g.AuthorUin = f(g.AuthorUid) +} + func ParseGroupRecallEvent(event *message.NotifyMessageBody) *GroupRecall { info := event.Recall.RecallMessages[0] result := GroupRecall{ @@ -143,6 +172,11 @@ func ParseGroupRecallEvent(event *message.NotifyMessageBody) *GroupRecall { return &result } +func (g *GroupMute) Preprocess(f func(uid string) uint32) { + g.OperatorUin = f(g.OperatorUid) + g.TargetUin = f(g.TargetUid) +} + func ParseGroupMuteEvent(event *message.GroupMute) *GroupMute { return &GroupMute{ GroupEvent: GroupEvent{ diff --git a/client/listener.go b/client/listener.go index 8ef41751..6da7d89c 100644 --- a/client/listener.go +++ b/client/listener.go @@ -71,7 +71,9 @@ func decodeOlPushServicePacket(c *QQClient, pkt *network.Packet) (any, error) { if err != nil { return nil, err } - c.GroupMemberJoinEvent.dispatch(c, eventConverter.ParseMemberIncreaseEvent(&pb)) + ev := eventConverter.ParseMemberIncreaseEvent(&pb) + _ = c.PreprocessOther(ev) + c.GroupMemberJoinEvent.dispatch(c, ev) return nil, nil case 34: // member decrease pb := message.GroupChange{} @@ -88,7 +90,9 @@ func decodeOlPushServicePacket(c *QQClient, pkt *network.Packet) (any, error) { } pb.Operator = utils.S2B(Operator.OperatorField1.OperatorUid) } - c.GroupMemberLeaveEvent.dispatch(c, eventConverter.ParseMemberDecreaseEvent(&pb)) + ev := eventConverter.ParseMemberDecreaseEvent(&pb) + _ = c.PreprocessOther(ev) + c.GroupMemberLeaveEvent.dispatch(c, ev) return nil, nil case 84: // group request join notice pb := message.GroupJoin{} @@ -96,7 +100,9 @@ func decodeOlPushServicePacket(c *QQClient, pkt *network.Packet) (any, error) { if err != nil { return nil, err } - c.GroupMemberJoinRequestEvent.dispatch(c, eventConverter.ParseRequestJoinNotice(&pb)) + ev := eventConverter.ParseRequestJoinNotice(&pb) + _ = c.PreprocessOther(ev) + c.GroupMemberJoinRequestEvent.dispatch(c, ev) return nil, nil case 525: // group request invitation notice pb := message.GroupInvitation{} @@ -104,7 +110,9 @@ func decodeOlPushServicePacket(c *QQClient, pkt *network.Packet) (any, error) { if err != nil { return nil, err } - c.GroupMemberJoinRequestEvent.dispatch(c, eventConverter.ParseRequestInvitationNotice(&pb)) + ev := eventConverter.ParseRequestInvitationNotice(&pb) + _ = c.PreprocessOther(ev) + c.GroupMemberJoinRequestEvent.dispatch(c, ev) return nil, nil case 87: // group invite notice pb := message.GroupInvite{} @@ -112,7 +120,9 @@ func decodeOlPushServicePacket(c *QQClient, pkt *network.Packet) (any, error) { if err != nil { return nil, err } - c.GroupInvitedEvent.dispatch(c, eventConverter.ParseInviteNotice(&pb)) + ev := eventConverter.ParseInviteNotice(&pb) + _ = c.PreprocessOther(ev) + c.GroupInvitedEvent.dispatch(c, ev) return nil, nil case 0x210: // friend event, 528 subType := pkg.ContentHead.SubType.Unwrap() @@ -131,7 +141,9 @@ func decodeOlPushServicePacket(c *QQClient, pkt *network.Packet) (any, error) { if err != nil { return nil, err } - c.FriendRecallEvent.dispatch(c, eventConverter.ParseFriendRecallEvent(&pb)) + ev := eventConverter.ParseFriendRecallEvent(&pb) + _ = c.PreprocessOther(ev) + c.FriendRecallEvent.dispatch(c, ev) return nil, nil case 39: // friend rename c.debugln("friend rename") @@ -140,7 +152,9 @@ func decodeOlPushServicePacket(c *QQClient, pkt *network.Packet) (any, error) { if err != nil { return nil, err } - c.RenameEvent.dispatch(c, eventConverter.ParseFriendRenameEvent(&pb, c.cache.GetUin(pb.Body.Data.Uid))) + ev := eventConverter.ParseFriendRenameEvent(&pb) + _ = c.PreprocessOther(ev) + c.RenameEvent.dispatch(c, ev) return nil, nil case 29: c.debugln("self rename") @@ -168,7 +182,9 @@ func decodeOlPushServicePacket(c *QQClient, pkt *network.Packet) (any, error) { if err != nil { return nil, err } - c.GroupRecallEvent.dispatch(c, eventConverter.ParseGroupRecallEvent(&pb)) + ev := eventConverter.ParseGroupRecallEvent(&pb) + _ = c.PreprocessOther(ev) + c.GroupRecallEvent.dispatch(c, ev) return nil, nil case 12: // mute pb := message.GroupMute{} @@ -176,7 +192,9 @@ func decodeOlPushServicePacket(c *QQClient, pkt *network.Packet) (any, error) { if err != nil { return nil, err } - c.GroupMuteEvent.dispatch(c, eventConverter.ParseGroupMuteEvent(&pb)) + ev := eventConverter.ParseGroupMuteEvent(&pb) + _ = c.PreprocessOther(ev) + c.GroupMuteEvent.dispatch(c, ev) return nil, nil default: c.warning("Unsupported group event, subType: %v", subType) @@ -219,3 +237,10 @@ func (c *QQClient) PreprocessPrivateMessageEvent(msg *msgConverter.PrivateMessag } return nil } + +func (c *QQClient) PreprocessOther(g eventConverter.CanPreprocess) error { + g.Preprocess(func(uid string) uint32 { + return c.GetUin(uid) + }) + return nil +}