-
Notifications
You must be signed in to change notification settings - Fork 21
/
coolq.go
219 lines (192 loc) · 5.44 KB
/
coolq.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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
// 酷Q相关
package main
import (
"fmt"
"strings"
"time"
qqbotapi "github.com/catsworld/qq-bot-api"
)
// 是否连接酷Q
var isCoolq *bool
var bot *qqbotapi.BotAPI = nil
// 酷Q相关设置数据
type coolqData struct {
CqhttpWSAddr string // CQHTTP的WebSocket地址
AdminQQ int64 // 管理者的QQ,通过这个QQ发送命令
AccessToken string // CQHTTP的access_token
Secret string // CQHTTP的secret
}
// 建立对酷Q的连接
func startCoolq() bool {
if *isCoolq {
lPrintWarn("已经建立过对酷Q的连接")
} else {
*isCoolq = true
lPrintln("尝试通过 " + config.Coolq.CqhttpWSAddr + " 连接酷Q")
initCoolq()
}
return true
}
// 设置QQ开播提醒
func addQQNotify(uid int, qq int) bool {
streamers.Lock()
if s, ok := streamers.crt[uid]; ok {
if s.Notify.NotifyOn {
s.SendQQ = int64(qq)
sets(s)
lPrintln("成功设置将" + s.Name + "的开播提醒发送到QQ" + itoa(qq))
} else {
lPrintWarn("设置QQ的开播提醒需要先订阅" + s.Name + "的开播提醒,请运行addnotify " + s.itoa())
streamers.Unlock()
return false
}
} else {
lPrintWarn("设置QQ的开播提醒需要先订阅uid为" + itoa(uid) + "的主播的开播提醒,请运行addnotify " + itoa(uid))
streamers.Unlock()
return false
}
streamers.Unlock()
saveLiveConfig()
return true
}
// 取消设置QQ开播提醒
func delQQNotify(uid int) bool {
streamers.Lock()
if s, ok := streamers.crt[uid]; ok {
s.SendQQ = 0
sets(s)
lPrintln("成功取消设置" + s.Name + "的QQ开播提醒")
} else {
lPrintWarn("没有设置过uid为" + itoa(uid) + "的主播的QQ开播提醒")
}
streamers.Unlock()
saveLiveConfig()
return true
}
// 设置QQ群开播提醒
func addQQGroup(uid int, qqGroup int) bool {
streamers.Lock()
if s, ok := streamers.crt[uid]; ok {
if s.Notify.NotifyOn {
s.SendQQGroup = int64(qqGroup)
sets(s)
lPrintln("成功设置将" + s.Name + "的开播提醒发送到QQ群" + itoa(qqGroup))
} else {
lPrintWarn("设置QQ群的开播提醒需要先订阅" + s.Name + "的开播提醒,请运行addnotify " + s.itoa())
streamers.Unlock()
return false
}
} else {
lPrintWarn("设置QQ群的开播提醒需要先订阅uid为" + itoa(uid) + "的主播的开播提醒,请运行addnotify " + itoa(uid))
streamers.Unlock()
return false
}
streamers.Unlock()
saveLiveConfig()
return true
}
// 取消设置QQ群开播提醒
func delQQGroup(uid int) bool {
streamers.Lock()
if s, ok := streamers.crt[uid]; ok {
s.SendQQGroup = 0
sets(s)
lPrintln("成功取消设置" + s.Name + "的QQ群开播提醒")
} else {
lPrintWarn("没有设置过uid为" + itoa(uid) + "的主播的QQ群开播提醒")
}
streamers.Unlock()
saveLiveConfig()
return true
}
// 初始化对酷Q的连接
func initCoolq() {
defer func() {
if err := recover(); err != nil {
lPrintErr("Recovering from panic in initCoolq(), the error is:", err)
lPrintErr("连接酷Q出现问题,请确定已启动酷Q")
bot = nil
*isCoolq = false
}
}()
if bot != nil {
lPrintWarn("已经建立过对酷Q的连接")
return
}
newBot, err := qqbotapi.NewBotAPI(config.Coolq.AccessToken, config.Coolq.CqhttpWSAddr, config.Coolq.Secret)
checkErr(err)
bot = newBot
lPrintln("成功通过 " + config.Coolq.CqhttpWSAddr + " 连接酷Q")
go getCoolqMsg()
}
// 发送消息到指定的QQ
func sendQQ(qq int64, text string) {
s := bot.NewMessage(qq, "private").Text(text).Send()
checkErr(s.Err)
}
// 发送消息到指定的QQ群
func sendQQGroup(qqGroup int64, text string) {
s := bot.NewMessage(qqGroup, "group").At("all").Text(text).Send()
checkErr(s.Err)
}
// 发送消息
func (s streamer) sendCoolq(text string) {
defer func() {
if err := recover(); err != nil {
lPrintErr("Recovering from panic in sendCoolq(), the error is:", err)
lPrintErr("发送" + s.longID() + "的消息(" + text + ")到指定的QQ(" + itoa(int(s.SendQQ)) + ")/QQ群(" + itoa(int(s.SendQQGroup)) + ")时发生错误,取消发送")
}
}()
if *isCoolq && bot != nil {
if s.SendQQ != 0 {
sendQQ(s.SendQQ, text)
}
if s.SendQQGroup != 0 {
sendQQGroup(s.SendQQGroup, text)
}
}
}
// 获取发送给酷Q机器人的消息
func getCoolqMsg() {
defer func() {
if err := recover(); err != nil {
lPrintErr("Recovering from panic in getCoolqMsg(), the error is:", err)
lPrintErr("获取发送给酷Q机器人的消息时出现错误,尝试重新获取")
time.Sleep(2 * time.Second)
go getCoolqMsg()
}
}()
u := qqbotapi.NewUpdate(0)
updates, err := bot.GetUpdatesChan(u)
checkErr(err)
for update := range updates {
if update.Message == nil {
continue
}
handleCoolqMsg(update.Message)
}
}
// 处理并回复QQ消息
func handleCoolqMsg(msg *qqbotapi.Message) {
if msg.From.ID == config.Coolq.AdminQQ {
if msg.Chat.Type == "private" {
lPrintln(fmt.Sprintf("处理来自QQ%d的命令:%s", msg.From.ID, msg.Text))
if s := handleAllCmd(msg.Text); s != "" {
bot.SendMessage(msg.Chat.ID, msg.Chat.Type, s)
} else {
bot.SendMessage(msg.Chat.ID, msg.Chat.Type, handleErrMsg)
}
} else {
if bot.IsMessageToMe(*msg) {
i := strings.Index(msg.Text, "]")
text := msg.Text[i+1:]
lPrintln(fmt.Sprintf("处理来自QQ群%d里QQ%d的命令:%s", msg.Chat.ID, msg.From.ID, text))
if s := handleAllCmd(text); s != "" {
bot.SendMessage(msg.Chat.ID, msg.Chat.Type, s)
} else {
bot.SendMessage(msg.Chat.ID, msg.Chat.Type, handleErrMsg)
}
}
}
}
}