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

Compare commits

..

18 Commits

Author SHA1 Message Date
db63cbec82 fix: update url 2021-03-28 20:06:04 +08:00
5b0c693aba fix: limitedString
减少内存使用
2021-03-28 19:08:29 +08:00
5429292357 Merge pull request #763 from Ink-33/dev
群成员信息noCache参数支持
2021-03-28 14:19:49 +08:00
4aab8ebe52 Merge remote-tracking branch 'upstream/dev' into dev 2021-03-28 14:16:15 +08:00
8db68f9427 fix: cqcode fix url
之前写的时候憨批了
2021-03-28 00:11:13 +08:00
001d9aa0d6 fix reconnect. 2021-03-27 21:53:36 +08:00
798df7e9dd fix typo. 2021-03-27 21:52:10 +08:00
6f0f66132a feat: session resume. 2021-03-27 21:30:21 +08:00
079bd9d6ed update self update 2021-03-27 20:31:54 +08:00
5940421b72 Merge remote-tracking branch 'upstream/dev' into dev 2021-03-27 17:11:56 +08:00
a499ad0c43 Merge remote-tracking branch 'upstream/dev' into dev 2021-03-27 16:53:22 +08:00
76d00a57ff upload dist 2021-03-27 16:02:34 +08:00
9413c801c5 update dependcies 2021-03-27 15:51:07 +08:00
2b3842e61c use goreleaser 2021-03-26 23:52:09 +08:00
8e6312914c fix Mrs4s#594 2021-03-26 01:02:43 +08:00
69eec1419c update 2021-03-25 23:52:22 +08:00
4dfee419e5 run go mod tidy 2021-03-25 23:50:04 +08:00
b63659656b run go mod tidy 2021-03-09 23:18:58 +08:00
15 changed files with 335 additions and 170 deletions

View File

@ -1,4 +1,4 @@
name: build
name: release
on:
push:
@ -9,14 +9,12 @@ jobs:
goreleaser:
runs-on: ubuntu-latest
steps:
-
name: Checkout
- name: Checkout
uses: actions/checkout@v2.3.4
with:
fetch-depth: 0
-
name: Set up Go
- name: Set up Go
uses: actions/setup-go@v2
with:
go-version: '1.16.2'
@ -28,3 +26,16 @@ jobs:
args: release --rm-dist
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
#- name: Checkout Dist
# uses: actions/checkout@v2
# with:
# repository: 'gocq/dist'
# ref: master
# ssh-key: ${{ secrets.SSH_KEY }}
# path: upstream/dist
#- name: Update Dist
# run: |
# chmod +x scripts/upload_dist.sh
# ./scripts/upload_dist.sh

View File

@ -16,6 +16,8 @@ builds:
- amd64
- arm
- arm64
goarm:
- 7
ignore:
- goos: darwin
goarch: arm
@ -48,3 +50,12 @@ archives:
format_overrides:
- goos: windows
format: zip
nfpms:
- license: AGPL 3.0
homepage: https://go-cqhttp.org
file_name_template: "{{ .ProjectName }}_{{ .Os }}_{{ .Arch }}"
formats:
- deb
- rpm
maintainer: Mrs4s

View File

@ -14,12 +14,14 @@ import (
"strconv"
"strings"
"time"
"unicode/utf8"
"github.com/Mrs4s/go-cqhttp/global"
"github.com/Mrs4s/MiraiGo/binary"
"github.com/Mrs4s/MiraiGo/client"
"github.com/Mrs4s/MiraiGo/message"
"github.com/Mrs4s/MiraiGo/utils"
log "github.com/sirupsen/logrus"
"github.com/tidwall/gjson"
)
@ -142,12 +144,22 @@ func (bot *CQBot) CQGetGroupMemberList(groupID int64, noCache bool) MSG {
// CQGetGroupMemberInfo 获取群成员信息
//
// https://git.io/Jtz1s
func (bot *CQBot) CQGetGroupMemberInfo(groupID, userID int64) MSG {
func (bot *CQBot) CQGetGroupMemberInfo(groupID, userID int64, noCache bool) MSG {
group := bot.Client.FindGroup(groupID)
if group == nil {
return Failed(100, "GROUP_NOT_FOUND", "群聊不存在")
}
member := group.FindMember(userID)
var member *client.GroupMemberInfo
if noCache {
var err error
member, err = bot.Client.GetMemberInfo(groupID, userID)
if err != nil {
log.Warnf("刷新群 %v 中成员 %v 失败: %v", groupID, userID, err)
return Failed(100, "GET_MEMBER_INFO_API_ERROR", err.Error())
}
} else {
member = group.FindMember(userID)
}
if member == nil {
return Failed(100, "MEMBER_NOT_FOUND", "群员不存在")
}
@ -1368,10 +1380,15 @@ func convertGroupMemberInfo(groupID int64, m *client.GroupMemberInfo) MSG {
}
func limitedString(str string) string {
if strings.Count(str, "") <= 10 {
if utf8.RuneCountInString(str) <= 10 {
return str
}
limited := []rune(str)
limited = limited[:10]
b := utils.S2B(str)
limited := make([]rune, 0, 10)
for i := 0; i < 10; i++ {
decodeRune, size := utf8.DecodeRune(b)
b = b[size:]
limited = append(limited, decodeRune)
}
return string(limited) + " ..."
}

View File

@ -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
}

View File

@ -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 = `
@ -173,7 +174,7 @@ type JSONConfig struct {
UseSSOAddress bool `json:"use_sso_address"`
Debug bool `json:"debug"`
LogLevel string `json:"log_level"`
//WebUI *GoCQWebUI `json:"web_ui"`
// WebUI *GoCQWebUI `json:"web_ui"`
}
// CQHTTPAPIConfig HTTPAPI对应的Config结构体

View File

@ -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
View 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
}

View 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("更新完成!")
}
}
}

View 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("更新完成!")
}

10
go.mod
View File

@ -4,11 +4,11 @@ go 1.16
require (
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f
github.com/Mrs4s/MiraiGo v0.0.0-20210323143736-d233c90d5083
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
github.com/guonaihong/gout v0.1.5
github.com/guonaihong/gout v0.1.6
github.com/hjson/hjson-go v3.1.0+incompatible
github.com/jonboulle/clockwork v0.2.2 // indirect
github.com/json-iterator/go v1.1.10
@ -21,11 +21,11 @@ require (
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect
github.com/syndtr/goleveldb v1.0.0
github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816
github.com/tidwall/gjson v1.6.8
github.com/tidwall/gjson v1.7.3
github.com/tuotoo/qrcode v0.0.0-20190222102259-ac9c44189bf2
github.com/wdvxdr1123/go-silk v0.0.0-20210316130616-d47b553def60
github.com/willf/bitset v1.1.11 // indirect
golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2
golang.org/x/term v0.0.0-20210317153231-de623e64d2a6
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba
)

22
go.sum
View File

@ -2,8 +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-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=
@ -54,8 +56,8 @@ 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=
github.com/hjson/hjson-go v3.1.0+incompatible/go.mod h1:qsetwF8NlsTsOTwZTApNlTCerV+b2GjYRRcIk4JMFio=
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
@ -116,12 +118,12 @@ 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=
github.com/tuotoo/qrcode v0.0.0-20190222102259-ac9c44189bf2/go.mod h1:lPnW9HVS0vJdeYyQtOvIvlXgZPNhUAhwz+z5r8AJk0Y=
github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
@ -135,6 +137,8 @@ github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b h1:wSOdpTq0/eI46Ez/LkDwIsAKA71YP2SRKBODiRWM0as=
golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
@ -164,6 +168,8 @@ golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE=
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210317153231-de623e64d2a6 h1:EC6+IGYTjPpRfv9a2b/6Puw0W+hLtAhkV1tPsXhutqs=
golang.org/x/term v0.0.0-20210317153231-de623e64d2a6/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=

77
main.go
View File

@ -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)
}
@ -444,7 +465,7 @@ func OldPasswordDecrypt(encryptedPassword string, key []byte) string {
func checkUpdate() {
log.Infof("正在检查更新.")
if coolq.Version == "unknown" {
if coolq.Version == "(devel)" {
log.Warnf("检查更新失败: 使用的 Actions 测试版或自编译版本.")
return
}
@ -488,45 +509,31 @@ 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",
"%v/Mrs4s/go-cqhttp/releases/download/%v/go-cqhttp_%v_%v",
func() string {
if imageURL != "" {
return imageURL
}
return "https://github.com"
}(),
version,
version,
runtime.GOOS,
runtime.GOARCH,
version, runtime.GOOS, func() string {
if runtime.GOARCH == "arm" {
return "armv7"
}
return 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("当前版本已经是最新版本!")

19
scripts/upload_dist.sh Normal file
View File

@ -0,0 +1,19 @@
#!/bin/bash
if [ "$GITHUB_ACTIONS" != "true" ]; then
echo "This script is only meant to be run in GitHub Actions."
exit 1
fi
cp -f dist/*.tar.gz upstream/dist/downloads
cp -f dist/*.zip upstream/dist/downloads
cd upstream/dist || exit
LATEST_VERSION="${GITHUB_REF#"refs/tags/"}"
git config --local user.name 'Github Actions'
git config --local user.email 'github-actions@users.noreply.github.com'
git add --all
git commit -m "update to $LATEST_VERSION"
git tag -d "${GITHUB_REF#"refs/tags/"}"
git tag "${GITHUB_REF#"refs/tags/"}"
git push
git push --tags

View File

@ -39,7 +39,7 @@ func getGroupMemberList(bot *coolq.CQBot, p resultGetter) coolq.MSG {
func getGroupMemberInfo(bot *coolq.CQBot, p resultGetter) coolq.MSG {
return bot.CQGetGroupMemberInfo(
p.Get("group_id").Int(), p.Get("user_id").Int(),
p.Get("group_id").Int(), p.Get("user_id").Int(), p.Get("no_cache").Bool(),
)
}
func sendMSG(bot *coolq.CQBot, p resultGetter) coolq.MSG {

View File

@ -1,2 +1,2 @@
// Package server 包含Admin子站,HTTP,WebSocket,反向WebSocket请求处理的相关函数与结构体
// Package server 包含HTTP,WebSocket,反向WebSocket请求处理的相关函数与结构体
package server