diff --git a/coolq/api.go b/coolq/api.go index e55afc9..626a912 100644 --- a/coolq/api.go +++ b/coolq/api.go @@ -988,6 +988,68 @@ func (bot *CQBot) CQGetStatus() MSG { }) } +// CQSetEssenceMessage 设置精华消息 +func (bot *CQBot) CQSetEssenceMessage(messageID int32) MSG { + msg := bot.GetMessage(messageID) + if msg == nil { + return Failed(100, "MESSAGE_NOT_FOUND", "消息不存在") + } + if _, ok := msg["group"]; ok { + if err := bot.Client.SetEssenceMessage(msg["group"].(int64), msg["message-id"].(int32), msg["internal-id"].(int32)); err != nil { + log.Warnf("设置精华消息 %v 失败: %v", messageID, err) + return Failed(100, "SET_ESSENCE_MSG_ERROR", err.Error()) + } + } else { + log.Warnf("设置精华消息 %v 失败: 非群聊", messageID) + return Failed(100, "SET_ESSENCE_MSG_ERROR", "非群聊") + } + return OK(nil) +} + +// CQDeleteEssenceMessage 移出精华消息 +func (bot *CQBot) CQDeleteEssenceMessage(messageID int32) MSG { + msg := bot.GetMessage(messageID) + if msg == nil { + return Failed(100, "MESSAGE_NOT_FOUND", "消息不存在") + } + if _, ok := msg["group"]; ok { + if err := bot.Client.DeleteEssenceMessage(msg["group"].(int64), msg["message-id"].(int32), msg["internal-id"].(int32)); err != nil { + log.Warnf("移出精华消息 %v 失败: %v", messageID, err) + return Failed(100, "DEL_ESSENCE_MSG_ERROR", err.Error()) + } + } else { + log.Warnf("移出精华消息 %v 失败: 非群聊", messageID) + return Failed(100, "DEL_ESSENCE_MSG_ERROR", "非群聊") + } + return OK(nil) +} + +// CQGetEssenceMessageList 获取精华消息列表 +func (bot *CQBot) CQGetEssenceMessageList(groupCode int64) MSG { + g := bot.Client.FindGroup(groupCode) + if g == nil { + return Failed(100, "GROUP_NOT_FOUND", "群聊不存在") + } + msgList, err := bot.Client.GetGroupEssenceMsgList(groupCode) + if err != nil { + return Failed(100, "GET_ESSENCE_LIST_FOUND", err.Error()) + } + list := make([]MSG, 0) + for _, m := range msgList { + var msg = MSG{ + "sender_nick": m.SenderNick, + "sender_time": m.SenderTime, + "operator_time": m.AddDigestTime, + "operator_nick": m.AddDigestNick, + } + msg["sender_id"], _ = strconv.ParseUint(m.SenderUin, 10, 64) + msg["operator_id"], _ = strconv.ParseUint(m.AddDigestUin, 10, 64) + msg["message_id"] = ToGlobalId(groupCode, int32(m.MessageID)) + list = append(list, msg) + } + return OK(list) +} + func (bot *CQBot) CQGetVersionInfo() MSG { wd, _ := os.Getwd() return OK(MSG{ diff --git a/coolq/bot.go b/coolq/bot.go index 81eee07..bad338f 100644 --- a/coolq/bot.go +++ b/coolq/bot.go @@ -78,6 +78,7 @@ func NewQQBot(cli *client.QQClient, conf *global.JSONConfig) *CQBot { bot.Client.OnGroupInvited(bot.groupInvitedEvent) bot.Client.OnUserWantJoinGroup(bot.groupJoinReqEvent) bot.Client.OnOtherClientStatusChanged(bot.otherClientStatusChangedEvent) + bot.Client.OnGroupDigest(bot.groupEssenceMsg) go func() { i := conf.HeartbeatInterval if i < 0 { diff --git a/coolq/event.go b/coolq/event.go index a2dfcd1..9299751 100644 --- a/coolq/event.go +++ b/coolq/event.go @@ -431,7 +431,47 @@ func (bot *CQBot) otherClientStatusChangedEvent(c *client.QQClient, e *client.Ot "self_id": c.Uin, "time": time.Now().Unix(), }) +} +func (bot *CQBot) groupEssenceMsg(c *client.QQClient, e *client.GroupDigestEvent) { + g := c.FindGroup(e.GroupCode) + gid := ToGlobalId(e.GroupCode, e.MessageID) + if e.OperationType == 1 { + log.Infof( + "群 %v 内 %v 将 %v 的消息(%v)设为了精华消息.", + formatGroupName(g), + formatMemberName(g.FindMember(e.OperatorUin)), + formatMemberName(g.FindMember(e.SenderUin)), + gid, + ) + } else { + log.Infof( + "群 %v 内 %v 将 %v 的消息(%v)移出了精华消息.", + formatGroupName(g), + formatMemberName(g.FindMember(e.OperatorUin)), + formatMemberName(g.FindMember(e.SenderUin)), + gid, + ) + } + if e.OperatorUin == bot.Client.Uin { + return + } + bot.dispatchEventMessage(MSG{ + "post_type": "notice", + "group_id": e.GroupCode, + "notice_type": "essence", + "sub_type": func() string { + if e.OperationType == 1 { + return "add" + } + return "delete" + }(), + "self_id": c.Uin, + "sender_id": e.SenderUin, + "operator_id": e.OperatorUin, + "time": time.Now().Unix(), + "message_id": gid, + }) } func (bot *CQBot) groupIncrease(groupCode, operatorUin, userUin int64) MSG { diff --git a/docs/cqhttp.md b/docs/cqhttp.md index f1da613..4c29eb2 100644 --- a/docs/cqhttp.md +++ b/docs/cqhttp.md @@ -39,6 +39,9 @@ - [获取群子目录文件列表](#设置群名) - [获取用户VIP信息](#获取用户VIP信息) - [发送群公告](#发送群公告) +- [设置精华消息](#设置精华消息) +- [移出精华消息](#移出精华消息) +- [获取精华消息列表](#获取精华消息列表) - [重载事件过滤器](#重载事件过滤器) ##### 事件 @@ -50,6 +53,7 @@ - [群成员荣誉变更提示](#群成员荣誉变更提示) - [群成员名片更新](#群成员名片更新) - [接收到离线文件](#接收到离线文件) +- [群精华消息](#精华消息)

@@ -620,11 +624,63 @@ Type: `tts` | -------- | -------- | ---- | | `slices` | string[] | 词组 | +### 设置精华消息 + +终结点: `/set_essence_msg` + +**参数** + +| 字段 | 类型 | 说明 | +| --------- | ------ | ---- | +| `message_id` | int32 | 消息ID | + +**响应数据** + +无 + +### 移出精华消息 + +终结点: `/delete_essence_msg` + +**参数** + +| 字段 | 类型 | 说明 | +| --------- | ------ | ---- | +| `message_id` | int32 | 消息ID | + +**响应数据** + +无 + +### 获取精华消息列表 + +终结点: `/get_essence_msg_list` + +**参数** + +| 字段 | 类型 | 说明 | +| --------- | ------ | ---- | +| `group_id` | int64 | 群号 | + +**响应数据** + +响应内容为 JSON 数组,每个元素如下: + +| 字段名 | 数据类型 | 说明 | +| ----- | ------- | --- | +| `sender_id` |int64 | 发送者QQ 号 | +| `sender_nick` | string | 发送者昵称 | +| `sender_time` | int64 | 消息发送时间 | +| `operator_id` |int64 | 发送者QQ 号 | +| `operator_nick` | string | 发送者昵称 | +| `operator_time` | int64 | 消息发送时间| +| `message_id` | int32 | 消息ID | + ### 图片OCR > 注意: 目前图片OCR接口仅支持接受的图片 -终结点: `/.ocr_image` +终结点: `/ocr_image` **参数** @@ -1095,4 +1151,17 @@ JSON数组: | `post_type` | string | `notice` | 上报类型 | | `notice_type` | string | `client_status` | 消息类型 | | `client` | Device | | 客户端信息 | -| `online` | bool | | 当前是否在线 | \ No newline at end of file +| `online` | bool | | 当前是否在线 | + +### 精华消息 + +**上报数据** + +| 字段 | 类型 | 可能的值 | 说明 | +| ------------- | ------ | -------------- | -------- | +| `post_type` | string | `notice` | 上报类型 | +| `notice_type` | string | `essence` | 消息类型 | +| `sub_type` | string | `add`,`delete` | 添加为`add`,移出为`delete` | +| `sender_id` | int64 | | 消息发送者ID | +| `operator_id` | int64 | | 操作者ID | +| `message_id` | int32 | | 消息ID | diff --git a/go.sum b/go.sum index e9741f8..03f24d5 100644 --- a/go.sum +++ b/go.sum @@ -7,11 +7,13 @@ github.com/Mrs4s/MiraiGo v0.0.0-20210202135946-553229fea92e/go.mod h1:yhqA0NyKxU github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +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 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/gin-contrib/pprof v1.3.0 h1:G9eK6HnbkSqDZBYbzG4wrjCsA4e+cvYAHUZw6W+W9K0= github.com/gin-contrib/pprof v1.3.0/go.mod h1:waMjT1H9b179t3CxuG1cV3DHpga6ybizwfBaM5OXaB0= @@ -21,6 +23,7 @@ github.com/gin-gonic/gin v1.6.0/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwv github.com/gin-gonic/gin v1.6.2/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= @@ -47,8 +50,10 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 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.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -56,7 +61,9 @@ github.com/guonaihong/gout v0.1.4 h1:uBBoyztMX9okC27OQxqhn6bZ0ROkGyvnEIHwtp3TM4g github.com/guonaihong/gout v0.1.4/go.mod h1:0rFYAYyzbcxEg11eY2qUbffJs7hHRPeugAnlVYSp8Ic= github.com/hjson/hjson-go v3.1.0+incompatible h1:DY/9yE8ey8Zv22bY+mHV1uk2yRy0h8tKhZ77hEdi0Aw= github.com/hjson/hjson-go v3.1.0+incompatible/go.mod h1:qsetwF8NlsTsOTwZTApNlTCerV+b2GjYRRcIk4JMFio= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= 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/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= @@ -66,6 +73,7 @@ github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALr github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8= 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= @@ -80,11 +88,14 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= 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/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= @@ -94,6 +105,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 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.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= @@ -139,6 +151,7 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -147,6 +160,7 @@ golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -166,8 +180,11 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= 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= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/main.go b/main.go index f6fb1ab..327663b 100644 --- a/main.go +++ b/main.go @@ -143,8 +143,8 @@ func main() { if conf.Uin == 0 || (conf.Password == "" && conf.PasswordEncrypted == "") { log.Warnf("请修改 config.hjson 以添加账号密码.") - if (!isFastStart) { - time.Sleep(time.Second * 5) + if !isFastStart { + time.Sleep(time.Second * 5) } return } @@ -509,7 +509,7 @@ func getConfig() *global.JSONConfig { return nil } log.Infof("默认配置文件已生成, 请编辑 config.hjson 后重启程序.") - if (!isFastStart) { + if !isFastStart { time.Sleep(time.Second * 5) } return nil diff --git a/server/http.go b/server/http.go index 8b6832c..f63ce2d 100644 --- a/server/http.go +++ b/server/http.go @@ -486,6 +486,21 @@ func SetGroupPortrait(s *httpServer, c *gin.Context) { c.JSON(200, s.bot.CQSetGroupPortrait(gid, file, cache)) } +func SetEssenceMsg(s *httpServer, c *gin.Context) { + mid, _ := strconv.ParseInt(getParam(c, "message_id"), 10, 64) + c.JSON(200, s.bot.CQSetEssenceMessage(int32(mid))) +} + +func DeleteEssenceMsg(s *httpServer, c *gin.Context) { + mid, _ := strconv.ParseInt(getParam(c, "message_id"), 10, 64) + c.JSON(200, s.bot.CQDeleteEssenceMessage(int32(mid))) +} + +func GetEssenceMsgList(s *httpServer, c *gin.Context) { + gid, _ := strconv.ParseInt(getParam(c, "group_id"), 10, 64) + c.JSON(200, s.bot.CQGetEssenceMessageList(gid)) +} + func getParamOrDefault(c *gin.Context, k, def string) string { r := getParam(c, k) if r != "" { @@ -545,11 +560,13 @@ var httpApi = map[string]func(s *httpServer, c *gin.Context){ "get_group_root_files": GetGroupRootFiles, "get_group_files_by_folder": GetGroupFilesByFolderId, "get_group_file_url": GetGroupFileUrl, + "get_essence_msg_list": GetEssenceMsgList, "send_msg": SendMessage, "send_group_msg": SendGroupMessage, "send_group_forward_msg": SendGroupForwardMessage, "send_private_msg": SendPrivateMessage, "delete_msg": DeleteMessage, + "delete_essence_msg": DeleteEssenceMsg, "set_friend_add_request": ProcessFriendRequest, "set_group_add_request": ProcessGroupRequest, "set_group_card": SetGroupCard, @@ -559,6 +576,7 @@ var httpApi = map[string]func(s *httpServer, c *gin.Context){ "set_group_whole_ban": SetWholeBan, "set_group_name": SetGroupName, "set_group_admin": SetGroupAdmin, + "set_essence_msg": SetEssenceMsg, "set_restart": SetRestart, "_send_group_notice": SendGroupNotice, "set_group_leave": SetGroupLeave, diff --git a/server/websocket.go b/server/websocket.go index 78e0ae0..6b7a829 100644 --- a/server/websocket.go +++ b/server/websocket.go @@ -589,6 +589,15 @@ var wsAPI = map[string]func(*coolq.CQBot, gjson.Result) coolq.MSG{ "set_group_portrait": func(bot *coolq.CQBot, p gjson.Result) coolq.MSG { return bot.CQSetGroupPortrait(p.Get("group_id").Int(), p.Get("file").String(), p.Get("cache").String()) }, + "set_essence_msg": func(bot *coolq.CQBot, p gjson.Result) coolq.MSG { + return bot.CQSetEssenceMessage(int32(p.Get("message_id").Int())) + }, + "delete_essence_msg": func(bot *coolq.CQBot, p gjson.Result) coolq.MSG { + return bot.CQDeleteEssenceMessage(int32(p.Get("message_id").Int())) + }, + "get_essence_msg_list": func(bot *coolq.CQBot, p gjson.Result) coolq.MSG { + return bot.CQGetEssenceMessageList(p.Get("group_id").Int()) + }, "set_group_anonymous_ban": func(bot *coolq.CQBot, p gjson.Result) coolq.MSG { obj := p.Get("anonymous") flag := p.Get("anonymous_flag")