mirror of
https://github.com/Mrs4s/go-cqhttp.git
synced 2025-05-06 12:03:50 +08:00
reduce base64 alloc
This commit is contained in:
parent
773d2b77e6
commit
223a888a34
@ -953,7 +953,7 @@ func (bot *CQBot) CQGetImage(file string) MSG {
|
|||||||
local := path.Join(global.CachePath, file+"."+path.Ext(msg["filename"].(string)))
|
local := path.Join(global.CachePath, file+"."+path.Ext(msg["filename"].(string)))
|
||||||
if !global.PathExists(local) {
|
if !global.PathExists(local) {
|
||||||
if data, err := global.GetBytes(msg["url"].(string)); err == nil {
|
if data, err := global.GetBytes(msg["url"].(string)); err == nil {
|
||||||
_ = ioutil.WriteFile(local, data, 0644)
|
_ = ioutil.WriteFile(local, data, 0o644)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
msg["file"] = local
|
msg["file"] = local
|
||||||
|
@ -1136,6 +1136,13 @@ func (bot *CQBot) makeImageOrVideoElem(d map[string]string, video, group bool) (
|
|||||||
}
|
}
|
||||||
return &LocalImageElement{File: fu.Path}, nil
|
return &LocalImageElement{File: fu.Path}, nil
|
||||||
}
|
}
|
||||||
|
if strings.HasPrefix(f, "base64") && !video {
|
||||||
|
b, err := base64.StdEncoding.DecodeString(strings.TrimPrefix(f, "base64://"))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &LocalImageElement{Stream: bytes.NewReader(b)}, nil
|
||||||
|
}
|
||||||
rawPath := path.Join(global.ImagePath, f)
|
rawPath := path.Join(global.ImagePath, f)
|
||||||
if video {
|
if video {
|
||||||
rawPath = path.Join(global.VideoPath, f)
|
rawPath = path.Join(global.VideoPath, f)
|
||||||
@ -1156,13 +1163,6 @@ func (bot *CQBot) makeImageOrVideoElem(d map[string]string, video, group bool) (
|
|||||||
}
|
}
|
||||||
return &LocalVideoElement{File: rawPath}, nil
|
return &LocalVideoElement{File: rawPath}, nil
|
||||||
}
|
}
|
||||||
if strings.HasPrefix(f, "base64") {
|
|
||||||
b, err := base64.StdEncoding.DecodeString(strings.TrimPrefix(f, "base64://"))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &LocalImageElement{Stream: bytes.NewReader(b)}, nil
|
|
||||||
}
|
|
||||||
exist := global.PathExists(rawPath)
|
exist := global.PathExists(rawPath)
|
||||||
if !exist && global.PathExists(path.Join(global.ImagePathOld, f)) {
|
if !exist && global.PathExists(path.Join(global.ImagePathOld, f)) {
|
||||||
exist = true
|
exist = true
|
||||||
|
@ -539,7 +539,7 @@ func (bot *CQBot) checkMedia(e []message.IMessageElement) {
|
|||||||
w.WriteUInt32(uint32(i.Size))
|
w.WriteUInt32(uint32(i.Size))
|
||||||
w.WriteString(i.Filename)
|
w.WriteString(i.Filename)
|
||||||
w.WriteString(i.Url)
|
w.WriteString(i.Url)
|
||||||
}), 0644)
|
}), 0o644)
|
||||||
}
|
}
|
||||||
i.Filename = filename
|
i.Filename = filename
|
||||||
case *message.GroupImageElement:
|
case *message.GroupImageElement:
|
||||||
@ -550,7 +550,7 @@ func (bot *CQBot) checkMedia(e []message.IMessageElement) {
|
|||||||
w.WriteUInt32(uint32(i.Size))
|
w.WriteUInt32(uint32(i.Size))
|
||||||
w.WriteString(filename)
|
w.WriteString(filename)
|
||||||
w.WriteString(i.Url)
|
w.WriteString(i.Url)
|
||||||
}), 0644)
|
}), 0o644)
|
||||||
}
|
}
|
||||||
case *message.FriendImageElement:
|
case *message.FriendImageElement:
|
||||||
filename := hex.EncodeToString(i.Md5) + ".image"
|
filename := hex.EncodeToString(i.Md5) + ".image"
|
||||||
@ -560,7 +560,7 @@ func (bot *CQBot) checkMedia(e []message.IMessageElement) {
|
|||||||
w.WriteUInt32(uint32(0)) // 发送时会调用url, 大概没事
|
w.WriteUInt32(uint32(0)) // 发送时会调用url, 大概没事
|
||||||
w.WriteString(filename)
|
w.WriteString(filename)
|
||||||
w.WriteString(i.Url)
|
w.WriteString(i.Url)
|
||||||
}), 0644)
|
}), 0o644)
|
||||||
}
|
}
|
||||||
case *message.GroupFlashImgElement:
|
case *message.GroupFlashImgElement:
|
||||||
filename := hex.EncodeToString(i.Md5) + ".image"
|
filename := hex.EncodeToString(i.Md5) + ".image"
|
||||||
@ -570,7 +570,7 @@ func (bot *CQBot) checkMedia(e []message.IMessageElement) {
|
|||||||
w.WriteUInt32(uint32(i.Size))
|
w.WriteUInt32(uint32(i.Size))
|
||||||
w.WriteString(i.Filename)
|
w.WriteString(i.Filename)
|
||||||
w.WriteString("")
|
w.WriteString("")
|
||||||
}), 0644)
|
}), 0o644)
|
||||||
}
|
}
|
||||||
i.Filename = filename
|
i.Filename = filename
|
||||||
case *message.FriendFlashImgElement:
|
case *message.FriendFlashImgElement:
|
||||||
@ -581,7 +581,7 @@ func (bot *CQBot) checkMedia(e []message.IMessageElement) {
|
|||||||
w.WriteUInt32(uint32(i.Size))
|
w.WriteUInt32(uint32(i.Size))
|
||||||
w.WriteString(i.Filename)
|
w.WriteString(i.Filename)
|
||||||
w.WriteString("")
|
w.WriteString("")
|
||||||
}), 0644)
|
}), 0o644)
|
||||||
}
|
}
|
||||||
i.Filename = filename
|
i.Filename = filename
|
||||||
case *message.VoiceElement:
|
case *message.VoiceElement:
|
||||||
@ -593,7 +593,7 @@ func (bot *CQBot) checkMedia(e []message.IMessageElement) {
|
|||||||
log.Warnf("语音文件 %v 下载失败: %v", i.Name, err)
|
log.Warnf("语音文件 %v 下载失败: %v", i.Name, err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
_ = ioutil.WriteFile(path.Join(global.VoicePath, i.Name), b, 0644)
|
_ = ioutil.WriteFile(path.Join(global.VoicePath, i.Name), b, 0o644)
|
||||||
}
|
}
|
||||||
case *message.ShortVideoElement:
|
case *message.ShortVideoElement:
|
||||||
filename := hex.EncodeToString(i.Md5) + ".video"
|
filename := hex.EncodeToString(i.Md5) + ".video"
|
||||||
@ -605,7 +605,7 @@ func (bot *CQBot) checkMedia(e []message.IMessageElement) {
|
|||||||
w.WriteUInt32(uint32(i.ThumbSize))
|
w.WriteUInt32(uint32(i.ThumbSize))
|
||||||
w.WriteString(i.Name)
|
w.WriteString(i.Name)
|
||||||
w.Write(i.Uuid)
|
w.Write(i.Uuid)
|
||||||
}), 0644)
|
}), 0o644)
|
||||||
}
|
}
|
||||||
i.Name = filename
|
i.Name = filename
|
||||||
i.Url = bot.Client.GetShortVideoUrl(i.Uuid, i.Md5)
|
i.Url = bot.Client.GetShortVideoUrl(i.Uuid, i.Md5)
|
||||||
|
@ -47,7 +47,7 @@ func EncodeToSilk(record []byte, tempName string, useCache bool) (silkWav []byte
|
|||||||
}
|
}
|
||||||
if useCache {
|
if useCache {
|
||||||
silkPath := path.Join(silkCachePath, tempName+".silk")
|
silkPath := path.Join(silkCachePath, tempName+".silk")
|
||||||
err = ioutil.WriteFile(silkPath, silkWav, 0666)
|
err = ioutil.WriteFile(silkPath, silkWav, 0o666)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -181,7 +181,7 @@ func generateConfig() {
|
|||||||
sb.WriteString(pprofDefault)
|
sb.WriteString(pprofDefault)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ = os.WriteFile("config.yml", []byte(sb.String()), 0644)
|
_ = os.WriteFile("config.yml", []byte(sb.String()), 0o644)
|
||||||
fmt.Println("默认配置文件已生成,请修改 config.yml 后重新启动!")
|
fmt.Println("默认配置文件已生成,请修改 config.yml 后重新启动!")
|
||||||
_, _ = input.ReadString('\n')
|
_, _ = input.ReadString('\n')
|
||||||
}
|
}
|
||||||
|
@ -61,7 +61,7 @@ func ReadAllText(path string) string {
|
|||||||
|
|
||||||
// WriteAllText 将给定text写入给定path
|
// WriteAllText 将给定text写入给定path
|
||||||
func WriteAllText(path, text string) error {
|
func WriteAllText(path, text string) error {
|
||||||
return ioutil.WriteFile(path, utils.S2B(text), 0644)
|
return ioutil.WriteFile(path, utils.S2B(text), 0o644)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check 检测err是否为nil
|
// Check 检测err是否为nil
|
||||||
@ -94,7 +94,7 @@ func FindFile(file, cache, p string) (data []byte, err error) {
|
|||||||
return ioutil.ReadFile(cacheFile)
|
return ioutil.ReadFile(cacheFile)
|
||||||
}
|
}
|
||||||
data, err = GetBytes(file)
|
data, err = GetBytes(file)
|
||||||
_ = ioutil.WriteFile(cacheFile, data, 0644)
|
_ = ioutil.WriteFile(cacheFile, data, 0o644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -47,7 +47,7 @@ func (hook *LocalHook) pathWrite(entry *logrus.Entry) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
fd, err := os.OpenFile(hook.path, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666)
|
fd, err := os.OpenFile(hook.path, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0o666)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,7 @@ func GetBytes(url string) ([]byte, error) {
|
|||||||
|
|
||||||
// DownloadFile 将给定URL对应的文件下载至给定Path
|
// DownloadFile 将给定URL对应的文件下载至给定Path
|
||||||
func DownloadFile(url, path string, limit int64, headers map[string]string) error {
|
func DownloadFile(url, path string, limit int64, headers map[string]string) error {
|
||||||
file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0666)
|
file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0o666)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -108,7 +108,7 @@ func DownloadFileMultiThreading(url, path string, limit int64, threadCount int,
|
|||||||
// 初始化分块或直接下载
|
// 初始化分块或直接下载
|
||||||
initOrDownload := func() error {
|
initOrDownload := func() error {
|
||||||
copyStream := func(s io.ReadCloser) error {
|
copyStream := func(s io.ReadCloser) error {
|
||||||
file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0666)
|
file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0o666)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -177,7 +177,7 @@ func DownloadFileMultiThreading(url, path string, limit int64, threadCount int,
|
|||||||
// 下载分块
|
// 下载分块
|
||||||
downloadBlock := func(block *BlockMetaData) error {
|
downloadBlock := func(block *BlockMetaData) error {
|
||||||
req, _ := http.NewRequest("GET", url, nil)
|
req, _ := http.NewRequest("GET", url, nil)
|
||||||
file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0666)
|
file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0o666)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,7 @@ func FromStream(updateWith io.Reader) (err error, errRecover error) {
|
|||||||
filename := filepath.Base(updatePath)
|
filename := filepath.Base(updatePath)
|
||||||
// Copy the contents of of newbinary to a the new executable file
|
// Copy the contents of of newbinary to a the new executable file
|
||||||
newPath := filepath.Join(updateDir, fmt.Sprintf(".%s.new", filename))
|
newPath := filepath.Join(updateDir, fmt.Sprintf(".%s.new", filename))
|
||||||
fp, err := os.OpenFile(newPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0755)
|
fp, err := os.OpenFile(newPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0o755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
4
login.go
4
login.go
@ -63,7 +63,7 @@ func qrcodeLogin() error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
_ = ioutil.WriteFile("qrcode.png", rsp.ImageData, 0644)
|
_ = ioutil.WriteFile("qrcode.png", rsp.ImageData, 0o644)
|
||||||
defer func() { _ = os.Remove("qrcode.png") }()
|
defer func() { _ = os.Remove("qrcode.png") }()
|
||||||
log.Infof("请使用手机QQ扫描二维码 (qrcode.png) : ")
|
log.Infof("请使用手机QQ扫描二维码 (qrcode.png) : ")
|
||||||
time.Sleep(time.Second)
|
time.Sleep(time.Second)
|
||||||
@ -132,7 +132,7 @@ func loginResponseProcessor(res *client.LoginResponse) error {
|
|||||||
return qrcodeLogin()
|
return qrcodeLogin()
|
||||||
case client.NeedCaptcha:
|
case client.NeedCaptcha:
|
||||||
log.Warnf("登录需要验证码.")
|
log.Warnf("登录需要验证码.")
|
||||||
_ = ioutil.WriteFile("captcha.jpg", res.CaptchaImage, 0644)
|
_ = ioutil.WriteFile("captcha.jpg", res.CaptchaImage, 0o644)
|
||||||
log.Warnf("请输入验证码 (captcha.jpg): (Enter 提交)")
|
log.Warnf("请输入验证码 (captcha.jpg): (Enter 提交)")
|
||||||
text = readLine()
|
text = readLine()
|
||||||
global.DelFile("captcha.jpg")
|
global.DelFile("captcha.jpg")
|
||||||
|
17
main.go
17
main.go
@ -91,22 +91,22 @@ func init() {
|
|||||||
log.AddHook(global.NewLocalHook(w, logFormatter, global.GetLogLevel(conf.Output.LogLevel)...))
|
log.AddHook(global.NewLocalHook(w, logFormatter, global.GetLogLevel(conf.Output.LogLevel)...))
|
||||||
|
|
||||||
if !global.PathExists(global.ImagePath) {
|
if !global.PathExists(global.ImagePath) {
|
||||||
if err := os.MkdirAll(global.ImagePath, 0755); err != nil {
|
if err := os.MkdirAll(global.ImagePath, 0o755); err != nil {
|
||||||
log.Fatalf("创建图片缓存文件夹失败: %v", err)
|
log.Fatalf("创建图片缓存文件夹失败: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !global.PathExists(global.VoicePath) {
|
if !global.PathExists(global.VoicePath) {
|
||||||
if err := os.MkdirAll(global.VoicePath, 0755); err != nil {
|
if err := os.MkdirAll(global.VoicePath, 0o755); err != nil {
|
||||||
log.Fatalf("创建语音缓存文件夹失败: %v", err)
|
log.Fatalf("创建语音缓存文件夹失败: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !global.PathExists(global.VideoPath) {
|
if !global.PathExists(global.VideoPath) {
|
||||||
if err := os.MkdirAll(global.VideoPath, 0755); err != nil {
|
if err := os.MkdirAll(global.VideoPath, 0o755); err != nil {
|
||||||
log.Fatalf("创建视频缓存文件夹失败: %v", err)
|
log.Fatalf("创建视频缓存文件夹失败: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !global.PathExists(global.CachePath) {
|
if !global.PathExists(global.CachePath) {
|
||||||
if err := os.MkdirAll(global.CachePath, 0755); err != nil {
|
if err := os.MkdirAll(global.CachePath, 0o755); err != nil {
|
||||||
log.Fatalf("创建发送图片缓存文件夹失败: %v", err)
|
log.Fatalf("创建发送图片缓存文件夹失败: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -163,7 +163,7 @@ func main() {
|
|||||||
if !global.PathExists("device.json") {
|
if !global.PathExists("device.json") {
|
||||||
log.Warn("虚拟设备信息不存在, 将自动生成随机设备.")
|
log.Warn("虚拟设备信息不存在, 将自动生成随机设备.")
|
||||||
client.GenRandomDevice()
|
client.GenRandomDevice()
|
||||||
_ = ioutil.WriteFile("device.json", client.SystemDeviceInfo.ToJson(), 0644)
|
_ = ioutil.WriteFile("device.json", client.SystemDeviceInfo.ToJson(), 0o644)
|
||||||
log.Info("已生成设备信息并保存到 device.json 文件.")
|
log.Info("已生成设备信息并保存到 device.json 文件.")
|
||||||
} else {
|
} else {
|
||||||
log.Info("将使用 device.json 内的设备信息运行Bot.")
|
log.Info("将使用 device.json 内的设备信息运行Bot.")
|
||||||
@ -182,7 +182,7 @@ func main() {
|
|||||||
log.Infof("密码加密已启用, 请输入Key对密码进行加密: (Enter 提交)")
|
log.Infof("密码加密已启用, 请输入Key对密码进行加密: (Enter 提交)")
|
||||||
byteKey, _ = term.ReadPassword(int(os.Stdin.Fd()))
|
byteKey, _ = term.ReadPassword(int(os.Stdin.Fd()))
|
||||||
PasswordHash = md5.Sum([]byte(conf.Account.Password))
|
PasswordHash = md5.Sum([]byte(conf.Account.Password))
|
||||||
_ = os.WriteFile("password.encrypt", []byte(PasswordHashEncrypt(PasswordHash[:], byteKey)), 0644)
|
_ = os.WriteFile("password.encrypt", []byte(PasswordHashEncrypt(PasswordHash[:], byteKey)), 0o644)
|
||||||
log.Info("密码已加密,为了您的账号安全,请删除配置文件中的密码后重新启动.")
|
log.Info("密码已加密,为了您的账号安全,请删除配置文件中的密码后重新启动.")
|
||||||
readLine()
|
readLine()
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
@ -278,7 +278,7 @@ func main() {
|
|||||||
isTokenLogin := false
|
isTokenLogin := false
|
||||||
saveToken := func() {
|
saveToken := func() {
|
||||||
AccountToken = cli.GenToken()
|
AccountToken = cli.GenToken()
|
||||||
_ = ioutil.WriteFile("session.token", AccountToken, 0677)
|
_ = ioutil.WriteFile("session.token", AccountToken, 0o677)
|
||||||
}
|
}
|
||||||
if global.PathExists("session.token") {
|
if global.PathExists("session.token") {
|
||||||
token, err := ioutil.ReadFile("session.token")
|
token, err := ioutil.ReadFile("session.token")
|
||||||
@ -524,9 +524,8 @@ func selfUpdate(imageURL string) {
|
|||||||
}(), func() string {
|
}(), func() string {
|
||||||
if runtime.GOOS == "windows" {
|
if runtime.GOOS == "windows" {
|
||||||
return "zip"
|
return "zip"
|
||||||
} else {
|
|
||||||
return "tar.gz"
|
|
||||||
}
|
}
|
||||||
|
return "tar.gz"
|
||||||
}())
|
}())
|
||||||
var sum []byte
|
var sum []byte
|
||||||
for {
|
for {
|
||||||
|
@ -387,7 +387,7 @@ func (c *webSocketConn) handleRequest(_ *coolq.CQBot, payload []byte) {
|
|||||||
_ = c.Close()
|
_ = c.Close()
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
j := gjson.ParseBytes(payload)
|
j := gjson.Parse(utils.B2S(payload))
|
||||||
t := strings.ReplaceAll(j.Get("action").Str, "_async", "")
|
t := strings.ReplaceAll(j.Get("action").Str, "_async", "")
|
||||||
log.Debugf("WS接收到API调用: %v 参数: %v", t, j.Get("params").Raw)
|
log.Debugf("WS接收到API调用: %v 参数: %v", t, j.Get("params").Raw)
|
||||||
ret := c.apiCaller.callAPI(t, j.Get("params"))
|
ret := c.apiCaller.callAPI(t, j.Get("params"))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user