mirror of
https://github.com/Mrs4s/go-cqhttp.git
synced 2025-05-05 03:23:49 +08:00
Merge remote-tracking branch 'upstream/dev' into dev
This commit is contained in:
commit
4aab8ebe52
@ -58,3 +58,4 @@ nfpms:
|
||||
formats:
|
||||
- deb
|
||||
- rpm
|
||||
maintainer: Mrs4s
|
@ -443,8 +443,14 @@ S1: // Plain Text
|
||||
if *(*byte)(add(ptr, uintptr(i))) == '[' && i+4 < l &&
|
||||
*(*uint32)(add(ptr, uintptr(i))) == magicCQ { // Magic :uint32([]byte("[CQ:"))
|
||||
if i > j {
|
||||
if SplitURL {
|
||||
for _, str := range global.SplitURL(CQCodeUnescapeText(s[j:i])) {
|
||||
r = append(r, message.NewText(str))
|
||||
}
|
||||
} else {
|
||||
r = append(r, message.NewText(CQCodeUnescapeText(s[j:i])))
|
||||
}
|
||||
}
|
||||
CQBegin = i
|
||||
i += 4
|
||||
j = i
|
||||
@ -501,8 +507,14 @@ S4: // CQCode param value
|
||||
goto End
|
||||
End:
|
||||
if i > j {
|
||||
if SplitURL {
|
||||
for _, str := range global.SplitURL(CQCodeUnescapeText(s[j:i])) {
|
||||
r = append(r, message.NewText(str))
|
||||
}
|
||||
} else {
|
||||
r = append(r, message.NewText(CQCodeUnescapeText(s[j:i])))
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -15,6 +15,7 @@ var json = jsoniter.ConfigCompatibleWithStandardLibrary
|
||||
|
||||
var currentPath = getCurrentPath()
|
||||
var DefaultConfFile = path.Join(currentPath, "config.hjson")
|
||||
var AccountToken []byte
|
||||
|
||||
// DefaultConfigWithComments 为go-cqhttp的默认配置文件
|
||||
var DefaultConfigWithComments = `
|
||||
|
100
global/fs.go
100
global/fs.go
@ -1,28 +1,20 @@
|
||||
package global
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"compress/bzip2"
|
||||
"crypto/md5"
|
||||
"encoding/base64"
|
||||
"encoding/hex"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net"
|
||||
"net/url"
|
||||
"os"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/kardianos/osext"
|
||||
|
||||
"github.com/dustin/go-humanize"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
@ -160,95 +152,3 @@ func ReadAddrFile(path string) []*net.TCPAddr {
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
// WriteCounter 写入量计算实例
|
||||
type WriteCounter struct {
|
||||
Total uint64
|
||||
}
|
||||
|
||||
// Write 方法将写入的byte长度追加至写入的总长度Total中
|
||||
func (wc *WriteCounter) Write(p []byte) (int, error) {
|
||||
n := len(p)
|
||||
wc.Total += uint64(n)
|
||||
wc.PrintProgress()
|
||||
return n, nil
|
||||
}
|
||||
|
||||
// PrintProgress 方法将打印当前的总写入量
|
||||
func (wc *WriteCounter) PrintProgress() {
|
||||
fmt.Printf("\r%s", strings.Repeat(" ", 35))
|
||||
fmt.Printf("\rDownloading... %s complete", humanize.Bytes(wc.Total))
|
||||
}
|
||||
|
||||
// UpdateFromStream copy form getlantern/go-update
|
||||
func UpdateFromStream(updateWith io.Reader) (err error, errRecover error) {
|
||||
updatePath, err := osext.Executable()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
var newBytes []byte
|
||||
// no patch to apply, go on through
|
||||
var fileHeader []byte
|
||||
bufBytes := bufio.NewReader(updateWith)
|
||||
fileHeader, err = bufBytes.Peek(2)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
// The content is always bzip2 compressed except when running test, in
|
||||
// which case is not prefixed with the magic byte sequence for sure.
|
||||
if bytes.Equal([]byte{0x42, 0x5a}, fileHeader) {
|
||||
// Identifying bzip2 files.
|
||||
updateWith = bzip2.NewReader(bufBytes)
|
||||
} else {
|
||||
updateWith = io.Reader(bufBytes)
|
||||
}
|
||||
newBytes, err = ioutil.ReadAll(updateWith)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
// get the directory the executable exists in
|
||||
updateDir := filepath.Dir(updatePath)
|
||||
filename := filepath.Base(updatePath)
|
||||
// Copy the contents of of newbinary to a the new executable file
|
||||
newPath := filepath.Join(updateDir, fmt.Sprintf(".%s.new", filename))
|
||||
fp, err := os.OpenFile(newPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0755)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
// We won't log this error, because it's always going to happen.
|
||||
defer func() { _ = fp.Close() }()
|
||||
if _, err = io.Copy(fp, bytes.NewReader(newBytes)); err != nil {
|
||||
log.Errorf("Unable to copy data: %v\n", err)
|
||||
}
|
||||
|
||||
// if we don't call fp.Close(), windows won't let us move the new executable
|
||||
// because the file will still be "in use"
|
||||
if err := fp.Close(); err != nil {
|
||||
log.Errorf("Unable to close file: %v\n", err)
|
||||
}
|
||||
// this is where we'll move the executable to so that we can swap in the updated replacement
|
||||
oldPath := filepath.Join(updateDir, fmt.Sprintf(".%s.old", filename))
|
||||
|
||||
// delete any existing old exec file - this is necessary on Windows for two reasons:
|
||||
// 1. after a successful update, Windows can't remove the .old file because the process is still running
|
||||
// 2. windows rename operations fail if the destination file already exists
|
||||
_ = os.Remove(oldPath)
|
||||
|
||||
// move the existing executable to a new file in the same directory
|
||||
err = os.Rename(updatePath, oldPath)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
// move the new executable in to become the new program
|
||||
err = os.Rename(newPath, updatePath)
|
||||
|
||||
if err != nil {
|
||||
// copy unsuccessful
|
||||
errRecover = os.Rename(oldPath, updatePath)
|
||||
} else {
|
||||
// copy successful, remove the old binary
|
||||
_ = os.Remove(oldPath)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
96
global/update/update.go
Normal file
96
global/update/update.go
Normal file
@ -0,0 +1,96 @@
|
||||
package update
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/dustin/go-humanize"
|
||||
"github.com/kardianos/osext"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
// WriteCounter 写入量计算实例
|
||||
type WriteCounter struct {
|
||||
Total uint64
|
||||
}
|
||||
|
||||
// Write 方法将写入的byte长度追加至写入的总长度Total中
|
||||
func (wc *WriteCounter) Write(p []byte) (int, error) {
|
||||
n := len(p)
|
||||
wc.Total += uint64(n)
|
||||
wc.PrintProgress()
|
||||
return n, nil
|
||||
}
|
||||
|
||||
// PrintProgress 方法将打印当前的总写入量
|
||||
func (wc *WriteCounter) PrintProgress() {
|
||||
fmt.Printf("\r%s", strings.Repeat(" ", 35))
|
||||
fmt.Printf("\rDownloading... %s complete", humanize.Bytes(wc.Total))
|
||||
}
|
||||
|
||||
// UpdateFromStream copy form getlantern/go-update
|
||||
func UpdateFromStream(updateWith io.Reader) (err error, errRecover error) {
|
||||
updatePath, err := osext.Executable()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
var newBytes []byte
|
||||
// no patch to apply, go on through
|
||||
bufBytes := bufio.NewReader(updateWith)
|
||||
updateWith = io.Reader(bufBytes)
|
||||
newBytes, err = ioutil.ReadAll(updateWith)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
// get the directory the executable exists in
|
||||
updateDir := filepath.Dir(updatePath)
|
||||
filename := filepath.Base(updatePath)
|
||||
// Copy the contents of of newbinary to a the new executable file
|
||||
newPath := filepath.Join(updateDir, fmt.Sprintf(".%s.new", filename))
|
||||
fp, err := os.OpenFile(newPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0755)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
// We won't log this error, because it's always going to happen.
|
||||
defer func() { _ = fp.Close() }()
|
||||
if _, err = io.Copy(fp, bytes.NewReader(newBytes)); err != nil {
|
||||
log.Errorf("Unable to copy data: %v\n", err)
|
||||
}
|
||||
|
||||
// if we don't call fp.Close(), windows won't let us move the new executable
|
||||
// because the file will still be "in use"
|
||||
if err := fp.Close(); err != nil {
|
||||
log.Errorf("Unable to close file: %v\n", err)
|
||||
}
|
||||
// this is where we'll move the executable to so that we can swap in the updated replacement
|
||||
oldPath := filepath.Join(updateDir, fmt.Sprintf(".%s.old", filename))
|
||||
|
||||
// delete any existing old exec file - this is necessary on Windows for two reasons:
|
||||
// 1. after a successful update, Windows can't remove the .old file because the process is still running
|
||||
// 2. windows rename operations fail if the destination file already exists
|
||||
_ = os.Remove(oldPath)
|
||||
|
||||
// move the existing executable to a new file in the same directory
|
||||
err = os.Rename(updatePath, oldPath)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
// move the new executable in to become the new program
|
||||
err = os.Rename(newPath, updatePath)
|
||||
|
||||
if err != nil {
|
||||
// copy unsuccessful
|
||||
errRecover = os.Rename(oldPath, updatePath)
|
||||
} else {
|
||||
// copy successful, remove the old binary
|
||||
_ = os.Remove(oldPath)
|
||||
}
|
||||
return
|
||||
}
|
50
global/update/update_others.go
Normal file
50
global/update/update_others.go
Normal file
@ -0,0 +1,50 @@
|
||||
// +build !windows
|
||||
|
||||
package update
|
||||
|
||||
import (
|
||||
"archive/tar"
|
||||
"bytes"
|
||||
"compress/gzip"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
func Update(url string) {
|
||||
resp, err := http.Get(url)
|
||||
if err != nil {
|
||||
log.Error("更新失败: ", err)
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
wc := WriteCounter{}
|
||||
data, err := io.ReadAll(io.TeeReader(resp.Body, &wc))
|
||||
if err != nil {
|
||||
log.Error("更新失败: ", err)
|
||||
return
|
||||
}
|
||||
gr, err := gzip.NewReader(bytes.NewReader(data))
|
||||
if err != nil {
|
||||
log.Error("更新失败: ", err)
|
||||
return
|
||||
}
|
||||
tr := tar.NewReader(gr)
|
||||
for {
|
||||
header, err := tr.Next()
|
||||
if err == io.EOF {
|
||||
return
|
||||
}
|
||||
if header.Name == "go-cqhttp" {
|
||||
err, _ := UpdateFromStream(tr)
|
||||
fmt.Println()
|
||||
if err != nil {
|
||||
log.Error("更新失败!", err)
|
||||
return
|
||||
}
|
||||
log.Info("更新完成!")
|
||||
}
|
||||
}
|
||||
}
|
35
global/update/update_windows.go
Normal file
35
global/update/update_windows.go
Normal file
@ -0,0 +1,35 @@
|
||||
package update
|
||||
|
||||
import (
|
||||
"archive/zip"
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
func Update(url string) {
|
||||
resp, err := http.Get(url)
|
||||
if err != nil {
|
||||
log.Error("更新失败: ", err)
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
wc := WriteCounter{}
|
||||
rsp, _ := io.ReadAll(io.TeeReader(resp.Body, &wc))
|
||||
reader, _ := zip.NewReader(bytes.NewReader(rsp), resp.ContentLength)
|
||||
file, err := reader.Open("go-cqhttp.exe")
|
||||
if err != nil {
|
||||
log.Error("更新失败!", err)
|
||||
return
|
||||
}
|
||||
err, _ = UpdateFromStream(file)
|
||||
fmt.Println()
|
||||
if err != nil {
|
||||
log.Error("更新失败!", err)
|
||||
return
|
||||
}
|
||||
log.Info("更新完成!")
|
||||
}
|
2
go.mod
2
go.mod
@ -4,7 +4,7 @@ go 1.16
|
||||
|
||||
require (
|
||||
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f
|
||||
github.com/Mrs4s/MiraiGo v0.0.0-20210327070734-ede433b4f625
|
||||
github.com/Mrs4s/MiraiGo v0.0.0-20210328053212-557c05319718
|
||||
github.com/dustin/go-humanize v1.0.0
|
||||
github.com/gin-gonic/gin v1.6.3
|
||||
github.com/gorilla/websocket v1.4.2
|
||||
|
14
go.sum
14
go.sum
@ -2,10 +2,10 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
|
||||
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f h1:2dk3eOnYllh+wUOuDhOoC2vUVoJF/5z478ryJ+wzEII=
|
||||
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f/go.mod h1:4a58ifQTEe2uwwsaqbh3i2un5/CBPg+At/qHpt18Tmk=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/Mrs4s/MiraiGo v0.0.0-20210323143736-d233c90d5083 h1:ELaNvv80OTwHTYhKwoQpgV4dneKPM1qE5Geu3A1kM/8=
|
||||
github.com/Mrs4s/MiraiGo v0.0.0-20210323143736-d233c90d5083/go.mod h1:NjiWhlvGxwv1ftOWIoiFa/OzklnAYI4YqNexFOKSZKw=
|
||||
github.com/Mrs4s/MiraiGo v0.0.0-20210327070734-ede433b4f625 h1:Dn+bn+vsbUBh76OD3N31vMoI8EpMu5z+UZrDkwp4BEE=
|
||||
github.com/Mrs4s/MiraiGo v0.0.0-20210327070734-ede433b4f625/go.mod h1:NjiWhlvGxwv1ftOWIoiFa/OzklnAYI4YqNexFOKSZKw=
|
||||
github.com/Mrs4s/MiraiGo v0.0.0-20210327114026-05f0087b4f79 h1:eiTXqIOigPaS+Ls8rZotUV2TVC4pQ4t3CHIre18k/NY=
|
||||
github.com/Mrs4s/MiraiGo v0.0.0-20210327114026-05f0087b4f79/go.mod h1:NjiWhlvGxwv1ftOWIoiFa/OzklnAYI4YqNexFOKSZKw=
|
||||
github.com/Mrs4s/MiraiGo v0.0.0-20210328053212-557c05319718 h1:qshDoEEFDJkg+8ts3OJWJt/gFWWDuSZPACo3elKYfV0=
|
||||
github.com/Mrs4s/MiraiGo v0.0.0-20210328053212-557c05319718/go.mod h1:NjiWhlvGxwv1ftOWIoiFa/OzklnAYI4YqNexFOKSZKw=
|
||||
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/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
@ -56,8 +56,6 @@ github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
|
||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
|
||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/guonaihong/gout v0.1.5 h1:1FeFFJWWdWYApBW9d6vzMDB4eR4Zr8T/gaVrjDVcl5U=
|
||||
github.com/guonaihong/gout v0.1.5/go.mod h1:0rFYAYyzbcxEg11eY2qUbffJs7hHRPeugAnlVYSp8Ic=
|
||||
github.com/guonaihong/gout v0.1.6 h1:Txej4NYvVJLZkW0Xgw1HuWfSWow5BgLF6vqlM2kRdno=
|
||||
github.com/guonaihong/gout v0.1.6/go.mod h1:P6P8+0+toYgmhFqzLxVde+9vQbCDHrxn56V9TglC5io=
|
||||
github.com/hjson/hjson-go v3.1.0+incompatible h1:DY/9yE8ey8Zv22bY+mHV1uk2yRy0h8tKhZ77hEdi0Aw=
|
||||
@ -120,14 +118,10 @@ github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFd
|
||||
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
|
||||
github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816 h1:J6v8awz+me+xeb/cUTotKgceAYouhIB3pjzgRd6IlGk=
|
||||
github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816/go.mod h1:tzym/CEb5jnFI+Q0k4Qq3+LvRF4gO3E2pxS8fHP8jcA=
|
||||
github.com/tidwall/gjson v1.6.8 h1:CTmXMClGYPAmln7652e69B7OLXfTi5ABcPPwjIWUv7w=
|
||||
github.com/tidwall/gjson v1.6.8/go.mod h1:zeFuBCIqD4sN/gmqBzZ4j7Jd6UcA2Fc56x7QFsv+8fI=
|
||||
github.com/tidwall/gjson v1.7.3 h1:9dOulDrkCJf1mwljVMhXNQr9ZL2NvajRX7A1R8c6Qxw=
|
||||
github.com/tidwall/gjson v1.7.3/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk=
|
||||
github.com/tidwall/match v1.0.3 h1:FQUVvBImDutD8wJLN6c5eMzWtjgONK9MwIBCOrUJKeE=
|
||||
github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
|
||||
github.com/tidwall/pretty v1.0.2 h1:Z7S3cePv9Jwm1KwS0513MRaoUe3S01WPbLNV40pwWZU=
|
||||
github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
|
||||
github.com/tidwall/pretty v1.1.0 h1:K3hMW5epkdAVwibsQEfR/7Zj0Qgt4DxtNumTq/VloO8=
|
||||
github.com/tidwall/pretty v1.1.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
|
||||
github.com/tuotoo/qrcode v0.0.0-20190222102259-ac9c44189bf2 h1:BWVtt2VBY+lmVDu9MGKqLGKl04B+iRHcrW1Ptyi/8tg=
|
||||
|
68
main.go
68
main.go
@ -9,9 +9,7 @@ import (
|
||||
"encoding/hex"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/signal"
|
||||
"path"
|
||||
@ -25,6 +23,7 @@ import (
|
||||
"github.com/Mrs4s/go-cqhttp/coolq"
|
||||
"github.com/Mrs4s/go-cqhttp/global"
|
||||
"github.com/Mrs4s/go-cqhttp/global/terminal"
|
||||
"github.com/Mrs4s/go-cqhttp/global/update"
|
||||
"github.com/Mrs4s/go-cqhttp/server"
|
||||
|
||||
"github.com/Mrs4s/MiraiGo/binary"
|
||||
@ -166,7 +165,7 @@ func main() {
|
||||
log.Warning("将等待10s后启动")
|
||||
time.Sleep(time.Second * 10)
|
||||
}
|
||||
if conf.Uin == 0 || (conf.Password == "" && conf.PasswordEncrypted == "") {
|
||||
if (conf.Uin == 0 || (conf.Password == "" && conf.PasswordEncrypted == "")) && !global.PathExists("session.token") {
|
||||
log.Warn("账号密码未配置, 将使用二维码登录.")
|
||||
if !isFastStart {
|
||||
log.Warn("将在 5秒 后继续.")
|
||||
@ -314,6 +313,18 @@ func main() {
|
||||
// b := server.WebServer.Run(fmt.Sprintf("%s:%d", conf.WebUI.Host, conf.WebUI.WebUIPort), cli)
|
||||
// c := server.Console
|
||||
isQRCodeLogin := (conf.Uin == 0 || len(conf.Password) == 0) && len(conf.PasswordEncrypted) == 0
|
||||
isTokenLogin := false
|
||||
if global.PathExists("session.token") {
|
||||
token, err := ioutil.ReadFile("session.token")
|
||||
if err == nil {
|
||||
if err = cli.TokenLogin(token); err != nil {
|
||||
log.Warnf("恢复会话失败: %v , 尝试使用正常流程登录.", err)
|
||||
} else {
|
||||
isTokenLogin = true
|
||||
}
|
||||
}
|
||||
}
|
||||
if !isTokenLogin {
|
||||
if !isQRCodeLogin {
|
||||
if err := commonLogin(); err != nil {
|
||||
log.Fatalf("登录时发生致命错误: %v", err)
|
||||
@ -323,6 +334,12 @@ func main() {
|
||||
log.Fatalf("登录时发生致命错误: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
saveToken := func() {
|
||||
global.AccountToken = cli.GenToken()
|
||||
_ = ioutil.WriteFile("session.token", global.AccountToken, 0677)
|
||||
}
|
||||
saveToken()
|
||||
var times uint = 1 // 重试次数
|
||||
var reLoginLock sync.Mutex
|
||||
cli.OnDisconnected(func(q *client.QQClient, e *client.ClientDisconnectedEvent) {
|
||||
@ -332,9 +349,6 @@ func main() {
|
||||
if !conf.ReLogin.Enabled {
|
||||
os.Exit(1)
|
||||
}
|
||||
if isQRCodeLogin {
|
||||
log.Fatalf("二维码登录暂不支持重连.")
|
||||
}
|
||||
if times > conf.ReLogin.MaxReloginTimes && conf.ReLogin.MaxReloginTimes != 0 {
|
||||
log.Fatalf("Bot重连次数超过限制, 停止")
|
||||
}
|
||||
@ -345,6 +359,13 @@ func main() {
|
||||
if cli.Online {
|
||||
return
|
||||
}
|
||||
if err := cli.TokenLogin(global.AccountToken); err == nil {
|
||||
saveToken()
|
||||
return
|
||||
}
|
||||
if isQRCodeLogin {
|
||||
log.Fatalf("快速重连失败")
|
||||
}
|
||||
if err := commonLogin(); err != nil {
|
||||
log.Fatalf("登录时发生致命错误: %v", err)
|
||||
}
|
||||
@ -488,8 +509,9 @@ func selfUpdate(imageURL string) {
|
||||
log.Info("当前最新版本为 ", version)
|
||||
log.Warn("是否更新(y/N): ")
|
||||
r := strings.TrimSpace(readLine())
|
||||
|
||||
doUpdate := func() {
|
||||
if r != "y" && r != "Y" {
|
||||
log.Warn("已取消更新!")
|
||||
} else {
|
||||
log.Info("正在更新,请稍等...")
|
||||
url := fmt.Sprintf(
|
||||
"%v/Mrs4s/go-cqhttp/releases/download/%v/go-cqhttp-%v-%v-%v",
|
||||
@ -499,34 +521,14 @@ func selfUpdate(imageURL string) {
|
||||
}
|
||||
return "https://github.com"
|
||||
}(),
|
||||
version,
|
||||
version,
|
||||
runtime.GOOS,
|
||||
runtime.GOARCH,
|
||||
version, version, runtime.GOOS, runtime.GOARCH,
|
||||
)
|
||||
if runtime.GOOS == "windows" {
|
||||
url += ".exe"
|
||||
}
|
||||
resp, err := http.Get(url)
|
||||
if err != nil {
|
||||
log.Error("更新失败: ", err)
|
||||
return
|
||||
}
|
||||
defer func() { _ = resp.Body.Close() }()
|
||||
wc := global.WriteCounter{}
|
||||
err, _ = global.UpdateFromStream(io.TeeReader(resp.Body, &wc))
|
||||
fmt.Println()
|
||||
if err != nil {
|
||||
log.Error("更新失败!")
|
||||
return
|
||||
}
|
||||
log.Info("更新完成!")
|
||||
}
|
||||
|
||||
if r == "y" || r == "Y" {
|
||||
doUpdate()
|
||||
url += ".zip"
|
||||
} else {
|
||||
log.Warn("已取消更新!")
|
||||
url += ".tar.gz"
|
||||
}
|
||||
update.Update(url)
|
||||
}
|
||||
} else {
|
||||
log.Info("当前版本已经是最新版本!")
|
||||
|
Loading…
x
Reference in New Issue
Block a user