mirror of
https://github.com/Mrs4s/go-cqhttp.git
synced 2025-06-30 11:53:25 +00:00
Compare commits
7 Commits
Author | SHA1 | Date | |
---|---|---|---|
d8bad9a66a | |||
c854339b2d | |||
b61fe4e43e | |||
d5ee8fb331 | |||
fa5ee669f4 | |||
61f103ac1d | |||
0564314671 |
@ -27,6 +27,7 @@
|
|||||||
<summary>已实现CQ码</summary>
|
<summary>已实现CQ码</summary>
|
||||||
|
|
||||||
- [CQ:image]
|
- [CQ:image]
|
||||||
|
- [CQ:record]
|
||||||
- [CQ:face]
|
- [CQ:face]
|
||||||
- [CQ:at]
|
- [CQ:at]
|
||||||
- [CQ:share]
|
- [CQ:share]
|
||||||
|
@ -99,6 +99,15 @@ func (bot *CQBot) SendGroupMessage(groupId int64, m *message.SendingMessage) int
|
|||||||
newElem = append(newElem, gm)
|
newElem = append(newElem, gm)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if i, ok := elem.(*message.VoiceElement); ok {
|
||||||
|
gv, err := bot.Client.UploadGroupPtt(groupId, i.Data, int32(len(i.Data)))
|
||||||
|
if err != nil {
|
||||||
|
log.Warnf("警告: 群 %v 消息语音上传失败: %v", groupId, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
newElem = append(newElem, gv)
|
||||||
|
continue
|
||||||
|
}
|
||||||
newElem = append(newElem, elem)
|
newElem = append(newElem, elem)
|
||||||
}
|
}
|
||||||
m.Elements = newElem
|
m.Elements = newElem
|
||||||
|
@ -44,6 +44,8 @@ func ToStringMessage(e []message.IMessageElement, code int64, raw ...bool) (r st
|
|||||||
r += fmt.Sprintf("[CQ:forward,id=%s]", o.ResId)
|
r += fmt.Sprintf("[CQ:forward,id=%s]", o.ResId)
|
||||||
case *message.FaceElement:
|
case *message.FaceElement:
|
||||||
r += fmt.Sprintf(`[CQ:face,id=%d]`, o.Index)
|
r += fmt.Sprintf(`[CQ:face,id=%d]`, o.Index)
|
||||||
|
case *message.VoiceElement:
|
||||||
|
r += fmt.Sprintf(`[CQ:record,file=%s]`, o.Name)
|
||||||
case *message.ImageElement:
|
case *message.ImageElement:
|
||||||
if ur {
|
if ur {
|
||||||
r += fmt.Sprintf(`[CQ:image,file=%s]`, o.Filename)
|
r += fmt.Sprintf(`[CQ:image,file=%s]`, o.Filename)
|
||||||
@ -96,7 +98,8 @@ func (bot *CQBot) ConvertStringMessage(m string, group bool) (r []message.IMessa
|
|||||||
}
|
}
|
||||||
elem, err := bot.ToElement(t, d, group)
|
elem, err := bot.ToElement(t, d, group)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warnf("转换CQ码到MiraiGo Element时出现错误: %v 将忽略本段CQ码.", err)
|
log.Warnf("转换CQ码到MiraiGo Element时出现错误: %v 将原样发送.", err)
|
||||||
|
r = append(r, message.NewText(code))
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
r = append(r, elem)
|
r = append(r, elem)
|
||||||
@ -194,12 +197,15 @@ func (bot *CQBot) ToElement(t string, d map[string]string, group bool) (message.
|
|||||||
return message.NewImage(b), nil
|
return message.NewImage(b), nil
|
||||||
}
|
}
|
||||||
rawPath := path.Join(global.IMAGE_PATH, f)
|
rawPath := path.Join(global.IMAGE_PATH, f)
|
||||||
|
if !global.PathExists(rawPath) && global.PathExists(rawPath+".cqimg") {
|
||||||
|
rawPath += ".cqimg"
|
||||||
|
}
|
||||||
if global.PathExists(rawPath) {
|
if global.PathExists(rawPath) {
|
||||||
b, err := ioutil.ReadFile(rawPath)
|
b, err := ioutil.ReadFile(rawPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if path.Ext(rawPath) != ".image" {
|
if path.Ext(rawPath) != ".image" && path.Ext(rawPath) != ".cqimg" {
|
||||||
return message.NewImage(b), nil
|
return message.NewImage(b), nil
|
||||||
}
|
}
|
||||||
if len(b) < 20 {
|
if len(b) < 20 {
|
||||||
@ -212,9 +218,9 @@ func (bot *CQBot) ToElement(t string, d map[string]string, group bool) (message.
|
|||||||
kv := strings.SplitN(line, "=", 2)
|
kv := strings.SplitN(line, "=", 2)
|
||||||
switch kv[0] {
|
switch kv[0] {
|
||||||
case "md5":
|
case "md5":
|
||||||
hash, _ = hex.DecodeString(kv[1])
|
hash, _ = hex.DecodeString(strings.ReplaceAll(kv[1], "\r", ""))
|
||||||
case "size":
|
case "size":
|
||||||
t, _ := strconv.Atoi(kv[1])
|
t, _ := strconv.Atoi(strings.ReplaceAll(kv[1], "\r", ""))
|
||||||
size = int32(t)
|
size = int32(t)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -223,6 +229,12 @@ func (bot *CQBot) ToElement(t string, d map[string]string, group bool) (message.
|
|||||||
hash = r.ReadBytes(16)
|
hash = r.ReadBytes(16)
|
||||||
size = r.ReadInt32()
|
size = r.ReadInt32()
|
||||||
}
|
}
|
||||||
|
if size == 0 {
|
||||||
|
return nil, errors.New("img size is 0")
|
||||||
|
}
|
||||||
|
if len(hash) != 16 {
|
||||||
|
return nil, errors.New("invalid hash")
|
||||||
|
}
|
||||||
if group {
|
if group {
|
||||||
rsp, err := bot.Client.QueryGroupImage(1, hash, size)
|
rsp, err := bot.Client.QueryGroupImage(1, hash, size)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -237,6 +249,44 @@ func (bot *CQBot) ToElement(t string, d map[string]string, group bool) (message.
|
|||||||
return rsp, nil
|
return rsp, nil
|
||||||
}
|
}
|
||||||
return nil, errors.New("invalid image")
|
return nil, errors.New("invalid image")
|
||||||
|
case "record":
|
||||||
|
if !group {
|
||||||
|
return nil, errors.New("private voice unsupported now")
|
||||||
|
}
|
||||||
|
f := d["file"]
|
||||||
|
var data []byte
|
||||||
|
if strings.HasPrefix(f, "http") || strings.HasPrefix(f, "https") {
|
||||||
|
b, err := global.GetBytes(f)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
data = b
|
||||||
|
}
|
||||||
|
if strings.HasPrefix(f, "base64") {
|
||||||
|
b, err := base64.StdEncoding.DecodeString(strings.ReplaceAll(f, "base64://", ""))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
data = b
|
||||||
|
}
|
||||||
|
if strings.HasPrefix(f, "file") {
|
||||||
|
fu, err := url.Parse(f)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if strings.HasPrefix(fu.Path, "/") && runtime.GOOS == `windows` {
|
||||||
|
fu.Path = fu.Path[1:]
|
||||||
|
}
|
||||||
|
b, err := ioutil.ReadFile(fu.Path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
data = b
|
||||||
|
}
|
||||||
|
if !global.IsAMR(data) {
|
||||||
|
return nil, errors.New("unsupported voice file format (please use AMR file for now)")
|
||||||
|
}
|
||||||
|
return &message.VoiceElement{Data: data}, nil
|
||||||
case "face":
|
case "face":
|
||||||
id, err := strconv.Atoi(d["id"])
|
id, err := strconv.Atoi(d["id"])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -31,3 +31,10 @@ func Check(err error) {
|
|||||||
log.Fatalf("遇到错误: %v", err)
|
log.Fatalf("遇到错误: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func IsAMR(b []byte) bool {
|
||||||
|
if len(b) <= 6 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return b[0] == 0x23 && b[1] == 0x21 && b[2] == 0x41 && b[3] == 0x4D && b[4] == 0x52 // amr file header
|
||||||
|
}
|
||||||
|
2
go.mod
2
go.mod
@ -3,7 +3,7 @@ module github.com/Mrs4s/go-cqhttp
|
|||||||
go 1.14
|
go 1.14
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/Mrs4s/MiraiGo v0.0.0-20200807030850-ed30f7ad5934
|
github.com/Mrs4s/MiraiGo v0.0.0-20200808044635-cd20d7d43dbb
|
||||||
github.com/gin-gonic/gin v1.6.3
|
github.com/gin-gonic/gin v1.6.3
|
||||||
github.com/gorilla/websocket v1.4.2
|
github.com/gorilla/websocket v1.4.2
|
||||||
github.com/guonaihong/gout v0.1.1
|
github.com/guonaihong/gout v0.1.1
|
||||||
|
4
go.sum
4
go.sum
@ -2,6 +2,10 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
|
|||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
github.com/Mrs4s/MiraiGo v0.0.0-20200807030850-ed30f7ad5934 h1:LoNjIsnyEQFGP9IchIQ65yHRCfNKSru3BAOguRepkCM=
|
github.com/Mrs4s/MiraiGo v0.0.0-20200807030850-ed30f7ad5934 h1:LoNjIsnyEQFGP9IchIQ65yHRCfNKSru3BAOguRepkCM=
|
||||||
github.com/Mrs4s/MiraiGo v0.0.0-20200807030850-ed30f7ad5934/go.mod h1:0je03wji/tSw4bUH4QCF2Z4/EjyNWjSJTyy5tliX6EM=
|
github.com/Mrs4s/MiraiGo v0.0.0-20200807030850-ed30f7ad5934/go.mod h1:0je03wji/tSw4bUH4QCF2Z4/EjyNWjSJTyy5tliX6EM=
|
||||||
|
github.com/Mrs4s/MiraiGo v0.0.0-20200808003732-2a32e623270d h1:K9jHdcO13mLqQB0xm0/ZlY852FoVQJ/WSDwfdmfhDlU=
|
||||||
|
github.com/Mrs4s/MiraiGo v0.0.0-20200808003732-2a32e623270d/go.mod h1:0je03wji/tSw4bUH4QCF2Z4/EjyNWjSJTyy5tliX6EM=
|
||||||
|
github.com/Mrs4s/MiraiGo v0.0.0-20200808044635-cd20d7d43dbb h1:XLe/UreYJRT65GStA3+irRL1Ao0pHZwBtCmTc+4prwA=
|
||||||
|
github.com/Mrs4s/MiraiGo v0.0.0-20200808044635-cd20d7d43dbb/go.mod h1:0je03wji/tSw4bUH4QCF2Z4/EjyNWjSJTyy5tliX6EM=
|
||||||
github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0=
|
github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0=
|
||||||
github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE=
|
github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE=
|
||||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||||
|
Reference in New Issue
Block a user