74 lines
1.4 KiB
Go
74 lines
1.4 KiB
Go
package utils
|
|
|
|
import (
|
|
"encoding/json"
|
|
"os"
|
|
|
|
"github.com/bedrock-tool/bedrocktool/locale"
|
|
"github.com/sandertv/gophertunnel/minecraft/auth"
|
|
"github.com/sandertv/gophertunnel/minecraft/realms"
|
|
"github.com/sirupsen/logrus"
|
|
"golang.org/x/oauth2"
|
|
)
|
|
|
|
const TokenFile = "token.json"
|
|
|
|
var gTokenSrc oauth2.TokenSource
|
|
|
|
func GetTokenSource() oauth2.TokenSource {
|
|
if gTokenSrc != nil {
|
|
return gTokenSrc
|
|
}
|
|
token := getToken()
|
|
gTokenSrc = auth.RefreshTokenSource(&token)
|
|
newToken, err := gTokenSrc.Token()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
if !token.Valid() {
|
|
logrus.Info(locale.Loc("refreshed_token", nil))
|
|
writeToken(newToken)
|
|
}
|
|
|
|
return gTokenSrc
|
|
}
|
|
|
|
var gRealmsAPI *realms.Client
|
|
|
|
func GetRealmsAPI() *realms.Client {
|
|
if gRealmsAPI == nil {
|
|
gRealmsAPI = realms.NewClient(GetTokenSource())
|
|
}
|
|
return gRealmsAPI
|
|
}
|
|
|
|
func writeToken(token *oauth2.Token) {
|
|
buf, err := json.Marshal(token)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
os.WriteFile(TokenFile, buf, 0o755)
|
|
}
|
|
|
|
func getToken() oauth2.Token {
|
|
var token oauth2.Token
|
|
if _, err := os.Stat(TokenFile); err == nil {
|
|
f, err := os.Open(TokenFile)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer f.Close()
|
|
if err := json.NewDecoder(f).Decode(&token); err != nil {
|
|
panic(err)
|
|
}
|
|
} else {
|
|
_token, err := auth.RequestLiveToken()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
writeToken(_token)
|
|
token = *_token
|
|
}
|
|
return token
|
|
}
|