From 3228e7642e493f5b9455ffb6265eccc8214b02a9 Mon Sep 17 00:00:00 2001 From: cosmo Date: Fri, 17 Nov 2023 09:38:40 +0800 Subject: [PATCH 1/4] wtf --- handlers/message_parser.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/handlers/message_parser.go b/handlers/message_parser.go index 1476d896..ebbf7fc9 100644 --- a/handlers/message_parser.go +++ b/handlers/message_parser.go @@ -122,7 +122,7 @@ func parseMessageContent(paramsMessage callapi.ParamsContent) (string, map[strin default: mylog.Println("Unsupported message format: params.message field is not a string, map or slice") } - //mylog.Printf(messageText) + mylog.Printf(messageText) // 正则表达式部分 var localImagePattern *regexp.Regexp @@ -160,7 +160,9 @@ func parseMessageContent(paramsMessage callapi.ParamsContent) (string, map[strin //处理at messageText = transformMessageText(messageText) - + for key, items := range foundItems { + fmt.Printf("Key: %s, Items: %v\n", key, items) + } return messageText, foundItems } @@ -399,8 +401,8 @@ func ConvertToSegmentedMessage(data interface{}) []map[string]interface{} { messageSegments = append(messageSegments, imageSegment) // 在msg.Content中替换旧的图片链接 - newImagePattern := "[CQ:image,file=" + attachment.URL + "]" - msg.Content = msg.Content + newImagePattern + //newImagePattern := "[CQ:image,file=" + attachment.URL + "]" + //msg.Content = msg.Content + newImagePattern } // 将msg.Content里的BotID替换成AppID msg.Content = strings.ReplaceAll(msg.Content, BotID, AppID) From a5e4c7df9a87ca6d9d198007676b4408309a82e4 Mon Sep 17 00:00:00 2001 From: cosmo Date: Fri, 17 Nov 2023 10:21:03 +0800 Subject: [PATCH 2/4] wtf2 --- handlers/message_parser.go | 21 +++++++++++++++++++++ handlers/send_group_msg.go | 34 ++++++++++++++++++---------------- 2 files changed, 39 insertions(+), 16 deletions(-) diff --git a/handlers/message_parser.go b/handlers/message_parser.go index ebbf7fc9..c6e0306a 100644 --- a/handlers/message_parser.go +++ b/handlers/message_parser.go @@ -479,6 +479,8 @@ func ConvertToSegmentedMessage(data interface{}) []map[string]interface{} { } messageSegments = append(messageSegments, textSegment) } + //排列 + messageSegments = sortMessageSegments(messageSegments) return messageSegments } @@ -496,3 +498,22 @@ func ConvertToInt64(value interface{}) (int64, error) { return 0, fmt.Errorf("无法将类型 %T 转换为 int64", value) } } + +// 排列MessageSegments +func sortMessageSegments(segments []map[string]interface{}) []map[string]interface{} { + var atSegments, textSegments, imageSegments []map[string]interface{} + + for _, segment := range segments { + switch segment["type"] { + case "at": + atSegments = append(atSegments, segment) + case "text": + textSegments = append(textSegments, segment) + case "image": + imageSegments = append(imageSegments, segment) + } + } + + // 按照指定的顺序合并这些切片 + return append(append(atSegments, textSegments...), imageSegments...) +} diff --git a/handlers/send_group_msg.go b/handlers/send_group_msg.go index b06efd7d..72debb9d 100644 --- a/handlers/send_group_msg.go +++ b/handlers/send_group_msg.go @@ -121,24 +121,26 @@ func handleSendGroupMsg(client callapi.Client, api openapi.OpenAPI, apiv2 openap // 遍历foundItems并发送每种信息 for key, urls := range foundItems { - var singleItem = make(map[string][]string) - singleItem[key] = urls + for _, url := range urls { + var singleItem = make(map[string][]string) + singleItem[key] = []string{url} // 创建一个只包含一个 URL 的 singleItem - groupReply := generateGroupMessage(messageID, singleItem, "") + groupReply := generateGroupMessage(messageID, singleItem, "") - // 进行类型断言 - richMediaMessage, ok := groupReply.(*dto.RichMediaMessage) - if !ok { - mylog.Printf("Error: Expected RichMediaMessage type for key %s.", key) - continue // 跳过这个项,继续下一个 - } - mylog.Printf("richMediaMessage: %+v\n", richMediaMessage) - _, err := apiv2.PostGroupMessage(context.TODO(), message.Params.GroupID.(string), richMediaMessage) - if err != nil { - mylog.Printf("发送 %s 信息失败_send_group_msg: %v", key, err) + // 进行类型断言 + richMediaMessage, ok := groupReply.(*dto.RichMediaMessage) + if !ok { + mylog.Printf("Error: Expected RichMediaMessage type for key %s.", key) + continue // 跳过这个项,继续下一个 + } + mylog.Printf("richMediaMessage: %+v\n", richMediaMessage) + _, err := apiv2.PostGroupMessage(context.TODO(), message.Params.GroupID.(string), richMediaMessage) + if err != nil { + mylog.Printf("发送 %s 信息失败_send_group_msg: %v", key, err) + } + //发送成功回执 + SendResponse(client, err, &message) } - //发送成功回执 - SendResponse(client, err, &message) } case "guild": //用GroupID给ChannelID赋值,因为我们是把频道虚拟成了群 @@ -190,7 +192,7 @@ func handleSendGroupMsg(client callapi.Client, api openapi.OpenAPI, apiv2 openap } } -// 不支持base64 +// 整理和组合富媒体信息 func generateGroupMessage(id string, foundItems map[string][]string, messageText string) interface{} { if imageURLs, ok := foundItems["local_image"]; ok && len(imageURLs) > 0 { // 从本地路径读取图片 From 44e3515d65d2b3621212b95c34797e6e19984dad Mon Sep 17 00:00:00 2001 From: cosmo Date: Fri, 17 Nov 2023 10:51:09 +0800 Subject: [PATCH 3/4] wtf3 --- handlers/send_group_msg.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/handlers/send_group_msg.go b/handlers/send_group_msg.go index 72debb9d..056b13c3 100644 --- a/handlers/send_group_msg.go +++ b/handlers/send_group_msg.go @@ -88,7 +88,7 @@ func handleSendGroupMsg(client callapi.Client, api openapi.OpenAPI, apiv2 openap } message.Params.GroupID = originalGroupID mylog.Println("群组发信息messageText:", messageText) - //mylog.Println("foundItems:", foundItems) + mylog.Println("foundItems:", foundItems) // 如果messageID为空,通过函数获取 if messageID == "" { messageID = GetMessageIDByUseridOrGroupid(config.GetAppIDStr(), message.Params.GroupID) @@ -124,6 +124,7 @@ func handleSendGroupMsg(client callapi.Client, api openapi.OpenAPI, apiv2 openap for _, url := range urls { var singleItem = make(map[string][]string) singleItem[key] = []string{url} // 创建一个只包含一个 URL 的 singleItem + mylog.Println("singleItem:", singleItem) groupReply := generateGroupMessage(messageID, singleItem, "") From 18c254c853d384569588dd4deaaa3e96b27a5184 Mon Sep 17 00:00:00 2001 From: cosmo Date: Fri, 17 Nov 2023 11:10:15 +0800 Subject: [PATCH 4/4] wtf4 --- .github/workflows/cross_compile.yml | 8 ++- handlers/send_guild_channel_msg.go | 57 ++++++++--------- handlers/send_msg.go | 64 ++++++++++--------- handlers/send_private_msg.go | 95 +++++++++++++++-------------- 4 files changed, 118 insertions(+), 106 deletions(-) diff --git a/.github/workflows/cross_compile.yml b/.github/workflows/cross_compile.yml index 24418a53..d924f1d6 100644 --- a/.github/workflows/cross_compile.yml +++ b/.github/workflows/cross_compile.yml @@ -94,13 +94,17 @@ jobs: GOARCH: ${{ matrix.goarch }} CGO_ENABLED: 0 run: | - go build -o output/gensokyo-${{ matrix.os }}-${{ matrix.goarch }} + if [ "$GOOS" = "windows" ]; then + go build -o output/gensokyo-${{ matrix.os }}-${{ matrix.goarch }}.exe + else + go build -o output/gensokyo-${{ matrix.os }}-${{ matrix.goarch }} + fi - name: Upload artifacts uses: actions/upload-artifact@v2 with: name: gensokyo-${{ matrix.os }}-${{ matrix.goarch }} - path: output/gensokyo-${{ matrix.os }}-${{ matrix.goarch }} + path: output/gensokyo-${{ matrix.os }}-${{ matrix.goarch }}${{ if eq(matrix.os, 'windows') }}.exe${{ endif }} prepare_release: needs: build diff --git a/handlers/send_guild_channel_msg.go b/handlers/send_guild_channel_msg.go index eb587235..95b7841b 100644 --- a/handlers/send_guild_channel_msg.go +++ b/handlers/send_guild_channel_msg.go @@ -89,36 +89,37 @@ func handleSendGuildChannelMsg(client callapi.Client, api openapi.OpenAPI, apiv2 // 遍历foundItems并发送每种信息 for key, urls := range foundItems { - var singleItem = make(map[string][]string) - singleItem[key] = urls - - reply, isBase64Image := GenerateReplyMessage(messageID, singleItem, "") - - if isBase64Image { - // 将base64内容从reply的Content转换回字节 - fileImageData, err := base64.StdEncoding.DecodeString(reply.Content) - if err != nil { - mylog.Printf("Base64 解码失败: %v", err) - return // 或其他的错误处理方式 + for _, url := range urls { + var singleItem = make(map[string][]string) + singleItem[key] = []string{url} // 创建一个只有一个 URL 的 singleItem + + reply, isBase64Image := GenerateReplyMessage(messageID, singleItem, "") + + if isBase64Image { + // 将base64内容从reply的Content转换回字节 + fileImageData, err := base64.StdEncoding.DecodeString(reply.Content) + if err != nil { + mylog.Printf("Base64 解码失败: %v", err) + continue // 跳过当前项,继续下一个 + } + + // 清除reply的Content + reply.Content = "" + + // 使用Multipart方法发送 + if _, err = api.PostMessageMultipart(context.TODO(), channelID, reply, fileImageData); err != nil { + mylog.Printf("使用multipart发送 %s 信息失败: %v message_id %v", key, err, messageID) + } + //发送成功回执 + SendResponse(client, err, &message) + } else { + if _, err = api.PostMessage(context.TODO(), channelID, reply); err != nil { + mylog.Printf("发送 %s 信息失败: %v", key, err) + } + //发送成功回执 + SendResponse(client, err, &message) } - - // 清除reply的Content - reply.Content = "" - - // 使用Multipart方法发送 - if _, err = api.PostMessageMultipart(context.TODO(), channelID, reply, fileImageData); err != nil { - mylog.Printf("使用multipart发送 %s 信息失败: %v message_id %v", key, err, messageID) - } - //发送成功回执 - SendResponse(client, err, &message) - } else { - if _, err = api.PostMessage(context.TODO(), channelID, reply); err != nil { - mylog.Printf("发送 %s 信息失败: %v", key, err) - } - //发送成功回执 - SendResponse(client, err, &message) } - } //频道私信 此时直接取出 case "guild_private": diff --git a/handlers/send_msg.go b/handlers/send_msg.go index c07a9a17..8ce24d4a 100644 --- a/handlers/send_msg.go +++ b/handlers/send_msg.go @@ -123,25 +123,27 @@ func handleSendMsg(client callapi.Client, api openapi.OpenAPI, apiv2 openapi.Ope // 遍历foundItems并发送每种信息 for key, urls := range foundItems { - var singleItem = make(map[string][]string) - singleItem[key] = urls + for _, url := range urls { + var singleItem = make(map[string][]string) + singleItem[key] = []string{url} // 创建一个只包含一个 URL 的 singleItem - groupReply := generateGroupMessage(messageID, singleItem, "") + groupReply := generateGroupMessage(messageID, singleItem, "") - // 进行类型断言 - richMediaMessage, ok := groupReply.(*dto.RichMediaMessage) - if !ok { - mylog.Printf("Error: Expected RichMediaMessage type for key %s.", key) - continue // 跳过这个项,继续下一个 - } + // 进行类型断言 + richMediaMessage, ok := groupReply.(*dto.RichMediaMessage) + if !ok { + mylog.Printf("Error: Expected RichMediaMessage type for key %s.", key) + continue // 跳过这个项,继续下一个 + } - mylog.Printf("richMediaMessage: %+v\n", richMediaMessage) - _, err = apiv2.PostGroupMessage(context.TODO(), message.Params.GroupID.(string), richMediaMessage) - if err != nil { - mylog.Printf("发送 %s 信息失败_send_msg: %v", key, err) + mylog.Printf("richMediaMessage: %+v\n", richMediaMessage) + _, err := apiv2.PostGroupMessage(context.TODO(), message.Params.GroupID.(string), richMediaMessage) + if err != nil { + mylog.Printf("发送 %s 信息失败_send_msg: %v", key, err) + } + //发送成功回执 + SendResponse(client, err, &message) } - //发送成功回执 - SendResponse(client, err, &message) } case "guild": //用GroupID给ChannelID赋值,因为我们是把频道虚拟成了群 @@ -216,25 +218,27 @@ func handleSendMsg(client callapi.Client, api openapi.OpenAPI, apiv2 openapi.Ope SendResponse(client, err, &message) } - // 遍历 foundItems 并发送每种信息 + // 遍历foundItems并发送每种信息 for key, urls := range foundItems { - var singleItem = make(map[string][]string) - singleItem[key] = urls + for _, url := range urls { + var singleItem = make(map[string][]string) + singleItem[key] = []string{url} // 创建一个只包含一个 URL 的 singleItem - groupReply := generateGroupMessage(messageID, singleItem, "") + groupReply := generateGroupMessage(messageID, singleItem, "") - // 进行类型断言 - richMediaMessage, ok := groupReply.(*dto.RichMediaMessage) - if !ok { - mylog.Printf("Error: Expected RichMediaMessage type for key %s.", key) - continue - } - _, err = apiv2.PostC2CMessage(context.TODO(), UserID, richMediaMessage) - if err != nil { - mylog.Printf("发送 %s 私聊信息失败: %v", key, err) + // 进行类型断言 + richMediaMessage, ok := groupReply.(*dto.RichMediaMessage) + if !ok { + mylog.Printf("Error: Expected RichMediaMessage type for key %s.", key) + continue // 跳过这个项,继续下一个 + } + _, err = apiv2.PostC2CMessage(context.TODO(), UserID, richMediaMessage) + if err != nil { + mylog.Printf("发送 %s 私聊信息失败: %v", key, err) + } + //发送成功回执 + SendResponse(client, err, &message) } - //发送成功回执 - SendResponse(client, err, &message) } default: mylog.Printf("1Unknown message type: %s", msgType) diff --git a/handlers/send_private_msg.go b/handlers/send_private_msg.go index db21e99e..9ee62728 100644 --- a/handlers/send_private_msg.go +++ b/handlers/send_private_msg.go @@ -125,26 +125,31 @@ func handleSendPrivateMsg(client callapi.Client, api openapi.OpenAPI, apiv2 open SendResponse(client, err, &message) } - // 遍历 foundItems 并发送每种信息 + // 遍历foundItems并发送每种信息 for key, urls := range foundItems { - var singleItem = make(map[string][]string) - singleItem[key] = urls - - //先试试用群里一样的处理逻辑,看看能跑不 - groupReply := generateGroupMessage(messageID, singleItem, "") - - // 进行类型断言 - richMediaMessage, ok := groupReply.(*dto.RichMediaMessage) - if !ok { - mylog.Printf("Error: Expected RichMediaMessage type for key %s.", key) - continue - } - _, err := apiv2.PostC2CMessage(context.TODO(), UserID, richMediaMessage) - if err != nil { - mylog.Printf("发送 %s 私聊信息失败: %v", key, err) + for _, url := range urls { + var singleItem = make(map[string][]string) + singleItem[key] = []string{url} // 创建只包含一个 URL 的 singleItem + + // 生成消息 + groupReply := generateGroupMessage(messageID, singleItem, "") + + // 进行类型断言 + richMediaMessage, ok := groupReply.(*dto.RichMediaMessage) + if !ok { + mylog.Printf("Error: Expected RichMediaMessage type for key %s.", key) + continue // 如果断言失败,跳过当前 url + } + + // 发送消息 + _, err := apiv2.PostC2CMessage(context.TODO(), UserID, richMediaMessage) + if err != nil { + mylog.Printf("发送 %s 私聊信息失败: %v", key, err) + } + + // 发送成功回执 + SendResponse(client, err, &message) } - //发送成功回执 - SendResponse(client, err, &message) } case "guild_private": //当收到发私信调用 并且来源是频道 @@ -289,36 +294,34 @@ func handleSendGuildChannelPrivateMsg(client callapi.Client, api openapi.OpenAPI // 遍历foundItems并发送每种信息 for key, urls := range foundItems { - var singleItem = make(map[string][]string) - singleItem[key] = urls - - reply, isBase64Image := GenerateReplyMessage(messageID, singleItem, "") - - if isBase64Image { - // 将base64内容从reply的Content转换回字节 - fileImageData, err := base64.StdEncoding.DecodeString(reply.Content) - if err != nil { - mylog.Printf("Base64 解码失败: %v", err) - return // 或其他的错误处理方式 - } - - // 清除reply的Content - reply.Content = "" - - // 使用Multipart方法发送 - if _, err = api.PostDirectMessageMultipart(context.TODO(), dm, reply, fileImageData); err != nil { - mylog.Printf("使用multipart发送 %s 信息失败: %v message_id %v", key, err, messageID) - } - //发送成功回执 - SendResponse(client, err, &message) - } else { - if _, err = api.PostDirectMessage(context.TODO(), dm, reply); err != nil { - mylog.Printf("发送 %s 信息失败: %v", key, err) + for _, url := range urls { + var singleItem = make(map[string][]string) + singleItem[key] = []string{url} // 创建一个只包含单个 URL 的 singleItem + + reply, isBase64Image := GenerateReplyMessage(messageID, singleItem, "") + + if isBase64Image { + // 处理 Base64 图片的逻辑 + fileImageData, err := base64.StdEncoding.DecodeString(reply.Content) + if err != nil { + mylog.Printf("Base64 解码失败: %v", err) + continue // 跳过当前项,继续处理下一个 + } + + reply.Content = "" + + if _, err = api.PostDirectMessageMultipart(context.TODO(), dm, reply, fileImageData); err != nil { + mylog.Printf("使用multipart发送 %s 信息失败: %v message_id %v", key, err, messageID) + } + SendResponse(client, err, &message) + } else { + // 处理非 Base64 图片的逻辑 + if _, err = api.PostDirectMessage(context.TODO(), dm, reply); err != nil { + mylog.Printf("发送 %s 信息失败: %v", key, err) + } + SendResponse(client, err, &message) } - //发送成功回执 - SendResponse(client, err, &message) } - } }