diff --git a/client/events.go b/client/events.go index f71c34a7..6a7f5f5d 100644 --- a/client/events.go +++ b/client/events.go @@ -2,6 +2,7 @@ package client import ( "fmt" + "reflect" "runtime/debug" "sync" @@ -38,6 +39,21 @@ func (handle *EventHandle[T]) dispatch(client *QQClient, event T) { for _, handler := range handle.handlers { handler(client, event) } + if len(client.eventHandlers.subscribedEventHandlers) > 0 { + for _, h := range client.eventHandlers.subscribedEventHandlers { + ht := reflect.TypeOf(h) + for i := 0; i < ht.NumMethod(); i++ { + method := ht.Method(i) + if method.Type.NumIn() != 3 { + continue + } + if method.Type.In(1) != reflect.TypeOf(client) || method.Type.In(2) != reflect.TypeOf(event) { + continue + } + method.Func.Call([]reflect.Value{reflect.ValueOf(h), reflect.ValueOf(client), reflect.ValueOf(event)}) + } + } + } } type eventHandlers struct { @@ -51,9 +67,14 @@ type eventHandlers struct { memberJoinedGuildHandlers []func(*QQClient, *MemberJoinGuildEvent) serverUpdatedHandlers []func(*QQClient, *ServerUpdatedEvent) bool + subscribedEventHandlers []any groupMessageReceiptHandlers sync.Map } +func (c *QQClient) SubscribeEventHandler(handler any) { + c.eventHandlers.subscribedEventHandlers = append(c.eventHandlers.subscribedEventHandlers, handler) +} + func (s *GuildService) OnGuildChannelMessage(f func(*QQClient, *message.GuildChannelMessage)) { s.c.eventHandlers.guildChannelMessageHandlers = append(s.c.eventHandlers.guildChannelMessageHandlers, f) }