diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7c7a90c..336a3cc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,12 +16,16 @@ jobs: matrix: # build and publish in parallel: linux/386, linux/amd64, windows/386, windows/amd64, darwin/amd64 goos: [linux, windows, darwin] - goarch: ["386", amd64, arm] + goarch: ["386", amd64, arm, arm64] exclude: - goos: darwin goarch: arm + - goos: darwin + goarch: arm64 - goos: darwin goarch: "386" + - goos: windows + goarch: arm64 fail-fast: true steps: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 93fc465..589d51a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,12 +10,16 @@ jobs: matrix: # build and publish in parallel: linux/386, linux/amd64, windows/386, windows/amd64, darwin/386, darwin/amd64 goos: [linux, windows, darwin] - goarch: ["386", amd64, arm] + goarch: ["386", amd64, arm, arm64] exclude: - goos: darwin goarch: arm + - goos: darwin + goarch: arm64 - goos: darwin goarch: "386" + - goos: windows + goarch: arm64 steps: - uses: actions/checkout@v2 @@ -30,4 +34,4 @@ jobs: goarch: ${{ matrix.goarch }} 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 }}" - \ No newline at end of file + diff --git a/coolq/api.go b/coolq/api.go index 69dcc3f..c6a3295 100644 --- a/coolq/api.go +++ b/coolq/api.go @@ -354,7 +354,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) + elem := bot.ConvertObjectMessage(m, false) mid := bot.SendPrivateMessage(userId, &message.SendingMessage{Elements: elem}) if mid == -1 { return Failed(100, "SEND_MSG_API_ERROR", "请参考输出") diff --git a/coolq/cqcode.go b/coolq/cqcode.go index 171c92f..52866cd 100644 --- a/coolq/cqcode.go +++ b/coolq/cqcode.go @@ -895,9 +895,7 @@ func (bot *CQBot) makeImageOrVideoElem(d map[string]string, video, group bool) ( } hasCacheFile: if video { - return &LocalVideoElement{ - File: cacheFile, - }, nil + return &LocalVideoElement{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 } 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 { return nil, errors.New("invalid image size") } 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) 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") { 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 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 方式发送的群消息图片 diff --git a/global/codec.go b/global/codec.go index 4f2648d..4bb9cfd 100644 --- a/global/codec.go +++ b/global/codec.go @@ -15,7 +15,7 @@ var useSilkCodec = true func InitCodec() { log.Info("正在加载silk编码器...") - err := codec.Init("data/cache", "codec") + err := codec.Init() if err != nil { log.Error(err) useSilkCodec = false diff --git a/global/codec/codec.go b/global/codec/codec.go index 5f7d2d4..695bbc9 100644 --- a/global/codec/codec.go +++ b/global/codec/codec.go @@ -1,5 +1,5 @@ // +build linux windows darwin -// +build 386 amd64 arm +// +build 386 amd64 arm arm64 package codec @@ -13,17 +13,13 @@ import ( "runtime" ) -var ( - codecDir string - encoderPath string - cachePath string +const ( + silkCachePath = "data/cache" + encoderPath = "codec" ) -func downloadCodec(url string, path string) (err error) { +func downloadCodec(url string) (err error) { resp, err := http.Get(url) - if runtime.GOOS == "windows" { - path = path + ".exe" - } if err != nil { return } @@ -32,40 +28,37 @@ func downloadCodec(url string, path string) (err error) { if err != nil { return } - err = ioutil.WriteFile(path, body, os.ModePerm) + err = ioutil.WriteFile(getEncoderFilePath(), body, os.ModePerm) return } -func Init(cachePath, codecPath string) error { - appPath, err := os.Executable() - appPath = path.Dir(appPath) - if err != nil { - return err +func getEncoderFilePath() string { + encoderFile := path.Join(encoderPath, runtime.GOOS+"-"+runtime.GOARCH+"-encoder") + if runtime.GOOS == "windows" { + encoderFile = encoderFile + ".exe" } - cachePath = path.Join(appPath, cachePath) - codecDir = path.Join(appPath, codecPath) - if !fileExist(codecDir) { - _ = os.MkdirAll(codecDir, os.ModePerm) + return encoderFile +} + +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 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("下载依赖失败") } } - if runtime.GOOS == "windows" { - encoderPath = encoderPath + ".exe" - } return nil } func EncodeToSilk(record []byte, tempName string, useCache bool) ([]byte, error) { // 1. 写入缓存文件 - rawPath := path.Join(cachePath, tempName+".wav") + rawPath := path.Join(silkCachePath, tempName+".wav") err := ioutil.WriteFile(rawPath, record, os.ModePerm) if err != nil { return nil, err @@ -73,7 +66,7 @@ func EncodeToSilk(record []byte, tempName string, useCache bool) ([]byte, error) defer os.Remove(rawPath) // 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) if err = cmd.Run(); err != nil { return nil, err @@ -81,8 +74,8 @@ func EncodeToSilk(record []byte, tempName string, useCache bool) ([]byte, error) defer os.Remove(pcmPath) // 3. 转silk - silkPath := path.Join(cachePath, tempName+".silk") - cmd = exec.Command(encoderPath, pcmPath, silkPath, "-rate", "24000", "-quiet", "-tencent") + silkPath := path.Join(silkCachePath, tempName+".silk") + cmd = exec.Command(getEncoderFilePath(), pcmPath, silkPath, "-rate", "24000", "-quiet", "-tencent") if err = cmd.Run(); err != nil { return nil, err } diff --git a/global/codec/codec_unsupportedarch.go b/global/codec/codec_unsupportedarch.go new file mode 100644 index 0000000..f905017 --- /dev/null +++ b/global/codec/codec_unsupportedarch.go @@ -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") +} diff --git a/global/codec/codec2.go b/global/codec/codec_unsupportedos.go similarity index 78% rename from global/codec/codec2.go rename to global/codec/codec_unsupportedos.go index e50133e..89c415e 100644 --- a/global/codec/codec2.go +++ b/global/codec/codec_unsupportedos.go @@ -1,5 +1,4 @@ -// +build !linux,!windows,!darwin -// +build !386,!amd64,!arm +// +build !windows,!linux,!darwin package codec diff --git a/global/fs.go b/global/fs.go index fe6fbea..4a00ffb 100644 --- a/global/fs.go +++ b/global/fs.go @@ -216,7 +216,7 @@ func UpdateFromStream(updateWith io.Reader) (err error, errRecover error) { return } - // move the new exectuable in to become the new program + // move the new executable in to become the new program err = os.Rename(newPath, updatePath) if err != nil {