diff --git a/coolq/bot.go b/coolq/bot.go index cd9abca..9701a04 100644 --- a/coolq/bot.go +++ b/coolq/bot.go @@ -176,11 +176,18 @@ func (bot *CQBot) GetMessage(mid int32) MSG { } // UploadLocalImageAsGroup 上传本地图片至群聊 -func (bot *CQBot) UploadLocalImageAsGroup(groupCode int64, img *LocalImageElement) (*message.GroupImageElement, error) { +func (bot *CQBot) UploadLocalImageAsGroup(groupCode int64, img *LocalImageElement) (i *message.GroupImageElement, err error) { if img.Stream != nil { - return bot.Client.UploadGroupImage(groupCode, img.Stream) + i, err = bot.Client.UploadGroupImage(groupCode, img.Stream) + } else { + i, err = bot.Client.UploadGroupImageByFile(groupCode, img.File) } - return bot.Client.UploadGroupImageByFile(groupCode, img.File) + + if i != nil { + i.Flash = img.Flash + i.EffectID = img.EffectID + } + return } // UploadLocalVideo 上传本地短视频至群聊 @@ -201,17 +208,23 @@ func (bot *CQBot) UploadLocalVideo(target int64, v *LocalVideoElement) (*message } // UploadLocalImageAsPrivate 上传本地图片至私聊 -func (bot *CQBot) UploadLocalImageAsPrivate(userID int64, img *LocalImageElement) (*message.FriendImageElement, error) { +func (bot *CQBot) UploadLocalImageAsPrivate(userID int64, img *LocalImageElement) (i *message.FriendImageElement, err error) { if img.Stream != nil { - return bot.Client.UploadPrivateImage(userID, img.Stream) + i, err = bot.Client.UploadPrivateImage(userID, img.Stream) + } else { + // need update. + f, e := os.Open(img.File) + if e != nil { + return nil, e + } + defer f.Close() + i, err = bot.Client.UploadPrivateImage(userID, f) } - // need update. - f, err := os.Open(img.File) - if err != nil { - return nil, err + + if i != nil { + i.Flash = img.Flash } - defer f.Close() - return bot.Client.UploadPrivateImage(userID, f) + return } // SendGroupMessage 发送群消息 diff --git a/coolq/cqcode.go b/coolq/cqcode.go index d46461e..261b1dd 100644 --- a/coolq/cqcode.go +++ b/coolq/cqcode.go @@ -65,9 +65,11 @@ type GiftElement struct { // LocalImageElement 本地图片 type LocalImageElement struct { - message.ImageElement Stream io.ReadSeeker File string + + Flash bool + EffectID int32 } // LocalVoiceElement 本地语音 @@ -83,6 +85,11 @@ type LocalVideoElement struct { thumb io.ReadSeeker } +// Type implements the message.IMessageElement. +func (e *LocalImageElement) Type() message.ElementType { + return message.Image +} + // Type 获取元素类型ID func (e *GiftElement) Type() message.ElementType { // Make message.IMessageElement Happy @@ -202,31 +209,28 @@ func ToArrayMessage(e []message.IMessageElement, groupID int64) (r []MSG) { "type": "video", "data": map[string]string{"file": o.Name, "url": o.Url}, } - case *message.ImageElement: - m = MSG{ - "type": "image", - "data": map[string]string{"file": o.Filename, "url": o.Url}, - } case *message.GroupImageElement: + data := map[string]string{"file": hex.EncodeToString(o.Md5) + ".image", "url": o.Url} + switch { + case o.Flash: + data["type"] = "flash" + case o.EffectID != 0: + data["type"] = "show" + data["id"] = strconv.FormatInt(int64(o.EffectID), 10) + } m = MSG{ "type": "image", - "data": map[string]string{"file": hex.EncodeToString(o.Md5) + ".image", "url": o.Url}, + "data": data, } case *message.FriendImageElement: + data := map[string]string{"file": hex.EncodeToString(o.Md5) + ".image", "url": o.Url} + if o.Flash { + data["type"] = "flash" + } m = MSG{ "type": "image", - "data": map[string]string{"file": hex.EncodeToString(o.Md5) + ".image", "url": o.Url}, + "data": data, } - case *message.GroupFlashImgElement: - return []MSG{{ - "type": "image", - "data": map[string]string{"file": o.Filename, "type": "flash"}, - }} - case *message.FriendFlashImgElement: - return []MSG{{ - "type": "image", - "data": map[string]string{"file": o.Filename, "type": "flash"}, - }} case *message.ServiceElement: if isOk := strings.Contains(o.Content, "= 40006 { id = 40000 } - if i, ok := img.(*message.GroupImageElement); ok { - return &message.GroupShowPicElement{GroupImageElement: *i, EffectId: int32(id)}, nil - } - return img, nil + default: + return img, err } - + switch img := img.(type) { + case *LocalImageElement: + img.Flash = flash + img.EffectID = int32(id) + case *message.GroupImageElement: + img.Flash = flash + img.EffectID = int32(id) + case *message.FriendImageElement: + img.Flash = flash + } + return img, err case "poke": t, _ := strconv.ParseInt(d["qq"], 10, 64) return &PokeElement{Target: t}, nil @@ -935,7 +929,6 @@ func (bot *CQBot) ToElement(t string, d map[string]string, isGroup bool) (m inte default: return nil, errors.New("unsupported cq code: " + t) } - return nil, nil } // XMLEscape 将字符串c转义为XML字符串 @@ -1189,7 +1182,7 @@ func (bot *CQBot) makeShowPic(elem message.IMessageElement, source string, brief return nil, err } suf = gm - xml = fmt.Sprintf(``, brief, "", gm.Md5, gm.Md5, len(i.Data), "", minWidth, minHeight, maxWidth, maxHeight, source, icon) + xml = fmt.Sprintf(``, brief, "", gm.Md5, gm.Md5, gm.Size, "", minWidth, minHeight, maxWidth, maxHeight, source, icon) } else { gm, err := bot.UploadLocalImageAsGroup(int64(r), i) if err != nil { @@ -1197,7 +1190,7 @@ func (bot *CQBot) makeShowPic(elem message.IMessageElement, source string, brief return nil, err } suf = gm - xml = fmt.Sprintf(``, brief, "", gm.Md5, gm.Md5, len(i.Data), "", minWidth, minHeight, maxWidth, maxHeight, source, icon) + xml = fmt.Sprintf(``, brief, "", gm.Md5, gm.Md5, gm.Size, "", minWidth, minHeight, maxWidth, maxHeight, source, icon) } } diff --git a/coolq/event.go b/coolq/event.go index d3351b6..af24a77 100644 --- a/coolq/event.go +++ b/coolq/event.go @@ -542,24 +542,13 @@ func (bot *CQBot) groupDecrease(groupCode, userUin int64, operator *client.Group func (bot *CQBot) checkMedia(e []message.IMessageElement) { for _, elem := range e { switch i := elem.(type) { - case *message.ImageElement: - filename := hex.EncodeToString(i.Md5) + ".image" - if !global.PathExists(path.Join(global.ImagePath, filename)) { - _ = ioutil.WriteFile(path.Join(global.ImagePath, filename), binary.NewWriterF(func(w *binary.Writer) { - w.Write(i.Md5) - w.WriteUInt32(uint32(i.Size)) - w.WriteString(i.Filename) - w.WriteString(i.Url) - }), 0o644) - } - i.Filename = filename case *message.GroupImageElement: filename := hex.EncodeToString(i.Md5) + ".image" if !global.PathExists(path.Join(global.ImagePath, filename)) { _ = ioutil.WriteFile(path.Join(global.ImagePath, filename), binary.NewWriterF(func(w *binary.Writer) { w.Write(i.Md5) w.WriteUInt32(uint32(i.Size)) - w.WriteString(filename) + w.WriteString(i.ImageId) w.WriteString(i.Url) }), 0o644) } @@ -568,33 +557,11 @@ func (bot *CQBot) checkMedia(e []message.IMessageElement) { if !global.PathExists(path.Join(global.ImagePath, filename)) { _ = ioutil.WriteFile(path.Join(global.ImagePath, filename), binary.NewWriterF(func(w *binary.Writer) { w.Write(i.Md5) - w.WriteUInt32(uint32(0)) // 发送时会调用url, 大概没事 - w.WriteString(filename) + w.WriteUInt32(uint32(i.Size)) + w.WriteString(i.ImageId) w.WriteString(i.Url) }), 0o644) } - case *message.GroupFlashImgElement: - filename := hex.EncodeToString(i.Md5) + ".image" - if !global.PathExists(path.Join(global.ImagePath, filename)) { - _ = ioutil.WriteFile(path.Join(global.ImagePath, filename), binary.NewWriterF(func(w *binary.Writer) { - w.Write(i.Md5) - w.WriteUInt32(uint32(i.Size)) - w.WriteString(i.Filename) - w.WriteString("") - }), 0o644) - } - i.Filename = filename - case *message.FriendFlashImgElement: - filename := hex.EncodeToString(i.Md5) + ".image" - if !global.PathExists(path.Join(global.ImagePath, filename)) { - _ = ioutil.WriteFile(path.Join(global.ImagePath, filename), binary.NewWriterF(func(w *binary.Writer) { - w.Write(i.Md5) - w.WriteUInt32(uint32(i.Size)) - w.WriteString(i.Filename) - w.WriteString("") - }), 0o644) - } - i.Filename = filename case *message.VoiceElement: i.Name = strings.ReplaceAll(i.Name, "{", "") i.Name = strings.ReplaceAll(i.Name, "}", "") diff --git a/go.mod b/go.mod index 0f93fc8..d094563 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.16 require ( github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f github.com/Microsoft/go-winio v0.5.0 - github.com/Mrs4s/MiraiGo v0.0.0-20210717143543-36f842281233 + github.com/Mrs4s/MiraiGo v0.0.0-20210718033251-b93c02e18e06 github.com/dustin/go-humanize v1.0.0 github.com/gorilla/websocket v1.4.2 github.com/guonaihong/gout v0.2.1 @@ -26,7 +26,6 @@ require ( github.com/wdvxdr1123/go-silk v0.0.0-20210316130616-d47b553def60 github.com/willf/bitset v1.2.0 // indirect golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e - golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d // indirect golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b golang.org/x/time v0.0.0-20210611083556-38a9dc6acbc6 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b diff --git a/go.sum b/go.sum index 9920c30..633e26f 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f/g github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/Microsoft/go-winio v0.5.0 h1:Elr9Wn+sGKPlkaBvwu4mTrxtmOp3F3yV9qhaHbXGjwU= github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Mrs4s/MiraiGo v0.0.0-20210717143543-36f842281233 h1:M5o5ErEo8R6Xz5zBncPSYtVm2jsM7HBv+1zlGwTy4iM= -github.com/Mrs4s/MiraiGo v0.0.0-20210717143543-36f842281233/go.mod h1:CPaznIPn415uQqxJgjyMHLqGLkvLS6R6+bkW3/fe08Q= +github.com/Mrs4s/MiraiGo v0.0.0-20210718033251-b93c02e18e06 h1:l94JX8GzyxRu8kR0f1VmnWl8NnNOk0frPxuGcRPzoWU= +github.com/Mrs4s/MiraiGo v0.0.0-20210718033251-b93c02e18e06/go.mod h1:CPaznIPn415uQqxJgjyMHLqGLkvLS6R6+bkW3/fe08Q= github.com/bits-and-blooms/bitset v1.2.0 h1:Kn4yilvwNtMACtf1eYDlG8H77R07mZSPbMjLyS07ChA= github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -137,8 +137,6 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e h1:gsTQYXdTw2Gq7RBsWvlQ91b+aEQ6bXFUngBGuR8sPpI= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d h1:RNPAfi2nHY7C2srAV8A49jpsYr0ADedCk1wq6fTMTvs= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -171,9 +169,8 @@ golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b h1:9zKuko04nR4gjZ4+DNjHqRlA golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20210611083556-38a9dc6acbc6 h1:Vv0JUPWTyeqUq42B2WJ1FeIDjjvGKoA2Ss+Ts0lAVbs= golang.org/x/time v0.0.0-20210611083556-38a9dc6acbc6/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=