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=