-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathproto_event.go
135 lines (117 loc) · 3.63 KB
/
proto_event.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
130
131
132
133
134
135
// OneBot Connect - 数据协议 - 事件
// https://12.onebot.dev/connect/data-protocol/event/
package libonebot
import (
"errors"
"time"
"github.com/google/uuid"
)
// EventTypeXxx 表示 OneBot 标准定义的事件类型.
const (
EventTypeMessage = "message" // 消息事件
EventTypeNotice = "notice" // 通知事件
EventTypeRequest = "request" // 请求事件
EventTypeMeta = "meta" // 元事件
)
// Event 包含所有类型事件的共同字段.
type Event struct {
// lock sync.RWMutex
ID string `json:"id"` // 事件 ID, 构造时自动生成
Time float64 `json:"time"` // 事件发生时间 (Unix 时间戳), 单位: 秒
Type string `json:"type"` // 事件类型
DetailType string `json:"detail_type"` // 事件详细类型
SubType string `json:"sub_type"` // 事件子类型 (详细类型的下一级类型), 可为空
Self *Self `json:"self,omitempty"` // 机器人自身标识, 仅用于非元事件, 无需在构造时传入
}
func makeEvent(time time.Time, type_ string, detailType string) Event {
return Event{
ID: uuid.New().String(),
Time: float64(time.UnixMicro()) / 1e6,
Type: type_,
DetailType: detailType,
}
}
// AnyEvent 是所有事件对象共同实现的接口.
type AnyEvent interface {
Name() string
tryFixUp(self *Self) error
}
// Name 返回事件名称.
func (e *Event) Name() string {
// e.lock.RLock()
// defer e.lock.RUnlock()
return e.Type + "." + e.DetailType
}
func (e *Event) tryFixUp(self *Self) error {
// e.lock.Lock()
// defer e.lock.Unlock()
if e.Time == 0 {
return errors.New("`time` 字段值无效")
}
if e.Type != EventTypeMessage && e.Type != EventTypeNotice && e.Type != EventTypeRequest && e.Type != EventTypeMeta {
return errors.New("`type` 字段值无效")
}
if e.DetailType == "" {
return errors.New("`detail_type` 字段值无效")
}
if e.Type == EventTypeMeta {
if e.Self != nil {
return errors.New("元事件中不应包含 `self` 字段")
}
} else {
if self != nil {
// prefer `self` passed in as argument
e.Self = self
} else if e.Self == nil {
return errors.New("非元事件中必须包含 `self` 字段")
}
}
return nil
}
// 四种事件基本类型
// MetaEvent 表示一个元事件.
type MetaEvent struct {
Event
}
// MakeMetaEvent 构造一个元事件.
func MakeMetaEvent(time time.Time, detailType string) MetaEvent {
return MetaEvent{
Event: makeEvent(time, EventTypeMeta, detailType),
}
}
// MessageEvent 表示一个消息事件.
type MessageEvent struct {
Event
MessageID string `json:"message_id"` // 消息 ID
Message Message `json:"message"` // 消息内容
AltMessage string `json:"alt_message"` // 消息内容的替代表示, 可为空
}
// MakeMessageEvent 构造一个消息事件.
func MakeMessageEvent(time time.Time, detailType string, messageID string, message Message, alt_message string) MessageEvent {
return MessageEvent{
Event: makeEvent(time, EventTypeMessage, detailType),
MessageID: messageID,
Message: message,
AltMessage: alt_message,
}
}
// NoticeEvent 表示一个通知事件.
type NoticeEvent struct {
Event
}
// MakeNoticeEvent 构造一个通知事件.
func MakeNoticeEvent(time time.Time, detailType string) NoticeEvent {
return NoticeEvent{
Event: makeEvent(time, EventTypeNotice, detailType),
}
}
// RequestEvent 表示一个请求事件.
type RequestEvent struct {
Event
}
// MakeRequestEvent 构造一个请求事件.
func MakeRequestEvent(time time.Time, detailType string) RequestEvent {
return RequestEvent{
Event: makeEvent(time, EventTypeRequest, detailType),
}
}