diff --git a/coolq/api.go b/coolq/api.go index 90b4ade..d20bf6c 100644 --- a/coolq/api.go +++ b/coolq/api.go @@ -119,7 +119,7 @@ func (bot *CQBot) CQSendGroupMessage(groupId int64, i interface{}, autoEscape bo } if m, ok := i.(gjson.Result); ok { if m.Type == gjson.JSON { - elem := bot.ConvertObjectMessage(m, true,groupId) + elem := bot.ConvertObjectMessage(m, true) fixAt(elem) mid := bot.SendGroupMessage(groupId, &message.SendingMessage{Elements: elem}) if mid == -1 { @@ -144,7 +144,7 @@ func (bot *CQBot) CQSendGroupMessage(groupId int64, i interface{}, autoEscape bo if autoEscape { elem = append(elem, message.NewText(str)) } else { - elem = bot.ConvertStringMessage(str, true,groupId) + elem = bot.ConvertStringMessage(str, true) } fixAt(elem) mid := bot.SendGroupMessage(groupId, &message.SendingMessage{Elements: elem}) @@ -187,7 +187,7 @@ func (bot *CQBot) CQSendGroupForwardMessage(groupId int64, m gjson.Result) MSG { } return m["time"].(int32) }(), - Message: bot.ConvertStringMessage(m["message"].(string), true,groupId), + Message: bot.ConvertStringMessage(m["message"].(string), true), }) return } @@ -196,7 +196,7 @@ func (bot *CQBot) CQSendGroupForwardMessage(groupId int64, m gjson.Result) MSG { } uin, _ := strconv.ParseInt(e.Get("data.uin").Str, 10, 64) name := e.Get("data.name").Str - content := bot.ConvertObjectMessage(e.Get("data.content"), true,groupId) + content := bot.ConvertObjectMessage(e.Get("data.content"), true) if uin != 0 && name != "" && len(content) > 0 { var newElem []message.IMessageElement for _, elem := range content { @@ -242,7 +242,7 @@ func (bot *CQBot) CQSendPrivateMessage(userId int64, i interface{}, autoEscape b var str string if m, ok := i.(gjson.Result); ok { if m.Type == gjson.JSON { - elem := bot.ConvertObjectMessage(m, true,userId) + elem := bot.ConvertObjectMessage(m, true) mid := bot.SendPrivateMessage(userId, &message.SendingMessage{Elements: elem}) if mid == -1 { return Failed(100) @@ -265,7 +265,7 @@ func (bot *CQBot) CQSendPrivateMessage(userId int64, i interface{}, autoEscape b if autoEscape { elem = append(elem, message.NewText(str)) } else { - elem = bot.ConvertStringMessage(str, false,userId) + elem = bot.ConvertStringMessage(str, false) } mid := bot.SendPrivateMessage(userId, &message.SendingMessage{Elements: elem}) if mid == -1 { diff --git a/coolq/bot.go b/coolq/bot.go index e32ca58..12a96e8 100644 --- a/coolq/bot.go +++ b/coolq/bot.go @@ -259,4 +259,3 @@ func (m MSG) ToJson() string { b, _ := json.Marshal(m) return string(b) } - diff --git a/coolq/cqcode.go b/coolq/cqcode.go index 0f8e77f..5e28579 100644 --- a/coolq/cqcode.go +++ b/coolq/cqcode.go @@ -6,6 +6,11 @@ import ( "encoding/hex" "errors" "fmt" + "github.com/Mrs4s/MiraiGo/binary" + "github.com/Mrs4s/MiraiGo/message" + "github.com/Mrs4s/go-cqhttp/global" + log "github.com/sirupsen/logrus" + "github.com/tidwall/gjson" "io/ioutil" "net/url" "path" @@ -13,12 +18,6 @@ import ( "runtime" "strconv" "strings" - - "github.com/Mrs4s/MiraiGo/binary" - "github.com/Mrs4s/MiraiGo/message" - "github.com/Mrs4s/go-cqhttp/global" - log "github.com/sirupsen/logrus" - "github.com/tidwall/gjson" ) var matchReg = regexp.MustCompile(`\[CQ:\w+?.*?]`) @@ -173,7 +172,7 @@ func ToStringMessage(e []message.IMessageElement, code int64, raw ...bool) (r st return } -func (bot *CQBot) ConvertStringMessage(m string, group bool, uid int64) (r []message.IMessageElement) { +func (bot *CQBot) ConvertStringMessage(m string, group bool) (r []message.IMessageElement) { i := matchReg.FindAllStringSubmatchIndex(m, -1) si := 0 for _, idx := range i { @@ -205,14 +204,14 @@ func (bot *CQBot) ConvertStringMessage(m string, group bool, uid int64) (r []mes ReplySeq: org["message-id"].(int32), Sender: org["sender"].(message.Sender).Uin, Time: org["time"].(int32), - Elements: bot.ConvertStringMessage(org["message"].(string), group, uid), + Elements: bot.ConvertStringMessage(org["message"].(string), group), }, }, r...) continue } } } - elem, err := bot.ToElement(t, d, group, uid) + elem, err := bot.ToElement(t, d, group) if err != nil { if !IgnoreInvalidCQCode { log.Warnf("转换CQ码 %v 到MiraiGo Element时出现错误: %v 将原样发送.", code, err) @@ -230,7 +229,7 @@ func (bot *CQBot) ConvertStringMessage(m string, group bool, uid int64) (r []mes return } -func (bot *CQBot) ConvertObjectMessage(m gjson.Result, group bool, uid int64) (r []message.IMessageElement) { +func (bot *CQBot) ConvertObjectMessage(m gjson.Result, group bool) (r []message.IMessageElement) { convertElem := func(e gjson.Result) { t := e.Get("type").Str if t == "reply" && group { @@ -249,7 +248,7 @@ func (bot *CQBot) ConvertObjectMessage(m gjson.Result, group bool, uid int64) (r ReplySeq: org["message-id"].(int32), Sender: org["sender"].(message.Sender).Uin, Time: org["time"].(int32), - Elements: bot.ConvertStringMessage(org["message"].(string), group, uid), + Elements: bot.ConvertStringMessage(org["message"].(string), group), }, }, r...) return @@ -261,7 +260,7 @@ func (bot *CQBot) ConvertObjectMessage(m gjson.Result, group bool, uid int64) (r d[key.Str] = value.Str return true }) - elem, err := bot.ToElement(t, d, group, uid) + elem, err := bot.ToElement(t, d, group) if err != nil { log.Warnf("转换CQ码到MiraiGo Element时出现错误: %v 将忽略本段CQ码.", err) return @@ -269,7 +268,7 @@ func (bot *CQBot) ConvertObjectMessage(m gjson.Result, group bool, uid int64) (r r = append(r, elem) } if m.Type == gjson.String { - return bot.ConvertStringMessage(m.Str, group, uid) + return bot.ConvertStringMessage(m.Str, group) } if m.IsArray() { for _, e := range m.Array() { @@ -282,12 +281,12 @@ func (bot *CQBot) ConvertObjectMessage(m gjson.Result, group bool, uid int64) (r return } -func (bot *CQBot) ToElement(t string, d map[string]string, group bool, uid int64) (message.IMessageElement, error) { +func (bot *CQBot) ToElement(t string, d map[string]string, group bool) (message.IMessageElement, error) { switch t { case "text": return message.NewText(d["text"]), nil case "image": - return bot.makeImageElem(t, d, group, uid) + return bot.makeImageElem(t, d, group) case "record": if !group { return nil, errors.New("private voice unsupported now") @@ -428,8 +427,27 @@ func (bot *CQBot) ToElement(t string, d map[string]string, group bool, uid int64 case "cardimage": source := d["source"] icon := d["icon"] - img, _ := bot.makeImageElem(t, d, group, uid) - return bot.SendNewPic(uid, img, source, icon, group) + minwidth, _ := strconv.ParseInt(d["minwidth"], 10, 64) + if minwidth == 0 { + minwidth = 400 + } + minheight, _ := strconv.ParseInt(d["minheight"], 10, 64) + if minheight == 0 { + minheight = 400 + } + maxwidth, _ := strconv.ParseInt(d["maxwidth"], 10, 64) + if maxwidth == 0 { + maxwidth = 500 + } + maxheight, _ := strconv.ParseInt(d["maxheight"], 10, 64) + if maxheight == 0 { + maxheight = 1000 + } + img, err := bot.makeImageElem(t, d, group) + if err != nil { + return nil, errors.New("send cardimage faild") + } + return bot.SendNewPic(img, source, icon, minwidth, minheight, maxwidth, maxheight, group) default: return nil, errors.New("unsupported cq code: " + t) } @@ -464,7 +482,7 @@ func CQCodeUnescapeValue(content string) string { } // 图片 elem 生成器,单独拎出来,用于公用 -func (bot *CQBot) makeImageElem(t string, d map[string]string, group bool, uid int64) (message.IMessageElement, error) { +func (bot *CQBot) makeImageElem(t string, d map[string]string, group bool) (message.IMessageElement, error) { f := d["file"] if strings.HasPrefix(f, "http") || strings.HasPrefix(f, "https") { cache := d["cache"] @@ -512,7 +530,7 @@ func (bot *CQBot) makeImageElem(t string, d map[string]string, group bool, uid i rawPath += ".cqimg" } if !global.PathExists(rawPath) && d["url"] != "" { - return bot.ToElement(t, map[string]string{"file": d["url"]}, group, uid) + return bot.ToElement(t, map[string]string{"file": d["url"]}, group) } if global.PathExists(rawPath) { b, err := ioutil.ReadFile(rawPath) @@ -548,7 +566,7 @@ func (bot *CQBot) makeImageElem(t string, d map[string]string, group bool, uid i } if size == 0 { if url != "" { - return bot.ToElement(t, map[string]string{"file": url}, group, uid) + return bot.ToElement(t, map[string]string{"file": url}, group) } return nil, errors.New("img size is 0") } @@ -559,7 +577,7 @@ func (bot *CQBot) makeImageElem(t string, d map[string]string, group bool, uid i rsp, err := bot.Client.QueryGroupImage(1, hash, size) if err != nil { if url != "" { - return bot.ToElement(t, map[string]string{"file": url}, group, uid) + return bot.ToElement(t, map[string]string{"file": url}, group) } return nil, err } @@ -568,7 +586,7 @@ func (bot *CQBot) makeImageElem(t string, d map[string]string, group bool, uid i rsp, err := bot.Client.QueryFriendImage(1, hash, size) if err != nil { if url != "" { - return bot.ToElement(t, map[string]string{"file": url}, group, uid) + return bot.ToElement(t, map[string]string{"file": url}, group) } return nil, err } @@ -578,26 +596,32 @@ func (bot *CQBot) makeImageElem(t string, d map[string]string, group bool, uid i } //SendNewPic 一种xml 方式发送的群消息图片 -func (bot *CQBot) SendNewPic(id int64, i message.ImageElement, source string, icon string, group bool) (*message.ServiceElement, error) { - var xml string +func (bot *CQBot) SendNewPic(elem message.IMessageElement, source string, icon string, minwidth int64, minheigt int64, maxwidth int64, maxheight int64, group bool) (*message.ServiceElement, error) { + var xml string + xml = "" + if i, ok := elem.(*message.ImageElement); ok { if group == false { - gm, err := bot.Client.UploadPrivateImage(id, i.Data) + gm, err := bot.Client.UploadPrivateImage(1, i.Data) if err != nil { - log.Warnf("警告: 群 %v 消息图片上传失败: %v", id, err) + log.Warnf("警告: 群 %v 消息图片上传失败: %v", 1, err) return nil, err } - xml = fmt.Sprintf(``, "", gm.ImageId, gm.Md5, i.Size, "", source, icon) + xml = fmt.Sprintf(``, "", gm.ImageId, gm.Md5, len(i.Data), "", minwidth, minheigt, maxwidth, maxheight, source, icon) } else { - gm, err := bot.Client.UploadGroupImage(id, i.Data) + log.Warnf(" img %d", i.Size) + gm, err := bot.Client.UploadGroupImage(1, i.Data) if err != nil { - log.Warnf("警告: 群 %v 消息图片上传失败: %v", id, err) + log.Warnf("警告: 群 %v 消息图片上传失败: %v", 1, err) return nil, err } - xml = fmt.Sprintf(``, "", gm.FileId, gm.Md5, i.Size, "", source, icon) + xml = fmt.Sprintf(``, "", gm.FileId, gm.Md5, len(i.Data), "", minwidth, minheigt, maxwidth, maxheight, source, icon) } + } + if xml != "" { log.Warn(xml) XmlMsg := message.NewRichXml(xml, 5) return XmlMsg, nil + } return nil, errors.New("发送xml图片消息失败") }