-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapi.go
177 lines (159 loc) · 5.75 KB
/
api.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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
package onebot
import (
"encoding/json"
"fmt"
)
// SendPrivateMessage 发送私聊消息,消息ID
func (b *Bot) SendPrivateMessage(userId int64, message MessageChain) (int64, error) {
result, err := b.request("send_private_msg", &struct {
UserId int64 `json:"user_id"`
Message MessageChain `json:"message"`
}{userId, message})
if err != nil {
return 0, err
}
return result.Get("message_id").Int(), nil
}
// SendGroupMessage 发送群消息,group-群号,message-发送的内容,返回消息id
func (b *Bot) SendGroupMessage(group int64, message MessageChain) (int64, error) {
result, err := b.request("send_group_msg", &struct {
GroupId int64 `json:"group_id"`
Message MessageChain `json:"message"`
}{group, message})
if err != nil {
return 0, err
}
return result.Get("message_id").Int(), nil
}
type MessageType string
const (
MessageTypePrivate MessageType = "private" // 私聊消息
MessageTypeGroup MessageType = "group" // 群消息
)
// SendMessage 发送消息,返回消息id
func (b *Bot) SendMessage(messageType MessageType, targetId int64, message MessageChain) (int64, error) {
m := map[string]any{
"message_type": string(messageType),
"message": message,
}
switch messageType {
case MessageTypePrivate:
m["user_id"] = targetId
case MessageTypeGroup:
m["group_id"] = targetId
default:
return 0, fmt.Errorf("invalide message type: %s", messageType)
}
result, err := b.request("send_msg", m)
if err != nil {
return 0, err
}
return result.Get("message_id").Int(), nil
}
// DeleteMessage 撤回消息,messageId-需要撤回的消息的ID
func (b *Bot) DeleteMessage(messageId int64) error {
_, err := b.request("delete_msg", &struct {
MessageId int64 `json:"messageId"`
}{messageId})
return err
}
type GroupInfo struct {
GroupId int64 `json:"group_id"` // 群号
GroupName string `json:"group_name"` // 群名称
MemberCount int32 `json:"member_count"` // 成员数
MaxMemberCount int32 `json:"max_member_count"` // 最大成员数(群容量)
}
// GetGroupInfo 获取群信息,group-群号,noCache-是否不使用缓存
func (b *Bot) GetGroupInfo(group int64, noCache bool) (*GroupInfo, error) {
result, err := b.request("get_group_info", &struct {
GroupId int64 `json:"group_id"`
NoCache bool `json:"no_cache"`
}{group, noCache})
if err != nil {
return nil, err
}
var groupInfo *GroupInfo
err = json.Unmarshal([]byte(result.Raw), &groupInfo)
return groupInfo, err
}
// GetGroupList 获取群列表
func (b *Bot) GetGroupList() ([]*GroupInfo, error) {
result, err := b.request("get_group_list", nil)
if err != nil {
return nil, err
}
var groupInfo []*GroupInfo
err = json.Unmarshal([]byte(result.Raw), &groupInfo)
return groupInfo, err
}
type String string
func (s *String) UnmarshalJSON(bytes []byte) error {
if len(bytes) > 2 && bytes[0] == '"' && bytes[len(bytes)-1] == '"' {
return json.Unmarshal(bytes, (*string)(s))
}
*s = String(bytes)
return nil
}
func (s *String) String() string {
return string(*s)
}
type GroupMemberInfo struct {
GroupId int64 `json:"group_id"` // 群号
UserId int64 `json:"user_id"` // QQ 号
Nickname string `json:"nickname"` // 昵称
Card string `json:"card"` // 群名片/备注
Sex Sex `json:"sex"` // 性别
Age int32 `json:"age"` // 年龄
Area string `json:"area"` // 地区
JoinTime int32 `json:"join_time"` // 加群时间戳
LastSentTime int32 `json:"last_sent_time"` // 最后发言时间戳
Level String `json:"level"` // 成员等级(onebot11标准这里是字符串,但很多框架把它返回了一个整型数值,这里就用这个方式兼容一下)
Role Role `json:"role"` // 角色
Unfriendly bool `json:"unfriendly"` // 是否不良记录成员
Title string `json:"title"` // 专属头衔
TitleExpireTime int32 `json:"title_expire_time"` // 专属头衔过期时间戳
CardChangeable bool `json:"card_changeable"` // 是否允许修改群名片
}
func (m *GroupMemberInfo) CardOrNickname() string {
if m.Card != "" {
return m.Card
}
return m.Nickname
}
// GetGroupMemberInfo 获取群成员信息,group-群号,qq-QQ号,noCache-是否不使用缓存
func (b *Bot) GetGroupMemberInfo(group, qq int64, noCache bool) (*GroupMemberInfo, error) {
result, err := b.request("get_group_member_info", &struct {
GroupId int64 `json:"group_id"`
UserId int64 `json:"user_id"`
NoCache bool `json:"no_cache"`
}{group, qq, noCache})
if err != nil {
return nil, err
}
var groupMemberInfo *GroupMemberInfo
err = json.Unmarshal([]byte(result.Raw), &groupMemberInfo)
return groupMemberInfo, err
}
// GetGroupMemberList 获取群成员列表,group-群号
//
// 注意:获取群成员列表时,不保证能获取到每个成员的所有信息,有些信息(例如area、title等)可能无法获得。
// 想要获取所有信息,请调用 Bot.GetGroupMemberInfo 方法获取单个成员信息。
func (b *Bot) GetGroupMemberList(group int64) ([]*GroupMemberInfo, error) {
result, err := b.request("get_group_member_list", &struct {
GroupId int64 `json:"group_id"`
}{group})
if err != nil {
return nil, err
}
var groupInfo []*GroupMemberInfo
err = json.Unmarshal([]byte(result.Raw), &groupInfo)
return groupInfo, err
}
// SetGroupLeave 退出群,group-群号,isDismiss-是否解散
func (b *Bot) SetGroupLeave(group int64, isDismiss bool) error {
_, err := b.request("set_group_leave", &struct {
GroupId int64 `json:"group_id"`
IsDismiss bool `json:"is_dismiss,omitempty"`
}{group, isDismiss})
return err
}