mirror of
https://github.com/Mrs4s/go-cqhttp.git
synced 2025-05-04 19:17:37 +08:00
feat: basic protocol auto-updater
This commit is contained in:
parent
b85c2ecb07
commit
0312f05f6e
@ -14,8 +14,10 @@ import (
|
|||||||
|
|
||||||
"github.com/Mrs4s/MiraiGo/binary"
|
"github.com/Mrs4s/MiraiGo/binary"
|
||||||
"github.com/Mrs4s/MiraiGo/client"
|
"github.com/Mrs4s/MiraiGo/client"
|
||||||
|
"github.com/Mrs4s/go-cqhttp/internal/download"
|
||||||
para "github.com/fumiama/go-hide-param"
|
para "github.com/fumiama/go-hide-param"
|
||||||
rotatelogs "github.com/lestrrat-go/file-rotatelogs"
|
rotatelogs "github.com/lestrrat-go/file-rotatelogs"
|
||||||
|
"github.com/pkg/errors"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"golang.org/x/crypto/pbkdf2"
|
"golang.org/x/crypto/pbkdf2"
|
||||||
"golang.org/x/term"
|
"golang.org/x/term"
|
||||||
@ -102,6 +104,7 @@ func PrepareData() {
|
|||||||
mkCacheDir(global.VideoPath, "视频")
|
mkCacheDir(global.VideoPath, "视频")
|
||||||
mkCacheDir(global.CachePath, "发送图片")
|
mkCacheDir(global.CachePath, "发送图片")
|
||||||
mkCacheDir(path.Join(global.ImagePath, "guild-images"), "频道图片缓存")
|
mkCacheDir(path.Join(global.ImagePath, "guild-images"), "频道图片缓存")
|
||||||
|
mkCacheDir(global.VersionsPath, "版本缓存")
|
||||||
cache.Init()
|
cache.Init()
|
||||||
|
|
||||||
db.Init()
|
db.Init()
|
||||||
@ -221,6 +224,17 @@ func LoginInteract() {
|
|||||||
cli.UseDevice(device)
|
cli.UseDevice(device)
|
||||||
isQRCodeLogin := (base.Account.Uin == 0 || len(base.Account.Password) == 0) && !base.Account.Encrypt
|
isQRCodeLogin := (base.Account.Uin == 0 || len(base.Account.Password) == 0) && !base.Account.Encrypt
|
||||||
isTokenLogin := false
|
isTokenLogin := false
|
||||||
|
|
||||||
|
// 加载本地版本信息, 一般是在上次登录时保存的
|
||||||
|
versionFile := path.Join(global.VersionsPath, fmt.Sprint(int(cli.Device().Protocol))+".json")
|
||||||
|
if global.PathExists(versionFile) {
|
||||||
|
b, err := os.ReadFile(versionFile)
|
||||||
|
if err == nil {
|
||||||
|
_ = cli.Device().Protocol.Version().UpdateFromJson(b)
|
||||||
|
}
|
||||||
|
log.Infof("从文件 %s 读取协议版本 %v.", versionFile, cli.Device().Protocol.Version())
|
||||||
|
}
|
||||||
|
|
||||||
saveToken := func() {
|
saveToken := func() {
|
||||||
base.AccountToken = cli.GenToken()
|
base.AccountToken = cli.GenToken()
|
||||||
_ = os.WriteFile("session.token", base.AccountToken, 0o644)
|
_ = os.WriteFile("session.token", base.AccountToken, 0o644)
|
||||||
@ -262,6 +276,20 @@ func LoginInteract() {
|
|||||||
cli.PasswordMd5 = base.PasswordHash
|
cli.PasswordMd5 = base.PasswordHash
|
||||||
}
|
}
|
||||||
if !isTokenLogin {
|
if !isTokenLogin {
|
||||||
|
if !base.Account.DisableProtocolUpdate {
|
||||||
|
oldVersionName := device.Protocol.Version().String()
|
||||||
|
remoteVersion, err := getRemoteLatestProtocolVersion(int(device.Protocol.Version().Protocol))
|
||||||
|
if err == nil {
|
||||||
|
if err = device.Protocol.Version().UpdateFromJson(remoteVersion); err == nil {
|
||||||
|
if device.Protocol.Version().String() != oldVersionName {
|
||||||
|
log.Infof("已自动更新协议版本: %s -> %s", oldVersionName, device.Protocol.Version().String())
|
||||||
|
}
|
||||||
|
_ = os.WriteFile(versionFile, remoteVersion, 0o644)
|
||||||
|
}
|
||||||
|
} else if err.Error() != "remote version unavailable" {
|
||||||
|
log.Warnf("检查协议更新失败: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
if !isQRCodeLogin {
|
if !isQRCodeLogin {
|
||||||
if err := commonLogin(); err != nil {
|
if err := commonLogin(); err != nil {
|
||||||
log.Fatalf("登录时发生致命错误: %v", err)
|
log.Fatalf("登录时发生致命错误: %v", err)
|
||||||
@ -408,6 +436,24 @@ func newClient() *client.QQClient {
|
|||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: mirror support
|
||||||
|
var remoteVersions = map[int]string{
|
||||||
|
1: "https://raw.githubusercontent.com/RomiChan/protocol-versions/master/android_phone.json",
|
||||||
|
6: "https://raw.githubusercontent.com/RomiChan/protocol-versions/master/android_pad.json",
|
||||||
|
}
|
||||||
|
|
||||||
|
func getRemoteLatestProtocolVersion(protocolType int) ([]byte, error) {
|
||||||
|
url, ok := remoteVersions[protocolType]
|
||||||
|
if !ok {
|
||||||
|
return nil, errors.New("remote version unavailable")
|
||||||
|
}
|
||||||
|
response, err := download.Request{URL: url}.Bytes()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return response, nil
|
||||||
|
}
|
||||||
|
|
||||||
type protocolLogger struct{}
|
type protocolLogger struct{}
|
||||||
|
|
||||||
const fromProtocol = "Protocol -> "
|
const fromProtocol = "Protocol -> "
|
||||||
|
@ -27,6 +27,8 @@ const (
|
|||||||
VoicePath = "data/voices"
|
VoicePath = "data/voices"
|
||||||
// VideoPath go-cqhttp使用的视频缓存目录
|
// VideoPath go-cqhttp使用的视频缓存目录
|
||||||
VideoPath = "data/videos"
|
VideoPath = "data/videos"
|
||||||
|
// VersionsPath go-cqhttp使用的版本信息目录
|
||||||
|
VersionsPath = "data/versions"
|
||||||
// CachePath go-cqhttp使用的缓存目录
|
// CachePath go-cqhttp使用的缓存目录
|
||||||
CachePath = "data/cache"
|
CachePath = "data/cache"
|
||||||
// DumpsPath go-cqhttp使用错误转储目录
|
// DumpsPath go-cqhttp使用错误转储目录
|
||||||
|
2
go.mod
2
go.mod
@ -5,7 +5,7 @@ go 1.20
|
|||||||
require (
|
require (
|
||||||
github.com/FloatTech/sqlite v1.5.7
|
github.com/FloatTech/sqlite v1.5.7
|
||||||
github.com/Microsoft/go-winio v0.6.0
|
github.com/Microsoft/go-winio v0.6.0
|
||||||
github.com/Mrs4s/MiraiGo v0.0.0-20230312141222-653b853ca5ac
|
github.com/Mrs4s/MiraiGo v0.0.0-20230314181550-5e7ade149fff
|
||||||
github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e
|
github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e
|
||||||
github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc
|
github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc
|
||||||
github.com/fumiama/go-base16384 v1.6.1
|
github.com/fumiama/go-base16384 v1.6.1
|
||||||
|
4
go.sum
4
go.sum
@ -4,8 +4,8 @@ github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b h1:tvciXWq2nuvTbFeJG
|
|||||||
github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b/go.mod h1:fHZFWGquNXuHttu9dUYoKuNbm3dzLETnIOnm1muSfDs=
|
github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b/go.mod h1:fHZFWGquNXuHttu9dUYoKuNbm3dzLETnIOnm1muSfDs=
|
||||||
github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg=
|
github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg=
|
||||||
github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE=
|
github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE=
|
||||||
github.com/Mrs4s/MiraiGo v0.0.0-20230312141222-653b853ca5ac h1:DhqFiVOZeBpKtcJHdrLPmCSxmqRUi7RwxbwiOqg8ScI=
|
github.com/Mrs4s/MiraiGo v0.0.0-20230314181550-5e7ade149fff h1:VOc0uHpfTQde3c+1hdXbvuZiinF3bm3Qc7eNf6waonk=
|
||||||
github.com/Mrs4s/MiraiGo v0.0.0-20230312141222-653b853ca5ac/go.mod h1:mU3fBFU+7eO0kaGes7YRKtzIDtwIU84nSSwTV7NK2b0=
|
github.com/Mrs4s/MiraiGo v0.0.0-20230314181550-5e7ade149fff/go.mod h1:mU3fBFU+7eO0kaGes7YRKtzIDtwIU84nSSwTV7NK2b0=
|
||||||
github.com/RomiChan/protobuf v0.1.1-0.20230204044148-2ed269a2e54d h1:/Xuj3fIiMY2ls1TwvPKmaqQrtJsPY+c9s+0lOScVHd8=
|
github.com/RomiChan/protobuf v0.1.1-0.20230204044148-2ed269a2e54d h1:/Xuj3fIiMY2ls1TwvPKmaqQrtJsPY+c9s+0lOScVHd8=
|
||||||
github.com/RomiChan/protobuf v0.1.1-0.20230204044148-2ed269a2e54d/go.mod h1:2Ie+hdBFQpQFDHfeklgxoFmQRCE7O+KwFpISeXq7OwA=
|
github.com/RomiChan/protobuf v0.1.1-0.20230204044148-2ed269a2e54d/go.mod h1:2Ie+hdBFQpQFDHfeklgxoFmQRCE7O+KwFpISeXq7OwA=
|
||||||
github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e h1:wR3MXQ3VbUlPKOOUwLOYgh/QaJThBTYtsl673O3lqSA=
|
github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e h1:wR3MXQ3VbUlPKOOUwLOYgh/QaJThBTYtsl673O3lqSA=
|
||||||
|
@ -35,6 +35,7 @@ type Account struct {
|
|||||||
ReLogin *Reconnect `yaml:"relogin"`
|
ReLogin *Reconnect `yaml:"relogin"`
|
||||||
UseSSOAddress bool `yaml:"use-sso-address"`
|
UseSSOAddress bool `yaml:"use-sso-address"`
|
||||||
AllowTempSession bool `yaml:"allow-temp-session"`
|
AllowTempSession bool `yaml:"allow-temp-session"`
|
||||||
|
DisableProtocolUpdate bool `yaml:"disable-protocol-update"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Config 总配置文件
|
// Config 总配置文件
|
||||||
|
@ -15,6 +15,8 @@ account: # 账号相关
|
|||||||
use-sso-address: true
|
use-sso-address: true
|
||||||
# 是否允许发送临时会话消息
|
# 是否允许发送临时会话消息
|
||||||
allow-temp-session: false
|
allow-temp-session: false
|
||||||
|
# 是否禁用协议更新
|
||||||
|
disable-protocol-update: false
|
||||||
|
|
||||||
heartbeat:
|
heartbeat:
|
||||||
# 心跳频率, 单位秒
|
# 心跳频率, 单位秒
|
||||||
|
Loading…
x
Reference in New Issue
Block a user