1
0
mirror of https://github.com/Mrs4s/go-cqhttp.git synced 2025-06-30 20:03:24 +00:00

Compare commits

..

18 Commits

Author SHA1 Message Date
2057e769da update MiraiGo. 2020-11-20 23:51:17 +08:00
0ea85e2fab Merge pull request #438 from wfjsw/patches/add-reject_add_request-to-group-kick
reject_add_request
2020-11-20 21:26:43 +08:00
36b081eeec reject_add_request
(cherry picked from commit 061a230c9fb723ad49e00776fa37aca080973ecd)
2020-11-20 14:05:17 +08:00
2a044a62d2 update MiraiGo. 2020-11-20 09:07:30 +08:00
e0ffb98665 add comments for default config. 2020-11-20 03:01:58 +08:00
861bcf30b1 Merge branch 'dev' of https://github.com/Mrs4s/go-cqhttp into dev 2020-11-20 02:21:17 +08:00
56d7815f6a Merge pull request #437 from fkx4-p/patch-3
Update quick_start.md
2020-11-20 01:56:58 +08:00
59934982b9 Update quick_start.md
1.Fixed Ink33's typo and my error.
2.Added a discription and an example to make the checking part more reasonable.
2020-11-19 22:48:30 +08:00
09c4801b56 fix config. 2020-11-19 09:16:32 +08:00
f1f58b4072 update MiraiGo. 2020-11-19 09:12:41 +08:00
86c2f3cb11 Merge branch 'master' into dev 2020-11-19 09:04:30 +08:00
03c3340954 Merge pull request #426 from Ink-33/master
Fix: set_restart api panic
2020-11-19 00:22:56 +08:00
64b1a223cc Fix #427 2020-11-18 22:46:52 +08:00
b2be595fb8 simplifies composite literals 2020-11-18 22:33:51 +08:00
22225f2b74 Merge pull request #429 from wdvxdr1123/dev
change config file to hjson
2020-11-18 21:47:30 +08:00
eb3d7434cc use hjson 2020-11-18 21:06:37 +08:00
8f7f207891 Merge remote-tracking branch 'upstream/master' into dev 2020-11-18 12:29:17 +08:00
83e0aaa0f8 Fix: set_restart api panic 2020-11-18 01:31:45 +08:00
15 changed files with 222 additions and 76 deletions

View File

@ -382,10 +382,10 @@ func (bot *CQBot) CQSetGroupMemo(groupId int64, msg string) MSG {
}
// 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, block bool) MSG {
if g := bot.Client.FindGroup(groupId); g != nil {
if m := g.FindMember(userId); m != nil {
m.Kick(msg)
m.Kick(msg, block)
return OK(nil)
}
}
@ -639,7 +639,7 @@ func (bot *CQBot) CQHandleQuickOperation(context, operation gjson.Result) MSG {
bot.CQDeleteMessage(int32(context.Get("message_id").Int()))
}
if operation.Get("kick").Bool() && !isAnonymous {
bot.CQSetGroupKick(context.Get("group_id").Int(), context.Get("user_id").Int(), "")
bot.CQSetGroupKick(context.Get("group_id").Int(), context.Get("user_id").Int(), "", operation.Get("reject_add_request").Bool())
}
if operation.Get("ban").Bool() {
var duration uint32 = 30 * 60
@ -789,6 +789,7 @@ func (bot *CQBot) CQGetStatus() MSG {
"app_good": true,
"online": bot.Client.Online,
"good": true,
"stat": bot.Client.GetStatistics(),
})
}

View File

@ -3,7 +3,6 @@ package coolq
import (
"bytes"
"encoding/gob"
"encoding/json"
"fmt"
"hash/crc32"
"path"
@ -17,10 +16,13 @@ import (
"github.com/Mrs4s/MiraiGo/message"
"github.com/Mrs4s/go-cqhttp/global"
jsoniter "github.com/json-iterator/go"
log "github.com/sirupsen/logrus"
"github.com/tidwall/gjson"
)
var json = jsoniter.ConfigCompatibleWithStandardLibrary
type CQBot struct {
Client *client.QQClient

View File

@ -184,12 +184,12 @@ func ToArrayMessage(e []message.IMessageElement, code int64, raw ...bool) (r []M
}
}
case *message.GroupFlashImgElement:
return []MSG{MSG{
return []MSG{{
"type": "image",
"data": map[string]string{"file": o.Filename, "type": "flash"},
}}
case *message.FriendFlashImgElement:
return []MSG{MSG{
return []MSG{{
"type": "image",
"data": map[string]string{"file": o.Filename, "type": "flash"},
}}

View File

@ -8,7 +8,7 @@
| 参数名 | 类型 | 说明 |
| ------------ | ------ | --------------------------- |
| access_token | string | 校验口令config.json中配置 |
| access_token | string | 校验口令config.hjson中配置 |
@ -209,7 +209,7 @@ method: `POST` formdata
### admin/do_config_json
> 直接修改 config.json配置
> 直接修改 config.hjson配置
method: `POST` formdata
@ -217,7 +217,7 @@ method: `POST` formdata
| 参数名 | 类型 | 说明 |
| ------ | ------ | ----------------------------------- |
| json | string | 完整的config.json的配合json字符串 |
| json | string | 完整的config.hjson的配合json字符串 |
返回:
@ -228,7 +228,7 @@ method: `POST` formdata
### admin/get_config_json
> 获取当前 config.json配置
> 获取当前 config.hjson配置
method: `GET`
@ -247,5 +247,5 @@ method: `GET`
| 参数名 | 类型 | 说明 |
| ------ | ------ | ----------------------------------- |
| config | string | 完整的config.json的配合json字符串 |
| config | string | 完整的config.hjson的配合json字符串 |

View File

@ -1,6 +1,6 @@
# 配置
go-cqhttp 包含 `config.json``device.json` 两个配置文件, 其中 `config.json` 为运行配置 `device.json` 为虚拟设备信息.
go-cqhttp 包含 `config.hjson``device.json` 两个配置文件, 其中 `config.json` 为运行配置 `device.json` 为虚拟设备信息.
## 从原CQHTTP导入配置

View File

@ -5,7 +5,7 @@ go-cqhttp 默认生成的文件树如下所示:
````
.
├── go-cqhttp
├── config.json
├── config.hjson
├── device.json
├── logs
│ └── xx-xx-xx.log
@ -18,7 +18,7 @@ go-cqhttp 默认生成的文件树如下所示:
| 文件 | 用途 |
| ----------- | ------------------- |
| go-cqhttp | go-cqhttp可执行文件 |
| config.json | 运行配置文件 |
| config.hjson | 运行配置文件 |
| device.json | 虚拟设备配置文件 |
| logs | 日志存放目录 |
| data | 数据目录 |

View File

@ -28,8 +28,8 @@
1. 双击`go-cqhttp.exe`此时将提示
```
[WARNING]: 尝试加载配置文件 config.json 失败: 文件不存在
[INFO]: 默认配置文件已生成,请编辑 config.json 后重启程序.
[WARNING]: 尝试加载配置文件 config.hjson 失败: 文件不存在
[INFO]: 默认配置文件已生成,请编辑 config.hjson 后重启程序.
```
2. 参照[config.md](https://github.com/Mrs4s/go-cqhttp/blob/master/docs/config.md)和你所用到的插件的 `README` 填入参数
3. 再次双击`go-cqhttp.exe`
@ -79,8 +79,8 @@ enable ws?(Y/n)
2. `cd`到解压目录
3. 输入 `./go-cqhttp``Enter`运行 ,此时将提示
```
[WARNING]: 尝试加载配置文件 config.json 失败: 文件不存在
[INFO]: 默认配置文件已生成,请编辑 config.json 后重启程序.
[WARNING]: 尝试加载配置文件 config.hjson 失败: 文件不存在
[INFO]: 默认配置文件已生成,请编辑 config.hjson 后重启程序.
```
4. 参照[config.md](https://github.com/Mrs4s/go-cqhttp/blob/master/docs/config.md)和你所用到的插件的 `README` 填入参数
@ -103,6 +103,8 @@ enable ws?(Y/n)
如果出现`{"data":{"message_id":balabala},"retcode":0,"status":"ok"}`则证明已经成功配置HTTP
*注:请 连 中括号 也替换掉,就像这样:*`http://127.0.0.1:5700/send_private_msg?user_id=10001&message=ffeecoishp`
# 进阶指南
## 如何自己构建
@ -117,13 +119,11 @@ enable ws?(Y/n)
*注:可以使用*`go env -w GOPROXY=https://goproxy.cn,direct`*来加速国内依赖安装速度*
*注:此时构建后的文件名为*`go-cqhttp`(Linux)或`go-cqhttp.exe`(Windows)
## 更新
### 方法一
从[release] (https://github.com/Mrs4s/go-cqhttp/releases)界面下载最新版本的go-cqhttp
从[release](https://github.com/Mrs4s/go-cqhttp/releases)界面下载最新版本的go-cqhttp
并替换之前的版本
### 方法二
@ -144,4 +144,4 @@ enable ws?(Y/n)
- `https://github.rc1844.workers.dev`
#### linux
方法与windows基本一致`go-cqhttp.exe` 替换为 `./go-cqhttp`即可
方法与windows基本一致`go-cqhttp.exe` 替换为 `./go-cqhttp`即可

View File

@ -1,14 +1,138 @@
package global
import (
"encoding/json"
"os"
"strconv"
"time"
"github.com/hjson/hjson-go"
jsoniter "github.com/json-iterator/go"
log "github.com/sirupsen/logrus"
)
var json = jsoniter.ConfigCompatibleWithStandardLibrary
var DefaultConfigWithComments = `
/*
go-cqhttp 默认配置文件
*/
{
// QQ号
uin: 0
// QQ密码
password: ""
// 是否启用密码加密
encrypt_password: false
// 加密后的密码, 如未启用密码加密将为空, 请勿随意修改.
password_encrypted: ""
// 是否启用内置数据库
// 启用将会增加10-20MB的内存占用和一定的磁盘空间
// 关闭将无法使用 撤回 回复 get_msg 等上下文相关功能
enable_db: true
// 访问密钥, 强烈推荐在公网的服务器设置
access_token: ""
// 重连设置
relogin: {
// 是否启用自动重连
// 如不启用掉线后将不会自动重连
enabled: true
// 重连延迟, 单位秒
relogin_delay: 3
// 最大重连次数, 0为无限制
max_relogin_times: 0
}
// API限速设置
// 该设置为全局生效
// 原 cqhttp 虽然启用了 rate_limit 后缀, 但是基本没插件适配
// 目前该限速设置为令牌桶算法, 请参考:
// https://baike.baidu.com/item/%E4%BB%A4%E7%89%8C%E6%A1%B6%E7%AE%97%E6%B3%95/6597000?fr=aladdin
_rate_limit: {
// 是否启用限速
enabled: false
// 令牌回复频率, 单位秒
frequency: 1
// 令牌桶大小
bucket_size: 1
}
// 是否忽略无效的CQ码
// 如果为假将原样发送
ignore_invalid_cqcode: false
// 是否强制分片发送消息
// 分片发送将会带来更快的速度
// 但是兼容性会有些问题
force_fragmented: false
// 心跳频率, 单位秒
// -1 为关闭心跳
heartbeat_interval: 0
// HTTP设置
http_config: {
// 是否启用正向HTTP服务器
enabled: true
// 服务端监听地址
host: 0.0.0.0
// 服务端监听端口
port: 5700
// 反向HTTP超时时间, 单位秒
// 最小值为5小于5将会忽略本项设置
timeout: 0
// 反向HTTP POST地址列表
// 格式:
// {
// 地址: secret
// }
post_urls: {}
}
// 正向WS设置
ws_config: {
// 是否启用正向WS服务器
enabled: true
// 正向WS服务器监听地址
host: 0.0.0.0
// 正向WS服务器监听端口
port: 6700
}
// 反向WS设置
ws_reverse_servers: [
// 可以添加多个反向WS推送
{
// 是否启用该推送
enabled: false
// 反向WS Universal 地址
// 注意 设置了此项地址后下面两项将会被忽略
reverse_url: ws://you_websocket_universal.server
// 反向WS API 地址
reverse_api_url: ws://you_websocket_api.server
// 反向WS Event 地址
reverse_event_url: ws://you_websocket_event.server
// 重连间隔 单位毫秒
reverse_reconnect_interval: 3000
}
]
// 上报数据类型
// 可选: string array
post_message_format: string
// 是否使用服务器下发的新地址进行重连
// 注意, 此设置可能导致在海外服务器上连接情况更差
use_sso_address: false
// 是否启用 DEBUG
debug: false
// 日志等级
log_level: ""
// WebUi 设置
web_ui: {
// 是否启用 WebUi
enabled: true
// 监听地址
host: 127.0.0.1
// 监听端口
web_ui_port: 9999
// 是否接收来自web的输入
web_input: false
}
}
`
type JsonConfig struct {
Uin int64 `json:"uin"`
Password string `json:"password"`
@ -144,22 +268,30 @@ func Load(p string) *JsonConfig {
log.Warnf("尝试加载配置文件 %v 失败: 文件不存在", p)
return nil
}
c := JsonConfig{}
err := json.Unmarshal([]byte(ReadAllText(p)), &c)
var dat map[string]interface{}
var c = JsonConfig{}
err := hjson.Unmarshal([]byte(ReadAllText(p)), &dat)
if err == nil {
b, _ := json.Marshal(dat)
err = json.Unmarshal(b, &c)
}
if err != nil {
log.Warnf("尝试加载配置文件 %v 时出现错误: %v", p, err)
log.Infoln("原文件已备份")
os.Rename(p, p+".backup"+strconv.FormatInt(time.Now().Unix(), 10))
_ = os.Rename(p, p+".backup"+strconv.FormatInt(time.Now().Unix(), 10))
return nil
}
return &c
}
func (c *JsonConfig) Save(p string) error {
data, err := json.MarshalIndent(c, "", "\t")
data, err := hjson.MarshalWithOptions(c, hjson.EncoderOptions{
Eol: "\n",
BracesSameLine: true,
IndentBy: " ",
})
if err != nil {
return err
}
WriteAllText(p, string(data))
return nil
return WriteAllText(p, string(data))
}

View File

@ -43,8 +43,8 @@ func ReadAllText(path string) string {
return string(b)
}
func WriteAllText(path, text string) {
_ = ioutil.WriteFile(path, []byte(text), 0644)
func WriteAllText(path, text string) error {
return ioutil.WriteFile(path, []byte(text), 0644)
}
func Check(err error) {

6
go.mod
View File

@ -1,15 +1,17 @@
module github.com/Mrs4s/go-cqhttp
go 1.14
go 1.15
require (
github.com/Mrs4s/MiraiGo v0.0.0-20201117154121-989187125900
github.com/Mrs4s/MiraiGo v0.0.0-20201120153907-26b45139c16f
github.com/dustin/go-humanize v1.0.0
github.com/getlantern/go-update v0.0.0-20190510022740-79c495ab728c
github.com/getlantern/golog v0.0.0-20201105130739-9586b8bde3a9 // indirect
github.com/gin-gonic/gin v1.6.3
github.com/gorilla/websocket v1.4.2
github.com/guonaihong/gout v0.1.3
github.com/hjson/hjson-go v3.1.0+incompatible
github.com/json-iterator/go v1.1.10
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect
github.com/kr/binarydist v0.1.0 // indirect
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible

10
go.sum
View File

@ -1,7 +1,7 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/Mrs4s/MiraiGo v0.0.0-20201117154121-989187125900 h1:xnx3dH7hgZ/Z4k33EhKzBmQhwASJ5bvsorqPhO0DWbc=
github.com/Mrs4s/MiraiGo v0.0.0-20201117154121-989187125900/go.mod h1:pAsWtMIwqkBXr5DkUpTIHoWQJNduVnX9WSBPmPvkuCs=
github.com/Mrs4s/MiraiGo v0.0.0-20201120153907-26b45139c16f h1:pjxBE1VvJpookM2iUySfiqmuNyMz52oOhcvSRwWldqw=
github.com/Mrs4s/MiraiGo v0.0.0-20201120153907-26b45139c16f/go.mod h1:pAsWtMIwqkBXr5DkUpTIHoWQJNduVnX9WSBPmPvkuCs=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@ -67,9 +67,13 @@ github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0U
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/guonaihong/gout v0.1.3 h1:BIiV6nnsA+R6dIB1P33uhCM8+TVAG3zHrXGZad7hDc8=
github.com/guonaihong/gout v0.1.3/go.mod h1:vXvv5Kxr70eM5wrp4F0+t9lnLWmq+YPW2GByll2f/EA=
github.com/hjson/hjson-go v3.1.0+incompatible h1:DY/9yE8ey8Zv22bY+mHV1uk2yRy0h8tKhZ77hEdi0Aw=
github.com/hjson/hjson-go v3.1.0+incompatible/go.mod h1:qsetwF8NlsTsOTwZTApNlTCerV+b2GjYRRcIk4JMFio=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA=
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@ -86,7 +90,9 @@ github.com/lestrrat-go/strftime v1.0.3/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR7
github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=

40
main.go
View File

@ -2,10 +2,8 @@ package main
import (
"bufio"
"context"
"crypto/md5"
"encoding/base64"
"encoding/json"
"fmt"
"io"
"io/ioutil"
@ -29,12 +27,15 @@ import (
"github.com/Mrs4s/go-cqhttp/coolq"
"github.com/Mrs4s/go-cqhttp/global"
"github.com/getlantern/go-update"
jsoniter "github.com/json-iterator/go"
rotatelogs "github.com/lestrrat-go/file-rotatelogs"
"github.com/rifflock/lfshook"
log "github.com/sirupsen/logrus"
easy "github.com/t-tomalak/logrus-easy-formatter"
)
var json = jsoniter.ConfigCompatibleWithStandardLibrary
func init() {
log.SetFormatter(&easy.Formatter{
TimestampFormat: "2006-01-02 15:04:05",
@ -66,7 +67,7 @@ func init() {
}
if global.PathExists("cqhttp.json") {
log.Info("发现 cqhttp.json 将在五秒后尝试导入配置,按 Ctrl+C 取消.")
log.Warn("警告: 该操作会删除 cqhttp.json 并覆盖 config.json 文件.")
log.Warn("警告: 该操作会删除 cqhttp.json 并覆盖 config.hjson 文件.")
time.Sleep(time.Second * 5)
conf := global.CQHttpApiConfig{}
if err := json.Unmarshal([]byte(global.ReadAllText("cqhttp.json")), &conf); err != nil {
@ -88,8 +89,8 @@ func init() {
goConf.ReverseServers[0].ReverseEventUrl = conf.WSReverseEventUrl
goConf.ReverseServers[0].ReverseReconnectInterval = conf.WSReverseReconnectInterval
}
if err := goConf.Save("config.json"); err != nil {
log.Fatalf("保存 config.json 时出现错误: %v", err)
if err := goConf.Save("config.hjson"); err != nil {
log.Fatalf("保存 config.hjson 时出现错误: %v", err)
}
_ = os.Remove("cqhttp.json")
}
@ -122,8 +123,10 @@ func main() {
}
var conf *global.JsonConfig
if global.PathExists("config.json") || os.Getenv("UIN") == "" {
if global.PathExists("config.json") {
conf = global.Load("config.json")
_ = conf.Save("config.hjson")
_ = os.Remove("config.json")
} else if os.Getenv("UIN") != "" {
log.Infof("将从环境变量加载配置.")
uin, _ := strconv.ParseInt(os.Getenv("UIN"), 10, 64)
@ -149,19 +152,21 @@ func main() {
if post != "" {
conf.HttpConfig.PostUrls[post] = os.Getenv("HTTP_SECRET")
}
} else {
conf = global.Load("config.hjson")
}
if conf == nil {
err := global.DefaultConfig().Save("config.json")
err := global.WriteAllText("config.hjson", global.DefaultConfigWithComments)
if err != nil {
log.Fatalf("创建默认配置文件时出现错误: %v", err)
return
}
log.Infof("默认配置文件已生成, 请编辑 config.json 后重启程序.")
log.Infof("默认配置文件已生成, 请编辑 config.hjson 后重启程序.")
time.Sleep(time.Second * 5)
return
}
if conf.Uin == 0 || (conf.Password == "" && conf.PasswordEncrypted == "") {
log.Warnf("请修改 config.json 以添加账号密码.")
log.Warnf("请修改 config.hjson 以添加账号密码.")
time.Sleep(time.Second * 5)
return
}
@ -228,7 +233,7 @@ func main() {
if encrypted := EncryptPwd(conf.Password, key[:]); encrypted != "" {
conf.Password = ""
conf.PasswordEncrypted = encrypted
_ = conf.Save("config.json")
_ = conf.Save("config.hjson")
} else {
log.Warnf("加密时出现问题.")
}
@ -236,19 +241,19 @@ func main() {
if conf.PasswordEncrypted != "" {
if strKey == "" {
log.Infof("密码加密已启用, 请输入Key对密码进行解密以继续: (Enter 提交)")
ctx := context.Background()
go func(ctx context.Context) {
cancel := make(chan struct{}, 1)
go func() {
select {
case <-ctx.Done():
case <-cancel:
return
case <-time.After(time.Second * 45):
log.Infof("解密key输入超时")
time.Sleep(3 * time.Second)
os.Exit(0)
}
}(ctx)
}()
strKey, _ = console.ReadString('\n')
ctx.Done()
cancel <- struct{}{}
} else {
log.Infof("密码加密已启用, 使用运行时传递的参数进行解密,按 Ctrl+C 取消.")
}
@ -314,10 +319,6 @@ func main() {
if conf.WebUi.Host == "" {
conf.WebUi.Host = "127.0.0.1"
}
confErr := conf.Save("config.json")
if confErr != nil {
log.Error("保存配置文件失败")
}
b := server.WebServer.Run(fmt.Sprintf("%s:%d", conf.WebUi.Host, conf.WebUi.WebUiPort), cli)
c := server.Console
r := server.Restart
@ -328,7 +329,6 @@ func main() {
b.Release()
case <-r:
log.Info("正在重启中...")
server.HttpServer.ShutDown()
defer b.Release()
restart(arg)
}

View File

@ -4,7 +4,6 @@ import (
"bufio"
"bytes"
"encoding/base64"
"encoding/json"
"fmt"
"image"
"io/ioutil"
@ -19,11 +18,14 @@ import (
"github.com/Mrs4s/go-cqhttp/coolq"
"github.com/Mrs4s/go-cqhttp/global"
"github.com/gin-gonic/gin"
jsoniter "github.com/json-iterator/go"
log "github.com/sirupsen/logrus"
"github.com/tidwall/gjson"
asciiart "github.com/yinghau76/go-ascii-art"
)
var json = jsoniter.ConfigCompatibleWithStandardLibrary
var WebInput = make(chan string, 1) //长度1用于阻塞
var Console = make(chan os.Signal, 1)
@ -283,7 +285,7 @@ func GetConf() *global.JsonConfig {
if JsonConfig != nil {
return JsonConfig
}
conf := global.Load("config.json")
conf := global.Load("config.hjson")
return conf
}
@ -475,9 +477,9 @@ func AdminDoConfigBase(s *webServer, c *gin.Context) {
conf.EnableDB = false
}
conf.AccessToken = c.PostForm("access_token")
if err := conf.Save("config.json"); err != nil {
log.Fatalf("保存 config.json 时出现错误: %v", err)
c.JSON(200, Failed(502, "保存 config.json 时出现错误:"+fmt.Sprintf("%v", err)))
if err := conf.Save("config.hjson"); err != nil {
log.Fatalf("保存 config.hjson 时出现错误: %v", err)
c.JSON(200, Failed(502, "保存 config.hjson 时出现错误:"+fmt.Sprintf("%v", err)))
} else {
JsonConfig = nil
c.JSON(200, coolq.OK(coolq.MSG{}))
@ -500,9 +502,9 @@ func AdminDoConfigHttp(s *webServer, c *gin.Context) {
if c.PostForm("post_url") != "" {
conf.HttpConfig.PostUrls[c.PostForm("post_url")] = c.PostForm("post_secret")
}
if err := conf.Save("config.json"); err != nil {
log.Fatalf("保存 config.json 时出现错误: %v", err)
c.JSON(200, Failed(502, "保存 config.json 时出现错误:"+fmt.Sprintf("%v", err)))
if err := conf.Save("config.hjson"); err != nil {
log.Fatalf("保存 config.hjson 时出现错误: %v", err)
c.JSON(200, Failed(502, "保存 config.hjson 时出现错误:"+fmt.Sprintf("%v", err)))
} else {
JsonConfig = nil
c.JSON(200, coolq.OK(coolq.MSG{}))
@ -520,9 +522,9 @@ func AdminDoConfigWs(s *webServer, c *gin.Context) {
} else {
conf.WSConfig.Enabled = false
}
if err := conf.Save("config.json"); err != nil {
log.Fatalf("保存 config.json 时出现错误: %v", err)
c.JSON(200, Failed(502, "保存 config.json 时出现错误:"+fmt.Sprintf("%v", err)))
if err := conf.Save("config.hjson"); err != nil {
log.Fatalf("保存 config.hjson 时出现错误: %v", err)
c.JSON(200, Failed(502, "保存 config.hjson 时出现错误:"+fmt.Sprintf("%v", err)))
} else {
JsonConfig = nil
c.JSON(200, coolq.OK(coolq.MSG{}))
@ -542,9 +544,9 @@ func AdminDoConfigReverse(s *webServer, c *gin.Context) {
} else {
conf.ReverseServers[0].Enabled = false
}
if err := conf.Save("config.json"); err != nil {
log.Fatalf("保存 config.json 时出现错误: %v", err)
c.JSON(200, Failed(502, "保存 config.json 时出现错误:"+fmt.Sprintf("%v", err)))
if err := conf.Save("config.hjson"); err != nil {
log.Fatalf("保存 config.hjson 时出现错误: %v", err)
c.JSON(200, Failed(502, "保存 config.hjson 时出现错误:"+fmt.Sprintf("%v", err)))
} else {
JsonConfig = nil
c.JSON(200, coolq.OK(coolq.MSG{}))
@ -557,13 +559,13 @@ func AdminDoConfigJson(s *webServer, c *gin.Context) {
Json := c.PostForm("json")
err := json.Unmarshal([]byte(Json), &conf)
if err != nil {
log.Warnf("尝试加载配置文件 %v 时出现错误: %v", "config.json", err)
c.JSON(200, Failed(502, "保存 config.json 时出现错误:"+fmt.Sprintf("%v", err)))
log.Warnf("尝试加载配置文件 %v 时出现错误: %v", "config.hjson", err)
c.JSON(200, Failed(502, "保存 config.hjson 时出现错误:"+fmt.Sprintf("%v", err)))
return
}
if err := conf.Save("config.json"); err != nil {
log.Fatalf("保存 config.json 时出现错误: %v", err)
c.JSON(200, Failed(502, "保存 config.json 时出现错误:"+fmt.Sprintf("%v", err)))
if err := conf.Save("config.hjson"); err != nil {
log.Fatalf("保存 config.hjson 时出现错误: %v", err)
c.JSON(200, Failed(502, "保存 config.hjson 时出现错误:"+fmt.Sprintf("%v", err)))
} else {
JsonConfig = nil
c.JSON(200, coolq.OK(coolq.MSG{}))

View File

@ -308,7 +308,8 @@ func SetGroupKick(s *httpServer, c *gin.Context) {
gid, _ := strconv.ParseInt(getParam(c, "group_id"), 10, 64)
uid, _ := strconv.ParseInt(getParam(c, "user_id"), 10, 64)
msg := getParam(c, "message")
c.JSON(200, s.bot.CQSetGroupKick(gid, uid, msg))
block := getParamOrDefault(c, "reject_add_request", "false")
c.JSON(200, s.bot.CQSetGroupKick(gid, uid, msg, block == "true"))
}
func SetGroupBan(s *httpServer, c *gin.Context) {

View File

@ -433,7 +433,7 @@ var wsApi = map[string]func(*coolq.CQBot, gjson.Result) coolq.MSG{
return bot.CQSetGroupSpecialTitle(p.Get("group_id").Int(), p.Get("user_id").Int(), p.Get("special_title").Str)
},
"set_group_kick": func(bot *coolq.CQBot, p gjson.Result) coolq.MSG {
return bot.CQSetGroupKick(p.Get("group_id").Int(), p.Get("user_id").Int(), p.Get("message").Str)
return bot.CQSetGroupKick(p.Get("group_id").Int(), p.Get("user_id").Int(), p.Get("message").Str, p.Get("reject_add_request").Bool())
},
"set_group_ban": func(bot *coolq.CQBot, p gjson.Result) coolq.MSG {
return bot.CQSetGroupBan(p.Get("group_id").Int(), p.Get("user_id").Int(), func() uint32 {