From 1374e674b73eb1919aefbaf32b2a84364babe6a1 Mon Sep 17 00:00:00 2001 From: cosmo Date: Tue, 5 Dec 2023 01:26:29 +0800 Subject: [PATCH 01/14] beta77 --- handlers/send_group_msg.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/handlers/send_group_msg.go b/handlers/send_group_msg.go index f2e5258e..bda0e112 100644 --- a/handlers/send_group_msg.go +++ b/handlers/send_group_msg.go @@ -197,7 +197,7 @@ func handleSendGroupMsg(client callapi.Client, api openapi.OpenAPI, apiv2 openap mylog.Printf("发送组合消息失败: %v", err) return // 或其他错误处理 } - if ret.Message.Ret == 22009 { + if ret != nil && ret.Message.Ret == 22009 { mylog.Printf("信息发送失败,加入到队列中,下次被动信息进行发送") var pair echo.MessageGroupPair pair.Group = message.Params.GroupID.(string) @@ -231,7 +231,7 @@ func handleSendGroupMsg(client callapi.Client, api openapi.OpenAPI, apiv2 openap if err != nil { mylog.Printf("发送文本群组信息失败: %v", err) } - if ret.Message.Ret == 22009 { + if ret != nil && ret.Message.Ret == 22009 { mylog.Printf("信息发送失败,加入到队列中,下次被动信息进行发送") var pair echo.MessageGroupPair pair.Group = message.Params.GroupID.(string) @@ -276,7 +276,7 @@ func handleSendGroupMsg(client callapi.Client, api openapi.OpenAPI, apiv2 openap if err != nil { mylog.Printf("发送文本报错信息失败: %v", err) } - if ret.Message.Ret == 22009 { + if ret != nil && ret.Message.Ret == 22009 { mylog.Printf("信息发送失败,加入到队列中,下次被动信息进行发送") var pair echo.MessageGroupPair pair.Group = message.Params.GroupID.(string) @@ -304,7 +304,7 @@ func handleSendGroupMsg(client callapi.Client, api openapi.OpenAPI, apiv2 openap if err != nil { mylog.Printf("发送图片失败: %v", err) } - if ret.Message.Ret == 22009 { + if ret != nil && ret.Message.Ret == 22009 { mylog.Printf("信息发送失败,加入到队列中,下次被动信息进行发送") var pair echo.MessageGroupPair pair.Group = message.Params.GroupID.(string) @@ -759,7 +759,7 @@ func SendStackMessages(apiv2 openapi.OpenAPI, messageid string, originalGroupID } // 检查错误码 - if ret.Message.Ret == 22009 { + if ret != nil && ret.Message.Ret == 22009 { mylog.Printf("信息再次发送失败,加入到队列中,下次被动信息进行发送") echo.PushGlobalStack(pair) } From ddd33c38f04a053680ff0e886f49920420c2b4f4 Mon Sep 17 00:00:00 2001 From: cosmo Date: Tue, 5 Dec 2023 01:37:33 +0800 Subject: [PATCH 02/14] beta77 --- handlers/send_group_msg.go | 1 + 1 file changed, 1 insertion(+) diff --git a/handlers/send_group_msg.go b/handlers/send_group_msg.go index bda0e112..1cab51fb 100644 --- a/handlers/send_group_msg.go +++ b/handlers/send_group_msg.go @@ -116,6 +116,7 @@ func handleSendGroupMsg(client callapi.Client, api openapi.OpenAPI, apiv2 openap message.Params.GroupID = originalGroupID if SSM { mylog.Printf("正在使用Msgid:%v 补发之前失败的主动信息,请注意AtoP不要设置超过3,否则可能会影响正常信息发送", messageID) + mylog.Printf("originalGroupID:%v ", originalGroupID) SendStackMessages(apiv2, messageID, originalGroupID) } mylog.Println("群组发信息messageText:", messageText) From 43c88a3de56ece59a62c823f011f94e919600c4d Mon Sep 17 00:00:00 2001 From: cosmo Date: Tue, 5 Dec 2023 01:48:31 +0800 Subject: [PATCH 03/14] beta77 --- handlers/send_group_msg.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/handlers/send_group_msg.go b/handlers/send_group_msg.go index 1cab51fb..b1d2e562 100644 --- a/handlers/send_group_msg.go +++ b/handlers/send_group_msg.go @@ -115,8 +115,8 @@ func handleSendGroupMsg(client callapi.Client, api openapi.OpenAPI, apiv2 openap } message.Params.GroupID = originalGroupID if SSM { - mylog.Printf("正在使用Msgid:%v 补发之前失败的主动信息,请注意AtoP不要设置超过3,否则可能会影响正常信息发送", messageID) - mylog.Printf("originalGroupID:%v ", originalGroupID) + //mylog.Printf("正在使用Msgid:%v 补发之前失败的主动信息,请注意AtoP不要设置超过3,否则可能会影响正常信息发送", messageID) + //mylog.Printf("originalGroupID:%v ", originalGroupID) SendStackMessages(apiv2, messageID, originalGroupID) } mylog.Println("群组发信息messageText:", messageText) @@ -744,8 +744,10 @@ func uploadMedia(ctx context.Context, groupID string, richMediaMessage *dto.Rich // 发送栈中的消息 func SendStackMessages(apiv2 openapi.OpenAPI, messageid string, originalGroupID string) { count := config.GetAtoPCount() + mylog.Printf("取出数量: %v", count) pairs := echo.PopGlobalStackMulti(count) for _, pair := range pairs { + mylog.Printf("%v: %v", pair.Group, originalGroupID) if pair.Group == originalGroupID { // 发送消息 messageID := pair.GroupMessage.MsgID From 0e644e6462976db617a876beffdfb7994988443d Mon Sep 17 00:00:00 2001 From: cosmo Date: Tue, 5 Dec 2023 02:08:35 +0800 Subject: [PATCH 04/14] beta77 --- echo/echo.go | 25 ++++++++++++++++--------- handlers/send_group_msg.go | 6 ++++-- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/echo/echo.go b/echo/echo.go index e15af59b..91f22e9a 100644 --- a/echo/echo.go +++ b/echo/echo.go @@ -195,23 +195,30 @@ func PushGlobalStack(pair MessageGroupPair) { globalMessageGroupStack.stack = append(globalMessageGroupStack.stack, pair) } -// PopGlobalStackMulti 从全局栈中取出指定数量的 MessageGroupPair +// PopGlobalStackMulti 从全局栈中取出指定数量的 MessageGroupPair,但不删除它们 func PopGlobalStackMulti(count int) []MessageGroupPair { globalMessageGroupStack.mu.Lock() defer globalMessageGroupStack.mu.Unlock() - // 如果 count 为 0 或栈为空,则不取出元素 if count == 0 || len(globalMessageGroupStack.stack) == 0 { return nil } - if count >= len(globalMessageGroupStack.stack) { - result := globalMessageGroupStack.stack - globalMessageGroupStack.stack = nil - return result + if count > len(globalMessageGroupStack.stack) { + count = len(globalMessageGroupStack.stack) } - result := globalMessageGroupStack.stack[len(globalMessageGroupStack.stack)-count:] - globalMessageGroupStack.stack = globalMessageGroupStack.stack[:len(globalMessageGroupStack.stack)-count] - return result + return globalMessageGroupStack.stack[:count] +} + +// RemoveFromGlobalStack 从全局栈中删除指定下标的元素 +func RemoveFromGlobalStack(index int) { + globalMessageGroupStack.mu.Lock() + defer globalMessageGroupStack.mu.Unlock() + + if index < 0 || index >= len(globalMessageGroupStack.stack) { + return // 下标越界检查 + } + + globalMessageGroupStack.stack = append(globalMessageGroupStack.stack[:index], globalMessageGroupStack.stack[index+1:]...) } diff --git a/handlers/send_group_msg.go b/handlers/send_group_msg.go index b1d2e562..ce2d5b2c 100644 --- a/handlers/send_group_msg.go +++ b/handlers/send_group_msg.go @@ -746,7 +746,7 @@ func SendStackMessages(apiv2 openapi.OpenAPI, messageid string, originalGroupID count := config.GetAtoPCount() mylog.Printf("取出数量: %v", count) pairs := echo.PopGlobalStackMulti(count) - for _, pair := range pairs { + for i, pair := range pairs { mylog.Printf("%v: %v", pair.Group, originalGroupID) if pair.Group == originalGroupID { // 发送消息 @@ -758,7 +758,9 @@ func SendStackMessages(apiv2 openapi.OpenAPI, messageid string, originalGroupID ret, err := apiv2.PostGroupMessage(context.TODO(), pair.Group, pair.GroupMessage) if err != nil { mylog.Printf("发送组合消息失败: %v", err) - continue // 其他错误处理 + continue + } else { + echo.RemoveFromGlobalStack(i) } // 检查错误码 From b5aed78e5accbfdd4a0657eea4a48141d9231378 Mon Sep 17 00:00:00 2001 From: cosmo Date: Tue, 5 Dec 2023 17:42:06 +0800 Subject: [PATCH 05/14] beta79 --- Processor/Processor.go | 26 ++++++++ config/config.go | 13 ++++ handlers/message_parser.go | 12 ++-- handlers/send_group_msg.go | 128 +++++++++++++++++++++++++++++++++++- template/config_template.go | 1 + 5 files changed, 175 insertions(+), 5 deletions(-) diff --git a/Processor/Processor.go b/Processor/Processor.go index 493f0759..2619bba1 100644 --- a/Processor/Processor.go +++ b/Processor/Processor.go @@ -274,13 +274,18 @@ func (p *Processors) HandleFrameworkCommand(messageText string, data interface{} var err error var now, new, newpro1, newpro2 string var realid, realid2 string + var guildid, guilduserid string switch v := data.(type) { case *dto.WSGroupATMessageData: realid = v.Author.ID case *dto.WSATMessageData: realid = v.Author.ID + guildid = v.GuildID + guilduserid = v.Author.ID case *dto.WSMessageData: realid = v.Author.ID + guildid = v.GuildID + guilduserid = v.Author.ID case *dto.WSDirectMessageData: realid = v.Author.ID case *dto.WSC2CMessageData: @@ -320,6 +325,27 @@ func (p *Processors) HandleFrameworkCommand(messageText string, data interface{} virtualValueIncluded = contains(masterIDs, new) } + //unlock指令 + if Type == "guild" && strings.HasPrefix(cleanedMessage, config.GetUnlockPrefix()) { + dm := &dto.DirectMessageToCreate{ + SourceGuildID: guildid, + RecipientID: guilduserid, + } + cdm, err := p.Api.CreateDirectMessage(context.TODO(), dm) + if err != nil { + mylog.Printf("unlock指令创建dm失败:%v", err) + } + msg := &dto.MessageToCreate{ + Content: "欢迎使用Gensokyo框架部署QQ机器人", + MsgType: 0, + MsgID: "", + } + _, err = p.Api.PostDirectMessage(context.TODO(), cdm, msg) + if err != nil { + mylog.Printf("unlock指令发送失败:%v", err) + } + } + // me指令处理逻辑 if strings.HasPrefix(cleanedMessage, config.GetMePrefix()) { if err != nil { diff --git a/config/config.go b/config/config.go index 7af3419a..c7e7b69a 100644 --- a/config/config.go +++ b/config/config.go @@ -91,6 +91,7 @@ type Settings struct { ReconnecTimes int `yaml:"reconnect_times"` HeartBeatInterval int `yaml:"heart_beat_interval"` LaunchReconectTimes int `yaml:"launch_reconnect_times"` + UnlockPrefix string `yaml:"unlock_prefix"` } // LoadConfig 从文件中加载配置并初始化单例配置 @@ -1093,3 +1094,15 @@ func GetLaunchReconectTimes() int { } return instance.Settings.LaunchReconectTimes } + +// 获取GetUnlockPrefix +func GetUnlockPrefix() string { + mu.Lock() + defer mu.Unlock() + + if instance == nil { + mylog.Println("Warning: instance is nil when trying to UnlockPrefix value.") + return "/unlock" + } + return instance.Settings.UnlockPrefix +} diff --git a/handlers/message_parser.go b/handlers/message_parser.go index 67ff5db8..b03ba32d 100644 --- a/handlers/message_parser.go +++ b/handlers/message_parser.go @@ -147,21 +147,25 @@ func parseMessageContent(paramsMessage callapi.ParamsContent) (string, map[strin } else { localRecordPattern = regexp.MustCompile(`\[CQ:record,file=file://([^\]]+?)\]`) } - urlImagePattern := regexp.MustCompile(`\[CQ:image,file=https?://(.+)\]`) + httpUrlImagePattern := regexp.MustCompile(`\[CQ:image,file=http://(.+)\]`) + httpsUrlImagePattern := regexp.MustCompile(`\[CQ:image,file=https://(.+)\]`) base64ImagePattern := regexp.MustCompile(`\[CQ:image,file=base64://(.+)\]`) base64RecordPattern := regexp.MustCompile(`\[CQ:record,file=base64://(.+)\]`) - urlRecordPattern := regexp.MustCompile(`\[CQ:record,file=https?://(.+)\]`) + httpUrlRecordPattern := regexp.MustCompile(`\[CQ:record,file=http://(.+)\]`) + httpsUrlRecordPattern := regexp.MustCompile(`\[CQ:record,file=https://(.+)\]`) patterns := []struct { key string pattern *regexp.Regexp }{ {"local_image", localImagePattern}, - {"url_image", urlImagePattern}, + {"url_image", httpUrlImagePattern}, + {"url_images", httpsUrlImagePattern}, {"base64_image", base64ImagePattern}, {"base64_record", base64RecordPattern}, {"local_record", localRecordPattern}, - {"url_record", urlRecordPattern}, + {"url_record", httpUrlRecordPattern}, + {"url_records", httpsUrlRecordPattern}, } foundItems := make(map[string][]string) diff --git a/handlers/send_group_msg.go b/handlers/send_group_msg.go index ce2d5b2c..a15ec981 100644 --- a/handlers/send_group_msg.go +++ b/handlers/send_group_msg.go @@ -533,6 +533,71 @@ func generateGroupMessage(id string, foundItems map[string][]string, messageText newpiclink = "http://" + imageURLs[0] } + // 发链接图片 + return &dto.RichMediaMessage{ + EventID: id, + FileType: 1, // 1代表图片 + URL: newpiclink, // 新图片链接 + Content: "", // 这个字段文档没有了 + SrvSendMsg: false, + } + } else if imageURLs, ok := foundItems["url_images"]; ok && len(imageURLs) > 0 { + var newpiclink string + if config.GetUrlPicTransfer() { + // 从URL下载图片 + resp, err := http.Get("https://" + imageURLs[0]) + if err != nil { + mylog.Printf("Error downloading the image: %v", err) + return &dto.MessageToCreate{ + Content: "错误: 下载图片失败", + MsgID: id, + MsgSeq: msgseq, + MsgType: 0, // 默认文本类型 + } + } + defer resp.Body.Close() + + // 读取图片数据 + imageData, err := io.ReadAll(resp.Body) + if err != nil { + mylog.Printf("Error reading the image data: %v", err) + return &dto.MessageToCreate{ + Content: "错误: 读取图片数据失败", + MsgID: id, + MsgSeq: msgseq, + MsgType: 0, + } + } + + // 转换为base64 + base64Encoded := base64.StdEncoding.EncodeToString(imageData) + + // 上传图片并获取新的URL + newURL, err := images.UploadBase64ImageToServer(base64Encoded) + if err != nil { + mylog.Printf("Error uploading base64 encoded image: %v", err) + return &dto.MessageToCreate{ + Content: "错误: 上传图片失败", + MsgID: id, + MsgSeq: msgseq, + MsgType: 0, + } + } + // 将图片链接缩短 避免 url not allow + // if config.GetLotusValue() { + // // 连接到另一个gensokyo + // newURL = url.GenerateShortURL(newURL) + // } else { + // // 自己是主节点 + // newURL = url.GenerateShortURL(newURL) + // // 使用getBaseURL函数来获取baseUrl并与newURL组合 + // newURL = url.GetBaseURL() + "/url/" + newURL + // } + newpiclink = newURL + } else { + newpiclink = "https://" + imageURLs[0] + } + // 发链接图片 return &dto.RichMediaMessage{ EventID: id, @@ -624,7 +689,68 @@ func generateGroupMessage(id string, foundItems map[string][]string, messageText if err != nil { mylog.Printf("Error uploading base64 encoded image: %v", err) return &dto.MessageToCreate{ - Content: "错误: 上传图片失败", + Content: "错误: 上传语音失败", + MsgID: id, + MsgSeq: msgseq, + MsgType: 0, + } + } + + // 发链接语音 + return &dto.RichMediaMessage{ + EventID: id, + FileType: 3, // 3代表语音 + URL: newURL, // 新语音链接 + Content: "", // 这个字段文档没有了 + SrvSendMsg: false, + } + } else if imageURLs, ok := foundItems["url_records"]; ok && len(imageURLs) > 0 { + // 从URL下载语音 + resp, err := http.Get("https://" + imageURLs[0]) + if err != nil { + mylog.Printf("Error downloading the record: %v", err) + return &dto.MessageToCreate{ + Content: "错误: 下载语音失败", + MsgID: id, + MsgSeq: msgseq, + MsgType: 0, // 默认文本类型 + } + } + defer resp.Body.Close() + + // 读取语音数据 + recordData, err := io.ReadAll(resp.Body) + if err != nil { + mylog.Printf("Error reading the record data: %v", err) + return &dto.MessageToCreate{ + Content: "错误: 读取语音数据失败", + MsgID: id, + MsgSeq: msgseq, + MsgType: 0, + } + } + //判断并转码 + if !silk.IsAMRorSILK(recordData) { + mt, ok := silk.CheckAudio(bytes.NewReader(recordData)) + if !ok { + mylog.Errorf("voice type error: " + mt) + return nil + } + recordData = silk.EncoderSilk(recordData) + mylog.Errorf("音频转码ing") + if err != nil { + return nil + } + } + // 转换为base64 + base64Encoded := base64.StdEncoding.EncodeToString(recordData) + + // 上传语音并获取新的URL + newURL, err := images.UploadBase64RecordToServer(base64Encoded) + if err != nil { + mylog.Printf("Error uploading base64 encoded image: %v", err) + return &dto.MessageToCreate{ + Content: "错误: 上传语音失败", MsgID: id, MsgSeq: msgseq, MsgType: 0, diff --git a/template/config_template.go b/template/config_template.go index 0df0aa95..2d7a3899 100644 --- a/template/config_template.go +++ b/template/config_template.go @@ -115,6 +115,7 @@ settings: bind_prefix : "/bind" #需设置 #增强配置项 master_id 可触发 me_prefix : "/me" #需设置 #增强配置项 master_id 可触发 + unlock_prefix : "/unlock" #频道私信卡住了? gsk可以帮到你 在任意子频道发送unlock 你会收到来自机器人的频道私信 #穿透\cos\oss类配置(可选!) frp_port : "0" #不使用请保持为0,frp的端口,frp有内外端口,请在frp软件设置gensokyo的port,并将frp显示的对外端口填入这里 From dfe4d1bd363c8e8126a0c52f55895b2570d2fbf5 Mon Sep 17 00:00:00 2001 From: cosmo Date: Tue, 5 Dec 2023 18:26:39 +0800 Subject: [PATCH 06/14] beta79 --- Processor/ProcessC2CMessage.go | 14 +++--- Processor/ProcessChannelDirectMessage.go | 6 +-- Processor/ProcessGroupMessage.go | 21 ++++---- Processor/ProcessGuildATMessage.go | 4 +- Processor/ProcessGuildNormalMessage.go | 4 +- config/config.go | 11 ++++ handlers/message_parser.go | 64 +++++++++++++++--------- idmap/service.go | 4 +- template/config_template.go | 1 + template/config_template.yml | 3 +- 10 files changed, 80 insertions(+), 52 deletions(-) diff --git a/Processor/ProcessC2CMessage.go b/Processor/ProcessC2CMessage.go index e3e31e55..3bd90c8b 100644 --- a/Processor/ProcessC2CMessage.go +++ b/Processor/ProcessC2CMessage.go @@ -70,7 +70,7 @@ func (p *Processors) ProcessC2CMessage(data *dto.WSC2CMessageData) error { } } //转换at - messageText := handlers.RevertTransformedText(data, "group_private", p.Api, p.Apiv2) + messageText := handlers.RevertTransformedText(data, "group_private", p.Api, p.Apiv2, userid64) if messageText == "" { mylog.Printf("信息被自定义黑白名单拦截") return nil @@ -125,12 +125,6 @@ func (p *Processors) ProcessC2CMessage(data *dto.WSC2CMessageData) error { } else { //将私聊信息转化为群信息(特殊需求情况下) - //转换at - messageText := handlers.RevertTransformedText(data, "group_private", p.Api, p.Apiv2) - if messageText == "" { - mylog.Printf("信息被自定义黑白名单拦截") - return nil - } //转换appid AppIDString := strconv.FormatUint(p.Settings.AppID, 10) //构造echo @@ -156,6 +150,12 @@ func (p *Processors) ProcessC2CMessage(data *dto.WSC2CMessageData) error { mylog.Fatalf("Error storing ID: %v", err) } } + //转换at + messageText := handlers.RevertTransformedText(data, "group_private", p.Api, p.Apiv2, userid64) + if messageText == "" { + mylog.Printf("信息被自定义黑白名单拦截") + return nil + } //框架内指令 p.HandleFrameworkCommand(messageText, data, "group_private") //映射str的messageID到int diff --git a/Processor/ProcessChannelDirectMessage.go b/Processor/ProcessChannelDirectMessage.go index 93970c64..93de2c6e 100644 --- a/Processor/ProcessChannelDirectMessage.go +++ b/Processor/ProcessChannelDirectMessage.go @@ -90,7 +90,7 @@ func (p *Processors) ProcessChannelDirectMessage(data *dto.WSDirectMessageData) } messageID := int(messageID64) //转换at - messageText := handlers.RevertTransformedText(data, "guild_private", p.Api, p.Apiv2) + messageText := handlers.RevertTransformedText(data, "guild_private", p.Api, p.Apiv2, userid64) if messageText == "" { mylog.Printf("信息被自定义黑白名单拦截") return nil @@ -150,7 +150,7 @@ func (p *Processors) ProcessChannelDirectMessage(data *dto.WSDirectMessageData) //获取s s := client.GetGlobalS() //转换at - messageText := handlers.RevertTransformedText(data, "guild_private", p.Api, p.Apiv2) + messageText := handlers.RevertTransformedText(data, "guild_private", p.Api, p.Apiv2, 10000) //todo 这里未转换 if messageText == "" { mylog.Printf("信息被自定义黑白名单拦截") return nil @@ -278,7 +278,7 @@ func (p *Processors) ProcessChannelDirectMessage(data *dto.WSDirectMessageData) //直接储存 适用于私信场景私聊 idmap.WriteConfigv2(data.ChannelID, "guild_id", data.GuildID) //转换at - messageText := handlers.RevertTransformedText(data, "guild_private", p.Api, p.Apiv2) + messageText := handlers.RevertTransformedText(data, "guild_private", p.Api, p.Apiv2, userid64) if messageText == "" { mylog.Printf("信息被自定义黑白名单拦截") return nil diff --git a/Processor/ProcessGroupMessage.go b/Processor/ProcessGroupMessage.go index 735d3959..75014b00 100644 --- a/Processor/ProcessGroupMessage.go +++ b/Processor/ProcessGroupMessage.go @@ -21,17 +21,6 @@ func (p *Processors) ProcessGroupMessage(data *dto.WSGroupATMessageData) error { // 获取s s := client.GetGlobalS() - // 转换at - messageText := handlers.RevertTransformedText(data, "group", p.Api, p.Apiv2) - if messageText == "" { - mylog.Printf("信息被自定义黑白名单拦截") - return nil - } - //群没有at,但用户可以选择加一个 - if config.GetAddAtGroup() { - messageText = "[CQ:at,qq=" + config.GetAppIDStr() + "] " + messageText - } - // 转换appid AppIDString := strconv.FormatUint(p.Settings.AppID, 10) @@ -66,6 +55,16 @@ func (p *Processors) ProcessGroupMessage(data *dto.WSGroupATMessageData) error { return nil } } + // 转换at + messageText := handlers.RevertTransformedText(data, "group", p.Api, p.Apiv2, GroupID64) + if messageText == "" { + mylog.Printf("信息被自定义黑白名单拦截") + return nil + } + //群没有at,但用户可以选择加一个 + if config.GetAddAtGroup() { + messageText = "[CQ:at,qq=" + config.GetAppIDStr() + "] " + messageText + } //框架内指令 p.HandleFrameworkCommand(messageText, data, "group") //映射str的messageID到int diff --git a/Processor/ProcessGuildATMessage.go b/Processor/ProcessGuildATMessage.go index 4ce622a6..faf4ab0a 100644 --- a/Processor/ProcessGuildATMessage.go +++ b/Processor/ProcessGuildATMessage.go @@ -27,7 +27,7 @@ func (p *Processors) ProcessGuildATMessage(data *dto.WSATMessageData) error { //获取s s := client.GetGlobalS() //转换at - messageText := handlers.RevertTransformedText(data, "guild", p.Api, p.Apiv2) + messageText := handlers.RevertTransformedText(data, "guild", p.Api, p.Apiv2, 10000) //todo 这里未转换 if messageText == "" { mylog.Printf("信息被自定义黑白名单拦截") return nil @@ -151,7 +151,7 @@ func (p *Processors) ProcessGuildATMessage(data *dto.WSATMessageData) error { //转成int再互转 idmap.WriteConfigv2(fmt.Sprint(ChannelID64), "guild_id", data.GuildID) //转换at和图片 - messageText := handlers.RevertTransformedText(data, "guild", p.Api, p.Apiv2) + messageText := handlers.RevertTransformedText(data, "guild", p.Api, p.Apiv2, ChannelID64) if messageText == "" { mylog.Printf("信息被自定义黑白名单拦截") return nil diff --git a/Processor/ProcessGuildNormalMessage.go b/Processor/ProcessGuildNormalMessage.go index 18a6ea15..3add806a 100644 --- a/Processor/ProcessGuildNormalMessage.go +++ b/Processor/ProcessGuildNormalMessage.go @@ -26,7 +26,7 @@ func (p *Processors) ProcessGuildNormalMessage(data *dto.WSMessageData) error { //获取s s := client.GetGlobalS() //转换at - messageText := handlers.RevertTransformedText(data, "guild", p.Api, p.Apiv2) + messageText := handlers.RevertTransformedText(data, "guild", p.Api, p.Apiv2, 10000) //这里未转换 if messageText == "" { mylog.Printf("信息被自定义黑白名单拦截") return nil @@ -155,7 +155,7 @@ func (p *Processors) ProcessGuildNormalMessage(data *dto.WSMessageData) error { //转成int再互转 idmap.WriteConfigv2(fmt.Sprint(ChannelID64), "guild_id", data.GuildID) //转换at - messageText := handlers.RevertTransformedText(data, "guild", p.Api, p.Apiv2) + messageText := handlers.RevertTransformedText(data, "guild", p.Api, p.Apiv2, ChannelID64) if messageText == "" { mylog.Printf("信息被自定义黑白名单拦截") return nil diff --git a/config/config.go b/config/config.go index c7e7b69a..0d15edee 100644 --- a/config/config.go +++ b/config/config.go @@ -92,6 +92,7 @@ type Settings struct { HeartBeatInterval int `yaml:"heart_beat_interval"` LaunchReconectTimes int `yaml:"launch_reconnect_times"` UnlockPrefix string `yaml:"unlock_prefix"` + WhiteBypass []int64 `yaml:"white_bypass"` } // LoadConfig 从文件中加载配置并初始化单例配置 @@ -1106,3 +1107,13 @@ func GetUnlockPrefix() string { } return instance.Settings.UnlockPrefix } + +// 获取白名单例外群数组 +func GetWhiteBypass() []int64 { + mu.Lock() + defer mu.Unlock() + if instance != nil { + return instance.Settings.WhiteBypass + } + return nil // 返回nil,如果instance为nil +} diff --git a/handlers/message_parser.go b/handlers/message_parser.go index b03ba32d..41467482 100644 --- a/handlers/message_parser.go +++ b/handlers/message_parser.go @@ -250,7 +250,7 @@ func transformMessageText(messageText string) string { } // 处理at和其他定形文到onebotv11格式(cq码) -func RevertTransformedText(data interface{}, msgtype string, api openapi.OpenAPI, apiv2 openapi.OpenAPI) string { +func RevertTransformedText(data interface{}, msgtype string, api openapi.OpenAPI, apiv2 openapi.OpenAPI, vgid int64) string { var msg *dto.Message var menumsg bool var messageText string @@ -330,36 +330,52 @@ func RevertTransformedText(data interface{}, msgtype string, api openapi.OpenAPI } } - //检查是否启用白名单模式 + // 检查是否启用白名单模式 if config.GetWhitePrefixMode() { - // 获取白名单数组 - whitePrefixes := config.GetWhitePrefixs() - // 加锁以安全地读取 TemporaryCommands - idmap.MutexT.Lock() - temporaryCommands := make([]string, len(idmap.TemporaryCommands)) - copy(temporaryCommands, idmap.TemporaryCommands) - idmap.MutexT.Unlock() - - // 合并白名单和临时指令 - allPrefixes := append(whitePrefixes, temporaryCommands...) - // 默认设置为不匹配 - matched := false - - // 遍历白名单数组,检查是否有匹配项 - for _, prefix := range allPrefixes { - if strings.HasPrefix(messageText, prefix) { - // 找到匹配项,保留 messageText 并跳出循环 - matched = true + // 获取白名单例外群数组(现在返回 int64 数组) + whiteBypass := config.GetWhiteBypass() + bypass := false + + // 检查vgid是否在白名单例外数组中 + for _, id := range whiteBypass { + if id == vgid { + bypass = true break } } - // 如果没有匹配项,则将 messageText 置为兜底回复 兜底回复可空 - if !matched { - messageText = "" - SendMessage(config.GetNoWhiteResponse(), data, msgtype, api, apiv2) + // 如果vgid不在白名单例外数组中,则应用白名单过滤 + if !bypass { + // 获取白名单数组 + whitePrefixes := config.GetWhitePrefixs() + // 加锁以安全地读取 TemporaryCommands + idmap.MutexT.Lock() + temporaryCommands := make([]string, len(idmap.TemporaryCommands)) + copy(temporaryCommands, idmap.TemporaryCommands) + idmap.MutexT.Unlock() + + // 合并白名单和临时指令 + allPrefixes := append(whitePrefixes, temporaryCommands...) + // 默认设置为不匹配 + matched := false + + // 遍历白名单数组,检查是否有匹配项 + for _, prefix := range allPrefixes { + if strings.HasPrefix(messageText, prefix) { + // 找到匹配项,保留 messageText 并跳出循环 + matched = true + break + } + } + + // 如果没有匹配项,则将 messageText 置为兜底回复 兜底回复可空 + if !matched { + messageText = "" + SendMessage(config.GetNoWhiteResponse(), data, msgtype, api, apiv2) + } } } + //检查是否启用黑名单模式 if config.GetBlackPrefixMode() { // 获取黑名单数组 diff --git a/idmap/service.go b/idmap/service.go index 1ae53b96..6fa525a6 100644 --- a/idmap/service.go +++ b/idmap/service.go @@ -783,12 +783,12 @@ func RetrieveVirtualValuev2Pro(realValue string, realValueSub string) (string, s return "", "", fmt.Errorf("error response from server: %s", response["error"]) } - firstValue, ok := response["firstValue"].(string) + firstValue, ok := response["id"].(string) if !ok { return "", "", fmt.Errorf("invalid response format for first value") } - secondValue, ok := response["secondValue"].(string) + secondValue, ok := response["subid"].(string) if !ok { return "", "", fmt.Errorf("invalid response format for second value") } diff --git a/template/config_template.go b/template/config_template.go index 2d7a3899..47cf5b9f 100644 --- a/template/config_template.go +++ b/template/config_template.go @@ -84,6 +84,7 @@ settings: white_prefix_mode : false #公域 过审用 指令白名单模式开关 如果审核严格 请开启并设置白名单指令 以白名单开头的指令会被通过,反之被拦截 white_prefixs : [""] #可设置多个 比如设置 机器人 测试 则只有信息以机器人 测试开头会相应 remove_prefix remove_at 需为true时生效 + white_bypass : [] #格式[1,2,3],白名单不生效的群或用户(私聊时),用于设置自己的灰度沙箱群/灰度沙箱私聊,避免开发测试时反复开关白名单的不便,请勿用于生产环境. No_White_Response : "" #默认不兜底,强烈建议设置一个友善的兜底回复,告知审核机器人已无隐藏指令,如:你输入的指令不对哦,@机器人来获取可用指令 black_prefix_mode : false #公私域 过审用 指令黑名单模式开关 过滤被审核打回的指令不响应 无需改机器人后端 diff --git a/template/config_template.yml b/template/config_template.yml index c9211ce8..6565cfa9 100644 --- a/template/config_template.yml +++ b/template/config_template.yml @@ -81,4 +81,5 @@ settings: AMsgRetryAsPMsg_Count : 1 #当主动信息发送失败时,自动转为后续的被动信息发送,需要开启Lazy message id,该配置项为每次跟随被动信息发送的信息数量,最大5,建议1-3 reconnect_times : 100 #反向ws连接失败后的重试次数,希望一直重试,可设置9999 heart_beat_interval : 10 #反向ws心跳间隔 单位秒 推荐5-10 - launch_reconnect_times : 1 #启动时尝试反向ws连接次数,建议先打开应用端再开启gensokyo,因为启动时连接会阻塞webui启动,默认只连接一次,可自行增大 \ No newline at end of file + launch_reconnect_times : 1 #启动时尝试反向ws连接次数,建议先打开应用端再开启gensokyo,因为启动时连接会阻塞webui启动,默认只连接一次,可自行增大 + white_bypass : [] #格式[1,2,3],白名单不生效的群,用于设置自己的灰度沙箱,避免测试时候反复开关白名单的不便. \ No newline at end of file From bede8d14079b04cad3a52bc484b4661794fb6095 Mon Sep 17 00:00:00 2001 From: cosmo Date: Tue, 5 Dec 2023 21:23:15 +0800 Subject: [PATCH 07/14] beta79 --- Processor/ProcessC2CMessage.go | 5 +++ Processor/ProcessChannelDirectMessage.go | 4 ++ handlers/send_group_msg.go | 54 ++++++++++++++++++++++++ handlers/send_msg.go | 16 +++---- handlers/send_private_msg.go | 16 +++---- 5 files changed, 79 insertions(+), 16 deletions(-) diff --git a/Processor/ProcessC2CMessage.go b/Processor/ProcessC2CMessage.go index 3bd90c8b..ca9eb43d 100644 --- a/Processor/ProcessC2CMessage.go +++ b/Processor/ProcessC2CMessage.go @@ -2,6 +2,7 @@ package Processor import ( + "fmt" "log" "strconv" "time" @@ -112,6 +113,8 @@ func (p *Processors) ProcessC2CMessage(data *dto.WSC2CMessageData) error { echo.AddLazyMessageId(strconv.FormatInt(userid64, 10), data.ID, time.Now()) //储存类型 echo.AddMsgType(AppIDString, userid64, "group_private") + //储存当前群或频道号的类型 + idmap.WriteConfigv2(fmt.Sprint(userid64), "type", "group_private") //储存当前群或频道号的类型 私信不需要 //idmap.WriteConfigv2(data.ChannelID, "type", "group_private") @@ -222,6 +225,8 @@ func (p *Processors) ProcessC2CMessage(data *dto.WSC2CMessageData) error { echo.AddMsgID(AppIDString, userid64, data.ID) //映射类型 echo.AddMsgType(AppIDString, userid64, "group_private") + //储存当前群或频道号的类型 + idmap.WriteConfigv2(fmt.Sprint(userid64), "type", "group_private") //懒message_id池 echo.AddLazyMessageId(strconv.FormatInt(userid64, 10), data.ID, time.Now()) diff --git a/Processor/ProcessChannelDirectMessage.go b/Processor/ProcessChannelDirectMessage.go index 93de2c6e..0adaec0b 100644 --- a/Processor/ProcessChannelDirectMessage.go +++ b/Processor/ProcessChannelDirectMessage.go @@ -128,6 +128,8 @@ func (p *Processors) ProcessChannelDirectMessage(data *dto.WSDirectMessageData) //其实不需要用AppIDString,因为gensokyo是单机器人框架 echo.AddMsgID(AppIDString, userid64, data.ID) echo.AddMsgType(AppIDString, userid64, "guild_private") + //储存当前群或频道号的类型 + idmap.WriteConfigv2(fmt.Sprint(userid64), "type", "guild_private") //懒message_id池 echo.AddLazyMessageId(strconv.FormatInt(userid64, 10), data.ID, time.Now()) @@ -224,6 +226,8 @@ func (p *Processors) ProcessChannelDirectMessage(data *dto.WSDirectMessageData) echo.AddMsgType(AppIDString, userid64, "guild_private") //储存当前群或频道号的类型 idmap.WriteConfigv2(data.ChannelID, "type", "guild_private") + //储存当前群或频道号的类型 + idmap.WriteConfigv2(fmt.Sprint(userid64), "type", "guild_private") //todo 完善频道类型信息转换 //懒message_id池 echo.AddLazyMessageId(strconv.FormatInt(userid64, 10), data.ID, time.Now()) diff --git a/handlers/send_group_msg.go b/handlers/send_group_msg.go index a15ec981..789cc4e5 100644 --- a/handlers/send_group_msg.go +++ b/handlers/send_group_msg.go @@ -41,6 +41,13 @@ func handleSendGroupMsg(client callapi.Client, api openapi.OpenAPI, apiv2 openap if msgType == "" { msgType = GetMessageTypeByGroupid(config.GetAppIDStr(), message.Params.GroupID) } + //新增 内存获取不到从数据库获取 + if msgType == "" { + msgType = GetMessageTypeByUseridV2(message.Params.UserID) + } + if msgType == "" { + msgType = GetMessageTypeByGroupidV2(message.Params.GroupID) + } mylog.Printf("send_group_msg获取到信息类型:%v", msgType) var idInt64 int64 var err error @@ -836,6 +843,30 @@ func GetMessageTypeByUserid(appID string, userID interface{}) string { return echo.GetMsgTypeByKey(key) } +// 通过user_id获取类型 +func GetMessageTypeByUseridV2(userID interface{}) string { + // 从appID和userID生成key + var userIDStr string + switch u := userID.(type) { + case int: + userIDStr = strconv.Itoa(u) + case int64: + userIDStr = strconv.FormatInt(u, 10) + case float64: + userIDStr = strconv.FormatFloat(u, 'f', 0, 64) + case string: + userIDStr = u + default: + // 可能需要处理其他类型或报错 + return "" + } + msgtype, err := idmap.ReadConfigv2(userIDStr, "type") + if err != nil { + mylog.Printf("GetMessageTypeByUseridV2失败:%v", err) + } + return msgtype +} + // 通过group_id获取类型 func GetMessageTypeByGroupid(appID string, GroupID interface{}) string { // 从appID和userID生成key @@ -856,6 +887,29 @@ func GetMessageTypeByGroupid(appID string, GroupID interface{}) string { return echo.GetMsgTypeByKey(key) } +// 通过group_id获取类型 +func GetMessageTypeByGroupidV2(GroupID interface{}) string { + // 从appID和userID生成key + var GroupIDStr string + switch u := GroupID.(type) { + case int: + GroupIDStr = strconv.Itoa(u) + case int64: + GroupIDStr = strconv.FormatInt(u, 10) + case string: + GroupIDStr = u + default: + // 可能需要处理其他类型或报错 + return "" + } + + msgtype, err := idmap.ReadConfigv2(GroupIDStr, "type") + if err != nil { + mylog.Printf("GetMessageTypeByGroupidV2失败:%v", err) + } + return msgtype +} + // uploadMedia 上传媒体并返回FileInfo func uploadMedia(ctx context.Context, groupID string, richMediaMessage *dto.RichMediaMessage, apiv2 openapi.OpenAPI) (string, error) { // 调用API来上传媒体 diff --git a/handlers/send_msg.go b/handlers/send_msg.go index b5380729..9ab47981 100644 --- a/handlers/send_msg.go +++ b/handlers/send_msg.go @@ -26,19 +26,19 @@ func handleSendMsg(client callapi.Client, api openapi.OpenAPI, apiv2 openapi.Ope } //如果获取不到 就用group_id获取信息类型 if msgType == "" { - appID := config.GetAppIDStr() - groupID := message.Params.GroupID - mylog.Printf("appID: %s, GroupID: %v\n", appID, groupID) - - msgType = GetMessageTypeByGroupid(appID, groupID) - mylog.Printf("msgType: %s\n", msgType) + msgType = GetMessageTypeByGroupid(config.GetAppIDStr(), message.Params.GroupID) } - //如果获取不到 就用user_id获取信息类型 if msgType == "" { msgType = GetMessageTypeByUserid(config.GetAppIDStr(), message.Params.UserID) } - + //新增 内存获取不到从数据库获取 + if msgType == "" { + msgType = GetMessageTypeByUseridV2(message.Params.UserID) + } + if msgType == "" { + msgType = GetMessageTypeByGroupidV2(message.Params.GroupID) + } var idInt64 int64 var err error diff --git a/handlers/send_private_msg.go b/handlers/send_private_msg.go index b0e3cdfa..abb6e744 100644 --- a/handlers/send_private_msg.go +++ b/handlers/send_private_msg.go @@ -30,19 +30,19 @@ func handleSendPrivateMsg(client callapi.Client, api openapi.OpenAPI, apiv2 open //如果获取不到 就用group_id获取信息类型 if msgType == "" { - appID := config.GetAppIDStr() - groupID := message.Params.GroupID - mylog.Printf("appID: %s, GroupID: %v\n", appID, groupID) - - msgType = GetMessageTypeByGroupid(appID, groupID) - mylog.Printf("msgType: %s\n", msgType) + msgType = GetMessageTypeByGroupid(config.GetAppIDStr(), message.Params.GroupID) } - //如果获取不到 就用user_id获取信息类型 if msgType == "" { msgType = GetMessageTypeByUserid(config.GetAppIDStr(), message.Params.UserID) } - + //新增 内存获取不到从数据库获取 + if msgType == "" { + msgType = GetMessageTypeByUseridV2(message.Params.UserID) + } + if msgType == "" { + msgType = GetMessageTypeByGroupidV2(message.Params.GroupID) + } var idInt64 int64 var err error From 85aa528f7fde82a12efbd94072281d385af16b24 Mon Sep 17 00:00:00 2001 From: cosmo Date: Tue, 5 Dec 2023 22:42:31 +0800 Subject: [PATCH 08/14] beta81 --- handlers/send_group_msg.go | 4 ++-- handlers/send_guild_channel_msg.go | 17 ++++++++--------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/handlers/send_group_msg.go b/handlers/send_group_msg.go index 789cc4e5..3d643e2a 100644 --- a/handlers/send_group_msg.go +++ b/handlers/send_group_msg.go @@ -862,7 +862,7 @@ func GetMessageTypeByUseridV2(userID interface{}) string { } msgtype, err := idmap.ReadConfigv2(userIDStr, "type") if err != nil { - mylog.Printf("GetMessageTypeByUseridV2失败:%v", err) + //mylog.Printf("GetMessageTypeByUseridV2失败:%v", err) } return msgtype } @@ -905,7 +905,7 @@ func GetMessageTypeByGroupidV2(GroupID interface{}) string { msgtype, err := idmap.ReadConfigv2(GroupIDStr, "type") if err != nil { - mylog.Printf("GetMessageTypeByGroupidV2失败:%v", err) + //mylog.Printf("GetMessageTypeByGroupidV2失败:%v", err) } return msgtype } diff --git a/handlers/send_guild_channel_msg.go b/handlers/send_guild_channel_msg.go index 05796268..b812eb97 100644 --- a/handlers/send_guild_channel_msg.go +++ b/handlers/send_guild_channel_msg.go @@ -28,22 +28,21 @@ func handleSendGuildChannelMsg(client callapi.Client, api openapi.OpenAPI, apiv2 // 当 message.Echo 是字符串类型时执行此块 msgType = echo.GetMsgTypeByKey(echoStr) } - //如果获取不到 就用group_id获取信息类型 if msgType == "" { - appID := config.GetAppIDStr() - groupID := message.Params.GroupID - mylog.Printf("appID: %s, GroupID: %v\n", appID, groupID) - - msgType = GetMessageTypeByGroupid(appID, groupID) - mylog.Printf("msgType: %s\n", msgType) + msgType = GetMessageTypeByGroupid(config.GetAppIDStr(), message.Params.GroupID) } - //如果获取不到 就用user_id获取信息类型 if msgType == "" { msgType = GetMessageTypeByUserid(config.GetAppIDStr(), message.Params.UserID) } - + //新增 内存获取不到从数据库获取 + if msgType == "" { + msgType = GetMessageTypeByUseridV2(message.Params.UserID) + } + if msgType == "" { + msgType = GetMessageTypeByGroupidV2(message.Params.GroupID) + } switch msgType { //原生guild信息 case "guild": From 855972c26daf87bd189c0c00a6ebce67ed8a75e0 Mon Sep 17 00:00:00 2001 From: cosmo Date: Wed, 6 Dec 2023 17:41:40 +0800 Subject: [PATCH 09/14] beta82 --- handlers/send_guild_channel_msg.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/handlers/send_guild_channel_msg.go b/handlers/send_guild_channel_msg.go index b812eb97..d6adab3b 100644 --- a/handlers/send_guild_channel_msg.go +++ b/handlers/send_guild_channel_msg.go @@ -190,6 +190,15 @@ func GenerateReplyMessage(id string, foundItems map[string][]string, messageText MsgSeq: msgseq, MsgType: 0, // Assuming type 0 for images } + } else if imageURLs, ok := foundItems["url_images"]; ok && len(imageURLs) > 0 { + // 发送网络图 + reply = dto.MessageToCreate{ + //EventID: id, // Use a placeholder event ID for now + Image: "https://" + imageURLs[0], // Using the same Image field for external URLs, adjust if needed + MsgID: id, + MsgSeq: msgseq, + MsgType: 0, // Assuming type 0 for images + } } else if voiceURLs, ok := foundItems["base64_record"]; ok && len(voiceURLs) > 0 { //频道 还不支持发语音 // Sending a voice message From 56125625691d48a42712d37309e24b2df979156d Mon Sep 17 00:00:00 2001 From: cosmo Date: Wed, 6 Dec 2023 18:42:42 +0800 Subject: [PATCH 10/14] beta83 --- Processor/ProcessC2CMessage.go | 18 ++++--- Processor/ProcessChannelDirectMessage.go | 18 ++++--- Processor/ProcessGroupMessage.go | 11 +++-- Processor/ProcessGuildATMessage.go | 11 +++-- Processor/ProcessGuildNormalMessage.go | 11 +++-- Processor/Processor.go | 63 +++++++++++++----------- idmap/service.go | 16 ++++++ 7 files changed, 98 insertions(+), 50 deletions(-) diff --git a/Processor/ProcessC2CMessage.go b/Processor/ProcessC2CMessage.go index ca9eb43d..69ecde84 100644 --- a/Processor/ProcessC2CMessage.go +++ b/Processor/ProcessC2CMessage.go @@ -83,6 +83,7 @@ func (p *Processors) ProcessC2CMessage(data *dto.WSC2CMessageData) error { if config.GetArrayValue() { segmentedMessages = handlers.ConvertToSegmentedMessage(data) } + IsBindedUserId := idmap.CheckValue(data.Author.ID, userid64) privateMsg := OnebotPrivateMessage{ RawMessage: messageText, Message: segmentedMessages, @@ -95,9 +96,11 @@ func (p *Processors) ProcessC2CMessage(data *dto.WSC2CMessageData) error { Nickname: "", //这个不支持,但加机器人好友,会收到一个事件,可以对应储存获取,用idmaps可以做到. UserID: userid64, }, - SubType: "friend", - Time: time.Now().Unix(), - Avatar: "", //todo 同上 + SubType: "friend", + Time: time.Now().Unix(), + Avatar: "", //todo 同上 + RealMessageType: "group_private", + IsBindedUserId: IsBindedUserId, } // 根据条件判断是否添加Echo字段 if config.GetTwoWayEcho() { @@ -169,6 +172,7 @@ func (p *Processors) ProcessC2CMessage(data *dto.WSC2CMessageData) error { } messageID := int(messageID64) //todo 判断array模式 然后对Message处理成array格式 + IsBindedUserId := idmap.CheckValue(data.Author.ID, userid64) groupMsg := OnebotGroupMessage{ RawMessage: messageText, Message: messageText, @@ -186,9 +190,11 @@ func (p *Processors) ProcessC2CMessage(data *dto.WSC2CMessageData) error { Area: "0", Level: "0", }, - SubType: "normal", - Time: time.Now().Unix(), - Avatar: "", + SubType: "normal", + Time: time.Now().Unix(), + Avatar: "", + RealMessageType: "group_private", + IsBindedUserId: IsBindedUserId, } //根据条件判断是否增加nick和card var CaN = config.GetCardAndNick() diff --git a/Processor/ProcessChannelDirectMessage.go b/Processor/ProcessChannelDirectMessage.go index 0adaec0b..9f91f2e0 100644 --- a/Processor/ProcessChannelDirectMessage.go +++ b/Processor/ProcessChannelDirectMessage.go @@ -102,6 +102,7 @@ func (p *Processors) ProcessChannelDirectMessage(data *dto.WSDirectMessageData) if config.GetArrayValue() { segmentedMessages = handlers.ConvertToSegmentedMessage(data) } + IsBindedUserId := idmap.CheckValue(data.Author.ID, userid64) privateMsg := OnebotPrivateMessage{ RawMessage: messageText, Message: segmentedMessages, @@ -114,9 +115,11 @@ func (p *Processors) ProcessChannelDirectMessage(data *dto.WSDirectMessageData) Nickname: data.Member.Nick, UserID: userid64, }, - SubType: "friend", - Time: time.Now().Unix(), - Avatar: data.Author.Avatar, + SubType: "friend", + Time: time.Now().Unix(), + Avatar: data.Author.Avatar, + RealMessageType: "guild_private", + IsBindedUserId: IsBindedUserId, } // 根据条件判断是否添加Echo字段 if config.GetTwoWayEcho() { @@ -307,6 +310,7 @@ func (p *Processors) ProcessChannelDirectMessage(data *dto.WSDirectMessageData) if config.GetArrayValue() { segmentedMessages = handlers.ConvertToSegmentedMessage(data) } + IsBindedUserId := idmap.CheckValue(data.Author.ID, userid64) groupMsg := OnebotGroupMessage{ RawMessage: messageText, Message: segmentedMessages, @@ -326,9 +330,11 @@ func (p *Processors) ProcessChannelDirectMessage(data *dto.WSDirectMessageData) Area: "", Level: "0", }, - SubType: "normal", - Time: time.Now().Unix(), - Avatar: data.Author.Avatar, + SubType: "normal", + Time: time.Now().Unix(), + Avatar: data.Author.Avatar, + RealMessageType: "guild_private", + IsBindedUserId: IsBindedUserId, } // 根据条件判断是否添加Echo字段 if config.GetTwoWayEcho() { diff --git a/Processor/ProcessGroupMessage.go b/Processor/ProcessGroupMessage.go index 75014b00..2e088c64 100644 --- a/Processor/ProcessGroupMessage.go +++ b/Processor/ProcessGroupMessage.go @@ -84,6 +84,8 @@ func (p *Processors) ProcessGroupMessage(data *dto.WSGroupATMessageData) error { if config.GetArrayValue() { segmentedMessages = handlers.ConvertToSegmentedMessage(data) } + IsBindedUserId := idmap.CheckValue(data.Author.ID, userid64) + IsBindedGroupId := idmap.CheckValue(data.GroupID, GroupID64) groupMsg := OnebotGroupMessage{ RawMessage: messageText, Message: segmentedMessages, @@ -100,9 +102,12 @@ func (p *Processors) ProcessGroupMessage(data *dto.WSGroupATMessageData) error { Area: "0", Level: "0", }, - SubType: "normal", - Time: time.Now().Unix(), - Avatar: "", + SubType: "normal", + Time: time.Now().Unix(), + Avatar: "", + RealMessageType: "group", + IsBindedUserId: IsBindedUserId, + IsBindedGroupId: IsBindedGroupId, } //根据条件判断是否增加nick和card var CaN = config.GetCardAndNick() diff --git a/Processor/ProcessGuildATMessage.go b/Processor/ProcessGuildATMessage.go index faf4ab0a..4d392742 100644 --- a/Processor/ProcessGuildATMessage.go +++ b/Processor/ProcessGuildATMessage.go @@ -174,6 +174,8 @@ func (p *Processors) ProcessGuildATMessage(data *dto.WSATMessageData) error { if config.GetArrayValue() { segmentedMessages = handlers.ConvertToSegmentedMessage(data) } + IsBindedUserId := idmap.CheckValue(data.Author.ID, userid64) + IsBindedGroupId := idmap.CheckValue(data.GroupID, ChannelID64) groupMsg := OnebotGroupMessage{ RawMessage: messageText, Message: segmentedMessages, @@ -192,9 +194,12 @@ func (p *Processors) ProcessGuildATMessage(data *dto.WSATMessageData) error { Area: "", Level: "0", }, - SubType: "normal", - Time: time.Now().Unix(), - Avatar: data.Author.Avatar, + SubType: "normal", + Time: time.Now().Unix(), + Avatar: data.Author.Avatar, + RealMessageType: "guild", + IsBindedUserId: IsBindedUserId, + IsBindedGroupId: IsBindedGroupId, } // 根据条件判断是否添加Echo字段 if config.GetTwoWayEcho() { diff --git a/Processor/ProcessGuildNormalMessage.go b/Processor/ProcessGuildNormalMessage.go index 3add806a..e23725b9 100644 --- a/Processor/ProcessGuildNormalMessage.go +++ b/Processor/ProcessGuildNormalMessage.go @@ -178,6 +178,8 @@ func (p *Processors) ProcessGuildNormalMessage(data *dto.WSMessageData) error { if config.GetArrayValue() { segmentedMessages = handlers.ConvertToSegmentedMessage(data) } + IsBindedUserId := idmap.CheckValue(data.Author.ID, userid64) + IsBindedGroupId := idmap.CheckValue(data.GroupID, ChannelID64) groupMsg := OnebotGroupMessage{ RawMessage: messageText, Message: segmentedMessages, @@ -196,9 +198,12 @@ func (p *Processors) ProcessGuildNormalMessage(data *dto.WSMessageData) error { Area: "", Level: "0", }, - SubType: "normal", - Time: time.Now().Unix(), - Avatar: data.Author.Avatar, + SubType: "normal", + Time: time.Now().Unix(), + Avatar: data.Author.Avatar, + RealMessageType: "guild", + IsBindedUserId: IsBindedUserId, + IsBindedGroupId: IsBindedGroupId, } // 根据条件判断是否添加Echo字段 if config.GetTwoWayEcho() { diff --git a/Processor/Processor.go b/Processor/Processor.go index 2619bba1..2da9e050 100644 --- a/Processor/Processor.go +++ b/Processor/Processor.go @@ -69,39 +69,44 @@ type OnebotChannelMessage struct { // 群信息事件 type OnebotGroupMessage struct { - RawMessage string `json:"raw_message"` - MessageID int `json:"message_id"` - GroupID int64 `json:"group_id"` // Can be either string or int depending on p.Settings.CompleteFields - MessageType string `json:"message_type"` - PostType string `json:"post_type"` - SelfID int64 `json:"self_id"` // Can be either string or int - Sender Sender `json:"sender"` - SubType string `json:"sub_type"` - Time int64 `json:"time"` - Avatar string `json:"avatar,omitempty"` - Echo string `json:"echo,omitempty"` - Message interface{} `json:"message"` // For array format - MessageSeq int `json:"message_seq"` - Font int `json:"font"` - UserID int64 `json:"user_id"` + RawMessage string `json:"raw_message"` + MessageID int `json:"message_id"` + GroupID int64 `json:"group_id"` // Can be either string or int depending on p.Settings.CompleteFields + MessageType string `json:"message_type"` + PostType string `json:"post_type"` + SelfID int64 `json:"self_id"` // Can be either string or int + Sender Sender `json:"sender"` + SubType string `json:"sub_type"` + Time int64 `json:"time"` + Avatar string `json:"avatar,omitempty"` + Echo string `json:"echo,omitempty"` + Message interface{} `json:"message"` // For array format + MessageSeq int `json:"message_seq"` + Font int `json:"font"` + UserID int64 `json:"user_id"` + RealMessageType string `json:"real_message_type"` //当前信息的真实类型 group group_private guild guild_private + IsBindedGroupId bool `json:"is_binded_group_id"` //当前群号是否是binded后的 + IsBindedUserId bool `json:"is_binded_user_id"` //当前用户号号是否是binded后的 } // 私聊信息事件 type OnebotPrivateMessage struct { - RawMessage string `json:"raw_message"` - MessageID int `json:"message_id"` // Can be either string or int depending on logic - MessageType string `json:"message_type"` - PostType string `json:"post_type"` - SelfID int64 `json:"self_id"` // Can be either string or int depending on logic - Sender PrivateSender `json:"sender"` - SubType string `json:"sub_type"` - Time int64 `json:"time"` - Avatar string `json:"avatar,omitempty"` - Echo string `json:"echo,omitempty"` - Message interface{} `json:"message"` // For array format - MessageSeq int `json:"message_seq"` // Optional field - Font int `json:"font"` // Optional field - UserID int64 `json:"user_id"` // Can be either string or int depending on logic + RawMessage string `json:"raw_message"` + MessageID int `json:"message_id"` // Can be either string or int depending on logic + MessageType string `json:"message_type"` + PostType string `json:"post_type"` + SelfID int64 `json:"self_id"` // Can be either string or int depending on logic + Sender PrivateSender `json:"sender"` + SubType string `json:"sub_type"` + Time int64 `json:"time"` + Avatar string `json:"avatar,omitempty"` + Echo string `json:"echo,omitempty"` + Message interface{} `json:"message"` // For array format + MessageSeq int `json:"message_seq"` // Optional field + Font int `json:"font"` // Optional field + UserID int64 `json:"user_id"` // Can be either string or int depending on logic + RealMessageType string `json:"real_message_type"` //当前信息的真实类型 group group_private guild guild_private + IsBindedUserId bool `json:"is_binded_user_id"` //当前用户号号是否是binded后的 } type PrivateSender struct { diff --git a/idmap/service.go b/idmap/service.go index 6fa525a6..862197ee 100644 --- a/idmap/service.go +++ b/idmap/service.go @@ -88,6 +88,22 @@ func generateRowID(id string, length int) (int64, error) { return rowID, nil } +// 检查id和value是否是转换关系 +func CheckValue(id string, value int64) bool { + // 计算int64值的长度 + length := len(strconv.FormatInt(value, 10)) + + // 使用generateRowID转换id + generatedValue, err := generateRowID(id, length) + if err != nil { + fmt.Println("Error:", err) + return false + } + + // 比较生成的值与给定的值 + return generatedValue == value +} + // 根据a储存b func StoreID(id string) (int64, error) { var newRow int64 From abb5c9c23ea6e6cbaa0e34eb371f60d137794772 Mon Sep 17 00:00:00 2001 From: cosmo Date: Wed, 6 Dec 2023 19:55:55 +0800 Subject: [PATCH 11/14] beta83 --- idmap/service.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/idmap/service.go b/idmap/service.go index 862197ee..cc282009 100644 --- a/idmap/service.go +++ b/idmap/service.go @@ -89,7 +89,7 @@ func generateRowID(id string, length int) (int64, error) { } // 检查id和value是否是转换关系 -func CheckValue(id string, value int64) bool { +func checkValue(id string, value int64) bool { // 计算int64值的长度 length := len(strconv.FormatInt(value, 10)) @@ -100,8 +100,8 @@ func CheckValue(id string, value int64) bool { return false } - // 比较生成的值与给定的值 - return generatedValue == value + // 比较生成的值与给定的值,如果相等返回false,不相等返回true + return generatedValue != value } // 根据a储存b From c8901c7b9ce502a51733341b2f70aa431fc62702 Mon Sep 17 00:00:00 2001 From: cosmo Date: Wed, 6 Dec 2023 19:57:49 +0800 Subject: [PATCH 12/14] beta83 --- idmap/service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/idmap/service.go b/idmap/service.go index cc282009..0250e0fc 100644 --- a/idmap/service.go +++ b/idmap/service.go @@ -89,7 +89,7 @@ func generateRowID(id string, length int) (int64, error) { } // 检查id和value是否是转换关系 -func checkValue(id string, value int64) bool { +func CheckValue(id string, value int64) bool { // 计算int64值的长度 length := len(strconv.FormatInt(value, 10)) From 8a39a801d7041112559f2336d18a187bc03931c1 Mon Sep 17 00:00:00 2001 From: cosmo Date: Wed, 6 Dec 2023 21:22:15 +0800 Subject: [PATCH 13/14] beta83 --- handlers/message_parser.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/handlers/message_parser.go b/handlers/message_parser.go index 41467482..8df7d2c7 100644 --- a/handlers/message_parser.go +++ b/handlers/message_parser.go @@ -133,7 +133,11 @@ func parseMessageContent(paramsMessage callapi.ParamsContent) (string, map[strin default: mylog.Println("Unsupported message format: params.message field is not a string, map or slice") } + //处理at + messageText = transformMessageText(messageText) + //mylog.Printf(messageText) + // 正则表达式部分 var localImagePattern *regexp.Regexp var localRecordPattern *regexp.Regexp @@ -180,9 +184,6 @@ func parseMessageContent(paramsMessage callapi.ParamsContent) (string, map[strin messageText = pattern.pattern.ReplaceAllString(messageText, "") } - //处理at - messageText = transformMessageText(messageText) - // for key, items := range foundItems { // fmt.Printf("Key: %s, Items: %v\n", key, items) // } From 67ec2dd7f8757b20e29ef38764d92f6b9a303613 Mon Sep 17 00:00:00 2001 From: cosmo Date: Wed, 6 Dec 2023 21:35:30 +0800 Subject: [PATCH 14/14] beta84 --- config/config.go | 13 ++++++++++ handlers/message_parser.go | 47 +++++++++++++++++++----------------- template/config_template.go | 7 +++--- template/config_template.yml | 3 ++- 4 files changed, 44 insertions(+), 26 deletions(-) diff --git a/config/config.go b/config/config.go index 0d15edee..abc6cb5a 100644 --- a/config/config.go +++ b/config/config.go @@ -93,6 +93,7 @@ type Settings struct { LaunchReconectTimes int `yaml:"launch_reconnect_times"` UnlockPrefix string `yaml:"unlock_prefix"` WhiteBypass []int64 `yaml:"white_bypass"` + TransferUrl bool `yaml:"transfer_url"` } // LoadConfig 从文件中加载配置并初始化单例配置 @@ -1117,3 +1118,15 @@ func GetWhiteBypass() []int64 { } return nil // 返回nil,如果instance为nil } + +// 获取GetTransferUrl的值 +func GetTransferUrl() bool { + mu.Lock() + defer mu.Unlock() + + if instance == nil { + mylog.Println("Warning: instance is nil when trying to GetTransferUrl value.") + return false + } + return instance.Settings.TransferUrl +} diff --git a/handlers/message_parser.go b/handlers/message_parser.go index 8df7d2c7..9f18ffa8 100644 --- a/handlers/message_parser.go +++ b/handlers/message_parser.go @@ -224,29 +224,32 @@ func transformMessageText(messageText string) string { } return m }) - // 判断服务器地址是否是IP地址 - serverAddress := config.GetServer_dir() - isIP := isIPAddress(serverAddress) - VisualIP := config.GetVisibleIP() - // 使用xurls来查找和替换所有的URL - messageText = xurls.Relaxed.ReplaceAllStringFunc(messageText, func(originalURL string) string { - // 当服务器地址是IP地址且GetVisibleIP为false时,替换URL为空 - if isIP && !VisualIP { - return "" - } + //是否处理url + if config.GetTransferUrl() { + // 判断服务器地址是否是IP地址 + serverAddress := config.GetServer_dir() + isIP := isIPAddress(serverAddress) + VisualIP := config.GetVisibleIP() + // 使用xurls来查找和替换所有的URL + messageText = xurls.Relaxed.ReplaceAllStringFunc(messageText, func(originalURL string) string { + // 当服务器地址是IP地址且GetVisibleIP为false时,替换URL为空 + if isIP && !VisualIP { + return "" + } - // 根据配置处理URL - if config.GetLotusValue() { - // 连接到另一个gensokyo - shortURL := url.GenerateShortURL(originalURL) - return shortURL - } else { - // 自己是主节点 - shortURL := url.GenerateShortURL(originalURL) - // 使用getBaseURL函数来获取baseUrl并与shortURL组合 - return url.GetBaseURL() + "/url/" + shortURL - } - }) + // 根据配置处理URL + if config.GetLotusValue() { + // 连接到另一个gensokyo + shortURL := url.GenerateShortURL(originalURL) + return shortURL + } else { + // 自己是主节点 + shortURL := url.GenerateShortURL(originalURL) + // 使用getBaseURL函数来获取baseUrl并与shortURL组合 + return url.GetBaseURL() + "/url/" + shortURL + } + }) + } return messageText } diff --git a/template/config_template.go b/template/config_template.go index 47cf5b9f..bd115425 100644 --- a/template/config_template.go +++ b/template/config_template.go @@ -60,9 +60,10 @@ settings: #SSL配置类 机器人发送URL设置 - identify_file: true #自动生成域名校验文件,在q.qq.com配置信息URL,在server_dir填入自己已备案域名,正确解析到机器人所在服务器ip地址,机器人即可发送链接 - crt: "" #证书路径 从你的域名服务商或云服务商申请签发SSL证书(qq要求SSL) - key: "" #密钥路径 Apache(crt文件、key文件)示例: "C:\\123.key" \需要双写成\\ + identify_file : true #自动生成域名校验文件,在q.qq.com配置信息URL,在server_dir填入自己已备案域名,正确解析到机器人所在服务器ip地址,机器人即可发送链接 + crt : "" #证书路径 从你的域名服务商或云服务商申请签发SSL证书(qq要求SSL) + key : "" #密钥路径 Apache(crt文件、key文件)示例: "C:\\123.key" \需要双写成\\ + transfer_url : true #默认开启,关闭后自理url发送,配置server_dir为你的域名,配置crt和key后,将域名/url和/image在q.qq.com后台通过校验,自动使用302跳转处理机器人发出的所有域名. #日志类 diff --git a/template/config_template.yml b/template/config_template.yml index 6565cfa9..41f57742 100644 --- a/template/config_template.yml +++ b/template/config_template.yml @@ -82,4 +82,5 @@ settings: reconnect_times : 100 #反向ws连接失败后的重试次数,希望一直重试,可设置9999 heart_beat_interval : 10 #反向ws心跳间隔 单位秒 推荐5-10 launch_reconnect_times : 1 #启动时尝试反向ws连接次数,建议先打开应用端再开启gensokyo,因为启动时连接会阻塞webui启动,默认只连接一次,可自行增大 - white_bypass : [] #格式[1,2,3],白名单不生效的群,用于设置自己的灰度沙箱,避免测试时候反复开关白名单的不便. \ No newline at end of file + white_bypass : [] #格式[1,2,3],白名单不生效的群,用于设置自己的灰度沙箱,避免测试时候反复开关白名单的不便. + transfer_url : true #默认开启,关闭后自理url发送,配置server_dir为你的域名,配置crt和key后,将域名/url和/image在q.qq.com后台通过校验,自动使用302跳转处理机器人发出的所有域名. \ No newline at end of file