mirror of
https://github.com/Mrs4s/go-cqhttp.git
synced 2025-06-30 11:53:25 +00:00
Compare commits
16 Commits
v0.9.38
...
v0.9.38-fi
Author | SHA1 | Date | |
---|---|---|---|
2156b6083b | |||
b47c2aeac6 | |||
9beae584de | |||
59cd986050 | |||
7a9a021c54 | |||
de4de5052d | |||
b075280d2b | |||
4cb3d8f33e | |||
0cd06daf08 | |||
7ac31a8b76 | |||
c9c6e48b8c | |||
0c3ba714f7 | |||
1f7dcc4e91 | |||
ef713bc59c | |||
85624d1a27 | |||
b2d8a61a99 |
6
.github/workflows/ci.yml
vendored
6
.github/workflows/ci.yml
vendored
@ -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:
|
||||||
|
8
.github/workflows/release.yml
vendored
8
.github/workflows/release.yml
vendored
@ -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 }}"
|
||||||
|
|
||||||
|
13
coolq/api.go
13
coolq/api.go
@ -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", "请参考输出")
|
||||||
|
@ -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="[分享]我看到一张很赞的图片,分享给你,快来看!" 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="[分享]我看到一张很赞的图片,分享给你,快来看!" 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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
13
global/codec/codec_unsupportedarch.go
Normal file
13
global/codec/codec_unsupportedarch.go
Normal 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")
|
||||||
|
}
|
@ -1,5 +1,4 @@
|
|||||||
// +build !linux,!windows,!darwin
|
// +build !windows,!linux,!darwin
|
||||||
// +build !386,!amd64,!arm
|
|
||||||
|
|
||||||
package codec
|
package codec
|
||||||
|
|
2
go.mod
2
go.mod
@ -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
2
go.sum
@ -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=
|
||||||
|
Reference in New Issue
Block a user