Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
G
go-cqhttp
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nanahira
go-cqhttp
Commits
6f522a11
Commit
6f522a11
authored
Sep 09, 2020
by
nanahira
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of github.com:Mrs4s/go-cqhttp
parents
21b9e2f3
86da6577
Pipeline
#704
passed with stages
in 4 minutes and 45 seconds
Changes
11
Pipelines
1
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
594 additions
and
237 deletions
+594
-237
coolq/api.go
coolq/api.go
+50
-11
coolq/bot.go
coolq/bot.go
+4
-1
coolq/cqcode.go
coolq/cqcode.go
+252
-137
docs/EventFilter.md
docs/EventFilter.md
+132
-0
docs/config.md
docs/config.md
+5
-5
docs/cqhttp.md
docs/cqhttp.md
+61
-2
global/net.go
global/net.go
+1
-19
go.mod
go.mod
+7
-3
go.sum
go.sum
+28
-16
server/http.go
server/http.go
+21
-6
server/websocket.go
server/websocket.go
+33
-37
No files found.
coolq/api.go
View file @
6f522a11
...
@@ -68,11 +68,19 @@ func (bot *CQBot) CQGetGroupInfo(groupId int64) MSG {
...
@@ -68,11 +68,19 @@ func (bot *CQBot) CQGetGroupInfo(groupId int64) MSG {
}
}
// https://cqhttp.cc/docs/4.15/#/API?id=get_group_member_list-%E8%8E%B7%E5%8F%96%E7%BE%A4%E6%88%90%E5%91%98%E5%88%97%E8%A1%A8
// https://cqhttp.cc/docs/4.15/#/API?id=get_group_member_list-%E8%8E%B7%E5%8F%96%E7%BE%A4%E6%88%90%E5%91%98%E5%88%97%E8%A1%A8
func
(
bot
*
CQBot
)
CQGetGroupMemberList
(
groupId
int64
)
MSG
{
func
(
bot
*
CQBot
)
CQGetGroupMemberList
(
groupId
int64
,
noCache
bool
)
MSG
{
group
:=
bot
.
Client
.
FindGroup
(
groupId
)
group
:=
bot
.
Client
.
FindGroup
(
groupId
)
if
group
==
nil
{
if
group
==
nil
{
return
Failed
(
100
)
return
Failed
(
100
)
}
}
if
noCache
{
t
,
err
:=
bot
.
Client
.
GetGroupMembers
(
group
)
if
err
!=
nil
{
log
.
Warnf
(
"刷新群 %v 成员列表失败: %v"
,
groupId
,
err
)
return
Failed
(
100
)
}
group
.
Members
=
t
}
members
:=
make
([]
MSG
,
0
)
members
:=
make
([]
MSG
,
0
)
for
_
,
m
:=
range
group
.
Members
{
for
_
,
m
:=
range
group
.
Members
{
members
=
append
(
members
,
convertGroupMemberInfo
(
groupId
,
m
))
members
=
append
(
members
,
convertGroupMemberInfo
(
groupId
,
m
))
...
@@ -81,19 +89,11 @@ func (bot *CQBot) CQGetGroupMemberList(groupId int64) MSG {
...
@@ -81,19 +89,11 @@ func (bot *CQBot) CQGetGroupMemberList(groupId int64) MSG {
}
}
// https://cqhttp.cc/docs/4.15/#/API?id=get_group_member_info-%E8%8E%B7%E5%8F%96%E7%BE%A4%E6%88%90%E5%91%98%E4%BF%A1%E6%81%AF
// https://cqhttp.cc/docs/4.15/#/API?id=get_group_member_info-%E8%8E%B7%E5%8F%96%E7%BE%A4%E6%88%90%E5%91%98%E4%BF%A1%E6%81%AF
func
(
bot
*
CQBot
)
CQGetGroupMemberInfo
(
groupId
,
userId
int64
,
noCache
bool
)
MSG
{
func
(
bot
*
CQBot
)
CQGetGroupMemberInfo
(
groupId
,
userId
int64
)
MSG
{
group
:=
bot
.
Client
.
FindGroup
(
groupId
)
group
:=
bot
.
Client
.
FindGroup
(
groupId
)
if
group
==
nil
{
if
group
==
nil
{
return
Failed
(
100
)
return
Failed
(
100
)
}
}
if
noCache
{
t
,
err
:=
bot
.
Client
.
GetGroupMembers
(
group
)
if
err
!=
nil
{
log
.
Warnf
(
"刷新群 %v 成员列表失败: %v"
,
groupId
,
err
)
return
Failed
(
100
)
}
group
.
Members
=
t
}
member
:=
group
.
FindMember
(
userId
)
member
:=
group
.
FindMember
(
userId
)
if
member
==
nil
{
if
member
==
nil
{
return
Failed
(
102
)
return
Failed
(
102
)
...
@@ -198,11 +198,24 @@ func (bot *CQBot) CQSendGroupForwardMessage(groupId int64, m gjson.Result) MSG {
...
@@ -198,11 +198,24 @@ func (bot *CQBot) CQSendGroupForwardMessage(groupId int64, m gjson.Result) MSG {
name
:=
e
.
Get
(
"data.name"
)
.
Str
name
:=
e
.
Get
(
"data.name"
)
.
Str
content
:=
bot
.
ConvertObjectMessage
(
e
.
Get
(
"data.content"
),
true
)
content
:=
bot
.
ConvertObjectMessage
(
e
.
Get
(
"data.content"
),
true
)
if
uin
!=
0
&&
name
!=
""
&&
len
(
content
)
>
0
{
if
uin
!=
0
&&
name
!=
""
&&
len
(
content
)
>
0
{
var
newElem
[]
message
.
IMessageElement
for
_
,
elem
:=
range
content
{
if
img
,
ok
:=
elem
.
(
*
message
.
ImageElement
);
ok
{
gm
,
err
:=
bot
.
Client
.
UploadGroupImage
(
groupId
,
img
.
Data
)
if
err
!=
nil
{
log
.
Warnf
(
"警告:群 %v 图片上传失败: %v"
,
groupId
,
err
)
continue
}
newElem
=
append
(
newElem
,
gm
)
continue
}
newElem
=
append
(
newElem
,
elem
)
}
nodes
=
append
(
nodes
,
&
message
.
ForwardNode
{
nodes
=
append
(
nodes
,
&
message
.
ForwardNode
{
SenderId
:
uin
,
SenderId
:
uin
,
SenderName
:
name
,
SenderName
:
name
,
Time
:
int32
(
ts
.
Unix
()),
Time
:
int32
(
ts
.
Unix
()),
Message
:
content
,
Message
:
newElem
,
})
})
return
return
}
}
...
@@ -291,6 +304,14 @@ func (bot *CQBot) CQSetGroupName(groupId int64, name string) MSG {
...
@@ -291,6 +304,14 @@ func (bot *CQBot) CQSetGroupName(groupId int64, name string) MSG {
return
Failed
(
100
)
return
Failed
(
100
)
}
}
func
(
bot
*
CQBot
)
CQSetGroupMemo
(
groupId
int64
,
msg
string
)
MSG
{
if
g
:=
bot
.
Client
.
FindGroup
(
groupId
);
g
!=
nil
{
g
.
UpdateMemo
(
msg
)
return
OK
(
nil
)
}
return
Failed
(
100
)
}
// https://cqhttp.cc/docs/4.15/#/API?id=set_group_kick-%E7%BE%A4%E7%BB%84%E8%B8%A2%E4%BA%BA
// https://cqhttp.cc/docs/4.15/#/API?id=set_group_kick-%E7%BE%A4%E7%BB%84%E8%B8%A2%E4%BA%BA
func
(
bot
*
CQBot
)
CQSetGroupKick
(
groupId
,
userId
int64
,
msg
string
)
MSG
{
func
(
bot
*
CQBot
)
CQSetGroupKick
(
groupId
,
userId
int64
,
msg
string
)
MSG
{
if
g
:=
bot
.
Client
.
FindGroup
(
groupId
);
g
!=
nil
{
if
g
:=
bot
.
Client
.
FindGroup
(
groupId
);
g
!=
nil
{
...
@@ -383,6 +404,24 @@ func (bot *CQBot) CQDeleteMessage(messageId int32) MSG {
...
@@ -383,6 +404,24 @@ func (bot *CQBot) CQDeleteMessage(messageId int32) MSG {
return
OK
(
nil
)
return
OK
(
nil
)
}
}
func
(
bot
*
CQBot
)
CQGetVipInfo
(
userId
int64
)
MSG
{
msg
:=
MSG
{}
vip
,
err
:=
bot
.
Client
.
GetVipInfo
(
userId
)
if
err
!=
nil
{
return
Failed
(
100
)
}
msg
=
MSG
{
"user_id"
:
vip
.
Uin
,
"nickname"
:
vip
.
Name
,
"level"
:
vip
.
Level
,
"level_speed"
:
vip
.
LevelSpeed
,
"vip_level"
:
vip
.
VipLevel
,
"vip_growth_speed"
:
vip
.
VipGrowthSpeed
,
"vip_growth_total"
:
vip
.
VipGrowthTotal
,
}
return
OK
(
msg
)
}
// https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md#get_group_honor_info-%E8%8E%B7%E5%8F%96%E7%BE%A4%E8%8D%A3%E8%AA%89%E4%BF%A1%E6%81%AF
// https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md#get_group_honor_info-%E8%8E%B7%E5%8F%96%E7%BE%A4%E8%8D%A3%E8%AA%89%E4%BF%A1%E6%81%AF
func
(
bot
*
CQBot
)
CQGetGroupHonorInfo
(
groupId
int64
,
t
string
)
MSG
{
func
(
bot
*
CQBot
)
CQGetGroupHonorInfo
(
groupId
int64
,
t
string
)
MSG
{
msg
:=
MSG
{
"group_id"
:
groupId
}
msg
:=
MSG
{
"group_id"
:
groupId
}
...
...
coolq/bot.go
View file @
6f522a11
...
@@ -71,10 +71,13 @@ func NewQQBot(cli *client.QQClient, conf *global.JsonConfig) *CQBot {
...
@@ -71,10 +71,13 @@ func NewQQBot(cli *client.QQClient, conf *global.JsonConfig) *CQBot {
bot
.
Client
.
OnUserWantJoinGroup
(
bot
.
groupJoinReqEvent
)
bot
.
Client
.
OnUserWantJoinGroup
(
bot
.
groupJoinReqEvent
)
go
func
()
{
go
func
()
{
i
:=
conf
.
HeartbeatInterval
i
:=
conf
.
HeartbeatInterval
if
i
<
1
{
if
i
<
0
{
log
.
Warn
(
"警告: 心跳功能已关闭,若非预期,请检查配置文件。"
)
log
.
Warn
(
"警告: 心跳功能已关闭,若非预期,请检查配置文件。"
)
return
return
}
}
if
i
==
0
{
i
=
5
}
for
{
for
{
time
.
Sleep
(
time
.
Second
*
i
)
time
.
Sleep
(
time
.
Second
*
i
)
bot
.
dispatchEventMessage
(
MSG
{
bot
.
dispatchEventMessage
(
MSG
{
...
...
coolq/cqcode.go
View file @
6f522a11
This diff is collapsed.
Click to expand it.
docs/EventFilter.md
0 → 100644
View file @
6f522a11
# 事件过滤器
在go-cqhttp同级目录下新建
`filter.json`
文件即可开启事件过滤器,启动时会读取该文件中定义的过滤规则(使用 JSON 编写),若文件不存在,或过滤规则语法错误,则会暂停所有上报。
事件过滤器会处理所有事件(包括心跳事件在内的元事件),请谨慎使用!!
## 示例
这节首先给出一些示例,演示过滤器的基本用法,下一节将给出具体语法说明。
### 只上报以「!!」开头的消息
```
json
{
"raw_message"
:
{
".regex"
:
"^!!"
}
}
```
### 只上报群组的非匿名消息
```
json
{
"message_type"
:
"group"
,
"anonymous"
:
{
".eq"
:
null
}
}
```
### 只上报私聊或特定群组的非匿名消息
```
json
{
".or"
:
[
{
"message_type"
:
"private"
},
{
"message_type"
:
"group"
,
"group_id"
:
{
".in"
:
[
123456
]
},
"anonymous"
:
{
".eq"
:
null
}
}
]
}
```
### 只上报群组 11111、22222、33333 中不是用户 12345 发送的消息,以及用户 66666 发送的所有消息
```
json
{
".or"
:
[
{
"group_id"
:
{
".in"
:
[
11111
,
22222
,
33333
]
},
"user_id"
:
{
".neq"
:
12345
}
},
{
"user_id"
:
66666
}
]
}
```
### 一个更复杂的例子
```
json
{
".or"
:
[
{
"message_type"
:
"private"
,
"user_id"
:
{
".not"
:
{
".in"
:
[
11111
,
22222
,
33333
]
},
".neq"
:
44444
}
},
{
"message_type"
:
{
".regex"
:
"group|discuss"
},
".or"
:
[
{
"group_id"
:
12345
},
{
"raw_message"
:
{
".contains"
:
"通知"
}
}
]
}
]
}
```
## 语法说明
过滤规则最外层是一个 JSON 对象,其中的键,如果以
`.`
(点号)开头,则表示运算符,其值为运算符的参数,如果不以
`.`
开头,则表示对事件数据对象中相应键的过滤。过滤规则中任何一个对象,只有在它的所有项都匹配的情况下,才会让事件通过(等价于一个
`and`
运算);其中,不以
`.`
开头的键,若其值不是对象,则只有在这个值和事件数据相应值相等的情况下,才会通过(等价于一个
`eq`
运算符)。
下面列出所有运算符(「要求的参数类型」是指运算符的键所对应的值的类型,「可作用于的类型」是指在过滤时事件对象相应值的类型):
| 运算符 | 要求的参数类型 | 可作用于的类型 |
| ----- | ------------ | ----------- |
|
`.not`
| object | 任何 |
|
`.and`
| object | 若参数中全为运算符,则任何;若不全为运算符,则 object |
|
`.or`
| array(数组元素为 object) | 任何 |
|
`.eq`
| 任何 | 任何 |
|
`.neq`
| 任何 | 任何 |
|
`.in`
| string/array | 若参数为 string,则 string;若参数为 array,则任何 |
|
`.contains`
| string | string |
|
`.regex`
| string | string |
## 过滤时的事件数据对象
过滤器在go-cqhttp构建好事件数据后运行,各事件的数据字段见
[
OneBot标准
](
https://github.com/howmanybots/onebot/blob/master/v11/specs/event/README.md
)
。
这里有几点需要注意:
-
`message`
字段在运行过滤器时是消息段数组的形式(见
[
消息格式
](
https://github.com/howmanybots/onebot/blob/master/v11/specs/message/array.md
)
)
-
`raw_message`
字段为未经
**CQ码**
处理的原始消息字符串,这意味着其中可能会出现形如
`[CQ:face,id=123]`
的 CQ 码
docs/config.md
View file @
6f522a11
...
@@ -22,11 +22,11 @@ go-cqhttp 支持导入CQHTTP的配置文件, 具体步骤为:
...
@@ -22,11 +22,11 @@ go-cqhttp 支持导入CQHTTP的配置文件, 具体步骤为:
"password_encrypted"
:
""
,
"password_encrypted"
:
""
,
"enable_db"
:
true
,
"enable_db"
:
true
,
"access_token"
:
""
,
"access_token"
:
""
,
"relogin"
:
{
"relogin"
:
{
"enabled"
:
true
,
"enabled"
:
true
,
"relogin_delay"
:
3
,
"relogin_delay"
:
3
,
"max_relogin_times"
:
0
"max_relogin_times"
:
0
},
},
"post_message_format"
:
"string"
,
"post_message_format"
:
"string"
,
"ignore_invalid_cqcode"
:
false
,
"ignore_invalid_cqcode"
:
false
,
"force_fragmented"
:
true
,
"force_fragmented"
:
true
,
...
...
docs/cqhttp.md
View file @
6f522a11
...
@@ -123,7 +123,7 @@ Type: `node`
...
@@ -123,7 +123,7 @@ Type: `node`
Type:
`xml`
Type:
`xml`
范围:
**发送**
范围:
**发送
/接收
**
参数:
参数:
...
@@ -135,8 +135,11 @@ Type: `xml`
...
@@ -135,8 +135,11 @@ Type: `xml`
示例:
`[CQ:xml,data=xxxx]`
示例:
`[CQ:xml,data=xxxx]`
####一些xml样例
####一些xml样例
####ps:重要:xml中的value部分,记得html实体化处理后,再打加入到cq码中
####ps:重要:xml中的value部分,记得html实体化处理后,再打加入到cq码中
#### qq音乐
#### qq音乐
```
xml
```
xml
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<msg
serviceID=
"2"
templateID=
"1"
action=
"web"
brief=
"[分享] 十年"
sourceMsgId=
"0"
url=
"https://i.y.qq.com/v8/playsong.html?_wv=1&songid=4830342&souce=qqshare&source=qqshare&ADTAG=qqshare"
flag=
"0"
adverSign=
"0"
multiMsgFlag=
"0"
><item
layout=
"2"
><audio
cover=
"http://imgcache.qq.com/music/photo/album_500/26/500_albumpic_89526_0.jpg"
src=
"http://ws.stream.qqmusic.qq.com/C400003mAan70zUy5O.m4a?guid=1535153710&vkey=D5315B8C0603653592AD4879A8A3742177F59D582A7A86546E24DD7F282C3ACF81526C76E293E57EA1E42CF19881C561275D919233333ADE&uin=&fromtag=3"
/><title>
十年
</title><summary>
陈奕迅
</summary></item><source
name=
"QQ音乐"
icon=
"https://i.gtimg.cn/open/app_icon/01/07/98/56/1101079856_100_m.png"
url=
"http://web.p.qq.com/qqmpmobile/aio/app.html?id=1101079856"
action=
"app"
a_actionData=
"com.tencent.qqmusic"
i_actionData=
"tencent1101079856://"
appid=
"1101079856"
/></msg>
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<msg
serviceID=
"2"
templateID=
"1"
action=
"web"
brief=
"[分享] 十年"
sourceMsgId=
"0"
url=
"https://i.y.qq.com/v8/playsong.html?_wv=1&songid=4830342&souce=qqshare&source=qqshare&ADTAG=qqshare"
flag=
"0"
adverSign=
"0"
multiMsgFlag=
"0"
><item
layout=
"2"
><audio
cover=
"http://imgcache.qq.com/music/photo/album_500/26/500_albumpic_89526_0.jpg"
src=
"http://ws.stream.qqmusic.qq.com/C400003mAan70zUy5O.m4a?guid=1535153710&vkey=D5315B8C0603653592AD4879A8A3742177F59D582A7A86546E24DD7F282C3ACF81526C76E293E57EA1E42CF19881C561275D919233333ADE&uin=&fromtag=3"
/><title>
十年
</title><summary>
陈奕迅
</summary></item><source
name=
"QQ音乐"
icon=
"https://i.gtimg.cn/open/app_icon/01/07/98/56/1101079856_100_m.png"
url=
"http://web.p.qq.com/qqmpmobile/aio/app.html?id=1101079856"
action=
"app"
a_actionData=
"com.tencent.qqmusic"
i_actionData=
"tencent1101079856://"
appid=
"1101079856"
/></msg>
```
```
...
@@ -165,6 +168,62 @@ Type: `xml`
...
@@ -165,6 +168,62 @@ Type: `xml`
</msg>
</msg>
```
```
### json消息支持
Type:
`json`
范围:
**发送/接收**
参数:
| 参数名 | 类型 | 说明 |
| ------ | ------ | ------------------------------------------------------------ |
| data | string | json内容,json的所有字符串记得实体化处理|
| resid | int32 | 默认不填为0,走小程序通道,填了走富文本通道发送|
json中的字符串需要进行转义:
>","=>`,`、
>"&"=> `&`、
>"["=>`[`、
>"]"=>`]`、
否则无法正确得到解析
示例json 的cq码:
```
test
[CQ:json,data={"app":"com.tencent.miniapp","desc":"","view":"notification","ver":"0.0.0.1","prompt":"[应用]","appID":"","sourceName":"","actionData":"","actionData_A":"","sourceUrl":"","meta":{"notification":{"appInfo":{"appName":"全国疫情数据统计","appType":4,"appid":1109659848,"iconUrl":"http:\/\/gchat.qpic.cn\/gchatpic_new\/719328335\/-2010394141-6383A777BEB79B70B31CE250142D740F\/0"},"data":[{"title":"确诊","value":"80932"},{"title":"今日确诊","value":"28"},{"title":"疑似","value":"72"},{"title":"今日疑似","value":"5"},{"title":"治愈","value":"60197"},{"title":"今日治愈","value":"1513"},{"title":"死亡","value":"3140"},{"title":"今**亡","value":"17"}],"title":"中国加油,武汉加油","button":[{"name":"病毒:SARS-CoV-2,其导致疾病命名 COVID-19","action":""},{"name":"传染源:新冠肺炎的患者。无症状感染者也可能成为传染源。","action":""}],"emphasis_keyword":""}},"text":"","sourceAd":""}]
```
### cardimage 一种xml的图片消息(装逼大图)
ps: xml 接口的消息都存在风控风险,请自行兼容发送失败后的处理(可以失败后走普通图片模式)
Type:
`cardimage`
范围:
**发送**
参数:
| 参数名 | 类型 | 说明 |
| ------ | ------ | ------------------------------------------------------------ |
| file | string | 和image的file字段对齐,支持也是一样的|
| minwidth | int64 | 默认不填为400,最小width|
| minheight | int64 | 默认不填为400,最小height|
| maxwidth | int64 | 默认不填为500,最大width|
| maxheight | int64 | 默认不填为1000,最大height|
| source | string | 分享来源的名称,可以留空|
| icon | string | 分享来源的icon图标url,可以留空|
示例cardimage 的cq码:
```
test
[CQ:cardimage,file=https://i.pixiv.cat/img-master/img/2020/03/25/00/00/08/80334602_p0_master1200.jpg]
```
## API
## API
...
@@ -177,7 +236,7 @@ Type: `xml`
...
@@ -177,7 +236,7 @@ Type: `xml`
| 字段 | 类型 | 说明 |
| 字段 | 类型 | 说明 |
| -------- | ------ | ---- |
| -------- | ------ | ---- |
| group_id | int64 | 群号 |
| group_id | int64 | 群号 |
| name | string | 新名 |
|
group_
name | string | 新名 |
### 获取图片信息
### 获取图片信息
...
...
global/net.go
View file @
6f522a11
...
@@ -4,13 +4,10 @@ import (
...
@@ -4,13 +4,10 @@ import (
"bytes"
"bytes"
"compress/gzip"
"compress/gzip"
"fmt"
"fmt"
"github.com/tidwall/gjson"
"io/ioutil"
"io/ioutil"
"net/http"
"net/http"
"strconv"
"strings"
"strings"
"github.com/Mrs4s/MiraiGo/message"
"github.com/tidwall/gjson"
)
)
func
GetBytes
(
url
string
)
([]
byte
,
error
)
{
func
GetBytes
(
url
string
)
([]
byte
,
error
)
{
...
@@ -54,18 +51,3 @@ func NeteaseMusicSongInfo(id string) (gjson.Result, error) {
...
@@ -54,18 +51,3 @@ func NeteaseMusicSongInfo(id string) (gjson.Result, error) {
return
gjson
.
ParseBytes
(
d
)
.
Get
(
"songs.0"
),
nil
return
gjson
.
ParseBytes
(
d
)
.
Get
(
"songs.0"
),
nil
}
}
func
NewXmlMsg
(
template
string
,
ResId
int64
)
*
message
.
ServiceElement
{
var
serviceid
string
if
ResId
==
0
{
serviceid
=
"2"
//默认值2
}
else
{
serviceid
=
strconv
.
FormatInt
(
ResId
,
10
)
}
//println(serviceid)
return
&
message
.
ServiceElement
{
Id
:
int32
(
ResId
),
Content
:
template
,
ResId
:
serviceid
,
SubType
:
"xml"
,
}
}
go.mod
View file @
6f522a11
...
@@ -3,15 +3,19 @@ module github.com/Mrs4s/go-cqhttp
...
@@ -3,15 +3,19 @@ module github.com/Mrs4s/go-cqhttp
go 1.14
go 1.14
require (
require (
github.com/Mrs4s/MiraiGo v0.0.0-20200
827182935-51e155ef20da
github.com/Mrs4s/MiraiGo v0.0.0-20200
906025848-23750bb59124
github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 // indirect
github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 // indirect
github.com/gin-gonic/gin v1.6.3
github.com/gin-gonic/gin v1.6.3
github.com/go-playground/validator/v10 v10.3.0 // indirect
github.com/gorilla/websocket v1.4.2
github.com/gorilla/websocket v1.4.2
github.com/guonaihong/gout v0.1.2
github.com/guonaihong/gout v0.1.2
github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 // indirect
github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 // indirect
github.com/jonboulle/clockwork v0.2.0 // indirect
github.com/jonboulle/clockwork v0.2.0 // indirect
github.com/json-iterator/go v1.1.10 // indirect
github.com/lestrrat-go/file-rotatelogs v2.3.0+incompatible
github.com/lestrrat-go/file-rotatelogs v2.3.0+incompatible
github.com/lestrrat-go/strftime v1.0.3 // indirect
github.com/lestrrat-go/strftime v1.0.3 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5
github.com/sirupsen/logrus v1.6.0
github.com/sirupsen/logrus v1.6.0
...
@@ -20,7 +24,7 @@ require (
...
@@ -20,7 +24,7 @@ require (
github.com/tidwall/gjson v1.6.1
github.com/tidwall/gjson v1.6.1
github.com/xujiajun/nutsdb v0.5.0
github.com/xujiajun/nutsdb v0.5.0
github.com/yinghau76/go-ascii-art v0.0.0-20190517192627-e7f465a30189
github.com/yinghau76/go-ascii-art v0.0.0-20190517192627-e7f465a30189
golang.org/x/net v0.0.0-20200
822124328-c89045814202
// indirect
golang.org/x/net v0.0.0-20200
904194848-62affa334b73
// indirect
golang.org/x/sys v0.0.0-20200
828194041-157a740278f4
// indirect
golang.org/x/sys v0.0.0-20200
905004654-be1d3432aa8f
// indirect
gopkg.in/yaml.v2 v2.3.0 // indirect
gopkg.in/yaml.v2 v2.3.0 // indirect
)
)
go.sum
View file @
6f522a11
This diff is collapsed.
Click to expand it.
server/http.go
View file @
6f522a11
...
@@ -131,6 +131,9 @@ func (s *httpServer) Run(addr, authToken string, bot *coolq.CQBot) {
...
@@ -131,6 +131,9 @@ func (s *httpServer) Run(addr, authToken string, bot *coolq.CQBot) {
s
.
engine
.
Any
(
"/set_group_name"
,
s
.
SetGroupName
)
s
.
engine
.
Any
(
"/set_group_name"
,
s
.
SetGroupName
)
s
.
engine
.
Any
(
"/set_group_name_async"
,
s
.
SetGroupName
)
s
.
engine
.
Any
(
"/set_group_name_async"
,
s
.
SetGroupName
)
s
.
engine
.
Any
(
"/_send_group_notice"
,
s
.
SendGroupNotice
)
s
.
engine
.
Any
(
"/_send_group_notice_async"
,
s
.
SendGroupNotice
)
s
.
engine
.
Any
(
"/set_group_leave"
,
s
.
SetGroupLeave
)
s
.
engine
.
Any
(
"/set_group_leave"
,
s
.
SetGroupLeave
)
s
.
engine
.
Any
(
"/set_group_leave_async"
,
s
.
SetGroupLeave
)
s
.
engine
.
Any
(
"/set_group_leave_async"
,
s
.
SetGroupLeave
)
...
@@ -154,6 +157,9 @@ func (s *httpServer) Run(addr, authToken string, bot *coolq.CQBot) {
...
@@ -154,6 +157,9 @@ func (s *httpServer) Run(addr, authToken string, bot *coolq.CQBot) {
s
.
engine
.
Any
(
"/get_version_info"
,
s
.
GetVersionInfo
)
s
.
engine
.
Any
(
"/get_version_info"
,
s
.
GetVersionInfo
)
s
.
engine
.
Any
(
"/get_version_info_async"
,
s
.
GetVersionInfo
)
s
.
engine
.
Any
(
"/get_version_info_async"
,
s
.
GetVersionInfo
)
s
.
engine
.
Any
(
"/_get_vip_info"
,
s
.
GetVipInfo
)
s
.
engine
.
Any
(
"/_get_vip_info_async"
,
s
.
GetVipInfo
)
s
.
engine
.
Any
(
"/.handle_quick_operation"
,
s
.
HandleQuickOperation
)
s
.
engine
.
Any
(
"/.handle_quick_operation"
,
s
.
HandleQuickOperation
)
go
func
()
{
go
func
()
{
...
@@ -199,7 +205,7 @@ func (c *httpClient) onBotPushEvent(m coolq.MSG) {
...
@@ -199,7 +205,7 @@ func (c *httpClient) onBotPushEvent(m coolq.MSG) {
return
h
return
h
}())
.
SetTimeout
(
time
.
Second
*
time
.
Duration
(
c
.
timeout
))
.
Do
()
}())
.
SetTimeout
(
time
.
Second
*
time
.
Duration
(
c
.
timeout
))
.
Do
()
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Warnf
(
"上报Event数据
到 %v 失败: %v"
,
c
.
addr
,
err
)
log
.
Warnf
(
"上报Event数据
%v 到 %v 失败: %v"
,
m
.
ToJson
()
,
c
.
addr
,
err
)
return
return
}
}
if
gjson
.
Valid
(
res
)
{
if
gjson
.
Valid
(
res
)
{
...
@@ -227,14 +233,14 @@ func (s *httpServer) GetGroupInfo(c *gin.Context) {
...
@@ -227,14 +233,14 @@ func (s *httpServer) GetGroupInfo(c *gin.Context) {
func
(
s
*
httpServer
)
GetGroupMemberList
(
c
*
gin
.
Context
)
{
func
(
s
*
httpServer
)
GetGroupMemberList
(
c
*
gin
.
Context
)
{
gid
,
_
:=
strconv
.
ParseInt
(
getParam
(
c
,
"group_id"
),
10
,
64
)
gid
,
_
:=
strconv
.
ParseInt
(
getParam
(
c
,
"group_id"
),
10
,
64
)
c
.
JSON
(
200
,
s
.
bot
.
CQGetGroupMemberList
(
gid
))
nc
:=
getParamOrDefault
(
c
,
"no_cache"
,
"false"
)
c
.
JSON
(
200
,
s
.
bot
.
CQGetGroupMemberList
(
gid
,
nc
==
"true"
))
}
}
func
(
s
*
httpServer
)
GetGroupMemberInfo
(
c
*
gin
.
Context
)
{
func
(
s
*
httpServer
)
GetGroupMemberInfo
(
c
*
gin
.
Context
)
{
gid
,
_
:=
strconv
.
ParseInt
(
getParam
(
c
,
"group_id"
),
10
,
64
)
gid
,
_
:=
strconv
.
ParseInt
(
getParam
(
c
,
"group_id"
),
10
,
64
)
uid
,
_
:=
strconv
.
ParseInt
(
getParam
(
c
,
"user_id"
),
10
,
64
)
uid
,
_
:=
strconv
.
ParseInt
(
getParam
(
c
,
"user_id"
),
10
,
64
)
nc
:=
getParamOrDefault
(
c
,
"no_cache"
,
"false"
)
c
.
JSON
(
200
,
s
.
bot
.
CQGetGroupMemberInfo
(
gid
,
uid
))
c
.
JSON
(
200
,
s
.
bot
.
CQGetGroupMemberInfo
(
gid
,
uid
,
nc
==
"true"
))
}
}
func
(
s
*
httpServer
)
SendMessage
(
c
*
gin
.
Context
)
{
func
(
s
*
httpServer
)
SendMessage
(
c
*
gin
.
Context
)
{
...
@@ -347,7 +353,12 @@ func (s *httpServer) SetWholeBan(c *gin.Context) {
...
@@ -347,7 +353,12 @@ func (s *httpServer) SetWholeBan(c *gin.Context) {
func
(
s
*
httpServer
)
SetGroupName
(
c
*
gin
.
Context
)
{
func
(
s
*
httpServer
)
SetGroupName
(
c
*
gin
.
Context
)
{
gid
,
_
:=
strconv
.
ParseInt
(
getParam
(
c
,
"group_id"
),
10
,
64
)
gid
,
_
:=
strconv
.
ParseInt
(
getParam
(
c
,
"group_id"
),
10
,
64
)
c
.
JSON
(
200
,
s
.
bot
.
CQSetGroupName
(
gid
,
getParam
(
c
,
"name"
)))
c
.
JSON
(
200
,
s
.
bot
.
CQSetGroupName
(
gid
,
getParam
(
c
,
"group_name"
)))
}
func
(
s
*
httpServer
)
SendGroupNotice
(
c
*
gin
.
Context
)
{
gid
,
_
:=
strconv
.
ParseInt
(
getParam
(
c
,
"group_id"
),
10
,
64
)
c
.
JSON
(
200
,
s
.
bot
.
CQSetGroupMemo
(
gid
,
getParam
(
c
,
"content"
)))
}
}
func
(
s
*
httpServer
)
SetGroupLeave
(
c
*
gin
.
Context
)
{
func
(
s
*
httpServer
)
SetGroupLeave
(
c
*
gin
.
Context
)
{
...
@@ -381,6 +392,11 @@ func (s *httpServer) GetVersionInfo(c *gin.Context) {
...
@@ -381,6 +392,11 @@ func (s *httpServer) GetVersionInfo(c *gin.Context) {
c
.
JSON
(
200
,
s
.
bot
.
CQGetVersionInfo
())
c
.
JSON
(
200
,
s
.
bot
.
CQGetVersionInfo
())
}
}
func
(
s
*
httpServer
)
GetVipInfo
(
c
*
gin
.
Context
)
{
uid
,
_
:=
strconv
.
ParseInt
(
getParam
(
c
,
"user_id"
),
10
,
64
)
c
.
JSON
(
200
,
s
.
bot
.
CQGetVipInfo
(
uid
))
}
func
(
s
*
httpServer
)
HandleQuickOperation
(
c
*
gin
.
Context
)
{
func
(
s
*
httpServer
)
HandleQuickOperation
(
c
*
gin
.
Context
)
{
if
c
.
Request
.
Method
!=
"POST"
{
if
c
.
Request
.
Method
!=
"POST"
{
c
.
AbortWithStatus
(
404
)
c
.
AbortWithStatus
(
404
)
...
@@ -400,7 +416,6 @@ func getParamOrDefault(c *gin.Context, k, def string) string {
...
@@ -400,7 +416,6 @@ func getParamOrDefault(c *gin.Context, k, def string) string {
return
def
return
def
}
}
func
getParam
(
c
*
gin
.
Context
,
k
string
)
string
{
func
getParam
(
c
*
gin
.
Context
,
k
string
)
string
{
p
,
_
:=
getParamWithType
(
c
,
k
)
p
,
_
:=
getParamWithType
(
c
,
k
)
return
p
return
p
...
...
server/websocket.go
View file @
6f522a11
...
@@ -123,6 +123,14 @@ func (c *websocketClient) connectEvent() {
...
@@ -123,6 +123,14 @@ func (c *websocketClient) connectEvent() {
}
}
return
return
}
}
handshake
:=
fmt
.
Sprintf
(
`{"meta_event_type":"lifecycle","post_type":"meta_event","self_id":%d,"sub_type":"connect","time":%d}`
,
c
.
bot
.
Client
.
Uin
,
time
.
Now
()
.
Unix
())
err
=
conn
.
WriteMessage
(
websocket
.
TextMessage
,
[]
byte
(
handshake
))
if
err
!=
nil
{
log
.
Warnf
(
"反向Websocket 握手时出现错误: %v"
,
err
)
}
log
.
Infof
(
"已连接到反向Websocket Event服务器 %v"
,
c
.
conf
.
ReverseEventUrl
)
log
.
Infof
(
"已连接到反向Websocket Event服务器 %v"
,
c
.
conf
.
ReverseEventUrl
)
c
.
eventConn
=
&
websocketConn
{
Conn
:
conn
}
c
.
eventConn
=
&
websocketConn
{
Conn
:
conn
}
}
}
...
@@ -146,6 +154,14 @@ func (c *websocketClient) connectUniversal() {
...
@@ -146,6 +154,14 @@ func (c *websocketClient) connectUniversal() {
}
}
return
return
}
}
handshake
:=
fmt
.
Sprintf
(
`{"meta_event_type":"lifecycle","post_type":"meta_event","self_id":%d,"sub_type":"connect","time":%d}`
,
c
.
bot
.
Client
.
Uin
,
time
.
Now
()
.
Unix
())
err
=
conn
.
WriteMessage
(
websocket
.
TextMessage
,
[]
byte
(
handshake
))
if
err
!=
nil
{
log
.
Warnf
(
"反向Websocket 握手时出现错误: %v"
,
err
)
}
wrappedConn
:=
&
websocketConn
{
Conn
:
conn
}
wrappedConn
:=
&
websocketConn
{
Conn
:
conn
}
go
c
.
listenApi
(
wrappedConn
,
true
)
go
c
.
listenApi
(
wrappedConn
,
true
)
c
.
universalConn
=
wrappedConn
c
.
universalConn
=
wrappedConn
...
@@ -206,20 +222,12 @@ func (c *websocketClient) onBotPushEvent(m coolq.MSG) {
...
@@ -206,20 +222,12 @@ func (c *websocketClient) onBotPushEvent(m coolq.MSG) {
func
(
s
*
websocketServer
)
event
(
w
http
.
ResponseWriter
,
r
*
http
.
Request
)
{
func
(
s
*
websocketServer
)
event
(
w
http
.
ResponseWriter
,
r
*
http
.
Request
)
{
if
s
.
token
!=
""
{
if
s
.
token
!=
""
{
if
auth
:=
r
.
URL
.
Query
()
.
Get
(
"access_token"
);
auth
!=
s
.
token
&&
auth
!=
""
{
if
auth
:=
r
.
URL
.
Query
()
.
Get
(
"access_token"
);
auth
!=
s
.
token
{
log
.
Warnf
(
"已拒绝 %v 的 Websocket 请求: Token错误"
,
r
.
RemoteAddr
)
if
auth
:=
strings
.
SplitN
(
r
.
Header
.
Get
(
"Authorization"
),
" "
,
2
);
len
(
auth
)
!=
2
||
auth
[
1
]
!=
s
.
token
{
w
.
WriteHeader
(
401
)
log
.
Warnf
(
"已拒绝 %v 的 Websocket 请求: Token鉴权失败"
,
r
.
RemoteAddr
)
return
}
else
if
auth
:=
strings
.
SplitN
(
r
.
Header
.
Get
(
"Authorization"
),
" "
,
2
);
len
(
auth
)
==
2
{
if
auth
[
1
]
!=
s
.
token
{
log
.
Warnf
(
"已拒绝 %v 的 Websocket 请求: Token错误"
,
r
.
RemoteAddr
)
w
.
WriteHeader
(
401
)
w
.
WriteHeader
(
401
)
return
return
}
}
}
else
{
log
.
Warnf
(
"已拒绝 %v 的 Websocket 请求: 空Token或传入格式错误"
,
r
.
RemoteAddr
)
w
.
WriteHeader
(
401
)
return
}
}
}
}
c
,
err
:=
upgrader
.
Upgrade
(
w
,
r
,
nil
)
c
,
err
:=
upgrader
.
Upgrade
(
w
,
r
,
nil
)
...
@@ -245,20 +253,12 @@ func (s *websocketServer) event(w http.ResponseWriter, r *http.Request) {
...
@@ -245,20 +253,12 @@ func (s *websocketServer) event(w http.ResponseWriter, r *http.Request) {
func
(
s
*
websocketServer
)
api
(
w
http
.
ResponseWriter
,
r
*
http
.
Request
)
{
func
(
s
*
websocketServer
)
api
(
w
http
.
ResponseWriter
,
r
*
http
.
Request
)
{
if
s
.
token
!=
""
{
if
s
.
token
!=
""
{
if
auth
:=
r
.
URL
.
Query
()
.
Get
(
"access_token"
);
auth
!=
s
.
token
&&
auth
!=
""
{
if
auth
:=
r
.
URL
.
Query
()
.
Get
(
"access_token"
);
auth
!=
s
.
token
{
log
.
Warnf
(
"已拒绝 %v 的 Websocket 请求: Token错误"
,
r
.
RemoteAddr
)
if
auth
:=
strings
.
SplitN
(
r
.
Header
.
Get
(
"Authorization"
),
" "
,
2
);
len
(
auth
)
!=
2
||
auth
[
1
]
!=
s
.
token
{
w
.
WriteHeader
(
401
)
log
.
Warnf
(
"已拒绝 %v 的 Websocket 请求: Token鉴权失败"
,
r
.
RemoteAddr
)
return
}
else
if
auth
:=
strings
.
SplitN
(
r
.
Header
.
Get
(
"Authorization"
),
" "
,
2
);
len
(
auth
)
==
2
{
if
auth
[
1
]
!=
s
.
token
{
log
.
Warnf
(
"已拒绝 %v 的 Websocket 请求: Token错误"
,
r
.
RemoteAddr
)
w
.
WriteHeader
(
401
)
w
.
WriteHeader
(
401
)
return
return
}
}
}
else
{
log
.
Warnf
(
"已拒绝 %v 的 Websocket 请求: 空Token或传入格式错误"
,
r
.
RemoteAddr
)
w
.
WriteHeader
(
401
)
return
}
}
}
}
c
,
err
:=
upgrader
.
Upgrade
(
w
,
r
,
nil
)
c
,
err
:=
upgrader
.
Upgrade
(
w
,
r
,
nil
)
...
@@ -273,20 +273,12 @@ func (s *websocketServer) api(w http.ResponseWriter, r *http.Request) {
...
@@ -273,20 +273,12 @@ func (s *websocketServer) api(w http.ResponseWriter, r *http.Request) {
func
(
s
*
websocketServer
)
any
(
w
http
.
ResponseWriter
,
r
*
http
.
Request
)
{
func
(
s
*
websocketServer
)
any
(
w
http
.
ResponseWriter
,
r
*
http
.
Request
)
{
if
s
.
token
!=
""
{
if
s
.
token
!=
""
{
if
auth
:=
r
.
URL
.
Query
()
.
Get
(
"access_token"
);
auth
!=
s
.
token
&&
auth
!=
""
{
if
auth
:=
r
.
URL
.
Query
()
.
Get
(
"access_token"
);
auth
!=
s
.
token
{
log
.
Warnf
(
"已拒绝 %v 的 Websocket 请求: Token错误"
,
r
.
RemoteAddr
)
if
auth
:=
strings
.
SplitN
(
r
.
Header
.
Get
(
"Authorization"
),
" "
,
2
);
len
(
auth
)
!=
2
||
auth
[
1
]
!=
s
.
token
{
w
.
WriteHeader
(
401
)
log
.
Warnf
(
"已拒绝 %v 的 Websocket 请求: Token鉴权失败"
,
r
.
RemoteAddr
)
return
}
else
if
auth
:=
strings
.
SplitN
(
r
.
Header
.
Get
(
"Authorization"
),
" "
,
2
);
len
(
auth
)
==
2
{
if
auth
[
1
]
!=
s
.
token
{
log
.
Warnf
(
"已拒绝 %v 的 Websocket 请求: Token错误"
,
r
.
RemoteAddr
)
w
.
WriteHeader
(
401
)
w
.
WriteHeader
(
401
)
return
return
}
}
}
else
{
log
.
Warnf
(
"已拒绝 %v 的 Websocket 请求: 空Token或传入格式错误"
,
r
.
RemoteAddr
)
w
.
WriteHeader
(
401
)
return
}
}
}
}
c
,
err
:=
upgrader
.
Upgrade
(
w
,
r
,
nil
)
c
,
err
:=
upgrader
.
Upgrade
(
w
,
r
,
nil
)
...
@@ -300,7 +292,6 @@ func (s *websocketServer) any(w http.ResponseWriter, r *http.Request) {
...
@@ -300,7 +292,6 @@ func (s *websocketServer) any(w http.ResponseWriter, r *http.Request) {
c
.
Close
()
c
.
Close
()
return
return
}
}
log
.
Infof
(
"接受 Websocket 连接: %v (/)"
,
r
.
RemoteAddr
)
log
.
Infof
(
"接受 Websocket 连接: %v (/)"
,
r
.
RemoteAddr
)
conn
:=
&
websocketConn
{
Conn
:
c
}
conn
:=
&
websocketConn
{
Conn
:
c
}
s
.
eventConn
=
append
(
s
.
eventConn
,
conn
)
s
.
eventConn
=
append
(
s
.
eventConn
,
conn
)
...
@@ -381,12 +372,11 @@ var wsApi = map[string]func(*coolq.CQBot, gjson.Result) coolq.MSG{
...
@@ -381,12 +372,11 @@ var wsApi = map[string]func(*coolq.CQBot, gjson.Result) coolq.MSG{
return
bot
.
CQGetGroupInfo
(
p
.
Get
(
"group_id"
)
.
Int
())
return
bot
.
CQGetGroupInfo
(
p
.
Get
(
"group_id"
)
.
Int
())
},
},
"get_group_member_list"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
"get_group_member_list"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
return
bot
.
CQGetGroupMemberList
(
p
.
Get
(
"group_id"
)
.
Int
())
return
bot
.
CQGetGroupMemberList
(
p
.
Get
(
"group_id"
)
.
Int
()
,
p
.
Get
(
"no_cache"
)
.
Bool
()
)
},
},
"get_group_member_info"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
"get_group_member_info"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
return
bot
.
CQGetGroupMemberInfo
(
return
bot
.
CQGetGroupMemberInfo
(
p
.
Get
(
"group_id"
)
.
Int
(),
p
.
Get
(
"user_id"
)
.
Int
(),
p
.
Get
(
"group_id"
)
.
Int
(),
p
.
Get
(
"user_id"
)
.
Int
(),
p
.
Get
(
"no_cache"
)
.
Bool
(),
)
)
},
},
"send_msg"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
"send_msg"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
...
@@ -461,7 +451,10 @@ var wsApi = map[string]func(*coolq.CQBot, gjson.Result) coolq.MSG{
...
@@ -461,7 +451,10 @@ var wsApi = map[string]func(*coolq.CQBot, gjson.Result) coolq.MSG{
}())
}())
},
},
"set_group_name"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
"set_group_name"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
return
bot
.
CQSetGroupName
(
p
.
Get
(
"group_id"
)
.
Int
(),
p
.
Get
(
"name"
)
.
Str
)
return
bot
.
CQSetGroupName
(
p
.
Get
(
"group_id"
)
.
Int
(),
p
.
Get
(
"group_name"
)
.
Str
)
},
"_send_group_notice"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
return
bot
.
CQSetGroupMemo
(
p
.
Get
(
"group_id"
)
.
Int
(),
p
.
Get
(
"content"
)
.
Str
)
},
},
"set_group_leave"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
"set_group_leave"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
return
bot
.
CQSetGroupLeave
(
p
.
Get
(
"group_id"
)
.
Int
())
return
bot
.
CQSetGroupLeave
(
p
.
Get
(
"group_id"
)
.
Int
())
...
@@ -490,6 +483,9 @@ var wsApi = map[string]func(*coolq.CQBot, gjson.Result) coolq.MSG{
...
@@ -490,6 +483,9 @@ var wsApi = map[string]func(*coolq.CQBot, gjson.Result) coolq.MSG{
"get_version_info"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
"get_version_info"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
return
bot
.
CQGetVersionInfo
()
return
bot
.
CQGetVersionInfo
()
},
},
"_get_vip_info"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
return
bot
.
CQGetVipInfo
(
p
.
Get
(
"user_id"
)
.
Int
())
},
".handle_quick_operation"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
".handle_quick_operation"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
return
bot
.
CQHandleQuickOperation
(
p
.
Get
(
"context"
),
p
.
Get
(
"operation"
))
return
bot
.
CQHandleQuickOperation
(
p
.
Get
(
"context"
),
p
.
Get
(
"operation"
))
},
},
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment