1
0
mirror of https://github.com/Mrs4s/go-cqhttp.git synced 2025-06-30 20:03:24 +00:00

Compare commits

..

16 Commits

Author SHA1 Message Date
2156b6083b update MiraiGo. 2021-01-16 06:00:33 +08:00
b47c2aeac6 Merge branch 'master' into dev 2021-01-16 05:59:31 +08:00
9beae584de Merge pull request #560 from wdvxdr1123/patch-2
fix #557
2021-01-14 02:31:34 +08:00
59cd986050 fix #561 2021-01-13 22:56:28 +08:00
7a9a021c54 fix codec path 2021-01-13 22:35:44 +08:00
de4de5052d fix #557 & remove some goto 2021-01-13 11:43:39 +08:00
b075280d2b fix build 2021-01-13 11:22:59 +08:00
4cb3d8f33e Merge pull request #559 from Ink-33/master
修复codec编译问题
2021-01-13 08:06:02 +08:00
0cd06daf08 Update github action 2021-01-13 04:05:50 +08:00
7ac31a8b76 Update github action 2021-01-13 04:00:01 +08:00
c9c6e48b8c add codec/codec_unsupported.go 2021-01-13 03:55:28 +08:00
0c3ba714f7 fix #558 2021-01-13 03:52:49 +08:00
1f7dcc4e91 fix forward img & video upload. 2021-01-13 02:58:54 +08:00
ef713bc59c fix show pic error. 2021-01-13 02:58:54 +08:00
85624d1a27 fix forward img & video upload. 2021-01-11 16:58:07 +08:00
b2d8a61a99 fix show pic error. 2021-01-11 14:36:29 +08:00
10 changed files with 90 additions and 72 deletions

View File

@ -16,12 +16,16 @@ jobs:
matrix: matrix:
# build and publish in parallel: linux/386, linux/amd64, windows/386, windows/amd64, darwin/amd64 # build and publish in parallel: linux/386, linux/amd64, windows/386, windows/amd64, darwin/amd64
goos: [linux, windows, darwin] goos: [linux, windows, darwin]
goarch: ["386", amd64, arm] goarch: ["386", amd64, arm, arm64]
exclude: exclude:
- goos: darwin - goos: darwin
goarch: arm goarch: arm
- goos: darwin
goarch: arm64
- goos: darwin - goos: darwin
goarch: "386" goarch: "386"
- goos: windows
goarch: arm64
fail-fast: true fail-fast: true
steps: steps:

View File

@ -10,12 +10,16 @@ jobs:
matrix: matrix:
# build and publish in parallel: linux/386, linux/amd64, windows/386, windows/amd64, darwin/386, darwin/amd64 # build and publish in parallel: linux/386, linux/amd64, windows/386, windows/amd64, darwin/386, darwin/amd64
goos: [linux, windows, darwin] goos: [linux, windows, darwin]
goarch: ["386", amd64, arm] goarch: ["386", amd64, arm, arm64]
exclude: exclude:
- goos: darwin - goos: darwin
goarch: arm goarch: arm
- goos: darwin
goarch: arm64
- goos: darwin - goos: darwin
goarch: "386" goarch: "386"
- goos: windows
goarch: arm64
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
@ -30,4 +34,4 @@ jobs:
goarch: ${{ matrix.goarch }} goarch: ${{ matrix.goarch }}
goversion: "https://golang.org/dl/go1.15.3.linux-amd64.tar.gz" goversion: "https://golang.org/dl/go1.15.3.linux-amd64.tar.gz"
ldflags: -w -s -X "github.com/Mrs4s/go-cqhttp/coolq.Version=${{ env.RELEASE_VERSION }}" ldflags: -w -s -X "github.com/Mrs4s/go-cqhttp/coolq.Version=${{ env.RELEASE_VERSION }}"

View File

@ -303,7 +303,7 @@ func (bot *CQBot) CQSendGroupForwardMessage(groupId int64, m gjson.Result) MSG {
var newElem []message.IMessageElement var newElem []message.IMessageElement
for _, elem := range content { for _, elem := range content {
if img, ok := elem.(*LocalImageElement); ok { if img, ok := elem.(*LocalImageElement); ok {
gm, err := bot.Client.UploadGroupImage(groupId, img.Stream) gm, err := bot.UploadLocalImageAsGroup(groupId, img)
if err != nil { if err != nil {
log.Warnf("警告:群 %v 图片上传失败: %v", groupId, err) log.Warnf("警告:群 %v 图片上传失败: %v", groupId, err)
continue continue
@ -311,6 +311,15 @@ func (bot *CQBot) CQSendGroupForwardMessage(groupId int64, m gjson.Result) MSG {
newElem = append(newElem, gm) newElem = append(newElem, gm)
continue continue
} }
if video, ok := elem.(*LocalVideoElement); ok {
gm, err := bot.UploadLocalVideo(groupId, video)
if err != nil {
log.Warnf("警告:群 %v 视频上传失败: %v", groupId, err)
continue
}
newElem = append(newElem, gm)
continue
}
newElem = append(newElem, elem) newElem = append(newElem, elem)
} }
nodes = append(nodes, &message.ForwardNode{ nodes = append(nodes, &message.ForwardNode{
@ -345,7 +354,7 @@ func (bot *CQBot) CQSendPrivateMessage(userId int64, i interface{}, autoEscape b
var str string var str string
if m, ok := i.(gjson.Result); ok { if m, ok := i.(gjson.Result); ok {
if m.Type == gjson.JSON { if m.Type == gjson.JSON {
elem := bot.ConvertObjectMessage(m, true) elem := bot.ConvertObjectMessage(m, false)
mid := bot.SendPrivateMessage(userId, &message.SendingMessage{Elements: elem}) mid := bot.SendPrivateMessage(userId, &message.SendingMessage{Elements: elem})
if mid == -1 { if mid == -1 {
return Failed(100, "SEND_MSG_API_ERROR", "请参考输出") return Failed(100, "SEND_MSG_API_ERROR", "请参考输出")

View File

@ -895,9 +895,7 @@ func (bot *CQBot) makeImageOrVideoElem(d map[string]string, video, group bool) (
} }
hasCacheFile: hasCacheFile:
if video { if video {
return &LocalVideoElement{ return &LocalVideoElement{File: cacheFile}, nil
File: cacheFile,
}, nil
} }
return &LocalImageElement{File: cacheFile}, nil return &LocalImageElement{File: cacheFile}, nil
} }
@ -917,21 +915,36 @@ func (bot *CQBot) makeImageOrVideoElem(d map[string]string, video, group bool) (
return nil, err return nil, err
} }
if video { if video {
goto videos if info.Size() == 0 || info.Size() >= maxVideoSize {
return nil, errors.New("invalid video size")
}
return &LocalVideoElement{File: fu.Path}, nil
} }
if info.Size() == 0 || info.Size() >= maxImageSize { if info.Size() == 0 || info.Size() >= maxImageSize {
return nil, errors.New("invalid image size") return nil, errors.New("invalid image size")
} }
return &LocalImageElement{File: fu.Path}, nil return &LocalImageElement{File: fu.Path}, nil
videos:
if info.Size() == 0 || info.Size() >= maxVideoSize {
return nil, errors.New("invalid video size")
}
return &LocalVideoElement{File: fu.Path}, nil
} }
rawPath := path.Join(global.IMAGE_PATH, f) rawPath := path.Join(global.IMAGE_PATH, f)
if video { if video {
goto video rawPath = path.Join(global.VIDEO_PATH, f)
if !global.PathExists(rawPath) {
return nil, errors.New("invalid video")
}
if path.Ext(rawPath) == ".video" {
b, _ := ioutil.ReadFile(rawPath)
r := binary.NewReader(b)
return &LocalVideoElement{ShortVideoElement: message.ShortVideoElement{ // todo 检查缓存是否有效
Md5: r.ReadBytes(16),
ThumbMd5: r.ReadBytes(16),
Size: r.ReadInt32(),
ThumbSize: r.ReadInt32(),
Name: r.ReadString(),
Uuid: r.ReadAvailable(),
}}, nil
} else {
return &LocalVideoElement{File: rawPath}, nil
}
} }
if strings.HasPrefix(f, "base64") { if strings.HasPrefix(f, "base64") {
b, err := base64.StdEncoding.DecodeString(strings.ReplaceAll(f, "base64://", "")) b, err := base64.StdEncoding.DecodeString(strings.ReplaceAll(f, "base64://", ""))
@ -1012,25 +1025,6 @@ func (bot *CQBot) makeImageOrVideoElem(d map[string]string, video, group bool) (
return rsp, nil return rsp, nil
} }
return nil, errors.New("invalid image") return nil, errors.New("invalid image")
video:
rawPath = path.Join(global.VIDEO_PATH, f)
if !global.PathExists(rawPath) {
return nil, errors.New("invalid video")
}
if path.Ext(rawPath) == ".video" {
b, _ := ioutil.ReadFile(rawPath)
r := binary.NewReader(b)
return &LocalVideoElement{ShortVideoElement: message.ShortVideoElement{ // todo 检查缓存是否有效
Md5: r.ReadBytes(16),
ThumbMd5: r.ReadBytes(16),
Size: r.ReadInt32(),
ThumbSize: r.ReadInt32(),
Name: r.ReadString(),
Uuid: r.ReadAvailable(),
}}, nil
} else {
return &LocalVideoElement{File: rawPath}, nil
}
} }
//makeShowPic 一种xml 方式发送的群消息图片 //makeShowPic 一种xml 方式发送的群消息图片
@ -1039,7 +1033,7 @@ func (bot *CQBot) makeShowPic(elem message.IMessageElement, source string, icon
var suf message.IMessageElement var suf message.IMessageElement
if i, ok := elem.(*LocalImageElement); ok { if i, ok := elem.(*LocalImageElement); ok {
if group == false { if group == false {
gm, err := bot.Client.UploadPrivateImage(1, i.Stream) gm, err := bot.UploadLocalImageAsPrivate(1, i)
if err != nil { if err != nil {
log.Warnf("警告: 好友消息 %v 消息图片上传失败: %v", 1, err) log.Warnf("警告: 好友消息 %v 消息图片上传失败: %v", 1, err)
return nil, err return nil, err
@ -1047,7 +1041,7 @@ func (bot *CQBot) makeShowPic(elem message.IMessageElement, source string, icon
suf = gm suf = gm
xml = fmt.Sprintf(`<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="5" templateID="12345" action="" brief="&#91;分享&#93;我看到一张很赞的图片,分享给你,快来看!" sourceMsgId="0" url="%s" flag="0" adverSign="0" multiMsgFlag="0"><item layout="0" advertiser_id="0" aid="0"><image uuid="%x" md5="%x" GroupFiledid="0" filesize="%d" local_path="%s" minWidth="%d" minHeight="%d" maxWidth="%d" maxHeight="%d" /></item><source name="%s" icon="%s" action="" appid="-1" /></msg>`, "", gm.Md5, gm.Md5, len(i.Data), "", minWidth, minHeight, maxWidth, maxHeight, source, icon) xml = fmt.Sprintf(`<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="5" templateID="12345" action="" brief="&#91;分享&#93;我看到一张很赞的图片,分享给你,快来看!" sourceMsgId="0" url="%s" flag="0" adverSign="0" multiMsgFlag="0"><item layout="0" advertiser_id="0" aid="0"><image uuid="%x" md5="%x" GroupFiledid="0" filesize="%d" local_path="%s" minWidth="%d" minHeight="%d" maxWidth="%d" maxHeight="%d" /></item><source name="%s" icon="%s" action="" appid="-1" /></msg>`, "", gm.Md5, gm.Md5, len(i.Data), "", minWidth, minHeight, maxWidth, maxHeight, source, icon)
} else { } else {
gm, err := bot.Client.UploadGroupImage(1, i.Stream) gm, err := bot.UploadLocalImageAsGroup(1, i)
if err != nil { if err != nil {
log.Warnf("警告: 群 %v 消息图片上传失败: %v", 1, err) log.Warnf("警告: 群 %v 消息图片上传失败: %v", 1, err)
return nil, err return nil, err

View File

@ -15,7 +15,7 @@ var useSilkCodec = true
func InitCodec() { func InitCodec() {
log.Info("正在加载silk编码器...") log.Info("正在加载silk编码器...")
err := codec.Init("data/cache", "codec") err := codec.Init()
if err != nil { if err != nil {
log.Error(err) log.Error(err)
useSilkCodec = false useSilkCodec = false

View File

@ -1,5 +1,5 @@
// +build linux windows darwin // +build linux windows darwin
// +build 386 amd64 arm // +build 386 amd64 arm arm64
package codec package codec
@ -13,17 +13,13 @@ import (
"runtime" "runtime"
) )
var ( const (
codecDir string silkCachePath = "data/cache"
encoderPath string encoderPath = "codec"
cachePath string
) )
func downloadCodec(url string, path string) (err error) { func downloadCodec(url string) (err error) {
resp, err := http.Get(url) resp, err := http.Get(url)
if runtime.GOOS == "windows" {
path = path + ".exe"
}
if err != nil { if err != nil {
return return
} }
@ -32,40 +28,37 @@ func downloadCodec(url string, path string) (err error) {
if err != nil { if err != nil {
return return
} }
err = ioutil.WriteFile(path, body, os.ModePerm) err = ioutil.WriteFile(getEncoderFilePath(), body, os.ModePerm)
return return
} }
func Init(cachePath, codecPath string) error { func getEncoderFilePath() string {
appPath, err := os.Executable() encoderFile := path.Join(encoderPath, runtime.GOOS+"-"+runtime.GOARCH+"-encoder")
appPath = path.Dir(appPath) if runtime.GOOS == "windows" {
if err != nil { encoderFile = encoderFile + ".exe"
return err
} }
cachePath = path.Join(appPath, cachePath) return encoderFile
codecDir = path.Join(appPath, codecPath) }
if !fileExist(codecDir) {
_ = os.MkdirAll(codecDir, os.ModePerm) func Init() error {
if !fileExist(silkCachePath) {
_ = os.MkdirAll(silkCachePath, os.ModePerm)
} }
if !fileExist(cachePath) {
_ = os.MkdirAll(cachePath, os.ModePerm)
}
encoderFile := runtime.GOOS + "-" + runtime.GOARCH + "-encoder"
encoderPath = path.Join(codecDir, encoderFile)
if !fileExist(encoderPath) { if !fileExist(encoderPath) {
if err = downloadCodec("https://cdn.jsdelivr.net/gh/wdvxdr1123/tosilk/codec/"+encoderFile, encoderPath); err != nil { _ = os.MkdirAll(encoderPath, os.ModePerm)
}
p := getEncoderFilePath()
if !fileExist(p) {
if err := downloadCodec("https://cdn.jsdelivr.net/gh/wdvxdr1123/tosilk/codec/" + runtime.GOOS + "-" + runtime.GOARCH + "-encoder"); err != nil {
return errors.New("下载依赖失败") return errors.New("下载依赖失败")
} }
} }
if runtime.GOOS == "windows" {
encoderPath = encoderPath + ".exe"
}
return nil return nil
} }
func EncodeToSilk(record []byte, tempName string, useCache bool) ([]byte, error) { func EncodeToSilk(record []byte, tempName string, useCache bool) ([]byte, error) {
// 1. 写入缓存文件 // 1. 写入缓存文件
rawPath := path.Join(cachePath, tempName+".wav") rawPath := path.Join(silkCachePath, tempName+".wav")
err := ioutil.WriteFile(rawPath, record, os.ModePerm) err := ioutil.WriteFile(rawPath, record, os.ModePerm)
if err != nil { if err != nil {
return nil, err return nil, err
@ -73,7 +66,7 @@ func EncodeToSilk(record []byte, tempName string, useCache bool) ([]byte, error)
defer os.Remove(rawPath) defer os.Remove(rawPath)
// 2.转换pcm // 2.转换pcm
pcmPath := path.Join(cachePath, tempName+".pcm") pcmPath := path.Join(silkCachePath, tempName+".pcm")
cmd := exec.Command("ffmpeg", "-i", rawPath, "-f", "s16le", "-ar", "24000", "-ac", "1", pcmPath) cmd := exec.Command("ffmpeg", "-i", rawPath, "-f", "s16le", "-ar", "24000", "-ac", "1", pcmPath)
if err = cmd.Run(); err != nil { if err = cmd.Run(); err != nil {
return nil, err return nil, err
@ -81,8 +74,8 @@ func EncodeToSilk(record []byte, tempName string, useCache bool) ([]byte, error)
defer os.Remove(pcmPath) defer os.Remove(pcmPath)
// 3. 转silk // 3. 转silk
silkPath := path.Join(cachePath, tempName+".silk") silkPath := path.Join(silkCachePath, tempName+".silk")
cmd = exec.Command(encoderPath, pcmPath, silkPath, "-rate", "24000", "-quiet", "-tencent") cmd = exec.Command(getEncoderFilePath(), pcmPath, silkPath, "-rate", "24000", "-quiet", "-tencent")
if err = cmd.Run(); err != nil { if err = cmd.Run(); err != nil {
return nil, err return nil, err
} }

View File

@ -0,0 +1,13 @@
// +build !386,!arm64,!amd64,!arm
package codec
import "errors"
func Init() error {
return errors.New("Unsupport arch now")
}
func EncodeToSilk(record []byte, tempName string, useCache bool) ([]byte, error) {
return nil, errors.New("Unsupport arch now")
}

View File

@ -1,5 +1,4 @@
// +build !linux,!windows,!darwin // +build !windows,!linux,!darwin
// +build !386,!amd64,!arm
package codec package codec

2
go.mod
View File

@ -3,7 +3,7 @@ module github.com/Mrs4s/go-cqhttp
go 1.15 go 1.15
require ( require (
github.com/Mrs4s/MiraiGo v0.0.0-20210110160231-b83dd4cf38a5 github.com/Mrs4s/MiraiGo v0.0.0-20210115215446-8ee19f60514b
github.com/dustin/go-humanize v1.0.0 github.com/dustin/go-humanize v1.0.0
github.com/gin-contrib/pprof v1.3.0 github.com/gin-contrib/pprof v1.3.0
github.com/gin-gonic/gin v1.6.3 github.com/gin-gonic/gin v1.6.3

2
go.sum
View File

@ -2,6 +2,8 @@ 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-20210110160231-b83dd4cf38a5 h1:ee6LafOcoVM0nox2UxiIJgomgRP4pDJe5aeT/rq2o/U= github.com/Mrs4s/MiraiGo v0.0.0-20210110160231-b83dd4cf38a5 h1:ee6LafOcoVM0nox2UxiIJgomgRP4pDJe5aeT/rq2o/U=
github.com/Mrs4s/MiraiGo v0.0.0-20210110160231-b83dd4cf38a5/go.mod h1:HW2e375lCQiRwtuA/LV6ZVTsi7co1TRfBn+L5Ow77Bo= github.com/Mrs4s/MiraiGo v0.0.0-20210110160231-b83dd4cf38a5/go.mod h1:HW2e375lCQiRwtuA/LV6ZVTsi7co1TRfBn+L5Ow77Bo=
github.com/Mrs4s/MiraiGo v0.0.0-20210115215446-8ee19f60514b h1:am1XzFc9Q5wSLLkrhjyDf5/IWq3qgNwJl2zzIRp2haw=
github.com/Mrs4s/MiraiGo v0.0.0-20210115215446-8ee19f60514b/go.mod h1:HW2e375lCQiRwtuA/LV6ZVTsi7co1TRfBn+L5Ow77Bo=
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=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=