From d9f803837f49cd4271595b01bd031c3cf9c6f298 Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Tue, 1 Mar 2022 16:20:18 +0800 Subject: [PATCH] client: use generic event handler --- client/c2c_processor.go | 14 +- client/client.go | 31 ++- client/decoders.go | 20 +- client/events.go | 460 +++------------------------------------- client/group_msg.go | 12 +- client/network.go | 16 +- client/notify.go | 6 +- client/online_push.go | 20 +- client/private_msg.go | 2 +- client/sync.go | 4 +- client/system_msg.go | 4 +- utils/ttl.go | 9 +- 12 files changed, 116 insertions(+), 482 deletions(-) diff --git a/client/c2c_processor.go b/client/c2c_processor.go index 08504880..8b44f8a7 100644 --- a/client/c2c_processor.go +++ b/client/c2c_processor.go @@ -132,10 +132,10 @@ func privateMessageDecoder(c *QQClient, pMsg *msg.Message, _ *network.IncomingPa } if pMsg.Head.GetFromUin() == c.Uin { - c.dispatchPrivateMessageSelf(c.parsePrivateMessage(pMsg)) + c.SelfPrivateMessageEvent.dispatch(c, c.parsePrivateMessage(pMsg)) return } - c.dispatchPrivateMessage(c.parsePrivateMessage(pMsg)) + c.PrivateMessageEvent.dispatch(c, c.parsePrivateMessage(pMsg)) default: c.Debug("unknown c2c cmd on private msg decoder: %v", pMsg.Head.GetC2CCmd()) } @@ -149,7 +149,7 @@ func privatePttDecoder(c *QQClient, pMsg *msg.Message, _ *network.IncomingPacket // m := binary.NewReader(pMsg.Body.RichText.Ptt.Reserve[1:]).ReadTlvMap(1) // T3 -> timestamp T8 -> voiceType T9 -> voiceLength T10 -> PbReserveStruct } - c.dispatchPrivateMessage(c.parsePrivateMessage(pMsg)) + c.PrivateMessageEvent.dispatch(c, c.parsePrivateMessage(pMsg)) } func tempSessionDecoder(c *QQClient, pMsg *msg.Message, _ *network.IncomingPacketInfo) { @@ -206,7 +206,7 @@ func tempSessionDecoder(c *QQClient, pMsg *msg.Message, _ *network.IncomingPacke if pMsg.Head.GetFromUin() == c.Uin { return } - c.dispatchTempMessage(&TempMessageEvent{ + c.TempMessageEvent.dispatch(c, &TempMessageEvent{ Message: c.parseTempMessage(pMsg), Session: session, }) @@ -219,7 +219,7 @@ func troopAddMemberBroadcastDecoder(c *QQClient, pMsg *msg.Message, _ *network.I group := c.FindGroupByUin(pMsg.Head.GetFromUin()) if pMsg.Head.GetAuthUin() == c.Uin { if group == nil && c.ReloadGroupList() == nil { - c.dispatchJoinGroupEvent(c.FindGroupByUin(pMsg.Head.GetFromUin())) + c.GroupJoinEvent.dispatch(c, c.FindGroupByUin(pMsg.Head.GetFromUin())) } } else { if group != nil && group.FindMember(pMsg.Head.GetAuthUin()) == nil { @@ -232,7 +232,7 @@ func troopAddMemberBroadcastDecoder(c *QQClient, pMsg *msg.Message, _ *network.I info.Members = append(info.Members, mem) info.sort() }) - c.dispatchNewMemberEvent(&MemberJoinGroupEvent{ + c.GroupMemberJoinEvent.dispatch(c, &MemberJoinGroupEvent{ Group: group, Member: mem, }) @@ -275,7 +275,7 @@ func msgType0x211Decoder(c *QQClient, pMsg *msg.Message, info *network.IncomingP if err != nil { return } - c.dispatchOfflineFileEvent(&OfflineFileEvent{ + c.OfflineFileEvent.dispatch(c, &OfflineFileEvent{ FileName: string(sub4.NotOnlineFile.FileName), FileSize: sub4.NotOnlineFile.GetFileSize(), Sender: pMsg.Head.GetFromUin(), diff --git a/client/client.go b/client/client.go index 0ddc358d..e5fe70d0 100644 --- a/client/client.go +++ b/client/client.go @@ -19,6 +19,7 @@ import ( "github.com/Mrs4s/MiraiGo/client/internal/network" "github.com/Mrs4s/MiraiGo/client/internal/oicq" "github.com/Mrs4s/MiraiGo/client/pb/msg" + "github.com/Mrs4s/MiraiGo/message" "github.com/Mrs4s/MiraiGo/utils" ) @@ -76,6 +77,35 @@ type QQClient struct { // otherSrvAddrs []string // fileStorageInfo *jce.FileStoragePushFSSvcList + // event handles + eventHandlers eventHandlers + PrivateMessageEvent EventHandle[*message.PrivateMessage] + TempMessageEvent EventHandle[*TempMessageEvent] + GroupMessageEvent EventHandle[*message.GroupMessage] + SelfPrivateMessageEvent EventHandle[*message.PrivateMessage] + SelfGroupMessageEvent EventHandle[*message.GroupMessage] + GroupMuteEvent EventHandle[*GroupMuteEvent] + GroupMessageRecalledEvent EventHandle[*GroupMessageRecalledEvent] + FriendMessageRecalledEvent EventHandle[*FriendMessageRecalledEvent] + GroupJoinEvent EventHandle[*GroupInfo] + GroupLeaveEvent EventHandle[*GroupLeaveEvent] + GroupMemberJoinEvent EventHandle[*MemberJoinGroupEvent] + GroupMemberLeaveEvent EventHandle[*MemberLeaveGroupEvent] + MemberCardUpdatedEvent EventHandle[*MemberCardUpdatedEvent] + GroupNameUpdatedEvent EventHandle[*GroupNameUpdatedEvent] + GroupMemberPermissionChangedEvent EventHandle[*MemberPermissionChangedEvent] + GroupInvitedEvent EventHandle[*GroupInvitedRequest] + UserWantJoinGroupEvent EventHandle[*UserJoinGroupRequest] + NewFriendEvent EventHandle[*NewFriendEvent] + NewFriendRequestEvent EventHandle[*NewFriendRequest] + DisconnectedEvent EventHandle[*ClientDisconnectedEvent] + GroupNotifyEvent EventHandle[INotifyEvent] + FriendNotifyEvent EventHandle[INotifyEvent] + MemberSpecialTitleUpdatedEvent EventHandle[*MemberSpecialTitleUpdatedEvent] + GroupDigestEvent EventHandle[*GroupDigestEvent] + OtherClientStatusChangedEvent EventHandle[*OtherClientStatusChangedEvent] + OfflineFileEvent EventHandle[*OfflineFileEvent] + // message state msgSvcCache *utils.Cache[unit] lastC2CMsgTime int64 @@ -88,7 +118,6 @@ type QQClient struct { groupSeq atomic.Int32 friendSeq atomic.Int32 highwayApplyUpSeq atomic.Int32 - eventHandlers eventHandlers groupListLock sync.Mutex } diff --git a/client/decoders.go b/client/decoders.go index 35a17919..5c180f6e 100644 --- a/client/decoders.go +++ b/client/decoders.go @@ -659,10 +659,10 @@ func decodeOnlinePushTransPacket(c *QQClient, _ *network.IncomingPacketInfo, pay switch typ { case 0x02: if target == c.Uin { - c.dispatchLeaveGroupEvent(&GroupLeaveEvent{Group: g}) + c.GroupLeaveEvent.dispatch(c, &GroupLeaveEvent{Group: g}) } else if m := g.FindMember(target); m != nil { g.removeMember(target) - c.dispatchMemberLeaveEvent(&MemberLeaveGroupEvent{ + c.GroupMemberLeaveEvent.dispatch(c, &MemberLeaveGroupEvent{ Group: g, Member: m, }) @@ -672,13 +672,13 @@ func decodeOnlinePushTransPacket(c *QQClient, _ *network.IncomingPacketInfo, pay return nil, err } if target == c.Uin { - c.dispatchLeaveGroupEvent(&GroupLeaveEvent{ + c.GroupLeaveEvent.dispatch(c, &GroupLeaveEvent{ Group: g, Operator: g.FindMember(operator), }) } else if m := g.FindMember(target); m != nil { g.removeMember(target) - c.dispatchMemberLeaveEvent(&MemberLeaveGroupEvent{ + c.GroupMemberLeaveEvent.dispatch(c, &MemberLeaveGroupEvent{ Group: g, Member: m, Operator: g.FindMember(operator), @@ -687,7 +687,7 @@ func decodeOnlinePushTransPacket(c *QQClient, _ *network.IncomingPacketInfo, pay case 0x82: if m := g.FindMember(target); m != nil { g.removeMember(target) - c.dispatchMemberLeaveEvent(&MemberLeaveGroupEvent{ + c.GroupMemberLeaveEvent.dispatch(c, &MemberLeaveGroupEvent{ Group: g, Member: m, }) @@ -695,7 +695,7 @@ func decodeOnlinePushTransPacket(c *QQClient, _ *network.IncomingPacketInfo, pay case 0x83: if m := g.FindMember(target); m != nil { g.removeMember(target) - c.dispatchMemberLeaveEvent(&MemberLeaveGroupEvent{ + c.GroupMemberLeaveEvent.dispatch(c, &MemberLeaveGroupEvent{ Group: g, Member: m, Operator: g.FindMember(operator), @@ -724,7 +724,7 @@ func decodeOnlinePushTransPacket(c *QQClient, _ *network.IncomingPacketInfo, pay if mem.Permission != newPermission { old := mem.Permission mem.Permission = newPermission - c.dispatchPermissionChanged(&MemberPermissionChangedEvent{ + c.GroupMemberPermissionChangedEvent.dispatch(c, &MemberPermissionChangedEvent{ Group: g, Member: mem, OldPermission: old, @@ -748,7 +748,7 @@ func decodeSystemMsgFriendPacket(c *QQClient, _ *network.IncomingPacketInfo, pay } st := rsp.Friendmsgs[0] if st.Msg != nil { - c.dispatchNewFriendRequest(&NewFriendRequest{ + c.NewFriendRequestEvent.dispatch(c, &NewFriendRequest{ RequestId: st.MsgSeq, Message: st.Msg.MsgAdditional, RequesterUin: st.ReqUin, @@ -768,7 +768,7 @@ func decodeForceOfflinePacket(c *QQClient, _ *network.IncomingPacketInfo, payloa r := jce.NewJceReader(data.Map["req_PushForceOffline"]["PushNotifyPack.RequestPushForceOffline"][1:]) tips := r.ReadString(2) c.Disconnect() - go c.dispatchDisconnectEvent(&ClientDisconnectedEvent{Message: tips}) + go c.DisconnectedEvent.dispatch(c, &ClientDisconnectedEvent{Message: tips}) return nil, nil } @@ -777,7 +777,7 @@ func decodeMSFOfflinePacket(c *QQClient, _ *network.IncomingPacketInfo, _ []byte // c.lastLostMsg = "服务器端强制下线." c.Disconnect() // 这个decoder不能消耗太多时间, event另起线程处理 - go c.dispatchDisconnectEvent(&ClientDisconnectedEvent{Message: "服务端强制下线."}) + go c.DisconnectedEvent.dispatch(c, &ClientDisconnectedEvent{Message: "服务端强制下线."}) return nil, nil } diff --git a/client/events.go b/client/events.go index 0a3634f7..3cc55ac7 100644 --- a/client/events.go +++ b/client/events.go @@ -8,12 +8,36 @@ import ( "github.com/Mrs4s/MiraiGo/message" ) +// protected all EventHandle, since write is very rare, use +// only one lock to save memory +var eventMu sync.RWMutex + +type EventHandle[T any] struct { + // QQClient? + handlers []func(client *QQClient, event T) +} + +func (handle *EventHandle[T]) Subscribe(handler func(client *QQClient, event T)) { + eventMu.Lock() + defer eventMu.Unlock() + handle.handlers = append(handle.handlers, handler) +} + +func (handle *EventHandle[T]) dispatch(client *QQClient, event T) { + eventMu.RLock() + defer eventMu.RUnlock() + defer func() { + if pan := recover(); pan != nil { + fmt.Printf("event error: %v\n%s", pan, debug.Stack()) + } + }() + for _, handler := range handle.handlers { + handler(client, event) + } +} + type eventHandlers struct { - privateMessageHandlers []func(*QQClient, *message.PrivateMessage) - tempMessageHandlers []func(*QQClient, *TempMessageEvent) - groupMessageHandlers []func(*QQClient, *message.GroupMessage) - selfPrivateMessageHandlers []func(*QQClient, *message.PrivateMessage) - selfGroupMessageHandlers []func(*QQClient, *message.GroupMessage) + // todo: move to event handle guildChannelMessageHandlers []func(*QQClient, *message.GuildChannelMessage) guildMessageReactionsUpdatedHandlers []func(*QQClient, *GuildMessageReactionsUpdatedEvent) guildMessageRecalledHandlers []func(*QQClient, *GuildMessageRecalledEvent) @@ -21,58 +45,11 @@ type eventHandlers struct { guildChannelCreatedHandlers []func(*QQClient, *GuildChannelOperationEvent) guildChannelDestroyedHandlers []func(*QQClient, *GuildChannelOperationEvent) memberJoinedGuildHandlers []func(*QQClient, *MemberJoinGuildEvent) - groupMuteEventHandlers []func(*QQClient, *GroupMuteEvent) - groupRecalledHandlers []func(*QQClient, *GroupMessageRecalledEvent) - friendRecalledHandlers []func(*QQClient, *FriendMessageRecalledEvent) - joinGroupHandlers []func(*QQClient, *GroupInfo) - leaveGroupHandlers []func(*QQClient, *GroupLeaveEvent) - memberJoinedHandlers []func(*QQClient, *MemberJoinGroupEvent) - memberLeavedHandlers []func(*QQClient, *MemberLeaveGroupEvent) - memberCardUpdatedHandlers []func(*QQClient, *MemberCardUpdatedEvent) - groupNameUpdatedHandlers []func(*QQClient, *GroupNameUpdatedEvent) - permissionChangedHandlers []func(*QQClient, *MemberPermissionChangedEvent) - groupInvitedHandlers []func(*QQClient, *GroupInvitedRequest) - joinRequestHandlers []func(*QQClient, *UserJoinGroupRequest) - friendRequestHandlers []func(*QQClient, *NewFriendRequest) - newFriendHandlers []func(*QQClient, *NewFriendEvent) - disconnectHandlers []func(*QQClient, *ClientDisconnectedEvent) - logHandlers []func(*QQClient, *LogEvent) - serverUpdatedHandlers []func(*QQClient, *ServerUpdatedEvent) bool - groupNotifyHandlers []func(*QQClient, INotifyEvent) - friendNotifyHandlers []func(*QQClient, INotifyEvent) - memberTitleUpdatedHandlers []func(*QQClient, *MemberSpecialTitleUpdatedEvent) - offlineFileHandlers []func(*QQClient, *OfflineFileEvent) - otherClientStatusChangedHandlers []func(*QQClient, *OtherClientStatusChangedEvent) - groupDigestHandlers []func(*QQClient, *GroupDigestEvent) - groupMessageReceiptHandlers sync.Map -} -func (c *QQClient) OnPrivateMessage(f func(*QQClient, *message.PrivateMessage)) { - c.eventHandlers.privateMessageHandlers = append(c.eventHandlers.privateMessageHandlers, f) -} - -func (c *QQClient) OnPrivateMessageF(filter func(*message.PrivateMessage) bool, f func(*QQClient, *message.PrivateMessage)) { - c.OnPrivateMessage(func(client *QQClient, msg *message.PrivateMessage) { - if filter(msg) { - f(client, msg) - } - }) -} - -func (c *QQClient) OnTempMessage(f func(*QQClient, *TempMessageEvent)) { - c.eventHandlers.tempMessageHandlers = append(c.eventHandlers.tempMessageHandlers, f) -} - -func (c *QQClient) OnGroupMessage(f func(*QQClient, *message.GroupMessage)) { - c.eventHandlers.groupMessageHandlers = append(c.eventHandlers.groupMessageHandlers, f) -} - -func (c *QQClient) OnSelfPrivateMessage(f func(*QQClient, *message.PrivateMessage)) { - c.eventHandlers.selfPrivateMessageHandlers = append(c.eventHandlers.selfPrivateMessageHandlers, f) -} - -func (c *QQClient) OnSelfGroupMessage(f func(*QQClient, *message.GroupMessage)) { - c.eventHandlers.selfGroupMessageHandlers = append(c.eventHandlers.selfGroupMessageHandlers, f) + // consider Logger interface? + logHandlers []func(*QQClient, *LogEvent) + serverUpdatedHandlers []func(*QQClient, *ServerUpdatedEvent) bool + groupMessageReceiptHandlers sync.Map } func (s *GuildService) OnGuildChannelMessage(f func(*QQClient, *message.GuildChannelMessage)) { @@ -103,99 +80,14 @@ func (s *GuildService) OnMemberJoinedGuild(f func(*QQClient, *MemberJoinGuildEve s.c.eventHandlers.memberJoinedGuildHandlers = append(s.c.eventHandlers.memberJoinedGuildHandlers, f) } -func (c *QQClient) OnGroupMuted(f func(*QQClient, *GroupMuteEvent)) { - c.eventHandlers.groupMuteEventHandlers = append(c.eventHandlers.groupMuteEventHandlers, f) -} - -func (c *QQClient) OnJoinGroup(f func(*QQClient, *GroupInfo)) { - c.eventHandlers.joinGroupHandlers = append(c.eventHandlers.joinGroupHandlers, f) -} - -func (c *QQClient) OnLeaveGroup(f func(*QQClient, *GroupLeaveEvent)) { - c.eventHandlers.leaveGroupHandlers = append(c.eventHandlers.leaveGroupHandlers, f) -} - -func (c *QQClient) OnGroupMemberJoined(f func(*QQClient, *MemberJoinGroupEvent)) { - c.eventHandlers.memberJoinedHandlers = append(c.eventHandlers.memberJoinedHandlers, f) -} - -func (c *QQClient) OnGroupMemberLeaved(f func(*QQClient, *MemberLeaveGroupEvent)) { - c.eventHandlers.memberLeavedHandlers = append(c.eventHandlers.memberLeavedHandlers, f) -} - -func (c *QQClient) OnGroupMemberCardUpdated(f func(*QQClient, *MemberCardUpdatedEvent)) { - c.eventHandlers.memberCardUpdatedHandlers = append(c.eventHandlers.memberCardUpdatedHandlers, f) -} - -func (c *QQClient) OnGroupNameUpdated(f func(*QQClient, *GroupNameUpdatedEvent)) { - c.eventHandlers.groupNameUpdatedHandlers = append(c.eventHandlers.groupNameUpdatedHandlers, f) -} - -func (c *QQClient) OnGroupMemberPermissionChanged(f func(*QQClient, *MemberPermissionChangedEvent)) { - c.eventHandlers.permissionChangedHandlers = append(c.eventHandlers.permissionChangedHandlers, f) -} - -func (c *QQClient) OnGroupMessageRecalled(f func(*QQClient, *GroupMessageRecalledEvent)) { - c.eventHandlers.groupRecalledHandlers = append(c.eventHandlers.groupRecalledHandlers, f) -} - -func (c *QQClient) OnFriendMessageRecalled(f func(*QQClient, *FriendMessageRecalledEvent)) { - c.eventHandlers.friendRecalledHandlers = append(c.eventHandlers.friendRecalledHandlers, f) -} - -func (c *QQClient) OnGroupInvited(f func(*QQClient, *GroupInvitedRequest)) { - c.eventHandlers.groupInvitedHandlers = append(c.eventHandlers.groupInvitedHandlers, f) -} - -func (c *QQClient) OnUserWantJoinGroup(f func(*QQClient, *UserJoinGroupRequest)) { - c.eventHandlers.joinRequestHandlers = append(c.eventHandlers.joinRequestHandlers, f) -} - -func (c *QQClient) OnNewFriendRequest(f func(*QQClient, *NewFriendRequest)) { - c.eventHandlers.friendRequestHandlers = append(c.eventHandlers.friendRequestHandlers, f) -} - -func (c *QQClient) OnNewFriendAdded(f func(*QQClient, *NewFriendEvent)) { - c.eventHandlers.newFriendHandlers = append(c.eventHandlers.newFriendHandlers, f) -} - -func (c *QQClient) OnDisconnected(f func(*QQClient, *ClientDisconnectedEvent)) { - c.eventHandlers.disconnectHandlers = append(c.eventHandlers.disconnectHandlers, f) -} - func (c *QQClient) OnServerUpdated(f func(*QQClient, *ServerUpdatedEvent) bool) { c.eventHandlers.serverUpdatedHandlers = append(c.eventHandlers.serverUpdatedHandlers, f) } -func (c *QQClient) OnReceivedOfflineFile(f func(*QQClient, *OfflineFileEvent)) { - c.eventHandlers.offlineFileHandlers = append(c.eventHandlers.offlineFileHandlers, f) -} - -func (c *QQClient) OnOtherClientStatusChanged(f func(*QQClient, *OtherClientStatusChangedEvent)) { - c.eventHandlers.otherClientStatusChangedHandlers = append(c.eventHandlers.otherClientStatusChangedHandlers, f) -} - func (c *QQClient) OnLog(f func(*QQClient, *LogEvent)) { c.eventHandlers.logHandlers = append(c.eventHandlers.logHandlers, f) } -func (c *QQClient) OnGroupNotify(f func(*QQClient, INotifyEvent)) { - c.eventHandlers.groupNotifyHandlers = append(c.eventHandlers.groupNotifyHandlers, f) -} - -func (c *QQClient) OnFriendNotify(f func(*QQClient, INotifyEvent)) { - c.eventHandlers.friendNotifyHandlers = append(c.eventHandlers.friendNotifyHandlers, f) -} - -func (c *QQClient) OnMemberSpecialTitleUpdated(f func(*QQClient, *MemberSpecialTitleUpdatedEvent)) { - c.eventHandlers.memberTitleUpdatedHandlers = append(c.eventHandlers.memberTitleUpdatedHandlers, f) -} - -// OnGroupDigest 群精华消息事件注册 -func (c *QQClient) OnGroupDigest(f func(*QQClient, *GroupDigestEvent)) { - c.eventHandlers.groupDigestHandlers = append(c.eventHandlers.groupDigestHandlers, f) -} - func NewUinFilterPrivate(uin int64) func(*message.PrivateMessage) bool { return func(msg *message.PrivateMessage) bool { return msg.Sender.Uin == uin @@ -210,61 +102,6 @@ func (c *QQClient) onGroupMessageReceipt(id string, f ...func(*QQClient, *groupM c.eventHandlers.groupMessageReceiptHandlers.LoadOrStore(id, f[0]) } -func (c *QQClient) dispatchPrivateMessage(msg *message.PrivateMessage) { - if msg == nil { - return - } - for _, f := range c.eventHandlers.privateMessageHandlers { - cover(func() { - f(c, msg) - }) - } -} - -func (c *QQClient) dispatchTempMessage(e *TempMessageEvent) { - if e == nil { - return - } - for _, f := range c.eventHandlers.tempMessageHandlers { - cover(func() { - f(c, e) - }) - } -} - -func (c *QQClient) dispatchGroupMessage(msg *message.GroupMessage) { - if msg == nil { - return - } - for _, f := range c.eventHandlers.groupMessageHandlers { - cover(func() { - f(c, msg) - }) - } -} - -func (c *QQClient) dispatchPrivateMessageSelf(msg *message.PrivateMessage) { - if msg == nil { - return - } - for _, f := range c.eventHandlers.selfPrivateMessageHandlers { - cover(func() { - f(c, msg) - }) - } -} - -func (c *QQClient) dispatchGroupMessageSelf(msg *message.GroupMessage) { - if msg == nil { - return - } - for _, f := range c.eventHandlers.selfGroupMessageHandlers { - cover(func() { - f(c, msg) - }) - } -} - func (c *QQClient) dispatchGuildChannelMessage(msg *message.GuildChannelMessage) { if msg == nil { return @@ -342,116 +179,6 @@ func (c *QQClient) dispatchMemberJoinedGuildEvent(e *MemberJoinGuildEvent) { } } -func (c *QQClient) dispatchGroupMuteEvent(e *GroupMuteEvent) { - if e == nil { - return - } - for _, f := range c.eventHandlers.groupMuteEventHandlers { - cover(func() { - f(c, e) - }) - } -} - -func (c *QQClient) dispatchGroupMessageRecalledEvent(e *GroupMessageRecalledEvent) { - if e == nil { - return - } - for _, f := range c.eventHandlers.groupRecalledHandlers { - cover(func() { - f(c, e) - }) - } -} - -func (c *QQClient) dispatchFriendMessageRecalledEvent(e *FriendMessageRecalledEvent) { - if e == nil { - return - } - for _, f := range c.eventHandlers.friendRecalledHandlers { - cover(func() { - f(c, e) - }) - } -} - -func (c *QQClient) dispatchJoinGroupEvent(group *GroupInfo) { - if group == nil { - return - } - for _, f := range c.eventHandlers.joinGroupHandlers { - cover(func() { - f(c, group) - }) - } -} - -func (c *QQClient) dispatchLeaveGroupEvent(e *GroupLeaveEvent) { - if e == nil { - return - } - for _, f := range c.eventHandlers.leaveGroupHandlers { - cover(func() { - f(c, e) - }) - } -} - -func (c *QQClient) dispatchNewMemberEvent(e *MemberJoinGroupEvent) { - if e == nil { - return - } - for _, f := range c.eventHandlers.memberJoinedHandlers { - cover(func() { - f(c, e) - }) - } -} - -func (c *QQClient) dispatchMemberLeaveEvent(e *MemberLeaveGroupEvent) { - if e == nil { - return - } - for _, f := range c.eventHandlers.memberLeavedHandlers { - cover(func() { - f(c, e) - }) - } -} - -func (c *QQClient) dispatchMemberCardUpdatedEvent(e *MemberCardUpdatedEvent) { - if e == nil { - return - } - for _, f := range c.eventHandlers.memberCardUpdatedHandlers { - cover(func() { - f(c, e) - }) - } -} - -func (c *QQClient) dispatchGroupNameUpdatedEvent(e *GroupNameUpdatedEvent) { - if e == nil { - return - } - for _, f := range c.eventHandlers.groupNameUpdatedHandlers { - cover(func() { - f(c, e) - }) - } -} - -func (c *QQClient) dispatchPermissionChanged(e *MemberPermissionChangedEvent) { - if e == nil { - return - } - for _, f := range c.eventHandlers.permissionChangedHandlers { - cover(func() { - f(c, e) - }) - } -} - func (c *QQClient) dispatchGroupMessageReceiptEvent(e *groupMessageReceiptEvent) { c.eventHandlers.groupMessageReceiptHandlers.Range(func(_, f interface{}) bool { go f.(func(*QQClient, *groupMessageReceiptEvent))(c, e) @@ -459,127 +186,6 @@ func (c *QQClient) dispatchGroupMessageReceiptEvent(e *groupMessageReceiptEvent) }) } -func (c *QQClient) dispatchGroupInvitedEvent(e *GroupInvitedRequest) { - if e == nil { - return - } - for _, f := range c.eventHandlers.groupInvitedHandlers { - cover(func() { - f(c, e) - }) - } -} - -func (c *QQClient) dispatchJoinGroupRequest(r *UserJoinGroupRequest) { - if r == nil { - return - } - for _, f := range c.eventHandlers.joinRequestHandlers { - cover(func() { - f(c, r) - }) - } -} - -func (c *QQClient) dispatchNewFriendRequest(r *NewFriendRequest) { - if r == nil { - return - } - for _, f := range c.eventHandlers.friendRequestHandlers { - cover(func() { - f(c, r) - }) - } -} - -func (c *QQClient) dispatchNewFriendEvent(e *NewFriendEvent) { - if e == nil { - return - } - for _, f := range c.eventHandlers.newFriendHandlers { - cover(func() { - f(c, e) - }) - } -} - -func (c *QQClient) dispatchGroupNotifyEvent(e INotifyEvent) { - if e == nil { - return - } - for _, f := range c.eventHandlers.groupNotifyHandlers { - cover(func() { - f(c, e) - }) - } -} - -func (c *QQClient) dispatchFriendNotifyEvent(e INotifyEvent) { - if e == nil { - return - } - for _, f := range c.eventHandlers.friendNotifyHandlers { - cover(func() { - f(c, e) - }) - } -} - -func (c *QQClient) dispatchMemberSpecialTitleUpdateEvent(e *MemberSpecialTitleUpdatedEvent) { - if e == nil { - return - } - for _, f := range c.eventHandlers.memberTitleUpdatedHandlers { - cover(func() { - f(c, e) - }) - } -} - -func (c *QQClient) dispatchDisconnectEvent(e *ClientDisconnectedEvent) { - if e == nil { - return - } - for _, f := range c.eventHandlers.disconnectHandlers { - cover(func() { - f(c, e) - }) - } -} - -func (c *QQClient) dispatchOfflineFileEvent(e *OfflineFileEvent) { - if e == nil { - return - } - for _, f := range c.eventHandlers.offlineFileHandlers { - cover(func() { - f(c, e) - }) - } -} - -func (c *QQClient) dispatchOtherClientStatusChangedEvent(e *OtherClientStatusChangedEvent) { - if e == nil { - return - } - for _, f := range c.eventHandlers.otherClientStatusChangedHandlers { - cover(func() { - f(c, e) - }) - } -} - -func (c *QQClient) dispatchGroupDigestEvent(e *GroupDigestEvent) { - if e == nil { - return - } - for _, f := range c.eventHandlers.groupDigestHandlers { - cover(func() { - f(c, e) - }) - } -} - func (c *QQClient) dispatchLogEvent(e *LogEvent) { if e == nil { return diff --git a/client/group_msg.go b/client/group_msg.go index 56fd3f72..45960e09 100644 --- a/client/group_msg.go +++ b/client/group_msg.go @@ -317,17 +317,17 @@ func decodeGroupMessagePacket(c *QQClient, _ *network.IncomingPacketInfo, payloa if builder.len() >= pkt.Message.Content.GetPkgNum() { c.msgBuilders.Delete(seq) if pkt.Message.Head.GetFromUin() == c.Uin { - c.dispatchGroupMessageSelf(c.parseGroupMessage(builder.build())) + c.SelfGroupMessageEvent.dispatch(c, c.parseGroupMessage(builder.build())) } else { - c.dispatchGroupMessage(c.parseGroupMessage(builder.build())) + c.GroupMessageEvent.dispatch(c, c.parseGroupMessage(builder.build())) } } return nil, nil } if pkt.Message.Head.GetFromUin() == c.Uin { - c.dispatchGroupMessageSelf(c.parseGroupMessage(pkt.Message)) + c.SelfGroupMessageEvent.dispatch(c, c.parseGroupMessage(pkt.Message)) } else { - c.dispatchGroupMessage(c.parseGroupMessage(pkt.Message)) + c.GroupMessageEvent.dispatch(c, c.parseGroupMessage(pkt.Message)) } return nil, nil } @@ -463,7 +463,7 @@ func (c *QQClient) parseGroupMessage(m *msg.Message) *message.GroupMessage { mem = info group.Members = append(group.Members, mem) group.sort() - go c.dispatchNewMemberEvent(&MemberJoinGroupEvent{ + go c.GroupMemberJoinEvent.dispatch(c, &MemberJoinGroupEvent{ Group: group, Member: info, }) @@ -531,7 +531,7 @@ func (c *QQClient) parseGroupMessage(m *msg.Message) *message.GroupMessage { mem.CardName = groupCard } if old != mem.CardName { - go c.dispatchMemberCardUpdatedEvent(&MemberCardUpdatedEvent{ + c.MemberCardUpdatedEvent.dispatch(c, &MemberCardUpdatedEvent{ Group: group, OldCard: old, Member: mem, diff --git a/client/network.go b/client/network.go index d5cbf229..0554c816 100644 --- a/client/network.go +++ b/client/network.go @@ -102,15 +102,15 @@ func (c *QQClient) connect() error { return err } c.once.Do(func() { - c.OnGroupMessage(func(_ *QQClient, _ *message.GroupMessage) { + c.GroupMessageEvent.Subscribe(func(_ *QQClient, _ *message.GroupMessage) { c.stat.MessageReceived.Add(1) c.stat.LastMessageTime.Store(time.Now().Unix()) }) - c.OnPrivateMessage(func(_ *QQClient, _ *message.PrivateMessage) { + c.PrivateMessageEvent.Subscribe(func(_ *QQClient, _ *message.PrivateMessage) { c.stat.MessageReceived.Add(1) c.stat.LastMessageTime.Store(time.Now().Unix()) }) - c.OnTempMessage(func(_ *QQClient, _ *TempMessageEvent) { + c.TempMessageEvent.Subscribe(func(_ *QQClient, _ *TempMessageEvent) { c.stat.MessageReceived.Add(1) c.stat.LastMessageTime.Store(time.Now().Unix()) }) @@ -130,13 +130,13 @@ func (c *QQClient) quickReconnect() { time.Sleep(time.Millisecond * 200) if err := c.connect(); err != nil { c.Error("connect server error: %v", err) - c.dispatchDisconnectEvent(&ClientDisconnectedEvent{Message: "quick reconnect failed"}) + c.DisconnectedEvent.dispatch(c, &ClientDisconnectedEvent{Message: "quick reconnect failed"}) return } if err := c.registerClient(); err != nil { c.Error("register client failed: %v", err) c.Disconnect() - c.dispatchDisconnectEvent(&ClientDisconnectedEvent{Message: "register error"}) + c.DisconnectedEvent.dispatch(c, &ClientDisconnectedEvent{Message: "register error"}) return } } @@ -263,13 +263,13 @@ func (c *QQClient) unexpectedDisconnect(_ *network.TCPListener, e error) { c.Online.Store(false) if err := c.connect(); err != nil { c.Error("connect server error: %v", err) - c.dispatchDisconnectEvent(&ClientDisconnectedEvent{Message: "connection dropped by server."}) + c.DisconnectedEvent.dispatch(c, &ClientDisconnectedEvent{Message: "connection dropped by server."}) return } if err := c.registerClient(); err != nil { c.Error("register client failed: %v", err) c.Disconnect() - c.dispatchDisconnectEvent(&ClientDisconnectedEvent{Message: "register error"}) + c.DisconnectedEvent.dispatch(c, &ClientDisconnectedEvent{Message: "register error"}) return } } @@ -298,7 +298,7 @@ func (c *QQClient) netLoop() { c.Error("parse incoming packet error: %v", err) if errors.Is(err, network.ErrSessionExpired) || errors.Is(err, network.ErrPacketDropped) { c.Disconnect() - go c.dispatchDisconnectEvent(&ClientDisconnectedEvent{Message: "session expired"}) + go c.DisconnectedEvent.dispatch(c, &ClientDisconnectedEvent{Message: "session expired"}) continue } errCount++ diff --git a/client/notify.go b/client/notify.go index 634f88cb..c9cda9e5 100644 --- a/client/notify.go +++ b/client/notify.go @@ -62,7 +62,7 @@ func (c *QQClient) grayTipProcessor(groupCode int64, tipInfo *notify.GeneralGray } } if sender != 0 { - c.dispatchGroupNotifyEvent(&GroupPokeNotifyEvent{ + c.GroupNotifyEvent.dispatch(c, &GroupPokeNotifyEvent{ GroupCode: groupCode, Sender: sender, Receiver: receiver, @@ -81,7 +81,7 @@ func (c *QQClient) grayTipProcessor(groupCode int64, tipInfo *notify.GeneralGray uin, _ = strconv.ParseInt(templ.Value, 10, 64) } } - c.dispatchGroupNotifyEvent(&MemberHonorChangedNotifyEvent{ + c.GroupNotifyEvent.dispatch(c, &MemberHonorChangedNotifyEvent{ GroupCode: groupCode, Honor: func() HonorType { switch tipInfo.TemplId { @@ -145,7 +145,7 @@ func (c *QQClient) msgGrayTipProcessor(groupCode int64, tipInfo *notify.AIOGrayT if mem := c.FindGroup(groupCode).FindMember(event.Uin); mem != nil { mem.SpecialTitle = event.NewTitle } - c.dispatchMemberSpecialTitleUpdateEvent(event) + c.MemberSpecialTitleUpdatedEvent.dispatch(c, event) } } diff --git a/client/online_push.go b/client/online_push.go index 64723ca0..f0f397d4 100644 --- a/client/online_push.go +++ b/client/online_push.go @@ -53,7 +53,7 @@ func decodeOnlinePushReqPacket(c *QQClient, info *network.IncomingPacketInfo, pa r.ReadBytes(6) target := int64(uint32(r.ReadInt32())) t := r.ReadInt32() - c.dispatchGroupMuteEvent(&GroupMuteEvent{ + c.GroupMuteEvent.dispatch(c, &GroupMuteEvent{ GroupCode: groupCode, OperatorUin: operator, TargetUin: target, @@ -68,7 +68,7 @@ func decodeOnlinePushReqPacket(c *QQClient, info *network.IncomingPacketInfo, pa if rm.MsgType == 2 { continue } - c.dispatchGroupMessageRecalledEvent(&GroupMessageRecalledEvent{ + c.GroupMessageRecalledEvent.dispatch(c, &GroupMessageRecalledEvent{ GroupCode: groupCode, OperatorUin: b.OptMsgRecall.Uin, AuthorUin: rm.AuthorUin, @@ -82,7 +82,7 @@ func decodeOnlinePushReqPacket(c *QQClient, info *network.IncomingPacketInfo, pa } if b.OptMsgRedTips != nil { if b.OptMsgRedTips.LuckyFlag == 1 { // 运气王提示 - c.dispatchGroupNotifyEvent(&GroupRedBagLuckyKingNotifyEvent{ + c.GroupNotifyEvent.dispatch(c, &GroupRedBagLuckyKingNotifyEvent{ GroupCode: groupCode, Sender: int64(b.OptMsgRedTips.SenderUin), LuckyKing: int64(b.OptMsgRedTips.LuckyUin), @@ -91,7 +91,7 @@ func decodeOnlinePushReqPacket(c *QQClient, info *network.IncomingPacketInfo, pa } if b.QqGroupDigestMsg != nil { digest := b.QqGroupDigestMsg - c.dispatchGroupDigestEvent(&GroupDigestEvent{ + c.GroupDigestEvent.dispatch(c, &GroupDigestEvent{ GroupCode: int64(digest.GroupCode), MessageID: int32(digest.Seq), InternalMessageID: int32(digest.Random), @@ -132,7 +132,7 @@ func msgType0x210Sub8ADecoder(c *QQClient, protobuf []byte) error { } for _, m := range s8a.MsgInfo { if m.ToUin == c.Uin { - c.dispatchFriendMessageRecalledEvent(&FriendMessageRecalledEvent{ + c.FriendMessageRecalledEvent.dispatch(c, &FriendMessageRecalledEvent{ FriendUin: m.FromUin, MessageId: m.MsgSeq, Time: m.MsgTime, @@ -152,7 +152,7 @@ func msgType0x210SubB3Decoder(c *QQClient, protobuf []byte) error { Nickname: b3.MsgAddFrdNotify.Nick, } c.FriendList = append(c.FriendList, frd) - c.dispatchNewFriendEvent(&NewFriendEvent{Friend: frd}) + c.NewFriendEvent.dispatch(c, &NewFriendEvent{Friend: frd}) return nil } @@ -167,7 +167,7 @@ func msgType0x210SubD4Decoder(c *QQClient, protobuf []byte) error { groupLeaveLock.Unlock() return err } - c.dispatchLeaveGroupEvent(&GroupLeaveEvent{Group: g}) + c.GroupLeaveEvent.dispatch(c, &GroupLeaveEvent{Group: g}) } groupLeaveLock.Unlock() return nil @@ -185,7 +185,7 @@ func msgType0x210Sub27Decoder(c *QQClient, protobuf []byte) error { if g := c.FindGroup(int64(m.ModGroupProfile.GetGroupCode())); g != nil { old := g.Name g.Name = string(info.Value) - c.dispatchGroupNameUpdatedEvent(&GroupNameUpdatedEvent{ + c.GroupNameUpdatedEvent.dispatch(c, &GroupNameUpdatedEvent{ Group: g, OldName: old, NewName: g.Name, @@ -221,7 +221,7 @@ func msgType0x210Sub122Decoder(c *QQClient, protobuf []byte) error { if sender == 0 { return nil } - c.dispatchFriendNotifyEvent(&FriendPokeNotifyEvent{ + c.FriendNotifyEvent.dispatch(c, &FriendPokeNotifyEvent{ Sender: sender, Receiver: receiver, }) @@ -257,7 +257,7 @@ func msgType0x210Sub44Decoder(c *QQClient, protobuf []byte) error { group.Members = newMem for _, m := range newMem { if lastJoinTime < m.JoinTime { - go c.dispatchNewMemberEvent(&MemberJoinGroupEvent{ + c.GroupMemberJoinEvent.dispatch(c, &MemberJoinGroupEvent{ Group: group, Member: m, }) diff --git a/client/private_msg.go b/client/private_msg.go index be1d1b66..7825f51b 100644 --- a/client/private_msg.go +++ b/client/private_msg.go @@ -59,7 +59,7 @@ func (c *QQClient) SendPrivateMessage(target int64, m *message.SendingMessage) * }, Elements: m.Elements, } - go c.dispatchPrivateMessageSelf(ret) + go c.PrivateMessageEvent.dispatch(c, ret) return ret } diff --git a/client/sync.go b/client/sync.go index cdb48647..3a182114 100644 --- a/client/sync.go +++ b/client/sync.go @@ -443,7 +443,7 @@ func decodeLoginNotifyPacket(c *QQClient, _ *network.IncomingPacketInfo, payload t := ac if ac.AppId == notify.AppId { c.OnlineClients = append(c.OnlineClients, t) - c.dispatchOtherClientStatusChangedEvent(&OtherClientStatusChangedEvent{ + c.OtherClientStatusChangedEvent.dispatch(c, &OtherClientStatusChangedEvent{ Client: t, Online: true, }) @@ -462,7 +462,7 @@ func decodeLoginNotifyPacket(c *QQClient, _ *network.IncomingPacketInfo, payload if rmi != -1 { rmc := c.OnlineClients[rmi] c.OnlineClients = append(c.OnlineClients[:rmi], c.OnlineClients[rmi+1:]...) - c.dispatchOtherClientStatusChangedEvent(&OtherClientStatusChangedEvent{ + c.OtherClientStatusChangedEvent.dispatch(c, &OtherClientStatusChangedEvent{ Client: rmc, Online: false, }) diff --git a/client/system_msg.go b/client/system_msg.go index e6dbfdd6..e3a36255 100644 --- a/client/system_msg.go +++ b/client/system_msg.go @@ -86,12 +86,12 @@ func (c *QQClient) exceptAndDispatchGroupSysMsg() { } for _, msg := range msgs.JoinRequests { if !joinExists(msg.RequestId) { - c.dispatchJoinGroupRequest(msg) + c.UserWantJoinGroupEvent.dispatch(c, msg) } } for _, msg := range msgs.InvitedRequests { if !invExists(msg.RequestId) { - c.dispatchGroupInvitedEvent(msg) + c.GroupInvitedEvent.dispatch(c, msg) } } c.groupSysMsgCache = msgs diff --git a/utils/ttl.go b/utils/ttl.go index 6b43ca24..e81228af 100644 --- a/utils/ttl.go +++ b/utils/ttl.go @@ -55,19 +55,18 @@ func (cache *Cache[_]) Count() int { } // Get - return value from cache -func (cache *Cache[_]) Get(key string) (interface{}, bool) { +func (cache *Cache[T]) Get(key string) (value T, _ bool) { cache.lock.RLock() defer cache.lock.RUnlock() e, ok := cache.cache[key] - if ok && e.expiry.After(time.Now()) { return e.value, true } - return nil, false + return } -func (cache *Cache[_]) GetAndUpdate(key string, ttl time.Duration) (interface{}, bool) { +func (cache *Cache[T]) GetAndUpdate(key string, ttl time.Duration) (_ T, _ bool) { cache.lock.RLock() defer cache.lock.RUnlock() @@ -75,7 +74,7 @@ func (cache *Cache[_]) GetAndUpdate(key string, ttl time.Duration) (interface{}, e.expiry = time.Now().Add(ttl) return e.value, true } - return nil, false + return } // Add - add key/value in cache