Skip to content

Commit 4510261

Browse files
committed
多项改动
修复: - SendGroupForwardMessage 添加发送失败Handler - 禁言逻辑修复, 可以进行30(整)天的禁言 - 添加无法撤回临时信息Handling - 临时会话发送与接收信息入库 (暂时不能撤回信息, Fixes Mrs4s#495) 更改: - 临时会话中的变量改名 (code -> groupId) - 警告信息添加空格 (见cqcode.go) - 更新文档: 添加seq说明, 缩短某个网址, 添加某个CQcode定义的导向 添加: - 为自定义reply添加seq选项让信息更具真实性 - 添加删除好友处理 (Mrs4s/MiraiGo#129, Fixes Mrs4s#374)
1 parent b385ed2 commit 4510261

5 files changed

Lines changed: 66 additions & 15 deletions

File tree

coolq/api.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -423,9 +423,13 @@ func (bot *CQBot) CQSendGroupForwardMessage(groupID int64, m gjson.Result) MSG {
423423
sendNodes = convert(m)
424424
}
425425
if len(sendNodes) > 0 {
426-
gm := bot.Client.SendGroupForwardMessage(groupID, &message.ForwardMessage{Nodes: sendNodes})
426+
ret := bot.Client.SendGroupForwardMessage(groupID, &message.ForwardMessage{Nodes: sendNodes})
427+
if ret == nil || ret.Id == -1 {
428+
log.Warnf("合并转发(群)消息发送失败: 账号可能被风控.")
429+
return Failed(100, "SEND_MSG_API_ERROR", "请参考输出")
430+
}
427431
return OK(MSG{
428-
"message_id": bot.InsertGroupMessage(gm),
432+
"message_id": bot.InsertGroupMessage(ret),
429433
})
430434
}
431435
return Failed(100)
@@ -547,7 +551,7 @@ func (bot *CQBot) CQSetGroupBan(groupID, userID int64, duration uint32) MSG {
547551
if m := g.FindMember(userID); m != nil {
548552
err := m.Mute(duration)
549553
if err != nil {
550-
if duration >= 2592000 {
554+
if duration > 2592000 {
551555
return Failed(100, "DURATION_IS_NOT_IN_RANGE", "非法的禁言时长")
552556
}
553557
return Failed(100, "NOT_MANAGEABLE", "机器人权限不足")
@@ -663,6 +667,11 @@ func (bot *CQBot) CQDeleteMessage(messageID int32) MSG {
663667
return Failed(100, "MESSAGE_NOT_FOUND", "消息不存在")
664668
}
665669
if _, ok := msg["group"]; ok {
670+
if msg["internal-id"] == nil {
671+
// TODO 撤回临时对话消息
672+
log.Warnf("撤回 %v 失败: 无法撤回临时对话消息", messageID)
673+
return Failed(100, "CANNOT_RECALL_TEMP_MSG", "无法撤回临时对话消息")
674+
}
666675
if err := bot.Client.RecallGroupMessage(msg["group"].(int64), msg["message-id"].(int32), msg["internal-id"].(int32)); err != nil {
667676
log.Warnf("撤回 %v 失败: %v", messageID, err)
668677
return Failed(100, "RECALL_API_ERROR", err.Error())

coolq/bot.go

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ func (bot *CQBot) SendPrivateMessage(target int64, m *message.SendingMessage) in
295295
} else if code, ok := bot.tempMsgCache.Load(target); ok { // 临时会话
296296
msg := bot.Client.SendTempMessage(code.(int64), target, m)
297297
if msg != nil {
298-
id = msg.Id
298+
id = bot.InsertTempMessage(target, msg)
299299
}
300300
} else if _, ok := bot.oneWayMsgCache.Load(target); ok { // 单向好友
301301
msg := bot.Client.SendPrivateMessage(target, m)
@@ -360,6 +360,33 @@ func (bot *CQBot) InsertPrivateMessage(m *message.PrivateMessage) int32 {
360360
return id
361361
}
362362

363+
// InsertTempMessage 临时消息入数据库
364+
func (bot *CQBot) InsertTempMessage(target int64, m *message.TempMessage) int32 {
365+
val := MSG{
366+
"message-id": m.Id,
367+
// FIXME(InsertTempMessage) InternalId missing
368+
"group": m.GroupCode,
369+
"group-name": m.GroupName,
370+
"target": target,
371+
"sender": m.Sender,
372+
"time": time.Now().Unix(),
373+
"message": ToStringMessage(m.Elements, m.Sender.Uin, true),
374+
}
375+
id := toGlobalID(m.Sender.Uin, m.Id)
376+
if bot.db != nil {
377+
buf := new(bytes.Buffer)
378+
if err := gob.NewEncoder(buf).Encode(val); err != nil {
379+
log.Warnf("记录聊天数据时出现错误: %v", err)
380+
return -1
381+
}
382+
if err := bot.db.Put(binary.ToBytes(id), binary.GZipCompress(buf.Bytes()), nil); err != nil {
383+
log.Warnf("记录聊天数据时出现错误: %v", err)
384+
return -1
385+
}
386+
}
387+
return id
388+
}
389+
363390
// toGlobalID 构建`code`-`msgID`的字符串并返回其CRC32 Checksum的值
364391
func toGlobalID(code int64, msgID int32) int32 {
365392
return int32(crc32.ChecksumIEEE([]byte(fmt.Sprintf("%d-%d", code, msgID))))

coolq/cqcode.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -390,16 +390,20 @@ func (bot *CQBot) ConvertStringMessage(s string, isGroup bool) (r []message.IMes
390390
} else if customText != "" {
391391
sender, err := strconv.ParseInt(d["qq"], 10, 64)
392392
if err != nil {
393-
log.Warnf("警告:自定义 Reply 元素中必须包含Uin")
393+
log.Warnf("警告:自定义 Reply 元素中必须包含 Uin")
394394
return
395395
}
396396
msgTime, err := strconv.ParseInt(d["time"], 10, 64)
397397
if err != nil {
398398
msgTime = time.Now().Unix()
399399
}
400+
messageSeq, err := strconv.ParseInt(d["seq"], 10, 64)
401+
if err != nil {
402+
messageSeq = 0
403+
}
400404
r = append([]message.IMessageElement{
401405
&message.ReplyElement{
402-
ReplySeq: int32(0),
406+
ReplySeq: int32(messageSeq),
403407
Sender: sender,
404408
Time: int32(msgTime),
405409
Elements: bot.ConvertStringMessage(customText, isGroup),
@@ -530,16 +534,20 @@ func (bot *CQBot) ConvertObjectMessage(m gjson.Result, isGroup bool) (r []messag
530534
} else if customText != "" {
531535
sender, err := strconv.ParseInt(e.Get("data").Get("qq").String(), 10, 64)
532536
if err != nil {
533-
log.Warnf("警告:自定义 Reply 元素中必须包含Uin")
537+
log.Warnf("警告:自定义 Reply 元素中必须包含 Uin")
534538
return
535539
}
536540
msgTime, err := strconv.ParseInt(e.Get("data").Get("time").String(), 10, 64)
537541
if err != nil {
538542
msgTime = time.Now().Unix()
539543
}
544+
messageSeq, err := strconv.ParseInt(e.Get("data").Get("seq").String(), 10, 64)
545+
if err != nil {
546+
messageSeq = 0
547+
}
540548
r = append([]message.IMessageElement{
541549
&message.ReplyElement{
542-
ReplySeq: int32(0),
550+
ReplySeq: int32(messageSeq),
543551
Sender: sender,
544552
Time: int32(msgTime),
545553
Elements: bot.ConvertStringMessage(customText, isGroup),

coolq/event.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,16 +103,20 @@ func (bot *CQBot) groupMessageEvent(c *client.QQClient, m *message.GroupMessage)
103103

104104
func (bot *CQBot) tempMessageEvent(c *client.QQClient, m *message.TempMessage) {
105105
bot.checkMedia(m.Elements)
106-
cqm := ToStringMessage(m.Elements, 0, true)
106+
cqm := ToStringMessage(m.Elements, m.Sender.Uin, true)
107107
bot.tempMsgCache.Store(m.Sender.Uin, m.GroupCode)
108+
id := m.Id
109+
if bot.db != nil {
110+
id = bot.InsertTempMessage(m.Sender.Uin, m)
111+
}
108112
log.Infof("收到来自群 %v(%v) 内 %v(%v) 的临时会话消息: %v", m.GroupName, m.GroupCode, m.Sender.DisplayName(), m.Sender.Uin, cqm)
109113
tm := MSG{
110114
"post_type": "message",
111115
"message_type": "private",
112116
"sub_type": "group",
113-
"message_id": m.Id,
117+
"message_id": id,
114118
"user_id": m.Sender.Uin,
115-
"message": ToFormattedMessage(m.Elements, 0, false),
119+
"message": ToFormattedMessage(m.Elements, m.Sender.Uin, false),
116120
"raw_message": cqm,
117121
"font": 0,
118122
"self_id": c.Uin,

docs/cqhttp.md

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,12 +111,13 @@ Type : `reply`
111111
| `text` | string | 自定义回复的信息 |
112112
| `qq` | int64 | 自定义回复时的自定义QQ, 如果使用自定义信息必须指定. |
113113
| `time` | int64 | 可选. 自定义回复时的时间, 格式为Unix时间 |
114+
| `seq` | int64 | 起始消息序号, 可通过 `get_msg` 获得 |
114115

115116

116117

117118
示例: `[CQ:reply,id=123456]`
118119
\
119-
自定义回复示例: `[CQ:reply,text=Hello World,qq=10086,time=3376656000]`
120+
自定义回复示例: `[CQ:reply,text=Hello World,qq=10086,time=3376656000,seq=5123]`
120121

121122
### 音乐分享 <Badge text=""/>
122123

@@ -263,8 +264,9 @@ Type: `node`
263264
| `name` | string | 发送者显示名字 | 用于自定义消息 (自定义消息并合并转发,实际查看顺序为自定义消息段顺序) |
264265
| `uin` | int64 | 发送者QQ号 | 用于自定义消息 |
265266
| `content` | message | 具体消息 | 用于自定义消息 |
267+
| `seq` | message | 具体消息 | 用于自定义消息 |
266268

267-
特殊说明: **需要使用单独的API `/send_group_forward_msg` 发送,并且由于消息段较为复杂,仅支持Array形式入参。 如果引用消息和自定义消息同时出现,实际查看顺序将取消息段顺序. 另外按 [CQHTTP](https://cqhttp.cc/docs/4.15/#/Message?id=格式) 文档说明, `data` 应全为字符串, 但由于需要接收`message` 类型的消息, 所以 *仅限此Type的content字段* 支持Array套娃**
269+
特殊说明: **需要使用单独的API `/send_group_forward_msg` 发送,并且由于消息段较为复杂,仅支持Array形式入参。 如果引用消息和自定义消息同时出现,实际查看顺序将取消息段顺序. 另外按 [CQHTTP](https://git.io/JtxtN) 文档说明, `data` 应全为字符串, 但由于需要接收`message` 类型的消息, 所以 *仅限此Type的content字段* 支持Array套娃**
268270

269271
示例:
270272

@@ -325,6 +327,7 @@ Type: `node`
325327
"name": "自定义发送者",
326328
"uin": "10086",
327329
"content": "我是自定义消息",
330+
"seq": "5123",
328331
"time": "3376656000"
329332
}
330333
},
@@ -603,10 +606,10 @@ Type: `tts`
603606
| 字段 | 类型 | 说明 |
604607
| ---------- | -------------- | ---------------------------- |
605608
| `group_id` | int64 | 群号 |
606-
| `messages` | forward node[] | 自定义转发消息, 具体看CQCode |
609+
| `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) |
607610

608611
响应数据
609-
612+
610613
| 字段 | 类型 | 说明 |
611614
| ------------ | ------ | ------ |
612615
| `message_id` | string | 消息id |

0 commit comments

Comments
 (0)