From 0f21f89ad02ce3ded9aed51b144c40dd4ac7b3f9 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, 22 Nov 2023 22:31:41 +0900 Subject: [PATCH] optimize: media print --- helper.go | 17 +++++++++++++++++ openapi_message.go | 37 +++++++++++++++++++++++++++++++------ 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/helper.go b/helper.go index 11291c8..a7cb772 100644 --- a/helper.go +++ b/helper.go @@ -5,6 +5,7 @@ import ( "encoding/hex" "hash/crc64" "net/url" + "regexp" "runtime" "strings" "unsafe" @@ -146,3 +147,19 @@ func DigestID(id string) uint64 { } return crc64.Checksum(b, crc64.MakeTable(crc64.ECMA)) } + +const mediafilebed = `https://multimedia.nt.qq.com.cn` + +var mediafileinfourlre = regexp.MustCompile(`/download\?appid=\d+&fileid=[0-9A-Za-z-_]+&rkey=[0-9A-Za-z-_]+`) + +// mediaURL 从 fileinfo 得到 URL +func mediaURL(fileinfo string) (string, error) { + sb := strings.Builder{} + data, err := base64.StdEncoding.DecodeString(fileinfo) + if err != nil { + return "", err + } + sb.WriteString(mediafilebed) + sb.Write(mediafileinfourlre.Find(data)) + return sb.String(), nil +} diff --git a/openapi_message.go b/openapi_message.go index bddcefa..3ae65dc 100644 --- a/openapi_message.go +++ b/openapi_message.go @@ -1,7 +1,6 @@ package nano import ( - "encoding/base64" "encoding/json" "reflect" "strconv" @@ -27,8 +26,8 @@ type Message struct { FileUUID string `json:"file_uuid"` FileInfo string `json:"file_info"` Content string `json:"content"` - Timestamp time.Time `json:"timestamp"` - EditedTimestamp time.Time `json:"edited_timestamp"` + Timestamp *time.Time `json:"timestamp"` + EditedTimestamp *time.Time `json:"edited_timestamp"` FileInfoTTL int `json:"ttl"` MentionEveryone bool `json:"mention_everyone"` Author *User `json:"author"` @@ -47,6 +46,27 @@ type Message struct { // "=> ギルド:", ctx.Message.GuildID+", 频道:", ctx.Message.ChannelID+", 用户:", ctx.Message.Author.Username+"("+ctx.Message.Author.ID+"), 内容:", ctx.Message.Content func (m *Message) String() string { sb := strings.Builder{} + if m.Timestamp != nil { + sb.WriteString(m.Timestamp.Format(time.DateTime)) + } + if m.FileUUID != "" { + sb.WriteString("富媒体: ") + sb.WriteString(m.FileUUID) + sb.WriteString(", 有效期: ") + if m.FileInfoTTL == 0 { + sb.WriteString("长期") + } else { + sb.WriteString(strconv.Itoa(m.FileInfoTTL)) + sb.WriteByte('s') + } + u, err := mediaURL(m.FileInfo) + if err == nil { + sb.WriteString(", URL: ") + sb.WriteString(u) + } + sb.WriteString(", URL: ") + return sb.String() + } if m.SeqInChannel != "" { sb.WriteByte('[') sb.WriteString(m.SeqInChannel) @@ -310,9 +330,9 @@ func (mp *MessagePost) String() string { } if mp.Media != nil { sb.WriteString(", 富媒体: ") - data, err := base64.StdEncoding.DecodeString(mp.Media.FileInfo) + u, err := mediaURL(mp.Media.FileInfo) if err == nil { - sb.Write(data) + sb.WriteString(u) } else { sb.WriteString(mp.Media.FileInfo) } @@ -354,7 +374,12 @@ func (bot *Bot) postMessageTo(ep string, content *MessagePost) (*Message, error) if err != nil { return nil, errors.Wrap(err, getThisFuncName()) } - return bot.postOpenAPIofMessage(ep, contenttype, body) + m, err := bot.postOpenAPIofMessage(ep, contenttype, body) + if err != nil { + return nil, errors.Wrap(err, getThisFuncName()) + } + logrus.Infoln(getLogHeader(), "=> 消息结果:", m) + return m, nil } // PostMessageToChannel 向 channel_id 指定的子频道发送消息