diff --git a/Processor/ProcessC2CMessage.go b/Processor/ProcessC2CMessage.go index 797d1754..e3e31e55 100644 --- a/Processor/ProcessC2CMessage.go +++ b/Processor/ProcessC2CMessage.go @@ -139,9 +139,11 @@ func (p *Processors) ProcessC2CMessage(data *dto.WSC2CMessageData) error { //映射str的userid到int var userid64 int64 var err error + var magic int64 if config.GetIdmapPro() { //将真实id转为int userid64 - _, userid64, err = idmap.StoreIDv2Pro("group_private", data.Author.ID) + magic, userid64, err = idmap.StoreIDv2Pro("group_private", data.Author.ID) + mylog.Printf("魔法数字:%v", magic) //690426430 if err != nil { mylog.Fatalf("Error storing ID: %v", err) } diff --git a/Processor/Processor.go b/Processor/Processor.go index f657b8b7..493f0759 100644 --- a/Processor/Processor.go +++ b/Processor/Processor.go @@ -682,6 +682,12 @@ func (p *Processors) Autobind(data interface{}) error { mylog.Printf("Error storing ID: %v", err) return nil } + //转换idmap-pro 虚拟值 + //将真实id转为int userid64 + _, _, err = idmap.StoreIDv2Pro(groupID, realID) + if err != nil { + mylog.Fatalf("Error storing ID689: %v", err) + } // 单独检查vuin和gid的绑定状态 vuinBound := strconv.FormatInt(userid64, 10) == vuinstr gidBound := strconv.FormatInt(GroupID64, 10) == idValuestr @@ -692,9 +698,10 @@ func (p *Processors) Autobind(data interface{}) error { return err } // idmaps pro也更新 - idmap.UpdateVirtualValuev2Pro(GroupID64, idValue, userid64, vuinValue) - // 处理同一个群群友的gid刷新 - idmap.UpdateKeysWithNewID(groupID, idValuestr) + err = idmap.UpdateVirtualValuev2Pro(GroupID64, idValue, userid64, vuinValue) + if err != nil { + mylog.Fatalf("Error storing ID703: %v", err) + } } else if !vuinBound { // 只有vuin未绑定,更新vuin映射 if err := idmap.UpdateVirtualValuev2(userid64, vuinValue); err != nil { @@ -703,8 +710,6 @@ func (p *Processors) Autobind(data interface{}) error { } // idmaps pro也更新,但只更新vuin idmap.UpdateVirtualValuev2Pro(GroupID64, idValue, userid64, vuinValue) - // 处理同一个群群友的gid刷新 - idmap.UpdateKeysWithNewID(groupID, idValuestr) } else if !gidBound { // 只有gid未绑定,更新gid映射 if err := idmap.UpdateVirtualValuev2(GroupID64, idValue); err != nil { @@ -713,8 +718,6 @@ func (p *Processors) Autobind(data interface{}) error { } // idmaps pro也更新,但只更新gid idmap.UpdateVirtualValuev2Pro(GroupID64, idValue, userid64, vuinValue) - // 处理同一个群群友的gid刷新 - idmap.UpdateKeysWithNewID(groupID, idValuestr) } else { // 两者都已绑定,不执行任何操作 mylog.Errorf("Both vuin and gid are already binded") diff --git a/handlers/message_parser.go b/handlers/message_parser.go index 1385154d..67ff5db8 100644 --- a/handlers/message_parser.go +++ b/handlers/message_parser.go @@ -150,6 +150,7 @@ func parseMessageContent(paramsMessage callapi.ParamsContent) (string, map[strin urlImagePattern := 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?://(.+)\]`) patterns := []struct { key string @@ -160,6 +161,7 @@ func parseMessageContent(paramsMessage callapi.ParamsContent) (string, map[strin {"base64_image", base64ImagePattern}, {"base64_record", base64RecordPattern}, {"local_record", localRecordPattern}, + {"url_record", urlRecordPattern}, } foundItems := make(map[string][]string) diff --git a/handlers/send_group_msg.go b/handlers/send_group_msg.go index fc2645bb..b737f584 100644 --- a/handlers/send_group_msg.go +++ b/handlers/send_group_msg.go @@ -540,6 +540,71 @@ func generateGroupMessage(id string, foundItems map[string][]string, messageText SrvSendMsg: false, } } + } else if imageURLs, ok := foundItems["url_record"]; ok && len(imageURLs) > 0 { + var newpiclink string + if config.GetUrlPicTransfer() { + // 从URL下载图片 + resp, err := http.Get("http://" + 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, + } + } + + // 转换为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, + } + } + // 将图片链接缩短 避免 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 = "http://" + imageURLs[0] + } + + // 发链接图片 + return &dto.RichMediaMessage{ + EventID: id, + FileType: 3, // 3代表语音 + URL: newpiclink, // 新语音链接 + Content: "", // 这个字段文档没有了 + SrvSendMsg: false, + } } else if base64_image, ok := foundItems["base64_image"]; ok && len(base64_image) > 0 { // todo 适配base64图片 //因为QQ群没有 form方式上传,所以在gensokyo内置了图床,需公网,或以lotus方式连接位于公网的gensokyo diff --git a/handlers/send_private_msg.go b/handlers/send_private_msg.go index 6538cf71..5962f553 100644 --- a/handlers/send_private_msg.go +++ b/handlers/send_private_msg.go @@ -72,7 +72,8 @@ func handleSendPrivateMsg(client callapi.Client, api openapi.OpenAPI, apiv2 open var UserID string if config.GetIdmapPro() { //还原真实的userid - _, UserID, err = idmap.RetrieveRowByIDv2Pro("group_private", message.Params.UserID.(string)) + //mylog.Printf("group_private:%v", message.Params.UserID.(string)) + _, UserID, err = idmap.RetrieveRowByIDv2Pro("690426430", message.Params.UserID.(string)) if err != nil { mylog.Printf("Error reading config: %v", err) return diff --git a/idmap/service.go b/idmap/service.go index 75ae2740..1ae53b96 100644 --- a/idmap/service.go +++ b/idmap/service.go @@ -1040,7 +1040,7 @@ func FindSubKeysById(id string) ([]string, error) { return subKeys, nil } -// 场景: xxx:yyy zzz:bbb zzz:bbb xxx:yyy 把xxx(id)替换为newID 比如更换群号 +// 场景: xxx:yyy zzz:bbb zzz:bbb xxx:yyy 把xxx(id)替换为newID 比如更换群号(会卡住) func UpdateKeysWithNewID(id, newID string) error { return db.Update(func(tx *bolt.Tx) error { b := tx.Bucket([]byte(BucketName))