diff --git a/coolq/api.go b/coolq/api.go index c6a3295..ba117e2 100644 --- a/coolq/api.go +++ b/coolq/api.go @@ -260,10 +260,11 @@ func (bot *CQBot) CQSendGroupForwardMessage(groupId int64, m gjson.Result) MSG { SenderId: sender.Uin, SenderName: (&sender).DisplayName(), Time: func() int32 { - if hasCustom { + msgTime := m["time"].(int32) + if hasCustom && msgTime == 0 { return int32(ts.Unix()) } - return m["time"].(int32) + return msgTime }(), Message: bot.ConvertStringMessage(m["message"].(string), true), }) @@ -273,6 +274,8 @@ func (bot *CQBot) CQSendGroupForwardMessage(groupId int64, m gjson.Result) MSG { return } uin, _ := strconv.ParseInt(e.Get("data.uin").Str, 10, 64) + msgTime, err := strconv.ParseInt(e.Get("data.time").Str, 10, 64) + if err != nil { msgTime = ts.Unix()} name := e.Get("data.name").Str c := e.Get("data.content") if c.IsArray() { @@ -292,7 +295,7 @@ func (bot *CQBot) CQSendGroupForwardMessage(groupId int64, m gjson.Result) MSG { nodes = append(nodes, &message.ForwardNode{ SenderId: uin, SenderName: name, - Time: int32(ts.Unix()), + Time: int32(msgTime), Message: []message.IMessageElement{bot.Client.UploadGroupForwardMessage(groupId, &message.ForwardMessage{Nodes: taowa})}, }) return @@ -325,7 +328,7 @@ func (bot *CQBot) CQSendGroupForwardMessage(groupId int64, m gjson.Result) MSG { nodes = append(nodes, &message.ForwardNode{ SenderId: uin, SenderName: name, - Time: int32(ts.Unix()), + Time: int32(msgTime), Message: newElem, }) return @@ -343,7 +346,7 @@ func (bot *CQBot) CQSendGroupForwardMessage(groupId int64, m gjson.Result) MSG { if len(sendNodes) > 0 { gm := bot.Client.SendGroupForwardMessage(groupId, &message.ForwardMessage{Nodes: sendNodes}) return OK(MSG{ - "message_id": ToGlobalId(groupId, gm.Id), + "message_id": bot.InsertGroupMessage(gm), }) } return Failed(100) diff --git a/coolq/cqcode.go b/coolq/cqcode.go index 52866cd..2b33477 100644 --- a/coolq/cqcode.go +++ b/coolq/cqcode.go @@ -18,6 +18,7 @@ import ( "runtime" "strconv" "strings" + "time" "github.com/Mrs4s/MiraiGo/binary" "github.com/Mrs4s/MiraiGo/message" @@ -411,6 +412,7 @@ func (bot *CQBot) ConvertStringMessage(msg string, group bool) (r []message.IMes } } mid, err := strconv.Atoi(params["id"]) + customText := params["text"] if err == nil { org := bot.GetMessage(int32(mid)) if org != nil { @@ -424,6 +426,25 @@ func (bot *CQBot) ConvertStringMessage(msg string, group bool) (r []message.IMes }, r...) return } + } else if customText != "" { + sender, err := strconv.ParseInt(params["qq"], 10, 64) + if err != nil { + log.Warnf("警告:自定义Reply 元素中必须包含QQ的Uin") + return + } + msgTime, err := strconv.ParseInt(params["time"], 10, 64) + if err != nil { + msgTime = time.Now().Unix() + } + r = append([]message.IMessageElement{ + &message.ReplyElement{ + ReplySeq: int32(0), + Sender: sender, + Time: int32(msgTime), + Elements: bot.ConvertStringMessage(customText, group), + }, + }, r...) + return } } if t == "forward" { // 单独处理转发 @@ -490,6 +511,7 @@ func (bot *CQBot) ConvertObjectMessage(m gjson.Result, group bool) (r []message. } } mid, err := strconv.Atoi(e.Get("data").Get("id").String()) + customText := e.Get("data").Get("text").String() if err == nil { org := bot.GetMessage(int32(mid)) if org != nil { @@ -503,6 +525,25 @@ func (bot *CQBot) ConvertObjectMessage(m gjson.Result, group bool) (r []message. }, r...) return } + } else if customText != "" { + sender, err := strconv.ParseInt(e.Get("data").Get("qq").String(), 10, 64) + if err != nil { + log.Warnf("警告:自定义Reply 元素中必须包含QQ的Uin") + return + } + msgTime, err := strconv.ParseInt(e.Get("data").Get("time").String(), 10, 64) + if err != nil { + msgTime = time.Now().Unix() + } + r = append([]message.IMessageElement{ + &message.ReplyElement{ + ReplySeq: int32(0), + Sender: sender, + Time: int32(msgTime), + Elements: bot.ConvertStringMessage(customText, group), + }, + }, r...) + return } } if t == "forward" { diff --git a/docs/cqhttp.md b/docs/cqhttp.md index 0a511ac..c17dda6 100644 --- a/docs/cqhttp.md +++ b/docs/cqhttp.md @@ -94,13 +94,23 @@ Type : `reply` 范围: **发送/接收** +> 注意: 如果id存在则优先处理id + 参数: | 参数名 | 类型 | 说明 | | ------ | ---- | ------------------------------------- | | `id` | int | 回复时所引用的消息id, 必须为本群消息. | +| `text` | string | 自定义回复的信息 | +| `qq` | int64 | 自定义回复时的自定义QQ, 如果使用自定义信息必须指定. | +| `time` | int64 | 自定义回复时的时间, 格式为Unix时间 | + + + +示例: `[CQ:reply,id=123456]` +\ +自定义回复示例: `[CQ:reply,text=Hello World,qq=10086,time=3376656000]` -示例: `[CQ:reply,id=123456]` ### 红包 @@ -197,7 +207,7 @@ Type: `node` | `id` | int32 | 转发消息id | 直接引用他人的消息合并转发, 实际查看顺序为原消息发送顺序 **与下面的自定义消息二选一** | | `name` | string | 发送者显示名字 | 用于自定义消息 (自定义消息并合并转发,实际查看顺序为自定义消息段顺序) | | `uin` | int64 | 发送者QQ号 | 用于自定义消息 | -| `content` | message | 具体消息 | 用于自定义消息 **不支持引用回复** | +| `content` | message | 具体消息 | 用于自定义消息 | 特殊说明: **需要使用单独的API `/send_group_forward_msg` 发送,并且由于消息段较为复杂,仅支持Array形式入参。 如果引用消息和自定义消息同时出现,实际查看顺序将取消息段顺序. 另外按 [CQHTTP](https://cqhttp.cc/docs/4.15/#/Message?id=格式) 文档说明, `data` 应全为字符串, 但由于需要接收`message` 类型的消息, 所以 *仅限此Type的content字段* 支持Array套娃** @@ -259,7 +269,8 @@ Type: `node` "data": { "name": "自定义发送者", "uin": "10086", - "content": "我是自定义消息" + "content": "我是自定义消息", + "time": "3376656000" } }, { @@ -539,6 +550,12 @@ Type: `tts` | `group_id` | int64 | 群号 | | `messages` | forward node[] | 自定义转发消息, 具体看CQCode | +响应数据 + +| 字段 | 类型 | 说明 | +| ------------ | ------ | ------ | +| `message_id` | string | 消息id | + ### 获取中文分词 终结点: `/.get_word_slices`