From b79077c9d712ce18bc3d9916acfa8efe41970895 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 17:45:06 +0900 Subject: [PATCH] feat: new message media api --- context.go | 48 +++++++++++++++++++++++-------------------- openapi_message.go | 8 ++++++++ openapi_v2_files.go | 13 +++++++----- openapi_v2_message.go | 3 +++ 4 files changed, 45 insertions(+), 27 deletions(-) diff --git a/context.go b/context.go index d6147c9..f7d34d5 100644 --- a/context.go +++ b/context.go @@ -134,6 +134,14 @@ func (ctx *Ctx) Send(messages Messages) (m []*Message, err error) { } else if OnlyQQPrivate(ctx) { reply, err = ctx.PostFileToQQUser(ctx.Message.Author.ID, fp) } + if err != nil { + return + } + reply, err = ctx.Post(isnextreply, &MessagePost{ + Type: MessageTypeMedia, + Content: " ", + Media: &MessageMedia{FileInfo: reply.FileInfo}, + }) m = append(m, reply) if err != nil { return @@ -203,6 +211,10 @@ func (ctx *Ctx) SendPlainMessage(replytosender bool, printable ...any) (*Message // SendImage 发送带图片消息到对方 func (ctx *Ctx) SendImage(file string, replytosender bool, caption ...any) (reply *Message, err error) { + post := &MessagePost{ + Content: HideURL(fmt.Sprint(caption...)), + } + if OnlyQQ(ctx) { if strings.HasPrefix(file, "file:///") { data, err := os.ReadFile(file[8:]) @@ -229,25 +241,27 @@ func (ctx *Ctx) SendImage(file string, replytosender bool, caption ...any) (repl Type: FileTypeImage, URL: file, } - if len(caption) > 0 { + /*if len(caption) > 0 { _, _ = ctx.SendPlainMessage(replytosender, caption...) + }*/ + if post.Content == "" { + post.Content = " " } if OnlyQQGroup(ctx) { reply, err = ctx.PostFileToQQGroup(ctx.Message.ChannelID, fp) } else if OnlyQQPrivate(ctx) { reply, err = ctx.PostFileToQQUser(ctx.Message.Author.ID, fp) } - return - } - - post := &MessagePost{ - Content: HideURL(fmt.Sprint(caption...)), - } - - if strings.HasPrefix(file, "http") { - post.Image = file + if err != nil { + return + } + post.Media = &MessageMedia{FileInfo: reply.FileInfo} } else { - post.ImageFile = file + if strings.HasPrefix(file, "http") { + post.Image = file + } else { + post.ImageFile = file + } } return ctx.Post(replytosender, post) @@ -260,17 +274,7 @@ func (ctx *Ctx) SendImageBytes(data []byte, replytosender bool, caption ...any) if err != nil { return nil, err } - fp := &FilePost{ - Type: FileTypeImage, - URL: file, - } - if len(caption) > 0 { - _, _ = ctx.SendPlainMessage(replytosender, caption...) - } - if OnlyQQGroup(ctx) { - return ctx.PostFileToQQGroup(ctx.Message.ChannelID, fp) - } - return ctx.PostFileToQQUser(ctx.Message.Author.ID, fp) + return ctx.SendImage(file, replytosender, caption...) } post := &MessagePost{ diff --git a/openapi_message.go b/openapi_message.go index 94b5f29..8524bef 100644 --- a/openapi_message.go +++ b/openapi_message.go @@ -23,9 +23,12 @@ type Message struct { ChannelID string `json:"channel_id"` GuildID string `json:"guild_id"` GroupOpenID string `json:"group_openid"` + 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"` + FileInfoTTL int `json:"ttl"` MentionEveryone bool `json:"mention_everyone"` Author *User `json:"author"` Attachments []MessageAttachment `json:"attachments"` @@ -239,6 +242,7 @@ type MessagePost struct { ReplyEventID string `json:"event_id,omitempty"` Markdown *MessageMarkdown `json:"markdown,omitempty"` KeyBoard *MessageKeyboard `json:"keyboard,omitempty"` + Media *MessageMedia `json:"media,omitempty"` } func (mp *MessagePost) String() string { @@ -303,6 +307,10 @@ func (mp *MessagePost) String() string { sb.WriteString(", KB模版: ") sb.WriteString(mp.KeyBoard.ID) } + if mp.Media != nil { + sb.WriteString(", 富媒体: ") + sb.WriteString(mp.Media.FileInfo) + } return sb.String() } diff --git a/openapi_v2_files.go b/openapi_v2_files.go index a012282..4b09de3 100644 --- a/openapi_v2_files.go +++ b/openapi_v2_files.go @@ -36,9 +36,9 @@ func (ft FileType) String() string { // // https://bot.q.qq.com/wiki/develop/api-231017/server-inter/message/send-receive/rich-text-media.html type FilePost struct { - Type FileType `json:"file_type"` - URL string `json:"url"` - MotherFuckingAlwaysTrue bool `json:"srv_send_msg"` + Type FileType `json:"file_type"` + URL string `json:"url"` + IsPositive bool `json:"srv_send_msg"` // IsPositive // file_data 否 【暂未支持】 } @@ -61,7 +61,6 @@ func (fp *FilePost) String() string { // https://bot.q.qq.com/wiki/develop/api-231017/server-inter/message/send-receive/rich-text-media.html#%E5%8F%91%E9%80%81%E5%88%B0%E5%8D%95%E8%81%8A func (bot *Bot) PostFileToQQUser(id string, content *FilePost) (*Message, error) { logrus.Infoln(getLogHeader(), "<= [Q]单:", id+",", content) - content.MotherFuckingAlwaysTrue = true return bot.postOpenAPIofMessage("/v2/users/"+id+"/files", "", WriteBodyFromJSON(content)) } @@ -70,6 +69,10 @@ func (bot *Bot) PostFileToQQUser(id string, content *FilePost) (*Message, error) // https://bot.q.qq.com/wiki/develop/api-231017/server-inter/message/send-receive/rich-text-media.html#%E5%8F%91%E9%80%81%E5%88%B0%E7%BE%A4%E8%81%8A func (bot *Bot) PostFileToQQGroup(id string, content *FilePost) (*Message, error) { logrus.Infoln(getLogHeader(), "<= [Q]群:", id+",", content) - content.MotherFuckingAlwaysTrue = true return bot.postOpenAPIofMessage("/v2/groups/"+id+"/files", "", WriteBodyFromJSON(content)) } + +// MessageMedia used in MessagePost +type MessageMedia struct { + FileInfo string `json:"file_info"` +} diff --git a/openapi_v2_message.go b/openapi_v2_message.go index 148c6eb..40a99b8 100644 --- a/openapi_v2_message.go +++ b/openapi_v2_message.go @@ -14,6 +14,9 @@ const ( MessageTypeMarkdown MessageTypeArk MessageTypeEmbed + MessageTypeUnk1 + MessageTypeUnk2 + MessageTypeMedia ) func (mt2 MessageType) String() string {