diff --git a/botgo/dto/message.go b/botgo/dto/message.go index 23744523..14318ec3 100644 --- a/botgo/dto/message.go +++ b/botgo/dto/message.go @@ -41,6 +41,20 @@ type Message struct { SrcGuildID string `json:"src_guild_id"` } +type MediaResponse struct { + //UUID + FileUUID string `json:"file_uuid"` + //file_info + FileInfo string `json:"file_info"` + TTL int `json:"ttl"` +} + +//新增 +type GroupMessageResponse struct { + MediaResponse *MediaResponse + Message *Message +} + // Embed 结构 type Embed struct { Title string `json:"title,omitempty"` diff --git a/botgo/dto/message_create.go b/botgo/dto/message_create.go index b473d2f2..d0b96623 100644 --- a/botgo/dto/message_create.go +++ b/botgo/dto/message_create.go @@ -25,6 +25,11 @@ type RichMediaMessage struct { Content string `json:"content,omitempty"` } +// Meida message内的富媒体消息 +type Media struct { + FileInfo string `json:"file_info"` +} + // GetEventID 事件ID func (msg RichMediaMessage) GetEventID() string { return msg.EventID @@ -42,6 +47,7 @@ type MessageToCreate struct { Embed *Embed `json:"embed,omitempty"` Ark *Ark `json:"ark,omitempty"` Image string `json:"image,omitempty"` + Media Media `json:"media,omitempty"` // 要回复的消息id,为空是主动消息,公域机器人会异步审核,不为空是被动消息,公域机器人会校验语料 MsgID string `json:"msg_id,omitempty"` MessageReference *MessageReference `json:"message_reference,omitempty"` diff --git a/botgo/openapi/iface.go b/botgo/openapi/iface.go index 34dca682..f2ae3207 100644 --- a/botgo/openapi/iface.go +++ b/botgo/openapi/iface.go @@ -76,7 +76,7 @@ type MessageAPI interface { PostSettingGuide(ctx context.Context, channelID string, atUserIDs []string) (*dto.Message, error) // PostGroupMessage 发送群消息 - PostGroupMessage(ctx context.Context, groupID string, msg dto.APIMessage) (*dto.Message, error) + PostGroupMessage(ctx context.Context, groupID string, msg dto.APIMessage) (*dto.GroupMessageResponse, error) // PostC2CMessage 发送C2C消息 PostC2CMessage(ctx context.Context, userID string, msg dto.APIMessage) (*dto.Message, error) } diff --git a/botgo/openapi/v1/message.go b/botgo/openapi/v1/message.go index 716bc62e..436e939a 100644 --- a/botgo/openapi/v1/message.go +++ b/botgo/openapi/v1/message.go @@ -191,7 +191,7 @@ func getGroupURLBySendType(msgType dto.SendType) uri { } // PostGroupMessage 回复群消息 -func (o *openAPI) PostGroupMessage(ctx context.Context, groupID string, msg dto.APIMessage) (*dto.Message, error) { +func (o *openAPI) PostGroupMessage(ctx context.Context, groupID string, msg dto.APIMessage) (*dto.GroupMessageResponse, error) { resp, err := o.request(ctx). SetResult(dto.Message{}). SetPathParam("group_id", groupID). @@ -200,7 +200,15 @@ func (o *openAPI) PostGroupMessage(ctx context.Context, groupID string, msg dto. if err != nil { return nil, err } - return resp.Result().(*dto.Message), nil + msgType := msg.GetSendType() + result := &dto.GroupMessageResponse{} + switch msgType { + case dto.RichMedia: + result.MediaResponse = resp.Result().(*dto.MediaResponse) + default: + result.Message = resp.Result().(*dto.Message) + } + return result, nil } func getC2CURLBySendType(msgType dto.SendType) uri { diff --git a/botgo/openapi/v2/message.go b/botgo/openapi/v2/message.go index ed6a1af9..10f9bf2e 100644 --- a/botgo/openapi/v2/message.go +++ b/botgo/openapi/v2/message.go @@ -7,6 +7,7 @@ import ( "fmt" "strconv" + "github.com/go-resty/resty/v2" "github.com/tidwall/gjson" "github.com/tencent-connect/botgo/dto" @@ -191,16 +192,39 @@ func getGroupURLBySendType(msgType dto.SendType) uri { } // PostGroupMessage 回复群消息 -func (o *openAPIv2) PostGroupMessage(ctx context.Context, groupID string, msg dto.APIMessage) (*dto.Message, error) { - resp, err := o.request(ctx). - SetResult(dto.Message{}). - SetPathParam("group_id", groupID). - SetBody(msg). - Post(o.getURL(getGroupURLBySendType(msg.GetSendType()))) +func (o *openAPIv2) PostGroupMessage(ctx context.Context, groupID string, msg dto.APIMessage) (*dto.GroupMessageResponse, error) { + var resp *resty.Response + var err error + + msgType := msg.GetSendType() + switch msgType { + case dto.RichMedia: + resp, err = o.request(ctx). + SetResult(dto.MediaResponse{}). // 设置为媒体响应类型 + SetPathParam("group_id", groupID). + SetBody(msg). + Post(o.getURL(getGroupURLBySendType(msgType))) + default: + resp, err = o.request(ctx). + SetResult(dto.Message{}). // 设置为消息类型 + SetPathParam("group_id", groupID). + SetBody(msg). + Post(o.getURL(getGroupURLBySendType(msgType))) + } + if err != nil { return nil, err } - return resp.Result().(*dto.Message), nil + + result := &dto.GroupMessageResponse{} + switch msgType { + case dto.RichMedia: + result.MediaResponse = resp.Result().(*dto.MediaResponse) + default: + result.Message = resp.Result().(*dto.Message) + } + + return result, nil } func getC2CURLBySendType(msgType dto.SendType) uri { diff --git a/config/config.go b/config/config.go index d655c568..3d230dd4 100644 --- a/config/config.go +++ b/config/config.go @@ -79,7 +79,6 @@ type Settings struct { NoWhiteResponse string `yaml:"No_White_Response"` SendError bool `yaml:"send_error"` AddAtGroup bool `yaml:"add_at_group"` - SendErrorPicAsUrl bool `yaml:"send_error_pic_as_url"` UrlPicTransfer bool `yaml:"url_pic_transfer"` } @@ -940,18 +939,6 @@ func GetAddAtGroup() bool { return instance.Settings.AddAtGroup } -// 获取GetSendErrorPicAsUrl的值 -func GetSendErrorPicAsUrl() bool { - mu.Lock() - defer mu.Unlock() - - if instance == nil { - mylog.Println("Warning: instance is nil when trying to GetErrorPicAsUrl value.") - return true - } - return instance.Settings.SendErrorPicAsUrl -} - // 获取GetUrlPicTransfer的值 func GetUrlPicTransfer() bool { mu.Lock() diff --git a/handlers/send_group_msg.go b/handlers/send_group_msg.go index d367110f..5e30df0e 100644 --- a/handlers/send_group_msg.go +++ b/handlers/send_group_msg.go @@ -103,6 +103,70 @@ func handleSendGroupMsg(client callapi.Client, api openapi.OpenAPI, apiv2 openap if config.GetDevMsgID() { messageID = "1000" } + var singleItem = make(map[string][]string) + var imageType, imageUrl string + imageCount := 0 + + // 检查不同类型的图片并计算数量 + if imageURLs, ok := foundItems["local_image"]; ok && len(imageURLs) == 1 { + imageType = "local_image" + imageUrl = imageURLs[0] + imageCount++ + } else if imageURLs, ok := foundItems["url_image"]; ok && len(imageURLs) == 1 { + imageType = "url_image" + imageUrl = imageURLs[0] + imageCount++ + } else if base64Images, ok := foundItems["base64_image"]; ok && len(base64Images) == 1 { + imageType = "base64_image" + imageUrl = base64Images[0] + imageCount++ + } + + if imageCount == 1 && messageText != "" { + mylog.Printf("发图文混合信息") + // 创建包含单个图片的 singleItem + singleItem[imageType] = []string{imageUrl} + msgseq := echo.GetMappingSeq(messageID) + echo.AddMappingSeq(messageID, msgseq+1) + groupReply := generateGroupMessage(messageID, singleItem, "", msgseq+1) + // 进行类型断言 + richMediaMessage, ok := groupReply.(*dto.RichMediaMessage) + if !ok { + mylog.Printf("Error: Expected RichMediaMessage type for key ") + } + // 上传图片并获取FileInfo + fileInfo, err := uploadMedia(context.TODO(), message.Params.GroupID.(string), richMediaMessage, apiv2) + if err != nil { + mylog.Printf("上传图片失败: %v", err) + return // 或其他错误处理 + } + // 创建包含文本和图像信息的消息 + msgseq = echo.GetMappingSeq(messageID) + echo.AddMappingSeq(messageID, msgseq+1) + groupMessage := &dto.MessageToCreate{ + Content: messageText, // 添加文本内容 + Media: dto.Media{ + FileInfo: fileInfo, // 添加图像信息 + }, + MsgID: messageID, + MsgSeq: msgseq, + MsgType: 7, // 假设7是组合消息类型 + } + groupMessage.Timestamp = time.Now().Unix() // 设置时间戳 + + // 发送组合消息 + _, err = apiv2.PostGroupMessage(context.TODO(), message.Params.GroupID.(string), groupMessage) + if err != nil { + mylog.Printf("发送组合消息失败: %v", err) + return // 或其他错误处理 + } + + // 发送成功回执 + SendResponse(client, err, &message) + + delete(foundItems, imageType) // 从foundItems中删除已处理的图片项 + } + // 优先发送文本信息 if messageText != "" { msgseq := echo.GetMappingSeq(messageID) @@ -134,14 +198,6 @@ func handleSendGroupMsg(client callapi.Client, api openapi.OpenAPI, apiv2 openap //mylog.Println("singleItem:", singleItem) msgseq := echo.GetMappingSeq(messageID) echo.AddMappingSeq(messageID, msgseq+1) - //时间限制 - lastSendTimestamp := echo.GetMappingFileTimeLimit(messageID) - if lastSendTimestamp == 0 { - lastSendTimestamp = echo.GetFileTimeLimit() - } - now := time.Now() - millis := now.UnixMilli() - diff := millis - lastSendTimestamp groupReply := generateGroupMessage(messageID, singleItem, "", msgseq+1) // 进行类型断言 richMediaMessage, ok := groupReply.(*dto.RichMediaMessage) @@ -149,95 +205,45 @@ func handleSendGroupMsg(client callapi.Client, api openapi.OpenAPI, apiv2 openap mylog.Printf("Error: Expected RichMediaMessage type for key %s.", key) continue // 跳过这个项,继续下一个 } - mylog.Printf("richMediaMessage: %+v\n", richMediaMessage) - richMediaMessageCopy := *richMediaMessage // 创建 richMediaMessage 的副本 - mylog.Printf("上次发图(ms): %+v\n", diff) - if diff < 1000 { - waitDuration := time.Duration(1200-diff) * time.Millisecond - mylog.Printf("等待 %v...\n", waitDuration) - time.AfterFunc(waitDuration, func() { - mylog.Println("延迟完成") - _, err := apiv2.PostGroupMessage(context.TODO(), message.Params.GroupID.(string), richMediaMessageCopy) - echo.AddMappingFileTimeLimit(messageID, millis) - echo.AddFileTimeLimit(millis) + message_return, err := apiv2.PostGroupMessage(context.TODO(), message.Params.GroupID.(string), richMediaMessage) + if err != nil { + mylog.Printf("发送 %s 信息失败_send_group_msg: %v", key, err) + if config.GetSendError() { //把报错当作文本发出去 + msgseq := echo.GetMappingSeq(messageID) + echo.AddMappingSeq(messageID, msgseq+1) + groupReply := generateGroupMessage(messageID, nil, err.Error(), msgseq+1) + // 进行类型断言 + groupMessage, ok := groupReply.(*dto.MessageToCreate) + if !ok { + mylog.Println("Error: Expected MessageToCreate type.") + return // 或其他错误处理 + } + groupMessage.Timestamp = time.Now().Unix() // 设置时间戳 + //重新为err赋值 + _, err = apiv2.PostGroupMessage(context.TODO(), message.Params.GroupID.(string), groupMessage) if err != nil { - mylog.Printf("发送 %s 信息失败_send_group_msg: %v", key, err) - if config.GetSendError() { //把报错当作文本发出去 - msgseq := echo.GetMappingSeq(messageID) - echo.AddMappingSeq(messageID, msgseq+1) - groupReply := generateGroupMessage(messageID, nil, err.Error(), msgseq+1) - // 进行类型断言 - groupMessage, ok := groupReply.(*dto.MessageToCreate) - if !ok { - mylog.Println("Error: Expected MessageToCreate type.") - return // 或其他错误处理 - } - groupMessage.Timestamp = time.Now().Unix() // 设置时间戳 - //重新为err赋值 - _, err = apiv2.PostGroupMessage(context.TODO(), message.Params.GroupID.(string), groupMessage) - if err != nil { - mylog.Printf("发送文本报错信息失败: %v", err) - } - } - if config.GetSendErrorPicAsUrl() { - msgseq := echo.GetMappingSeq(messageID) - echo.AddMappingSeq(messageID, msgseq+1) - groupReply := generateGroupMessage(messageID, nil, richMediaMessageCopy.URL, msgseq+1) - // 进行类型断言 - groupMessage, ok := groupReply.(*dto.MessageToCreate) - if !ok { - mylog.Println("Error: Expected MessageToCreate type.") - return // 或其他错误处理 - } - groupMessage.Timestamp = time.Now().Unix() // 设置时间戳 - //重新为err赋值 - _, err = apiv2.PostGroupMessage(context.TODO(), message.Params.GroupID.(string), groupMessage) - if err != nil { - mylog.Printf("发送图片报错后转url发送失败: %v", err) - } - } + mylog.Printf("发送文本报错信息失败: %v", err) } - }) - } else { - _, err := apiv2.PostGroupMessage(context.TODO(), message.Params.GroupID.(string), richMediaMessage) - echo.AddMappingFileTimeLimit(messageID, millis) - echo.AddFileTimeLimit(millis) + } + } + if message_return.MediaResponse.FileInfo != "" { + msgseq := echo.GetMappingSeq(messageID) + echo.AddMappingSeq(messageID, msgseq+1) + media := dto.Media{ + FileInfo: message_return.MediaResponse.FileInfo, + } + groupMessage := &dto.MessageToCreate{ + Content: " ", + MsgID: messageID, + MsgSeq: msgseq, + MsgType: 7, // 默认文本类型 + Media: media, + } + groupMessage.Timestamp = time.Now().Unix() // 设置时间戳 + //重新为err赋值 + _, err = apiv2.PostGroupMessage(context.TODO(), message.Params.GroupID.(string), groupMessage) if err != nil { - mylog.Printf("发送 %s 信息失败_send_group_msg: %v", key, err) - if config.GetSendError() { //把报错当作文本发出去 - msgseq := echo.GetMappingSeq(messageID) - echo.AddMappingSeq(messageID, msgseq+1) - groupReply := generateGroupMessage(messageID, nil, err.Error(), msgseq+1) - // 进行类型断言 - groupMessage, ok := groupReply.(*dto.MessageToCreate) - if !ok { - mylog.Println("Error: Expected MessageToCreate type.") - return // 或其他错误处理 - } - groupMessage.Timestamp = time.Now().Unix() // 设置时间戳 - //重新为err赋值 - _, err = apiv2.PostGroupMessage(context.TODO(), message.Params.GroupID.(string), groupMessage) - if err != nil { - mylog.Printf("发送文本报错信息失败: %v", err) - } - } - if config.GetSendErrorPicAsUrl() { - msgseq := echo.GetMappingSeq(messageID) - echo.AddMappingSeq(messageID, msgseq+1) - groupReply := generateGroupMessage(messageID, nil, richMediaMessageCopy.URL, msgseq+1) - // 进行类型断言 - groupMessage, ok := groupReply.(*dto.MessageToCreate) - if !ok { - mylog.Println("Error: Expected MessageToCreate type.") - return // 或其他错误处理 - } - groupMessage.Timestamp = time.Now().Unix() // 设置时间戳 - //重新为err赋值 - _, err = apiv2.PostGroupMessage(context.TODO(), message.Params.GroupID.(string), groupMessage) - if err != nil { - mylog.Printf("发送图片报错后转url发送失败: %v", err) - } - } + mylog.Printf("发送图片失败: %v", err) } } //发送成功回执 @@ -294,7 +300,7 @@ func handleSendGroupMsg(client callapi.Client, api openapi.OpenAPI, apiv2 openap } } -// 整理和组合富媒体信息 +// 上传富媒体信息 func generateGroupMessage(id string, foundItems map[string][]string, messageText string, msgseq int) interface{} { if imageURLs, ok := foundItems["local_image"]; ok && len(imageURLs) > 0 { // 从本地路径读取图片 @@ -344,7 +350,7 @@ func generateGroupMessage(id string, foundItems map[string][]string, messageText FileType: 1, // 1代表图片 URL: imageURL, Content: "", // 这个字段文档没有了 - SrvSendMsg: true, + SrvSendMsg: false, } } else if RecordURLs, ok := foundItems["local_record"]; ok && len(RecordURLs) > 0 { // 从本地路径读取语音 @@ -385,7 +391,7 @@ func generateGroupMessage(id string, foundItems map[string][]string, messageText FileType: 3, // 3代表语音 URL: imageURL, Content: "", // 这个字段文档没有了 - SrvSendMsg: true, + SrvSendMsg: false, } } else if imageURLs, ok := foundItems["url_image"]; ok && len(imageURLs) > 0 { var newpiclink string @@ -450,7 +456,7 @@ func generateGroupMessage(id string, foundItems map[string][]string, messageText FileType: 1, // 1代表图片 URL: newpiclink, // 新图片链接 Content: "", // 这个字段文档没有了 - SrvSendMsg: true, + SrvSendMsg: false, } } else if voiceURLs, ok := foundItems["base64_record"]; ok && len(voiceURLs) > 0 { // 适配base64 slik @@ -486,7 +492,7 @@ func generateGroupMessage(id string, foundItems map[string][]string, messageText FileType: 3, // 3代表语音 URL: imageURL, Content: "", // 这个字段文档没有了 - SrvSendMsg: true, + SrvSendMsg: false, } } } else if base64_image, ok := foundItems["base64_image"]; ok && len(base64_image) > 0 { @@ -523,7 +529,7 @@ func generateGroupMessage(id string, foundItems map[string][]string, messageText FileType: 1, // 1代表图片 URL: imageURL, Content: "", // 这个字段文档没有了 - SrvSendMsg: true, + SrvSendMsg: false, } } } else { @@ -579,3 +585,14 @@ func GetMessageTypeByGroupid(appID string, GroupID interface{}) string { key := appID + "_" + GroupIDStr return echo.GetMsgTypeByKey(key) } + +// uploadMedia 上传媒体并返回FileInfo +func uploadMedia(ctx context.Context, groupID string, richMediaMessage *dto.RichMediaMessage, apiv2 openapi.OpenAPI) (string, error) { + // 调用API来上传媒体 + messageReturn, err := apiv2.PostGroupMessage(ctx, groupID, richMediaMessage) + if err != nil { + return "", err + } + // 返回上传后的FileInfo + return messageReturn.MediaResponse.FileInfo, nil +} diff --git a/handlers/send_msg.go b/handlers/send_msg.go index 78931368..22e54c68 100644 --- a/handlers/send_msg.go +++ b/handlers/send_msg.go @@ -67,181 +67,8 @@ func handleSendMsg(client callapi.Client, api openapi.OpenAPI, apiv2 openapi.Ope switch msgType { case "group": - // 解析消息内容 - messageText, foundItems := parseMessageContent(message.Params) - // 使用 echo 获取消息ID - var messageID string - if config.GetLazyMessageId() { - //由于实现了Params的自定义unmarshell 所以可以类型安全的断言为string - messageID = echo.GetLazyMessagesId(message.Params.GroupID.(string)) - mylog.Printf("GetLazyMessagesId: %v", messageID) - } - //判断是否使用了懒messageid,如果没有,优先从echo获取messageid - if messageID == "" { - if echoStr, ok := message.Echo.(string); ok { - messageID = echo.GetMsgIDByKey(echoStr) - mylog.Println("echo取群组发信息对应的message_id:", messageID) - } - } - mylog.Println("群组发信息messageText:", messageText) - //通过bolt数据库还原真实的GroupID - originalGroupID, err := idmap.RetrieveRowByIDv2(message.Params.GroupID.(string)) - if err != nil { - mylog.Printf("Error retrieving original GroupID: %v", err) - return - } - message.Params.GroupID = originalGroupID - // 如果messageID为空,通过函数获取 - if messageID == "" { - messageID = GetMessageIDByUseridOrGroupid(config.GetAppIDStr(), message.Params.GroupID) - mylog.Println("通过GetMessageIDByUserid函数获取的message_id:", messageID) - } - //开发环境用 - if config.GetDevMsgID() { - messageID = "1000" - } - // 优先发送文本信息 - if messageText != "" { - msgseq := echo.GetMappingSeq(messageID) - echo.AddMappingSeq(messageID, msgseq+1) - groupReply := generateGroupMessage(messageID, nil, messageText, msgseq+1) - - // 进行类型断言 - groupMessage, ok := groupReply.(*dto.MessageToCreate) - if !ok { - mylog.Println("Error: Expected MessageToCreate type.") - return // 或其他错误处理 - } - - groupMessage.Timestamp = time.Now().Unix() // 设置时间戳 - _, err = apiv2.PostGroupMessage(context.TODO(), message.Params.GroupID.(string), groupMessage) - if err != nil { - mylog.Printf("发送文本群组信息失败: %v", err) - } - //发送成功回执 - SendResponse(client, err, &message) - } - - // 遍历foundItems并发送每种信息 - for key, urls := range foundItems { - for _, url := range urls { - var singleItem = make(map[string][]string) - singleItem[key] = []string{url} // 创建一个只包含一个 URL 的 singleItem - msgseq := echo.GetMappingSeq(messageID) - echo.AddMappingSeq(messageID, msgseq+1) - //时间限制 - lastSendTimestamp := echo.GetMappingFileTimeLimit(messageID) - if lastSendTimestamp == 0 { - lastSendTimestamp = echo.GetFileTimeLimit() - } - now := time.Now() - millis := now.UnixMilli() - diff := millis - lastSendTimestamp - groupReply := generateGroupMessage(messageID, singleItem, "", msgseq+1) - - // 进行类型断言 - richMediaMessage, ok := groupReply.(*dto.RichMediaMessage) - if !ok { - mylog.Printf("Error: Expected RichMediaMessage type for key %s.", key) - continue // 跳过这个项,继续下一个 - } - - mylog.Printf("richMediaMessage: %+v\n", richMediaMessage) - richMediaMessageCopy := *richMediaMessage // 创建 richMediaMessage 的副本 - mylog.Printf("上次发图(ms): %+v\n", diff) - if diff < 1000 { - waitDuration := time.Duration(1200-diff) * time.Millisecond - mylog.Printf("等待 %v...\n", waitDuration) - time.AfterFunc(waitDuration, func() { - mylog.Println("延迟完成") - _, err := apiv2.PostGroupMessage(context.TODO(), message.Params.GroupID.(string), richMediaMessageCopy) - echo.AddMappingFileTimeLimit(messageID, millis) - echo.AddFileTimeLimit(millis) - if err != nil { - mylog.Printf("发送 %s 信息失败_send_msg: %v", key, err) - if config.GetSendError() { //把报错当作文本发出去 - msgseq := echo.GetMappingSeq(messageID) - echo.AddMappingSeq(messageID, msgseq+1) - groupReply := generateGroupMessage(messageID, nil, err.Error(), msgseq+1) - // 进行类型断言 - groupMessage, ok := groupReply.(*dto.MessageToCreate) - if !ok { - mylog.Println("Error: Expected MessageToCreate type.") - return // 或其他错误处理 - } - groupMessage.Timestamp = time.Now().Unix() // 设置时间戳 - //重新为err赋值 - _, err = apiv2.PostGroupMessage(context.TODO(), message.Params.GroupID.(string), groupMessage) - if err != nil { - mylog.Printf("发送文本报错信息失败: %v", err) - } - } - if config.GetSendErrorPicAsUrl() { - msgseq := echo.GetMappingSeq(messageID) - echo.AddMappingSeq(messageID, msgseq+1) - groupReply := generateGroupMessage(messageID, nil, richMediaMessageCopy.URL, msgseq+1) - // 进行类型断言 - groupMessage, ok := groupReply.(*dto.MessageToCreate) - if !ok { - mylog.Println("Error: Expected MessageToCreate type.") - return // 或其他错误处理 - } - groupMessage.Timestamp = time.Now().Unix() // 设置时间戳 - //重新为err赋值 - _, err = apiv2.PostGroupMessage(context.TODO(), message.Params.GroupID.(string), groupMessage) - if err != nil { - mylog.Printf("发送图片报错后转url发送失败: %v", err) - } - } - } - }) - } else { - _, err := apiv2.PostGroupMessage(context.TODO(), message.Params.GroupID.(string), richMediaMessage) - echo.AddMappingFileTimeLimit(messageID, millis) - echo.AddFileTimeLimit(millis) - if err != nil { - mylog.Printf("发送 %s 信息失败_send_msg: %v", key, err) - if config.GetSendError() { //把报错当作文本发出去 - msgseq := echo.GetMappingSeq(messageID) - echo.AddMappingSeq(messageID, msgseq+1) - groupReply := generateGroupMessage(messageID, nil, err.Error(), msgseq+1) - // 进行类型断言 - groupMessage, ok := groupReply.(*dto.MessageToCreate) - if !ok { - mylog.Println("Error: Expected MessageToCreate type.") - return // 或其他错误处理 - } - groupMessage.Timestamp = time.Now().Unix() // 设置时间戳 - //重新为err赋值 - _, err = apiv2.PostGroupMessage(context.TODO(), message.Params.GroupID.(string), groupMessage) - if err != nil { - mylog.Printf("发送文本报错信息失败: %v", err) - } - } - if config.GetSendErrorPicAsUrl() { - msgseq := echo.GetMappingSeq(messageID) - echo.AddMappingSeq(messageID, msgseq+1) - groupReply := generateGroupMessage(messageID, nil, richMediaMessageCopy.URL, msgseq+1) - // 进行类型断言 - groupMessage, ok := groupReply.(*dto.MessageToCreate) - if !ok { - mylog.Println("Error: Expected MessageToCreate type.") - return // 或其他错误处理 - } - groupMessage.Timestamp = time.Now().Unix() // 设置时间戳 - //重新为err赋值 - _, err = apiv2.PostGroupMessage(context.TODO(), message.Params.GroupID.(string), groupMessage) - if err != nil { - mylog.Printf("发送图片报错后转url发送失败: %v", err) - } - } - } - - } - //发送成功回执 - SendResponse(client, err, &message) - } - } + //复用处理逻辑 + handleSendGroupMsg(client, api, apiv2, message) case "guild": //用GroupID给ChannelID赋值,因为我们是把频道虚拟成了群 message.Params.ChannelID = message.Params.GroupID.(string) diff --git a/template/config_template.go b/template/config_template.go index 1f518785..0994ebd8 100644 --- a/template/config_template.go +++ b/template/config_template.go @@ -91,8 +91,7 @@ settings: sandbox_mode : false #默认false 如果你只希望沙箱频道使用,请改为true dev_message_id : false #在沙盒和测试环境使用无限制msg_id 仅沙盒有效,正式环境请关闭,内测结束后,tx侧未来会移除 send_error : true #将报错用文本发出,避免机器人被审核报无响应 - send_error_pic_as_url : false #临时解决22009报错 - url_pic_transfer : false #可与url_pic_transfer配合使用 也可单独使用 把图片url(任意来源图链)变成你备案的白名单url 需要较高上下行+ssl+自备案域名+设置白名单域名(是目前gsk门槛最高的配置) + url_pic_transfer : false #把图片url(任意来源图链)变成你备案的白名单url 需要较高上下行+ssl+自备案域名+设置白名单域名(暂时不需要) title : "Gensokyo © 2023 - Hoshinonyaruko" #程序的标题 如果多个机器人 可根据标题区分 diff --git a/template/config_template.yml b/template/config_template.yml index 0c9e0b96..221ebb51 100644 --- a/template/config_template.yml +++ b/template/config_template.yml @@ -71,5 +71,4 @@ settings: No_White_Response : "" #默认不兜底,强烈建议设置一个友善的兜底回复,告知审核机器人已无隐藏指令,如:你输入的指令不对哦,@机器人来获取可用指令 send_error : true #将报错用文本发出,避免机器人被审核报无响应 add_at_group : false #自动在群聊指令前加上at,某些机器人写法特别,必须有at才反应时,请打开,默认请关闭(如果需要at,不需要at指令混杂,请优化代码适配群场景,群场景目前没有at概念 - send_error_pic_as_url : false #临时解决22009报错 - url_pic_transfer : false #可与url_pic_transfer配合使用 也可单独使用 把图片url(任意来源图链)变成你备案的白名单url 需要较高上下行+ssl+自备案域名+设置白名单域名(是目前gsk门槛最高的配置) \ No newline at end of file + url_pic_transfer : false #把图片url(任意来源图链)变成你备案的白名单url 需要较高上下行+ssl+自备案域名+设置白名单域名(暂时不需要) \ No newline at end of file