From 7707e7854cc81fcdb31922e67c194f60a772cddb Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Wed, 22 Jun 2022 10:01:54 +0800 Subject: [PATCH 01/95] feat: add `vip_level` in get_stranger_info AntiVIP10Bot is ready. :innocent: --- coolq/api.go | 1 + go.mod | 2 +- go.sum | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/coolq/api.go b/coolq/api.go index 9a6c150..82a8118 100644 --- a/coolq/api.go +++ b/coolq/api.go @@ -1388,6 +1388,7 @@ func (bot *CQBot) CQGetStrangerInfo(userID int64) global.MSG { "age": info.Age, "level": info.Level, "login_days": info.LoginDays, + "vip_level": info.VipLevel, }) } diff --git a/go.mod b/go.mod index db48f45..5b20851 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.18 require ( github.com/Microsoft/go-winio v0.5.1 - github.com/Mrs4s/MiraiGo v0.0.0-20220621083050-ae8c187aa59d + github.com/Mrs4s/MiraiGo v0.0.0-20220622015746-24ee0103e7de github.com/RomiChan/syncx v0.0.0-20220404072119-d7ea0ae15a4c github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc github.com/fumiama/go-base16384 v1.5.2 diff --git a/go.sum b/go.sum index d70e916..6bdf510 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY= github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Mrs4s/MiraiGo v0.0.0-20220621083050-ae8c187aa59d h1:Cq8HMtyL3PRpvOynuwi9WSdek2+5UTOd0zJ+JTq5hPM= -github.com/Mrs4s/MiraiGo v0.0.0-20220621083050-ae8c187aa59d/go.mod h1:mZp8Lt7uqLCUwSLouB2yuiP467Cwl4mnG9IMAaXUKA0= +github.com/Mrs4s/MiraiGo v0.0.0-20220622015746-24ee0103e7de h1:senbiV71dgsYt60BWLEHWwvKFCYUcIzGQ/fmXRaOeQ4= +github.com/Mrs4s/MiraiGo v0.0.0-20220622015746-24ee0103e7de/go.mod h1:mZp8Lt7uqLCUwSLouB2yuiP467Cwl4mnG9IMAaXUKA0= github.com/RomiChan/protobuf v0.1.1-0.20220602121309-9e3b8cbefd7a h1:WIfEWYj82oEuPtm5pqlyQmCJCoiw00C6ugZFqHA0cC8= github.com/RomiChan/protobuf v0.1.1-0.20220602121309-9e3b8cbefd7a/go.mod h1:2Ie+hdBFQpQFDHfeklgxoFmQRCE7O+KwFpISeXq7OwA= github.com/RomiChan/syncx v0.0.0-20220404072119-d7ea0ae15a4c h1:cNPOdTNiVwxLpROLjXCgbIPvdkE+BwvxDvgmdYmWx6Q= From 06b43dd666a4c68c7f6f76031e3de2639a4b0efd Mon Sep 17 00:00:00 2001 From: Akiba Date: Wed, 22 Jun 2022 22:51:17 +0800 Subject: [PATCH 02/95] fix: download block ua --- global/net.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global/net.go b/global/net.go index c72000a..6011232 100644 --- a/global/net.go +++ b/global/net.go @@ -184,7 +184,7 @@ func DownloadFileMultiThreading(url, path string, limit int64, threadCount int, req.Header.Set(k, v) } - if _, ok := headers["User-Agent"]; ok { + if _, ok := headers["User-Agent"]; !ok { req.Header["User-Agent"] = []string{UserAgent} } req.Header.Set("range", "bytes="+strconv.FormatInt(block.BeginOffset, 10)+"-"+strconv.FormatInt(block.EndOffset, 10)) From 1d859dc3730d5b9161dc4b586472d6338e22429b Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Fri, 24 Jun 2022 10:00:18 +0800 Subject: [PATCH 03/95] doc: document new http/ws host config --- docs/config.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/docs/config.md b/docs/config.md index d352b61..38f1287 100644 --- a/docs/config.md +++ b/docs/config.md @@ -84,9 +84,8 @@ servers: # HTTP 通信设置 - http: # 服务端监听地址 - host: 127.0.0.1 - # 服务端监听端口 - port: 5700 + # 如需指定监听ipv4, 可使用 `address: tcp4://0.0.0.0:5700` (ipv6同理) + address: 0.0.0.0:5700 # 反向HTTP超时时间, 单位秒 # 最小值为5,小于5将会忽略本项设置 timeout: 5 @@ -102,9 +101,8 @@ servers: # 正向WS设置 - ws: # 正向WS服务器监听地址 - host: 127.0.0.1 - # 正向WS服务器监听端口 - port: 6700 + # 如需指定监听ipv4, 可使用 `address: tcp4://0.0.0.0:6700` (ipv6同理) + address: 0.0.0.0:6700 middlewares: <<: *default # 引用默认中间件 From 71ba266a8c7cfea0a81f90ffbca59cc9027f23d8 Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Fri, 24 Jun 2022 10:15:29 +0800 Subject: [PATCH 04/95] doc: document some new API For #1009 --- docs/cqhttp.md | 53 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/docs/cqhttp.md b/docs/cqhttp.md index 71d7d20..9d5f3fe 100644 --- a/docs/cqhttp.md +++ b/docs/cqhttp.md @@ -491,6 +491,18 @@ Type: `tts` 示例: `[CQ:tts,text=这是一条测试消息]` +### 猜拳消息 + +Type: `rps` + +参数: + +| 参数名 | 类型 | 说明 | +|---------|-----|------------------| +| `value` | int | 0:石头, 1:剪刀, 2:布 | + +示例: `[CQ:rps,value=0]` + ## API ### 设置群名 @@ -613,15 +625,16 @@ Type: `tts` } ```` -### 发送合并转发(群) +### 发送合并转发(群/私聊) -终结点: `/send_group_forward_msg` +终结点: `/send_group_forward_msg`, `send_private_forward_msg`, `send_forward_msg` **参数** -| 字段 | 类型 | 说明 | -| ---------- | -------------- | ---------------------------- | -| `group_id` | int64 | 群号 | +| 字段 | 类型 | 说明 | +|------------|----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `group_id` | int64 | 群号 | +| `user_id` | int64 | 私聊QQ号 | | `messages` | forward node[] | 自定义转发消息, 具体看 [CQCode](https://github.com/Mrs4s/go-cqhttp/blob/master/docs/cqhttp.md#%E5%90%88%E5%B9%B6%E8%BD%AC%E5%8F%91%E6%B6%88%E6%81%AF%E8%8A%82%E7%82%B9) | 响应数据 @@ -883,6 +896,36 @@ Type: `tts` > 在不提供 `folder` 参数的情况下默认上传到根目录 > 只能上传本地文件, 需要上传 `http` 文件的话请先调用 `download_file` API下载 +### 上传私聊文件 + +终结点: `/upload_group_file` + +**参数** + +| 字段 | 类型 | 说明 | +|-----------|--------|--------| +| `user_id` | int64 | 接收者id | +| `file` | string | 本地文件路径 | +| `name` | string | 储存名称 | + +> 只能上传本地文件, 需要上传 `http` 文件的话请先调用 `download_file` API下载 + +### 设置 QQ 个人资料 + +终结点: `/set_qq_profile` + +**参数** + +| 字段 | 类型 | 说明 | +|-----------------|--------|------| +| `nickname` | int64 | 昵称 | +| `company` | string | 公司 | +| `email` | string | 邮箱 | +| `college` | string | 大学 | +| `personal_note` | string | 个人签名 | + +> 所有参数字段都为可选。 + ### 获取状态 终结点: `/get_status` From 2402bbedb091aa181b1f61669958fe02020e33d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E8=91=89=E6=9D=8F?= Date: Sat, 25 Jun 2022 10:04:29 +0800 Subject: [PATCH 05/95] doc: replace ob11 doc link (#1555) --- README.md | 108 ++++++++++++++++++++++---------------------- docs/EventFilter.md | 4 +- 2 files changed, 56 insertions(+), 56 deletions(-) diff --git a/README.md b/README.md index 2cd1732..bf0fea1 100644 --- a/README.md +++ b/README.md @@ -86,18 +86,18 @@ go-cqhttp 兼容 [OneBot-v11](https://github.com/botuniverse/onebot-11) 绝大 | [CQ:xml] | [XML 消息] | | [CQ:json] | [JSON 消息] | -[qq 表情]: https://github.com/howmanybots/onebot/blob/master/v11/specs/message/segment.md#qq-%E8%A1%A8%E6%83%85 -[语音]: https://github.com/howmanybots/onebot/blob/master/v11/specs/message/segment.md#%E8%AF%AD%E9%9F%B3 -[短视频]: https://github.com/howmanybots/onebot/blob/master/v11/specs/message/segment.md#%E7%9F%AD%E8%A7%86%E9%A2%91 -[@某人]: https://github.com/howmanybots/onebot/blob/master/v11/specs/message/segment.md#%E6%9F%90%E4%BA%BA -[链接分享]: https://github.com/howmanybots/onebot/blob/master/v11/specs/message/segment.md#%E9%93%BE%E6%8E%A5%E5%88%86%E4%BA%AB -[音乐分享]: https://github.com/howmanybots/onebot/blob/master/v11/specs/message/segment.md#%E9%9F%B3%E4%B9%90%E5%88%86%E4%BA%AB- -[音乐自定义分享]: https://github.com/howmanybots/onebot/blob/master/v11/specs/message/segment.md#%E9%9F%B3%E4%B9%90%E8%87%AA%E5%AE%9A%E4%B9%89%E5%88%86%E4%BA%AB- -[回复]: https://github.com/howmanybots/onebot/blob/master/v11/specs/message/segment.md#%E5%9B%9E%E5%A4%8D -[合并转发]: https://github.com/howmanybots/onebot/blob/master/v11/specs/message/segment.md#%E5%90%88%E5%B9%B6%E8%BD%AC%E5%8F%91- -[合并转发节点]: https://github.com/howmanybots/onebot/blob/master/v11/specs/message/segment.md#%E5%90%88%E5%B9%B6%E8%BD%AC%E5%8F%91%E8%8A%82%E7%82%B9- -[xml 消息]: https://github.com/howmanybots/onebot/blob/master/v11/specs/message/segment.md#xml-%E6%B6%88%E6%81%AF -[json 消息]: https://github.com/howmanybots/onebot/blob/master/v11/specs/message/segment.md#json-%E6%B6%88%E6%81%AF +[qq 表情]: https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#qq-%E8%A1%A8%E6%83%85 +[语音]: https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#%E8%AF%AD%E9%9F%B3 +[短视频]: https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#%E7%9F%AD%E8%A7%86%E9%A2%91 +[@某人]: https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#%E6%9F%90%E4%BA%BA +[链接分享]: https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#%E9%93%BE%E6%8E%A5%E5%88%86%E4%BA%AB +[音乐分享]: https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#%E9%9F%B3%E4%B9%90%E5%88%86%E4%BA%AB- +[音乐自定义分享]: https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#%E9%9F%B3%E4%B9%90%E8%87%AA%E5%AE%9A%E4%B9%89%E5%88%86%E4%BA%AB- +[回复]: https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#%E5%9B%9E%E5%A4%8D +[合并转发]: https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#%E5%90%88%E5%B9%B6%E8%BD%AC%E5%8F%91- +[合并转发节点]: https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#%E5%90%88%E5%B9%B6%E8%BD%AC%E5%8F%91%E8%8A%82%E7%82%B9- +[xml 消息]: https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#xml-%E6%B6%88%E6%81%AF +[json 消息]: https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#json-%E6%B6%88%E6%81%AF #### 拓展 CQ 码及与 OneBot 标准有略微差异的 CQ 码 @@ -154,33 +154,33 @@ go-cqhttp 兼容 [OneBot-v11](https://github.com/botuniverse/onebot-11) 绝大 | /set_restart | [重启 go-cqhttp] | | /.handle_quick_operation | [对事件执行快速操作] | -[发送私聊消息]: https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md#send_private_msg-%E5%8F%91%E9%80%81%E7%A7%81%E8%81%8A%E6%B6%88%E6%81%AF -[发送群消息]: https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md#send_group_msg-%E5%8F%91%E9%80%81%E7%BE%A4%E6%B6%88%E6%81%AF -[发送消息]: https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md#send_msg-%E5%8F%91%E9%80%81%E6%B6%88%E6%81%AF -[撤回信息]: https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md#delete_msg-%E6%92%A4%E5%9B%9E%E6%B6%88%E6%81%AF -[群组踢人]: https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md#set_group_kick-%E7%BE%A4%E7%BB%84%E8%B8%A2%E4%BA%BA -[群组单人禁言]: https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md#set_group_ban-%E7%BE%A4%E7%BB%84%E5%8D%95%E4%BA%BA%E7%A6%81%E8%A8%80 -[群组全员禁言]: https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md#set_group_whole_ban-%E7%BE%A4%E7%BB%84%E5%85%A8%E5%91%98%E7%A6%81%E8%A8%80 -[群组设置管理员]: https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md#set_group_admin-%E7%BE%A4%E7%BB%84%E8%AE%BE%E7%BD%AE%E7%AE%A1%E7%90%86%E5%91%98 -[设置群名片(群备注)]: https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md#set_group_card-%E8%AE%BE%E7%BD%AE%E7%BE%A4%E5%90%8D%E7%89%87%E7%BE%A4%E5%A4%87%E6%B3%A8 -[设置群名]: https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md#set_group_name-%E8%AE%BE%E7%BD%AE%E7%BE%A4%E5%90%8D -[退出群组]: https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md#set_group_leave-%E9%80%80%E5%87%BA%E7%BE%A4%E7%BB%84 -[设置群组专属头衔]: https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md#set_group_special_title-%E8%AE%BE%E7%BD%AE%E7%BE%A4%E7%BB%84%E4%B8%93%E5%B1%9E%E5%A4%B4%E8%A1%94 -[处理加好友请求]: https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md#set_friend_add_request-%E5%A4%84%E7%90%86%E5%8A%A0%E5%A5%BD%E5%8F%8B%E8%AF%B7%E6%B1%82 -[处理加群请求/邀请]: https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md#set_group_add_request-%E5%A4%84%E7%90%86%E5%8A%A0%E7%BE%A4%E8%AF%B7%E6%B1%82%E9%82%80%E8%AF%B7 -[获取登录号信息]: https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md#get_login_info-%E8%8E%B7%E5%8F%96%E7%99%BB%E5%BD%95%E5%8F%B7%E4%BF%A1%E6%81%AF -[获取陌生人信息]: https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md#get_stranger_info-%E8%8E%B7%E5%8F%96%E9%99%8C%E7%94%9F%E4%BA%BA%E4%BF%A1%E6%81%AF -[获取好友列表]: https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md#get_friend_list-%E8%8E%B7%E5%8F%96%E5%A5%BD%E5%8F%8B%E5%88%97%E8%A1%A8 -[获取群信息]: https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md#get_group_info-%E8%8E%B7%E5%8F%96%E7%BE%A4%E4%BF%A1%E6%81%AF -[获取群列表]: https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md#get_group_list-%E8%8E%B7%E5%8F%96%E7%BE%A4%E5%88%97%E8%A1%A8 -[获取群成员信息]: https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md#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://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md#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://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#can_send_image-%E6%A3%80%E6%9F%A5%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E5%8F%91%E9%80%81%E5%9B%BE%E7%89%87 -[检查是否可以发送语音]: https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md#can_send_record-%E6%A3%80%E6%9F%A5%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E5%8F%91%E9%80%81%E8%AF%AD%E9%9F%B3 -[获取版本信息]: https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md#get_version_info-%E8%8E%B7%E5%8F%96%E7%89%88%E6%9C%AC%E4%BF%A1%E6%81%AF -[重启 go-cqhttp]: https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md#set_restart-%E9%87%8D%E5%90%AF-onebot-%E5%AE%9E%E7%8E%B0 -[对事件执行快速操作]: https://github.com/howmanybots/onebot/blob/master/v11/specs/api/hidden.md#handle_quick_operation-%E5%AF%B9%E4%BA%8B%E4%BB%B6%E6%89%A7%E8%A1%8C%E5%BF%AB%E9%80%9F%E6%93%8D%E4%BD%9C +[发送私聊消息]: https://github.com/botuniverse/onebot-11/blob/master/api/public.md#send_private_msg-%E5%8F%91%E9%80%81%E7%A7%81%E8%81%8A%E6%B6%88%E6%81%AF +[发送群消息]: https://github.com/botuniverse/onebot-11/blob/master/api/public.md#send_group_msg-%E5%8F%91%E9%80%81%E7%BE%A4%E6%B6%88%E6%81%AF +[发送消息]: https://github.com/botuniverse/onebot-11/blob/master/api/public.md#send_msg-%E5%8F%91%E9%80%81%E6%B6%88%E6%81%AF +[撤回信息]: https://github.com/botuniverse/onebot-11/blob/master/api/public.md#delete_msg-%E6%92%A4%E5%9B%9E%E6%B6%88%E6%81%AF +[群组踢人]: https://github.com/botuniverse/onebot-11/blob/master/api/public.md#set_group_kick-%E7%BE%A4%E7%BB%84%E8%B8%A2%E4%BA%BA +[群组单人禁言]: https://github.com/botuniverse/onebot-11/blob/master/api/public.md#set_group_ban-%E7%BE%A4%E7%BB%84%E5%8D%95%E4%BA%BA%E7%A6%81%E8%A8%80 +[群组全员禁言]: https://github.com/botuniverse/onebot-11/blob/master/api/public.md#set_group_whole_ban-%E7%BE%A4%E7%BB%84%E5%85%A8%E5%91%98%E7%A6%81%E8%A8%80 +[群组设置管理员]: https://github.com/botuniverse/onebot-11/blob/master/api/public.md#set_group_admin-%E7%BE%A4%E7%BB%84%E8%AE%BE%E7%BD%AE%E7%AE%A1%E7%90%86%E5%91%98 +[设置群名片(群备注)]: https://github.com/botuniverse/onebot-11/blob/master/api/public.md#set_group_card-%E8%AE%BE%E7%BD%AE%E7%BE%A4%E5%90%8D%E7%89%87%E7%BE%A4%E5%A4%87%E6%B3%A8 +[设置群名]: https://github.com/botuniverse/onebot-11/blob/master/api/public.md#set_group_name-%E8%AE%BE%E7%BD%AE%E7%BE%A4%E5%90%8D +[退出群组]: https://github.com/botuniverse/onebot-11/blob/master/api/public.md#set_group_leave-%E9%80%80%E5%87%BA%E7%BE%A4%E7%BB%84 +[设置群组专属头衔]: https://github.com/botuniverse/onebot-11/blob/master/api/public.md#set_group_special_title-%E8%AE%BE%E7%BD%AE%E7%BE%A4%E7%BB%84%E4%B8%93%E5%B1%9E%E5%A4%B4%E8%A1%94 +[处理加好友请求]: https://github.com/botuniverse/onebot-11/blob/master/api/public.md#set_friend_add_request-%E5%A4%84%E7%90%86%E5%8A%A0%E5%A5%BD%E5%8F%8B%E8%AF%B7%E6%B1%82 +[处理加群请求/邀请]: https://github.com/botuniverse/onebot-11/blob/master/api/public.md#set_group_add_request-%E5%A4%84%E7%90%86%E5%8A%A0%E7%BE%A4%E8%AF%B7%E6%B1%82%E9%82%80%E8%AF%B7 +[获取登录号信息]: https://github.com/botuniverse/onebot-11/blob/master/api/public.md#get_login_info-%E8%8E%B7%E5%8F%96%E7%99%BB%E5%BD%95%E5%8F%B7%E4%BF%A1%E6%81%AF +[获取陌生人信息]: https://github.com/botuniverse/onebot-11/blob/master/api/public.md#get_stranger_info-%E8%8E%B7%E5%8F%96%E9%99%8C%E7%94%9F%E4%BA%BA%E4%BF%A1%E6%81%AF +[获取好友列表]: https://github.com/botuniverse/onebot-11/blob/master/api/public.md#get_friend_list-%E8%8E%B7%E5%8F%96%E5%A5%BD%E5%8F%8B%E5%88%97%E8%A1%A8 +[获取群信息]: https://github.com/botuniverse/onebot-11/blob/master/api/public.md#get_group_info-%E8%8E%B7%E5%8F%96%E7%BE%A4%E4%BF%A1%E6%81%AF +[获取群列表]: https://github.com/botuniverse/onebot-11/blob/master/api/public.md#get_group_list-%E8%8E%B7%E5%8F%96%E7%BE%A4%E5%88%97%E8%A1%A8 +[获取群成员信息]: https://github.com/botuniverse/onebot-11/blob/master/api/public.md#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://github.com/botuniverse/onebot-11/blob/master/api/public.md#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://github.com/botuniverse/onebot-11/blob/master/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/botuniverse/onebot-11/blob/master/api/public.md#can_send_image-%E6%A3%80%E6%9F%A5%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E5%8F%91%E9%80%81%E5%9B%BE%E7%89%87 +[检查是否可以发送语音]: https://github.com/botuniverse/onebot-11/blob/master/api/public.md#can_send_record-%E6%A3%80%E6%9F%A5%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E5%8F%91%E9%80%81%E8%AF%AD%E9%9F%B3 +[获取版本信息]: https://github.com/botuniverse/onebot-11/blob/master/api/public.md#get_version_info-%E8%8E%B7%E5%8F%96%E7%89%88%E6%9C%AC%E4%BF%A1%E6%81%AF +[重启 go-cqhttp]: https://github.com/botuniverse/onebot-11/blob/master/api/public.md#set_restart-%E9%87%8D%E5%90%AF-onebot-%E5%AE%9E%E7%8E%B0 +[对事件执行快速操作]: https://github.com/botuniverse/onebot-11/blob/master/api/hidden.md#handle_quick_operation-%E5%AF%B9%E4%BA%8B%E4%BB%B6%E6%89%A7%E8%A1%8C%E5%BF%AB%E9%80%9F%E6%93%8D%E4%BD%9C #### 拓展 API 及与 OneBot 标准有略微差异的 API @@ -239,21 +239,21 @@ go-cqhttp 兼容 [OneBot-v11](https://github.com/botuniverse/onebot-11) 绝大 | 请求事件 | [加好友请求] | | 请求事件 | [加群请求/邀请] | -[私聊信息]: https://github.com/howmanybots/onebot/blob/master/v11/specs/event/message.md#%E7%A7%81%E8%81%8A%E6%B6%88%E6%81%AF -[群消息]: https://github.com/howmanybots/onebot/blob/master/v11/specs/event/message.md#%E7%BE%A4%E6%B6%88%E6%81%AF -[群文件上传]: https://github.com/howmanybots/onebot/blob/master/v11/specs/event/notice.md#%E7%BE%A4%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0 -[群管理员变动]: https://github.com/howmanybots/onebot/blob/master/v11/specs/event/notice.md#%E7%BE%A4%E7%AE%A1%E7%90%86%E5%91%98%E5%8F%98%E5%8A%A8 -[群成员减少]: https://github.com/howmanybots/onebot/blob/master/v11/specs/event/notice.md#%E7%BE%A4%E6%88%90%E5%91%98%E5%87%8F%E5%B0%91 -[群成员增加]: https://github.com/howmanybots/onebot/blob/master/v11/specs/event/notice.md#%E7%BE%A4%E6%88%90%E5%91%98%E5%A2%9E%E5%8A%A0 -[群禁言]: https://github.com/howmanybots/onebot/blob/master/v11/specs/event/notice.md#%E7%BE%A4%E7%A6%81%E8%A8%80 -[好友添加]: https://github.com/howmanybots/onebot/blob/master/v11/specs/event/notice.md#%E5%A5%BD%E5%8F%8B%E6%B7%BB%E5%8A%A0 -[群消息撤回]: https://github.com/howmanybots/onebot/blob/master/v11/specs/event/notice.md#%E7%BE%A4%E6%B6%88%E6%81%AF%E6%92%A4%E5%9B%9E -[好友消息撤回]: https://github.com/howmanybots/onebot/blob/master/v11/specs/event/notice.md#%E5%A5%BD%E5%8F%8B%E6%B6%88%E6%81%AF%E6%92%A4%E5%9B%9E -[群内戳一戳]: https://github.com/howmanybots/onebot/blob/master/v11/specs/event/notice.md#%E7%BE%A4%E5%86%85%E6%88%B3%E4%B8%80%E6%88%B3 -[群红包运气王]: https://github.com/howmanybots/onebot/blob/master/v11/specs/event/notice.md#%E7%BE%A4%E7%BA%A2%E5%8C%85%E8%BF%90%E6%B0%94%E7%8E%8B -[群成员荣誉变更]: https://github.com/howmanybots/onebot/blob/master/v11/specs/event/notice.md#%E7%BE%A4%E6%88%90%E5%91%98%E8%8D%A3%E8%AA%89%E5%8F%98%E6%9B%B4 -[加好友请求]: https://github.com/howmanybots/onebot/blob/master/v11/specs/event/request.md#%E5%8A%A0%E5%A5%BD%E5%8F%8B%E8%AF%B7%E6%B1%82 -[加群请求/邀请]: https://github.com/howmanybots/onebot/blob/master/v11/specs/event/request.md#%E5%8A%A0%E7%BE%A4%E8%AF%B7%E6%B1%82%E9%82%80%E8%AF%B7 +[私聊信息]: https://github.com/botuniverse/onebot-11/blob/master/event/message.md#%E7%A7%81%E8%81%8A%E6%B6%88%E6%81%AF +[群消息]: https://github.com/botuniverse/onebot-11/blob/master/event/message.md#%E7%BE%A4%E6%B6%88%E6%81%AF +[群文件上传]: https://github.com/botuniverse/onebot-11/blob/master/event/notice.md#%E7%BE%A4%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0 +[群管理员变动]: https://github.com/botuniverse/onebot-11/blob/master/event/notice.md#%E7%BE%A4%E7%AE%A1%E7%90%86%E5%91%98%E5%8F%98%E5%8A%A8 +[群成员减少]: https://github.com/botuniverse/onebot-11/blob/master/event/notice.md#%E7%BE%A4%E6%88%90%E5%91%98%E5%87%8F%E5%B0%91 +[群成员增加]: https://github.com/botuniverse/onebot-11/blob/master/event/notice.md#%E7%BE%A4%E6%88%90%E5%91%98%E5%A2%9E%E5%8A%A0 +[群禁言]: https://github.com/botuniverse/onebot-11/blob/master/event/notice.md#%E7%BE%A4%E7%A6%81%E8%A8%80 +[好友添加]: https://github.com/botuniverse/onebot-11/blob/master/event/notice.md#%E5%A5%BD%E5%8F%8B%E6%B7%BB%E5%8A%A0 +[群消息撤回]: https://github.com/botuniverse/onebot-11/blob/master/event/notice.md#%E7%BE%A4%E6%B6%88%E6%81%AF%E6%92%A4%E5%9B%9E +[好友消息撤回]: https://github.com/botuniverse/onebot-11/blob/master/event/notice.md#%E5%A5%BD%E5%8F%8B%E6%B6%88%E6%81%AF%E6%92%A4%E5%9B%9E +[群内戳一戳]: https://github.com/botuniverse/onebot-11/blob/master/event/notice.md#%E7%BE%A4%E5%86%85%E6%88%B3%E4%B8%80%E6%88%B3 +[群红包运气王]: https://github.com/botuniverse/onebot-11/blob/master/event/notice.md#%E7%BE%A4%E7%BA%A2%E5%8C%85%E8%BF%90%E6%B0%94%E7%8E%8B +[群成员荣誉变更]: https://github.com/botuniverse/onebot-11/blob/master/event/notice.md#%E7%BE%A4%E6%88%90%E5%91%98%E8%8D%A3%E8%AA%89%E5%8F%98%E6%9B%B4 +[加好友请求]: https://github.com/botuniverse/onebot-11/blob/master/event/request.md#%E5%8A%A0%E5%A5%BD%E5%8F%8B%E8%AF%B7%E6%B1%82 +[加群请求/邀请]: https://github.com/botuniverse/onebot-11/blob/master/event/request.md#%E5%8A%A0%E7%BE%A4%E8%AF%B7%E6%B1%82%E9%82%80%E8%AF%B7 #### 拓展 Event diff --git a/docs/EventFilter.md b/docs/EventFilter.md index 9226b7a..6911f59 100644 --- a/docs/EventFilter.md +++ b/docs/EventFilter.md @@ -163,9 +163,9 @@ ## 过滤时的事件数据对象 -过滤器在go-cqhttp构建好事件数据后运行,各事件的数据字段见[OneBot标准]( https://github.com/howmanybots/onebot/blob/master/v11/specs/event/README.md )。 +过滤器在go-cqhttp构建好事件数据后运行,各事件的数据字段见[OneBot标准]( https://github.com/botuniverse/onebot-11/blob/master/event/README.md )。 这里有几点需要注意: -- `message` 字段在运行过滤器时和上报信息类型相同(见 [消息格式]( https://github.com/howmanybots/onebot/blob/master/v11/specs/message/array.md )) +- `message` 字段在运行过滤器时和上报信息类型相同(见 [消息格式]( https://github.com/botuniverse/onebot-11/blob/master/message/array.md )) - `raw_message` 字段为未经**CQ码**处理的原始消息字符串,这意味着其中可能会出现形如 `[CQ:face,id=123]` 的 CQ 码 From f772996418d6e2b14c510fb879eecc8350996d2e Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Sat, 25 Jun 2022 17:40:15 +0800 Subject: [PATCH 06/95] fix #1556 --- coolq/api.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/coolq/api.go b/coolq/api.go index 82a8118..a16636e 100644 --- a/coolq/api.go +++ b/coolq/api.go @@ -873,17 +873,17 @@ func (bot *CQBot) uploadForwardElement(m gjson.Result, target int64, sourceType } if e.Get("data.id").Exists() { i := e.Get("data.id").Int() - m, _ := db.GetGroupMessageByGlobalID(int32(i)) + m, _ := db.GetMessageByGlobalID(int32(i)) if m != nil { - msgTime := m.Attribute.Timestamp + msgTime := m.GetAttribute().Timestamp if msgTime == 0 { msgTime = ts.Unix() } return &message.ForwardNode{ - SenderId: m.Attribute.SenderUin, - SenderName: m.Attribute.SenderName, + SenderId: m.GetAttribute().SenderUin, + SenderName: m.GetAttribute().SenderName, Time: int32(msgTime), - Message: resolveElement(bot.ConvertContentMessage(m.Content, message.SourceGroup)), + Message: resolveElement(bot.ConvertContentMessage(m.GetContent(), message.SourceGroup)), } } log.Warnf("警告: 引用消息 %v 错误或数据库未开启.", e.Get("data.id").Str) From 7e750352c4e16339393e4ea531e0f46dfee3d957 Mon Sep 17 00:00:00 2001 From: Akiba Date: Sat, 25 Jun 2022 21:06:37 +0800 Subject: [PATCH 07/95] fix: #1558 --- coolq/api.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/coolq/api.go b/coolq/api.go index a16636e..7b5b95f 100644 --- a/coolq/api.go +++ b/coolq/api.go @@ -875,6 +875,12 @@ func (bot *CQBot) uploadForwardElement(m gjson.Result, target int64, sourceType i := e.Get("data.id").Int() m, _ := db.GetMessageByGlobalID(int32(i)) if m != nil { + mSource := func() message.SourceType { + if m.GetType() == "group" { + return message.SourceGroup + } + return message.SourcePrivate + }() msgTime := m.GetAttribute().Timestamp if msgTime == 0 { msgTime = ts.Unix() @@ -883,7 +889,7 @@ func (bot *CQBot) uploadForwardElement(m gjson.Result, target int64, sourceType SenderId: m.GetAttribute().SenderUin, SenderName: m.GetAttribute().SenderName, Time: int32(msgTime), - Message: resolveElement(bot.ConvertContentMessage(m.GetContent(), message.SourceGroup)), + Message: resolveElement(bot.ConvertContentMessage(m.GetContent(), mSource)), } } log.Warnf("警告: 引用消息 %v 错误或数据库未开启.", e.Get("data.id").Str) @@ -916,7 +922,7 @@ func (bot *CQBot) uploadForwardElement(m gjson.Result, target int64, sourceType } } } - content := bot.ConvertObjectMessage(c, message.SourceGroup) + content := bot.ConvertObjectMessage(c, sourceType) if uin != 0 && name != "" && len(content) > 0 { return &message.ForwardNode{ SenderId: uin, From a0fba6ad540e5cfdd9e06c8b90fb81260faa0ded Mon Sep 17 00:00:00 2001 From: Akiba Date: Sat, 25 Jun 2022 21:21:16 +0800 Subject: [PATCH 08/95] fix: #1557 --- coolq/api.go | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/coolq/api.go b/coolq/api.go index 7b5b95f..e1186df 100644 --- a/coolq/api.go +++ b/coolq/api.go @@ -832,7 +832,12 @@ func (bot *CQBot) uploadForwardElement(m gjson.Result, target int64, sourceType groupID := target source := message.Source{SourceType: sourceType, PrimaryID: target} if sourceType == message.SourcePrivate { - groupID = 0 + // ios 设备的合并转发来源群号不能为 0 + if len(bot.Client.GroupList) == 0 { + groupID = 1 + } else { + groupID = bot.Client.GroupList[1].Uin + } } builder := bot.Client.NewForwardMessageBuilder(groupID) @@ -875,12 +880,10 @@ func (bot *CQBot) uploadForwardElement(m gjson.Result, target int64, sourceType i := e.Get("data.id").Int() m, _ := db.GetMessageByGlobalID(int32(i)) if m != nil { - mSource := func() message.SourceType { - if m.GetType() == "group" { - return message.SourceGroup - } - return message.SourcePrivate - }() + mSource := message.SourcePrivate + if m.GetType() == "group" { + mSource = message.SourceGroup + } msgTime := m.GetAttribute().Timestamp if msgTime == 0 { msgTime = ts.Unix() From 551a475c1c7236510e11f0caca53b4fcf2d59d28 Mon Sep 17 00:00:00 2001 From: xiangxiangxiong9 <1296976552@qq.com> Date: Sun, 26 Jun 2022 14:50:11 +0800 Subject: [PATCH 09/95] =?UTF-8?q?=E7=94=A8upload=5Fgroup=5Ffile=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E7=A7=81=E8=81=8A=E6=96=87=E4=BB=B6=3F=E4=B8=8D?= =?UTF-8?q?=E5=BA=94=E8=AF=A5=E6=98=AFupload=5Fprivate=5Ffile=E5=90=97qwq?= =?UTF-8?q?=20(#1560)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/cqhttp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cqhttp.md b/docs/cqhttp.md index 9d5f3fe..3b30884 100644 --- a/docs/cqhttp.md +++ b/docs/cqhttp.md @@ -898,7 +898,7 @@ Type: `rps` ### 上传私聊文件 -终结点: `/upload_group_file` +终结点: `/upload_private_file` **参数** From 36bf579e0f42f6363dfa9d2894d1e623baa5452a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E8=91=89=E6=9D=8F?= Date: Sat, 9 Jul 2022 12:57:53 +0800 Subject: [PATCH 10/95] feat: del group notice (#1567) * update dep * feat: _del_group_notice * doc: get_group_notice && del_group_notice --- coolq/api.go | 17 +++++++++++++ docs/cqhttp.md | 63 +++++++++++++++++++++++++++++++++++++++++++--- go.mod | 4 +-- go.sum | 8 +++--- modules/api/api.go | 4 +++ 5 files changed, 87 insertions(+), 9 deletions(-) diff --git a/coolq/api.go b/coolq/api.go index e1186df..63307f8 100644 --- a/coolq/api.go +++ b/coolq/api.go @@ -1114,6 +1114,23 @@ func (bot *CQBot) CQSetGroupMemo(groupID int64, msg, img string) global.MSG { return Failed(100, "GROUP_NOT_FOUND", "群聊不存在") } +// CQDelGroupMemo 扩展API-删除群公告 +// @route(_del_group_notice) +// @rename(fid->notice_id) +func (bot *CQBot) CQDelGroupMemo(groupID int64, fid string) global.MSG { + if g := bot.Client.FindGroup(groupID); g != nil { + if g.SelfPermission() == client.Member { + return Failed(100, "PERMISSION_DENIED", "权限不足") + } + err := bot.Client.DelGroupNotice(groupID, fid) + if err != nil { + return Failed(100, "DELETE_NOTICE_ERROR", err.Error()) + } + return OK(nil) + } + return Failed(100, "GROUP_NOT_FOUND", "群聊不存在") +} + // CQSetGroupKick 群组踢人 // // https://git.io/Jtz1V diff --git a/docs/cqhttp.md b/docs/cqhttp.md index 3b30884..2f6dbb3 100644 --- a/docs/cqhttp.md +++ b/docs/cqhttp.md @@ -42,6 +42,8 @@ - [设置群名](#设置群名) - [获取用户VIP信息](#获取用户vip信息) - [发送群公告](#发送群公告) +- [获取群公告](#获取群公告) +- [删除群公告](#删除群公告) - [设置精华消息](#设置精华消息) - [移出精华消息](#移出精华消息) - [获取精华消息列表](#获取精华消息列表) @@ -244,7 +246,8 @@ Type: `node` | `seq` | message | 具体消息 | 用于自定义消息 | 特殊说明: **需要使用单独的API `/send_group_forward_msg` 发送,并且由于消息段较为复杂,仅支持Array形式入参。 如果引用消息和自定义消息同时出现,实际查看顺序将取消息段顺序. -另外按 [Onebot v11](https://github.com/botuniverse/onebot-11/blob/master/message/array.md) 文档说明, `data` 应全为字符串, 但由于需要接收`message` 类型的消息, 所以 *仅限此Type的content字段* 支持Array套娃** +另外按 [Onebot v11](https://github.com/botuniverse/onebot-11/blob/master/message/array.md) 文档说明, `data` 应全为字符串, +但由于需要接收`message` 类型的消息, 所以 *仅限此Type的content字段* 支持Array套娃** 示例: @@ -627,7 +630,7 @@ Type: `rps` ### 发送合并转发(群/私聊) -终结点: `/send_group_forward_msg`, `send_private_forward_msg`, `send_forward_msg` +终结点: `/send_group_forward_msg`, `send_private_forward_msg`, `send_forward_msg` **参数** @@ -1108,13 +1111,67 @@ JSON数组: `该 API 没有响应数据` +### 获取群公告 + +终结点: `/_get_group_notice` + +**参数** + +| 字段名 | 数据类型 | 默认值 | 说明 | +| ---------- | -------- | ------ | -------- | +| `group_id` | int64 | | 群号 | + +**响应数据** + +数组信息: + +| 字段名 | 数据类型 | 默认值 | 说明 | +|----------------|--------| ------ |-------| +| `notice_id` | string | | 公告id | +| `sender_id` | string | | 发布者id | +| `publish_time` | string | | 发布时间 | +| `message` | GroupNoticeMessage | | 公告id | + +响应示例 + +```json +{ + "data": [ + { + "notice_id": "8850de2e00000000cc6bbd628a150c00", + "sender_id": 1111111, + "publish_time": 1656581068, + "message": { + "text": "这是一条公告", + "images": [] + } + } + ], + "retcode": 0, + "status": "ok" +} +``` + +### 删除群公告 + +终结点: `/_del_group_notice` + +**参数** + +| 字段名 | 数据类型 | 默认值 | 说明 | +|-------------| -------- | ------ |------| +| `group_id` | int64 | | 群号 | +| `notice_id` | string | | 公告id | + +`该 API 没有响应数据` + ### 获取单向好友列表 终结点: `/get_unidirectional_friend_list` **响应数据** -数组信息: +数组信息: | 字段 | 类型 | 说明 | | ------------- | ------ | -------- | diff --git a/go.mod b/go.mod index 5b20851..e9908ea 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.18 require ( github.com/Microsoft/go-winio v0.5.1 - github.com/Mrs4s/MiraiGo v0.0.0-20220622015746-24ee0103e7de + github.com/Mrs4s/MiraiGo v0.0.0-20220630160133-a39b3fdd962f github.com/RomiChan/syncx v0.0.0-20220404072119-d7ea0ae15a4c github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc github.com/fumiama/go-base16384 v1.5.2 @@ -26,7 +26,7 @@ require ( ) require ( - github.com/RomiChan/protobuf v0.1.1-0.20220602121309-9e3b8cbefd7a // indirect + github.com/RomiChan/protobuf v0.1.1-0.20220624030127-3310cba9dbc0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/fumiama/imgsz v0.0.2 // indirect github.com/go-stack/stack v1.8.0 // indirect diff --git a/go.sum b/go.sum index 6bdf510..62f01ce 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,9 @@ github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY= github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Mrs4s/MiraiGo v0.0.0-20220622015746-24ee0103e7de h1:senbiV71dgsYt60BWLEHWwvKFCYUcIzGQ/fmXRaOeQ4= -github.com/Mrs4s/MiraiGo v0.0.0-20220622015746-24ee0103e7de/go.mod h1:mZp8Lt7uqLCUwSLouB2yuiP467Cwl4mnG9IMAaXUKA0= -github.com/RomiChan/protobuf v0.1.1-0.20220602121309-9e3b8cbefd7a h1:WIfEWYj82oEuPtm5pqlyQmCJCoiw00C6ugZFqHA0cC8= -github.com/RomiChan/protobuf v0.1.1-0.20220602121309-9e3b8cbefd7a/go.mod h1:2Ie+hdBFQpQFDHfeklgxoFmQRCE7O+KwFpISeXq7OwA= +github.com/Mrs4s/MiraiGo v0.0.0-20220630160133-a39b3fdd962f h1:PHOwN3/cEL/zoBpcJJXwx1mJ1NL901zrt2mvlQUO5BA= +github.com/Mrs4s/MiraiGo v0.0.0-20220630160133-a39b3fdd962f/go.mod h1:Ow7nlaVS5FztyjrTlTRSG7HLpTNmgINMluHRCgKunDI= +github.com/RomiChan/protobuf v0.1.1-0.20220624030127-3310cba9dbc0 h1:+UGPBYVjssFsdahLJIiNPwpmmwgl/OaVdv1oc5NonC0= +github.com/RomiChan/protobuf v0.1.1-0.20220624030127-3310cba9dbc0/go.mod h1:2Ie+hdBFQpQFDHfeklgxoFmQRCE7O+KwFpISeXq7OwA= github.com/RomiChan/syncx v0.0.0-20220404072119-d7ea0ae15a4c h1:cNPOdTNiVwxLpROLjXCgbIPvdkE+BwvxDvgmdYmWx6Q= github.com/RomiChan/syncx v0.0.0-20220404072119-d7ea0ae15a4c/go.mod h1:KqZzu7slNKROh3TSYEH/IUMG6f4M+1qubZ5e52QypsE= github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc h1:AAx50/fb/xS4lvsdQg+bFbGvqSDhyV1MF+p2PLCamZ0= diff --git a/modules/api/api.go b/modules/api/api.go index c57ce26..e13f8c8 100644 --- a/modules/api/api.go +++ b/modules/api/api.go @@ -21,6 +21,10 @@ func (c *Caller) call(action string, p Getter) global.MSG { case ".ocr_image", "ocr_image": p0 := p.Get("image").String() return c.bot.CQOcrImage(p0) + case "_del_group_notice": + p0 := p.Get("group_id").Int() + p1 := p.Get("notice_id").String() + return c.bot.CQDelGroupMemo(p0, p1) case "_get_group_notice": p0 := p.Get("group_id").Int() return c.bot.CQGetGroupMemo(p0) From 7a979c862f72e2e166b5d75c6319602f59568326 Mon Sep 17 00:00:00 2001 From: yuanyan3060 <1846865993@qq.com> Date: Wed, 13 Jul 2022 02:16:25 +0800 Subject: [PATCH 11/95] =?UTF-8?q?fix=20a=20bug=20=E4=BD=BF=E7=94=A8mongodb?= =?UTF-8?q?=E6=97=B6=20image=E7=9A=84=20subtype=E4=BC=9A=E8=A2=AB=E5=AD=98?= =?UTF-8?q?=E5=82=A8=E4=B8=BANumberLong=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- coolq/cqcode.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/coolq/cqcode.go b/coolq/cqcode.go index 18c70ee..7505576 100644 --- a/coolq/cqcode.go +++ b/coolq/cqcode.go @@ -733,7 +733,12 @@ func (bot *CQBot) ConvertContentMessage(content []global.MSG, sourceType message case *message.GroupImageElement: img.Flash = flash img.EffectID = id - img.ImageBizType = message.ImageBizType(data["subType"].(uint32)) + switch data["subType"].(type) { + case int64: + img.ImageBizType = message.ImageBizType(data["subType"].(int64)) + default: + img.ImageBizType = message.ImageBizType(data["subType"].(uint32)) + } case *message.FriendImageElement: img.Flash = flash } From 93074ef4af0c484e8fd81b8b095a1c1f647240d6 Mon Sep 17 00:00:00 2001 From: Shigma Date: Sat, 13 Aug 2022 00:01:04 +0800 Subject: [PATCH 12/95] feat: support manually input ticket --- cmd/gocq/login.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/cmd/gocq/login.go b/cmd/gocq/login.go index 20c10e1..44f64eb 100644 --- a/cmd/gocq/login.go +++ b/cmd/gocq/login.go @@ -151,7 +151,7 @@ func loginResponseProcessor(res *client.LoginResponse) error { log.Warn("请输入(1 - 2) (将在10秒后自动选择1):") text = readLineTimeout(time.Second*10, "1") if strings.Contains(text, "1") { - ticket := sliderCaptchaProcessor(res.VerifyUrl) + ticket := getTicket(res.VerifyUrl) if ticket == "" { os.Exit(0) } @@ -218,9 +218,19 @@ func loginResponseProcessor(res *client.LoginResponse) error { } } -func sliderCaptchaProcessor(u string) string { +func getTicket(u string) (str string) { id := utils.RandomString(8) - log.Warnf("请前往该地址验证 -> %v", strings.ReplaceAll(u, "https://ssl.captcha.qq.com/template/wireless_mqq_captcha.html?", fmt.Sprintf("https://captcha.go-cqhttp.org/captcha?id=%v&", id))) + log.Warnf("请前往该地址验证 -> %v <- 或输入手动抓取的 ticket:(Enter 提交)", strings.ReplaceAll(u, "https://ssl.captcha.qq.com/template/wireless_mqq_captcha.html?", fmt.Sprintf("https://captcha.go-cqhttp.org/captcha?id=%v&", id))) + r := make(chan string) + select { + case r <- readLine(): + case r <- sliderCaptchaProcessor(id): + } + str = <-r + return +} + +func sliderCaptchaProcessor(id string) string { start := time.Now() for time.Since(start).Minutes() < 2 { time.Sleep(time.Second) From bf5562b6dd68eac2d1ed72c29c340595e415e435 Mon Sep 17 00:00:00 2001 From: Shigma Date: Sat, 13 Aug 2022 00:56:43 +0800 Subject: [PATCH 13/95] refa: use ticker for fetchCaptcha() --- cmd/gocq/login.go | 52 ++++++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/cmd/gocq/login.go b/cmd/gocq/login.go index 44f64eb..38770c7 100644 --- a/cmd/gocq/login.go +++ b/cmd/gocq/login.go @@ -221,29 +221,39 @@ func loginResponseProcessor(res *client.LoginResponse) error { func getTicket(u string) (str string) { id := utils.RandomString(8) log.Warnf("请前往该地址验证 -> %v <- 或输入手动抓取的 ticket:(Enter 提交)", strings.ReplaceAll(u, "https://ssl.captcha.qq.com/template/wireless_mqq_captcha.html?", fmt.Sprintf("https://captcha.go-cqhttp.org/captcha?id=%v&", id))) - r := make(chan string) - select { - case r <- readLine(): - case r <- sliderCaptchaProcessor(id): - } - str = <-r - return -} - -func sliderCaptchaProcessor(id string) string { - start := time.Now() - for time.Since(start).Minutes() < 2 { - time.Sleep(time.Second) - data, err := global.GetBytes("https://captcha.go-cqhttp.org/captcha/ticket?id=" + id) - if err != nil { - log.Warnf("获取 Ticket 时出现错误: %v", err) - return "" - } - g := gjson.ParseBytes(data) - if g.Get("ticket").Exists() { - return g.Get("ticket").String() + manual := make(chan string) + go func() { + str = readLine() + manual <- str + }() + ticker := time.NewTicker(time.Second) + for count := 120; count > 0; count-- { + select { + case <-ticker.C: + str = fetchCaptcha(id) + if str != "" { + ticker.Stop() + return + } + case <-manual: + ticker.Stop() + return } } + ticker.Stop() log.Warnf("验证超时") return "" } + +func fetchCaptcha(id string) string { + data, err := global.GetBytes("https://captcha.go-cqhttp.org/captcha/ticket?id=" + id) + if err != nil { + log.Warnf("获取 Ticket 时出现错误: %v", err) + return "" + } + g := gjson.ParseBytes(data) + if g.Get("ticket").Exists() { + return g.Get("ticket").String() + } + return "" +} From 08b0837cab325dee51845fd271aeafcfb709a870 Mon Sep 17 00:00:00 2001 From: Shigma Date: Sat, 13 Aug 2022 01:04:29 +0800 Subject: [PATCH 14/95] fix: fix string racing --- cmd/gocq/login.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/cmd/gocq/login.go b/cmd/gocq/login.go index 38770c7..d963d25 100644 --- a/cmd/gocq/login.go +++ b/cmd/gocq/login.go @@ -221,26 +221,23 @@ func loginResponseProcessor(res *client.LoginResponse) error { func getTicket(u string) (str string) { id := utils.RandomString(8) log.Warnf("请前往该地址验证 -> %v <- 或输入手动抓取的 ticket:(Enter 提交)", strings.ReplaceAll(u, "https://ssl.captcha.qq.com/template/wireless_mqq_captcha.html?", fmt.Sprintf("https://captcha.go-cqhttp.org/captcha?id=%v&", id))) - manual := make(chan string) + manual := make(chan string, 1) go func() { - str = readLine() - manual <- str + manual <- readLine() }() ticker := time.NewTicker(time.Second) + defer ticker.Stop() for count := 120; count > 0; count-- { select { case <-ticker.C: str = fetchCaptcha(id) if str != "" { - ticker.Stop() return } - case <-manual: - ticker.Stop() + case str = <-manual: return } } - ticker.Stop() log.Warnf("验证超时") return "" } From 933bdee18e6865f13a9ce7be1f8d9b6f8d4a39a7 Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Sun, 14 Aug 2022 01:40:14 +0800 Subject: [PATCH 15/95] optimize the return value of group-message sending error --- coolq/api.go | 6 +++--- coolq/bot.go | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/coolq/api.go b/coolq/api.go index 63307f8..81f7ded 100644 --- a/coolq/api.go +++ b/coolq/api.go @@ -765,9 +765,9 @@ func (bot *CQBot) CQSendGroupMessage(groupID int64, m gjson.Result, autoEscape b } } fixAt(elem) - mid := bot.SendGroupMessage(groupID, &message.SendingMessage{Elements: elem}) - if mid == -1 { - return Failed(100, "SEND_MSG_API_ERROR", "请参考 go-cqhttp 端输出") + mid, err := bot.SendGroupMessage(groupID, &message.SendingMessage{Elements: elem}) + if err != nil { + return Failed(100, "SEND_MSG_API_ERROR", err.Error()) } log.Infof("发送群 %v(%v) 的消息: %v (%v)", group.Name, groupID, limitedString(m.String()), mid) return OK(global.MSG{"message_id": mid}) diff --git a/coolq/bot.go b/coolq/bot.go index 1772248..126de63 100644 --- a/coolq/bot.go +++ b/coolq/bot.go @@ -248,7 +248,7 @@ func (bot *CQBot) uploadMedia(target message.Source, elements []message.IMessage } // SendGroupMessage 发送群消息 -func (bot *CQBot) SendGroupMessage(groupID int64, m *message.SendingMessage) int32 { +func (bot *CQBot) SendGroupMessage(groupID int64, m *message.SendingMessage) (int32, error) { newElem := make([]message.IMessageElement, 0, len(m.Elements)) group := bot.Client.FindGroup(groupID) source := message.Source{ @@ -264,14 +264,14 @@ func (bot *CQBot) SendGroupMessage(groupID int64, m *message.SendingMessage) int mem.Poke() } } - return 0 + return 0, nil case *message.MusicShareElement: ret, err := bot.Client.SendGroupMusicShare(groupID, i) if err != nil { log.Warnf("警告: 群 %v 富文本消息发送失败: %v", groupID, err) - return -1 + return -1, errors.Wrap(err, "send group music share error") } - return bot.InsertGroupMessage(ret) + return bot.InsertGroupMessage(ret), nil case *message.AtElement: if i.Target == 0 && group.SelfPermission() == client.Member { e = message.NewText("@全体成员") @@ -281,16 +281,16 @@ func (bot *CQBot) SendGroupMessage(groupID int64, m *message.SendingMessage) int } if len(newElem) == 0 { log.Warnf("群消息发送失败: 消息为空.") - return -1 + return -1, errors.New("empty message") } m.Elements = newElem bot.checkMedia(newElem, groupID) ret := bot.Client.SendGroupMessage(groupID, m) if ret == nil || ret.Id == -1 { log.Warnf("群消息发送失败: 账号可能被风控.") - return -1 + return -1, errors.New("send group message failed: blocked by server") } - return bot.InsertGroupMessage(ret) + return bot.InsertGroupMessage(ret), nil } // SendPrivateMessage 发送私聊消息 From 656dc6b1035c8b6d40c4cc8c2565a15d7785ca50 Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Sun, 28 Aug 2022 17:33:35 +0800 Subject: [PATCH 16/95] all: fix golangci-lint --- .github/workflows/golint.yml | 6 ------ .golangci.yml | 20 ++++++++------------ coolq/cqcode.go | 8 ++++---- global/net.go | 25 +++++++++++-------------- main.go | 1 + server/http.go | 4 ++-- server/scf.go | 2 +- 7 files changed, 27 insertions(+), 39 deletions(-) diff --git a/.github/workflows/golint.yml b/.github/workflows/golint.yml index fb9cc4d..6ab8830 100644 --- a/.github/workflows/golint.yml +++ b/.github/workflows/golint.yml @@ -19,12 +19,6 @@ jobs: with: version: latest - - name: Static Check - uses: dominikh/staticcheck-action@v1.2.0 - with: - install-go: false - version: "2022.1" - - name: Tests run: | go test $(go list ./...) diff --git a/.golangci.yml b/.golangci.yml index 0a87b86..5f654d6 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -21,10 +21,8 @@ linters: disable-all: true fast: false enable: - #- bodyclose - #- deadcode - #- depguard - #- dogsled + - bodyclose + - durationcheck - gofmt - goimports - errcheck @@ -32,18 +30,16 @@ linters: - exhaustive - bidichk - gocritic - #- gosimple + - gosimple - govet - ineffassign #- nolintlint - #- rowserrcheck - #- staticcheck - - structcheck - #- stylecheck + - staticcheck + - stylecheck - unconvert - #- unparam - #- unused - - varcheck + - usestdlibvars + - unparam + - unused - whitespace - prealloc - predeclared diff --git a/coolq/cqcode.go b/coolq/cqcode.go index 7505576..283213b 100644 --- a/coolq/cqcode.go +++ b/coolq/cqcode.go @@ -733,11 +733,11 @@ func (bot *CQBot) ConvertContentMessage(content []global.MSG, sourceType message case *message.GroupImageElement: img.Flash = flash img.EffectID = id - switch data["subType"].(type) { + switch sub := data["subType"].(type) { case int64: - img.ImageBizType = message.ImageBizType(data["subType"].(int64)) - default: - img.ImageBizType = message.ImageBizType(data["subType"].(uint32)) + img.ImageBizType = message.ImageBizType(sub) + case uint32: + img.ImageBizType = message.ImageBizType(sub) } case *message.FriendImageElement: img.Flash = flash diff --git a/global/net.go b/global/net.go index 6011232..0327a7e 100644 --- a/global/net.go +++ b/global/net.go @@ -5,7 +5,6 @@ import ( "compress/gzip" "fmt" "io" - "io/ioutil" "net/http" "net/url" "os" @@ -52,7 +51,7 @@ func GetBytes(url string) ([]byte, error) { defer func() { _ = reader.Close() }() - return ioutil.ReadAll(reader) + return io.ReadAll(reader) } // DownloadFile 将给定URL对应的文件下载至给定Path @@ -62,7 +61,7 @@ func DownloadFile(url, path string, limit int64, headers map[string]string) erro return err } defer file.Close() - req, err := http.NewRequest("GET", url, nil) + req, err := http.NewRequest(http.MethodGet, url, nil) if err != nil { return err } @@ -112,7 +111,7 @@ func DownloadFileMultiThreading(url, path string, limit int64, threadCount int, } return errUnsupportedMultiThreading } - req, err := http.NewRequest("GET", url, nil) + req, err := http.NewRequest(http.MethodGet, url, nil) if err != nil { return err } @@ -132,23 +131,21 @@ func DownloadFileMultiThreading(url, path string, limit int64, threadCount int, if resp.StatusCode < 200 || resp.StatusCode >= 300 { return errors.New("response status unsuccessful: " + strconv.FormatInt(int64(resp.StatusCode), 10)) } - if resp.StatusCode == 200 { + if resp.StatusCode == http.StatusOK { if limit > 0 && resp.ContentLength > limit { return ErrOverSize } return copyStream(resp.Body) } - if resp.StatusCode == 206 { + if resp.StatusCode == http.StatusPartialContent { contentLength = resp.ContentLength if limit > 0 && resp.ContentLength > limit { return ErrOverSize } - blockSize := func() int64 { - if contentLength > 1024*1024 { - return (contentLength / int64(threadCount)) - 10 - } - return contentLength - }() + blockSize := contentLength + if contentLength > 1024*1024 { + blockSize = (contentLength / int64(threadCount)) - 10 + } if blockSize == contentLength { return copyStream(resp.Body) } @@ -170,7 +167,7 @@ func DownloadFileMultiThreading(url, path string, limit int64, threadCount int, } // 下载分块 downloadBlock := func(block *BlockMetaData) error { - req, _ := http.NewRequest("GET", url, nil) + req, _ := http.NewRequest(http.MethodGet, url, nil) file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0o666) if err != nil { return err @@ -291,7 +288,7 @@ func (g *gzipCloser) Close() error { // HTTPGetReadCloser 从 Http url 获取 io.ReadCloser func HTTPGetReadCloser(url string) (io.ReadCloser, error) { - req, err := http.NewRequest("GET", url, nil) + req, err := http.NewRequest(http.MethodGet, url, nil) if err != nil { return nil, err } diff --git a/main.go b/main.go index 0cd6079..fa75ded 100644 --- a/main.go +++ b/main.go @@ -1,3 +1,4 @@ +// Package main package main import ( diff --git a/server/http.go b/server/http.go index 3fd7c37..a78102e 100644 --- a/server/http.go +++ b/server/http.go @@ -356,13 +356,13 @@ func (c *HTTPClient) onBotPushEvent(e *coolq.Event) { for i := uint64(0); i <= c.MaxRetries; i++ { // see https://stackoverflow.com/questions/31337891/net-http-http-contentlength-222-with-body-length-0 // we should create a new request for every single post trial - req, err = http.NewRequest("POST", c.addr, bytes.NewReader(e.JSONBytes())) + req, err = http.NewRequest(http.MethodGet, c.addr, bytes.NewReader(e.JSONBytes())) if err != nil { log.Warnf("上报 Event 数据到 %v 时创建请求失败: %v", c.addr, err) return } req.Header = header - res, err = c.client.Do(req) + res, err = c.client.Do(req) // nolint:bodyclose if err == nil { break } diff --git a/server/scf.go b/server/scf.go index 7d95e7f..517ff1d 100644 --- a/server/scf.go +++ b/server/scf.go @@ -65,7 +65,7 @@ func (l *lambdaResponseWriter) flush() error { Body: body, }) - r, _ := http.NewRequest("POST", cli.responseURL, buffer) + r, _ := http.NewRequest(http.MethodPost, cli.responseURL, buffer) do, err := cli.client.Do(r) if err != nil { return err From 65b050c7818ad5d97fc3020b1bf5fa030a13d523 Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Mon, 29 Aug 2022 18:31:56 +0800 Subject: [PATCH 17/95] ci: update go1.19&MiraiGo --- .github/workflows/ci.yml | 2 +- .github/workflows/golint.yml | 2 +- .github/workflows/release.yml | 2 +- Dockerfile | 2 +- go.mod | 13 ++++++------- go.sum | 27 ++++++++++++++------------- 6 files changed, 24 insertions(+), 24 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 05bc69a..2e1cee1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,7 @@ jobs: - name: Setup Go environment uses: actions/setup-go@v2.1.3 with: - go-version: 1.18 + go-version: 1.19 - name: Cache downloaded module uses: actions/cache@v2 with: diff --git a/.github/workflows/golint.yml b/.github/workflows/golint.yml index 6ab8830..89fffe5 100644 --- a/.github/workflows/golint.yml +++ b/.github/workflows/golint.yml @@ -12,7 +12,7 @@ jobs: - name: Setup Go environment uses: actions/setup-go@v2.1.3 with: - go-version: 1.18 + go-version: 1.19 - name: golangci-lint uses: golangci/golangci-lint-action@v2 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a2fb331..e53dc2c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -17,7 +17,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v2 with: - go-version: '1.18' + go-version: '1.19' - name: Run GoReleaser uses: goreleaser/goreleaser-action@v2 diff --git a/Dockerfile b/Dockerfile index 2f2f1ac..27e5cfb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.18-alpine AS builder +FROM golang:1.19-alpine AS builder RUN go env -w GO111MODULE=auto \ && go env -w CGO_ENABLED=0 \ diff --git a/go.mod b/go.mod index e9908ea..0de9c8b 100644 --- a/go.mod +++ b/go.mod @@ -1,10 +1,10 @@ module github.com/Mrs4s/go-cqhttp -go 1.18 +go 1.19 require ( github.com/Microsoft/go-winio v0.5.1 - github.com/Mrs4s/MiraiGo v0.0.0-20220630160133-a39b3fdd962f + github.com/Mrs4s/MiraiGo v0.0.0-20220828090150-a3c348100dfe github.com/RomiChan/syncx v0.0.0-20220404072119-d7ea0ae15a4c github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc github.com/fumiama/go-base16384 v1.5.2 @@ -14,9 +14,9 @@ require ( github.com/pkg/errors v0.9.1 github.com/segmentio/asm v1.1.3 github.com/sirupsen/logrus v1.8.1 - github.com/stretchr/testify v1.7.1 + github.com/stretchr/testify v1.8.0 github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 - github.com/tidwall/gjson v1.14.0 + github.com/tidwall/gjson v1.14.3 github.com/wdvxdr1123/go-silk v0.0.0-20210316130616-d47b553def60 go.mongodb.org/mongo-driver v1.8.3 golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 @@ -36,7 +36,7 @@ require ( github.com/klauspost/compress v1.13.6 // indirect github.com/lestrrat-go/strftime v1.0.5 // indirect github.com/mattn/go-isatty v0.0.14 // indirect - github.com/pierrec/lz4/v4 v4.1.11 // indirect + github.com/pierrec/lz4/v4 v4.1.15 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect github.com/tidwall/match v1.1.1 // indirect @@ -45,9 +45,8 @@ require ( github.com/xdg-go/scram v1.0.2 // indirect github.com/xdg-go/stringprep v1.0.2 // indirect github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - go.uber.org/atomic v1.9.0 // indirect golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9 // indirect - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect + golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde // indirect golang.org/x/sys v0.0.0-20220111092808-5a964db01320 // indirect golang.org/x/text v0.3.7 // indirect modernc.org/libc v1.8.1 // indirect diff --git a/go.sum b/go.sum index 62f01ce..47b2da4 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY= github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Mrs4s/MiraiGo v0.0.0-20220630160133-a39b3fdd962f h1:PHOwN3/cEL/zoBpcJJXwx1mJ1NL901zrt2mvlQUO5BA= -github.com/Mrs4s/MiraiGo v0.0.0-20220630160133-a39b3fdd962f/go.mod h1:Ow7nlaVS5FztyjrTlTRSG7HLpTNmgINMluHRCgKunDI= +github.com/Mrs4s/MiraiGo v0.0.0-20220828090150-a3c348100dfe h1:KpRbU5MRL2dplf01Cbgo8m0+ST1V1A+4cFBQkQA/YAk= +github.com/Mrs4s/MiraiGo v0.0.0-20220828090150-a3c348100dfe/go.mod h1:lecSP26qedhinCceWn1x02dLDxGotH5nTFlpIMilmVM= github.com/RomiChan/protobuf v0.1.1-0.20220624030127-3310cba9dbc0 h1:+UGPBYVjssFsdahLJIiNPwpmmwgl/OaVdv1oc5NonC0= github.com/RomiChan/protobuf v0.1.1-0.20220624030127-3310cba9dbc0/go.mod h1:2Ie+hdBFQpQFDHfeklgxoFmQRCE7O+KwFpISeXq7OwA= github.com/RomiChan/syncx v0.0.0-20220404072119-d7ea0ae15a4c h1:cNPOdTNiVwxLpROLjXCgbIPvdkE+BwvxDvgmdYmWx6Q= @@ -43,8 +43,8 @@ github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9q github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -69,8 +69,8 @@ github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9k github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/pierrec/lz4/v4 v4.1.11 h1:LVs17FAZJFOjgmJXl9Tf13WfLUvZq7/RjfEJrnwZ9OE= -github.com/pierrec/lz4/v4 v4.1.11/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.15 h1:MO0/ucJhngq7299dKLwIMtgTfbkoSPF6AoMYDd8Q4q0= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -78,22 +78,25 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/segmentio/asm v1.1.3 h1:WM03sfUOENvvKexOLp+pCqgb/WDjsi7EK8gIsICtzhc= github.com/segmentio/asm v1.1.3/go.mod h1:Ld3L4ZXGNcSLRg4JBsZ3//1+f/TjYl0Mzen/DQy1EJg= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= -github.com/tidwall/gjson v1.14.0 h1:6aeJ0bzojgWLa82gDQHcx3S0Lr/O51I9bJ5nv6JFx5w= -github.com/tidwall/gjson v1.14.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.14.3 h1:9jvXn7olKEHU1S9vwoMGliaT8jq1vJ7IH/n9zD9Dnlw= +github.com/tidwall/gjson v1.14.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= @@ -111,8 +114,6 @@ github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= go.mongodb.org/mongo-driver v1.8.3 h1:TDKlTkGDKm9kkJVUOAXDK5/fkqKHJVwYQSpoRfB43R4= go.mongodb.org/mongo-driver v1.8.3/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= @@ -128,8 +129,8 @@ golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde h1:ejfdSekXMDxDLbRrJMwUk6KnSLZ2McaUCVcIKM+N6jc= +golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -170,8 +171,8 @@ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miE google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= From 98712bf9ca2ddd6e05399517995c6eeadbddfdff Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Wed, 31 Aug 2022 16:31:47 +0800 Subject: [PATCH 18/95] move mime to internal package --- coolq/bot.go | 6 +++--- coolq/cqcode.go | 5 +++-- internal/base/feature.go | 12 ------------ {modules => internal}/mime/mime.go | 23 +++++++++-------------- main.go | 1 - 5 files changed, 15 insertions(+), 32 deletions(-) rename {modules => internal}/mime/mime.go (65%) diff --git a/coolq/bot.go b/coolq/bot.go index 126de63..de84131 100644 --- a/coolq/bot.go +++ b/coolq/bot.go @@ -23,6 +23,7 @@ import ( "github.com/Mrs4s/go-cqhttp/db" "github.com/Mrs4s/go-cqhttp/global" "github.com/Mrs4s/go-cqhttp/internal/base" + "github.com/Mrs4s/go-cqhttp/internal/mime" ) // CQBot CQBot结构体,存储Bot实例相关配置 @@ -152,10 +153,9 @@ func (bot *CQBot) uploadLocalImage(target message.Source, img *LocalImageElement defer func() { _ = f.Close() }() img.Stream = f } - if lawful, mime := base.IsLawfulImage(img.Stream); !lawful { - return nil, errors.New("image type error: " + mime) + if mt, ok := mime.CheckImage(img.Stream); !ok { + return nil, errors.New("image type error: " + mt) } - // todo: enable multi-thread upload, now got error code 81 i, err := bot.Client.UploadImage(target, img.Stream, 4) if err != nil { return nil, err diff --git a/coolq/cqcode.go b/coolq/cqcode.go index 283213b..2c3bc65 100644 --- a/coolq/cqcode.go +++ b/coolq/cqcode.go @@ -28,6 +28,7 @@ import ( "github.com/Mrs4s/go-cqhttp/global" "github.com/Mrs4s/go-cqhttp/internal/base" "github.com/Mrs4s/go-cqhttp/internal/cache" + "github.com/Mrs4s/go-cqhttp/internal/mime" "github.com/Mrs4s/go-cqhttp/internal/param" ) @@ -844,8 +845,8 @@ func (bot *CQBot) ToElement(t string, d map[string]string, sourceType message.So return nil, err } if !global.IsAMRorSILK(data) { - lawful, mt := base.IsLawfulAudio(bytes.NewReader(data)) - if !lawful { + mt, ok := mime.CheckAudio(bytes.NewReader(data)) + if !ok { return nil, errors.New("audio type error: " + mt) } data, err = global.EncoderSilk(data) diff --git a/internal/base/feature.go b/internal/base/feature.go index f27c0a0..d57a9aa 100644 --- a/internal/base/feature.go +++ b/internal/base/feature.go @@ -1,8 +1,6 @@ package base import ( - "io" - "github.com/pkg/errors" ) @@ -19,13 +17,3 @@ func encodeSilk(_ []byte, _ string) ([]byte, error) { func resampleSilk(data []byte) []byte { return data } - -// Mime scan feature -var ( - IsLawfulImage = nocheck // 检查图片MIME - IsLawfulAudio = nocheck // 检查音频MIME -) - -func nocheck(_ io.ReadSeeker) (bool, string) { - return true, "" -} diff --git a/modules/mime/mime.go b/internal/mime/mime.go similarity index 65% rename from modules/mime/mime.go rename to internal/mime/mime.go index f6bfa4b..c8765bd 100644 --- a/modules/mime/mime.go +++ b/internal/mime/mime.go @@ -9,11 +9,6 @@ import ( "github.com/Mrs4s/go-cqhttp/internal/base" ) -func init() { - base.IsLawfulImage = checkImage - base.IsLawfulAudio = checkAudio -} - const limit = 4 * 1024 func scan(r io.ReadSeeker) string { @@ -24,15 +19,15 @@ func scan(r io.ReadSeeker) string { return http.DetectContentType(in) } -// checkImage 判断给定流是否为合法图片 +// CheckImage 判断给定流是否为合法图片 // 返回 是否合法, 实际Mime // 判断后会自动将 Stream Seek 至 0 -func checkImage(r io.ReadSeeker) (ok bool, t string) { +func CheckImage(r io.ReadSeeker) (t string, ok bool) { if base.SkipMimeScan { - return true, "" + return "", true } if r == nil { - return false, "image/nil-stream" + return "image/nil-stream", false } t = scan(r) switch t { @@ -42,15 +37,15 @@ func checkImage(r io.ReadSeeker) (ok bool, t string) { return } -// checkImage 判断给定流是否为合法音频 -func checkAudio(r io.ReadSeeker) (bool, string) { +// CheckAudio 判断给定流是否为合法音频 +func CheckAudio(r io.ReadSeeker) (string, bool) { if base.SkipMimeScan { - return true, "" + return "", true } t := scan(r) // std mime type detection is not full supported for audio if strings.Contains(t, "text") || strings.Contains(t, "image") { - return false, t + return t, false } - return true, t + return t, true } diff --git a/main.go b/main.go index fa75ded..1d79704 100644 --- a/main.go +++ b/main.go @@ -5,7 +5,6 @@ import ( "github.com/Mrs4s/go-cqhttp/cmd/gocq" _ "github.com/Mrs4s/go-cqhttp/db/leveldb" // leveldb - _ "github.com/Mrs4s/go-cqhttp/modules/mime" // mime检查模块 _ "github.com/Mrs4s/go-cqhttp/modules/silk" // silk编码模块 // 其他模块 // _ "github.com/Mrs4s/go-cqhttp/db/mongodb" // mongodb 数据库支持 From 1ff5e4de122da332045dcbe362ded483022eb97c Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Wed, 31 Aug 2022 17:24:22 +0800 Subject: [PATCH 19/95] rf: remove Base64DecodeString Now segmentio/asm resolve issue 50, we don't need this wrapper. --- coolq/cqcode.go | 3 ++- global/fs.go | 5 ++--- internal/param/param.go | 12 ------------ 3 files changed, 4 insertions(+), 16 deletions(-) diff --git a/coolq/cqcode.go b/coolq/cqcode.go index 2c3bc65..1f1475b 100644 --- a/coolq/cqcode.go +++ b/coolq/cqcode.go @@ -20,6 +20,7 @@ import ( "github.com/Mrs4s/MiraiGo/message" "github.com/Mrs4s/MiraiGo/utils" b14 "github.com/fumiama/go-base16384" + "github.com/segmentio/asm/base64" log "github.com/sirupsen/logrus" "github.com/tidwall/gjson" @@ -1122,7 +1123,7 @@ func (bot *CQBot) makeImageOrVideoElem(d map[string]string, video bool, sourceTy return &LocalImageElement{File: fu.Path, URL: f}, nil } if !video && strings.HasPrefix(f, "base64") { - b, err := param.Base64DecodeString(strings.TrimPrefix(f, "base64://")) + b, err := base64.StdEncoding.DecodeString(strings.TrimPrefix(f, "base64://")) if err != nil { return nil, err } diff --git a/global/fs.go b/global/fs.go index ccfac88..f985dd5 100644 --- a/global/fs.go +++ b/global/fs.go @@ -14,9 +14,8 @@ import ( "github.com/Mrs4s/MiraiGo/utils" b14 "github.com/fumiama/go-base16384" + "github.com/segmentio/asm/base64" log "github.com/sirupsen/logrus" - - "github.com/Mrs4s/go-cqhttp/internal/param" ) const ( @@ -89,7 +88,7 @@ func FindFile(file, cache, p string) (data []byte, err error) { return nil, err } case strings.HasPrefix(file, "base64"): - data, err = param.Base64DecodeString(strings.TrimPrefix(file, "base64://")) + data, err = base64.StdEncoding.DecodeString(strings.TrimPrefix(file, "base64://")) if err != nil { return nil, err } diff --git a/internal/param/param.go b/internal/param/param.go index fd86b74..19da7fc 100644 --- a/internal/param/param.go +++ b/internal/param/param.go @@ -7,8 +7,6 @@ import ( "strings" "sync" - "github.com/Mrs4s/MiraiGo/utils" - "github.com/segmentio/asm/base64" "github.com/tidwall/gjson" ) @@ -83,13 +81,3 @@ func SplitURL(s string) []string { result = append(result, s[last:]) return result } - -// Base64DecodeString decode base64 with avx2 -// see https://github.com/segmentio/asm/issues/50 -// avoid incorrect unsafe usage in origin library -func Base64DecodeString(s string) ([]byte, error) { - e := base64.StdEncoding - dst := make([]byte, e.DecodedLen(len(s))) - n, err := e.Decode(dst, utils.S2B(s)) - return dst[:n], err -} From 96e63976363cf969a1bec51fce6f43aa275b6d7d Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Wed, 31 Aug 2022 20:30:16 +0800 Subject: [PATCH 20/95] btree: remove resethash --- internal/btree/btree_test.go | 1 + internal/btree/chunk.go | 26 ++++++++++---------------- internal/btree/helper.go | 5 ----- 3 files changed, 11 insertions(+), 21 deletions(-) diff --git a/internal/btree/btree_test.go b/internal/btree/btree_test.go index 464c7ac..649a36c 100644 --- a/internal/btree/btree_test.go +++ b/internal/btree/btree_test.go @@ -40,6 +40,7 @@ func TestBtree(t *testing.T) { "123", "We are met on a great battle-field of that war.", "Abraham Lincoln, November 19, 1863, Gettysburg, Pennsylvania", + // "00", // TODO: fix this } sha := make([]*byte, len(tests)) for i, tt := range tests { diff --git a/internal/btree/chunk.go b/internal/btree/chunk.go index 4b38c14..524fc1d 100644 --- a/internal/btree/chunk.go +++ b/internal/btree/chunk.go @@ -1,6 +1,7 @@ package btree import ( + "encoding/binary" "math/rand" "unsafe" ) @@ -31,9 +32,8 @@ func (d *DB) allocChunk(size int) int64 { /* create fake size SHA-1 */ var sha1 [hashSize]byte - p := unsafe.Pointer(&sha1[0]) - *(*int32)(p) = -1 // *(uint32_t *) hash = -1; - *(*uint32)(unsafe.Add(p, i32s)) = uint32(size) // ((__be32 *) hash)[1] = to_be32(size); + binary.LittleEndian.PutUint32(sha1[0*4:1*4], ^uint32(0)) // *(uint32_t *) hash = -1; + binary.LittleEndian.PutUint32(sha1[1*4:2*4], uint32(size)) // ((__be32 *) hash)[1] = to_be32(size); /* find free chunk with the larger or the same size/SHA-1 */ d.inAllocator = true @@ -41,14 +41,13 @@ func (d *DB) allocChunk(size int) int64 { offset = d.delete(d.freeTop, &sha1[0]) d.deleteLarger = false if offset != 0 { - assert(*(*int32)(p) == -1) // assert(*(uint32_t *) hash == (uint32_t) -1) - flen := int(*(*uint32)(unsafe.Add(p, i32s))) // size_t free_len = from_be32(((__be32 *) hash)[1]) + flen := int(binary.LittleEndian.Uint32(sha1[:4])) // size_t free_len = from_be32(((__be32 *) hash)[1]) assert(power2(flen) == flen) assert(flen >= size) /* delete buddy information */ - resethash(&sha1[0]) - *(*int64)(p) = offset + sha1 = [hashSize]byte{} + binary.LittleEndian.PutUint64(sha1[0*8:1*8], uint64(offset)) buddyLen := d.delete(d.freeTop, &sha1[0]) assert(buddyLen == int64(size)) @@ -98,17 +97,12 @@ func (d *DB) freeChunk(offset int64, size int) { /* create fake offset SHA-1 for buddy allocation */ var sha1 [hashSize]byte - p := unsafe.Pointer(&sha1[0]) d.inAllocator = true - - const i32s = unsafe.Sizeof(int32(0)) - /* add buddy information */ - resethash(&sha1[0]) - *(*int32)(p) = -1 // *(uint32_t *) hash = -1; - *(*uint32)(unsafe.Add(p, i32s)) = uint32(size) // ((__be32 *) hash)[1] = to_be32(size); - *(*uint32)(unsafe.Add(p, i32s*2)) = rand.Uint32() /* to make SHA-1 unique */ - *(*uint32)(unsafe.Add(p, i32s*3)) = rand.Uint32() + binary.LittleEndian.PutUint32(sha1[0*4:1*4], ^uint32(0)) // *(uint32_t *) hash = -1; + binary.LittleEndian.PutUint32(sha1[1*4:2*4], uint32(size)) // ((__be32 *) hash)[1] = to_be32(size); + binary.LittleEndian.PutUint32(sha1[2*4:3*4], rand.Uint32()) /* to make SHA-1 unique */ + binary.LittleEndian.PutUint32(sha1[3*4:4*4], rand.Uint32()) // insert_toplevel(btree, &btree->free_top, hash, NULL, offset); _ = d.insertTopLevel(&d.freeTop, &sha1[0], nil, int(offset)) diff --git a/internal/btree/helper.go b/internal/btree/helper.go index eb9c1f7..762ae7b 100644 --- a/internal/btree/helper.go +++ b/internal/btree/helper.go @@ -37,11 +37,6 @@ func copyhash(dst *byte, src *byte) { *(*[hashSize]byte)(pa) = *(*[hashSize]byte)(pb) } -func resethash(sha1 *byte) { - p := unsafe.Pointer(sha1) - *(*[hashSize]byte)(p) = [hashSize]byte{} -} - // reading table func read32(r io.Reader) (int32, error) { From 2f92146092a02346376db29284ae1ed9a190278d Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Wed, 31 Aug 2022 21:07:18 +0800 Subject: [PATCH 21/95] cache: switch to leveldb --- internal/cache/cache.go | 69 +++++++------------------------ modules/config/default_config.yml | 5 --- 2 files changed, 15 insertions(+), 59 deletions(-) diff --git a/internal/cache/cache.go b/internal/cache/cache.go index 30cb538..c99e0d4 100644 --- a/internal/cache/cache.go +++ b/internal/cache/cache.go @@ -2,14 +2,9 @@ package cache import ( - "fmt" - "sync" - log "github.com/sirupsen/logrus" - - "github.com/Mrs4s/go-cqhttp/global" - "github.com/Mrs4s/go-cqhttp/internal/base" - "github.com/Mrs4s/go-cqhttp/internal/btree" + "github.com/syndtr/goleveldb/leveldb" + "github.com/syndtr/goleveldb/leveldb/opt" ) // Media Cache DBs @@ -21,70 +16,36 @@ var ( // Cache wraps the btree.DB for concurrent safe type Cache struct { - lock sync.RWMutex - db *btree.DB + ldb *leveldb.DB } // Insert 添加媒体缓存 func (c *Cache) Insert(md5, data []byte) { - c.lock.Lock() - defer c.lock.Unlock() - - var hash [16]byte - copy(hash[:], md5) - c.db.Insert(&hash[0], data) + _ = c.ldb.Put(md5, data, nil) } // Get 获取缓存信息 func (c *Cache) Get(md5 []byte) []byte { - c.lock.RLock() - defer c.lock.RUnlock() - - var hash [16]byte - copy(hash[:], md5) - return c.db.Get(&hash[0]) + got, _ := c.ldb.Get(md5, nil) + return got } // Delete 删除指定缓存 func (c *Cache) Delete(md5 []byte) { - c.lock.Lock() - defer c.lock.Unlock() - - var hash [16]byte - copy(hash[:], md5) - _ = c.db.Delete(&hash[0]) + _ = c.ldb.Delete(md5, nil) } // Init 初始化 Cache func Init() { - node, ok := base.Database["cache"] - var conf map[string]string - if ok { - err := node.Decode(&conf) + open := func(typ, path string, cache *Cache) { + ldb, err := leveldb.OpenFile(path, &opt.Options{ + WriteBuffer: 4 * opt.KiB, + }) if err != nil { - log.Fatalf("failed to read cache config: %v", err) + log.Fatalf("open cache %s db failed: %v", typ, err) } + cache.ldb = ldb } - - open := func(typ string, cache *Cache) { - file := conf[typ] - if file == "" { - file = fmt.Sprintf("data/%s.db", typ) - } - if global.PathExists(file) { - db, err := btree.Open(file) - if err != nil { - log.Fatalf("open %s cache failed: %v", typ, err) - } - cache.db = db - } else { - db, err := btree.Create(file) - if err != nil { - log.Fatalf("create %s cache failed: %v", typ, err) - } - cache.db = db - } - } - open("image", &Image) - open("video", &Video) + open("image", "data/images", &Image) + open("video", "data/videos", &Video) } diff --git a/modules/config/default_config.yml b/modules/config/default_config.yml index 69e23cd..7d2f7e9 100644 --- a/modules/config/default_config.yml +++ b/modules/config/default_config.yml @@ -79,11 +79,6 @@ database: # 数据库相关设置 # 关闭将无法使用 撤回 回复 get_msg 等上下文相关功能 enable: true - # 媒体文件缓存, 删除此项则使用缓存文件(旧版行为) - cache: - image: data/image.db - video: data/video.db - # 连接服务列表 servers: # 添加方式,同一连接方式可添加多个,具体配置说明请查看文档 From 093605cf016c15f7951df135864d14211cf0798d Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Wed, 31 Aug 2022 21:11:23 +0800 Subject: [PATCH 22/95] internal/btree: remove Goodbye! --- internal/btree/btree.go | 571 ---------------------------- internal/btree/btree_test.go | 103 ----- internal/btree/chunk.go | 116 ------ internal/btree/file_lock_unix.go | 45 --- internal/btree/file_lock_windows.go | 28 -- internal/btree/helper.go | 101 ----- 6 files changed, 964 deletions(-) delete mode 100644 internal/btree/btree.go delete mode 100644 internal/btree/btree_test.go delete mode 100644 internal/btree/chunk.go delete mode 100644 internal/btree/file_lock_unix.go delete mode 100644 internal/btree/file_lock_windows.go delete mode 100644 internal/btree/helper.go diff --git a/internal/btree/btree.go b/internal/btree/btree.go deleted file mode 100644 index 81adcb9..0000000 --- a/internal/btree/btree.go +++ /dev/null @@ -1,571 +0,0 @@ -// Package btree provide a disk-based btree -package btree - -import ( - "io" - "math/rand" - "os" - "unsafe" - - "github.com/pkg/errors" -) - -const ( - hashSize = 16 // md5 hash - tableSize = (1024 - 1) / int(unsafe.Sizeof(item{})) - cacheSlots = 11 // prime - superSize = int(unsafe.Sizeof(super{})) - tableStructSize = int(unsafe.Sizeof(table{})) -) - -type fileLock interface { - release() error -} - -type item struct { - hash [hashSize]byte - offset int64 - child int64 -} - -type table struct { - items [tableSize]item - size int -} - -type cache struct { - table *table - offset int64 -} - -type super struct { - top int64 - freeTop int64 - alloc int64 -} - -// DB ... -type DB struct { - fd *os.File - top int64 - freeTop int64 - alloc int64 - cache [cacheSlots]cache - - flock fileLock - inAllocator bool - deleteLarger bool - fqueue [freeQueueLen]chunk - fqueueLen int -} - -func (d *DB) get(offset int64) *table { - assert(offset != 0) - - // take from cache - slot := &d.cache[offset%cacheSlots] - if slot.offset == offset { - return slot.table - } - - table := new(table) - - d.fd.Seek(offset, io.SeekStart) - err := readTable(d.fd, table) - if err != nil { - panic(errors.Wrap(err, "btree I/O error")) - } - return table -} - -func (d *DB) put(t *table, offset int64) { - assert(offset != 0) - - // overwrite cache - slot := &d.cache[offset%cacheSlots] - slot.table = t - slot.offset = offset -} - -func (d *DB) flush(t *table, offset int64) { - assert(offset != 0) - - d.fd.Seek(offset, io.SeekStart) - err := writeTable(d.fd, t) - if err != nil { - panic(errors.Wrap(err, "btree I/O error")) - } - d.put(t, offset) -} - -func (d *DB) flushSuper() { - d.fd.Seek(0, io.SeekStart) - super := super{ - top: d.top, - freeTop: d.freeTop, - alloc: d.alloc, - } - err := writeSuper(d.fd, &super) - if err != nil { - panic(errors.Wrap(err, "btree I/O error")) - } -} - -// Open opens an existed btree file -func Open(name string) (*DB, error) { - lock, err := newFileLock(name + ".lock") - if err != nil { - return nil, errors.New("文件被其他进程占用") - } - btree := new(DB) - fd, err := os.OpenFile(name, os.O_RDWR, 0o644) - if err != nil { - return nil, errors.Wrap(err, "btree open file failed") - } - btree.fd = fd - - super := super{} - err = readSuper(fd, &super) - btree.top = super.top - btree.freeTop = super.freeTop - btree.alloc = super.alloc - btree.flock = lock - return btree, errors.Wrap(err, "btree read meta info failed") -} - -// Create creates a database -func Create(name string) (*DB, error) { - lock, err := newFileLock(name + ".lock") - if err != nil { - return nil, errors.New("文件被其他进程占用") - } - btree := new(DB) - fd, err := os.OpenFile(name, os.O_RDWR|os.O_TRUNC|os.O_CREATE, 0o644) - if err != nil { - return nil, errors.Wrap(err, "btree open file failed") - } - - btree.flock = lock - btree.fd = fd - btree.alloc = int64(superSize) - btree.flushSuper() - return btree, nil -} - -// Close closes the database -func (d *DB) Close() error { - _ = d.fd.Sync() - if err := d.flock.release(); err != nil { - return err - } - err := d.fd.Close() - for i := 0; i < cacheSlots; i++ { - d.cache[i] = cache{} - } - return errors.Wrap(err, "btree close failed") -} - -func collapse(bt *DB, offset int64) int64 { - table := bt.get(offset) - if table.size != 0 { - /* unable to collapse */ - bt.put(table, offset) - return offset - } - ret := table.items[0].child - bt.put(table, offset) - - /* - * WARNING: this is dangerous as the chunk is added to allocation tree - * before the references to it are removed! - */ - bt.freeChunk(offset, int(unsafe.Sizeof(table))) - return ret -} - -// split a table. The pivot item is stored to 'hash' and 'offset'. -// Returns offset to the new table. -func (d *DB) split(t *table, hash *byte, offset *int64) int64 { - copyhash(hash, &t.items[tableSize/2].hash[0]) - *offset = t.items[tableSize/2].offset - - ntable := new(table) - ntable.size = t.size - tableSize/2 - 1 - - t.size = tableSize / 2 - - copy(ntable.items[:ntable.size+1], t.items[tableSize/2+1:]) - - noff := d.allocChunk(tableStructSize) - d.flush(ntable, noff) - - // make sure data is written before a reference is added to it - _ = d.fd.Sync() - return noff -} - -// takeSmallest find and remove the smallest item from the given table. The key of the item -// is stored to 'hash'. Returns offset to the item -func (d *DB) takeSmallest(toff int64, sha1 *byte) int64 { - table := d.get(toff) - assert(table.size > 0) - - var off int64 - child := table.items[0].child - if child == 0 { - off = d.remove(table, 0, sha1) - } else { - /* recursion */ - off = d.takeSmallest(child, sha1) - table.items[0].child = collapse(d, child) - } - d.flush(table, toff) - - // make sure data is written before a reference is added to it - _ = d.fd.Sync() - return off -} - -// takeLargest find and remove the largest item from the given table. The key of the item -// is stored to 'hash'. Returns offset to the item -func (d *DB) takeLargest(toff int64, hash *byte) int64 { - table := d.get(toff) - assert(table.size > 0) - - var off int64 - child := table.items[table.size].child - if child == 0 { - off = d.remove(table, table.size-1, hash) - } else { - /* recursion */ - off = d.takeLargest(child, hash) - table.items[table.size].child = collapse(d, child) - } - d.flush(table, toff) - - // make sure data is written before a reference is added to it - _ = d.fd.Sync() - return off -} - -// remove an item in position 'i' from the given table. The key of the -// removed item is stored to 'hash'. Returns offset to the item. -func (d *DB) remove(t *table, i int, hash *byte) int64 { - assert(i < t.size) - - if hash != nil { - copyhash(hash, &t.items[i].hash[0]) - } - - offset := t.items[i].offset - lc := t.items[i].child - rc := t.items[i+1].child - - if lc != 0 && rc != 0 { - /* replace the removed item by taking an item from one of the - child tables */ - var noff int64 - if rand.Int()&1 != 0 { - noff = d.takeLargest(lc, &t.items[i].hash[0]) - t.items[i].child = collapse(d, lc) - } else { - noff = d.takeSmallest(rc, &t.items[i].hash[0]) - t.items[i+1].child = collapse(d, rc) - } - t.items[i].child = noff - } else { - // memmove(&table->items[i], &table->items[i + 1], - // (table->size - i) * sizeof(struct btree_item)); - copy(t.items[i:], t.items[i+1:]) - t.size-- - - if lc != 0 { - t.items[i].child = lc - } else { - t.items[i].child = rc - } - } - return offset -} - -func (d *DB) insert(toff int64, hash *byte, data []byte, size int) int64 { - table := d.get(toff) - assert(table.size < tableSize-1) - - left, right := 0, table.size - for left < right { - mid := (right-left)>>1 + left - switch cmp := cmp(hash, &table.items[mid].hash[0]); { - case cmp == 0: - // already in the table - ret := table.items[mid].offset - d.put(table, toff) - return ret - case cmp < 0: - right = mid - default: - left = mid + 1 - } - } - i := left - - var off, rc, ret int64 - lc := table.items[i].child - if lc != 0 { - /* recursion */ - ret = d.insert(lc, hash, data, size) - - /* check if we need to split */ - child := d.get(lc) - if child.size < tableSize-1 { - /* nothing to do */ - d.put(table, toff) - d.put(child, lc) - return ret - } - /* overwrites SHA-1 */ - rc = d.split(child, hash, &off) - /* flush just in case changes happened */ - d.flush(child, lc) - - // make sure data is written before a reference is added to it - _ = d.fd.Sync() - } else { - off = d.insertData(data, size) - ret = off - } - - table.size++ - // memmove(&table->items[i + 1], &table->items[i], - // (table->size - i) * sizeof(struct btree_item)); - copy(table.items[i+1:], table.items[i:]) - copyhash(&table.items[i].hash[0], hash) - table.items[i].offset = off - table.items[i].child = lc - table.items[i+1].child = rc - - d.flush(table, toff) - return ret -} - -func (d *DB) insertData(data []byte, size int) int64 { - if data == nil { - return int64(size) - } - assert(len(data) == size) - - offset := d.allocChunk(4 + len(data)) - - d.fd.Seek(offset, io.SeekStart) - err := write32(d.fd, int32(len(data))) - if err != nil { - panic(errors.Wrap(err, "btree I/O error")) - } - _, err = d.fd.Write(data) - if err != nil { - panic(errors.Wrap(err, "btree I/O error")) - } - - // make sure data is written before a reference is added to it - _ = d.fd.Sync() - return offset -} - -// delete remove an item with key 'hash' from the given table. The offset to the -// removed item is returned. -// Please note that 'hash' is overwritten when called inside the allocator. -func (d *DB) delete(offset int64, hash *byte) int64 { - if offset == 0 { - return 0 - } - table := d.get(offset) - - left, right := 0, table.size - for left < right { - i := (right-left)>>1 + left - switch cmp := cmp(hash, &table.items[i].hash[0]); { - case cmp == 0: - // found - ret := d.remove(table, i, hash) - d.flush(table, offset) - return ret - case cmp < 0: - right = i - default: - left = i + 1 - } - } - - // not found - recursion - i := left - child := table.items[i].child - ret := d.delete(child, hash) - if ret != 0 { - table.items[i].child = collapse(d, child) - } - - if ret == 0 && d.deleteLarger && i < table.size { - ret = d.remove(table, i, hash) - } - if ret != 0 { - /* flush just in case changes happened */ - d.flush(table, offset) - } else { - d.put(table, offset) - } - return ret -} - -func (d *DB) insertTopLevel(toff *int64, hash *byte, data []byte, size int) int64 { // nolint:unparam - var off, ret, rc int64 - if *toff != 0 { - ret = d.insert(*toff, hash, data, size) - - /* check if we need to split */ - table := d.get(*toff) - if table.size < tableSize-1 { - /* nothing to do */ - d.put(table, *toff) - return ret - } - rc = d.split(table, hash, &off) - d.flush(table, *toff) - } else { - off = d.insertData(data, size) - ret = off - } - - /* create new top level table */ - t := new(table) - t.size = 1 - copyhash(&t.items[0].hash[0], hash) - t.items[0].offset = off - t.items[0].child = *toff - t.items[1].child = rc - - ntoff := d.allocChunk(tableStructSize) - d.flush(t, ntoff) - - *toff = ntoff - - // make sure data is written before a reference is added to it - _ = d.fd.Sync() - return ret -} - -func (d *DB) lookup(toff int64, hash *byte) int64 { - if toff == 0 { - return 0 - } - table := d.get(toff) - - left, right := 0, table.size - for left < right { - mid := (right-left)>>1 + left - switch cmp := cmp(hash, &table.items[mid].hash[0]); { - case cmp == 0: - // found - ret := table.items[mid].offset - d.put(table, toff) - return ret - case cmp < 0: - right = mid - default: - left = mid + 1 - } - } - - i := left - child := table.items[i].child - d.put(table, toff) - return d.lookup(child, hash) -} - -// Insert a new item with key 'hash' with the contents in 'data' to the -// database file. -func (d *DB) Insert(chash *byte, data []byte) { - /* SHA-1 must be in writable memory */ - var hash [hashSize]byte - copyhash(&hash[0], chash) - - _ = d.insertTopLevel(&d.top, &hash[0], data, len(data)) - freeQueued(d) - d.flushSuper() -} - -func (d *DB) readValue(off int64) []byte { - d.fd.Seek(off, io.SeekStart) - length, err := read32(d.fd) - if err != nil { - return nil - } - data := make([]byte, length) - n, err := io.ReadFull(d.fd, data) - if err != nil { - return nil - } - return data[:n] -} - -// Get look up item with the given key 'hash' in the database file. Length of the -// item is stored in 'len'. Returns a pointer to the contents of the item. -// The returned pointer should be released with free() after use. -func (d *DB) Get(hash *byte) []byte { - off := d.lookup(d.top, hash) - if off == 0 { - return nil - } - return d.readValue(off) -} - -// Delete remove item with the given key 'hash' from the database file. -func (d *DB) Delete(hash *byte) error { - var h [hashSize]byte - copyhash(&h[0], hash) - - off := d.delete(d.top, &h[0]) - if off == 0 { - return nil // not found key - } - - d.top = collapse(d, d.top) - freeQueued(d) - d.flushSuper() - - d.fd.Seek(off, io.SeekStart) - length, err := read32(d.fd) // len: 0 - if err != nil { - return errors.Wrap(err, "btree I/O error") - } - - d.freeChunk(off, int(length+4)) - freeQueued(d) - d.flushSuper() - return nil -} - -// Foreach iterates over all items in the database file. -func (d *DB) Foreach(iter func(key [16]byte, value []byte)) { - if d.top != 0 { - top := d.get(d.top) - d.iterate(top, iter) - } -} - -func (d *DB) iterate(table *table, iter func(key [16]byte, value []byte)) { - for i := 0; i < table.size; i++ { - item := table.items[i] - offset := item.offset - iter(item.hash, d.readValue(offset)) - - if item.child != 0 { - child := d.get(item.child) - d.iterate(child, iter) - } - } - item := table.items[table.size] - if item.child != 0 { - child := d.get(item.child) - d.iterate(child, iter) - } -} diff --git a/internal/btree/btree_test.go b/internal/btree/btree_test.go deleted file mode 100644 index 649a36c..0000000 --- a/internal/btree/btree_test.go +++ /dev/null @@ -1,103 +0,0 @@ -package btree - -import ( - "crypto/sha1" - "os" - "testing" - - "github.com/Mrs4s/MiraiGo/utils" - assert2 "github.com/stretchr/testify/assert" -) - -func tempfile(t *testing.T) string { - temp, err := os.CreateTemp(".", "temp.*.db") - assert2.NoError(t, temp.Close()) - assert2.NoError(t, err) - return temp.Name() -} - -func removedb(name string) { - os.Remove(name) - os.Remove(name + ".lock") -} - -func TestCreate(t *testing.T) { - f := tempfile(t) - _, err := Create(f) - assert2.NoError(t, err) - defer removedb(f) -} - -func TestBtree(t *testing.T) { - f := tempfile(t) - defer removedb(f) - bt, err := Create(f) - assert := assert2.New(t) - assert.NoError(err) - - tests := []string{ - "hello world", - "123", - "We are met on a great battle-field of that war.", - "Abraham Lincoln, November 19, 1863, Gettysburg, Pennsylvania", - // "00", // TODO: fix this - } - sha := make([]*byte, len(tests)) - for i, tt := range tests { - hash := sha1.New() - hash.Write([]byte(tt)) - sha[i] = &hash.Sum(nil)[0] - bt.Insert(sha[i], []byte(tt)) - } - assert.NoError(bt.Close()) - - bt, err = Open(f) - assert.NoError(err) - var ss []string - bt.Foreach(func(key [16]byte, value []byte) { - ss = append(ss, string(value)) - }) - assert.ElementsMatch(tests, ss) - - for i, tt := range tests { - assert.Equal([]byte(tt), bt.Get(sha[i])) - } - - for i := range tests { - assert.NoError(bt.Delete(sha[i])) - } - - for i := range tests { - assert.Equal([]byte(nil), bt.Get(sha[i])) - } - assert.NoError(bt.Close()) -} - -func testForeach(t *testing.T, elemSize int) { - expected := make([]string, elemSize) - for i := 0; i < elemSize; i++ { - expected[i] = utils.RandomString(20) - } - f := tempfile(t) - defer removedb(f) - bt, err := Create(f) - assert2.NoError(t, err) - for _, v := range expected { - hash := sha1.New() - hash.Write([]byte(v)) - bt.Insert(&hash.Sum(nil)[0], []byte(v)) - } - var got []string - bt.Foreach(func(key [16]byte, value []byte) { - got = append(got, string(value)) - }) - assert2.ElementsMatch(t, expected, got) - assert2.NoError(t, bt.Close()) -} - -func TestDB_Foreach(t *testing.T) { - elemSizes := []int{0, 5, 100, 200} - for _, size := range elemSizes { - testForeach(t, size) - } -} diff --git a/internal/btree/chunk.go b/internal/btree/chunk.go deleted file mode 100644 index 524fc1d..0000000 --- a/internal/btree/chunk.go +++ /dev/null @@ -1,116 +0,0 @@ -package btree - -import ( - "encoding/binary" - "math/rand" - "unsafe" -) - -type chunk struct { - offset int64 - len int -} - -const freeQueueLen = 64 - -func freeQueued(bt *DB) { - for i := 0; i < bt.fqueueLen; i++ { - chunk := &bt.fqueue[i] - bt.freeChunk(chunk.offset, chunk.len) - } - bt.fqueueLen = 0 -} - -func (d *DB) allocChunk(size int) int64 { - assert(size > 0) - - size = power2(size) - - var offset int64 - if d.inAllocator { - const i32s = unsafe.Sizeof(int32(0)) - - /* create fake size SHA-1 */ - var sha1 [hashSize]byte - binary.LittleEndian.PutUint32(sha1[0*4:1*4], ^uint32(0)) // *(uint32_t *) hash = -1; - binary.LittleEndian.PutUint32(sha1[1*4:2*4], uint32(size)) // ((__be32 *) hash)[1] = to_be32(size); - - /* find free chunk with the larger or the same size/SHA-1 */ - d.inAllocator = true - d.deleteLarger = true - offset = d.delete(d.freeTop, &sha1[0]) - d.deleteLarger = false - if offset != 0 { - flen := int(binary.LittleEndian.Uint32(sha1[:4])) // size_t free_len = from_be32(((__be32 *) hash)[1]) - assert(power2(flen) == flen) - assert(flen >= size) - - /* delete buddy information */ - sha1 = [hashSize]byte{} - binary.LittleEndian.PutUint64(sha1[0*8:1*8], uint64(offset)) - buddyLen := d.delete(d.freeTop, &sha1[0]) - assert(buddyLen == int64(size)) - - d.freeTop = collapse(d, d.freeTop) - - d.inAllocator = false - - /* free extra space at the end of the chunk */ - for flen > size { - flen >>= 1 - d.freeChunk(offset+int64(flen), flen) - } - } else { - d.inAllocator = false - } - } - if offset == 0 { - /* not found, allocate from the end of the file */ - offset = d.alloc - /* TODO: this wastes memory.. */ - if offset&int64(size-1) != 0 { - offset += int64(size) - (offset & (int64(size) - 1)) - } - d.alloc = offset + int64(size) - } - d.flushSuper() - - // make sure the allocation tree is up-to-date before using the chunk - _ = d.fd.Sync() - return offset -} - -/* Mark a chunk as unused in the database file */ -func (d *DB) freeChunk(offset int64, size int) { - assert(size > 0) - assert(offset != 0) - size = power2(size) - assert(offset&int64(size-1) == 0) - - if d.inAllocator { - chunk := &d.fqueue[d.fqueueLen] - d.fqueueLen++ - chunk.offset = offset - chunk.len = size - return - } - - /* create fake offset SHA-1 for buddy allocation */ - var sha1 [hashSize]byte - d.inAllocator = true - /* add buddy information */ - binary.LittleEndian.PutUint32(sha1[0*4:1*4], ^uint32(0)) // *(uint32_t *) hash = -1; - binary.LittleEndian.PutUint32(sha1[1*4:2*4], uint32(size)) // ((__be32 *) hash)[1] = to_be32(size); - binary.LittleEndian.PutUint32(sha1[2*4:3*4], rand.Uint32()) /* to make SHA-1 unique */ - binary.LittleEndian.PutUint32(sha1[3*4:4*4], rand.Uint32()) - - // insert_toplevel(btree, &btree->free_top, hash, NULL, offset); - _ = d.insertTopLevel(&d.freeTop, &sha1[0], nil, int(offset)) - d.inAllocator = false - - d.flushSuper() - - // make sure the allocation tree is up-to-date before removing - // references to the chunk - _ = d.fd.Sync() -} diff --git a/internal/btree/file_lock_unix.go b/internal/btree/file_lock_unix.go deleted file mode 100644 index 8974284..0000000 --- a/internal/btree/file_lock_unix.go +++ /dev/null @@ -1,45 +0,0 @@ -//go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd - -package btree - -import ( - "os" - "syscall" -) - -type unixFileLock struct { - f *os.File -} - -func (fl *unixFileLock) release() error { - if err := setFileLock(fl.f, false); err != nil { - return err - } - return fl.f.Close() -} - -func newFileLock(path string) (fl fileLock, err error) { - flag := os.O_RDWR - f, err := os.OpenFile(path, flag, 0) - if os.IsNotExist(err) { - f, err = os.OpenFile(path, flag|os.O_CREATE, 0644) - } - if err != nil { - return - } - err = setFileLock(f, true) - if err != nil { - f.Close() - return - } - fl = &unixFileLock{f: f} - return -} - -func setFileLock(f *os.File, lock bool) error { - how := syscall.LOCK_UN - if lock { - how = syscall.LOCK_EX - } - return syscall.Flock(int(f.Fd()), how|syscall.LOCK_NB) -} diff --git a/internal/btree/file_lock_windows.go b/internal/btree/file_lock_windows.go deleted file mode 100644 index becdfad..0000000 --- a/internal/btree/file_lock_windows.go +++ /dev/null @@ -1,28 +0,0 @@ -package btree - -import "syscall" - -type windowsFileLock struct { - fd syscall.Handle -} - -func (fl *windowsFileLock) release() error { - return syscall.Close(fl.fd) -} - -func newFileLock(path string) (fileLock, error) { - pathp, err := syscall.UTF16PtrFromString(path) - if err != nil { - return nil, err - } - - const access uint32 = syscall.GENERIC_READ | syscall.GENERIC_WRITE - fd, err := syscall.CreateFile(pathp, access, 0, nil, syscall.OPEN_EXISTING, syscall.FILE_ATTRIBUTE_NORMAL, 0) - if err == syscall.ERROR_FILE_NOT_FOUND { - fd, err = syscall.CreateFile(pathp, access, 0, nil, syscall.OPEN_ALWAYS, syscall.FILE_ATTRIBUTE_NORMAL, 0) - } - if err != nil { - return nil, err - } - return &windowsFileLock{fd: fd}, nil -} diff --git a/internal/btree/helper.go b/internal/btree/helper.go deleted file mode 100644 index 762ae7b..0000000 --- a/internal/btree/helper.go +++ /dev/null @@ -1,101 +0,0 @@ -package btree - -import ( - "io" - "reflect" - "unsafe" -) - -func assert(cond bool) { - if !cond { - panic("assert failed!") - } -} - -// power2 returns a value that is greater or equal to 'val' and is power-of-two. -func power2(val int) int { - i := 1 - for i < val { - i <<= 1 - } - return i -} - -// helpers for hash - -func cmp(a, b *byte) int64 { - pa, pb := unsafe.Pointer(a), unsafe.Pointer(b) - if *(*uint64)(pa) != *(*uint64)(pb) { - return int64(*(*uint64)(pa) - *(*uint64)(pb)) - } - pa, pb = unsafe.Add(pa, 8), unsafe.Add(pb, 8) - return int64(*(*uint64)(pa) - *(*uint64)(pb)) -} - -func copyhash(dst *byte, src *byte) { - pa, pb := unsafe.Pointer(dst), unsafe.Pointer(src) - *(*[hashSize]byte)(pa) = *(*[hashSize]byte)(pb) -} - -// reading table - -func read32(r io.Reader) (int32, error) { - b := make([]byte, 4) - _, err := r.Read(b) - if err != nil { - return 0, err - } - return *(*int32)(unsafe.Pointer(&b[0])), nil -} - -func readTable(r io.Reader, t *table) error { - buf := make([]byte, tableStructSize) - _, err := r.Read(buf) - if err != nil { - return err - } - *t = *(*table)(unsafe.Pointer(&buf[0])) - return nil -} - -func readSuper(r io.Reader, s *super) error { - buf := make([]byte, superSize) - _, err := r.Read(buf) - if err != nil { - return err - } - *s = *(*super)(unsafe.Pointer(&buf[0])) - return nil -} - -// write table - -func write32(w io.Writer, t int32) error { - var p []byte - ph := (*reflect.SliceHeader)(unsafe.Pointer(&p)) - ph.Data = uintptr(unsafe.Pointer(&t)) - ph.Len = 4 - ph.Cap = 4 - _, err := w.Write(p) - return err -} - -func writeTable(w io.Writer, t *table) error { - var p []byte - ph := (*reflect.SliceHeader)(unsafe.Pointer(&p)) - ph.Data = uintptr(unsafe.Pointer(t)) - ph.Len = tableStructSize - ph.Cap = tableStructSize - _, err := w.Write(p) - return err -} - -func writeSuper(w io.Writer, s *super) error { - var p []byte - ph := (*reflect.SliceHeader)(unsafe.Pointer(&p)) - ph.Data = uintptr(unsafe.Pointer(s)) - ph.Len = superSize - ph.Cap = superSize - _, err := w.Write(p) - return err -} From 140192c76a625a98258388375ef6c97e9467cefb Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Thu, 8 Sep 2022 18:43:34 +0800 Subject: [PATCH 23/95] fix: panic of getting group code error in forward message --- coolq/api.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coolq/api.go b/coolq/api.go index 81f7ded..b3900d5 100644 --- a/coolq/api.go +++ b/coolq/api.go @@ -836,7 +836,7 @@ func (bot *CQBot) uploadForwardElement(m gjson.Result, target int64, sourceType if len(bot.Client.GroupList) == 0 { groupID = 1 } else { - groupID = bot.Client.GroupList[1].Uin + groupID = bot.Client.GroupList[0].Uin } } builder := bot.Client.NewForwardMessageBuilder(groupID) From 0377e7f80328b8d1a51119d06c1823f22e87f32e Mon Sep 17 00:00:00 2001 From: sclock <1342810270@qq.com> Date: Thu, 8 Sep 2022 19:27:13 +0800 Subject: [PATCH 24/95] =?UTF-8?q?=E5=90=88=E5=B9=B6=E8=BD=AC=E5=8F=91?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0log=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- coolq/api.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/coolq/api.go b/coolq/api.go index b3900d5..1784c7d 100644 --- a/coolq/api.go +++ b/coolq/api.go @@ -977,8 +977,10 @@ func (bot *CQBot) CQSendGroupForwardMessage(groupID int64, m gjson.Result) globa log.Warnf("合并转发(群)消息发送失败: 账号可能被风控.") return Failed(100, "SEND_MSG_API_ERROR", "请参考 go-cqhttp 端输出") } + mid := bot.InsertGroupMessage(ret) + log.Infof("发送群 %v(%v) 的合并转发消息: %v (%v)", groupID, groupID, limitedString(m.String()), mid) return OK(global.MSG{ - "message_id": bot.InsertGroupMessage(ret), + "message_id": mid, }) } @@ -1000,6 +1002,7 @@ func (bot *CQBot) CQSendPrivateForwardMessage(userID int64, m gjson.Result) glob log.Warnf("合并转发(好友)消息发送失败: 账号可能被风控.") return Failed(100, "SEND_MSG_API_ERROR", "请参考 go-cqhttp 端输出") } + log.Infof("发送好友 %v(%v) 的合并转发消息: %v (%v)", userID, userID, limitedString(m.String()), mid) return OK(global.MSG{"message_id": mid}) } From bae00b557e91d6997d1de7a56ff4db7500e7bdb9 Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Thu, 8 Sep 2022 22:20:43 +0800 Subject: [PATCH 25/95] feat: send_forward_msg api will be returned forward id --- coolq/api.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/coolq/api.go b/coolq/api.go index 1784c7d..526389c 100644 --- a/coolq/api.go +++ b/coolq/api.go @@ -981,6 +981,7 @@ func (bot *CQBot) CQSendGroupForwardMessage(groupID int64, m gjson.Result) globa log.Infof("发送群 %v(%v) 的合并转发消息: %v (%v)", groupID, groupID, limitedString(m.String()), mid) return OK(global.MSG{ "message_id": mid, + "forward_id": fe.ResId, }) } @@ -1003,7 +1004,10 @@ func (bot *CQBot) CQSendPrivateForwardMessage(userID int64, m gjson.Result) glob return Failed(100, "SEND_MSG_API_ERROR", "请参考 go-cqhttp 端输出") } log.Infof("发送好友 %v(%v) 的合并转发消息: %v (%v)", userID, userID, limitedString(m.String()), mid) - return OK(global.MSG{"message_id": mid}) + return OK(global.MSG{ + "message_id": mid, + "forward_id": fe.ResId, + }) } // CQSendPrivateMessage 发送私聊消息 From bc9c6c49f191a99c0a08b45d524ee7cce33cd906 Mon Sep 17 00:00:00 2001 From: Akiba Date: Fri, 9 Sep 2022 22:44:43 +0800 Subject: [PATCH 26/95] fix: private reply id error, fix #1608 --- coolq/cqcode.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/coolq/cqcode.go b/coolq/cqcode.go index 1f1475b..571b9b1 100644 --- a/coolq/cqcode.go +++ b/coolq/cqcode.go @@ -84,14 +84,14 @@ func (e *PokeElement) Type() message.ElementType { func replyID(r *message.ReplyElement, source message.Source) int32 { id := source.PrimaryID seq := r.ReplySeq - if source.SourceType == message.SourcePrivate { + if r.GroupID != 0 { + id = r.GroupID + } + if source.SourceType == message.SourcePrivate && r.Sender == source.PrimaryID { // 私聊似乎腾讯服务器有bug? seq = int32(uint16(seq)) id = r.Sender } - if r.GroupID != 0 { - id = r.GroupID - } return db.ToGlobalID(id, seq) } From 532f55fba08fccda40d73bf1494e41fc18052d5e Mon Sep 17 00:00:00 2001 From: Madray Haven Date: Sun, 11 Sep 2022 19:58:36 +0800 Subject: [PATCH 27/95] fix: More compatible behavior for getting the current executable dir --- internal/base/flag.go | 3 ++- server/daemon.go | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/internal/base/flag.go b/internal/base/flag.go index 5e9bd7b..24ad361 100644 --- a/internal/base/flag.go +++ b/internal/base/flag.go @@ -140,7 +140,8 @@ func ResetWorkingDir() { args = append(args, os.Args[i]) } } - p, _ := filepath.Abs(os.Args[0]) + ex, _ := os.Executable() + p, _ := filepath.Abs(ex) _, err := os.Stat(p) if !(err == nil || errors.Is(err, os.ErrExist)) { log.Fatalf("重置工作目录时出现错误: 无法找到路径 %v", p) diff --git a/server/daemon.go b/server/daemon.go index 0a570b6..cb0671c 100644 --- a/server/daemon.go +++ b/server/daemon.go @@ -5,6 +5,7 @@ package server import ( "os" "os/exec" + "path/filepath" "strconv" "strings" @@ -28,7 +29,9 @@ func Daemon() { execArgs = append(execArgs, args[i]) } - proc := exec.Command(os.Args[0], execArgs...) + ex, _ := os.Executable() + p, _ := filepath.Abs(ex) + proc := exec.Command(p, execArgs...) err := proc.Start() if err != nil { panic(err) From 4ff61215c683ed75d7d991b84f9d21034b172ebe Mon Sep 17 00:00:00 2001 From: Madray Haven Date: Sun, 11 Sep 2022 19:59:02 +0800 Subject: [PATCH 28/95] fix: wrong pid output when `-w` use with `-d` --- cmd/gocq/main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/gocq/main.go b/cmd/gocq/main.go index dacaead..442f73e 100644 --- a/cmd/gocq/main.go +++ b/cmd/gocq/main.go @@ -55,10 +55,10 @@ func Main() { switch { case base.LittleH: base.Help() - case base.LittleD: - server.Daemon() case base.LittleWD != "": base.ResetWorkingDir() + case base.LittleD: + server.Daemon() } base.Init() From 069a764a49911fa2a9a036670b804286cd14238e Mon Sep 17 00:00:00 2001 From: Akiba Date: Fri, 16 Sep 2022 09:58:17 +0800 Subject: [PATCH 29/95] fix: #1608 again --- coolq/cqcode.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/coolq/cqcode.go b/coolq/cqcode.go index 571b9b1..4a3a4f3 100644 --- a/coolq/cqcode.go +++ b/coolq/cqcode.go @@ -87,7 +87,9 @@ func replyID(r *message.ReplyElement, source message.Source) int32 { if r.GroupID != 0 { id = r.GroupID } - if source.SourceType == message.SourcePrivate && r.Sender == source.PrimaryID { + // 私聊时,部分(不确定)的账号会在 ReplyElement 中带有 GroupID 字段。 + // 这里需要判断是由于 “直接回复” 功能,GroupID 为触发直接回复的来源那个群。 + if source.SourceType == message.SourcePrivate && (r.Sender == source.PrimaryID || r.GroupID == source.PrimaryID) { // 私聊似乎腾讯服务器有bug? seq = int32(uint16(seq)) id = r.Sender From ec4b3cc3dba157bef57b7ca4f23f3a642a1b31af Mon Sep 17 00:00:00 2001 From: Ink33 Date: Sun, 18 Sep 2022 15:30:34 +0800 Subject: [PATCH 30/95] feat: msgbox support high dpi Signed-off-by: Ink33 --- global/terminal/double_click_windows.go | 35 ++++++++++++++++++++----- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/global/terminal/double_click_windows.go b/global/terminal/double_click_windows.go index 1fa746c..4c3f4e8 100644 --- a/global/terminal/double_click_windows.go +++ b/global/terminal/double_click_windows.go @@ -6,15 +6,16 @@ package terminal import ( "os" "path/filepath" - "syscall" "unsafe" + "golang.org/x/sys/windows" + "github.com/pkg/errors" ) // RunningByDoubleClick 检查是否通过双击直接运行 func RunningByDoubleClick() bool { - kernel32 := syscall.NewLazyDLL("kernel32.dll") + kernel32 := windows.NewLazySystemDLL("kernel32.dll") lp := kernel32.NewProc("GetConsoleProcessList") if lp != nil { var ids [2]uint32 @@ -29,7 +30,8 @@ func RunningByDoubleClick() bool { // NoMoreDoubleClick 提示用户不要双击运行,并生成安全启动脚本 func NoMoreDoubleClick() error { - r := boxW(0, "请勿通过双击直接运行本程序, 这将导致一些非预料的后果.\n请在shell中运行./go-cqhttp.exe\n点击确认将释出安全启动脚本,点击取消则关闭程序", "警告", 0x00000030|0x00000001) + toHighDPI() + r := boxW(getConsoleWindows(), "请勿通过双击直接运行本程序, 这将导致一些非预料的后果.\n请在shell中运行./go-cqhttp.exe\n点击确认将释出安全启动脚本,点击取消则关闭程序", "警告", 0x00000030|0x00000001) if r == 2 { return nil } @@ -59,9 +61,10 @@ func NoMoreDoubleClick() error { // BoxW of Win32 API. Check https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messageboxw for more detail. func boxW(hwnd uintptr, caption, title string, flags uint) int { - captionPtr, _ := syscall.UTF16PtrFromString(caption) - titlePtr, _ := syscall.UTF16PtrFromString(title) - ret, _, _ := syscall.NewLazyDLL("user32.dll").NewProc("MessageBoxW").Call( + captionPtr, _ := windows.UTF16PtrFromString(caption) + titlePtr, _ := windows.UTF16PtrFromString(title) + u32 := windows.NewLazySystemDLL("user32.dll") + ret, _, _ := u32.NewProc("MessageBoxW").Call( hwnd, uintptr(unsafe.Pointer(captionPtr)), uintptr(unsafe.Pointer(titlePtr)), @@ -69,3 +72,23 @@ func boxW(hwnd uintptr, caption, title string, flags uint) int { return int(ret) } + +// GetConsoleWindows retrieves the window handle used by the console associated with the calling process. +func getConsoleWindows() (hWnd uintptr) { + hWnd, _, _ = windows.NewLazySystemDLL("kernel32.dll").NewProc("GetConsoleWindow").Call() + return +} + +// toHighDPI tries to raise DPI awareness context to DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED +func toHighDPI() { + systemAware := ^uintptr(2) + 1 + unawareGDIScaled := ^uintptr(5) + 1 + u32 := windows.NewLazySystemDLL("user32.dll") + proc := u32.NewProc("SetThreadDpiAwarenessContext") + if proc.Find() != nil { + return + } + for i := unawareGDIScaled; i <= systemAware; i++ { + _, _, _ = u32.NewProc("SetThreadDpiAwarenessContext").Call(i) + } +} From 1dd12df26ac8824fbc18006972273267dc0e0b72 Mon Sep 17 00:00:00 2001 From: CXM <16154023+littlecxm@users.noreply.github.com> Date: Mon, 19 Sep 2022 12:28:06 +0800 Subject: [PATCH 31/95] fix: misc fix (#1699) * chore: gitignore --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 43a051c..9e66494 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,7 @@ device.json data/ logs/ internal/btree/*.lock -internal/btree/*.db \ No newline at end of file +internal/btree/*.db + +# binary builds +go-cqhttp From f4117bfb70f98c5709d23317e874e03ac1134852 Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Thu, 13 Oct 2022 21:27:36 +0800 Subject: [PATCH 32/95] internal/download: move download logic to this package also disable http2 when downloading, may fix some issue For #1563 --- cmd/gocq/login.go | 5 +- coolq/api.go | 12 +- coolq/cqcode.go | 12 +- coolq/event.go | 8 +- global/fs.go | 5 +- global/net.go | 287 +-------------------------------- internal/download/download.go | 295 ++++++++++++++++++++++++++++++++++ internal/selfupdate/update.go | 11 +- 8 files changed, 328 insertions(+), 307 deletions(-) create mode 100644 internal/download/download.go diff --git a/cmd/gocq/login.go b/cmd/gocq/login.go index d963d25..3fc3813 100644 --- a/cmd/gocq/login.go +++ b/cmd/gocq/login.go @@ -15,9 +15,9 @@ import ( "github.com/mattn/go-colorable" "github.com/pkg/errors" log "github.com/sirupsen/logrus" - "github.com/tidwall/gjson" "github.com/Mrs4s/go-cqhttp/global" + "github.com/Mrs4s/go-cqhttp/internal/download" ) var console = bufio.NewReader(os.Stdin) @@ -243,12 +243,11 @@ func getTicket(u string) (str string) { } func fetchCaptcha(id string) string { - data, err := global.GetBytes("https://captcha.go-cqhttp.org/captcha/ticket?id=" + id) + g, err := download.Request{URL: "https://captcha.go-cqhttp.org/captcha/ticket?id=" + id}.JSON() if err != nil { log.Warnf("获取 Ticket 时出现错误: %v", err) return "" } - g := gjson.ParseBytes(data) if g.Get("ticket").Exists() { return g.Get("ticket").String() } diff --git a/coolq/api.go b/coolq/api.go index 526389c..d7275ce 100644 --- a/coolq/api.go +++ b/coolq/api.go @@ -27,6 +27,7 @@ import ( "github.com/Mrs4s/go-cqhttp/global" "github.com/Mrs4s/go-cqhttp/internal/base" "github.com/Mrs4s/go-cqhttp/internal/cache" + "github.com/Mrs4s/go-cqhttp/internal/download" "github.com/Mrs4s/go-cqhttp/internal/param" "github.com/Mrs4s/go-cqhttp/modules/filter" ) @@ -1545,12 +1546,8 @@ func (bot *CQBot) CQGetImage(file string) global.MSG { } local := path.Join(global.CachePath, file+path.Ext(msg["filename"].(string))) if !global.PathExists(local) { - if body, err := global.HTTPGetReadCloser(msg["url"].(string)); err == nil { - f, _ := os.OpenFile(local, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o0644) - _, _ = f.ReadFrom(body) - _ = body.Close() - _ = f.Close() - } else { + r := download.Request{URL: msg["url"].(string)} + if err := r.WriteToFile(local); err != nil { log.Warnf("下载图片 %v 时出现错误: %v", msg["url"], err) return Failed(100, "DOWNLOAD_IMAGE_ERROR", err.Error()) } @@ -1593,7 +1590,8 @@ func (bot *CQBot) CQDownloadFile(url string, headers gjson.Result, threadCount i return Failed(100, "DELETE_FILE_ERROR", err.Error()) } } - if err := global.DownloadFileMultiThreading(url, file, 0, threadCount, h); err != nil { + r := download.Request{URL: url, Header: h} + if err := r.WriteToFileMultiThreading(file, threadCount); err != nil { log.Warnf("下载链接 %v 时出现错误: %v", url, err) return Failed(100, "DOWNLOAD_FILE_ERROR", err.Error()) } diff --git a/coolq/cqcode.go b/coolq/cqcode.go index 4a3a4f3..c241e34 100644 --- a/coolq/cqcode.go +++ b/coolq/cqcode.go @@ -29,6 +29,7 @@ import ( "github.com/Mrs4s/go-cqhttp/global" "github.com/Mrs4s/go-cqhttp/internal/base" "github.com/Mrs4s/go-cqhttp/internal/cache" + "github.com/Mrs4s/go-cqhttp/internal/download" "github.com/Mrs4s/go-cqhttp/internal/mime" "github.com/Mrs4s/go-cqhttp/internal/param" ) @@ -895,9 +896,9 @@ func (bot *CQBot) ToElement(t string, d map[string]string, sourceType message.So name := info.Get("track_info.name").Str mid := info.Get("track_info.mid").Str albumMid := info.Get("track_info.album.mid").Str - pinfo, _ := global.GetBytes("http://u.y.qq.com/cgi-bin/musicu.fcg?g_tk=2034008533&uin=0&format=json&data={\"comm\":{\"ct\":23,\"cv\":0},\"url_mid\":{\"module\":\"vkey.GetVkeyServer\",\"method\":\"CgiGetVkey\",\"param\":{\"guid\":\"4311206557\",\"songmid\":[\"" + mid + "\"],\"songtype\":[0],\"uin\":\"0\",\"loginflag\":1,\"platform\":\"23\"}}}&_=1599039471576") + pinfo, _ := download.Request{URL: "http://u.y.qq.com/cgi-bin/musicu.fcg?g_tk=2034008533&uin=0&format=json&data={\"comm\":{\"ct\":23,\"cv\":0},\"url_mid\":{\"module\":\"vkey.GetVkeyServer\",\"method\":\"CgiGetVkey\",\"param\":{\"guid\":\"4311206557\",\"songmid\":[\"" + mid + "\"],\"songtype\":[0],\"uin\":\"0\",\"loginflag\":1,\"platform\":\"23\"}}}&_=1599039471576"}.JSON() jumpURL := "https://i.y.qq.com/v8/playsong.html?platform=11&appshare=android_qq&appversion=10030010&hosteuin=oKnlNenz7i-s7c**&songmid=" + mid + "&type=0&appsongtype=1&_wv=1&source=qq&ADTAG=qfshare" - purl := gjson.ParseBytes(pinfo).Get("url_mid.data.midurlinfo.0.purl").Str + purl := pinfo.Get("url_mid.data.midurlinfo.0.purl").Str preview := "http://y.gtimg.cn/music/photo_new/T002R180x180M000" + albumMid + ".jpg" content := info.Get("track_info.singer.0.name").Str if d["content"] != "" { @@ -1089,8 +1090,11 @@ func (bot *CQBot) makeImageOrVideoElem(d map[string]string, video bool, sourceTy if exist { _ = os.Remove(cacheFile) } - if err := global.DownloadFileMultiThreading(f, cacheFile, maxSize, thread, nil); err != nil { - return nil, err + { + r := download.Request{URL: f, Limit: maxSize} + if err := r.WriteToFileMultiThreading(cacheFile, thread); err != nil { + return nil, err + } } useCacheFile: if video { diff --git a/coolq/event.go b/coolq/event.go index ebdc960..34500e2 100644 --- a/coolq/event.go +++ b/coolq/event.go @@ -4,7 +4,6 @@ import ( "encoding/hex" "encoding/json" "fmt" - "os" "path" "strconv" "strings" @@ -18,6 +17,7 @@ import ( "github.com/Mrs4s/go-cqhttp/global" "github.com/Mrs4s/go-cqhttp/internal/base" "github.com/Mrs4s/go-cqhttp/internal/cache" + "github.com/Mrs4s/go-cqhttp/internal/download" ) // ToFormattedMessage 将给定[]message.IMessageElement转换为通过coolq.SetMessageFormat所定义的消息上报格式 @@ -666,7 +666,8 @@ func (bot *CQBot) checkMedia(e []message.IMessageElement, sourceID int64) { filename := hex.EncodeToString(i.Md5) + ".image" cache.Image.Insert(i.Md5, data) if i.Url != "" && !global.PathExists(path.Join(global.ImagePath, "guild-images", filename)) { - if err := global.DownloadFile(i.Url, path.Join(global.ImagePath, "guild-images", filename), -1, nil); err != nil { + r := download.Request{URL: i.Url} + if err := r.WriteToFile(path.Join(global.ImagePath, "guild-images", filename)); err != nil { log.Warnf("下载频道图片时出现错误: %v", err) } } @@ -684,12 +685,11 @@ func (bot *CQBot) checkMedia(e []message.IMessageElement, sourceID int64) { i.Name = strings.ReplaceAll(i.Name, "{", "") i.Name = strings.ReplaceAll(i.Name, "}", "") if !global.PathExists(path.Join(global.VoicePath, i.Name)) { - b, err := global.GetBytes(i.Url) + err := download.Request{URL: i.Url}.WriteToFile(path.Join(global.VoicePath, i.Name)) if err != nil { log.Warnf("语音文件 %v 下载失败: %v", i.Name, err) continue } - _ = os.WriteFile(path.Join(global.VoicePath, i.Name), b, 0o644) } case *message.ShortVideoElement: data := binary.NewWriterF(func(w *binary.Writer) { diff --git a/global/fs.go b/global/fs.go index f985dd5..046ac2c 100644 --- a/global/fs.go +++ b/global/fs.go @@ -16,6 +16,8 @@ import ( b14 "github.com/fumiama/go-base16384" "github.com/segmentio/asm/base64" log "github.com/sirupsen/logrus" + + "github.com/Mrs4s/go-cqhttp/internal/download" ) const ( @@ -82,8 +84,7 @@ func FindFile(file, cache, p string) (data []byte, err error) { if (cache == "" || cache == "1") && PathExists(cacheFile) { return os.ReadFile(cacheFile) } - data, err = GetBytes(file) - _ = os.WriteFile(cacheFile, data, 0o644) + err = download.Request{URL: file}.WriteToFile(cacheFile) if err != nil { return nil, err } diff --git a/global/net.go b/global/net.go index 0327a7e..030cbea 100644 --- a/global/net.go +++ b/global/net.go @@ -1,304 +1,27 @@ package global import ( - "bufio" - "compress/gzip" "fmt" - "io" - "net/http" - "net/url" - "os" - "strconv" - "strings" - "sync" - - "github.com/pkg/errors" "github.com/tidwall/gjson" - "github.com/Mrs4s/go-cqhttp/internal/base" + "github.com/Mrs4s/go-cqhttp/internal/download" ) -var ( - client = &http.Client{ - Transport: &http.Transport{ - Proxy: func(request *http.Request) (u *url.URL, e error) { - if base.Proxy == "" { - return http.ProxyFromEnvironment(request) - } - return url.Parse(base.Proxy) - }, - ForceAttemptHTTP2: true, - MaxConnsPerHost: 0, - MaxIdleConns: 0, - MaxIdleConnsPerHost: 999, - }, - } - - // ErrOverSize 响应主体过大时返回此错误 - ErrOverSize = errors.New("oversize") - - // UserAgent HTTP请求时使用的UA - UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.66" -) - -// GetBytes 对给定URL发送Get请求,返回响应主体 -func GetBytes(url string) ([]byte, error) { - reader, err := HTTPGetReadCloser(url) - if err != nil { - return nil, err - } - defer func() { - _ = reader.Close() - }() - return io.ReadAll(reader) -} - -// DownloadFile 将给定URL对应的文件下载至给定Path -func DownloadFile(url, path string, limit int64, headers map[string]string) error { - file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0o666) - if err != nil { - return err - } - defer file.Close() - req, err := http.NewRequest(http.MethodGet, url, nil) - if err != nil { - return err - } - - for k, v := range headers { - req.Header.Set(k, v) - } - - resp, err := client.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - if limit > 0 && resp.ContentLength > limit { - return ErrOverSize - } - _, err = file.ReadFrom(resp.Body) - if err != nil { - return err - } - return nil -} - -// DownloadFileMultiThreading 使用threadCount个线程将给定URL对应的文件下载至给定Path -func DownloadFileMultiThreading(url, path string, limit int64, threadCount int, headers map[string]string) error { - if threadCount < 2 { - return DownloadFile(url, path, limit, headers) - } - type BlockMetaData struct { - BeginOffset int64 - EndOffset int64 - DownloadedSize int64 - } - var blocks []*BlockMetaData - var contentLength int64 - errUnsupportedMultiThreading := errors.New("unsupported multi-threading") - // 初始化分块或直接下载 - initOrDownload := func() error { - copyStream := func(s io.ReadCloser) error { - file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0o666) - if err != nil { - return err - } - defer file.Close() - if _, err = file.ReadFrom(s); err != nil { - return err - } - return errUnsupportedMultiThreading - } - req, err := http.NewRequest(http.MethodGet, url, nil) - if err != nil { - return err - } - - for k, v := range headers { - req.Header.Set(k, v) - } - if _, ok := headers["User-Agent"]; !ok { - req.Header["User-Agent"] = []string{UserAgent} - } - req.Header.Set("range", "bytes=0-") - resp, err := client.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - if resp.StatusCode < 200 || resp.StatusCode >= 300 { - return errors.New("response status unsuccessful: " + strconv.FormatInt(int64(resp.StatusCode), 10)) - } - if resp.StatusCode == http.StatusOK { - if limit > 0 && resp.ContentLength > limit { - return ErrOverSize - } - return copyStream(resp.Body) - } - if resp.StatusCode == http.StatusPartialContent { - contentLength = resp.ContentLength - if limit > 0 && resp.ContentLength > limit { - return ErrOverSize - } - blockSize := contentLength - if contentLength > 1024*1024 { - blockSize = (contentLength / int64(threadCount)) - 10 - } - if blockSize == contentLength { - return copyStream(resp.Body) - } - var tmp int64 - for tmp+blockSize < contentLength { - blocks = append(blocks, &BlockMetaData{ - BeginOffset: tmp, - EndOffset: tmp + blockSize - 1, - }) - tmp += blockSize - } - blocks = append(blocks, &BlockMetaData{ - BeginOffset: tmp, - EndOffset: contentLength - 1, - }) - return nil - } - return errors.New("unknown status code") - } - // 下载分块 - downloadBlock := func(block *BlockMetaData) error { - req, _ := http.NewRequest(http.MethodGet, url, nil) - file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0o666) - if err != nil { - return err - } - defer file.Close() - _, _ = file.Seek(block.BeginOffset, io.SeekStart) - writer := bufio.NewWriter(file) - defer writer.Flush() - - for k, v := range headers { - req.Header.Set(k, v) - } - - if _, ok := headers["User-Agent"]; !ok { - req.Header["User-Agent"] = []string{UserAgent} - } - req.Header.Set("range", "bytes="+strconv.FormatInt(block.BeginOffset, 10)+"-"+strconv.FormatInt(block.EndOffset, 10)) - resp, err := client.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - if resp.StatusCode < 200 || resp.StatusCode >= 300 { - return errors.New("response status unsuccessful: " + strconv.FormatInt(int64(resp.StatusCode), 10)) - } - buffer := make([]byte, 1024) - i, err := resp.Body.Read(buffer) - for { - if err != nil && err != io.EOF { - return err - } - i64 := int64(len(buffer[:i])) - needSize := block.EndOffset + 1 - block.BeginOffset - if i64 > needSize { - i64 = needSize - err = io.EOF - } - _, e := writer.Write(buffer[:i64]) - if e != nil { - return e - } - block.BeginOffset += i64 - block.DownloadedSize += i64 - if err == io.EOF || block.BeginOffset > block.EndOffset { - break - } - i, err = resp.Body.Read(buffer) - } - return nil - } - - if err := initOrDownload(); err != nil { - if err == errUnsupportedMultiThreading { - return nil - } - return err - } - wg := sync.WaitGroup{} - wg.Add(len(blocks)) - var lastErr error - for i := range blocks { - go func(b *BlockMetaData) { - defer wg.Done() - if err := downloadBlock(b); err != nil { - lastErr = err - } - }(blocks[i]) - } - wg.Wait() - return lastErr -} - // QQMusicSongInfo 通过给定id在QQ音乐上查找曲目信息 func QQMusicSongInfo(id string) (gjson.Result, error) { - d, err := GetBytes(`https://u.y.qq.com/cgi-bin/musicu.fcg?format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0&data={%22comm%22:{%22ct%22:24,%22cv%22:0},%22songinfo%22:{%22method%22:%22get_song_detail_yqq%22,%22param%22:{%22song_type%22:0,%22song_mid%22:%22%22,%22song_id%22:` + id + `},%22module%22:%22music.pf_song_detail_svr%22}}`) + d, err := download.Request{URL: `https://u.y.qq.com/cgi-bin/musicu.fcg?format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0&data={%22comm%22:{%22ct%22:24,%22cv%22:0},%22songinfo%22:{%22method%22:%22get_song_detail_yqq%22,%22param%22:{%22song_type%22:0,%22song_mid%22:%22%22,%22song_id%22:` + id + `},%22module%22:%22music.pf_song_detail_svr%22}}`}.JSON() if err != nil { return gjson.Result{}, err } - return gjson.ParseBytes(d).Get("songinfo.data"), nil + return d.Get("songinfo.data"), nil } // NeteaseMusicSongInfo 通过给定id在wdd音乐上查找曲目信息 func NeteaseMusicSongInfo(id string) (gjson.Result, error) { - d, err := GetBytes(fmt.Sprintf("http://music.163.com/api/song/detail/?id=%s&ids=%%5B%s%%5D", id, id)) + d, err := download.Request{URL: fmt.Sprintf("http://music.163.com/api/song/detail/?id=%s&ids=%%5B%s%%5D", id, id)}.JSON() if err != nil { return gjson.Result{}, err } - return gjson.ParseBytes(d).Get("songs.0"), nil -} - -type gzipCloser struct { - f io.Closer - r *gzip.Reader -} - -// NewGzipReadCloser 从 io.ReadCloser 创建 gunzip io.ReadCloser -func NewGzipReadCloser(reader io.ReadCloser) (io.ReadCloser, error) { - gzipReader, err := gzip.NewReader(reader) - if err != nil { - return nil, err - } - return &gzipCloser{ - f: reader, - r: gzipReader, - }, nil -} - -// Read impls io.Reader -func (g *gzipCloser) Read(p []byte) (n int, err error) { - return g.r.Read(p) -} - -// Close impls io.Closer -func (g *gzipCloser) Close() error { - _ = g.f.Close() - return g.r.Close() -} - -// HTTPGetReadCloser 从 Http url 获取 io.ReadCloser -func HTTPGetReadCloser(url string) (io.ReadCloser, error) { - req, err := http.NewRequest(http.MethodGet, url, nil) - if err != nil { - return nil, err - } - req.Header["User-Agent"] = []string{UserAgent} - resp, err := client.Do(req) - if err != nil { - return nil, err - } - if strings.Contains(resp.Header.Get("Content-Encoding"), "gzip") { - return NewGzipReadCloser(resp.Body) - } - return resp.Body, err + return d.Get("songs.0"), nil } diff --git a/internal/download/download.go b/internal/download/download.go new file mode 100644 index 0000000..b44bb6d --- /dev/null +++ b/internal/download/download.go @@ -0,0 +1,295 @@ +package download + +import ( + "bufio" + "compress/gzip" + "fmt" + "io" + "net/http" + "net/url" + "os" + "strconv" + "strings" + "sync" + + "github.com/pkg/errors" + "github.com/tidwall/gjson" + + "github.com/Mrs4s/go-cqhttp/internal/base" +) + +var client = &http.Client{ + Transport: &http.Transport{ + Proxy: func(request *http.Request) (u *url.URL, e error) { + if base.Proxy == "" { + return http.ProxyFromEnvironment(request) + } + return url.Parse(base.Proxy) + }, + ForceAttemptHTTP2: false, + MaxConnsPerHost: 0, + MaxIdleConns: 0, + MaxIdleConnsPerHost: 999, + }, +} + +// ErrOverSize 响应主体过大时返回此错误 +var ErrOverSize = errors.New("oversize") + +// UserAgent HTTP请求时使用的UA +const UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.66" + +type Request struct { + URL string + Header map[string]string + Limit int64 +} + +func (r Request) do() (*http.Response, error) { + req, err := http.NewRequest(http.MethodGet, r.URL, nil) + if err != nil { + return nil, err + } + + req.Header["User-Agent"] = []string{UserAgent} + for k, v := range r.Header { + req.Header.Set(k, v) + } + + return client.Do(req) +} + +func (r Request) body() (io.ReadCloser, error) { + resp, err := r.do() + if err != nil { + return nil, err + } + + limit := r.Limit // check file size limit + if limit > 0 && resp.ContentLength > limit { + _ = resp.Body.Close() + return nil, ErrOverSize + } + + if strings.Contains(resp.Header.Get("Content-Encoding"), "gzip") { + return gzipReadCloser(resp.Body) + } + return resp.Body, err +} + +// Bytes 对给定URL发送Get请求,返回响应主体 +func (r Request) Bytes() ([]byte, error) { + rd, err := r.body() + if err != nil { + return nil, err + } + defer rd.Close() + return io.ReadAll(rd) +} + +func (r Request) JSON() (gjson.Result, error) { + rd, err := r.body() + if err != nil { + return gjson.Result{}, err + } + defer rd.Close() + + var sb strings.Builder + _, err = io.Copy(&sb, rd) + if err != nil { + return gjson.Result{}, err + } + + return gjson.Parse(sb.String()), nil +} + +func writeToFile(reader io.ReadCloser, path string) error { + file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0o644) + if err != nil { + return err + } + _, err = file.ReadFrom(reader) + return err +} + +func (r Request) WriteToFile(path string) error { + rd, err := r.body() + if err != nil { + return err + } + defer rd.Close() + return writeToFile(rd, path) +} + +func (r Request) WriteToFileMultiThreading(path string, thread int) error { + if thread < 2 { + return r.WriteToFile(path) + } + + limit := r.Limit + type BlockMetaData struct { + BeginOffset int64 + EndOffset int64 + DownloadedSize int64 + } + var blocks []*BlockMetaData + var contentLength int64 + errUnsupportedMultiThreading := errors.New("unsupported multi-threading") + // 初始化分块或直接下载 + initOrDownload := func() error { + header := make(map[string]string, len(r.Header)) + for k, v := range r.Header { // copy headers + header[k] = v + } + header["range"] = "bytes=0-" + req := Request{ + URL: r.URL, + Header: header, + } + resp, err := req.do() + if err != nil { + return err + } + defer resp.Body.Close() + if resp.StatusCode < 200 || resp.StatusCode >= 300 { + return errors.New("response status unsuccessful: " + strconv.FormatInt(int64(resp.StatusCode), 10)) + } + if resp.StatusCode == http.StatusOK { + if limit > 0 && resp.ContentLength > limit { + return ErrOverSize + } + if err = writeToFile(resp.Body, path); err != nil { + return err + } + return errUnsupportedMultiThreading + } + if resp.StatusCode == http.StatusPartialContent { + contentLength = resp.ContentLength + if limit > 0 && resp.ContentLength > limit { + return ErrOverSize + } + blockSize := contentLength + if contentLength > 1024*1024 { + blockSize = (contentLength / int64(thread)) - 10 + } + if blockSize == contentLength { + return writeToFile(resp.Body, path) + } + var tmp int64 + for tmp+blockSize < contentLength { + blocks = append(blocks, &BlockMetaData{ + BeginOffset: tmp, + EndOffset: tmp + blockSize - 1, + }) + tmp += blockSize + } + blocks = append(blocks, &BlockMetaData{ + BeginOffset: tmp, + EndOffset: contentLength - 1, + }) + return nil + } + return errors.New("unknown status code") + } + // 下载分块 + downloadBlock := func(block *BlockMetaData) error { + file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0o666) + if err != nil { + return err + } + defer file.Close() + _, _ = file.Seek(block.BeginOffset, io.SeekStart) + writer := bufio.NewWriter(file) + defer writer.Flush() + + header := make(map[string]string, len(r.Header)) + for k, v := range r.Header { // copy headers + header[k] = v + } + header["range"] = fmt.Sprintf("bytes=%d-%d", block.BeginOffset, block.EndOffset) + req := Request{ + URL: r.URL, + Header: header, + } + resp, err := req.do() + if err != nil { + return err + } + defer resp.Body.Close() + if resp.StatusCode < 200 || resp.StatusCode >= 300 { + return errors.New("response status unsuccessful: " + strconv.FormatInt(int64(resp.StatusCode), 10)) + } + buffer := make([]byte, 1024) + i, err := resp.Body.Read(buffer) + for { + if err != nil && err != io.EOF { + return err + } + i64 := int64(len(buffer[:i])) + needSize := block.EndOffset + 1 - block.BeginOffset + if i64 > needSize { + i64 = needSize + err = io.EOF + } + _, e := writer.Write(buffer[:i64]) + if e != nil { + return e + } + block.BeginOffset += i64 + block.DownloadedSize += i64 + if err == io.EOF || block.BeginOffset > block.EndOffset { + break + } + i, err = resp.Body.Read(buffer) + } + return nil + } + + if err := initOrDownload(); err != nil { + if err == errUnsupportedMultiThreading { + return nil + } + return err + } + wg := sync.WaitGroup{} + wg.Add(len(blocks)) + var lastErr error + for i := range blocks { + go func(b *BlockMetaData) { + defer wg.Done() + if err := downloadBlock(b); err != nil { + lastErr = err + } + }(blocks[i]) + } + wg.Wait() + return lastErr +} + +type gzipCloser struct { + f io.Closer + r *gzip.Reader +} + +// gzipReadCloser 从 io.ReadCloser 创建 gunzip io.ReadCloser +func gzipReadCloser(reader io.ReadCloser) (io.ReadCloser, error) { + gzipReader, err := gzip.NewReader(reader) + if err != nil { + return nil, err + } + return &gzipCloser{ + f: reader, + r: gzipReader, + }, nil +} + +// Read impls io.Reader +func (g *gzipCloser) Read(p []byte) (n int, err error) { + return g.r.Read(p) +} + +// Close impls io.Closer +func (g *gzipCloser) Close() error { + _ = g.f.Close() + return g.r.Close() +} diff --git a/internal/selfupdate/update.go b/internal/selfupdate/update.go index 8771502..108e5fc 100644 --- a/internal/selfupdate/update.go +++ b/internal/selfupdate/update.go @@ -3,6 +3,7 @@ package selfupdate import ( "bufio" + "bytes" "encoding/hex" "fmt" "hash" @@ -14,10 +15,10 @@ import ( "strings" "github.com/sirupsen/logrus" - "github.com/tidwall/gjson" "github.com/Mrs4s/go-cqhttp/global" "github.com/Mrs4s/go-cqhttp/internal/base" + "github.com/Mrs4s/go-cqhttp/internal/download" ) func readLine() (str string) { @@ -28,11 +29,11 @@ func readLine() (str string) { } func lastVersion() (string, error) { - r, err := global.GetBytes("https://api.github.com/repos/Mrs4s/go-cqhttp/releases/latest") + r, err := download.Request{URL: "https://api.github.com/repos/Mrs4s/go-cqhttp/releases/latest"}.JSON() if err != nil { return "", err } - return gjson.GetBytes(r, "tag_name").Str, nil + return r.Get("tag_name").Str, nil } // CheckUpdate 检查更新 @@ -69,12 +70,12 @@ func binaryName() string { func checksum(github, version string) []byte { sumURL := fmt.Sprintf("%v/Mrs4s/go-cqhttp/releases/download/%v/go-cqhttp_checksums.txt", github, version) - closer, err := global.HTTPGetReadCloser(sumURL) + sum, err := download.Request{URL: sumURL}.Bytes() if err != nil { return nil } - rd := bufio.NewReader(closer) + rd := bufio.NewReader(bytes.NewReader(sum)) for { str, err := rd.ReadString('\n') if err != nil { From 997cdceb7a0d80ee391f446715c85af48924247b Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Thu, 13 Oct 2022 21:34:08 +0800 Subject: [PATCH 33/95] internal/download: add comments make lint happy! --- internal/download/download.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/internal/download/download.go b/internal/download/download.go index b44bb6d..1387168 100644 --- a/internal/download/download.go +++ b/internal/download/download.go @@ -1,3 +1,4 @@ +// Package download provide download utility functions package download import ( @@ -39,6 +40,7 @@ var ErrOverSize = errors.New("oversize") // UserAgent HTTP请求时使用的UA const UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.66" +// Request is a file download request type Request struct { URL string Header map[string]string @@ -87,6 +89,7 @@ func (r Request) Bytes() ([]byte, error) { return io.ReadAll(rd) } +// JSON 发送GET请求, 并转换响应为JSON func (r Request) JSON() (gjson.Result, error) { rd, err := r.body() if err != nil { @@ -112,6 +115,7 @@ func writeToFile(reader io.ReadCloser, path string) error { return err } +// WriteToFile 下载到制定目录 func (r Request) WriteToFile(path string) error { rd, err := r.body() if err != nil { @@ -121,6 +125,7 @@ func (r Request) WriteToFile(path string) error { return writeToFile(rd, path) } +// WriteToFileMultiThreading 多线程下载到制定目录 func (r Request) WriteToFileMultiThreading(path string, thread int) error { if thread < 2 { return r.WriteToFile(path) From db64699f3cec8dfe6ea3f6be44b9257e83e1eed0 Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Thu, 3 Nov 2022 20:47:43 +0800 Subject: [PATCH 34/95] all: use os.Chdir instead of fork a process when changing working directory --- cmd/gocq/main.go | 5 ++++- internal/base/flag.go | 33 --------------------------------- 2 files changed, 4 insertions(+), 34 deletions(-) diff --git a/cmd/gocq/main.go b/cmd/gocq/main.go index 442f73e..2177fcd 100644 --- a/cmd/gocq/main.go +++ b/cmd/gocq/main.go @@ -56,7 +56,10 @@ func Main() { case base.LittleH: base.Help() case base.LittleWD != "": - base.ResetWorkingDir() + err := os.Chdir(base.LittleWD) + if err != nil { + log.Fatalf("重置工作目录时出现错误: %v", err) + } case base.LittleD: server.Daemon() } diff --git a/internal/base/flag.go b/internal/base/flag.go index 24ad361..94da9b1 100644 --- a/internal/base/flag.go +++ b/internal/base/flag.go @@ -5,13 +5,9 @@ import ( "flag" "fmt" "os" - "os/exec" "path" - "path/filepath" - "strings" "time" - "github.com/pkg/errors" log "github.com/sirupsen/logrus" "gopkg.in/yaml.v3" @@ -128,32 +124,3 @@ Options: flag.PrintDefaults() os.Exit(0) } - -// ResetWorkingDir 重设工作路径 -func ResetWorkingDir() { - wd := LittleWD - args := make([]string, 0, len(os.Args)) - for i := 1; i < len(os.Args); i++ { - if os.Args[i] == "-w" { - i++ // skip value field - } else if !strings.HasPrefix(os.Args[i], "-w") { - args = append(args, os.Args[i]) - } - } - ex, _ := os.Executable() - p, _ := filepath.Abs(ex) - _, err := os.Stat(p) - if !(err == nil || errors.Is(err, os.ErrExist)) { - log.Fatalf("重置工作目录时出现错误: 无法找到路径 %v", p) - } - proc := exec.Command(p, args...) - proc.Stdin = os.Stdin - proc.Stdout = os.Stdout - proc.Stderr = os.Stderr - proc.Dir = wd - err = proc.Run() - if err != nil { - panic(err) - } - os.Exit(0) -} From de44adbfa164ef87feb9f9189ac77603a3c82f6f Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Thu, 3 Nov 2022 20:55:01 +0800 Subject: [PATCH 35/95] internal/base: use relative path in flag -c default value --- internal/base/flag.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/internal/base/flag.go b/internal/base/flag.go index 94da9b1..38790ee 100644 --- a/internal/base/flag.go +++ b/internal/base/flag.go @@ -5,7 +5,6 @@ import ( "flag" "fmt" "os" - "path" "time" log "github.com/sirupsen/logrus" @@ -54,9 +53,7 @@ var ( // Parse parse flags func Parse() { - wd, _ := os.Getwd() - dc := path.Join(wd, "config.yml") - flag.StringVar(&LittleC, "c", dc, "configuration filename") + flag.StringVar(&LittleC, "c", "config.yml", "configuration filename") flag.BoolVar(&LittleD, "d", false, "running as a daemon") flag.BoolVar(&LittleH, "h", false, "this Help") flag.StringVar(&LittleWD, "w", "", "cover the working directory") From 93fa36034a3c5dc7ce2ea86610557c46317dfa7e Mon Sep 17 00:00:00 2001 From: Madray Haven Date: Tue, 8 Nov 2022 09:46:46 +0800 Subject: [PATCH 36/95] fix: daemon mode --- cmd/gocq/main.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cmd/gocq/main.go b/cmd/gocq/main.go index 2177fcd..50699a3 100644 --- a/cmd/gocq/main.go +++ b/cmd/gocq/main.go @@ -55,13 +55,14 @@ func Main() { switch { case base.LittleH: base.Help() - case base.LittleWD != "": + case base.LittleD: + server.Daemon() + } + if base.LittleWD != "" { err := os.Chdir(base.LittleWD) if err != nil { log.Fatalf("重置工作目录时出现错误: %v", err) } - case base.LittleD: - server.Daemon() } base.Init() From c84d5832351a984114199501aee6b429d7a70d69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Wed, 9 Nov 2022 16:38:33 +0800 Subject: [PATCH 37/95] feat: add sqlite3 database support --- db/sqlite3/model.go | 72 ++++++++ db/sqlite3/sqlite3.go | 391 ++++++++++++++++++++++++++++++++++++++++++ go.mod | 12 +- go.sum | 143 ++++++++++++++- 4 files changed, 610 insertions(+), 8 deletions(-) create mode 100644 db/sqlite3/model.go create mode 100644 db/sqlite3/sqlite3.go diff --git a/db/sqlite3/model.go b/db/sqlite3/model.go new file mode 100644 index 0000000..0afb8e1 --- /dev/null +++ b/db/sqlite3/model.go @@ -0,0 +1,72 @@ +package sqlite3 + +const ( + Sqlite3GroupMessageTableName = "grpmsg" + Sqlite3MessageAttributeTableName = "msgattr" + Sqlite3GuildMessageAttributeTableName = "gmsgattr" + Sqlite3QuotedInfoTableName = "quoinf" + Sqlite3PrivateMessageTableName = "privmsg" + Sqlite3GuildChannelMessageTableName = "guildmsg" +) + +// StoredMessageAttribute 持久化消息属性 +type StoredMessageAttribute struct { + ID int64 // ID is the crc64 of 字段s below + MessageSeq int32 + InternalID int32 + SenderUin int64 + SenderName string + Timestamp int64 +} + +// StoredGuildMessageAttribute 持久化频道消息属性 +type StoredGuildMessageAttribute struct { + ID int64 // ID is the crc64 of 字段s below + MessageSeq int64 + InternalID int64 + SenderTinyID int64 + SenderName string + Timestamp int64 +} + +// QuotedInfo 引用回复 +type QuotedInfo struct { + ID int64 // ID is the crc64 of 字段s below + PrevID string + PrevGlobalID int32 + QuotedContent string // QuotedContent is json of original content +} + +// StoredGroupMessage 持久化群消息 +type StoredGroupMessage struct { + GlobalID int32 + ID string + AttributeID int64 + SubType string + QuotedInfoID int64 + GroupCode int64 + AnonymousID string + Content string // Content is json of original content +} + +// StoredPrivateMessage 持久化私聊消息 +type StoredPrivateMessage struct { + GlobalID int32 + ID string + AttributeID int64 + SubType string + QuotedInfoID int64 + SessionUin int64 + TargetUin int64 + Content string // Content is json of original content +} + +// StoredGuildChannelMessage 持久化频道消息 +type StoredGuildChannelMessage struct { + ID string + AttributeID int64 + GuildID int64 + ChannelID int64 + QuotedInfoID int64 + Content string // Content is json of original content +} diff --git a/db/sqlite3/sqlite3.go b/db/sqlite3/sqlite3.go new file mode 100644 index 0000000..e806679 --- /dev/null +++ b/db/sqlite3/sqlite3.go @@ -0,0 +1,391 @@ +package sqlite3 + +import ( + "encoding/json" + "hash/crc64" + "os" + "path" + "strconv" + "sync" + "time" + + sql "github.com/FloatTech/sqlite" + "github.com/pkg/errors" + "gopkg.in/yaml.v3" + + "github.com/Mrs4s/MiraiGo/binary" + "github.com/Mrs4s/MiraiGo/utils" + "github.com/Mrs4s/go-cqhttp/db" +) + +type database struct { + sync.RWMutex + db *sql.Sqlite + ttl time.Duration +} + +// config mongodb 相关配置 +type config struct { + Enable bool `yaml:"enable"` + CacheTTL time.Duration `yaml:"cachettl"` +} + +func init() { + db.Register("sqlite3", func(node yaml.Node) db.Database { + conf := new(config) + _ = node.Decode(conf) + if !conf.Enable { + return nil + } + return &database{db: new(sql.Sqlite), ttl: conf.CacheTTL} + }) +} + +func (s *database) Open() error { + s.db.DBPath = path.Join("data", "sqlite3") + _ = os.MkdirAll(s.db.DBPath, 0755) + err := s.db.Open(s.ttl) + if err != nil { + return errors.Wrap(err, "open sqlite3 error") + } + return nil +} + +func (s *database) GetMessageByGlobalID(id int32) (db.StoredMessage, error) { + if r, err := s.GetGroupMessageByGlobalID(id); err == nil { + return r, nil + } + return s.GetPrivateMessageByGlobalID(id) +} + +func (s *database) GetGroupMessageByGlobalID(id int32) (*db.StoredGroupMessage, error) { + var ret db.StoredGroupMessage + var grpmsg StoredGroupMessage + s.RLock() + err := s.db.Find(Sqlite3GroupMessageTableName, &grpmsg, "WHERE GlobalID="+strconv.Itoa(int(id))) + s.RUnlock() + if err != nil { + return nil, errors.Wrap(err, "query error") + } + ret.ID = grpmsg.ID + ret.GlobalID = grpmsg.GlobalID + ret.SubType = grpmsg.SubType + ret.GroupCode = grpmsg.GroupCode + ret.AnonymousID = grpmsg.AnonymousID + _ = json.Unmarshal(utils.S2B(grpmsg.Content), &ret.Content) + var attr StoredMessageAttribute + s.RLock() + err = s.db.Find(Sqlite3MessageAttributeTableName, &attr, "WHERE ID="+strconv.FormatInt(grpmsg.AttributeID, 10)) + s.RUnlock() + if err == nil { + ret.Attribute = &db.StoredMessageAttribute{ + MessageSeq: attr.MessageSeq, + InternalID: attr.InternalID, + SenderUin: attr.SenderUin, + SenderName: attr.SenderName, + Timestamp: attr.Timestamp, + } + } + var quoinf QuotedInfo + s.RLock() + err = s.db.Find(Sqlite3QuotedInfoTableName, &quoinf, "WHERE ID="+strconv.FormatInt(grpmsg.QuotedInfoID, 10)) + s.RUnlock() + if err == nil { + ret.QuotedInfo = &db.QuotedInfo{ + PrevID: quoinf.PrevID, + PrevGlobalID: quoinf.PrevGlobalID, + } + _ = json.Unmarshal(utils.S2B(quoinf.QuotedContent), &ret.QuotedInfo.QuotedContent) + } + return &ret, nil +} + +func (s *database) GetPrivateMessageByGlobalID(id int32) (*db.StoredPrivateMessage, error) { + var ret db.StoredPrivateMessage + var privmsg StoredPrivateMessage + s.RLock() + err := s.db.Find(Sqlite3PrivateMessageTableName, &privmsg, "WHERE GlobalID="+strconv.Itoa(int(id))) + s.RUnlock() + if err != nil { + return nil, errors.Wrap(err, "query error") + } + ret.ID = privmsg.ID + ret.GlobalID = privmsg.GlobalID + ret.SubType = privmsg.SubType + ret.SessionUin = privmsg.SessionUin + ret.TargetUin = privmsg.TargetUin + _ = json.Unmarshal(utils.S2B(privmsg.Content), &ret.Content) + var attr StoredMessageAttribute + s.RLock() + err = s.db.Find(Sqlite3MessageAttributeTableName, &attr, "WHERE ID="+strconv.FormatInt(privmsg.AttributeID, 10)) + s.RUnlock() + if err == nil { + ret.Attribute = &db.StoredMessageAttribute{ + MessageSeq: attr.MessageSeq, + InternalID: attr.InternalID, + SenderUin: attr.SenderUin, + SenderName: attr.SenderName, + Timestamp: attr.Timestamp, + } + } + var quoinf QuotedInfo + s.RLock() + err = s.db.Find(Sqlite3QuotedInfoTableName, &quoinf, "WHERE ID="+strconv.FormatInt(privmsg.QuotedInfoID, 10)) + s.RUnlock() + if err == nil { + ret.QuotedInfo = &db.QuotedInfo{ + PrevID: quoinf.PrevID, + PrevGlobalID: quoinf.PrevGlobalID, + } + _ = json.Unmarshal(utils.S2B(quoinf.QuotedContent), &ret.QuotedInfo.QuotedContent) + } + return &ret, nil +} + +func (s *database) GetGuildChannelMessageByID(id string) (*db.StoredGuildChannelMessage, error) { + var ret db.StoredGuildChannelMessage + var guildmsg StoredGuildChannelMessage + s.RLock() + err := s.db.Find(Sqlite3GuildChannelMessageTableName, &guildmsg, "WHERE ID='"+id+"'") + s.RUnlock() + if err != nil { + return nil, errors.Wrap(err, "query error") + } + ret.ID = guildmsg.ID + ret.GuildID = uint64(guildmsg.GuildID) + ret.ChannelID = uint64(guildmsg.ChannelID) + _ = json.Unmarshal(utils.S2B(guildmsg.Content), &ret.Content) + var attr StoredGuildMessageAttribute + s.RLock() + err = s.db.Find(Sqlite3GuildMessageAttributeTableName, &attr, "WHERE ID="+strconv.FormatInt(guildmsg.AttributeID, 10)) + s.RUnlock() + if err == nil { + ret.Attribute = &db.StoredGuildMessageAttribute{ + MessageSeq: uint64(attr.MessageSeq), + InternalID: uint64(attr.InternalID), + SenderTinyID: uint64(attr.SenderTinyID), + SenderName: attr.SenderName, + Timestamp: attr.Timestamp, + } + } + var quoinf QuotedInfo + s.RLock() + err = s.db.Find(Sqlite3QuotedInfoTableName, &quoinf, "WHERE ID="+strconv.FormatInt(guildmsg.QuotedInfoID, 10)) + s.RUnlock() + if err == nil { + ret.QuotedInfo = &db.QuotedInfo{ + PrevID: quoinf.PrevID, + PrevGlobalID: quoinf.PrevGlobalID, + } + _ = json.Unmarshal(utils.S2B(quoinf.QuotedContent), &ret.QuotedInfo.QuotedContent) + } + return &ret, nil +} + +func (s *database) InsertGroupMessage(msg *db.StoredGroupMessage) error { + grpmsg := &StoredGroupMessage{ + GlobalID: msg.GlobalID, + ID: msg.ID, + SubType: msg.SubType, + GroupCode: msg.GroupCode, + AnonymousID: msg.AnonymousID, + } + h := crc64.New(crc64.MakeTable(crc64.ISO)) + if msg.Attribute != nil { + h.Write(binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt32(uint32(msg.Attribute.MessageSeq)) + w.WriteUInt32(uint32(msg.Attribute.InternalID)) + w.WriteUInt64(uint64(msg.Attribute.SenderUin)) + w.WriteUInt64(uint64(msg.Attribute.Timestamp)) + })) + h.Write(utils.S2B(msg.Attribute.SenderName)) + id := int64(h.Sum64()) + s.Lock() + err := s.db.Insert(Sqlite3MessageAttributeTableName, &StoredMessageAttribute{ + ID: id, + MessageSeq: msg.Attribute.MessageSeq, + InternalID: msg.Attribute.InternalID, + SenderUin: msg.Attribute.SenderUin, + SenderName: msg.Attribute.SenderName, + Timestamp: msg.Attribute.Timestamp, + }) + s.Unlock() + if err == nil { + grpmsg.AttributeID = id + } + h.Reset() + } + if msg.QuotedInfo != nil { + h.Write(utils.S2B(msg.QuotedInfo.PrevID)) + h.Write(binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt32(uint32(msg.QuotedInfo.PrevGlobalID)) + })) + content, err := json.Marshal(&msg.QuotedInfo.QuotedContent) + if err != nil { + return errors.Wrap(err, "insert marshal QuotedContent error") + } + h.Write(content) + id := int64(h.Sum64()) + s.Lock() + err = s.db.Insert(Sqlite3QuotedInfoTableName, &QuotedInfo{ + ID: id, + PrevID: msg.QuotedInfo.PrevID, + PrevGlobalID: msg.QuotedInfo.PrevGlobalID, + QuotedContent: utils.B2S(content), + }) + s.Unlock() + if err == nil { + grpmsg.QuotedInfoID = id + } + } + content, err := json.Marshal(&msg.Content) + if err != nil { + return errors.Wrap(err, "insert marshal Content error") + } + grpmsg.Content = utils.B2S(content) + s.Lock() + err = s.db.Insert(Sqlite3GroupMessageTableName, grpmsg) + s.Unlock() + if err != nil { + return errors.Wrap(err, "insert error") + } + return nil +} + +func (s *database) InsertPrivateMessage(msg *db.StoredPrivateMessage) error { + privmsg := &StoredPrivateMessage{ + GlobalID: msg.GlobalID, + ID: msg.ID, + SubType: msg.SubType, + SessionUin: msg.SessionUin, + TargetUin: msg.TargetUin, + } + h := crc64.New(crc64.MakeTable(crc64.ISO)) + if msg.Attribute != nil { + h.Write(binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt32(uint32(msg.Attribute.MessageSeq)) + w.WriteUInt32(uint32(msg.Attribute.InternalID)) + w.WriteUInt64(uint64(msg.Attribute.SenderUin)) + w.WriteUInt64(uint64(msg.Attribute.Timestamp)) + })) + h.Write(utils.S2B(msg.Attribute.SenderName)) + id := int64(h.Sum64()) + s.Lock() + err := s.db.Insert(Sqlite3MessageAttributeTableName, &StoredMessageAttribute{ + ID: id, + MessageSeq: msg.Attribute.MessageSeq, + InternalID: msg.Attribute.InternalID, + SenderUin: msg.Attribute.SenderUin, + SenderName: msg.Attribute.SenderName, + Timestamp: msg.Attribute.Timestamp, + }) + s.Unlock() + if err == nil { + privmsg.AttributeID = id + } + h.Reset() + } + if msg.QuotedInfo != nil { + h.Write(utils.S2B(msg.QuotedInfo.PrevID)) + h.Write(binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt32(uint32(msg.QuotedInfo.PrevGlobalID)) + })) + content, err := json.Marshal(&msg.QuotedInfo.QuotedContent) + if err != nil { + return errors.Wrap(err, "insert marshal QuotedContent error") + } + h.Write(content) + id := int64(h.Sum64()) + s.Lock() + err = s.db.Insert(Sqlite3QuotedInfoTableName, &QuotedInfo{ + ID: id, + PrevID: msg.QuotedInfo.PrevID, + PrevGlobalID: msg.QuotedInfo.PrevGlobalID, + QuotedContent: utils.B2S(content), + }) + s.Unlock() + if err == nil { + privmsg.QuotedInfoID = id + } + } + content, err := json.Marshal(&msg.Content) + if err != nil { + return errors.Wrap(err, "insert marshal Content error") + } + privmsg.Content = utils.B2S(content) + s.Lock() + err = s.db.Insert(Sqlite3PrivateMessageTableName, privmsg) + s.Unlock() + if err != nil { + return errors.Wrap(err, "insert error") + } + return nil +} + +func (s *database) InsertGuildChannelMessage(msg *db.StoredGuildChannelMessage) error { + guildmsg := &StoredGuildChannelMessage{ + ID: msg.ID, + GuildID: int64(msg.GuildID), + ChannelID: int64(msg.ChannelID), + } + h := crc64.New(crc64.MakeTable(crc64.ISO)) + if msg.Attribute != nil { + h.Write(binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt32(uint32(msg.Attribute.MessageSeq)) + w.WriteUInt32(uint32(msg.Attribute.InternalID)) + w.WriteUInt64(uint64(msg.Attribute.SenderTinyID)) + w.WriteUInt64(uint64(msg.Attribute.Timestamp)) + })) + h.Write(utils.S2B(msg.Attribute.SenderName)) + id := int64(h.Sum64()) + s.Lock() + err := s.db.Insert(Sqlite3MessageAttributeTableName, &StoredGuildMessageAttribute{ + ID: id, + MessageSeq: int64(msg.Attribute.MessageSeq), + InternalID: int64(msg.Attribute.InternalID), + SenderTinyID: int64(msg.Attribute.SenderTinyID), + SenderName: msg.Attribute.SenderName, + Timestamp: msg.Attribute.Timestamp, + }) + s.Unlock() + if err == nil { + guildmsg.AttributeID = id + } + h.Reset() + } + if msg.QuotedInfo != nil { + h.Write(utils.S2B(msg.QuotedInfo.PrevID)) + h.Write(binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt32(uint32(msg.QuotedInfo.PrevGlobalID)) + })) + content, err := json.Marshal(&msg.QuotedInfo.QuotedContent) + if err != nil { + return errors.Wrap(err, "insert marshal QuotedContent error") + } + h.Write(content) + id := int64(h.Sum64()) + s.Lock() + err = s.db.Insert(Sqlite3QuotedInfoTableName, &QuotedInfo{ + ID: id, + PrevID: msg.QuotedInfo.PrevID, + PrevGlobalID: msg.QuotedInfo.PrevGlobalID, + QuotedContent: utils.B2S(content), + }) + s.Unlock() + if err == nil { + guildmsg.QuotedInfoID = id + } + } + content, err := json.Marshal(&msg.Content) + if err != nil { + return errors.Wrap(err, "insert marshal Content error") + } + guildmsg.Content = utils.B2S(content) + s.Lock() + err = s.db.Insert(Sqlite3GuildChannelMessageTableName, guildmsg) + s.Unlock() + if err != nil { + return errors.Wrap(err, "insert error") + } + return nil +} diff --git a/go.mod b/go.mod index 0de9c8b..8bc52ad 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/Mrs4s/go-cqhttp go 1.19 require ( + github.com/FloatTech/sqlite v0.5.0 github.com/Microsoft/go-winio v0.5.1 github.com/Mrs4s/MiraiGo v0.0.0-20220828090150-a3c348100dfe github.com/RomiChan/syncx v0.0.0-20220404072119-d7ea0ae15a4c @@ -20,18 +21,22 @@ require ( github.com/wdvxdr1123/go-silk v0.0.0-20210316130616-d47b553def60 go.mongodb.org/mongo-driver v1.8.3 golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 + golang.org/x/sys v0.0.0-20220412211240-33da011f77ad golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 gopkg.in/yaml.v3 v3.0.1 ) require ( + github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b // indirect github.com/RomiChan/protobuf v0.1.1-0.20220624030127-3310cba9dbc0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/fumiama/imgsz v0.0.2 // indirect + github.com/fumiama/sqlite3 v1.14.6 // indirect github.com/go-stack/stack v1.8.0 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/go-cmp v0.5.5 // indirect + github.com/google/uuid v1.3.0 // indirect github.com/jonboulle/clockwork v0.2.2 // indirect github.com/klauspost/compress v1.13.6 // indirect github.com/lestrrat-go/strftime v1.0.5 // indirect @@ -47,9 +52,8 @@ require ( github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9 // indirect golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde // indirect - golang.org/x/sys v0.0.0-20220111092808-5a964db01320 // indirect golang.org/x/text v0.3.7 // indirect - modernc.org/libc v1.8.1 // indirect - modernc.org/mathutil v1.2.2 // indirect - modernc.org/memory v1.0.4 // indirect + modernc.org/libc v1.14.6 // indirect + modernc.org/mathutil v1.4.1 // indirect + modernc.org/memory v1.0.5 // indirect ) diff --git a/go.sum b/go.sum index 47b2da4..c4a4423 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,7 @@ +github.com/FloatTech/sqlite v0.5.0 h1:U7J5Omc534PqmH6csfu+ypCo3DS8L91l5lTsxUu3b/U= +github.com/FloatTech/sqlite v0.5.0/go.mod h1:i33d92OtR8jcp5fBUvQtospf27+MkfUxnGwnZ95E/dA= +github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b h1:tvciXWq2nuvTbFeJGLDNIdRX3BI546D3O7k7vrVueZw= +github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b/go.mod h1:fHZFWGquNXuHttu9dUYoKuNbm3dzLETnIOnm1muSfDs= github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY= github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Mrs4s/MiraiGo v0.0.0-20220828090150-a3c348100dfe h1:KpRbU5MRL2dplf01Cbgo8m0+ST1V1A+4cFBQkQA/YAk= @@ -11,6 +15,7 @@ github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc/go.mod h1:OMm github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -20,6 +25,8 @@ github.com/fumiama/go-hide-param v0.1.4 h1:y7TRTzZMdCH9GOXnIzU3B+1BSkcmvejVGmGsz github.com/fumiama/go-hide-param v0.1.4/go.mod h1:vJkQlJIEI56nIyp7tCQu1/2QOyKtZpudsnJkGk9U1aY= github.com/fumiama/imgsz v0.0.2 h1:fAkC0FnIscdKOXwAxlyw3EUba5NzxZdSxGaq3Uyfxak= github.com/fumiama/imgsz v0.0.2/go.mod h1:dR71mI3I2O5u6+PCpd47M9TZptzP+39tRBcbdIkoqM4= +github.com/fumiama/sqlite3 v1.14.6 h1:+e+iygyiDXQJVi7xeXIviBvR7hAc5y20WA9hRwfKn10= +github.com/fumiama/sqlite3 v1.14.6/go.mod h1:Xx9a2/OtHuy9pBjow0N+bE/RhNeZ7zZz5xh25vqbA5A= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -36,11 +43,15 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -112,23 +123,29 @@ github.com/xdg-go/stringprep v1.0.2 h1:6iq84/ryjjeRmMJwxutI51F2GIPlP5BfTvXHeYjyh github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.mongodb.org/mongo-driver v1.8.3 h1:TDKlTkGDKm9kkJVUOAXDK5/fkqKHJVwYQSpoRfB43R4= go.mongodb.org/mongo-driver v1.8.3/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 h1:0es+/5331RGQPcXlMfP+WrnIIS6dNnNRe0WB02W0F4M= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9 h1:0qxwC5n+ttVOINCBeRHO0nq9X7uy8SDsPoi5OaCdIEI= golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde h1:ejfdSekXMDxDLbRrJMwUk6KnSLZ2McaUCVcIKM+N6jc= golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -142,12 +159,17 @@ golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210902050250-f475640dd07b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220111092808-5a964db01320 h1:0jf+tOCoZ3LyutmCOWpVni1chK4VfFLhRsDK7MhqGRY= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220111092808-5a964db01320/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -161,6 +183,10 @@ golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 h1:GZokNIeuVkl3aZHJchRrr13W golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -182,10 +208,119 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -modernc.org/libc v1.8.1 h1:y9oPIhwcaFXxX7kMp6Qb2ZLKzr0mDkikWN3CV5GS63o= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.33.6/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.33.9/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.33.11/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.34.0/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.35.0/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.35.4/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.35.5/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.35.7/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.35.8/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.35.10/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.35.15/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.35.16/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.35.17/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.35.18/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.35.20/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.35.22/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/ccgo/v3 v3.9.5/go.mod h1:umuo2EP2oDSBnD3ckjaVUXMrmeAw8C8OSICVa0iFf60= +modernc.org/ccgo/v3 v3.10.0/go.mod h1:c0yBmkRFi7uW4J7fwx/JiijwOjeAeR2NoSaRVFPmjMw= +modernc.org/ccgo/v3 v3.11.0/go.mod h1:dGNposbDp9TOZ/1KBxghxtUp/bzErD0/0QW4hhSaBMI= +modernc.org/ccgo/v3 v3.11.1/go.mod h1:lWHxfsn13L3f7hgGsGlU28D9eUOf6y3ZYHKoPaKU0ag= +modernc.org/ccgo/v3 v3.11.3/go.mod h1:0oHunRBMBiXOKdaglfMlRPBALQqsfrCKXgw9okQ3GEw= +modernc.org/ccgo/v3 v3.12.4/go.mod h1:Bk+m6m2tsooJchP/Yk5ji56cClmN6R1cqc9o/YtbgBQ= +modernc.org/ccgo/v3 v3.12.6/go.mod h1:0Ji3ruvpFPpz+yu+1m0wk68pdr/LENABhTrDkMDWH6c= +modernc.org/ccgo/v3 v3.12.8/go.mod h1:Hq9keM4ZfjCDuDXxaHptpv9N24JhgBZmUG5q60iLgUo= +modernc.org/ccgo/v3 v3.12.11/go.mod h1:0jVcmyDwDKDGWbcrzQ+xwJjbhZruHtouiBEvDfoIsdg= +modernc.org/ccgo/v3 v3.12.14/go.mod h1:GhTu1k0YCpJSuWwtRAEHAol5W7g1/RRfS4/9hc9vF5I= +modernc.org/ccgo/v3 v3.12.18/go.mod h1:jvg/xVdWWmZACSgOiAhpWpwHWylbJaSzayCqNOJKIhs= +modernc.org/ccgo/v3 v3.12.20/go.mod h1:aKEdssiu7gVgSy/jjMastnv/q6wWGRbszbheXgWRHc8= +modernc.org/ccgo/v3 v3.12.21/go.mod h1:ydgg2tEprnyMn159ZO/N4pLBqpL7NOkJ88GT5zNU2dE= +modernc.org/ccgo/v3 v3.12.22/go.mod h1:nyDVFMmMWhMsgQw+5JH6B6o4MnZ+UQNw1pp52XYFPRk= +modernc.org/ccgo/v3 v3.12.25/go.mod h1:UaLyWI26TwyIT4+ZFNjkyTbsPsY3plAEB6E7L/vZV3w= +modernc.org/ccgo/v3 v3.12.29/go.mod h1:FXVjG7YLf9FetsS2OOYcwNhcdOLGt8S9bQ48+OP75cE= +modernc.org/ccgo/v3 v3.12.36/go.mod h1:uP3/Fiezp/Ga8onfvMLpREq+KUjUmYMxXPO8tETHtA8= +modernc.org/ccgo/v3 v3.12.38/go.mod h1:93O0G7baRST1vNj4wnZ49b1kLxt0xCW5Hsa2qRaZPqc= +modernc.org/ccgo/v3 v3.12.43/go.mod h1:k+DqGXd3o7W+inNujK15S5ZYuPoWYLpF5PYougCmthU= +modernc.org/ccgo/v3 v3.12.46/go.mod h1:UZe6EvMSqOxaJ4sznY7b23/k13R8XNlyWsO5bAmSgOE= +modernc.org/ccgo/v3 v3.12.47/go.mod h1:m8d6p0zNps187fhBwzY/ii6gxfjob1VxWb919Nk1HUk= +modernc.org/ccgo/v3 v3.12.50/go.mod h1:bu9YIwtg+HXQxBhsRDE+cJjQRuINuT9PUK4orOco/JI= +modernc.org/ccgo/v3 v3.12.51/go.mod h1:gaIIlx4YpmGO2bLye04/yeblmvWEmE4BBBls4aJXFiE= +modernc.org/ccgo/v3 v3.12.53/go.mod h1:8xWGGTFkdFEWBEsUmi+DBjwu/WLy3SSOrqEmKUjMeEg= +modernc.org/ccgo/v3 v3.12.54/go.mod h1:yANKFTm9llTFVX1FqNKHE0aMcQb1fuPJx6p8AcUx+74= +modernc.org/ccgo/v3 v3.12.55/go.mod h1:rsXiIyJi9psOwiBkplOaHye5L4MOOaCjHg1Fxkj7IeU= +modernc.org/ccgo/v3 v3.12.56/go.mod h1:ljeFks3faDseCkr60JMpeDb2GSO3TKAmrzm7q9YOcMU= +modernc.org/ccgo/v3 v3.12.57/go.mod h1:hNSF4DNVgBl8wYHpMvPqQWDQx8luqxDnNGCMM4NFNMc= +modernc.org/ccgo/v3 v3.12.60/go.mod h1:k/Nn0zdO1xHVWjPYVshDeWKqbRWIfif5dtsIOCUVMqM= +modernc.org/ccgo/v3 v3.12.66/go.mod h1:jUuxlCFZTUZLMV08s7B1ekHX5+LIAurKTTaugUr/EhQ= +modernc.org/ccgo/v3 v3.12.67/go.mod h1:Bll3KwKvGROizP2Xj17GEGOTrlvB1XcVaBrC90ORO84= +modernc.org/ccgo/v3 v3.12.73/go.mod h1:hngkB+nUUqzOf3iqsM48Gf1FZhY599qzVg1iX+BT3cQ= +modernc.org/ccgo/v3 v3.12.81/go.mod h1:p2A1duHoBBg1mFtYvnhAnQyI6vL0uw5PGYLSIgF6rYY= +modernc.org/ccgo/v3 v3.12.84/go.mod h1:ApbflUfa5BKadjHynCficldU1ghjen84tuM5jRynB7w= +modernc.org/ccgo/v3 v3.12.86/go.mod h1:dN7S26DLTgVSni1PVA3KxxHTcykyDurf3OgUzNqTSrU= +modernc.org/ccgo/v3 v3.12.90/go.mod h1:obhSc3CdivCRpYZmrvO88TXlW0NvoSVvdh/ccRjJYko= +modernc.org/ccgo/v3 v3.12.92/go.mod h1:5yDdN7ti9KWPi5bRVWPl8UNhpEAtCjuEE7ayQnzzqHA= +modernc.org/ccgo/v3 v3.13.1/go.mod h1:aBYVOUfIlcSnrsRVU8VRS35y2DIfpgkmVkYZ0tpIXi4= +modernc.org/ccgo/v3 v3.15.9/go.mod h1:md59wBwDT2LznX/OTCPoVS6KIsdRgY8xqQwBV+hkTH0= +modernc.org/ccgo/v3 v3.15.10/go.mod h1:wQKxoFn0ynxMuCLfFD09c8XPUCc8obfchoVR9Cn0fI8= +modernc.org/ccgo/v3 v3.15.12/go.mod h1:VFePOWoCd8uDGRJpq/zfJ29D0EVzMSyID8LCMWYbX6I= +modernc.org/ccorpus v1.11.1/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= modernc.org/libc v1.8.1/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w= +modernc.org/libc v1.9.8/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w= +modernc.org/libc v1.9.11/go.mod h1:NyF3tsA5ArIjJ83XB0JlqhjTabTCHm9aX4XMPHyQn0Q= +modernc.org/libc v1.11.0/go.mod h1:2lOfPmj7cz+g1MrPNmX65QCzVxgNq2C5o0jdLY2gAYg= +modernc.org/libc v1.11.2/go.mod h1:ioIyrl3ETkugDO3SGZ+6EOKvlP3zSOycUETe4XM4n8M= +modernc.org/libc v1.11.5/go.mod h1:k3HDCP95A6U111Q5TmG3nAyUcp3kR5YFZTeDS9v8vSU= +modernc.org/libc v1.11.6/go.mod h1:ddqmzR6p5i4jIGK1d/EiSw97LBcE3dK24QEwCFvgNgE= +modernc.org/libc v1.11.11/go.mod h1:lXEp9QOOk4qAYOtL3BmMve99S5Owz7Qyowzvg6LiZso= +modernc.org/libc v1.11.13/go.mod h1:ZYawJWlXIzXy2Pzghaf7YfM8OKacP3eZQI81PDLFdY8= +modernc.org/libc v1.11.16/go.mod h1:+DJquzYi+DMRUtWI1YNxrlQO6TcA5+dRRiq8HWBWRC8= +modernc.org/libc v1.11.19/go.mod h1:e0dgEame6mkydy19KKaVPBeEnyJB4LGNb0bBH1EtQ3I= +modernc.org/libc v1.11.24/go.mod h1:FOSzE0UwookyT1TtCJrRkvsOrX2k38HoInhw+cSCUGk= +modernc.org/libc v1.11.26/go.mod h1:SFjnYi9OSd2W7f4ct622o/PAYqk7KHv6GS8NZULIjKY= +modernc.org/libc v1.11.27/go.mod h1:zmWm6kcFXt/jpzeCgfvUNswM0qke8qVwxqZrnddlDiE= +modernc.org/libc v1.11.28/go.mod h1:Ii4V0fTFcbq3qrv3CNn+OGHAvzqMBvC7dBNyC4vHZlg= +modernc.org/libc v1.11.31/go.mod h1:FpBncUkEAtopRNJj8aRo29qUiyx5AvAlAxzlx9GNaVM= +modernc.org/libc v1.11.34/go.mod h1:+Tzc4hnb1iaX/SKAutJmfzES6awxfU1BPvrrJO0pYLg= +modernc.org/libc v1.11.37/go.mod h1:dCQebOwoO1046yTrfUE5nX1f3YpGZQKNcITUYWlrAWo= +modernc.org/libc v1.11.39/go.mod h1:mV8lJMo2S5A31uD0k1cMu7vrJbSA3J3waQJxpV4iqx8= +modernc.org/libc v1.11.42/go.mod h1:yzrLDU+sSjLE+D4bIhS7q1L5UwXDOw99PLSX0BlZvSQ= +modernc.org/libc v1.11.44/go.mod h1:KFq33jsma7F5WXiYelU8quMJasCCTnHK0mkri4yPHgA= +modernc.org/libc v1.11.45/go.mod h1:Y192orvfVQQYFzCNsn+Xt0Hxt4DiO4USpLNXBlXg/tM= +modernc.org/libc v1.11.47/go.mod h1:tPkE4PzCTW27E6AIKIR5IwHAQKCAtudEIeAV1/SiyBg= +modernc.org/libc v1.11.49/go.mod h1:9JrJuK5WTtoTWIFQ7QjX2Mb/bagYdZdscI3xrvHbXjE= +modernc.org/libc v1.11.51/go.mod h1:R9I8u9TS+meaWLdbfQhq2kFknTW0O3aw3kEMqDDxMaM= +modernc.org/libc v1.11.53/go.mod h1:5ip5vWYPAoMulkQ5XlSJTy12Sz5U6blOQiYasilVPsU= +modernc.org/libc v1.11.54/go.mod h1:S/FVnskbzVUrjfBqlGFIPA5m7UwB3n9fojHhCNfSsnw= +modernc.org/libc v1.11.55/go.mod h1:j2A5YBRm6HjNkoSs/fzZrSxCuwWqcMYTDPLNx0URn3M= +modernc.org/libc v1.11.56/go.mod h1:pakHkg5JdMLt2OgRadpPOTnyRXm/uzu+Yyg/LSLdi18= +modernc.org/libc v1.11.58/go.mod h1:ns94Rxv0OWyoQrDqMFfWwka2BcaF6/61CqJRK9LP7S8= +modernc.org/libc v1.11.71/go.mod h1:DUOmMYe+IvKi9n6Mycyx3DbjfzSKrdr/0Vgt3j7P5gw= +modernc.org/libc v1.11.75/go.mod h1:dGRVugT6edz361wmD9gk6ax1AbDSe0x5vji0dGJiPT0= +modernc.org/libc v1.11.82/go.mod h1:NF+Ek1BOl2jeC7lw3a7Jj5PWyHPwWD4aq3wVKxqV1fI= +modernc.org/libc v1.11.86/go.mod h1:ePuYgoQLmvxdNT06RpGnaDKJmDNEkV7ZPKI2jnsvZoE= +modernc.org/libc v1.11.87/go.mod h1:Qvd5iXTeLhI5PS0XSyqMY99282y+3euapQFxM7jYnpY= +modernc.org/libc v1.11.88/go.mod h1:h3oIVe8dxmTcchcFuCcJ4nAWaoiwzKCdv82MM0oiIdQ= +modernc.org/libc v1.11.98/go.mod h1:ynK5sbjsU77AP+nn61+k+wxUGRx9rOFcIqWYYMaDZ4c= +modernc.org/libc v1.11.101/go.mod h1:wLLYgEiY2D17NbBOEp+mIJJJBGSiy7fLL4ZrGGZ+8jI= +modernc.org/libc v1.12.0/go.mod h1:2MH3DaF/gCU8i/UBiVE1VFRos4o523M7zipmwH8SIgQ= +modernc.org/libc v1.14.1/go.mod h1:npFeGWjmZTjFeWALQLrvklVmAxv4m80jnG3+xI8FdJk= +modernc.org/libc v1.14.2/go.mod h1:MX1GBLnRLNdvmK9azU9LCxZ5lMyhrbEMK8rG3X/Fe34= +modernc.org/libc v1.14.3/go.mod h1:GPIvQVOVPizzlqyRX3l756/3ppsAgg1QgPxjr5Q4agQ= +modernc.org/libc v1.14.5/go.mod h1:2PJHINagVxO4QW/5OQdRrvMYo+bm5ClpUFfyXCYl9ak= +modernc.org/libc v1.14.6 h1:SSiZiE5199iYsGM9gtkDj90xqcXVwubWG8CtoYE+Mnk= +modernc.org/libc v1.14.6/go.mod h1:2PJHINagVxO4QW/5OQdRrvMYo+bm5ClpUFfyXCYl9ak= modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.2.2 h1:+yFk8hBprV+4c0U9GjFtL+dV3N8hOJ8JCituQcMShFY= modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.0.4 h1:utMBrFcpnQDdNsmM6asmyH/FM9TqLPS7XF7otpJmrwM= +modernc.org/mathutil v1.4.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1 h1:ij3fYGe8zBF4Vu+g0oT7mB06r8sqGWKuJu1yXeR4by8= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/memory v1.0.4/go.mod h1:nV2OApxradM3/OVbs2/0OsP6nPfakXpi50C7dcoHXlc= +modernc.org/memory v1.0.5 h1:XRch8trV7GgvTec2i7jc33YlUI0RKVDBvZ5eZ5m8y14= +modernc.org/memory v1.0.5/go.mod h1:B7OYswTRnfGg+4tDH1t1OeUNnsy2viGTdME4tzd+IjM= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= From 5c78174d1cae992486b6a0ab26c030b520fd7b39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Wed, 9 Nov 2022 16:51:12 +0800 Subject: [PATCH 38/95] fix: possible id == 0 --- db/sqlite3/sqlite3.go | 150 +++++++++++++++++++++++++----------------- 1 file changed, 90 insertions(+), 60 deletions(-) diff --git a/db/sqlite3/sqlite3.go b/db/sqlite3/sqlite3.go index e806679..c550468 100644 --- a/db/sqlite3/sqlite3.go +++ b/db/sqlite3/sqlite3.go @@ -73,29 +73,33 @@ func (s *database) GetGroupMessageByGlobalID(id int32) (*db.StoredGroupMessage, ret.GroupCode = grpmsg.GroupCode ret.AnonymousID = grpmsg.AnonymousID _ = json.Unmarshal(utils.S2B(grpmsg.Content), &ret.Content) - var attr StoredMessageAttribute - s.RLock() - err = s.db.Find(Sqlite3MessageAttributeTableName, &attr, "WHERE ID="+strconv.FormatInt(grpmsg.AttributeID, 10)) - s.RUnlock() - if err == nil { - ret.Attribute = &db.StoredMessageAttribute{ - MessageSeq: attr.MessageSeq, - InternalID: attr.InternalID, - SenderUin: attr.SenderUin, - SenderName: attr.SenderName, - Timestamp: attr.Timestamp, + if grpmsg.AttributeID != 0 { + var attr StoredMessageAttribute + s.RLock() + err = s.db.Find(Sqlite3MessageAttributeTableName, &attr, "WHERE ID="+strconv.FormatInt(grpmsg.AttributeID, 10)) + s.RUnlock() + if err == nil { + ret.Attribute = &db.StoredMessageAttribute{ + MessageSeq: attr.MessageSeq, + InternalID: attr.InternalID, + SenderUin: attr.SenderUin, + SenderName: attr.SenderName, + Timestamp: attr.Timestamp, + } } } - var quoinf QuotedInfo - s.RLock() - err = s.db.Find(Sqlite3QuotedInfoTableName, &quoinf, "WHERE ID="+strconv.FormatInt(grpmsg.QuotedInfoID, 10)) - s.RUnlock() - if err == nil { - ret.QuotedInfo = &db.QuotedInfo{ - PrevID: quoinf.PrevID, - PrevGlobalID: quoinf.PrevGlobalID, + if grpmsg.QuotedInfoID != 0 { + var quoinf QuotedInfo + s.RLock() + err = s.db.Find(Sqlite3QuotedInfoTableName, &quoinf, "WHERE ID="+strconv.FormatInt(grpmsg.QuotedInfoID, 10)) + s.RUnlock() + if err == nil { + ret.QuotedInfo = &db.QuotedInfo{ + PrevID: quoinf.PrevID, + PrevGlobalID: quoinf.PrevGlobalID, + } + _ = json.Unmarshal(utils.S2B(quoinf.QuotedContent), &ret.QuotedInfo.QuotedContent) } - _ = json.Unmarshal(utils.S2B(quoinf.QuotedContent), &ret.QuotedInfo.QuotedContent) } return &ret, nil } @@ -115,29 +119,33 @@ func (s *database) GetPrivateMessageByGlobalID(id int32) (*db.StoredPrivateMessa ret.SessionUin = privmsg.SessionUin ret.TargetUin = privmsg.TargetUin _ = json.Unmarshal(utils.S2B(privmsg.Content), &ret.Content) - var attr StoredMessageAttribute - s.RLock() - err = s.db.Find(Sqlite3MessageAttributeTableName, &attr, "WHERE ID="+strconv.FormatInt(privmsg.AttributeID, 10)) - s.RUnlock() - if err == nil { - ret.Attribute = &db.StoredMessageAttribute{ - MessageSeq: attr.MessageSeq, - InternalID: attr.InternalID, - SenderUin: attr.SenderUin, - SenderName: attr.SenderName, - Timestamp: attr.Timestamp, + if privmsg.AttributeID != 0 { + var attr StoredMessageAttribute + s.RLock() + err = s.db.Find(Sqlite3MessageAttributeTableName, &attr, "WHERE ID="+strconv.FormatInt(privmsg.AttributeID, 10)) + s.RUnlock() + if err == nil { + ret.Attribute = &db.StoredMessageAttribute{ + MessageSeq: attr.MessageSeq, + InternalID: attr.InternalID, + SenderUin: attr.SenderUin, + SenderName: attr.SenderName, + Timestamp: attr.Timestamp, + } } } - var quoinf QuotedInfo - s.RLock() - err = s.db.Find(Sqlite3QuotedInfoTableName, &quoinf, "WHERE ID="+strconv.FormatInt(privmsg.QuotedInfoID, 10)) - s.RUnlock() - if err == nil { - ret.QuotedInfo = &db.QuotedInfo{ - PrevID: quoinf.PrevID, - PrevGlobalID: quoinf.PrevGlobalID, + if privmsg.QuotedInfoID != 0 { + var quoinf QuotedInfo + s.RLock() + err = s.db.Find(Sqlite3QuotedInfoTableName, &quoinf, "WHERE ID="+strconv.FormatInt(privmsg.QuotedInfoID, 10)) + s.RUnlock() + if err == nil { + ret.QuotedInfo = &db.QuotedInfo{ + PrevID: quoinf.PrevID, + PrevGlobalID: quoinf.PrevGlobalID, + } + _ = json.Unmarshal(utils.S2B(quoinf.QuotedContent), &ret.QuotedInfo.QuotedContent) } - _ = json.Unmarshal(utils.S2B(quoinf.QuotedContent), &ret.QuotedInfo.QuotedContent) } return &ret, nil } @@ -155,29 +163,33 @@ func (s *database) GetGuildChannelMessageByID(id string) (*db.StoredGuildChannel ret.GuildID = uint64(guildmsg.GuildID) ret.ChannelID = uint64(guildmsg.ChannelID) _ = json.Unmarshal(utils.S2B(guildmsg.Content), &ret.Content) - var attr StoredGuildMessageAttribute - s.RLock() - err = s.db.Find(Sqlite3GuildMessageAttributeTableName, &attr, "WHERE ID="+strconv.FormatInt(guildmsg.AttributeID, 10)) - s.RUnlock() - if err == nil { - ret.Attribute = &db.StoredGuildMessageAttribute{ - MessageSeq: uint64(attr.MessageSeq), - InternalID: uint64(attr.InternalID), - SenderTinyID: uint64(attr.SenderTinyID), - SenderName: attr.SenderName, - Timestamp: attr.Timestamp, + if guildmsg.AttributeID != 0 { + var attr StoredGuildMessageAttribute + s.RLock() + err = s.db.Find(Sqlite3GuildMessageAttributeTableName, &attr, "WHERE ID="+strconv.FormatInt(guildmsg.AttributeID, 10)) + s.RUnlock() + if err == nil { + ret.Attribute = &db.StoredGuildMessageAttribute{ + MessageSeq: uint64(attr.MessageSeq), + InternalID: uint64(attr.InternalID), + SenderTinyID: uint64(attr.SenderTinyID), + SenderName: attr.SenderName, + Timestamp: attr.Timestamp, + } } } - var quoinf QuotedInfo - s.RLock() - err = s.db.Find(Sqlite3QuotedInfoTableName, &quoinf, "WHERE ID="+strconv.FormatInt(guildmsg.QuotedInfoID, 10)) - s.RUnlock() - if err == nil { - ret.QuotedInfo = &db.QuotedInfo{ - PrevID: quoinf.PrevID, - PrevGlobalID: quoinf.PrevGlobalID, + if guildmsg.QuotedInfoID != 0 { + var quoinf QuotedInfo + s.RLock() + err = s.db.Find(Sqlite3QuotedInfoTableName, &quoinf, "WHERE ID="+strconv.FormatInt(guildmsg.QuotedInfoID, 10)) + s.RUnlock() + if err == nil { + ret.QuotedInfo = &db.QuotedInfo{ + PrevID: quoinf.PrevID, + PrevGlobalID: quoinf.PrevGlobalID, + } + _ = json.Unmarshal(utils.S2B(quoinf.QuotedContent), &ret.QuotedInfo.QuotedContent) } - _ = json.Unmarshal(utils.S2B(quoinf.QuotedContent), &ret.QuotedInfo.QuotedContent) } return &ret, nil } @@ -200,6 +212,9 @@ func (s *database) InsertGroupMessage(msg *db.StoredGroupMessage) error { })) h.Write(utils.S2B(msg.Attribute.SenderName)) id := int64(h.Sum64()) + if id == 0 { + id++ + } s.Lock() err := s.db.Insert(Sqlite3MessageAttributeTableName, &StoredMessageAttribute{ ID: id, @@ -226,6 +241,9 @@ func (s *database) InsertGroupMessage(msg *db.StoredGroupMessage) error { } h.Write(content) id := int64(h.Sum64()) + if id == 0 { + id++ + } s.Lock() err = s.db.Insert(Sqlite3QuotedInfoTableName, &QuotedInfo{ ID: id, @@ -270,6 +288,9 @@ func (s *database) InsertPrivateMessage(msg *db.StoredPrivateMessage) error { })) h.Write(utils.S2B(msg.Attribute.SenderName)) id := int64(h.Sum64()) + if id == 0 { + id++ + } s.Lock() err := s.db.Insert(Sqlite3MessageAttributeTableName, &StoredMessageAttribute{ ID: id, @@ -296,6 +317,9 @@ func (s *database) InsertPrivateMessage(msg *db.StoredPrivateMessage) error { } h.Write(content) id := int64(h.Sum64()) + if id == 0 { + id++ + } s.Lock() err = s.db.Insert(Sqlite3QuotedInfoTableName, &QuotedInfo{ ID: id, @@ -338,6 +362,9 @@ func (s *database) InsertGuildChannelMessage(msg *db.StoredGuildChannelMessage) })) h.Write(utils.S2B(msg.Attribute.SenderName)) id := int64(h.Sum64()) + if id == 0 { + id++ + } s.Lock() err := s.db.Insert(Sqlite3MessageAttributeTableName, &StoredGuildMessageAttribute{ ID: id, @@ -364,6 +391,9 @@ func (s *database) InsertGuildChannelMessage(msg *db.StoredGuildChannelMessage) } h.Write(content) id := int64(h.Sum64()) + if id == 0 { + id++ + } s.Lock() err = s.db.Insert(Sqlite3QuotedInfoTableName, &QuotedInfo{ ID: id, From fdfae87e9734d14904c87cd6b72943029671a017 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Wed, 9 Nov 2022 20:06:07 +0800 Subject: [PATCH 39/95] fix: create table --- db/sqlite3/sqlite3.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/db/sqlite3/sqlite3.go b/db/sqlite3/sqlite3.go index c550468..3dd8027 100644 --- a/db/sqlite3/sqlite3.go +++ b/db/sqlite3/sqlite3.go @@ -48,6 +48,30 @@ func (s *database) Open() error { if err != nil { return errors.Wrap(err, "open sqlite3 error") } + err = s.db.Create(Sqlite3GroupMessageTableName, &StoredGroupMessage{}) + if err != nil { + return errors.Wrap(err, "create sqlite3 table error") + } + err = s.db.Create(Sqlite3MessageAttributeTableName, &StoredMessageAttribute{}) + if err != nil { + return errors.Wrap(err, "create sqlite3 table error") + } + err = s.db.Create(Sqlite3GuildMessageAttributeTableName, &StoredGuildMessageAttribute{}) + if err != nil { + return errors.Wrap(err, "create sqlite3 table error") + } + err = s.db.Create(Sqlite3QuotedInfoTableName, &QuotedInfo{}) + if err != nil { + return errors.Wrap(err, "create sqlite3 table error") + } + err = s.db.Create(Sqlite3PrivateMessageTableName, &StoredPrivateMessage{}) + if err != nil { + return errors.Wrap(err, "create sqlite3 table error") + } + err = s.db.Create(Sqlite3GuildChannelMessageTableName, &StoredGuildChannelMessage{}) + if err != nil { + return errors.Wrap(err, "create sqlite3 table error") + } return nil } From 3d3d19c5931115e14f0d047e676416785c0c6748 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Wed, 9 Nov 2022 20:32:17 +0800 Subject: [PATCH 40/95] fix: dbpath --- db/sqlite3/sqlite3.go | 1 + 1 file changed, 1 insertion(+) diff --git a/db/sqlite3/sqlite3.go b/db/sqlite3/sqlite3.go index 3dd8027..e146833 100644 --- a/db/sqlite3/sqlite3.go +++ b/db/sqlite3/sqlite3.go @@ -44,6 +44,7 @@ func init() { func (s *database) Open() error { s.db.DBPath = path.Join("data", "sqlite3") _ = os.MkdirAll(s.db.DBPath, 0755) + s.db.DBPath += "/msg.db" err := s.db.Open(s.ttl) if err != nil { return errors.Wrap(err, "open sqlite3 error") From 481a7ce8aac424cddcb629e3d7a4de477069fd41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Wed, 9 Nov 2022 20:47:35 +0800 Subject: [PATCH 41/95] feat: use sqlite3 by default --- main.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index 1d79704..008e5d0 100644 --- a/main.go +++ b/main.go @@ -4,9 +4,10 @@ package main import ( "github.com/Mrs4s/go-cqhttp/cmd/gocq" - _ "github.com/Mrs4s/go-cqhttp/db/leveldb" // leveldb + _ "github.com/Mrs4s/go-cqhttp/db/sqlite3" // sqlite3 数据库支持 _ "github.com/Mrs4s/go-cqhttp/modules/silk" // silk编码模块 // 其他模块 + // _ "github.com/Mrs4s/go-cqhttp/db/leveldb" // leveldb 数据库支持 // _ "github.com/Mrs4s/go-cqhttp/db/mongodb" // mongodb 数据库支持 // _ "github.com/Mrs4s/go-cqhttp/modules/pprof" // pprof 性能分析 ) From e6fa400e0521bd3600e8b5cd8b6601206bf9fdf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Wed, 9 Nov 2022 20:53:59 +0800 Subject: [PATCH 42/95] fix: no impl on winarm --- db/sqlite3/leveldb_winarm.go | 6 ++++++ db/sqlite3/model.go | 3 +++ db/sqlite3/sqlite3.go | 3 +++ 3 files changed, 12 insertions(+) create mode 100644 db/sqlite3/leveldb_winarm.go diff --git a/db/sqlite3/leveldb_winarm.go b/db/sqlite3/leveldb_winarm.go new file mode 100644 index 0000000..2512bc1 --- /dev/null +++ b/db/sqlite3/leveldb_winarm.go @@ -0,0 +1,6 @@ +//go:build (windows && arm) || (windows && arm64) +// +build windows,arm windows,arm64 + +package sqlite3 + +import _ "github.com/Mrs4s/go-cqhttp/db/leveldb" // 切换到 leveldb diff --git a/db/sqlite3/model.go b/db/sqlite3/model.go index 0afb8e1..be72c8a 100644 --- a/db/sqlite3/model.go +++ b/db/sqlite3/model.go @@ -1,3 +1,6 @@ +//go:build !((windows || arm) && (windows || arm64)) +// +build !windows,!arm !windows,!arm64 + package sqlite3 const ( diff --git a/db/sqlite3/sqlite3.go b/db/sqlite3/sqlite3.go index e146833..78c9d6e 100644 --- a/db/sqlite3/sqlite3.go +++ b/db/sqlite3/sqlite3.go @@ -1,3 +1,6 @@ +//go:build !((windows || arm) && (windows || arm64)) +// +build !windows,!arm !windows,!arm64 + package sqlite3 import ( From cee4bccf45025c19fa1ea380c388e8f2b36226db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Wed, 9 Nov 2022 20:58:53 +0800 Subject: [PATCH 43/95] fix: no impl on winarm --- db/sqlite3/leveldb_winarm.go | 5 +++-- db/sqlite3/model.go | 4 ++-- db/sqlite3/sqlite3.go | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/db/sqlite3/leveldb_winarm.go b/db/sqlite3/leveldb_winarm.go index 2512bc1..eaae201 100644 --- a/db/sqlite3/leveldb_winarm.go +++ b/db/sqlite3/leveldb_winarm.go @@ -1,5 +1,6 @@ -//go:build (windows && arm) || (windows && arm64) -// +build windows,arm windows,arm64 +//go:build windows && (arm || arm64) +// +build windows +// +build arm arm64 package sqlite3 diff --git a/db/sqlite3/model.go b/db/sqlite3/model.go index be72c8a..93e8a17 100644 --- a/db/sqlite3/model.go +++ b/db/sqlite3/model.go @@ -1,5 +1,5 @@ -//go:build !((windows || arm) && (windows || arm64)) -// +build !windows,!arm !windows,!arm64 +//go:build !(windows && (arm || arm64)) +// +build !windows !arm,!arm64 package sqlite3 diff --git a/db/sqlite3/sqlite3.go b/db/sqlite3/sqlite3.go index 78c9d6e..7d3169b 100644 --- a/db/sqlite3/sqlite3.go +++ b/db/sqlite3/sqlite3.go @@ -1,5 +1,5 @@ -//go:build !((windows || arm) && (windows || arm64)) -// +build !windows,!arm !windows,!arm64 +//go:build !(windows && (arm || arm64)) +// +build !windows !arm,!arm64 package sqlite3 From fc51a69ff191c7d239d9937e8965d6de675dc3d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Wed, 9 Nov 2022 21:10:20 +0800 Subject: [PATCH 44/95] fix: possible sql inject --- db/sqlite3/sqlite3.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/db/sqlite3/sqlite3.go b/db/sqlite3/sqlite3.go index 7d3169b..a6b6a3b 100644 --- a/db/sqlite3/sqlite3.go +++ b/db/sqlite3/sqlite3.go @@ -4,6 +4,7 @@ package sqlite3 import ( + "encoding/base64" "encoding/json" "hash/crc64" "os" @@ -179,10 +180,14 @@ func (s *database) GetPrivateMessageByGlobalID(id int32) (*db.StoredPrivateMessa } func (s *database) GetGuildChannelMessageByID(id string) (*db.StoredGuildChannelMessage, error) { + _, err := base64.StdEncoding.DecodeString(id) + if err != nil { + return nil, errors.Wrap(err, "query invalid id error") + } var ret db.StoredGuildChannelMessage var guildmsg StoredGuildChannelMessage s.RLock() - err := s.db.Find(Sqlite3GuildChannelMessageTableName, &guildmsg, "WHERE ID='"+id+"'") + err = s.db.Find(Sqlite3GuildChannelMessageTableName, &guildmsg, "WHERE ID='"+id+"'") s.RUnlock() if err != nil { return nil, errors.Wrap(err, "query error") From bc80944f269715209f2b2acf8749a501de2de962 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Wed, 9 Nov 2022 21:11:23 +0800 Subject: [PATCH 45/95] fix: possible sql inject --- db/sqlite3/sqlite3.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/db/sqlite3/sqlite3.go b/db/sqlite3/sqlite3.go index a6b6a3b..bd6822d 100644 --- a/db/sqlite3/sqlite3.go +++ b/db/sqlite3/sqlite3.go @@ -180,10 +180,13 @@ func (s *database) GetPrivateMessageByGlobalID(id int32) (*db.StoredPrivateMessa } func (s *database) GetGuildChannelMessageByID(id string) (*db.StoredGuildChannelMessage, error) { - _, err := base64.StdEncoding.DecodeString(id) + b, err := base64.StdEncoding.DecodeString(id) if err != nil { return nil, errors.Wrap(err, "query invalid id error") } + if len(b) < 25 { + return nil, errors.New("query invalid id error: content too short") + } var ret db.StoredGuildChannelMessage var guildmsg StoredGuildChannelMessage s.RLock() From 0ad641aa2d492cb99cdb1638884d9adbfabb9f5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Wed, 9 Nov 2022 22:58:37 +0800 Subject: [PATCH 46/95] feat: change db to sqlite3 in default config --- modules/config/default_config.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/config/default_config.yml b/modules/config/default_config.yml index 7d2f7e9..767706e 100644 --- a/modules/config/default_config.yml +++ b/modules/config/default_config.yml @@ -73,11 +73,12 @@ default-middlewares: &default bucket: 1 # 令牌桶大小 database: # 数据库相关设置 - leveldb: - # 是否启用内置leveldb数据库 - # 启用将会增加10-20MB的内存占用和一定的磁盘空间 + sqlite3: + # 是否启用内置sqlite3数据库 + # 启用将会增加一定的内存占用和一定的磁盘空间 # 关闭将无法使用 撤回 回复 get_msg 等上下文相关功能 enable: true + cachettl: 3600000000000 # 1h # 连接服务列表 servers: From 2d42a968c9aba43df985a45f22c82ee0ba07b0ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Thu, 10 Nov 2022 10:32:57 +0800 Subject: [PATCH 47/95] fix: interface conv error --- global/param.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global/param.go b/global/param.go index f23879a..44225bd 100644 --- a/global/param.go +++ b/global/param.go @@ -8,7 +8,7 @@ import ( ) // MSG 消息Map -type MSG map[string]interface{} +type MSG = map[string]interface{} // VersionNameCompare 检查版本名是否需要更新, 仅适用于 go-cqhttp 的版本命名规则 // From f1957e3814aeb111fdd7b988dc3834b4ce637c34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Thu, 10 Nov 2022 11:51:01 +0800 Subject: [PATCH 48/95] =?UTF-8?q?feat:=20=E5=B0=86=20uin,=20tiny=20?= =?UTF-8?q?=E5=88=86=E8=A1=A8=E4=BB=A5=E8=8A=82=E7=9C=81=E7=A9=BA=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/sqlite3/model.go | 16 +++++- db/sqlite3/sqlite3.go | 119 ++++++++++++++++++++++++++++-------------- 2 files changed, 94 insertions(+), 41 deletions(-) diff --git a/db/sqlite3/model.go b/db/sqlite3/model.go index 93e8a17..71f1bfb 100644 --- a/db/sqlite3/model.go +++ b/db/sqlite3/model.go @@ -10,6 +10,8 @@ const ( Sqlite3QuotedInfoTableName = "quoinf" Sqlite3PrivateMessageTableName = "privmsg" Sqlite3GuildChannelMessageTableName = "guildmsg" + Sqlite3UinInfoTableName = "uininf" + Sqlite3TinyInfoTableName = "tinyinf" ) // StoredMessageAttribute 持久化消息属性 @@ -18,7 +20,6 @@ type StoredMessageAttribute struct { MessageSeq int32 InternalID int32 SenderUin int64 - SenderName string Timestamp int64 } @@ -28,7 +29,6 @@ type StoredGuildMessageAttribute struct { MessageSeq int64 InternalID int64 SenderTinyID int64 - SenderName string Timestamp int64 } @@ -40,6 +40,18 @@ type QuotedInfo struct { QuotedContent string // QuotedContent is json of original content } +// UinInfo QQ 与 昵称 +type UinInfo struct { + Uin int64 + Name string +} + +// TinyInfo Tiny 与 昵称 +type TinyInfo struct { + ID int64 + Name string +} + // StoredGroupMessage 持久化群消息 type StoredGroupMessage struct { GlobalID int32 diff --git a/db/sqlite3/sqlite3.go b/db/sqlite3/sqlite3.go index bd6822d..c80c82a 100644 --- a/db/sqlite3/sqlite3.go +++ b/db/sqlite3/sqlite3.go @@ -77,6 +77,14 @@ func (s *database) Open() error { if err != nil { return errors.Wrap(err, "create sqlite3 table error") } + err = s.db.Create(Sqlite3UinInfoTableName, &UinInfo{}) + if err != nil { + return errors.Wrap(err, "create sqlite3 table error") + } + err = s.db.Create(Sqlite3TinyInfoTableName, &TinyInfo{}) + if err != nil { + return errors.Wrap(err, "create sqlite3 table error") + } return nil } @@ -108,12 +116,18 @@ func (s *database) GetGroupMessageByGlobalID(id int32) (*db.StoredGroupMessage, err = s.db.Find(Sqlite3MessageAttributeTableName, &attr, "WHERE ID="+strconv.FormatInt(grpmsg.AttributeID, 10)) s.RUnlock() if err == nil { - ret.Attribute = &db.StoredMessageAttribute{ - MessageSeq: attr.MessageSeq, - InternalID: attr.InternalID, - SenderUin: attr.SenderUin, - SenderName: attr.SenderName, - Timestamp: attr.Timestamp, + var uin UinInfo + s.RLock() + err = s.db.Find(Sqlite3UinInfoTableName, &attr, "WHERE Uin="+strconv.FormatInt(attr.SenderUin, 10)) + s.RUnlock() + if err == nil { + ret.Attribute = &db.StoredMessageAttribute{ + MessageSeq: attr.MessageSeq, + InternalID: attr.InternalID, + SenderUin: attr.SenderUin, + SenderName: uin.Name, + Timestamp: attr.Timestamp, + } } } } @@ -154,12 +168,18 @@ func (s *database) GetPrivateMessageByGlobalID(id int32) (*db.StoredPrivateMessa err = s.db.Find(Sqlite3MessageAttributeTableName, &attr, "WHERE ID="+strconv.FormatInt(privmsg.AttributeID, 10)) s.RUnlock() if err == nil { - ret.Attribute = &db.StoredMessageAttribute{ - MessageSeq: attr.MessageSeq, - InternalID: attr.InternalID, - SenderUin: attr.SenderUin, - SenderName: attr.SenderName, - Timestamp: attr.Timestamp, + var uin UinInfo + s.RLock() + err = s.db.Find(Sqlite3UinInfoTableName, &attr, "WHERE Uin="+strconv.FormatInt(attr.SenderUin, 10)) + s.RUnlock() + if err == nil { + ret.Attribute = &db.StoredMessageAttribute{ + MessageSeq: attr.MessageSeq, + InternalID: attr.InternalID, + SenderUin: attr.SenderUin, + SenderName: uin.Name, + Timestamp: attr.Timestamp, + } } } } @@ -205,12 +225,18 @@ func (s *database) GetGuildChannelMessageByID(id string) (*db.StoredGuildChannel err = s.db.Find(Sqlite3GuildMessageAttributeTableName, &attr, "WHERE ID="+strconv.FormatInt(guildmsg.AttributeID, 10)) s.RUnlock() if err == nil { - ret.Attribute = &db.StoredGuildMessageAttribute{ - MessageSeq: uint64(attr.MessageSeq), - InternalID: uint64(attr.InternalID), - SenderTinyID: uint64(attr.SenderTinyID), - SenderName: attr.SenderName, - Timestamp: attr.Timestamp, + var tiny TinyInfo + s.RLock() + err = s.db.Find(Sqlite3TinyInfoTableName, &attr, "WHERE ID="+strconv.FormatInt(attr.SenderTinyID, 10)) + s.RUnlock() + if err == nil { + ret.Attribute = &db.StoredGuildMessageAttribute{ + MessageSeq: uint64(attr.MessageSeq), + InternalID: uint64(attr.InternalID), + SenderTinyID: uint64(attr.SenderTinyID), + SenderName: tiny.Name, + Timestamp: attr.Timestamp, + } } } } @@ -252,14 +278,19 @@ func (s *database) InsertGroupMessage(msg *db.StoredGroupMessage) error { id++ } s.Lock() - err := s.db.Insert(Sqlite3MessageAttributeTableName, &StoredMessageAttribute{ - ID: id, - MessageSeq: msg.Attribute.MessageSeq, - InternalID: msg.Attribute.InternalID, - SenderUin: msg.Attribute.SenderUin, - SenderName: msg.Attribute.SenderName, - Timestamp: msg.Attribute.Timestamp, + err := s.db.Insert(Sqlite3UinInfoTableName, &UinInfo{ + Uin: msg.Attribute.SenderUin, + Name: msg.Attribute.SenderName, }) + if err == nil { + err = s.db.Insert(Sqlite3MessageAttributeTableName, &StoredMessageAttribute{ + ID: id, + MessageSeq: msg.Attribute.MessageSeq, + InternalID: msg.Attribute.InternalID, + SenderUin: msg.Attribute.SenderUin, + Timestamp: msg.Attribute.Timestamp, + }) + } s.Unlock() if err == nil { grpmsg.AttributeID = id @@ -328,14 +359,19 @@ func (s *database) InsertPrivateMessage(msg *db.StoredPrivateMessage) error { id++ } s.Lock() - err := s.db.Insert(Sqlite3MessageAttributeTableName, &StoredMessageAttribute{ - ID: id, - MessageSeq: msg.Attribute.MessageSeq, - InternalID: msg.Attribute.InternalID, - SenderUin: msg.Attribute.SenderUin, - SenderName: msg.Attribute.SenderName, - Timestamp: msg.Attribute.Timestamp, + err := s.db.Insert(Sqlite3UinInfoTableName, &UinInfo{ + Uin: msg.Attribute.SenderUin, + Name: msg.Attribute.SenderName, }) + if err == nil { + err = s.db.Insert(Sqlite3MessageAttributeTableName, &StoredMessageAttribute{ + ID: id, + MessageSeq: msg.Attribute.MessageSeq, + InternalID: msg.Attribute.InternalID, + SenderUin: msg.Attribute.SenderUin, + Timestamp: msg.Attribute.Timestamp, + }) + } s.Unlock() if err == nil { privmsg.AttributeID = id @@ -402,14 +438,19 @@ func (s *database) InsertGuildChannelMessage(msg *db.StoredGuildChannelMessage) id++ } s.Lock() - err := s.db.Insert(Sqlite3MessageAttributeTableName, &StoredGuildMessageAttribute{ - ID: id, - MessageSeq: int64(msg.Attribute.MessageSeq), - InternalID: int64(msg.Attribute.InternalID), - SenderTinyID: int64(msg.Attribute.SenderTinyID), - SenderName: msg.Attribute.SenderName, - Timestamp: msg.Attribute.Timestamp, + err := s.db.Insert(Sqlite3TinyInfoTableName, &TinyInfo{ + ID: int64(msg.Attribute.SenderTinyID), + Name: msg.Attribute.SenderName, }) + if err == nil { + err = s.db.Insert(Sqlite3MessageAttributeTableName, &StoredGuildMessageAttribute{ + ID: id, + MessageSeq: int64(msg.Attribute.MessageSeq), + InternalID: int64(msg.Attribute.InternalID), + SenderTinyID: int64(msg.Attribute.SenderTinyID), + Timestamp: msg.Attribute.Timestamp, + }) + } s.Unlock() if err == nil { guildmsg.AttributeID = id From 8da043f01215ff705086c747a17433af6d7dc9ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Thu, 10 Nov 2022 14:42:31 +0800 Subject: [PATCH 49/95] feat: add foreign key constraints --- db/sqlite3/sqlite3.go | 37 +++++++++++++++++++++++++++---------- go.mod | 2 +- go.sum | 4 ++-- 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/db/sqlite3/sqlite3.go b/db/sqlite3/sqlite3.go index c80c82a..bcba4ed 100644 --- a/db/sqlite3/sqlite3.go +++ b/db/sqlite3/sqlite3.go @@ -53,15 +53,27 @@ func (s *database) Open() error { if err != nil { return errors.Wrap(err, "open sqlite3 error") } - err = s.db.Create(Sqlite3GroupMessageTableName, &StoredGroupMessage{}) + _, err = s.db.DB.Exec("PRAGMA foreign_keys = ON;") + if err != nil { + return errors.Wrap(err, "enable foreign_keys error") + } + err = s.db.Create(Sqlite3UinInfoTableName, &UinInfo{}) if err != nil { return errors.Wrap(err, "create sqlite3 table error") } - err = s.db.Create(Sqlite3MessageAttributeTableName, &StoredMessageAttribute{}) + err = s.db.Create(Sqlite3TinyInfoTableName, &TinyInfo{}) if err != nil { return errors.Wrap(err, "create sqlite3 table error") } - err = s.db.Create(Sqlite3GuildMessageAttributeTableName, &StoredGuildMessageAttribute{}) + err = s.db.Create(Sqlite3MessageAttributeTableName, &StoredMessageAttribute{}, + "FOREIGN KEY(SenderUin) REFERENCES "+Sqlite3UinInfoTableName+"(Uin)", + ) + if err != nil { + return errors.Wrap(err, "create sqlite3 table error") + } + err = s.db.Create(Sqlite3GuildMessageAttributeTableName, &StoredGuildMessageAttribute{}, + "FOREIGN KEY(SenderTinyID) REFERENCES "+Sqlite3TinyInfoTableName+"(ID)", + ) if err != nil { return errors.Wrap(err, "create sqlite3 table error") } @@ -69,19 +81,24 @@ func (s *database) Open() error { if err != nil { return errors.Wrap(err, "create sqlite3 table error") } - err = s.db.Create(Sqlite3PrivateMessageTableName, &StoredPrivateMessage{}) + err = s.db.Create(Sqlite3GroupMessageTableName, &StoredGroupMessage{}, + "FOREIGN KEY(AttributeID) REFERENCES "+Sqlite3MessageAttributeTableName+"(ID)", + "FOREIGN KEY(QuotedInfoID) REFERENCES "+Sqlite3QuotedInfoTableName+"(ID)", + ) if err != nil { return errors.Wrap(err, "create sqlite3 table error") } - err = s.db.Create(Sqlite3GuildChannelMessageTableName, &StoredGuildChannelMessage{}) + err = s.db.Create(Sqlite3PrivateMessageTableName, &StoredPrivateMessage{}, + "FOREIGN KEY(AttributeID) REFERENCES "+Sqlite3MessageAttributeTableName+"(ID)", + "FOREIGN KEY(QuotedInfoID) REFERENCES "+Sqlite3QuotedInfoTableName+"(ID)", + ) if err != nil { return errors.Wrap(err, "create sqlite3 table error") } - err = s.db.Create(Sqlite3UinInfoTableName, &UinInfo{}) - if err != nil { - return errors.Wrap(err, "create sqlite3 table error") - } - err = s.db.Create(Sqlite3TinyInfoTableName, &TinyInfo{}) + err = s.db.Create(Sqlite3GuildChannelMessageTableName, &StoredGuildChannelMessage{}, + "FOREIGN KEY(AttributeID) REFERENCES "+Sqlite3MessageAttributeTableName+"(ID)", + "FOREIGN KEY(QuotedInfoID) REFERENCES "+Sqlite3QuotedInfoTableName+"(ID)", + ) if err != nil { return errors.Wrap(err, "create sqlite3 table error") } diff --git a/go.mod b/go.mod index 8bc52ad..01f64af 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/Mrs4s/go-cqhttp go 1.19 require ( - github.com/FloatTech/sqlite v0.5.0 + github.com/FloatTech/sqlite v0.5.1 github.com/Microsoft/go-winio v0.5.1 github.com/Mrs4s/MiraiGo v0.0.0-20220828090150-a3c348100dfe github.com/RomiChan/syncx v0.0.0-20220404072119-d7ea0ae15a4c diff --git a/go.sum b/go.sum index c4a4423..7745439 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/FloatTech/sqlite v0.5.0 h1:U7J5Omc534PqmH6csfu+ypCo3DS8L91l5lTsxUu3b/U= -github.com/FloatTech/sqlite v0.5.0/go.mod h1:i33d92OtR8jcp5fBUvQtospf27+MkfUxnGwnZ95E/dA= +github.com/FloatTech/sqlite v0.5.1 h1:IjTdnqMVIVIoIEFXhvh/KKBfYxFvG0tk7Rghz65/DAU= +github.com/FloatTech/sqlite v0.5.1/go.mod h1:i33d92OtR8jcp5fBUvQtospf27+MkfUxnGwnZ95E/dA= github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b h1:tvciXWq2nuvTbFeJGLDNIdRX3BI546D3O7k7vrVueZw= github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b/go.mod h1:fHZFWGquNXuHttu9dUYoKuNbm3dzLETnIOnm1muSfDs= github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY= From 1de1deb059015bdce76171eb5567210acf47ca56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Thu, 10 Nov 2022 15:00:15 +0800 Subject: [PATCH 50/95] fix foreign key constraints --- db/sqlite3/model.go | 4 ++-- db/sqlite3/sqlite3.go | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/db/sqlite3/model.go b/db/sqlite3/model.go index 71f1bfb..29e1483 100644 --- a/db/sqlite3/model.go +++ b/db/sqlite3/model.go @@ -19,7 +19,7 @@ type StoredMessageAttribute struct { ID int64 // ID is the crc64 of 字段s below MessageSeq int32 InternalID int32 - SenderUin int64 + SenderUin int64 // SenderUin is fk to UinInfo Timestamp int64 } @@ -28,7 +28,7 @@ type StoredGuildMessageAttribute struct { ID int64 // ID is the crc64 of 字段s below MessageSeq int64 InternalID int64 - SenderTinyID int64 + SenderTinyID int64 // SenderTinyID is fk to TinyInfo Timestamp int64 } diff --git a/db/sqlite3/sqlite3.go b/db/sqlite3/sqlite3.go index bcba4ed..3ff39bb 100644 --- a/db/sqlite3/sqlite3.go +++ b/db/sqlite3/sqlite3.go @@ -61,26 +61,46 @@ func (s *database) Open() error { if err != nil { return errors.Wrap(err, "create sqlite3 table error") } + err = s.db.Insert(Sqlite3UinInfoTableName, &UinInfo{Name: "null"}) + if err != nil { + return errors.Wrap(err, "insert into sqlite3 table "+Sqlite3UinInfoTableName+" error") + } err = s.db.Create(Sqlite3TinyInfoTableName, &TinyInfo{}) if err != nil { return errors.Wrap(err, "create sqlite3 table error") } + err = s.db.Insert(Sqlite3TinyInfoTableName, &TinyInfo{Name: "null"}) + if err != nil { + return errors.Wrap(err, "insert into sqlite3 table "+Sqlite3TinyInfoTableName+" error") + } err = s.db.Create(Sqlite3MessageAttributeTableName, &StoredMessageAttribute{}, "FOREIGN KEY(SenderUin) REFERENCES "+Sqlite3UinInfoTableName+"(Uin)", ) if err != nil { return errors.Wrap(err, "create sqlite3 table error") } + err = s.db.Insert(Sqlite3MessageAttributeTableName, &StoredMessageAttribute{}) + if err != nil { + return errors.Wrap(err, "insert into sqlite3 table "+Sqlite3MessageAttributeTableName+" error") + } err = s.db.Create(Sqlite3GuildMessageAttributeTableName, &StoredGuildMessageAttribute{}, "FOREIGN KEY(SenderTinyID) REFERENCES "+Sqlite3TinyInfoTableName+"(ID)", ) if err != nil { return errors.Wrap(err, "create sqlite3 table error") } + err = s.db.Insert(Sqlite3GuildMessageAttributeTableName, &StoredGuildMessageAttribute{}) + if err != nil { + return errors.Wrap(err, "insert into sqlite3 table "+Sqlite3GuildMessageAttributeTableName+" error") + } err = s.db.Create(Sqlite3QuotedInfoTableName, &QuotedInfo{}) if err != nil { return errors.Wrap(err, "create sqlite3 table error") } + err = s.db.Insert(Sqlite3QuotedInfoTableName, &QuotedInfo{QuotedContent: "null"}) + if err != nil { + return errors.Wrap(err, "insert into sqlite3 table "+Sqlite3QuotedInfoTableName+" error") + } err = s.db.Create(Sqlite3GroupMessageTableName, &StoredGroupMessage{}, "FOREIGN KEY(AttributeID) REFERENCES "+Sqlite3MessageAttributeTableName+"(ID)", "FOREIGN KEY(QuotedInfoID) REFERENCES "+Sqlite3QuotedInfoTableName+"(ID)", From a6613d88bf72b071bc665c0fe42e3f5bc76fb2c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Thu, 10 Nov 2022 16:31:14 +0800 Subject: [PATCH 51/95] fix: uin extract --- .gitignore | 3 +++ db/sqlite3/sqlite3.go | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 9e66494..4066bc3 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,6 @@ internal/btree/*.db # binary builds go-cqhttp + +# macos +.DS_Store diff --git a/db/sqlite3/sqlite3.go b/db/sqlite3/sqlite3.go index 3ff39bb..68522ea 100644 --- a/db/sqlite3/sqlite3.go +++ b/db/sqlite3/sqlite3.go @@ -155,7 +155,7 @@ func (s *database) GetGroupMessageByGlobalID(id int32) (*db.StoredGroupMessage, if err == nil { var uin UinInfo s.RLock() - err = s.db.Find(Sqlite3UinInfoTableName, &attr, "WHERE Uin="+strconv.FormatInt(attr.SenderUin, 10)) + err = s.db.Find(Sqlite3UinInfoTableName, &uin, "WHERE Uin="+strconv.FormatInt(attr.SenderUin, 10)) s.RUnlock() if err == nil { ret.Attribute = &db.StoredMessageAttribute{ @@ -207,7 +207,7 @@ func (s *database) GetPrivateMessageByGlobalID(id int32) (*db.StoredPrivateMessa if err == nil { var uin UinInfo s.RLock() - err = s.db.Find(Sqlite3UinInfoTableName, &attr, "WHERE Uin="+strconv.FormatInt(attr.SenderUin, 10)) + err = s.db.Find(Sqlite3UinInfoTableName, &uin, "WHERE Uin="+strconv.FormatInt(attr.SenderUin, 10)) s.RUnlock() if err == nil { ret.Attribute = &db.StoredMessageAttribute{ @@ -264,7 +264,7 @@ func (s *database) GetGuildChannelMessageByID(id string) (*db.StoredGuildChannel if err == nil { var tiny TinyInfo s.RLock() - err = s.db.Find(Sqlite3TinyInfoTableName, &attr, "WHERE ID="+strconv.FormatInt(attr.SenderTinyID, 10)) + err = s.db.Find(Sqlite3TinyInfoTableName, &tiny, "WHERE ID="+strconv.FormatInt(attr.SenderTinyID, 10)) s.RUnlock() if err == nil { ret.Attribute = &db.StoredGuildMessageAttribute{ From 92d78839f18720b70a58df66ff3557efe24ce2c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Thu, 10 Nov 2022 17:30:54 +0800 Subject: [PATCH 52/95] fix: interface convert panic --- coolq/cqcode.go | 28 +++++++++++++++-- db/database.go | 70 +++++++++++++++++++++---------------------- db/sqlite3/sqlite3.go | 25 ++++++++-------- 3 files changed, 72 insertions(+), 51 deletions(-) diff --git a/coolq/cqcode.go b/coolq/cqcode.go index c241e34..e93e50c 100644 --- a/coolq/cqcode.go +++ b/coolq/cqcode.go @@ -11,6 +11,7 @@ import ( "net/url" "os" "path" + "reflect" "runtime" "strconv" "strings" @@ -725,7 +726,17 @@ func (bot *CQBot) ConvertContentMessage(content []global.MSG, sourceType message flash = true } if t.(string) == "show" { - id = data["id"].(int32) + id := 0 + switch idn := data["id"].(type) { + case int32: + id = int(idn) + case int: + id = idn + case int64: + id = int(idn) + default: + id = int(reflect.ValueOf(data["id"]).Convert(reflect.TypeOf(0)).Int()) + } if id < 40000 || id >= 40006 { id = 40000 } @@ -753,7 +764,7 @@ func (bot *CQBot) ConvertContentMessage(content []global.MSG, sourceType message case "all": r = append(r, message.NewAt(0)) case "user": - r = append(r, message.NewAt(data["target"].(int64), data["display"].(string))) + r = append(r, message.NewAt(reflect.ValueOf(data["target"]).Int(), data["display"].(string))) default: continue } @@ -767,7 +778,18 @@ func (bot *CQBot) ConvertContentMessage(content []global.MSG, sourceType message ResId: data["id"].(string), }) case "face": - r = append(r, message.NewFace(data["id"].(int32))) + id := int32(0) + switch idn := data["id"].(type) { + case int32: + id = idn + case int: + id = int32(idn) + case int64: + id = int32(idn) + default: + id = int32(reflect.ValueOf(data["id"]).Convert(reflect.TypeOf(0)).Int()) + } + r = append(r, message.NewFace(id)) case "video": e, err := bot.makeImageOrVideoElem(map[string]string{"file": data["file"].(string)}, true, sourceType) if err != nil { diff --git a/db/database.go b/db/database.go index c19da97..c904822 100644 --- a/db/database.go +++ b/db/database.go @@ -40,61 +40,61 @@ type ( // StoredGroupMessage 持久化群消息 StoredGroupMessage struct { - ID string `bson:"_id"` - GlobalID int32 `bson:"globalId"` - Attribute *StoredMessageAttribute `bson:"attribute"` - SubType string `bson:"subType"` - QuotedInfo *QuotedInfo `bson:"quotedInfo"` - GroupCode int64 `bson:"groupCode"` - AnonymousID string `bson:"anonymousId"` - Content []global.MSG `bson:"content"` + ID string `bson:"_id" yaml:"-"` + GlobalID int32 `bson:"globalId" yaml:"-"` + Attribute *StoredMessageAttribute `bson:"attribute" yaml:"-"` + SubType string `bson:"subType" yaml:"-"` + QuotedInfo *QuotedInfo `bson:"quotedInfo" yaml:"-"` + GroupCode int64 `bson:"groupCode" yaml:"-"` + AnonymousID string `bson:"anonymousId" yaml:"-"` + Content []global.MSG `bson:"content" yaml:"content"` } // StoredPrivateMessage 持久化私聊消息 StoredPrivateMessage struct { - ID string `bson:"_id"` - GlobalID int32 `bson:"globalId"` - Attribute *StoredMessageAttribute `bson:"attribute"` - SubType string `bson:"subType"` - QuotedInfo *QuotedInfo `bson:"quotedInfo"` - SessionUin int64 `bson:"sessionUin"` - TargetUin int64 `bson:"targetUin"` - Content []global.MSG `bson:"content"` + ID string `bson:"_id" yaml:"-"` + GlobalID int32 `bson:"globalId" yaml:"-"` + Attribute *StoredMessageAttribute `bson:"attribute" yaml:"-"` + SubType string `bson:"subType" yaml:"-"` + QuotedInfo *QuotedInfo `bson:"quotedInfo" yaml:"-"` + SessionUin int64 `bson:"sessionUin" yaml:"-"` + TargetUin int64 `bson:"targetUin" yaml:"-"` + Content []global.MSG `bson:"content" yaml:"content"` } // StoredGuildChannelMessage 持久化频道消息 StoredGuildChannelMessage struct { - ID string `bson:"_id"` - Attribute *StoredGuildMessageAttribute `bson:"attribute"` - GuildID uint64 `bson:"guildId"` - ChannelID uint64 `bson:"channelId"` - QuotedInfo *QuotedInfo `bson:"quotedInfo"` - Content []global.MSG `bson:"content"` + ID string `bson:"_id" yaml:"-"` + Attribute *StoredGuildMessageAttribute `bson:"attribute" yaml:"-"` + GuildID uint64 `bson:"guildId" yaml:"-"` + ChannelID uint64 `bson:"channelId" yaml:"-"` + QuotedInfo *QuotedInfo `bson:"quotedInfo" yaml:"-"` + Content []global.MSG `bson:"content" yaml:"content"` } // StoredMessageAttribute 持久化消息属性 StoredMessageAttribute struct { - MessageSeq int32 `bson:"messageSeq"` - InternalID int32 `bson:"internalId"` - SenderUin int64 `bson:"senderUin"` - SenderName string `bson:"senderName"` - Timestamp int64 `bson:"timestamp"` + MessageSeq int32 `bson:"messageSeq" yaml:"-"` + InternalID int32 `bson:"internalId" yaml:"-"` + SenderUin int64 `bson:"senderUin" yaml:"-"` + SenderName string `bson:"senderName" yaml:"-"` + Timestamp int64 `bson:"timestamp" yaml:"-"` } // StoredGuildMessageAttribute 持久化频道消息属性 StoredGuildMessageAttribute struct { - MessageSeq uint64 `bson:"messageSeq"` - InternalID uint64 `bson:"internalId"` - SenderTinyID uint64 `bson:"senderTinyId"` - SenderName string `bson:"senderName"` - Timestamp int64 `bson:"timestamp"` + MessageSeq uint64 `bson:"messageSeq" yaml:"-"` + InternalID uint64 `bson:"internalId" yaml:"-"` + SenderTinyID uint64 `bson:"senderTinyId" yaml:"-"` + SenderName string `bson:"senderName" yaml:"-"` + Timestamp int64 `bson:"timestamp" yaml:"-"` } // QuotedInfo 引用回复 QuotedInfo struct { - PrevID string `bson:"prevId"` - PrevGlobalID int32 `bson:"prevGlobalId"` - QuotedContent []global.MSG `bson:"quotedContent"` + PrevID string `bson:"prevId" yaml:"-"` + PrevGlobalID int32 `bson:"prevGlobalId" yaml:"-"` + QuotedContent []global.MSG `bson:"quotedContent" yaml:"quoted_content"` } ) diff --git a/db/sqlite3/sqlite3.go b/db/sqlite3/sqlite3.go index 68522ea..4495a06 100644 --- a/db/sqlite3/sqlite3.go +++ b/db/sqlite3/sqlite3.go @@ -5,7 +5,6 @@ package sqlite3 import ( "encoding/base64" - "encoding/json" "hash/crc64" "os" "path" @@ -146,7 +145,7 @@ func (s *database) GetGroupMessageByGlobalID(id int32) (*db.StoredGroupMessage, ret.SubType = grpmsg.SubType ret.GroupCode = grpmsg.GroupCode ret.AnonymousID = grpmsg.AnonymousID - _ = json.Unmarshal(utils.S2B(grpmsg.Content), &ret.Content) + _ = yaml.Unmarshal(utils.S2B(grpmsg.Content), &ret) if grpmsg.AttributeID != 0 { var attr StoredMessageAttribute s.RLock() @@ -178,7 +177,7 @@ func (s *database) GetGroupMessageByGlobalID(id int32) (*db.StoredGroupMessage, PrevID: quoinf.PrevID, PrevGlobalID: quoinf.PrevGlobalID, } - _ = json.Unmarshal(utils.S2B(quoinf.QuotedContent), &ret.QuotedInfo.QuotedContent) + _ = yaml.Unmarshal(utils.S2B(quoinf.QuotedContent), &ret.QuotedInfo) } } return &ret, nil @@ -198,7 +197,7 @@ func (s *database) GetPrivateMessageByGlobalID(id int32) (*db.StoredPrivateMessa ret.SubType = privmsg.SubType ret.SessionUin = privmsg.SessionUin ret.TargetUin = privmsg.TargetUin - _ = json.Unmarshal(utils.S2B(privmsg.Content), &ret.Content) + _ = yaml.Unmarshal(utils.S2B(privmsg.Content), &ret) if privmsg.AttributeID != 0 { var attr StoredMessageAttribute s.RLock() @@ -230,7 +229,7 @@ func (s *database) GetPrivateMessageByGlobalID(id int32) (*db.StoredPrivateMessa PrevID: quoinf.PrevID, PrevGlobalID: quoinf.PrevGlobalID, } - _ = json.Unmarshal(utils.S2B(quoinf.QuotedContent), &ret.QuotedInfo.QuotedContent) + _ = yaml.Unmarshal(utils.S2B(quoinf.QuotedContent), &ret.QuotedInfo) } } return &ret, nil @@ -255,7 +254,7 @@ func (s *database) GetGuildChannelMessageByID(id string) (*db.StoredGuildChannel ret.ID = guildmsg.ID ret.GuildID = uint64(guildmsg.GuildID) ret.ChannelID = uint64(guildmsg.ChannelID) - _ = json.Unmarshal(utils.S2B(guildmsg.Content), &ret.Content) + _ = yaml.Unmarshal(utils.S2B(guildmsg.Content), &ret) if guildmsg.AttributeID != 0 { var attr StoredGuildMessageAttribute s.RLock() @@ -287,7 +286,7 @@ func (s *database) GetGuildChannelMessageByID(id string) (*db.StoredGuildChannel PrevID: quoinf.PrevID, PrevGlobalID: quoinf.PrevGlobalID, } - _ = json.Unmarshal(utils.S2B(quoinf.QuotedContent), &ret.QuotedInfo.QuotedContent) + _ = yaml.Unmarshal(utils.S2B(quoinf.QuotedContent), &ret.QuotedInfo) } } return &ret, nil @@ -339,7 +338,7 @@ func (s *database) InsertGroupMessage(msg *db.StoredGroupMessage) error { h.Write(binary.NewWriterF(func(w *binary.Writer) { w.WriteUInt32(uint32(msg.QuotedInfo.PrevGlobalID)) })) - content, err := json.Marshal(&msg.QuotedInfo.QuotedContent) + content, err := yaml.Marshal(&msg.QuotedInfo) if err != nil { return errors.Wrap(err, "insert marshal QuotedContent error") } @@ -360,7 +359,7 @@ func (s *database) InsertGroupMessage(msg *db.StoredGroupMessage) error { grpmsg.QuotedInfoID = id } } - content, err := json.Marshal(&msg.Content) + content, err := yaml.Marshal(&msg) if err != nil { return errors.Wrap(err, "insert marshal Content error") } @@ -420,7 +419,7 @@ func (s *database) InsertPrivateMessage(msg *db.StoredPrivateMessage) error { h.Write(binary.NewWriterF(func(w *binary.Writer) { w.WriteUInt32(uint32(msg.QuotedInfo.PrevGlobalID)) })) - content, err := json.Marshal(&msg.QuotedInfo.QuotedContent) + content, err := yaml.Marshal(&msg.QuotedInfo) if err != nil { return errors.Wrap(err, "insert marshal QuotedContent error") } @@ -441,7 +440,7 @@ func (s *database) InsertPrivateMessage(msg *db.StoredPrivateMessage) error { privmsg.QuotedInfoID = id } } - content, err := json.Marshal(&msg.Content) + content, err := yaml.Marshal(&msg) if err != nil { return errors.Wrap(err, "insert marshal Content error") } @@ -499,7 +498,7 @@ func (s *database) InsertGuildChannelMessage(msg *db.StoredGuildChannelMessage) h.Write(binary.NewWriterF(func(w *binary.Writer) { w.WriteUInt32(uint32(msg.QuotedInfo.PrevGlobalID)) })) - content, err := json.Marshal(&msg.QuotedInfo.QuotedContent) + content, err := yaml.Marshal(&msg.QuotedInfo) if err != nil { return errors.Wrap(err, "insert marshal QuotedContent error") } @@ -520,7 +519,7 @@ func (s *database) InsertGuildChannelMessage(msg *db.StoredGuildChannelMessage) guildmsg.QuotedInfoID = id } } - content, err := json.Marshal(&msg.Content) + content, err := yaml.Marshal(&msg) if err != nil { return errors.Wrap(err, "insert marshal Content error") } From 51747981ddd3efb79014988d522f7ae034ce43c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Tue, 15 Nov 2022 10:50:47 +0800 Subject: [PATCH 53/95] =?UTF-8?q?feat:=20=E9=BB=98=E8=AE=A4=E4=BB=8D?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=20leveldb?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.go | 4 ++-- modules/config/default_config.yml | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/main.go b/main.go index 008e5d0..30838f7 100644 --- a/main.go +++ b/main.go @@ -4,10 +4,10 @@ package main import ( "github.com/Mrs4s/go-cqhttp/cmd/gocq" - _ "github.com/Mrs4s/go-cqhttp/db/sqlite3" // sqlite3 数据库支持 + _ "github.com/Mrs4s/go-cqhttp/db/leveldb" // leveldb 数据库支持 _ "github.com/Mrs4s/go-cqhttp/modules/silk" // silk编码模块 // 其他模块 - // _ "github.com/Mrs4s/go-cqhttp/db/leveldb" // leveldb 数据库支持 + // _ "github.com/Mrs4s/go-cqhttp/db/sqlite3" // sqlite3 数据库支持 // _ "github.com/Mrs4s/go-cqhttp/db/mongodb" // mongodb 数据库支持 // _ "github.com/Mrs4s/go-cqhttp/modules/pprof" // pprof 性能分析 ) diff --git a/modules/config/default_config.yml b/modules/config/default_config.yml index 767706e..60d5db0 100644 --- a/modules/config/default_config.yml +++ b/modules/config/default_config.yml @@ -73,11 +73,16 @@ default-middlewares: &default bucket: 1 # 令牌桶大小 database: # 数据库相关设置 + leveldb: + # 是否启用内置leveldb数据库 + # 启用将会增加10-20MB的内存占用和一定的磁盘空间 + # 关闭将无法使用 撤回 回复 get_msg 等上下文相关功能 + enable: true sqlite3: # 是否启用内置sqlite3数据库 # 启用将会增加一定的内存占用和一定的磁盘空间 # 关闭将无法使用 撤回 回复 get_msg 等上下文相关功能 - enable: true + enable: false cachettl: 3600000000000 # 1h # 连接服务列表 From b981b45245b46923d7e12d489429b849d4082480 Mon Sep 17 00:00:00 2001 From: Shigma Date: Mon, 21 Nov 2022 19:55:26 +0800 Subject: [PATCH 54/95] feat: check if stdin isatty Co-Authored-By: Il Harper --- cmd/gocq/login.go | 17 +++++++++++++---- cmd/gocq/main.go | 4 ++-- go.mod | 3 ++- go.sum | 5 ++++- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/cmd/gocq/login.go b/cmd/gocq/login.go index d963d25..aaa31e3 100644 --- a/cmd/gocq/login.go +++ b/cmd/gocq/login.go @@ -16,6 +16,7 @@ import ( "github.com/pkg/errors" log "github.com/sirupsen/logrus" "github.com/tidwall/gjson" + "gopkg.ilharper.com/x/isatty" "github.com/Mrs4s/go-cqhttp/global" ) @@ -44,6 +45,14 @@ func readLineTimeout(t time.Duration, de string) (str string) { return } +func readIfTTY(de string) (str string) { + if isatty.Isatty(os.Stdin.Fd()) { + return readLine() + } + log.Warnf("未检测到输入终端,自动选择%s.", de) + return de +} + var cli *client.QQClient // ErrSMSRequestError SMS请求出错 @@ -148,8 +157,8 @@ func loginResponseProcessor(res *client.LoginResponse) error { log.Warnf("登录需要滑条验证码, 请选择验证方式: ") log.Warnf("1. 使用浏览器抓取滑条并登录") log.Warnf("2. 使用手机QQ扫码验证 (需要手Q和gocq在同一网络下).") - log.Warn("请输入(1 - 2) (将在10秒后自动选择1):") - text = readLineTimeout(time.Second*10, "1") + log.Warn("请输入(1 - 2):") + text = readIfTTY("1") if strings.Contains(text, "1") { ticket := getTicket(res.VerifyUrl) if ticket == "" { @@ -185,8 +194,8 @@ func loginResponseProcessor(res *client.LoginResponse) error { log.Warnf("账号已开启设备锁,请选择验证方式:") log.Warnf("1. 向手机 %v 发送短信验证码", res.SMSPhone) log.Warnf("2. 使用手机QQ扫码验证.") - log.Warn("请输入(1 - 2) (将在10秒后自动选择2):") - text = readLineTimeout(time.Second*10, "2") + log.Warn("请输入(1 - 2):") + text = readIfTTY("2") if strings.Contains(text, "1") { if !cli.RequestSMS() { log.Warnf("发送验证码失败,可能是请求过于频繁.") diff --git a/cmd/gocq/main.go b/cmd/gocq/main.go index dacaead..5c25745 100644 --- a/cmd/gocq/main.go +++ b/cmd/gocq/main.go @@ -220,8 +220,8 @@ func Main() { log.Warnf("警告: 配置文件内的QQ号 (%v) 与缓存内的QQ号 (%v) 不相同", base.Account.Uin, cu) log.Warnf("1. 使用会话缓存继续.") log.Warnf("2. 删除会话缓存并重启.") - log.Warnf("请选择: (5秒后自动选1)") - text := readLineTimeout(time.Second*5, "1") + log.Warnf("请选择:") + text := readIfTTY("1") if text == "2" { _ = os.Remove("session.token") log.Infof("缓存已删除.") diff --git a/go.mod b/go.mod index db48f45..f5182d3 100644 --- a/go.mod +++ b/go.mod @@ -22,6 +22,7 @@ require ( golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 + gopkg.ilharper.com/x/isatty v1.1.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -48,7 +49,7 @@ require ( go.uber.org/atomic v1.9.0 // indirect golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9 // indirect golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/sys v0.0.0-20220111092808-5a964db01320 // indirect + golang.org/x/sys v0.2.0 // indirect golang.org/x/text v0.3.7 // indirect modernc.org/libc v1.8.1 // indirect modernc.org/mathutil v1.2.2 // indirect diff --git a/go.sum b/go.sum index d70e916..92c889a 100644 --- a/go.sum +++ b/go.sum @@ -145,8 +145,9 @@ golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220111092808-5a964db01320 h1:0jf+tOCoZ3LyutmCOWpVni1chK4VfFLhRsDK7MhqGRY= golang.org/x/sys v0.0.0-20220111092808-5a964db01320/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -169,6 +170,8 @@ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +gopkg.ilharper.com/x/isatty v1.1.0 h1:slOK6hP9/y9mJWyCInMwnT432NExfWyYV2SsebdYOCY= +gopkg.ilharper.com/x/isatty v1.1.0/go.mod h1:ofpv77Td5qQO6R1dmDd3oNt8TZdRo+l5gYAMxopRyS0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 6f2bb1402f6bfd8ec9caca3220c9b15d8f6f33db Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Thu, 1 Dec 2022 17:17:24 +0800 Subject: [PATCH 55/95] update dep --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 0de9c8b..3b6bd5b 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.19 require ( github.com/Microsoft/go-winio v0.5.1 - github.com/Mrs4s/MiraiGo v0.0.0-20220828090150-a3c348100dfe + github.com/Mrs4s/MiraiGo v0.0.0-20221201090748-23f637d2954e github.com/RomiChan/syncx v0.0.0-20220404072119-d7ea0ae15a4c github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc github.com/fumiama/go-base16384 v1.5.2 diff --git a/go.sum b/go.sum index 47b2da4..9550d9c 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY= github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Mrs4s/MiraiGo v0.0.0-20220828090150-a3c348100dfe h1:KpRbU5MRL2dplf01Cbgo8m0+ST1V1A+4cFBQkQA/YAk= -github.com/Mrs4s/MiraiGo v0.0.0-20220828090150-a3c348100dfe/go.mod h1:lecSP26qedhinCceWn1x02dLDxGotH5nTFlpIMilmVM= +github.com/Mrs4s/MiraiGo v0.0.0-20221201090748-23f637d2954e h1:PvTvu1c9R8XCDGysBYGF+TSO+UfX347NJkNblifC4C8= +github.com/Mrs4s/MiraiGo v0.0.0-20221201090748-23f637d2954e/go.mod h1:lecSP26qedhinCceWn1x02dLDxGotH5nTFlpIMilmVM= github.com/RomiChan/protobuf v0.1.1-0.20220624030127-3310cba9dbc0 h1:+UGPBYVjssFsdahLJIiNPwpmmwgl/OaVdv1oc5NonC0= github.com/RomiChan/protobuf v0.1.1-0.20220624030127-3310cba9dbc0/go.mod h1:2Ie+hdBFQpQFDHfeklgxoFmQRCE7O+KwFpISeXq7OwA= github.com/RomiChan/syncx v0.0.0-20220404072119-d7ea0ae15a4c h1:cNPOdTNiVwxLpROLjXCgbIPvdkE+BwvxDvgmdYmWx6Q= From 0248c86078edc09fa396f5e1bfc8bacc8fca3fd1 Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Thu, 1 Dec 2022 18:09:18 +0800 Subject: [PATCH 56/95] fix #1733 --- coolq/cqcode/element.go | 4 +- coolq/event.go | 6 +- global/quote.go | 146 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 153 insertions(+), 3 deletions(-) create mode 100644 global/quote.go diff --git a/coolq/cqcode/element.go b/coolq/cqcode/element.go index 2605d5a..2788ba2 100644 --- a/coolq/cqcode/element.go +++ b/coolq/cqcode/element.go @@ -2,10 +2,10 @@ package cqcode import ( "bytes" - "strconv" "strings" "github.com/Mrs4s/MiraiGo/binary" + "github.com/Mrs4s/go-cqhttp/global" ) // Element single message @@ -60,7 +60,7 @@ func (e *Element) MarshalJSON() ([]byte, error) { buf.WriteByte('"') buf.WriteString(data.K) buf.WriteString(`":`) - buf.WriteString(strconv.Quote(data.V)) + buf.WriteString(global.Quote(data.V)) } buf.WriteString(`}}`) }), nil diff --git a/coolq/event.go b/coolq/event.go index 34500e2..02c4da6 100644 --- a/coolq/event.go +++ b/coolq/event.go @@ -61,7 +61,11 @@ func (ev *event) MarshalJSON() ([]byte, error) { fmt.Fprintf(buf, `,"sub_type":"%s"`, ev.SubType) } for k, v := range ev.Others { - v, _ := json.Marshal(v) + v, err := json.Marshal(v) + if err != nil { + log.Warnf("marshal message payload error: %v", err) + return nil, err + } fmt.Fprintf(buf, `,"%s":%s`, k, v) } buf.WriteByte('}') diff --git a/global/quote.go b/global/quote.go new file mode 100644 index 0000000..bad54b9 --- /dev/null +++ b/global/quote.go @@ -0,0 +1,146 @@ +package global + +import ( + "strconv" + "unicode/utf8" +) + +const ( + lowerhex = "0123456789abcdef" + upperhex = "0123456789ABCDEF" +) + +// Quote returns a double-quoted Go string literal representing s. The +// returned string uses Go escape sequences (\t, \n, \xFF, \u0100) for +// control characters and non-printable characters as defined by +// IsPrint. +func Quote(s string) string { + return quoteWith(s, '"', false, false) +} + +func quoteWith(s string, quote byte, ASCIIonly, graphicOnly bool) string { + return string(appendQuotedWith(make([]byte, 0, 3*len(s)/2), s, quote, ASCIIonly, graphicOnly)) +} + +func appendQuotedWith(buf []byte, s string, quote byte, ASCIIonly, graphicOnly bool) []byte { + // Often called with big strings, so preallocate. If there's quoting, + // this is conservative but still helps a lot. + if cap(buf)-len(buf) < len(s) { + nBuf := make([]byte, len(buf), len(buf)+1+len(s)+1) + copy(nBuf, buf) + buf = nBuf + } + buf = append(buf, quote) + for width := 0; len(s) > 0; s = s[width:] { + r := rune(s[0]) + width = 1 + if r >= utf8.RuneSelf { + r, width = utf8.DecodeRuneInString(s) + } + if width == 1 && r == utf8.RuneError { + buf = append(buf, `\x`...) + buf = append(buf, lowerhex[s[0]>>4]) + buf = append(buf, lowerhex[s[0]&0xF]) + continue + } + buf = appendEscapedRune(buf, r, quote, ASCIIonly, graphicOnly) + } + buf = append(buf, quote) + return buf +} +func appendEscapedRune(buf []byte, r rune, quote byte, ASCIIonly, graphicOnly bool) []byte { + var runeTmp [utf8.UTFMax]byte + if r == rune(quote) || r == '\\' { // always backslashed + buf = append(buf, '\\') + buf = append(buf, byte(r)) + return buf + } + if ASCIIonly { + if r < utf8.RuneSelf && strconv.IsPrint(r) { + buf = append(buf, byte(r)) + return buf + } + } else if strconv.IsPrint(r) || graphicOnly && isInGraphicList(r) { + n := utf8.EncodeRune(runeTmp[:], r) + buf = append(buf, runeTmp[:n]...) + return buf + } + switch r { + case '\a': + buf = append(buf, `\a`...) + case '\b': + buf = append(buf, `\b`...) + case '\f': + buf = append(buf, `\f`...) + case '\n': + buf = append(buf, `\n`...) + case '\r': + buf = append(buf, `\r`...) + case '\t': + buf = append(buf, `\t`...) + case '\v': + buf = append(buf, `\v`...) + default: + switch { + case !utf8.ValidRune(r): + r = 0xFFFD + fallthrough + case r < 0x10000: + buf = append(buf, `\u`...) + for s := 12; s >= 0; s -= 4 { + buf = append(buf, lowerhex[r>>uint(s)&0xF]) + } + default: + buf = append(buf, `\U`...) + for s := 28; s >= 0; s -= 4 { + buf = append(buf, lowerhex[r>>uint(s)&0xF]) + } + } + } + return buf +} + +func isInGraphicList(r rune) bool { + // We know r must fit in 16 bits - see makeisprint.go. + if r > 0xFFFF { + return false + } + rr := uint16(r) + i := bsearch16(isGraphic, rr) + return i < len(isGraphic) && rr == isGraphic[i] +} + +// bsearch16 returns the smallest i such that a[i] >= x. +// If there is no such i, bsearch16 returns len(a). +func bsearch16(a []uint16, x uint16) int { + i, j := 0, len(a) + for i < j { + h := i + (j-i)>>1 + if a[h] < x { + i = h + 1 + } else { + j = h + } + } + return i +} + +// isGraphic lists the graphic runes not matched by IsPrint. +var isGraphic = []uint16{ + 0x00a0, + 0x1680, + 0x2000, + 0x2001, + 0x2002, + 0x2003, + 0x2004, + 0x2005, + 0x2006, + 0x2007, + 0x2008, + 0x2009, + 0x200a, + 0x202f, + 0x205f, + 0x3000, +} From 4bebd4fec8be7a841f0fb24dd425eefda89151c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Fri, 2 Dec 2022 17:59:04 +0800 Subject: [PATCH 57/95] fix: update deps to modernc.org/sqlite --- go.mod | 69 ++++++++------ go.sum | 290 +++++++++++++++++++-------------------------------------- 2 files changed, 133 insertions(+), 226 deletions(-) diff --git a/go.mod b/go.mod index 01f64af..2d4d05e 100644 --- a/go.mod +++ b/go.mod @@ -3,57 +3,66 @@ module github.com/Mrs4s/go-cqhttp go 1.19 require ( - github.com/FloatTech/sqlite v0.5.1 - github.com/Microsoft/go-winio v0.5.1 - github.com/Mrs4s/MiraiGo v0.0.0-20220828090150-a3c348100dfe - github.com/RomiChan/syncx v0.0.0-20220404072119-d7ea0ae15a4c + github.com/FloatTech/sqlite v1.5.4 + github.com/Microsoft/go-winio v0.6.0 + github.com/Mrs4s/MiraiGo v0.0.0-20221201090748-23f637d2954e + github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc - github.com/fumiama/go-base16384 v1.5.2 + github.com/fumiama/go-base16384 v1.6.1 github.com/fumiama/go-hide-param v0.1.4 github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible - github.com/mattn/go-colorable v0.1.12 + github.com/mattn/go-colorable v0.1.13 github.com/pkg/errors v0.9.1 - github.com/segmentio/asm v1.1.3 - github.com/sirupsen/logrus v1.8.1 - github.com/stretchr/testify v1.8.0 + github.com/segmentio/asm v1.2.0 + github.com/sirupsen/logrus v1.9.0 + github.com/stretchr/testify v1.8.1 github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 - github.com/tidwall/gjson v1.14.3 - github.com/wdvxdr1123/go-silk v0.0.0-20210316130616-d47b553def60 - go.mongodb.org/mongo-driver v1.8.3 - golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 - golang.org/x/sys v0.0.0-20220412211240-33da011f77ad - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 - golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 + github.com/tidwall/gjson v1.14.4 + github.com/wdvxdr1123/go-silk v0.0.0-20220304095002-f67345df09ea + go.mongodb.org/mongo-driver v1.11.0 + golang.org/x/crypto v0.3.0 + golang.org/x/sys v0.2.0 + golang.org/x/term v0.2.0 + golang.org/x/time v0.2.0 gopkg.in/yaml.v3 v3.0.1 ) require ( github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b // indirect - github.com/RomiChan/protobuf v0.1.1-0.20220624030127-3310cba9dbc0 // indirect + github.com/RomiChan/protobuf v0.0.0-20220624030127-3310cba9dbc0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/fumiama/imgsz v0.0.2 // indirect - github.com/fumiama/sqlite3 v1.14.6 // indirect - github.com/go-stack/stack v1.8.0 // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/google/go-cmp v0.5.5 // indirect github.com/google/uuid v1.3.0 // indirect - github.com/jonboulle/clockwork v0.2.2 // indirect + github.com/jonboulle/clockwork v0.3.0 // indirect + github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/klauspost/compress v1.13.6 // indirect - github.com/lestrrat-go/strftime v1.0.5 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect + github.com/lestrrat-go/strftime v1.0.6 // indirect + github.com/mattn/go-isatty v0.0.16 // indirect + github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect github.com/pierrec/lz4/v4 v4.1.15 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.0.2 // indirect - github.com/xdg-go/stringprep v1.0.2 // indirect + github.com/xdg-go/scram v1.1.1 // indirect + github.com/xdg-go/stringprep v1.0.3 // indirect github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9 // indirect + golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde // indirect - golang.org/x/text v0.3.7 // indirect - modernc.org/libc v1.14.6 // indirect - modernc.org/mathutil v1.4.1 // indirect - modernc.org/memory v1.0.5 // indirect + golang.org/x/text v0.4.0 // indirect + golang.org/x/tools v0.1.12 // indirect + lukechampine.com/uint128 v1.2.0 // indirect + modernc.org/cc/v3 v3.40.0 // indirect + modernc.org/ccgo/v3 v3.16.13 // indirect + modernc.org/libc v1.21.5 // indirect + modernc.org/mathutil v1.5.0 // indirect + modernc.org/memory v1.4.0 // indirect + modernc.org/opt v0.1.3 // indirect + modernc.org/sqlite v1.20.0 // indirect + modernc.org/strutil v1.1.3 // indirect + modernc.org/token v1.0.1 // indirect ) + +replace github.com/remyoudompheng/bigfft => github.com/fumiama/bigfft v0.0.0-20211011143303-6e0bfa3c836b diff --git a/go.sum b/go.sum index 7745439..904e2d5 100644 --- a/go.sum +++ b/go.sum @@ -1,34 +1,32 @@ -github.com/FloatTech/sqlite v0.5.1 h1:IjTdnqMVIVIoIEFXhvh/KKBfYxFvG0tk7Rghz65/DAU= -github.com/FloatTech/sqlite v0.5.1/go.mod h1:i33d92OtR8jcp5fBUvQtospf27+MkfUxnGwnZ95E/dA= +github.com/FloatTech/sqlite v1.5.4 h1:f4HFyF+ziS3VdhhptdwFyVBGxgn2izRD6nQOBTKyl3I= +github.com/FloatTech/sqlite v1.5.4/go.mod h1:wiETjtOKD5l5CKDqDktlNL2DoZogngln7AE/jbNOu5Y= github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b h1:tvciXWq2nuvTbFeJGLDNIdRX3BI546D3O7k7vrVueZw= github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b/go.mod h1:fHZFWGquNXuHttu9dUYoKuNbm3dzLETnIOnm1muSfDs= -github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY= -github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Mrs4s/MiraiGo v0.0.0-20220828090150-a3c348100dfe h1:KpRbU5MRL2dplf01Cbgo8m0+ST1V1A+4cFBQkQA/YAk= -github.com/Mrs4s/MiraiGo v0.0.0-20220828090150-a3c348100dfe/go.mod h1:lecSP26qedhinCceWn1x02dLDxGotH5nTFlpIMilmVM= -github.com/RomiChan/protobuf v0.1.1-0.20220624030127-3310cba9dbc0 h1:+UGPBYVjssFsdahLJIiNPwpmmwgl/OaVdv1oc5NonC0= -github.com/RomiChan/protobuf v0.1.1-0.20220624030127-3310cba9dbc0/go.mod h1:2Ie+hdBFQpQFDHfeklgxoFmQRCE7O+KwFpISeXq7OwA= -github.com/RomiChan/syncx v0.0.0-20220404072119-d7ea0ae15a4c h1:cNPOdTNiVwxLpROLjXCgbIPvdkE+BwvxDvgmdYmWx6Q= -github.com/RomiChan/syncx v0.0.0-20220404072119-d7ea0ae15a4c/go.mod h1:KqZzu7slNKROh3TSYEH/IUMG6f4M+1qubZ5e52QypsE= +github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= +github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= +github.com/Mrs4s/MiraiGo v0.0.0-20221201090748-23f637d2954e h1:PvTvu1c9R8XCDGysBYGF+TSO+UfX347NJkNblifC4C8= +github.com/Mrs4s/MiraiGo v0.0.0-20221201090748-23f637d2954e/go.mod h1:lecSP26qedhinCceWn1x02dLDxGotH5nTFlpIMilmVM= +github.com/RomiChan/protobuf v0.0.0-20220624030127-3310cba9dbc0 h1:GEwcB4dL9vc4veW1fLNt0Fby3wspVflAn5v9/HbUwDM= +github.com/RomiChan/protobuf v0.0.0-20220624030127-3310cba9dbc0/go.mod h1:2Ie+hdBFQpQFDHfeklgxoFmQRCE7O+KwFpISeXq7OwA= +github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e h1:wR3MXQ3VbUlPKOOUwLOYgh/QaJThBTYtsl673O3lqSA= +github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e/go.mod h1:vD7Ra3Q9onRtojoY5sMCLQ7JBgjUsrXDnDKyFxqpf9w= github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc h1:AAx50/fb/xS4lvsdQg+bFbGvqSDhyV1MF+p2PLCamZ0= github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc/go.mod h1:OMmITAib6POA37xCichWM0aRnoVpSMZO1rB/G01wrr0= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fumiama/go-base16384 v1.5.2 h1:cbxXTcDH92PNgG7bEBwiCEoWb5O+nwZKxKOG94ilFo8= -github.com/fumiama/go-base16384 v1.5.2/go.mod h1:OEn+947GV5gsbTAnyuUW/SrfxJYUdYupSIQXOuGOcXM= +github.com/fumiama/bigfft v0.0.0-20211011143303-6e0bfa3c836b h1:Zt3pFQditAdWTHCOVkiloc9ZauBoWrb37guFV4iIRvE= +github.com/fumiama/bigfft v0.0.0-20211011143303-6e0bfa3c836b/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/fumiama/go-base16384 v1.6.1 h1:4yb4JgmBJDnQtq3XGXXdLrVwEnRpjhMUt4eAcsNeA30= +github.com/fumiama/go-base16384 v1.6.1/go.mod h1:OEn+947GV5gsbTAnyuUW/SrfxJYUdYupSIQXOuGOcXM= github.com/fumiama/go-hide-param v0.1.4 h1:y7TRTzZMdCH9GOXnIzU3B+1BSkcmvejVGmGsz4t0DGU= github.com/fumiama/go-hide-param v0.1.4/go.mod h1:vJkQlJIEI56nIyp7tCQu1/2QOyKtZpudsnJkGk9U1aY= github.com/fumiama/imgsz v0.0.2 h1:fAkC0FnIscdKOXwAxlyw3EUba5NzxZdSxGaq3Uyfxak= github.com/fumiama/imgsz v0.0.2/go.mod h1:dR71mI3I2O5u6+PCpd47M9TZptzP+39tRBcbdIkoqM4= -github.com/fumiama/sqlite3 v1.14.6 h1:+e+iygyiDXQJVi7xeXIviBvR7hAc5y20WA9hRwfKn10= -github.com/fumiama/sqlite3 v1.14.6/go.mod h1:Xx9a2/OtHuy9pBjow0N+bE/RhNeZ7zZz5xh25vqbA5A= -github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= @@ -43,14 +41,14 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/jonboulle/clockwork v0.3.0 h1:9BSCMi8C+0qdApAp4auwX0RkLGUjs956h0EkuQymUhg= +github.com/jonboulle/clockwork v0.3.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= @@ -63,13 +61,15 @@ github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2t github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is= github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible h1:Y6sqxHMyB1D2YSzWkLibYKgg+SwmyFU9dF2hn6MdTj4= github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible/go.mod h1:ZQnN8lSECaebrkQytbHj4xNgtg8CR7RYXnPok8e0EHA= -github.com/lestrrat-go/strftime v1.0.5 h1:A7H3tT8DhTz8u65w+JRpiBxM4dINQhUXAZnhBa2xeOE= -github.com/lestrrat-go/strftime v1.0.5/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR76fd03sz+Qz4g= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/lestrrat-go/strftime v1.0.6 h1:CFGsDEt1pOpFNU+TJB0nhz9jl+K0hZSLE205AhTIGQQ= +github.com/lestrrat-go/strftime v1.0.6/go.mod h1:f7jQKgV5nnJpYgdEasS+/y7EsTb8ykN2z68n3TtcTaw= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= @@ -82,70 +82,61 @@ github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/pierrec/lz4/v4 v4.1.15 h1:MO0/ucJhngq7299dKLwIMtgTfbkoSPF6AoMYDd8Q4q0= github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/segmentio/asm v1.1.3 h1:WM03sfUOENvvKexOLp+pCqgb/WDjsi7EK8gIsICtzhc= -github.com/segmentio/asm v1.1.3/go.mod h1:Ld3L4ZXGNcSLRg4JBsZ3//1+f/TjYl0Mzen/DQy1EJg= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= +github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= -github.com/tidwall/gjson v1.14.3 h1:9jvXn7olKEHU1S9vwoMGliaT8jq1vJ7IH/n9zD9Dnlw= -github.com/tidwall/gjson v1.14.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM= +github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/wdvxdr1123/go-silk v0.0.0-20210316130616-d47b553def60 h1:lRKf10iIOW0VsH5WDF621ihzR+R2wEBZVtNRHuLLCb4= -github.com/wdvxdr1123/go-silk v0.0.0-20210316130616-d47b553def60/go.mod h1:ecFKZPX81BaB70I6ruUgEwYcDOtuNgJGnjdK+MIl5ko= +github.com/wdvxdr1123/go-silk v0.0.0-20220304095002-f67345df09ea h1:sl1pYm1kHtIndckTY8YDt+QFt77vI0JnKHP0U8rZtKc= +github.com/wdvxdr1123/go-silk v0.0.0-20220304095002-f67345df09ea/go.mod h1:ecFKZPX81BaB70I6ruUgEwYcDOtuNgJGnjdK+MIl5ko= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.0.2 h1:akYIkZ28e6A96dkWNJQu3nmCzH3YfwMPQExUYDaRv7w= -github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= -github.com/xdg-go/stringprep v1.0.2 h1:6iq84/ryjjeRmMJwxutI51F2GIPlP5BfTvXHeYjyhBc= -github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= +github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E= +github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= +github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs= +github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.mongodb.org/mongo-driver v1.8.3 h1:TDKlTkGDKm9kkJVUOAXDK5/fkqKHJVwYQSpoRfB43R4= -go.mongodb.org/mongo-driver v1.8.3/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY= +go.mongodb.org/mongo-driver v1.11.0 h1:FZKhBSTydeuffHj9CBjXlR8vQLee1cQyTWYPA6/tqiE= +go.mongodb.org/mongo-driver v1.11.0/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 h1:0es+/5331RGQPcXlMfP+WrnIIS6dNnNRe0WB02W0F4M= -golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.3.0 h1:a06MkbcxBrEFc0w0QIZWXrH/9cCX6KJyWbBOIwAn+7A= +golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9 h1:0qxwC5n+ttVOINCBeRHO0nq9X7uy8SDsPoi5OaCdIEI= -golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.2.0 h1:sZfSu1wtKLGlWI4ZZayP0ck9Y73K1ynO6gqzTdBVdPU= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde h1:ejfdSekXMDxDLbRrJMwUk6KnSLZ2McaUCVcIKM+N6jc= golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -153,40 +144,35 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210902050250-f475640dd07b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220111092808-5a964db01320/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.2.0 h1:z85xZCsEl7bi/KwbNADeBYoOP0++7W1ipu+aGnpwzRM= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 h1:GZokNIeuVkl3aZHJchRrr13WCsols02MLUcz1U9is6M= -golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/time v0.2.0 h1:52I/1L54xyEQAYdtcSuxtiT84KGYTBGXwayxmIpNJhE= +golang.org/x/time v0.2.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -208,119 +194,31 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -modernc.org/cc/v3 v3.33.6/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= -modernc.org/cc/v3 v3.33.9/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= -modernc.org/cc/v3 v3.33.11/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= -modernc.org/cc/v3 v3.34.0/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= -modernc.org/cc/v3 v3.35.0/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= -modernc.org/cc/v3 v3.35.4/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= -modernc.org/cc/v3 v3.35.5/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= -modernc.org/cc/v3 v3.35.7/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= -modernc.org/cc/v3 v3.35.8/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= -modernc.org/cc/v3 v3.35.10/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= -modernc.org/cc/v3 v3.35.15/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= -modernc.org/cc/v3 v3.35.16/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= -modernc.org/cc/v3 v3.35.17/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= -modernc.org/cc/v3 v3.35.18/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= -modernc.org/cc/v3 v3.35.20/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= -modernc.org/cc/v3 v3.35.22/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= -modernc.org/ccgo/v3 v3.9.5/go.mod h1:umuo2EP2oDSBnD3ckjaVUXMrmeAw8C8OSICVa0iFf60= -modernc.org/ccgo/v3 v3.10.0/go.mod h1:c0yBmkRFi7uW4J7fwx/JiijwOjeAeR2NoSaRVFPmjMw= -modernc.org/ccgo/v3 v3.11.0/go.mod h1:dGNposbDp9TOZ/1KBxghxtUp/bzErD0/0QW4hhSaBMI= -modernc.org/ccgo/v3 v3.11.1/go.mod h1:lWHxfsn13L3f7hgGsGlU28D9eUOf6y3ZYHKoPaKU0ag= -modernc.org/ccgo/v3 v3.11.3/go.mod h1:0oHunRBMBiXOKdaglfMlRPBALQqsfrCKXgw9okQ3GEw= -modernc.org/ccgo/v3 v3.12.4/go.mod h1:Bk+m6m2tsooJchP/Yk5ji56cClmN6R1cqc9o/YtbgBQ= -modernc.org/ccgo/v3 v3.12.6/go.mod h1:0Ji3ruvpFPpz+yu+1m0wk68pdr/LENABhTrDkMDWH6c= -modernc.org/ccgo/v3 v3.12.8/go.mod h1:Hq9keM4ZfjCDuDXxaHptpv9N24JhgBZmUG5q60iLgUo= -modernc.org/ccgo/v3 v3.12.11/go.mod h1:0jVcmyDwDKDGWbcrzQ+xwJjbhZruHtouiBEvDfoIsdg= -modernc.org/ccgo/v3 v3.12.14/go.mod h1:GhTu1k0YCpJSuWwtRAEHAol5W7g1/RRfS4/9hc9vF5I= -modernc.org/ccgo/v3 v3.12.18/go.mod h1:jvg/xVdWWmZACSgOiAhpWpwHWylbJaSzayCqNOJKIhs= -modernc.org/ccgo/v3 v3.12.20/go.mod h1:aKEdssiu7gVgSy/jjMastnv/q6wWGRbszbheXgWRHc8= -modernc.org/ccgo/v3 v3.12.21/go.mod h1:ydgg2tEprnyMn159ZO/N4pLBqpL7NOkJ88GT5zNU2dE= -modernc.org/ccgo/v3 v3.12.22/go.mod h1:nyDVFMmMWhMsgQw+5JH6B6o4MnZ+UQNw1pp52XYFPRk= -modernc.org/ccgo/v3 v3.12.25/go.mod h1:UaLyWI26TwyIT4+ZFNjkyTbsPsY3plAEB6E7L/vZV3w= -modernc.org/ccgo/v3 v3.12.29/go.mod h1:FXVjG7YLf9FetsS2OOYcwNhcdOLGt8S9bQ48+OP75cE= -modernc.org/ccgo/v3 v3.12.36/go.mod h1:uP3/Fiezp/Ga8onfvMLpREq+KUjUmYMxXPO8tETHtA8= -modernc.org/ccgo/v3 v3.12.38/go.mod h1:93O0G7baRST1vNj4wnZ49b1kLxt0xCW5Hsa2qRaZPqc= -modernc.org/ccgo/v3 v3.12.43/go.mod h1:k+DqGXd3o7W+inNujK15S5ZYuPoWYLpF5PYougCmthU= -modernc.org/ccgo/v3 v3.12.46/go.mod h1:UZe6EvMSqOxaJ4sznY7b23/k13R8XNlyWsO5bAmSgOE= -modernc.org/ccgo/v3 v3.12.47/go.mod h1:m8d6p0zNps187fhBwzY/ii6gxfjob1VxWb919Nk1HUk= -modernc.org/ccgo/v3 v3.12.50/go.mod h1:bu9YIwtg+HXQxBhsRDE+cJjQRuINuT9PUK4orOco/JI= -modernc.org/ccgo/v3 v3.12.51/go.mod h1:gaIIlx4YpmGO2bLye04/yeblmvWEmE4BBBls4aJXFiE= -modernc.org/ccgo/v3 v3.12.53/go.mod h1:8xWGGTFkdFEWBEsUmi+DBjwu/WLy3SSOrqEmKUjMeEg= -modernc.org/ccgo/v3 v3.12.54/go.mod h1:yANKFTm9llTFVX1FqNKHE0aMcQb1fuPJx6p8AcUx+74= -modernc.org/ccgo/v3 v3.12.55/go.mod h1:rsXiIyJi9psOwiBkplOaHye5L4MOOaCjHg1Fxkj7IeU= -modernc.org/ccgo/v3 v3.12.56/go.mod h1:ljeFks3faDseCkr60JMpeDb2GSO3TKAmrzm7q9YOcMU= -modernc.org/ccgo/v3 v3.12.57/go.mod h1:hNSF4DNVgBl8wYHpMvPqQWDQx8luqxDnNGCMM4NFNMc= -modernc.org/ccgo/v3 v3.12.60/go.mod h1:k/Nn0zdO1xHVWjPYVshDeWKqbRWIfif5dtsIOCUVMqM= -modernc.org/ccgo/v3 v3.12.66/go.mod h1:jUuxlCFZTUZLMV08s7B1ekHX5+LIAurKTTaugUr/EhQ= -modernc.org/ccgo/v3 v3.12.67/go.mod h1:Bll3KwKvGROizP2Xj17GEGOTrlvB1XcVaBrC90ORO84= -modernc.org/ccgo/v3 v3.12.73/go.mod h1:hngkB+nUUqzOf3iqsM48Gf1FZhY599qzVg1iX+BT3cQ= -modernc.org/ccgo/v3 v3.12.81/go.mod h1:p2A1duHoBBg1mFtYvnhAnQyI6vL0uw5PGYLSIgF6rYY= -modernc.org/ccgo/v3 v3.12.84/go.mod h1:ApbflUfa5BKadjHynCficldU1ghjen84tuM5jRynB7w= -modernc.org/ccgo/v3 v3.12.86/go.mod h1:dN7S26DLTgVSni1PVA3KxxHTcykyDurf3OgUzNqTSrU= -modernc.org/ccgo/v3 v3.12.90/go.mod h1:obhSc3CdivCRpYZmrvO88TXlW0NvoSVvdh/ccRjJYko= -modernc.org/ccgo/v3 v3.12.92/go.mod h1:5yDdN7ti9KWPi5bRVWPl8UNhpEAtCjuEE7ayQnzzqHA= -modernc.org/ccgo/v3 v3.13.1/go.mod h1:aBYVOUfIlcSnrsRVU8VRS35y2DIfpgkmVkYZ0tpIXi4= -modernc.org/ccgo/v3 v3.15.9/go.mod h1:md59wBwDT2LznX/OTCPoVS6KIsdRgY8xqQwBV+hkTH0= -modernc.org/ccgo/v3 v3.15.10/go.mod h1:wQKxoFn0ynxMuCLfFD09c8XPUCc8obfchoVR9Cn0fI8= -modernc.org/ccgo/v3 v3.15.12/go.mod h1:VFePOWoCd8uDGRJpq/zfJ29D0EVzMSyID8LCMWYbX6I= -modernc.org/ccorpus v1.11.1/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= -modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +lukechampine.com/uint128 v1.2.0 h1:mBi/5l91vocEN8otkC5bDLhi2KdCticRiwbdB0O+rjI= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.40.0 h1:P3g79IUS/93SYhtoeaHW+kRCIrYaxJ27MFPv+7kaTOw= +modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= +modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw= +modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= +modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= +modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= modernc.org/libc v1.8.1/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w= -modernc.org/libc v1.9.8/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w= -modernc.org/libc v1.9.11/go.mod h1:NyF3tsA5ArIjJ83XB0JlqhjTabTCHm9aX4XMPHyQn0Q= -modernc.org/libc v1.11.0/go.mod h1:2lOfPmj7cz+g1MrPNmX65QCzVxgNq2C5o0jdLY2gAYg= -modernc.org/libc v1.11.2/go.mod h1:ioIyrl3ETkugDO3SGZ+6EOKvlP3zSOycUETe4XM4n8M= -modernc.org/libc v1.11.5/go.mod h1:k3HDCP95A6U111Q5TmG3nAyUcp3kR5YFZTeDS9v8vSU= -modernc.org/libc v1.11.6/go.mod h1:ddqmzR6p5i4jIGK1d/EiSw97LBcE3dK24QEwCFvgNgE= -modernc.org/libc v1.11.11/go.mod h1:lXEp9QOOk4qAYOtL3BmMve99S5Owz7Qyowzvg6LiZso= -modernc.org/libc v1.11.13/go.mod h1:ZYawJWlXIzXy2Pzghaf7YfM8OKacP3eZQI81PDLFdY8= -modernc.org/libc v1.11.16/go.mod h1:+DJquzYi+DMRUtWI1YNxrlQO6TcA5+dRRiq8HWBWRC8= -modernc.org/libc v1.11.19/go.mod h1:e0dgEame6mkydy19KKaVPBeEnyJB4LGNb0bBH1EtQ3I= -modernc.org/libc v1.11.24/go.mod h1:FOSzE0UwookyT1TtCJrRkvsOrX2k38HoInhw+cSCUGk= -modernc.org/libc v1.11.26/go.mod h1:SFjnYi9OSd2W7f4ct622o/PAYqk7KHv6GS8NZULIjKY= -modernc.org/libc v1.11.27/go.mod h1:zmWm6kcFXt/jpzeCgfvUNswM0qke8qVwxqZrnddlDiE= -modernc.org/libc v1.11.28/go.mod h1:Ii4V0fTFcbq3qrv3CNn+OGHAvzqMBvC7dBNyC4vHZlg= -modernc.org/libc v1.11.31/go.mod h1:FpBncUkEAtopRNJj8aRo29qUiyx5AvAlAxzlx9GNaVM= -modernc.org/libc v1.11.34/go.mod h1:+Tzc4hnb1iaX/SKAutJmfzES6awxfU1BPvrrJO0pYLg= -modernc.org/libc v1.11.37/go.mod h1:dCQebOwoO1046yTrfUE5nX1f3YpGZQKNcITUYWlrAWo= -modernc.org/libc v1.11.39/go.mod h1:mV8lJMo2S5A31uD0k1cMu7vrJbSA3J3waQJxpV4iqx8= -modernc.org/libc v1.11.42/go.mod h1:yzrLDU+sSjLE+D4bIhS7q1L5UwXDOw99PLSX0BlZvSQ= -modernc.org/libc v1.11.44/go.mod h1:KFq33jsma7F5WXiYelU8quMJasCCTnHK0mkri4yPHgA= -modernc.org/libc v1.11.45/go.mod h1:Y192orvfVQQYFzCNsn+Xt0Hxt4DiO4USpLNXBlXg/tM= -modernc.org/libc v1.11.47/go.mod h1:tPkE4PzCTW27E6AIKIR5IwHAQKCAtudEIeAV1/SiyBg= -modernc.org/libc v1.11.49/go.mod h1:9JrJuK5WTtoTWIFQ7QjX2Mb/bagYdZdscI3xrvHbXjE= -modernc.org/libc v1.11.51/go.mod h1:R9I8u9TS+meaWLdbfQhq2kFknTW0O3aw3kEMqDDxMaM= -modernc.org/libc v1.11.53/go.mod h1:5ip5vWYPAoMulkQ5XlSJTy12Sz5U6blOQiYasilVPsU= -modernc.org/libc v1.11.54/go.mod h1:S/FVnskbzVUrjfBqlGFIPA5m7UwB3n9fojHhCNfSsnw= -modernc.org/libc v1.11.55/go.mod h1:j2A5YBRm6HjNkoSs/fzZrSxCuwWqcMYTDPLNx0URn3M= -modernc.org/libc v1.11.56/go.mod h1:pakHkg5JdMLt2OgRadpPOTnyRXm/uzu+Yyg/LSLdi18= -modernc.org/libc v1.11.58/go.mod h1:ns94Rxv0OWyoQrDqMFfWwka2BcaF6/61CqJRK9LP7S8= -modernc.org/libc v1.11.71/go.mod h1:DUOmMYe+IvKi9n6Mycyx3DbjfzSKrdr/0Vgt3j7P5gw= -modernc.org/libc v1.11.75/go.mod h1:dGRVugT6edz361wmD9gk6ax1AbDSe0x5vji0dGJiPT0= -modernc.org/libc v1.11.82/go.mod h1:NF+Ek1BOl2jeC7lw3a7Jj5PWyHPwWD4aq3wVKxqV1fI= -modernc.org/libc v1.11.86/go.mod h1:ePuYgoQLmvxdNT06RpGnaDKJmDNEkV7ZPKI2jnsvZoE= -modernc.org/libc v1.11.87/go.mod h1:Qvd5iXTeLhI5PS0XSyqMY99282y+3euapQFxM7jYnpY= -modernc.org/libc v1.11.88/go.mod h1:h3oIVe8dxmTcchcFuCcJ4nAWaoiwzKCdv82MM0oiIdQ= -modernc.org/libc v1.11.98/go.mod h1:ynK5sbjsU77AP+nn61+k+wxUGRx9rOFcIqWYYMaDZ4c= -modernc.org/libc v1.11.101/go.mod h1:wLLYgEiY2D17NbBOEp+mIJJJBGSiy7fLL4ZrGGZ+8jI= -modernc.org/libc v1.12.0/go.mod h1:2MH3DaF/gCU8i/UBiVE1VFRos4o523M7zipmwH8SIgQ= -modernc.org/libc v1.14.1/go.mod h1:npFeGWjmZTjFeWALQLrvklVmAxv4m80jnG3+xI8FdJk= -modernc.org/libc v1.14.2/go.mod h1:MX1GBLnRLNdvmK9azU9LCxZ5lMyhrbEMK8rG3X/Fe34= -modernc.org/libc v1.14.3/go.mod h1:GPIvQVOVPizzlqyRX3l756/3ppsAgg1QgPxjr5Q4agQ= -modernc.org/libc v1.14.5/go.mod h1:2PJHINagVxO4QW/5OQdRrvMYo+bm5ClpUFfyXCYl9ak= -modernc.org/libc v1.14.6 h1:SSiZiE5199iYsGM9gtkDj90xqcXVwubWG8CtoYE+Mnk= -modernc.org/libc v1.14.6/go.mod h1:2PJHINagVxO4QW/5OQdRrvMYo+bm5ClpUFfyXCYl9ak= +modernc.org/libc v1.21.5 h1:xBkU9fnHV+hvZuPSRszN0AXDG4M7nwPLwTWwkYcvLCI= +modernc.org/libc v1.21.5/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.4.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.4.1 h1:ij3fYGe8zBF4Vu+g0oT7mB06r8sqGWKuJu1yXeR4by8= -modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/memory v1.0.4/go.mod h1:nV2OApxradM3/OVbs2/0OsP6nPfakXpi50C7dcoHXlc= -modernc.org/memory v1.0.5 h1:XRch8trV7GgvTec2i7jc33YlUI0RKVDBvZ5eZ5m8y14= -modernc.org/memory v1.0.5/go.mod h1:B7OYswTRnfGg+4tDH1t1OeUNnsy2viGTdME4tzd+IjM= -modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= -modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/memory v1.4.0 h1:crykUfNSnMAXaOJnnxcSzbUGMqkLWjklJKkBK2nwZwk= +modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.20.0 h1:80zmD3BGkm8BZ5fUi/4lwJQHiO3GXgIUvZRXpoIfROY= +modernc.org/sqlite v1.20.0/go.mod h1:EsYz8rfOvLCiYTy5ZFsOYzoCcRMu98YYkwAcCw5YIYw= +modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/tcl v1.15.0 h1:oY+JeD11qVVSgVvodMJsu7Edf8tr5E/7tuhF5cNYz34= +modernc.org/token v1.0.1 h1:A3qvTqOwexpfZZeyI0FeGPDlSWX5pjZu9hF4lU+EKWg= +modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.7.0 h1:xkDw/KepgEjeizO2sNco+hqYkU12taxQFqPEmgm1GWE= From efb5e63c75d3aab4bd559026ba36eba4e75fad31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Fri, 2 Dec 2022 18:04:38 +0800 Subject: [PATCH 58/95] update ft/sqlite --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 2d4d05e..15bb3b1 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/Mrs4s/go-cqhttp go 1.19 require ( - github.com/FloatTech/sqlite v1.5.4 + github.com/FloatTech/sqlite v1.5.5 github.com/Microsoft/go-winio v0.6.0 github.com/Mrs4s/MiraiGo v0.0.0-20221201090748-23f637d2954e github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e diff --git a/go.sum b/go.sum index 904e2d5..67be421 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/FloatTech/sqlite v1.5.4 h1:f4HFyF+ziS3VdhhptdwFyVBGxgn2izRD6nQOBTKyl3I= -github.com/FloatTech/sqlite v1.5.4/go.mod h1:wiETjtOKD5l5CKDqDktlNL2DoZogngln7AE/jbNOu5Y= +github.com/FloatTech/sqlite v1.5.5 h1:SmGE2MC2W7RQOYfWTau9ZdrfwUflOiLdobi9QgTiL0Y= +github.com/FloatTech/sqlite v1.5.5/go.mod h1:ItKoTpmEE2cYQ/hGrC02W+BBYE/tlUjlVGSTiM6ewFM= github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b h1:tvciXWq2nuvTbFeJGLDNIdRX3BI546D3O7k7vrVueZw= github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b/go.mod h1:fHZFWGquNXuHttu9dUYoKuNbm3dzLETnIOnm1muSfDs= github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= From 2e16533c819f5741f9f5760cf2dbaa9108a2059e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Fri, 2 Dec 2022 18:13:34 +0800 Subject: [PATCH 59/95] fix: update ft/sqlite --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 15bb3b1..a0b7fc3 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/Mrs4s/go-cqhttp go 1.19 require ( - github.com/FloatTech/sqlite v1.5.5 + github.com/FloatTech/sqlite v1.5.6 github.com/Microsoft/go-winio v0.6.0 github.com/Mrs4s/MiraiGo v0.0.0-20221201090748-23f637d2954e github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e diff --git a/go.sum b/go.sum index 67be421..5a24790 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/FloatTech/sqlite v1.5.5 h1:SmGE2MC2W7RQOYfWTau9ZdrfwUflOiLdobi9QgTiL0Y= -github.com/FloatTech/sqlite v1.5.5/go.mod h1:ItKoTpmEE2cYQ/hGrC02W+BBYE/tlUjlVGSTiM6ewFM= +github.com/FloatTech/sqlite v1.5.6 h1:Ws4uiN5AjjGV+ikM/cL8eOHHeYvX390srv8SaqPQ5Ok= +github.com/FloatTech/sqlite v1.5.6/go.mod h1:ItKoTpmEE2cYQ/hGrC02W+BBYE/tlUjlVGSTiM6ewFM= github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b h1:tvciXWq2nuvTbFeJGLDNIdRX3BI546D3O7k7vrVueZw= github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b/go.mod h1:fHZFWGquNXuHttu9dUYoKuNbm3dzLETnIOnm1muSfDs= github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= From 8f63750d7fba81053edff7a000f1f7437d39fa9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Fri, 2 Dec 2022 18:53:50 +0800 Subject: [PATCH 60/95] fix: sqlite --- db/sqlite3/leveldb_winarm.go | 7 ------- db/sqlite3/model.go | 3 --- db/sqlite3/sqlite3.go | 4 +--- go.mod | 2 +- go.sum | 4 ++-- 5 files changed, 4 insertions(+), 16 deletions(-) delete mode 100644 db/sqlite3/leveldb_winarm.go diff --git a/db/sqlite3/leveldb_winarm.go b/db/sqlite3/leveldb_winarm.go deleted file mode 100644 index eaae201..0000000 --- a/db/sqlite3/leveldb_winarm.go +++ /dev/null @@ -1,7 +0,0 @@ -//go:build windows && (arm || arm64) -// +build windows -// +build arm arm64 - -package sqlite3 - -import _ "github.com/Mrs4s/go-cqhttp/db/leveldb" // 切换到 leveldb diff --git a/db/sqlite3/model.go b/db/sqlite3/model.go index 29e1483..2869865 100644 --- a/db/sqlite3/model.go +++ b/db/sqlite3/model.go @@ -1,6 +1,3 @@ -//go:build !(windows && (arm || arm64)) -// +build !windows !arm,!arm64 - package sqlite3 const ( diff --git a/db/sqlite3/sqlite3.go b/db/sqlite3/sqlite3.go index 4495a06..5097057 100644 --- a/db/sqlite3/sqlite3.go +++ b/db/sqlite3/sqlite3.go @@ -1,6 +1,3 @@ -//go:build !(windows && (arm || arm64)) -// +build !windows !arm,!arm64 - package sqlite3 import ( @@ -34,6 +31,7 @@ type config struct { } func init() { + sql.DriverName = "sqlite" db.Register("sqlite3", func(node yaml.Node) db.Database { conf := new(config) _ = node.Decode(conf) diff --git a/go.mod b/go.mod index a0b7fc3..4f012a6 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/Mrs4s/go-cqhttp go 1.19 require ( - github.com/FloatTech/sqlite v1.5.6 + github.com/FloatTech/sqlite v1.5.7 github.com/Microsoft/go-winio v0.6.0 github.com/Mrs4s/MiraiGo v0.0.0-20221201090748-23f637d2954e github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e diff --git a/go.sum b/go.sum index 5a24790..564292c 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/FloatTech/sqlite v1.5.6 h1:Ws4uiN5AjjGV+ikM/cL8eOHHeYvX390srv8SaqPQ5Ok= -github.com/FloatTech/sqlite v1.5.6/go.mod h1:ItKoTpmEE2cYQ/hGrC02W+BBYE/tlUjlVGSTiM6ewFM= +github.com/FloatTech/sqlite v1.5.7 h1:Bvo4LSojcZ6dVtbHrkqvt6z4v8e+sj0G5PSUIvdawsk= +github.com/FloatTech/sqlite v1.5.7/go.mod h1:zFbHzRfB+CJ+VidfjuVbrcin3DAz283F7hF1hIeHzpY= github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b h1:tvciXWq2nuvTbFeJGLDNIdRX3BI546D3O7k7vrVueZw= github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b/go.mod h1:fHZFWGquNXuHttu9dUYoKuNbm3dzLETnIOnm1muSfDs= github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= From 894c047330127a5a47620da7a65683a900a9ab8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BE=BD=E5=85=88=E7=94=9F?= <8655163+VergilGao@users.noreply.github.com> Date: Mon, 5 Dec 2022 21:28:52 +0800 Subject: [PATCH 61/95] docker: use su-exec to run cqhttp as a non-root user (#1753) --- Dockerfile | 30 +++++++++++++++++++++++++----- docker-entrypoint.sh | 20 ++++++++++++++++++++ 2 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 docker-entrypoint.sh diff --git a/Dockerfile b/Dockerfile index 27e5cfb..ba2c975 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ FROM golang:1.19-alpine AS builder RUN go env -w GO111MODULE=auto \ && go env -w CGO_ENABLED=0 \ - && go env -w GOPROXY=https://goproxy.cn,direct + && go env -w GOPROXY=https://goproxy.cn,direct WORKDIR /build @@ -14,11 +14,31 @@ RUN set -ex \ FROM alpine:latest -RUN apk add --no-cache ffmpeg +COPY docker-entrypoint.sh /docker-entrypoint.sh -COPY --from=builder /build/cqhttp /usr/bin/cqhttp -RUN chmod +x /usr/bin/cqhttp +RUN chmod +x /docker-entrypoint.sh && \ + apk add --no-cache --update \ + ffmpeg \ + coreutils \ + shadow \ + su-exec && \ + rm -rf /var/cache/apk/* && \ + mkdir -p /app && \ + mkdir -p /data && \ + mkdir -p /config && \ + useradd -d /config -s /bin/sh abc && \ + chown -R abc /config && \ + chown -R abc /data + +ENV TZ="Asia/Shanghai" +ENV UID=99 +ENV GID=100 +ENV UMASK=002 + +COPY --from=builder /build/cqhttp /app/ WORKDIR /data -ENTRYPOINT [ "/usr/bin/cqhttp" ] +VOLUME [ "/data" ] + +ENTRYPOINT [ "/docker-entrypoint.sh" ] diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100644 index 0000000..3419c70 --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +USER=abc + +echo "---Setup Timezone to ${TZ}---" +echo "${TZ}" > /etc/timezone +echo "---Checking if UID: ${UID} matches user---" +usermod -o -u ${UID} ${USER} +echo "---Checking if GID: ${GID} matches user---" +groupmod -o -g ${GID} ${USER} > /dev/null 2>&1 ||: +usermod -g ${GID} ${USER} +echo "---Setting umask to ${UMASK}---" +umask ${UMASK} + +echo "---Taking ownership of data...---" +chown -R ${UID}:${GID} /app /data +chmod +x /app/cqhttp + +echo "Starting..." +su-exec ${USER} /app/cqhttp From d5936a40641f925c0ef39294c4b9d70fa9f09e09 Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Wed, 7 Dec 2022 03:07:20 +0800 Subject: [PATCH 62/95] update dep --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4f012a6..7ffb98b 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.19 require ( github.com/FloatTech/sqlite v1.5.7 github.com/Microsoft/go-winio v0.6.0 - github.com/Mrs4s/MiraiGo v0.0.0-20221201090748-23f637d2954e + github.com/Mrs4s/MiraiGo v0.0.0-20221202060717-4658474c60dd github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc github.com/fumiama/go-base16384 v1.6.1 diff --git a/go.sum b/go.sum index 564292c..d0fe8fc 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b h1:tvciXWq2nuvTbFeJG github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b/go.mod h1:fHZFWGquNXuHttu9dUYoKuNbm3dzLETnIOnm1muSfDs= github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= -github.com/Mrs4s/MiraiGo v0.0.0-20221201090748-23f637d2954e h1:PvTvu1c9R8XCDGysBYGF+TSO+UfX347NJkNblifC4C8= -github.com/Mrs4s/MiraiGo v0.0.0-20221201090748-23f637d2954e/go.mod h1:lecSP26qedhinCceWn1x02dLDxGotH5nTFlpIMilmVM= +github.com/Mrs4s/MiraiGo v0.0.0-20221202060717-4658474c60dd h1:rzAbPc++5CJ1VZDjq/eORXOWMMGsDN3DMAPMXfI7Fvs= +github.com/Mrs4s/MiraiGo v0.0.0-20221202060717-4658474c60dd/go.mod h1:lecSP26qedhinCceWn1x02dLDxGotH5nTFlpIMilmVM= github.com/RomiChan/protobuf v0.0.0-20220624030127-3310cba9dbc0 h1:GEwcB4dL9vc4veW1fLNt0Fby3wspVflAn5v9/HbUwDM= github.com/RomiChan/protobuf v0.0.0-20220624030127-3310cba9dbc0/go.mod h1:2Ie+hdBFQpQFDHfeklgxoFmQRCE7O+KwFpISeXq7OwA= github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e h1:wR3MXQ3VbUlPKOOUwLOYgh/QaJThBTYtsl673O3lqSA= From 231544d51e82783bea39cefede940ceaf1a798db Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Wed, 7 Dec 2022 03:23:15 +0800 Subject: [PATCH 63/95] remove: slider captcha anto-select --- cmd/gocq/login.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/gocq/login.go b/cmd/gocq/login.go index 3fc3813..84205ed 100644 --- a/cmd/gocq/login.go +++ b/cmd/gocq/login.go @@ -148,8 +148,8 @@ func loginResponseProcessor(res *client.LoginResponse) error { log.Warnf("登录需要滑条验证码, 请选择验证方式: ") log.Warnf("1. 使用浏览器抓取滑条并登录") log.Warnf("2. 使用手机QQ扫码验证 (需要手Q和gocq在同一网络下).") - log.Warn("请输入(1 - 2) (将在10秒后自动选择1):") - text = readLineTimeout(time.Second*10, "1") + log.Warn("请输入(1 - 2):") + text = readLine() if strings.Contains(text, "1") { ticket := getTicket(res.VerifyUrl) if ticket == "" { From 0e08ceccdda970d10dfd87cb78a8807a359f459c Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Wed, 7 Dec 2022 03:27:19 +0800 Subject: [PATCH 64/95] api: get_version_info remove `protocol` field & add `protocol_name` field --- coolq/api.go | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/coolq/api.go b/coolq/api.go index d7275ce..9941fe1 100644 --- a/coolq/api.go +++ b/coolq/api.go @@ -1990,22 +1990,7 @@ func (bot *CQBot) CQGetVersionInfo() global.MSG { "runtime_version": runtime.Version(), "runtime_os": runtime.GOOS, "version": base.Version, - "protocol": func() int { - switch client.SystemDeviceInfo.Protocol { - case client.Unset, client.IPad: - return 0 - case client.AndroidPhone: - return 1 - case client.AndroidWatch: - return 2 - case client.MacOS: - return 3 - case client.QiDian: - return 4 - default: - return -1 - } - }(), + "protocol_name": client.SystemDeviceInfo.Protocol, }) } From 8343db5ae3b311aea1f0c26afff203d9edc20284 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BB=91=E8=B4=A8?= Date: Tue, 13 Dec 2022 22:17:32 +0800 Subject: [PATCH 65/95] =?UTF-8?q?=E5=B0=86=E5=8F=8D=E5=90=91HTTP=20POST?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E4=B8=AD=E8=AF=B7=E6=B1=82=E7=9A=84Method?= =?UTF-8?q?=E7=94=B1GET=E4=BF=AE=E6=94=B9=E4=B8=BAPOST=20(#1794)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/http.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/http.go b/server/http.go index a78102e..6bebc18 100644 --- a/server/http.go +++ b/server/http.go @@ -356,7 +356,7 @@ func (c *HTTPClient) onBotPushEvent(e *coolq.Event) { for i := uint64(0); i <= c.MaxRetries; i++ { // see https://stackoverflow.com/questions/31337891/net-http-http-contentlength-222-with-body-length-0 // we should create a new request for every single post trial - req, err = http.NewRequest(http.MethodGet, c.addr, bytes.NewReader(e.JSONBytes())) + req, err = http.NewRequest(http.MethodPost, c.addr, bytes.NewReader(e.JSONBytes())) if err != nil { log.Warnf("上报 Event 数据到 %v 时创建请求失败: %v", c.addr, err) return From b05a64fc1b873756dc7da40e35f728aed5e0df45 Mon Sep 17 00:00:00 2001 From: xiangxiangxiong9 <1296976552@qq.com> Date: Tue, 20 Dec 2022 20:37:08 +0800 Subject: [PATCH 66/95] =?UTF-8?q?=E9=82=80=E8=AF=B7=E5=85=A5=E7=BE=A4?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=82=80=E8=AF=B7=E4=BA=BAid=20[invitor=5Fid?= =?UTF-8?q?]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- coolq/event.go | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/coolq/event.go b/coolq/event.go index 02c4da6..51492ef 100644 --- a/coolq/event.go +++ b/coolq/event.go @@ -543,10 +543,11 @@ func (bot *CQBot) groupInvitedEvent(c *client.QQClient, e *client.GroupInvitedRe log.Infof("收到来自群 %v(%v) 内用户 %v(%v) 的加群邀请.", e.GroupName, e.GroupCode, e.InvitorNick, e.InvitorUin) flag := strconv.FormatInt(e.RequestId, 10) bot.dispatchEvent("request/group/invite", global.MSG{ - "group_id": e.GroupCode, - "user_id": e.InvitorUin, - "comment": "", - "flag": flag, + "group_id": e.GroupCode, + "user_id": e.InvitorUin, + "invitor_id": 0, + "comment": "", + "flag": flag, }) } @@ -554,10 +555,11 @@ func (bot *CQBot) groupJoinReqEvent(c *client.QQClient, e *client.UserJoinGroupR log.Infof("群 %v(%v) 收到来自用户 %v(%v) 的加群请求.", e.GroupName, e.GroupCode, e.RequesterNick, e.RequesterUin) flag := strconv.FormatInt(e.RequestId, 10) bot.dispatchEvent("request/group/add", global.MSG{ - "group_id": e.GroupCode, - "user_id": e.RequesterUin, - "comment": e.Message, - "flag": flag, + "group_id": e.GroupCode, + "user_id": e.RequesterUin, + "invitor_id": e.ActionUin, + "comment": e.Message, + "flag": flag, }) } From 02aadaf63ce130e81e0b89f3caa738245bba3266 Mon Sep 17 00:00:00 2001 From: xiangxiangxiong9 <1296976552@qq.com> Date: Tue, 20 Dec 2022 21:03:31 +0800 Subject: [PATCH 67/95] make lint happy --- global/quote.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/global/quote.go b/global/quote.go index bad54b9..6e61218 100644 --- a/global/quote.go +++ b/global/quote.go @@ -18,11 +18,11 @@ func Quote(s string) string { return quoteWith(s, '"', false, false) } -func quoteWith(s string, quote byte, ASCIIonly, graphicOnly bool) string { - return string(appendQuotedWith(make([]byte, 0, 3*len(s)/2), s, quote, ASCIIonly, graphicOnly)) +func quoteWith(s string, quote byte, asciiOnly, graphicOnly bool) string { + return string(appendQuotedWith(make([]byte, 0, 3*len(s)/2), s, quote, asciiOnly, graphicOnly)) } -func appendQuotedWith(buf []byte, s string, quote byte, ASCIIonly, graphicOnly bool) []byte { +func appendQuotedWith(buf []byte, s string, quote byte, asciiOnly, graphicOnly bool) []byte { // Often called with big strings, so preallocate. If there's quoting, // this is conservative but still helps a lot. if cap(buf)-len(buf) < len(s) { @@ -43,19 +43,19 @@ func appendQuotedWith(buf []byte, s string, quote byte, ASCIIonly, graphicOnly b buf = append(buf, lowerhex[s[0]&0xF]) continue } - buf = appendEscapedRune(buf, r, quote, ASCIIonly, graphicOnly) + buf = appendEscapedRune(buf, r, quote, asciiOnly, graphicOnly) } buf = append(buf, quote) return buf } -func appendEscapedRune(buf []byte, r rune, quote byte, ASCIIonly, graphicOnly bool) []byte { +func appendEscapedRune(buf []byte, r rune, quote byte, asciiOnly, graphicOnly bool) []byte { var runeTmp [utf8.UTFMax]byte if r == rune(quote) || r == '\\' { // always backslashed buf = append(buf, '\\') buf = append(buf, byte(r)) return buf } - if ASCIIonly { + if asciiOnly { if r < utf8.RuneSelf && strconv.IsPrint(r) { buf = append(buf, byte(r)) return buf From c744025cc844a818c76303f38e0ebd868e6fa1f4 Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Sat, 24 Dec 2022 15:01:19 +0800 Subject: [PATCH 68/95] dep: downgrade package go-silk Fixes #1818 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 7ffb98b..b078f21 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( github.com/stretchr/testify v1.8.1 github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 github.com/tidwall/gjson v1.14.4 - github.com/wdvxdr1123/go-silk v0.0.0-20220304095002-f67345df09ea + github.com/wdvxdr1123/go-silk v0.0.0-20210316130616-d47b553def60 go.mongodb.org/mongo-driver v1.11.0 golang.org/x/crypto v0.3.0 golang.org/x/sys v0.2.0 diff --git a/go.sum b/go.sum index d0fe8fc..2fe15b9 100644 --- a/go.sum +++ b/go.sum @@ -110,8 +110,8 @@ github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JT github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/wdvxdr1123/go-silk v0.0.0-20220304095002-f67345df09ea h1:sl1pYm1kHtIndckTY8YDt+QFt77vI0JnKHP0U8rZtKc= -github.com/wdvxdr1123/go-silk v0.0.0-20220304095002-f67345df09ea/go.mod h1:ecFKZPX81BaB70I6ruUgEwYcDOtuNgJGnjdK+MIl5ko= +github.com/wdvxdr1123/go-silk v0.0.0-20210316130616-d47b553def60 h1:lRKf10iIOW0VsH5WDF621ihzR+R2wEBZVtNRHuLLCb4= +github.com/wdvxdr1123/go-silk v0.0.0-20210316130616-d47b553def60/go.mod h1:ecFKZPX81BaB70I6ruUgEwYcDOtuNgJGnjdK+MIl5ko= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E= From 49a8b9bd644957b7e348d6cb41294d834116dea7 Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Sun, 1 Jan 2023 21:25:38 +0800 Subject: [PATCH 69/95] clean code --- cmd/gocq/main.go | 1 - 1 file changed, 1 deletion(-) diff --git a/cmd/gocq/main.go b/cmd/gocq/main.go index 954573d..adf5a99 100644 --- a/cmd/gocq/main.go +++ b/cmd/gocq/main.go @@ -135,7 +135,6 @@ func Main() { if base.Debug { log.SetLevel(log.DebugLevel) log.Warnf("已开启Debug模式.") - // log.Debugf("开发交流群: 192548878") } if !global.PathExists("device.json") { log.Warn("虚拟设备信息不存在, 将自动生成随机设备.") From 37a89010613697a3f92d29c44c5115a7c8f7db50 Mon Sep 17 00:00:00 2001 From: linepro6 <53991395+linepro6@users.noreply.github.com> Date: Tue, 3 Jan 2023 21:00:42 +0800 Subject: [PATCH 70/95] fix: FindFile http return nil without cache (#1832) --- global/fs.go | 1 + 1 file changed, 1 insertion(+) diff --git a/global/fs.go b/global/fs.go index 046ac2c..aebcf51 100644 --- a/global/fs.go +++ b/global/fs.go @@ -88,6 +88,7 @@ func FindFile(file, cache, p string) (data []byte, err error) { if err != nil { return nil, err } + return os.ReadFile(cacheFile) case strings.HasPrefix(file, "base64"): data, err = base64.StdEncoding.DecodeString(strings.TrimPrefix(file, "base64://")) if err != nil { From 40619049459e82a859d156b287bb0946b9a597ce Mon Sep 17 00:00:00 2001 From: Shigma Date: Tue, 3 Jan 2023 21:01:31 +0800 Subject: [PATCH 71/95] chore: bump isatty (#1830) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d91966e..8b211b3 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,7 @@ require ( golang.org/x/sys v0.2.0 golang.org/x/term v0.2.0 golang.org/x/time v0.2.0 - gopkg.ilharper.com/x/isatty v1.1.0 + gopkg.ilharper.com/x/isatty v1.1.1 gopkg.in/yaml.v3 v3.0.1 ) diff --git a/go.sum b/go.sum index 024f084..ae1bf8c 100644 --- a/go.sum +++ b/go.sum @@ -182,8 +182,8 @@ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -gopkg.ilharper.com/x/isatty v1.1.0 h1:slOK6hP9/y9mJWyCInMwnT432NExfWyYV2SsebdYOCY= -gopkg.ilharper.com/x/isatty v1.1.0/go.mod h1:ofpv77Td5qQO6R1dmDd3oNt8TZdRo+l5gYAMxopRyS0= +gopkg.ilharper.com/x/isatty v1.1.1 h1:RAg32Pxq/nIK4AVtdm9RBqxsxZZX1uRKRSS21E5SHMk= +gopkg.ilharper.com/x/isatty v1.1.1/go.mod h1:ofpv77Td5qQO6R1dmDd3oNt8TZdRo+l5gYAMxopRyS0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= From 2a4ea28f4d25c4cbaa3e7f61276bfcc4dc6ae956 Mon Sep 17 00:00:00 2001 From: Maiko Tan Date: Thu, 5 Jan 2023 21:58:37 +0800 Subject: [PATCH 72/95] feat: add webp image convert function --- coolq/bot.go | 16 +++++++++++++++- global/codec.go | 5 +++++ internal/base/flag.go | 2 ++ modules/config/config.go | 1 + modules/config/default_config.yml | 2 ++ 5 files changed, 25 insertions(+), 1 deletion(-) diff --git a/coolq/bot.go b/coolq/bot.go index de84131..3b01e39 100644 --- a/coolq/bot.go +++ b/coolq/bot.go @@ -153,9 +153,23 @@ func (bot *CQBot) uploadLocalImage(target message.Source, img *LocalImageElement defer func() { _ = f.Close() }() img.Stream = f } - if mt, ok := mime.CheckImage(img.Stream); !ok { + mt, ok := mime.CheckImage(img.Stream) + if !ok { return nil, errors.New("image type error: " + mt) } + if mt == "image/webp" && base.ConvertWebpImage != false { + newname := img.File + ".png" + err := global.ConvertImagePng(img.File, newname) + if err != nil { + return nil, errors.Wrap(err, "convert webp image error") + } + f, err := os.Open(newname) + if err != nil { + return nil, errors.Wrap(err, "open image error") + } + defer func() { _ = f.Close() }() + img.Stream = f + } i, err := bot.Client.UploadImage(target, img.Stream, 4) if err != nil { return nil, err diff --git a/global/codec.go b/global/codec.go index 6a5f088..4ef6bbc 100644 --- a/global/codec.go +++ b/global/codec.go @@ -46,3 +46,8 @@ func ExtractCover(src string, target string) error { cmd := exec.Command("ffmpeg", "-i", src, "-y", "-ss", "0", "-frames:v", "1", target) return errors.Wrap(cmd.Run(), "extract video cover failed") } + +func ConvertImagePng(src string, target string) error { + cmd := exec.Command("ffmpeg", "-i", src, "-y", "-f", "png", target) + return errors.Wrap(cmd.Run(), "convert image to png failed") +} diff --git a/internal/base/flag.go b/internal/base/flag.go index 38790ee..b9331f4 100644 --- a/internal/base/flag.go +++ b/internal/base/flag.go @@ -30,6 +30,7 @@ var ( SplitURL bool // 是否分割URL ForceFragmented bool // 是否启用强制分片 SkipMimeScan bool // 是否跳过Mime扫描 + ConvertWebpImage bool // 是否转换Webp图片 ReportSelfMessage bool // 是否上报自身消息 UseSSOAddress bool // 是否使用服务器下发的新地址进行重连 LogForceNew bool // 是否在每次启动时强制创建全新的文件储存日志 @@ -79,6 +80,7 @@ func Init() { ExtraReplyData = conf.Message.ExtraReplyData ForceFragmented = conf.Message.ForceFragment SkipMimeScan = conf.Message.SkipMimeScan + ConvertWebpImage = conf.Message.ConvertWebpImage ReportSelfMessage = conf.Message.ReportSelfMessage UseSSOAddress = conf.Account.UseSSOAddress AllowTempSession = conf.Account.AllowTempSession diff --git a/modules/config/config.go b/modules/config/config.go index 23329d7..24562e9 100644 --- a/modules/config/config.go +++ b/modules/config/config.go @@ -55,6 +55,7 @@ type Config struct { RemoveReplyAt bool `yaml:"remove-reply-at"` ExtraReplyData bool `yaml:"extra-reply-data"` SkipMimeScan bool `yaml:"skip-mime-scan"` + ConvertWebpImage bool `yaml:"convert-webp-image"` } `yaml:"message"` Output struct { diff --git a/modules/config/default_config.yml b/modules/config/default_config.yml index 60d5db0..9e4acd8 100644 --- a/modules/config/default_config.yml +++ b/modules/config/default_config.yml @@ -43,6 +43,8 @@ message: extra-reply-data: false # 跳过 Mime 扫描, 忽略错误数据 skip-mime-scan: false + # 是否自动转换 WebP 图片 + convert-webp-image: false output: # 日志等级 trace,debug,info,warn,error From 524debbfdae7e5abf86e2f3619511b0d0718d12c Mon Sep 17 00:00:00 2001 From: Maiko Tan Date: Fri, 6 Jan 2023 12:57:19 +0800 Subject: [PATCH 73/95] fix: simplify bool checking --- coolq/bot.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coolq/bot.go b/coolq/bot.go index 3b01e39..0a2fffa 100644 --- a/coolq/bot.go +++ b/coolq/bot.go @@ -157,7 +157,7 @@ func (bot *CQBot) uploadLocalImage(target message.Source, img *LocalImageElement if !ok { return nil, errors.New("image type error: " + mt) } - if mt == "image/webp" && base.ConvertWebpImage != false { + if mt == "image/webp" && base.ConvertWebpImage { newname := img.File + ".png" err := global.ConvertImagePng(img.File, newname) if err != nil { From 008e139c279f4d84196da4374b94e045c07d1a95 Mon Sep 17 00:00:00 2001 From: Maiko Tan Date: Fri, 6 Jan 2023 13:06:44 +0800 Subject: [PATCH 74/95] fix: ffmpeg runtime error --- coolq/bot.go | 2 +- global/codec.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/coolq/bot.go b/coolq/bot.go index 0a2fffa..6818e1c 100644 --- a/coolq/bot.go +++ b/coolq/bot.go @@ -159,7 +159,7 @@ func (bot *CQBot) uploadLocalImage(target message.Source, img *LocalImageElement } if mt == "image/webp" && base.ConvertWebpImage { newname := img.File + ".png" - err := global.ConvertImagePng(img.File, newname) + err := global.ConvertImage(img.File, newname) if err != nil { return nil, errors.Wrap(err, "convert webp image error") } diff --git a/global/codec.go b/global/codec.go index 4ef6bbc..ebdb241 100644 --- a/global/codec.go +++ b/global/codec.go @@ -47,7 +47,7 @@ func ExtractCover(src string, target string) error { return errors.Wrap(cmd.Run(), "extract video cover failed") } -func ConvertImagePng(src string, target string) error { - cmd := exec.Command("ffmpeg", "-i", src, "-y", "-f", "png", target) +func ConvertImage(src string, target string) error { + cmd := exec.Command("ffmpeg", "-i", src, "-y", target) return errors.Wrap(cmd.Run(), "convert image to png failed") } From 311a254b9c6d6a9f6b69b23e0f793f33b7a1c939 Mon Sep 17 00:00:00 2001 From: Maiko Tan Date: Fri, 6 Jan 2023 14:44:00 +0800 Subject: [PATCH 75/95] refactor: use in-memory convertion --- coolq/bot.go | 18 +++++++----------- global/codec.go | 5 ----- go.mod | 3 ++- go.sum | 16 ++++++++++++++++ 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/coolq/bot.go b/coolq/bot.go index 6818e1c..f6b17f6 100644 --- a/coolq/bot.go +++ b/coolq/bot.go @@ -5,6 +5,7 @@ import ( "encoding/hex" "encoding/json" "fmt" + "image/png" "os" "runtime/debug" "strings" @@ -24,6 +25,8 @@ import ( "github.com/Mrs4s/go-cqhttp/global" "github.com/Mrs4s/go-cqhttp/internal/base" "github.com/Mrs4s/go-cqhttp/internal/mime" + + "golang.org/x/image/webp" ) // CQBot CQBot结构体,存储Bot实例相关配置 @@ -158,17 +161,10 @@ func (bot *CQBot) uploadLocalImage(target message.Source, img *LocalImageElement return nil, errors.New("image type error: " + mt) } if mt == "image/webp" && base.ConvertWebpImage { - newname := img.File + ".png" - err := global.ConvertImage(img.File, newname) - if err != nil { - return nil, errors.Wrap(err, "convert webp image error") - } - f, err := os.Open(newname) - if err != nil { - return nil, errors.Wrap(err, "open image error") - } - defer func() { _ = f.Close() }() - img.Stream = f + img0, _ := webp.Decode(img.Stream) + stream := bytes.NewBuffer(nil) + png.Encode(stream, img0) + img.Stream = bytes.NewReader(stream.Bytes()) } i, err := bot.Client.UploadImage(target, img.Stream, 4) if err != nil { diff --git a/global/codec.go b/global/codec.go index ebdb241..6a5f088 100644 --- a/global/codec.go +++ b/global/codec.go @@ -46,8 +46,3 @@ func ExtractCover(src string, target string) error { cmd := exec.Command("ffmpeg", "-i", src, "-y", "-ss", "0", "-frames:v", "1", target) return errors.Wrap(cmd.Run(), "extract video cover failed") } - -func ConvertImage(src string, target string) error { - cmd := exec.Command("ffmpeg", "-i", src, "-y", target) - return errors.Wrap(cmd.Run(), "convert image to png failed") -} diff --git a/go.mod b/go.mod index 8b211b3..833f73e 100644 --- a/go.mod +++ b/go.mod @@ -50,9 +50,10 @@ require ( github.com/xdg-go/scram v1.1.1 // indirect github.com/xdg-go/stringprep v1.0.3 // indirect github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect + golang.org/x/image v0.3.0 // indirect golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde // indirect - golang.org/x/text v0.4.0 // indirect + golang.org/x/text v0.6.0 // indirect golang.org/x/tools v0.1.12 // indirect lukechampine.com/uint128 v1.2.0 // indirect modernc.org/cc/v3 v3.40.0 // indirect diff --git a/go.sum b/go.sum index ae1bf8c..016fc5b 100644 --- a/go.sum +++ b/go.sum @@ -120,23 +120,32 @@ github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCO github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.11.0 h1:FZKhBSTydeuffHj9CBjXlR8vQLee1cQyTWYPA6/tqiE= go.mongodb.org/mongo-driver v1.11.0/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.3.0 h1:a06MkbcxBrEFc0w0QIZWXrH/9cCX6KJyWbBOIwAn+7A= golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= +golang.org/x/image v0.3.0 h1:HTDXbdK9bjfSWkPzDJIw89W8CAtfFGduujWs33NLLsg= +golang.org/x/image v0.3.0/go.mod h1:fXd9211C/0VTlYuAcOhW8dY/RtEJqODXOWBDpmYBf+A= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.2.0 h1:sZfSu1wtKLGlWI4ZZayP0ck9Y73K1ynO6gqzTdBVdPU= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde h1:ejfdSekXMDxDLbRrJMwUk6KnSLZ2McaUCVcIKM+N6jc= golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -154,11 +163,14 @@ golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220111092808-5a964db01320/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0 h1:z85xZCsEl7bi/KwbNADeBYoOP0++7W1ipu+aGnpwzRM= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -168,11 +180,15 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k= +golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.2.0 h1:52I/1L54xyEQAYdtcSuxtiT84KGYTBGXwayxmIpNJhE= golang.org/x/time v0.2.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From a5b51051e6cce0bab640a2bc113e3a405218df13 Mon Sep 17 00:00:00 2001 From: Maiko Tan Date: Fri, 6 Jan 2023 19:25:54 +0800 Subject: [PATCH 76/95] fix: handle decode / encode error --- coolq/bot.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/coolq/bot.go b/coolq/bot.go index f6b17f6..388c781 100644 --- a/coolq/bot.go +++ b/coolq/bot.go @@ -161,9 +161,15 @@ func (bot *CQBot) uploadLocalImage(target message.Source, img *LocalImageElement return nil, errors.New("image type error: " + mt) } if mt == "image/webp" && base.ConvertWebpImage { - img0, _ := webp.Decode(img.Stream) + img0, err := webp.Decode(img.Stream) + if err != nil { + return nil, errors.Wrap(err, "decode webp error") + } stream := bytes.NewBuffer(nil) - png.Encode(stream, img0) + err = png.Encode(stream, img0) + if err != nil { + return nil, errors.Wrap(err, "encode png error") + } img.Stream = bytes.NewReader(stream.Bytes()) } i, err := bot.Client.UploadImage(target, img.Stream, 4) From 960f7ab79b14ed1618633c9a82e7d666f2721068 Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Wed, 11 Jan 2023 06:05:38 +0800 Subject: [PATCH 77/95] fix: when the reconnect-interval of ws-reverse is set to 0, push event will panic if has connection error --- server/websocket.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/websocket.go b/server/websocket.go index f600017..668d5ec 100644 --- a/server/websocket.go +++ b/server/websocket.go @@ -191,9 +191,13 @@ func runWSClient(b *coolq.CQBot, node yaml.Node) { filter: conf.Filter, } filter.Add(c.filter) + if conf.ReconnectInterval != 0 { c.reconnectInterval = time.Duration(conf.ReconnectInterval) * time.Millisecond + } else { + c.reconnectInterval = time.Second * 5 } + if conf.RateLimit.Enabled { c.limiter = rateLimit(conf.RateLimit.Frequency, conf.RateLimit.Bucket) } From 7d5f1d68434f14421e6f1619bdfff408a0da77aa Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Wed, 11 Jan 2023 06:08:33 +0800 Subject: [PATCH 78/95] fix #1815 --- coolq/event.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/coolq/event.go b/coolq/event.go index 51492ef..4bd8372 100644 --- a/coolq/event.go +++ b/coolq/event.go @@ -144,7 +144,10 @@ func (bot *CQBot) tempMessageEvent(c *client.QQClient, e *client.TempMessageEven PrimaryID: e.Session.Sender, } cqm := toStringMessage(m.Elements, source) - bot.tempSessionCache.Store(m.Sender.Uin, e.Session) + if base.AllowTempSession { + bot.tempSessionCache.Store(m.Sender.Uin, e.Session) + } + id := m.Id // todo(Mrs4s) // if bot.db != nil { // nolint From 43004e249636723bcec71f56fdaa0aac6f19f70a Mon Sep 17 00:00:00 2001 From: SlimeNull Date: Fri, 13 Jan 2023 18:32:55 +0800 Subject: [PATCH 79/95] =?UTF-8?q?=E5=85=A8=E9=83=A8=E6=B7=BB=E5=8A=A0=20"?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E5=B7=B2=E7=A7=BB=E5=8A=A8"=20=E6=8F=90?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/EventFilter.md | 2 ++ docs/QA.md | 2 ++ docs/config.md | 2 ++ docs/cqhttp.md | 4 +++- docs/guild.md | 2 ++ docs/quick_start.md | 2 ++ 6 files changed, 13 insertions(+), 1 deletion(-) diff --git a/docs/EventFilter.md b/docs/EventFilter.md index 6911f59..9376e85 100644 --- a/docs/EventFilter.md +++ b/docs/EventFilter.md @@ -5,6 +5,8 @@ 注意: 与客户端建立连接的握手事件**不会**经过事件过滤器 +> 注意, 最新文档已经移动到 [go-cqhttp-docs](https://github.com/ishkong/go-cqhttp-docs), 当前文档只做兼容性保留, 所以内容可能有不足. + ## 示例 这节首先给出一些示例,演示过滤器的基本用法,下一节将给出具体语法说明。 diff --git a/docs/QA.md b/docs/QA.md index 28f455c..dc7e4c8 100644 --- a/docs/QA.md +++ b/docs/QA.md @@ -1,5 +1,7 @@ # 常见问题 +> 注意, 最新文档已经移动到 [go-cqhttp-docs](https://github.com/ishkong/go-cqhttp-docs), 当前文档只做兼容性保留, 所以内容可能有不足. + ### Q: 为什么挂一段时间后就会出现 `消息发送失败,账号可能被风控`? ### A: 如果你刚开始使用 go-cqhttp 建议挂机3-7天,即可解除风控 diff --git a/docs/config.md b/docs/config.md index 38f1287..957b191 100644 --- a/docs/config.md +++ b/docs/config.md @@ -1,5 +1,7 @@ # 配置 +> 注意, 最新文档已经移动到 [go-cqhttp-docs](https://github.com/ishkong/go-cqhttp-docs), 当前文档只做兼容性保留, 所以内容可能有不足. + go-cqhttp 包含 `config.yml` 和 `device.json` 两个配置文件, 其中 `config.yml` 为运行配置 `device.json` 为虚拟设备信息. ## 配置信息 diff --git a/docs/cqhttp.md b/docs/cqhttp.md index 2f6dbb3..901c289 100644 --- a/docs/cqhttp.md +++ b/docs/cqhttp.md @@ -1,6 +1,8 @@ # 拓展API -由于部分 api 原版 CQHTTP 并未实现,go-cqhttp 修改并增加了一些拓展 api . +由于部分 api 原版 CQHTTP 并未实现,go-cqhttp 修改并增加了一些拓展 api + +> 注意, 最新文档已经移动到 [go-cqhttp-docs](https://github.com/ishkong/go-cqhttp-docs), 当前文档只做兼容性保留, 所以内容可能有不足..
目录 diff --git a/docs/guild.md b/docs/guild.md index 9a20285..ec570cf 100644 --- a/docs/guild.md +++ b/docs/guild.md @@ -5,6 +5,8 @@ QQ频道相关功能的事件以及API +> 注意, 最新文档已经移动到 [go-cqhttp-docs](https://github.com/ishkong/go-cqhttp-docs), 当前文档只做兼容性保留, 所以内容可能有不足. + ## 命名说明 API以及字段相关命名均为参考QQ官方命名或相似产品命名规则, 由于QQ频道的账号系统独立于QQ本体, 所以各个 `ID` 并不能和QQ通用.也无法通过 `tiny_id` 获取到 `QQ号` diff --git a/docs/quick_start.md b/docs/quick_start.md index af91dcb..28c8c5c 100644 --- a/docs/quick_start.md +++ b/docs/quick_start.md @@ -2,6 +2,8 @@ 欢迎来到 go-cqhttp 文档 目前还在咕 +> 注意, 最新文档已经移动到 [go-cqhttp-docs](https://github.com/ishkong/go-cqhttp-docs), 当前文档只做兼容性保留, 所以内容可能有不足. + # 基础教程 ## 下载 从[release](https://github.com/Mrs4s/go-cqhttp/releases)界面下载最新版本的go-cqhttp From e050fd68852994c4fb00d1da51f965b3852bb846 Mon Sep 17 00:00:00 2001 From: Shigma Date: Tue, 17 Jan 2023 01:23:32 +0800 Subject: [PATCH 80/95] feat: change polling log level to debug --- cmd/gocq/login.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/gocq/login.go b/cmd/gocq/login.go index d0d9a33..27fe61b 100644 --- a/cmd/gocq/login.go +++ b/cmd/gocq/login.go @@ -254,7 +254,7 @@ func getTicket(u string) (str string) { func fetchCaptcha(id string) string { g, err := download.Request{URL: "https://captcha.go-cqhttp.org/captcha/ticket?id=" + id}.JSON() if err != nil { - log.Warnf("获取 Ticket 时出现错误: %v", err) + log.Debugf("获取 Ticket 时出现错误: %v", err) return "" } if g.Get("ticket").Exists() { From 4d064e145fdfa3b2df4a8aad394e782776e9a564 Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Thu, 19 Jan 2023 23:26:54 +0800 Subject: [PATCH 81/95] fix #1864 --- internal/download/download.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/download/download.go b/internal/download/download.go index 1387168..84fe64c 100644 --- a/internal/download/download.go +++ b/internal/download/download.go @@ -111,6 +111,7 @@ func writeToFile(reader io.ReadCloser, path string) error { if err != nil { return err } + defer func() { _ = file.Close() }() _, err = file.ReadFrom(reader) return err } From 84e061f321f5bc59a81f01ff6c1fa332be16117d Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Thu, 26 Jan 2023 22:59:04 +0800 Subject: [PATCH 82/95] make golangci-lint happy --- cmd/gocq/login.go | 10 ++++------ coolq/api.go | 3 +-- coolq/bot.go | 3 +-- coolq/converter.go | 3 +-- coolq/cqcode/element.go | 1 + modules/config/config.go | 2 +- 6 files changed, 9 insertions(+), 13 deletions(-) diff --git a/cmd/gocq/login.go b/cmd/gocq/login.go index d0d9a33..244965a 100644 --- a/cmd/gocq/login.go +++ b/cmd/gocq/login.go @@ -29,7 +29,7 @@ func readLine() (str string) { return } -func readLineTimeout(t time.Duration, de string) (str string) { +func readLineTimeout(t time.Duration) { r := make(chan string) go func() { select { @@ -37,12 +37,10 @@ func readLineTimeout(t time.Duration, de string) (str string) { case <-time.After(t): } }() - str = de select { - case str = <-r: + case <-r: case <-time.After(t): } - return } func readIfTTY(de string) (str string) { @@ -210,7 +208,7 @@ func loginResponseProcessor(res *client.LoginResponse) error { case client.UnsafeDeviceError: log.Warnf("账号已开启设备锁,请前往 -> %v <- 验证后重启Bot.", res.VerifyUrl) log.Infof("按 Enter 或等待 5s 后继续....") - readLineTimeout(time.Second*5, "") + readLineTimeout(time.Second * 5) os.Exit(0) case client.OtherLoginError, client.UnknownLoginError, client.TooManySMSRequestError: msg := res.ErrorMessage @@ -221,7 +219,7 @@ func loginResponseProcessor(res *client.LoginResponse) error { } log.Warnf("登录失败: %v", msg) log.Infof("按 Enter 或等待 5s 后继续....") - readLineTimeout(time.Second*5, "") + readLineTimeout(time.Second * 5) os.Exit(0) } } diff --git a/coolq/api.go b/coolq/api.go index 9941fe1..1794cc6 100644 --- a/coolq/api.go +++ b/coolq/api.go @@ -14,12 +14,11 @@ import ( "strings" "time" - "github.com/segmentio/asm/base64" - "github.com/Mrs4s/MiraiGo/binary" "github.com/Mrs4s/MiraiGo/client" "github.com/Mrs4s/MiraiGo/message" "github.com/Mrs4s/MiraiGo/utils" + "github.com/segmentio/asm/base64" log "github.com/sirupsen/logrus" "github.com/tidwall/gjson" diff --git a/coolq/bot.go b/coolq/bot.go index 388c781..8c8ade2 100644 --- a/coolq/bot.go +++ b/coolq/bot.go @@ -20,13 +20,12 @@ import ( "github.com/pkg/errors" "github.com/segmentio/asm/base64" log "github.com/sirupsen/logrus" + "golang.org/x/image/webp" "github.com/Mrs4s/go-cqhttp/db" "github.com/Mrs4s/go-cqhttp/global" "github.com/Mrs4s/go-cqhttp/internal/base" "github.com/Mrs4s/go-cqhttp/internal/mime" - - "golang.org/x/image/webp" ) // CQBot CQBot结构体,存储Bot实例相关配置 diff --git a/coolq/converter.go b/coolq/converter.go index e105357..30720e2 100644 --- a/coolq/converter.go +++ b/coolq/converter.go @@ -4,10 +4,9 @@ import ( "strconv" "strings" - "github.com/Mrs4s/MiraiGo/topic" - "github.com/Mrs4s/MiraiGo/client" "github.com/Mrs4s/MiraiGo/message" + "github.com/Mrs4s/MiraiGo/topic" log "github.com/sirupsen/logrus" "github.com/Mrs4s/go-cqhttp/global" diff --git a/coolq/cqcode/element.go b/coolq/cqcode/element.go index 2788ba2..87c057b 100644 --- a/coolq/cqcode/element.go +++ b/coolq/cqcode/element.go @@ -5,6 +5,7 @@ import ( "strings" "github.com/Mrs4s/MiraiGo/binary" + "github.com/Mrs4s/go-cqhttp/global" ) diff --git a/modules/config/config.go b/modules/config/config.go index 24562e9..22d9879 100644 --- a/modules/config/config.go +++ b/modules/config/config.go @@ -55,7 +55,7 @@ type Config struct { RemoveReplyAt bool `yaml:"remove-reply-at"` ExtraReplyData bool `yaml:"extra-reply-data"` SkipMimeScan bool `yaml:"skip-mime-scan"` - ConvertWebpImage bool `yaml:"convert-webp-image"` + ConvertWebpImage bool `yaml:"convert-webp-image"` } `yaml:"message"` Output struct { From 20c62111f57dec56a1b896fc4c26992db6406655 Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Thu, 26 Jan 2023 23:03:08 +0800 Subject: [PATCH 83/95] all: run gofmt -w -r 'interface{} -> any' --- coolq/api.go | 2 +- coolq/cqcode.go | 2 +- coolq/event.go | 2 +- db/leveldb/reader.go | 2 +- db/leveldb/writer.go | 2 +- global/log_hook.go | 2 +- global/param.go | 2 +- internal/param/param.go | 2 +- server/middlewares.go | 6 +++--- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/coolq/api.go b/coolq/api.go index 1794cc6..03225e1 100644 --- a/coolq/api.go +++ b/coolq/api.go @@ -2083,7 +2083,7 @@ func (bot *CQBot) CQReloadEventFilter(file string) global.MSG { } // OK 生成成功返回值 -func OK(data interface{}) global.MSG { +func OK(data any) global.MSG { return global.MSG{"data": data, "retcode": 0, "status": "ok"} } diff --git a/coolq/cqcode.go b/coolq/cqcode.go index e93e50c..ab73c5f 100644 --- a/coolq/cqcode.go +++ b/coolq/cqcode.go @@ -807,7 +807,7 @@ func (bot *CQBot) ConvertContentMessage(content []global.MSG, sourceType message // 返回 interface{} 存在三种类型 // // message.IMessageElement []message.IMessageElement nil -func (bot *CQBot) ToElement(t string, d map[string]string, sourceType message.SourceType) (m interface{}, err error) { +func (bot *CQBot) ToElement(t string, d map[string]string, sourceType message.SourceType) (m any, err error) { switch t { case "text": if base.SplitURL { diff --git a/coolq/event.go b/coolq/event.go index 4bd8372..e54a40e 100644 --- a/coolq/event.go +++ b/coolq/event.go @@ -21,7 +21,7 @@ import ( ) // ToFormattedMessage 将给定[]message.IMessageElement转换为通过coolq.SetMessageFormat所定义的消息上报格式 -func ToFormattedMessage(e []message.IMessageElement, source message.Source) (r interface{}) { +func ToFormattedMessage(e []message.IMessageElement, source message.Source) (r any) { if base.PostFormat == "string" { r = toStringMessage(e, source) } else if base.PostFormat == "array" { diff --git a/db/leveldb/reader.go b/db/leveldb/reader.go index e891036..fef6ebd 100644 --- a/db/leveldb/reader.go +++ b/db/leveldb/reader.go @@ -84,7 +84,7 @@ func (r *reader) arrayMsg() []global.MSG { return msgs } -func (r *reader) obj() interface{} { +func (r *reader) obj() any { switch coder := r.coder(); coder { case coderNil: return nil diff --git a/db/leveldb/writer.go b/db/leveldb/writer.go index 6067ca1..a8acba7 100644 --- a/db/leveldb/writer.go +++ b/db/leveldb/writer.go @@ -96,7 +96,7 @@ func (w *writer) arrayMsg(a []global.MSG) { } } -func (w *writer) obj(o interface{}) { +func (w *writer) obj(o any) { switch x := o.(type) { case nil: w.nil() diff --git a/global/log_hook.go b/global/log_hook.go index 44f4f1d..df3084b 100644 --- a/global/log_hook.go +++ b/global/log_hook.go @@ -108,7 +108,7 @@ func (hook *LocalHook) SetPath(path string) { } // NewLocalHook 初始化本地日志钩子实现 -func NewLocalHook(args interface{}, consoleFormatter, fileFormatter logrus.Formatter, levels ...logrus.Level) *LocalHook { +func NewLocalHook(args any, consoleFormatter, fileFormatter logrus.Formatter, levels ...logrus.Level) *LocalHook { hook := &LocalHook{ lock: new(sync.Mutex), } diff --git a/global/param.go b/global/param.go index 44225bd..0b24580 100644 --- a/global/param.go +++ b/global/param.go @@ -8,7 +8,7 @@ import ( ) // MSG 消息Map -type MSG = map[string]interface{} +type MSG = map[string]any // VersionNameCompare 检查版本名是否需要更新, 仅适用于 go-cqhttp 的版本命名规则 // diff --git a/internal/param/param.go b/internal/param/param.go index 19da7fc..8e763e1 100644 --- a/internal/param/param.go +++ b/internal/param/param.go @@ -19,7 +19,7 @@ import ( // type gjson.True or gjson.False // // type string "true","yes","1" or "false","no","0" (case insensitive) -func EnsureBool(p interface{}, defaultVal bool) bool { +func EnsureBool(p any, defaultVal bool) bool { var str string if b, ok := p.(bool); ok { return b diff --git a/server/middlewares.go b/server/middlewares.go index 7230248..f783e0f 100644 --- a/server/middlewares.go +++ b/server/middlewares.go @@ -50,7 +50,7 @@ func longPolling(bot *coolq.CQBot, maxSize int) api.Handler { return nil } var ( - ch = make(chan []interface{}) + ch = make(chan []any) timeout = time.Duration(p.Get("timeout").Int()) * time.Second ) go func() { @@ -63,7 +63,7 @@ func longPolling(bot *coolq.CQBot, maxSize int) api.Handler { if limit <= 0 || queue.Len() < limit { limit = queue.Len() } - ret := make([]interface{}, limit) + ret := make([]any, limit) elem := queue.Front() for i := 0; i < limit; i++ { ret[i] = elem.Value @@ -81,7 +81,7 @@ func longPolling(bot *coolq.CQBot, maxSize int) api.Handler { if timeout != 0 { select { case <-time.After(timeout): - return coolq.OK([]interface{}{}) + return coolq.OK([]any{}) case ret := <-ch: return coolq.OK(ret) } From 0be18fb221ba43d831f7a8b93422e994dd898311 Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Thu, 26 Jan 2023 23:58:43 +0800 Subject: [PATCH 84/95] coolq/cqcode: simplify quote string --- coolq/cqcode/all_test.go | 19 +++++ coolq/cqcode/element.go | 92 +++++++++++++++++++++++- global/quote.go | 146 --------------------------------------- 3 files changed, 108 insertions(+), 149 deletions(-) create mode 100644 coolq/cqcode/all_test.go delete mode 100644 global/quote.go diff --git a/coolq/cqcode/all_test.go b/coolq/cqcode/all_test.go new file mode 100644 index 0000000..a42e9bb --- /dev/null +++ b/coolq/cqcode/all_test.go @@ -0,0 +1,19 @@ +package cqcode + +import ( + "bytes" + "testing" +) + +func TestIssue1733(t *testing.T) { + const ( + input = "\u0005" + expected = `"\u0005"` + ) + var b bytes.Buffer + writeQuote(&b, input) + got := b.String() + if got != expected { + t.Errorf("want %v but got %v", expected, got) + } +} diff --git a/coolq/cqcode/element.go b/coolq/cqcode/element.go index 87c057b..12dc08e 100644 --- a/coolq/cqcode/element.go +++ b/coolq/cqcode/element.go @@ -3,10 +3,9 @@ package cqcode import ( "bytes" "strings" + "unicode/utf8" "github.com/Mrs4s/MiraiGo/binary" - - "github.com/Mrs4s/go-cqhttp/global" ) // Element single message @@ -61,8 +60,95 @@ func (e *Element) MarshalJSON() ([]byte, error) { buf.WriteByte('"') buf.WriteString(data.K) buf.WriteString(`":`) - buf.WriteString(global.Quote(data.V)) + writeQuote(buf, data.V) } buf.WriteString(`}}`) }), nil } + +const hex = "0123456789abcdef" + +func writeQuote(b *bytes.Buffer, s string) { + i, j := 0, 0 + + b.WriteByte('"') + for j < len(s) { + c := s[j] + + if c >= 0x20 && c <= 0x7f && c != '\\' && c != '"' { + // fast path: most of the time, printable ascii characters are used + j++ + continue + } + + switch c { + case '\\', '"', '\n', '\r', '\t': + b.WriteString(s[i:j]) + b.WriteByte('\\') + switch c { + case '\n': + c = 'n' + case '\r': + c = 'r' + case '\t': + c = 't' + } + b.WriteByte(c) + i = j + 1 + j = j + 1 + continue + + case '<', '>', '&': + b.WriteString(s[i:j]) + b.WriteString(`\u00`) + b.WriteByte(hex[c>>4]) + b.WriteByte(hex[c&0xF]) + i = j + 1 + j = j + 1 + continue + } + + // This encodes bytes < 0x20 except for \t, \n and \r. + if c < 0x20 { + b.WriteString(s[i:j]) + b.WriteString(`\u00`) + b.WriteByte(hex[c>>4]) + b.WriteByte(hex[c&0xF]) + i = j + 1 + j = j + 1 + continue + } + + r, size := utf8.DecodeRuneInString(s[j:]) + + if r == utf8.RuneError && size == 1 { + b.WriteString(s[i:j]) + b.WriteString(`\ufffd`) + i = j + size + j = j + size + continue + } + + switch r { + case '\u2028', '\u2029': + // U+2028 is LINE SEPARATOR. + // U+2029 is PARAGRAPH SEPARATOR. + // They are both technically valid characters in JSON strings, + // but don't work in JSONP, which has to be evaluated as JavaScript, + // and can lead to security holes there. It is valid JSON to + // escape them, so we do so unconditionally. + // See http://timelessrepo.com/json-isnt-a-javascript-subset for discussion. + b.WriteString(s[i:j]) + b.WriteString(`\u202`) + b.WriteByte(hex[r&0xF]) + i = j + size + j = j + size + continue + } + + j += size + } + + b.WriteString(s[i:]) + b.WriteByte('"') +} diff --git a/global/quote.go b/global/quote.go deleted file mode 100644 index 6e61218..0000000 --- a/global/quote.go +++ /dev/null @@ -1,146 +0,0 @@ -package global - -import ( - "strconv" - "unicode/utf8" -) - -const ( - lowerhex = "0123456789abcdef" - upperhex = "0123456789ABCDEF" -) - -// Quote returns a double-quoted Go string literal representing s. The -// returned string uses Go escape sequences (\t, \n, \xFF, \u0100) for -// control characters and non-printable characters as defined by -// IsPrint. -func Quote(s string) string { - return quoteWith(s, '"', false, false) -} - -func quoteWith(s string, quote byte, asciiOnly, graphicOnly bool) string { - return string(appendQuotedWith(make([]byte, 0, 3*len(s)/2), s, quote, asciiOnly, graphicOnly)) -} - -func appendQuotedWith(buf []byte, s string, quote byte, asciiOnly, graphicOnly bool) []byte { - // Often called with big strings, so preallocate. If there's quoting, - // this is conservative but still helps a lot. - if cap(buf)-len(buf) < len(s) { - nBuf := make([]byte, len(buf), len(buf)+1+len(s)+1) - copy(nBuf, buf) - buf = nBuf - } - buf = append(buf, quote) - for width := 0; len(s) > 0; s = s[width:] { - r := rune(s[0]) - width = 1 - if r >= utf8.RuneSelf { - r, width = utf8.DecodeRuneInString(s) - } - if width == 1 && r == utf8.RuneError { - buf = append(buf, `\x`...) - buf = append(buf, lowerhex[s[0]>>4]) - buf = append(buf, lowerhex[s[0]&0xF]) - continue - } - buf = appendEscapedRune(buf, r, quote, asciiOnly, graphicOnly) - } - buf = append(buf, quote) - return buf -} -func appendEscapedRune(buf []byte, r rune, quote byte, asciiOnly, graphicOnly bool) []byte { - var runeTmp [utf8.UTFMax]byte - if r == rune(quote) || r == '\\' { // always backslashed - buf = append(buf, '\\') - buf = append(buf, byte(r)) - return buf - } - if asciiOnly { - if r < utf8.RuneSelf && strconv.IsPrint(r) { - buf = append(buf, byte(r)) - return buf - } - } else if strconv.IsPrint(r) || graphicOnly && isInGraphicList(r) { - n := utf8.EncodeRune(runeTmp[:], r) - buf = append(buf, runeTmp[:n]...) - return buf - } - switch r { - case '\a': - buf = append(buf, `\a`...) - case '\b': - buf = append(buf, `\b`...) - case '\f': - buf = append(buf, `\f`...) - case '\n': - buf = append(buf, `\n`...) - case '\r': - buf = append(buf, `\r`...) - case '\t': - buf = append(buf, `\t`...) - case '\v': - buf = append(buf, `\v`...) - default: - switch { - case !utf8.ValidRune(r): - r = 0xFFFD - fallthrough - case r < 0x10000: - buf = append(buf, `\u`...) - for s := 12; s >= 0; s -= 4 { - buf = append(buf, lowerhex[r>>uint(s)&0xF]) - } - default: - buf = append(buf, `\U`...) - for s := 28; s >= 0; s -= 4 { - buf = append(buf, lowerhex[r>>uint(s)&0xF]) - } - } - } - return buf -} - -func isInGraphicList(r rune) bool { - // We know r must fit in 16 bits - see makeisprint.go. - if r > 0xFFFF { - return false - } - rr := uint16(r) - i := bsearch16(isGraphic, rr) - return i < len(isGraphic) && rr == isGraphic[i] -} - -// bsearch16 returns the smallest i such that a[i] >= x. -// If there is no such i, bsearch16 returns len(a). -func bsearch16(a []uint16, x uint16) int { - i, j := 0, len(a) - for i < j { - h := i + (j-i)>>1 - if a[h] < x { - i = h + 1 - } else { - j = h - } - } - return i -} - -// isGraphic lists the graphic runes not matched by IsPrint. -var isGraphic = []uint16{ - 0x00a0, - 0x1680, - 0x2000, - 0x2001, - 0x2002, - 0x2003, - 0x2004, - 0x2005, - 0x2006, - 0x2007, - 0x2008, - 0x2009, - 0x200a, - 0x202f, - 0x205f, - 0x3000, -} From 4ed04443c536a728a43cbb15535d5ae3cef45dad Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Tue, 31 Jan 2023 21:18:15 +0800 Subject: [PATCH 85/95] server: quick path for http join query --- server/http.go | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/server/http.go b/server/http.go index 6bebc18..7b79a58 100644 --- a/server/http.go +++ b/server/http.go @@ -104,31 +104,35 @@ func init() { var joinQuery = regexp.MustCompile(`\[(.+?),(.+?)]\.0`) -func (h *httpCtx) get(s string, join bool) gjson.Result { +func mayJSONParam(p string) bool { + if strings.HasPrefix(p, "{") || strings.HasPrefix(p, "[") { + return gjson.Valid(p) + } + return false +} + +func (h *httpCtx) get(pattern string, join bool) gjson.Result { // support gjson advanced syntax: - // h.Get("[a,b].0") see usage in http_test.go - if join && joinQuery.MatchString(s) { - matched := joinQuery.FindStringSubmatch(s) + // h.Get("[a,b].0") see usage in http_test.go. See issue #1241, #1325. + if join && strings.HasPrefix(pattern, "[") && joinQuery.MatchString(pattern) { + matched := joinQuery.FindStringSubmatch(pattern) if r := h.get(matched[1], false); r.Exists() { return r } return h.get(matched[2], false) } - validJSONParam := func(p string) bool { - return (strings.HasPrefix(p, "{") || strings.HasPrefix(p, "[")) && gjson.Valid(p) - } if h.postForm != nil { - if form := h.postForm.Get(s); form != "" { - if validJSONParam(form) { + if form := h.postForm.Get(pattern); form != "" { + if mayJSONParam(form) { return gjson.Result{Type: gjson.JSON, Raw: form} } return gjson.Result{Type: gjson.String, Str: form} } } if h.query != nil { - if query := h.query.Get(s); query != "" { - if validJSONParam(query) { + if query := h.query.Get(pattern); query != "" { + if mayJSONParam(query) { return gjson.Result{Type: gjson.JSON, Raw: query} } return gjson.Result{Type: gjson.String, Str: query} From 06450c66a221064c73647507fe436ec788f812b9 Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Tue, 31 Jan 2023 21:20:48 +0800 Subject: [PATCH 86/95] ci: make golangci-lint happy --- coolq/cqcode/element.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/coolq/cqcode/element.go b/coolq/cqcode/element.go index 12dc08e..7c1cc74 100644 --- a/coolq/cqcode/element.go +++ b/coolq/cqcode/element.go @@ -94,8 +94,8 @@ func writeQuote(b *bytes.Buffer, s string) { c = 't' } b.WriteByte(c) - i = j + 1 - j = j + 1 + j++ + i = j continue case '<', '>', '&': @@ -103,8 +103,8 @@ func writeQuote(b *bytes.Buffer, s string) { b.WriteString(`\u00`) b.WriteByte(hex[c>>4]) b.WriteByte(hex[c&0xF]) - i = j + 1 - j = j + 1 + j++ + i = j continue } @@ -114,8 +114,8 @@ func writeQuote(b *bytes.Buffer, s string) { b.WriteString(`\u00`) b.WriteByte(hex[c>>4]) b.WriteByte(hex[c&0xF]) - i = j + 1 - j = j + 1 + j++ + i = j continue } @@ -124,8 +124,8 @@ func writeQuote(b *bytes.Buffer, s string) { if r == utf8.RuneError && size == 1 { b.WriteString(s[i:j]) b.WriteString(`\ufffd`) - i = j + size - j = j + size + j += size + i = j continue } @@ -141,8 +141,8 @@ func writeQuote(b *bytes.Buffer, s string) { b.WriteString(s[i:j]) b.WriteString(`\u202`) b.WriteByte(hex[r&0xF]) - i = j + size - j = j + size + j += size + i = j continue } From f3da083be9a0152e5b953c926d962e852a65feb8 Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Tue, 31 Jan 2023 23:10:30 +0800 Subject: [PATCH 87/95] coolq/cqcode: add a testcase for quote May report an empty json message. --- coolq/cqcode/all_test.go | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/coolq/cqcode/all_test.go b/coolq/cqcode/all_test.go index a42e9bb..ff285c5 100644 --- a/coolq/cqcode/all_test.go +++ b/coolq/cqcode/all_test.go @@ -2,18 +2,31 @@ package cqcode import ( "bytes" + "encoding/json" "testing" ) -func TestIssue1733(t *testing.T) { - const ( - input = "\u0005" - expected = `"\u0005"` - ) - var b bytes.Buffer - writeQuote(&b, input) - got := b.String() - if got != expected { - t.Errorf("want %v but got %v", expected, got) +func jsonMarshal(s string) string { + b, err := json.Marshal(s) + if err != nil { + panic(err) + } + return string(b) +} + +func Test_quote(t *testing.T) { + testcase := []string{ + "\u0005", // issue 1773 + "\v", + } + + for _, input := range testcase { + var b bytes.Buffer + writeQuote(&b, input) + got := b.String() + expected := jsonMarshal(input) + if got != expected { + t.Errorf("want %v but got %v", expected, got) + } } } From fc0845b16db462bbc6f4539d5fadf91dd42f83fa Mon Sep 17 00:00:00 2001 From: BeautyyuYanli Date: Wed, 1 Feb 2023 13:22:56 +0800 Subject: [PATCH 88/95] Support API set_group_anonymous (#1875) * support api set_group_anonymous * update MiraiGo version * fix bug due to MiraiGo update --- coolq/api.go | 17 +++++++++++++++-- go.mod | 2 +- go.sum | 3 +++ modules/api/api.go | 7 +++++++ 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/coolq/api.go b/coolq/api.go index 03225e1..f27305f 100644 --- a/coolq/api.go +++ b/coolq/api.go @@ -1106,12 +1106,12 @@ func (bot *CQBot) CQSetGroupMemo(groupID int64, msg, img string) global.MSG { if err != nil { return Failed(100, "IMAGE_NOT_FOUND", "图片未找到") } - err = bot.Client.AddGroupNoticeWithPic(groupID, msg, data) + _, err = bot.Client.AddGroupNoticeWithPic(groupID, msg, data) if err != nil { return Failed(100, "SEND_NOTICE_ERROR", err.Error()) } } else { - err := bot.Client.AddGroupNoticeSimple(groupID, msg) + _, err := bot.Client.AddGroupNoticeSimple(groupID, msg) if err != nil { return Failed(100, "SEND_NOTICE_ERROR", err.Error()) } @@ -1337,6 +1337,19 @@ func (bot *CQBot) CQSetGroupAdmin(groupID, userID int64, enable bool) global.MSG return OK(nil) } +// CQSetGroupAnonymous 群组匿名 +// +// https://beautyyu.one +// @route(set_group_anonymous) +// @default(enable=true) +func (bot *CQBot) CQSetGroupAnonymous(groupID int64, enable bool) global.MSG { + if g := bot.Client.FindGroup(groupID); g != nil { + g.SetAnonymous(enable) + return OK(nil) + } + return Failed(100, "GROUP_NOT_FOUND", "群聊不存在") +} + // CQGetGroupHonorInfo 获取群荣誉信息 // // https://git.io/Jtz1H diff --git a/go.mod b/go.mod index 833f73e..b4c346f 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.19 require ( github.com/FloatTech/sqlite v1.5.7 github.com/Microsoft/go-winio v0.6.0 - github.com/Mrs4s/MiraiGo v0.0.0-20221202060717-4658474c60dd + github.com/Mrs4s/MiraiGo v0.0.0-20230131090543-15069b74b35d github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc github.com/fumiama/go-base16384 v1.6.1 diff --git a/go.sum b/go.sum index 016fc5b..30b3308 100644 --- a/go.sum +++ b/go.sum @@ -6,6 +6,8 @@ github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2y github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= github.com/Mrs4s/MiraiGo v0.0.0-20221202060717-4658474c60dd h1:rzAbPc++5CJ1VZDjq/eORXOWMMGsDN3DMAPMXfI7Fvs= github.com/Mrs4s/MiraiGo v0.0.0-20221202060717-4658474c60dd/go.mod h1:lecSP26qedhinCceWn1x02dLDxGotH5nTFlpIMilmVM= +github.com/Mrs4s/MiraiGo v0.0.0-20230131090543-15069b74b35d h1:R1Sd1psdee4pXYZk47u2GqSe6Wit87aGJZen/f2CFq0= +github.com/Mrs4s/MiraiGo v0.0.0-20230131090543-15069b74b35d/go.mod h1:EAJPnMB7OYB4pLCv/QZlfCrtW34lmRuNNnQevDX5HDY= github.com/RomiChan/protobuf v0.0.0-20220624030127-3310cba9dbc0 h1:GEwcB4dL9vc4veW1fLNt0Fby3wspVflAn5v9/HbUwDM= github.com/RomiChan/protobuf v0.0.0-20220624030127-3310cba9dbc0/go.mod h1:2Ie+hdBFQpQFDHfeklgxoFmQRCE7O+KwFpISeXq7OwA= github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e h1:wR3MXQ3VbUlPKOOUwLOYgh/QaJThBTYtsl673O3lqSA= @@ -52,6 +54,7 @@ github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNU github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= diff --git a/modules/api/api.go b/modules/api/api.go index e13f8c8..a381005 100644 --- a/modules/api/api.go +++ b/modules/api/api.go @@ -267,6 +267,13 @@ func (c *Caller) call(action string, p Getter) global.MSG { p2 = pt.Bool() } return c.bot.CQSetGroupAdmin(p0, p1, p2) + case "set_group_anonymous": + p0 := p.Get("group_id").Int() + p1 := true + if pt := p.Get("enable"); pt.Exists() { + p1 = pt.Bool() + } + return c.bot.CQSetGroupAnonymous(p0, p1) case "set_group_anonymous_ban": p0 := p.Get("group_id").Int() p1 := p.Get("[anonymous_flag,anonymous.flag].0").String() From d96f840d7fd4be39bf19c36d1c915da452c4df07 Mon Sep 17 00:00:00 2001 From: ctaoist <14012127+ctaoist@users.noreply.github.com> Date: Fri, 3 Feb 2023 23:59:05 +0800 Subject: [PATCH 89/95] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8F=96=E5=87=BA?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E6=97=B6LocalImageElement=E7=BC=BA=E5=A4=B1?= =?UTF-8?q?=E9=97=AE=E9=A2=98=20(#1884)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- coolq/cqcode.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/coolq/cqcode.go b/coolq/cqcode.go index ab73c5f..4258557 100644 --- a/coolq/cqcode.go +++ b/coolq/cqcode.go @@ -282,6 +282,18 @@ func toElements(e []message.IMessageElement, source message.Source) (r []cqcode. {K: "type", V: "sticker"}, }, } + case *LocalImageElement: + data := pairs{ + {K: "file", V: o.File}, + {K: "url", V: o.URL}, + } + if o.Flash { + data = append(data, pair{K: "type", V: "flash"}) + } + m = cqcode.Element{ + Type: "image", + Data: data, + } default: continue } From bbef3300696ca9ccf0be9454a9204d68a0732e70 Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Sat, 4 Feb 2023 13:01:16 +0800 Subject: [PATCH 90/95] server: add a error log --- server/websocket.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/server/websocket.go b/server/websocket.go index 668d5ec..dc26e65 100644 --- a/server/websocket.go +++ b/server/websocket.go @@ -467,14 +467,16 @@ func (s *webSocketServer) listenAPI(c *wsConn) { func (c *wsConn) handleRequest(_ *coolq.CQBot, payload []byte) { defer func() { if err := recover(); err != nil { - log.Printf("处置WS命令时发生无法恢复的异常:%v\n%s", err, debug.Stack()) + log.Errorf("处置WS命令时发生无法恢复的异常:%v\n%s", err, debug.Stack()) _ = c.Close() } }() + j := gjson.Parse(utils.B2S(payload)) t := strings.TrimSuffix(j.Get("action").Str, "_async") - log.Debugf("WS接收到API调用: %v 参数: %v", t, j.Get("params").Raw) - ret := c.apiCaller.Call(t, j.Get("params")) + params := j.Get("params") + log.Debugf("WS接收到API调用: %v 参数: %v", t, params.Raw) + ret := c.apiCaller.Call(t, params) if j.Get("echo").Exists() { ret["echo"] = j.Get("echo").Value() } @@ -482,7 +484,11 @@ func (c *wsConn) handleRequest(_ *coolq.CQBot, payload []byte) { c.mu.Lock() defer c.mu.Unlock() _ = c.conn.SetWriteDeadline(time.Now().Add(time.Second * 15)) - writer, _ := c.conn.NextWriter(websocket.TextMessage) + writer, err := c.conn.NextWriter(websocket.TextMessage) + if err != nil { + log.Errorf("无法响应API调用(连接已断开?): %v", err) + return + } _ = json.NewEncoder(writer).Encode(ret) _ = writer.Close() } From 2483eb09c44e50ec349b9024a438038f88b37b04 Mon Sep 17 00:00:00 2001 From: Pandaft <80463781+Pandaft@users.noreply.github.com> Date: Sat, 4 Feb 2023 13:07:34 +0800 Subject: [PATCH 91/95] fix: set_group_ban limit error (#1846) * fix: set_group_ban limit error --- coolq/api.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coolq/api.go b/coolq/api.go index f27305f..28a1929 100644 --- a/coolq/api.go +++ b/coolq/api.go @@ -1166,7 +1166,7 @@ func (bot *CQBot) CQSetGroupBan(groupID, userID int64, duration uint32) global.M if m := g.FindMember(userID); m != nil { err := m.Mute(duration) if err != nil { - if duration > 2592000 { + if duration >= 2592000 { return Failed(100, "DURATION_IS_NOT_IN_RANGE", "非法的禁言时长") } return Failed(100, "NOT_MANAGEABLE", "机器人权限不足") From 0f0ccf459fc80c612fdbdf8c3ce07389551de81f Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Mon, 6 Feb 2023 20:39:06 +0800 Subject: [PATCH 92/95] all: update go 1.20 --- .github/workflows/ci.yml | 2 +- .github/workflows/golint.yml | 2 +- .github/workflows/release.yml | 2 +- Dockerfile | 2 +- go.mod | 6 +++--- go.sum | 8 ++++---- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2e1cee1..4747ab1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,7 @@ jobs: - name: Setup Go environment uses: actions/setup-go@v2.1.3 with: - go-version: 1.19 + go-version: '1.20' - name: Cache downloaded module uses: actions/cache@v2 with: diff --git a/.github/workflows/golint.yml b/.github/workflows/golint.yml index 89fffe5..75d451a 100644 --- a/.github/workflows/golint.yml +++ b/.github/workflows/golint.yml @@ -12,7 +12,7 @@ jobs: - name: Setup Go environment uses: actions/setup-go@v2.1.3 with: - go-version: 1.19 + go-version: '1.20' - name: golangci-lint uses: golangci/golangci-lint-action@v2 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e53dc2c..b3496af 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -17,7 +17,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v2 with: - go-version: '1.19' + go-version: '1.20' - name: Run GoReleaser uses: goreleaser/goreleaser-action@v2 diff --git a/Dockerfile b/Dockerfile index ba2c975..869edff 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.19-alpine AS builder +FROM golang:1.20-alpine AS builder RUN go env -w GO111MODULE=auto \ && go env -w CGO_ENABLED=0 \ diff --git a/go.mod b/go.mod index f2ea3e6..cccba24 100644 --- a/go.mod +++ b/go.mod @@ -1,11 +1,11 @@ module github.com/Mrs4s/go-cqhttp -go 1.19 +go 1.20 require ( github.com/FloatTech/sqlite v1.5.7 github.com/Microsoft/go-winio v0.6.0 - github.com/Mrs4s/MiraiGo v0.0.0-20230131090543-15069b74b35d + github.com/Mrs4s/MiraiGo v0.0.0-20230206122951-91f9576e4815 github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc github.com/fumiama/go-base16384 v1.6.1 @@ -31,7 +31,7 @@ require ( require ( github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b // indirect - github.com/RomiChan/protobuf v0.0.0-20220624030127-3310cba9dbc0 // indirect + github.com/RomiChan/protobuf v0.1.1-0.20230204044148-2ed269a2e54d // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/fumiama/imgsz v0.0.2 // indirect github.com/golang/snappy v0.0.4 // indirect diff --git a/go.sum b/go.sum index 6be3ac6..c3f914c 100644 --- a/go.sum +++ b/go.sum @@ -4,10 +4,10 @@ github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b h1:tvciXWq2nuvTbFeJG github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b/go.mod h1:fHZFWGquNXuHttu9dUYoKuNbm3dzLETnIOnm1muSfDs= github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= -github.com/Mrs4s/MiraiGo v0.0.0-20230131090543-15069b74b35d h1:R1Sd1psdee4pXYZk47u2GqSe6Wit87aGJZen/f2CFq0= -github.com/Mrs4s/MiraiGo v0.0.0-20230131090543-15069b74b35d/go.mod h1:EAJPnMB7OYB4pLCv/QZlfCrtW34lmRuNNnQevDX5HDY= -github.com/RomiChan/protobuf v0.0.0-20220624030127-3310cba9dbc0 h1:GEwcB4dL9vc4veW1fLNt0Fby3wspVflAn5v9/HbUwDM= -github.com/RomiChan/protobuf v0.0.0-20220624030127-3310cba9dbc0/go.mod h1:2Ie+hdBFQpQFDHfeklgxoFmQRCE7O+KwFpISeXq7OwA= +github.com/Mrs4s/MiraiGo v0.0.0-20230206122951-91f9576e4815 h1:Cmy4RFT5RurAyj3h2CdUQ76+T2P2OUic27Ancsin9V0= +github.com/Mrs4s/MiraiGo v0.0.0-20230206122951-91f9576e4815/go.mod h1:mU3fBFU+7eO0kaGes7YRKtzIDtwIU84nSSwTV7NK2b0= +github.com/RomiChan/protobuf v0.1.1-0.20230204044148-2ed269a2e54d h1:/Xuj3fIiMY2ls1TwvPKmaqQrtJsPY+c9s+0lOScVHd8= +github.com/RomiChan/protobuf v0.1.1-0.20230204044148-2ed269a2e54d/go.mod h1:2Ie+hdBFQpQFDHfeklgxoFmQRCE7O+KwFpISeXq7OwA= github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e h1:wR3MXQ3VbUlPKOOUwLOYgh/QaJThBTYtsl673O3lqSA= github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e/go.mod h1:vD7Ra3Q9onRtojoY5sMCLQ7JBgjUsrXDnDKyFxqpf9w= github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc h1:AAx50/fb/xS4lvsdQg+bFbGvqSDhyV1MF+p2PLCamZ0= From 17420feeac372ea7c7ef6f989bde0a4decb44dcb Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Thu, 9 Feb 2023 22:33:15 +0800 Subject: [PATCH 93/95] coolq: add sign in api get_stranger_info Fixes #1853 --- coolq/api.go | 1 + go.mod | 2 +- go.sum | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/coolq/api.go b/coolq/api.go index 28a1929..7b67f88 100644 --- a/coolq/api.go +++ b/coolq/api.go @@ -1431,6 +1431,7 @@ func (bot *CQBot) CQGetStrangerInfo(userID int64) global.MSG { // unknown = 0x2 return "unknown" }(), + "sign": info.Sign, "age": info.Age, "level": info.Level, "login_days": info.LoginDays, diff --git a/go.mod b/go.mod index cccba24..773ec71 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.20 require ( github.com/FloatTech/sqlite v1.5.7 github.com/Microsoft/go-winio v0.6.0 - github.com/Mrs4s/MiraiGo v0.0.0-20230206122951-91f9576e4815 + github.com/Mrs4s/MiraiGo v0.0.0-20230209142832-f56bcbe3269b github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc github.com/fumiama/go-base16384 v1.6.1 diff --git a/go.sum b/go.sum index c3f914c..84b5826 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b h1:tvciXWq2nuvTbFeJG github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b/go.mod h1:fHZFWGquNXuHttu9dUYoKuNbm3dzLETnIOnm1muSfDs= github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= -github.com/Mrs4s/MiraiGo v0.0.0-20230206122951-91f9576e4815 h1:Cmy4RFT5RurAyj3h2CdUQ76+T2P2OUic27Ancsin9V0= -github.com/Mrs4s/MiraiGo v0.0.0-20230206122951-91f9576e4815/go.mod h1:mU3fBFU+7eO0kaGes7YRKtzIDtwIU84nSSwTV7NK2b0= +github.com/Mrs4s/MiraiGo v0.0.0-20230209142832-f56bcbe3269b h1:jCFQnNUqEk03YwgxwwSMzbiyhonbnIycelZV9MbM5ic= +github.com/Mrs4s/MiraiGo v0.0.0-20230209142832-f56bcbe3269b/go.mod h1:mU3fBFU+7eO0kaGes7YRKtzIDtwIU84nSSwTV7NK2b0= github.com/RomiChan/protobuf v0.1.1-0.20230204044148-2ed269a2e54d h1:/Xuj3fIiMY2ls1TwvPKmaqQrtJsPY+c9s+0lOScVHd8= github.com/RomiChan/protobuf v0.1.1-0.20230204044148-2ed269a2e54d/go.mod h1:2Ie+hdBFQpQFDHfeklgxoFmQRCE7O+KwFpISeXq7OwA= github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e h1:wR3MXQ3VbUlPKOOUwLOYgh/QaJThBTYtsl673O3lqSA= From 0a4f849154c2bc3728ba7fcdbf9c4901fe3af27f Mon Sep 17 00:00:00 2001 From: AkagiYui Date: Thu, 9 Feb 2023 22:35:34 +0800 Subject: [PATCH 94/95] fix: BINARY_NAME wrong in ci action (#1898) --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4747ab1..eebf2ac 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,7 +44,7 @@ jobs: run: | if [ $GOOS = "windows" ]; then export BINARY_SUFFIX="$BINARY_SUFFIX.exe"; fi if $IS_PR ; then echo $PR_PROMPT; fi - export BINARY_NAME="$BINARY_PREFIX$GOOS_$GOARCH$BINARY_SUFFIX" + export BINARY_NAME="$BINARY_PREFIX"$GOOS"_$GOARCH$BINARY_SUFFIX" export CGO_ENABLED=0 export LD_FLAGS="-w -s -X github.com/Mrs4s/go-cqhttp/internal/base.Version=${COMMIT_ID::7}" go build -o "output/$BINARY_NAME" -trimpath -ldflags "$LD_FLAGS" . From a7c003d404e8e567b52273a3f763d31810073d33 Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Mon, 13 Feb 2023 21:29:17 +0800 Subject: [PATCH 95/95] update MiraiGo --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 773ec71..be7fe15 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.20 require ( github.com/FloatTech/sqlite v1.5.7 github.com/Microsoft/go-winio v0.6.0 - github.com/Mrs4s/MiraiGo v0.0.0-20230209142832-f56bcbe3269b + github.com/Mrs4s/MiraiGo v0.0.0-20230213132655-3ff1fee1b645 github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc github.com/fumiama/go-base16384 v1.6.1 diff --git a/go.sum b/go.sum index 84b5826..6e43c31 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b h1:tvciXWq2nuvTbFeJG github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b/go.mod h1:fHZFWGquNXuHttu9dUYoKuNbm3dzLETnIOnm1muSfDs= github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= -github.com/Mrs4s/MiraiGo v0.0.0-20230209142832-f56bcbe3269b h1:jCFQnNUqEk03YwgxwwSMzbiyhonbnIycelZV9MbM5ic= -github.com/Mrs4s/MiraiGo v0.0.0-20230209142832-f56bcbe3269b/go.mod h1:mU3fBFU+7eO0kaGes7YRKtzIDtwIU84nSSwTV7NK2b0= +github.com/Mrs4s/MiraiGo v0.0.0-20230213132655-3ff1fee1b645 h1:KHWuWmhF2nacb2mKqA3OJorerCEo9n6BNizMuBACa38= +github.com/Mrs4s/MiraiGo v0.0.0-20230213132655-3ff1fee1b645/go.mod h1:mU3fBFU+7eO0kaGes7YRKtzIDtwIU84nSSwTV7NK2b0= github.com/RomiChan/protobuf v0.1.1-0.20230204044148-2ed269a2e54d h1:/Xuj3fIiMY2ls1TwvPKmaqQrtJsPY+c9s+0lOScVHd8= github.com/RomiChan/protobuf v0.1.1-0.20230204044148-2ed269a2e54d/go.mod h1:2Ie+hdBFQpQFDHfeklgxoFmQRCE7O+KwFpISeXq7OwA= github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e h1:wR3MXQ3VbUlPKOOUwLOYgh/QaJThBTYtsl673O3lqSA=