1
0
mirror of https://github.com/Mrs4s/go-cqhttp.git synced 2025-05-04 19:17:37 +08:00

revert: re-include url in message (#1521)

* revert: re-include url in message

* fix: wrong writer usage

* fix: composite literal uses unkeyed fields

* 优化buffer

* fix: illegal use of non-zero Builder

* fix: illegal use of non-zero Builder

* fix: make lint happy

* fix: replace io.Writer to *strings.Builder

* fix: replace io.Writer to *strings.Builder
This commit is contained in:
源文雨 2022-05-30 14:17:34 +08:00 committed by GitHub
parent 43ea459365
commit 15602e1daa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 77 additions and 71 deletions

View File

@ -1561,7 +1561,7 @@ func (bot *CQBot) CQGetForwardMessage(resID string) global.MSG {
r := make([]global.MSG, len(nodes))
for i, n := range nodes {
bot.checkMedia(n.Message, 0)
content := ToFormattedMessage(n.Message, message.Source{SourceType: message.SourceGroup}, false)
content := ToFormattedMessage(n.Message, message.Source{SourceType: message.SourceGroup})
if len(n.Message) == 1 {
if forward, ok := n.Message[0].(*message.ForwardMessage); ok {
content = transformNodes(forward.Nodes)
@ -1610,9 +1610,9 @@ func (bot *CQBot) CQGetMessage(messageID int32) global.MSG {
switch o := msg.(type) {
case *db.StoredGroupMessage:
m["group_id"] = o.GroupCode
m["message"] = ToFormattedMessage(bot.ConvertContentMessage(o.Content, message.SourceGroup), message.Source{SourceType: message.SourceGroup, PrimaryID: o.GroupCode}, false)
m["message"] = ToFormattedMessage(bot.ConvertContentMessage(o.Content, message.SourceGroup), message.Source{SourceType: message.SourceGroup, PrimaryID: o.GroupCode})
case *db.StoredPrivateMessage:
m["message"] = ToFormattedMessage(bot.ConvertContentMessage(o.Content, message.SourcePrivate), message.Source{SourceType: message.SourcePrivate}, false)
m["message"] = ToFormattedMessage(bot.ConvertContentMessage(o.Content, message.SourcePrivate), message.Source{SourceType: message.SourcePrivate})
}
return OK(m)
}
@ -1657,7 +1657,7 @@ func (bot *CQBot) CQGetGuildMessage(messageID string, noCache bool) global.MSG {
"tiny_id": fU64(pull[0].Sender.TinyId),
"nickname": pull[0].Sender.Nickname,
}
m["message"] = ToFormattedMessage(pull[0].Elements, source, false)
m["message"] = ToFormattedMessage(pull[0].Elements, source)
m["reactions"] = convertReactions(pull[0].Reactions)
bot.InsertGuildChannelMessage(pull[0])
} else {
@ -1672,7 +1672,7 @@ func (bot *CQBot) CQGetGuildMessage(messageID string, noCache bool) global.MSG {
"tiny_id": fU64(channelMsgByDB.Attribute.SenderTinyID),
"nickname": channelMsgByDB.Attribute.SenderName,
}
m["message"] = ToFormattedMessage(bot.ConvertContentMessage(channelMsgByDB.Content, message.SourceGuildChannel), source, false)
m["message"] = ToFormattedMessage(bot.ConvertContentMessage(channelMsgByDB.Content, message.SourceGuildChannel), source)
}
case message.SourceGuildDirect:
// todo(mrs4s): 支持 direct 消息

View File

@ -65,7 +65,7 @@ func (bot *CQBot) formatGroupMessage(m *message.GroupMessage) *event {
SourceType: message.SourceGroup,
PrimaryID: m.GroupCode,
}
cqm := toStringMessage(m.Elements, source, true)
cqm := toStringMessage(m.Elements, source)
typ := "message/group/normal"
if m.Sender.Uin == bot.Client.Uin {
typ = "message_sent/group/normal"
@ -74,7 +74,7 @@ func (bot *CQBot) formatGroupMessage(m *message.GroupMessage) *event {
"anonymous": nil,
"font": 0,
"group_id": m.GroupCode,
"message": ToFormattedMessage(m.Elements, source, false),
"message": ToFormattedMessage(m.Elements, source),
"message_type": "group",
"message_seq": m.Id,
"raw_message": cqm,
@ -210,11 +210,11 @@ func convertReactions(reactions []*message.GuildMessageEmojiReaction) (r []globa
return
}
func toStringMessage(m []message.IMessageElement, source message.Source, raw bool) string {
elems := toElements(m, source, raw)
func toStringMessage(m []message.IMessageElement, source message.Source) string {
elems := toElements(m, source)
var sb strings.Builder
for _, elem := range elems {
sb.WriteString(elem.CQCode())
elem.WriteCQCodeTo(&sb)
}
return sb.String()
}

View File

@ -95,7 +95,7 @@ func replyID(r *message.ReplyElement, source message.Source) int32 {
// toElements 将消息元素数组转为MSG数组以用于消息上报
//
// nolint:govet
func toElements(e []message.IMessageElement, source message.Source, raw bool) (r []cqcode.Element) {
func toElements(e []message.IMessageElement, source message.Source) (r []cqcode.Element) {
type pair = cqcode.Pair // simplify code
type pairs = []pair
@ -111,7 +111,7 @@ func toElements(e []message.IMessageElement, source message.Source, raw bool) (r
elem := cqcode.Element{
Type: "reply",
Data: pairs{
{"id", strconv.FormatInt(int64(id), 10)},
{K: "id", V: strconv.FormatInt(int64(id), 10)},
},
}
if base.ExtraReplyData {
@ -119,7 +119,7 @@ func toElements(e []message.IMessageElement, source message.Source, raw bool) (r
pair{K: "seq", V: strconv.FormatInt(int64(replyElem.ReplySeq), 10)},
pair{K: "qq", V: strconv.FormatInt(replyElem.Sender, 10)},
pair{K: "time", V: strconv.FormatInt(int64(replyElem.Time), 10)},
pair{K: "text", V: toStringMessage(replyElem.Elements, source, true)},
pair{K: "text", V: toStringMessage(replyElem.Elements, source)},
)
}
r = append(r, elem)
@ -139,14 +139,14 @@ func toElements(e []message.IMessageElement, source message.Source, raw bool) (r
m = cqcode.Element{
Type: "text",
Data: pairs{
{"text", o.Content},
{K: "text", V: o.Content},
},
}
case *message.LightAppElement:
m = cqcode.Element{
Type: "json",
Data: pairs{
{"data", o.Content},
{K: "data", V: o.Content},
},
}
case *message.AtElement:
@ -157,53 +157,51 @@ func toElements(e []message.IMessageElement, source message.Source, raw bool) (r
m = cqcode.Element{
Type: "at",
Data: pairs{
{"qq", target},
{K: "qq", V: target},
},
}
case *message.RedBagElement:
m = cqcode.Element{
Type: "redbag",
Data: pairs{
{"title", o.Title},
{K: "title", V: o.Title},
},
}
case *message.ForwardElement:
m = cqcode.Element{
Type: "forward",
Data: pairs{
{"id", o.ResId},
{K: "id", V: o.ResId},
},
}
case *message.FaceElement:
m = cqcode.Element{
Type: "face",
Data: pairs{
{"id", strconv.FormatInt(int64(o.Index), 10)},
{K: "id", V: strconv.FormatInt(int64(o.Index), 10)},
},
}
case *message.VoiceElement:
m = cqcode.Element{
Type: "record",
Data: pairs{
{"file", o.Name},
{"url", o.Url},
{K: "file", V: o.Name},
{K: "url", V: o.Url},
},
}
case *message.ShortVideoElement:
m = cqcode.Element{
Type: "video",
Data: pairs{
{"file", o.Name},
{"url", o.Url},
{K: "file", V: o.Name},
{K: "url", V: o.Url},
},
}
case *message.GroupImageElement:
data := pairs{
{"file", hex.EncodeToString(o.Md5) + ".image"},
{"subType", strconv.FormatInt(int64(o.ImageBizType), 10)},
}
if raw {
data = append(data, pair{K: "url", V: o.Url})
{K: "file", V: hex.EncodeToString(o.Md5) + ".image"},
{K: "subType", V: strconv.FormatInt(int64(o.ImageBizType), 10)},
{K: "url", V: o.Url},
}
switch {
case o.Flash:
@ -218,10 +216,8 @@ func toElements(e []message.IMessageElement, source message.Source, raw bool) (r
}
case *message.GuildImageElement:
data := pairs{
{"file", hex.EncodeToString(o.Md5) + ".image"},
}
if raw {
data = append(data, pair{K: "url", V: o.Url})
{K: "file", V: hex.EncodeToString(o.Md5) + ".image"},
{K: "url", V: o.Url},
}
m = cqcode.Element{
Type: "image",
@ -229,10 +225,8 @@ func toElements(e []message.IMessageElement, source message.Source, raw bool) (r
}
case *message.FriendImageElement:
data := pairs{
{"file", hex.EncodeToString(o.Md5) + ".image"},
}
if raw {
data = append(data, pair{K: "url", V: o.Url})
{K: "file", V: hex.EncodeToString(o.Md5) + ".image"},
{K: "url", V: o.Url},
}
if o.Flash {
data = append(data, pair{K: "type", V: "flash"})
@ -245,29 +239,29 @@ func toElements(e []message.IMessageElement, source message.Source, raw bool) (r
m = cqcode.Element{
Type: "dice",
Data: pairs{
{"value", strconv.FormatInt(int64(o.Value), 10)},
{K: "value", V: strconv.FormatInt(int64(o.Value), 10)},
},
}
case *message.FingerGuessingElement:
m = cqcode.Element{
Type: "rps",
Data: pairs{
{"value", strconv.FormatInt(int64(o.Value), 10)},
{K: "value", V: strconv.FormatInt(int64(o.Value), 10)},
},
}
case *message.MarketFaceElement:
m = cqcode.Element{
Type: "text",
Data: pairs{
{"text", o.Name},
{K: "text", V: o.Name},
},
}
case *message.ServiceElement:
m = cqcode.Element{
Type: "xml",
Data: pairs{
{"data", o.Content},
{"resid", o.ResId},
{K: "data", V: o.Content},
{K: "resid", V: o.ResId},
},
}
if !strings.Contains(o.Content, "<?xml") {
@ -277,8 +271,8 @@ func toElements(e []message.IMessageElement, source message.Source, raw bool) (r
m = cqcode.Element{
Type: "face",
Data: pairs{
{"id", strconv.FormatInt(int64(o.ID), 10)},
{"type", "sticker"},
{K: "id", V: strconv.FormatInt(int64(o.ID), 10)},
{K: "type", V: "sticker"},
},
}
default:

View File

@ -1,10 +1,11 @@
package cqcode
import (
"fmt"
"bytes"
"strconv"
"strings"
"github.com/Mrs4s/go-cqhttp/global"
"github.com/Mrs4s/MiraiGo/binary"
)
// Element single message
@ -19,12 +20,19 @@ type Pair struct {
V string
}
// CQCode convert to cqcode
// CQCode convert element to cqcode
func (e *Element) CQCode() string {
buf := strings.Builder{}
e.WriteCQCodeTo(&buf)
return buf.String()
}
// WriteCQCodeTo write element's cqcode into sb
func (e *Element) WriteCQCodeTo(sb *strings.Builder) {
if e.Type == "text" {
return EscapeText(e.Data[0].V) // must be {"text": value}
sb.WriteString(EscapeText(e.Data[0].V)) // must be {"text": value}
return
}
var sb strings.Builder
sb.WriteString("[CQ:")
sb.WriteString(e.Type)
for _, data := range e.Data {
@ -34,22 +42,26 @@ func (e *Element) CQCode() string {
sb.WriteString(EscapeValue(data.V))
}
sb.WriteByte(']')
return sb.String()
}
// MarshalJSON see encoding/json.Marshaler
func (e *Element) MarshalJSON() ([]byte, error) {
buf := global.NewBuffer()
defer global.PutBuffer(buf)
fmt.Fprintf(buf, `{"type":"%s","data":{`, e.Type)
for i, data := range e.Data {
if i != 0 {
buf.WriteByte(',')
return binary.NewWriterF(func(w *binary.Writer) {
buf := (*bytes.Buffer)(w)
// fmt.Fprintf(buf, `{"type":"%s","data":{`, e.Type)
buf.WriteString(`{"type":"`)
buf.WriteString(e.Type)
buf.WriteString(`","data":{`)
for i, data := range e.Data {
if i != 0 {
buf.WriteByte(',')
}
// fmt.Fprintf(buf, `"%s":%q`, data.K, data.V)
buf.WriteByte('"')
buf.WriteString(data.K)
buf.WriteString(`":`)
buf.WriteString(strconv.Quote(data.V))
}
fmt.Fprintf(buf, `"%s":%q`, data.K, data.V)
}
buf.WriteString(`}}`)
return append([]byte(nil), buf.Bytes()...), nil
buf.WriteString(`}}`)
}), nil
}

View File

@ -21,11 +21,11 @@ import (
)
// ToFormattedMessage 将给定[]message.IMessageElement转换为通过coolq.SetMessageFormat所定义的消息上报格式
func ToFormattedMessage(e []message.IMessageElement, source message.Source, raw bool) (r interface{}) {
func ToFormattedMessage(e []message.IMessageElement, source message.Source) (r interface{}) {
if base.PostFormat == "string" {
r = toStringMessage(e, source, raw)
r = toStringMessage(e, source)
} else if base.PostFormat == "array" {
r = toElements(e, source, raw)
r = toElements(e, source)
}
return
}
@ -74,7 +74,7 @@ func (bot *CQBot) privateMessageEvent(_ *client.QQClient, m *message.PrivateMess
SourceType: message.SourcePrivate,
PrimaryID: m.Sender.Uin,
}
cqm := toStringMessage(m.Elements, source, true)
cqm := toStringMessage(m.Elements, source)
id := bot.InsertPrivateMessage(m)
log.Infof("收到好友 %v(%v) 的消息: %v (%v)", m.Sender.DisplayName(), m.Sender.Uin, cqm, id)
typ := "message/private/friend"
@ -85,7 +85,7 @@ func (bot *CQBot) privateMessageEvent(_ *client.QQClient, m *message.PrivateMess
"message_id": id,
"user_id": m.Sender.Uin,
"target_id": m.Target,
"message": ToFormattedMessage(m.Elements, source, false),
"message": ToFormattedMessage(m.Elements, source),
"raw_message": cqm,
"font": 0,
"sender": global.MSG{
@ -121,7 +121,7 @@ func (bot *CQBot) groupMessageEvent(c *client.QQClient, m *message.GroupMessage)
SourceType: message.SourceGroup,
PrimaryID: m.GroupCode,
}
cqm := toStringMessage(m.Elements, source, true)
cqm := toStringMessage(m.Elements, source)
id := bot.InsertGroupMessage(m)
log.Infof("收到群 %v(%v) 内 %v(%v) 的消息: %v (%v)", m.GroupName, m.GroupCode, m.Sender.DisplayName(), m.Sender.Uin, cqm, id)
gm := bot.formatGroupMessage(m)
@ -139,7 +139,7 @@ func (bot *CQBot) tempMessageEvent(c *client.QQClient, e *client.TempMessageEven
SourceType: message.SourcePrivate,
PrimaryID: e.Session.Sender,
}
cqm := toStringMessage(m.Elements, source, true)
cqm := toStringMessage(m.Elements, source)
bot.tempSessionCache.Store(m.Sender.Uin, e.Session)
id := m.Id
// todo(Mrs4s)
@ -151,7 +151,7 @@ func (bot *CQBot) tempMessageEvent(c *client.QQClient, e *client.TempMessageEven
"temp_source": e.Session.Source,
"message_id": id,
"user_id": m.Sender.Uin,
"message": ToFormattedMessage(m.Elements, source, false),
"message": ToFormattedMessage(m.Elements, source),
"raw_message": cqm,
"font": 0,
"sender": global.MSG{
@ -177,14 +177,14 @@ func (bot *CQBot) guildChannelMessageEvent(c *client.QQClient, m *message.GuildC
PrimaryID: int64(m.GuildId),
SecondaryID: int64(m.ChannelId),
}
log.Infof("收到来自频道 %v(%v) 子频道 %v(%v) 内 %v(%v) 的消息: %v", guild.GuildName, guild.GuildId, channel.ChannelName, m.ChannelId, m.Sender.Nickname, m.Sender.TinyId, toStringMessage(m.Elements, source, true))
log.Infof("收到来自频道 %v(%v) 子频道 %v(%v) 内 %v(%v) 的消息: %v", guild.GuildName, guild.GuildId, channel.ChannelName, m.ChannelId, m.Sender.Nickname, m.Sender.TinyId, toStringMessage(m.Elements, source))
id := bot.InsertGuildChannelMessage(m)
ev := bot.event("message/guild/channel", global.MSG{
"guild_id": fU64(m.GuildId),
"channel_id": fU64(m.ChannelId),
"message_id": id,
"user_id": fU64(m.Sender.TinyId),
"message": ToFormattedMessage(m.Elements, source, false), // todo: 增加对频道消息 Reply 的支持
"message": ToFormattedMessage(m.Elements, source), // todo: 增加对频道消息 Reply 的支持
"self_tiny_id": fU64(bot.Client.GuildService.TinyId),
"sender": global.MSG{
"user_id": m.Sender.TinyId,