forked from tencent-connect/botgo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
event_handler.go
129 lines (110 loc) · 4.62 KB
/
event_handler.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package websocket
import (
"github.com/proudwang/botgo/dto"
)
// DefaultHandlers 默认的 handler 结构,管理所有支持的 handler 类型
var DefaultHandlers struct {
Ready ReadyHandler
ErrorNotify ErrorNotifyHandler
Plain PlainEventHandler
Guild GuildEventHandler
GuildMember GuildMemberEventHandler
Channel ChannelEventHandler
Message MessageEventHandler
MessageReaction MessageReactionEventHandler
ATMessage ATMessageEventHandler
DirectMessage DirectMessageEventHandler
Audio AudioEventHandler
MessageAudit MessageAuditEventHandler
}
// ReadyHandler 可以处理 ws 的 ready 事件
type ReadyHandler func(event *dto.WSPayload, data *dto.WSReadyData)
// ErrorNotifyHandler 当 ws 连接发生错误的时候,会回调,方便使用方监控相关错误
// 比如 reconnect invalidSession 等错误,错误可以转换为 bot.Err
type ErrorNotifyHandler func(err error)
// PlainEventHandler 透传handler
type PlainEventHandler func(event *dto.WSPayload, message []byte) error
// GuildEventHandler 频道事件handler
type GuildEventHandler func(event *dto.WSPayload, data *dto.WSGuildData) error
// GuildMemberEventHandler 频道成员事件 handler
type GuildMemberEventHandler func(event *dto.WSPayload, data *dto.WSGuildMemberData) error
// ChannelEventHandler 子频道事件 handler
type ChannelEventHandler func(event *dto.WSPayload, data *dto.WSChannelData) error
// MessageEventHandler 消息事件 handler
type MessageEventHandler func(event *dto.WSPayload, data *dto.WSMessageData) error
// MessageReactionEventHandler 表情表态事件 handler
type MessageReactionEventHandler func(event *dto.WSPayload, data *dto.WSMessageReactionData) error
// ATMessageEventHandler at 机器人消息事件 handler
type ATMessageEventHandler func(event *dto.WSPayload, data *dto.WSATMessageData) error
// DirectMessageEventHandler 私信消息事件 handler
type DirectMessageEventHandler func(event *dto.WSPayload, data *dto.WSDirectMessageData) error
// AudioEventHandler 音频机器人事件 handler
type AudioEventHandler func(event *dto.WSPayload, data *dto.WSAudioData) error
// MessageAuditEventHandler 消息审核事件 handler
type MessageAuditEventHandler func(event *dto.WSPayload, data *dto.WSMessageAuditData) error
// RegisterHandlers 注册事件回调,并返回 intent 用于 websocket 的鉴权
func RegisterHandlers(handlers ...interface{}) dto.Intent {
var i dto.Intent
for _, h := range handlers {
switch handle := h.(type) {
case ReadyHandler:
DefaultHandlers.Ready = handle
case ErrorNotifyHandler:
DefaultHandlers.ErrorNotify = handle
case PlainEventHandler:
DefaultHandlers.Plain = handle
case AudioEventHandler:
DefaultHandlers.Audio = handle
i = i | dto.EventToIntent(
dto.EventAudioStart, dto.EventAudioFinish,
dto.EventAudioOnMic, dto.EventAudioOffMic,
)
default:
}
}
i = i | registerRelationHandlers(i, handlers...)
i = i | registerMessageHandlers(i, handlers...)
return i
}
// registerRelationHandlers 注册频道关系链相关handlers
func registerRelationHandlers(i dto.Intent, handlers ...interface{}) dto.Intent {
for _, h := range handlers {
switch handle := h.(type) {
case GuildEventHandler:
DefaultHandlers.Guild = handle
i = i | dto.EventToIntent(dto.EventGuildCreate, dto.EventGuildDelete, dto.EventGuildUpdate)
case GuildMemberEventHandler:
DefaultHandlers.GuildMember = handle
i = i | dto.EventToIntent(dto.EventGuildMemberAdd, dto.EventGuildMemberRemove, dto.EventGuildMemberUpdate)
case ChannelEventHandler:
DefaultHandlers.Channel = handle
i = i | dto.EventToIntent(dto.EventChannelCreate, dto.EventChannelDelete, dto.EventChannelUpdate)
default:
}
}
return i
}
// registerMessageHandlers 注册消息相关的 handler
func registerMessageHandlers(i dto.Intent, handlers ...interface{}) dto.Intent {
for _, h := range handlers {
switch handle := h.(type) {
case MessageEventHandler:
DefaultHandlers.Message = handle
i = i | dto.EventToIntent(dto.EventMessageCreate)
case ATMessageEventHandler:
DefaultHandlers.ATMessage = handle
i = i | dto.EventToIntent(dto.EventAtMessageCreate)
case DirectMessageEventHandler:
DefaultHandlers.DirectMessage = handle
i = i | dto.EventToIntent(dto.EventDirectMessageCreate)
case MessageReactionEventHandler:
DefaultHandlers.MessageReaction = handle
i = i | dto.EventToIntent(dto.EventMessageReactionAdd, dto.EventMessageReactionRemove)
case MessageAuditEventHandler:
DefaultHandlers.MessageAudit = handle
i = i | dto.EventToIntent(dto.EventMessageAuditPass, dto.EventMessageAuditReject)
default:
}
}
return i
}