diff --git a/auth.go b/auth.go index 1140479..d02fa69 100644 --- a/auth.go +++ b/auth.go @@ -1,12 +1,12 @@ package main import ( - "context" "encoding/json" "fmt" "os" "github.com/sandertv/gophertunnel/minecraft/auth" + "github.com/sandertv/gophertunnel/minecraft/realms" "golang.org/x/oauth2" ) @@ -30,21 +30,13 @@ func GetTokenSource() oauth2.TokenSource { return G_token_src } -var _G_xbl_token *auth.XBLToken +var G_realms_api *realms.Client -func GetXBLToken(ctx context.Context) *auth.XBLToken { - if _G_xbl_token != nil { - return _G_xbl_token +func getRealmsApi() *realms.Client { + if G_realms_api == nil { + G_realms_api = realms.NewClient(GetTokenSource()) } - _token, err := GetTokenSource().Token() - if err != nil { - panic(err) - } - _G_xbl_token, err = auth.RequestXBLToken(ctx, _token, "https://pocket.realms.minecraft.net/") - if err != nil { - panic(err) - } - return _G_xbl_token + return G_realms_api } func write_token(token *oauth2.Token) { diff --git a/go.mod b/go.mod index 3833d8f..03b1b56 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( //replace github.com/df-mc/dragonfly => ./dragonfly -replace github.com/sandertv/gophertunnel => github.com/olebeck/gophertunnel v1.24.8 +replace github.com/sandertv/gophertunnel => github.com/olebeck/gophertunnel v1.24.8-1 replace github.com/df-mc/dragonfly => github.com/olebeck/dragonfly v0.8.2-5 diff --git a/go.sum b/go.sum index 5d417ff..d4b66fb 100644 --- a/go.sum +++ b/go.sum @@ -43,6 +43,8 @@ github.com/olebeck/gophertunnel v1.24.6 h1:Mnpzk9e+eMdfx/wbEsmwQabEbalNzFRu+3iME github.com/olebeck/gophertunnel v1.24.6/go.mod h1:dMOw79FHxr2azEqiGH20AwdljisAN1kqwu5SjPBnZ5k= github.com/olebeck/gophertunnel v1.24.7 h1:EMYLDMxGxzPtoI/Y77KHPcfelkGS+QcjdtStGIqtYFE= github.com/olebeck/gophertunnel v1.24.7/go.mod h1:dMOw79FHxr2azEqiGH20AwdljisAN1kqwu5SjPBnZ5k= +github.com/olebeck/gophertunnel v1.24.8-1 h1:ECZs6y/ZtvUjhIPlu3RjJr8c5QkOdxdQnoO+4iR4TEk= +github.com/olebeck/gophertunnel v1.24.8-1/go.mod h1:dMOw79FHxr2azEqiGH20AwdljisAN1kqwu5SjPBnZ5k= github.com/olebeck/gophertunnel v1.24.8 h1:jdqBOABDAE1yISqzm9IxIrI+/lJApLBjTieynXUSalw= github.com/olebeck/gophertunnel v1.24.8/go.mod h1:dMOw79FHxr2azEqiGH20AwdljisAN1kqwu5SjPBnZ5k= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= diff --git a/realms.go b/realms.go index 1e7b36a..af5437d 100644 --- a/realms.go +++ b/realms.go @@ -2,99 +2,17 @@ package main import ( "context" - "encoding/json" "flag" "fmt" - "io" - "net/http" "os" "strings" - "time" "github.com/google/subcommands" + "github.com/sandertv/gophertunnel/minecraft/realms" ) -type Realm struct { - Id int `json:"id"` - Owner string `json:"owner"` - Name string `json:"name"` - Motd string `json:"motd"` - State string `json:"state"` -} - -func realms_get(path string) ([]byte, error) { - req, err := http.NewRequest("GET", fmt.Sprintf("https://pocket.realms.minecraft.net/%s", path), nil) - if err != nil { - return nil, err - } - req.Header.Set("User-Agent", "MCPE/UWP") - req.Header.Set("Client-Version", "1.10.1") - GetXBLToken(context.Background()).SetAuthHeader(req) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - if resp.StatusCode != 200 { - return nil, fmt.Errorf("HTTP %d", resp.StatusCode) - } - data, err := io.ReadAll(resp.Body) - if err != nil { - return nil, err - } - return data, nil -} - -func (realm *Realm) Address() (string, error) { - var body []byte - var err error - ticker := time.NewTicker(time.Second * 3) - defer ticker.Stop() - i := 0 - for range ticker.C { - i++ - body, err = realms_get(fmt.Sprintf("worlds/%d/join", realm.Id)) - if err != nil { - if err.Error() == "HTTP 503" { - fmt.Printf("Waiting for the realm to start... %d\033[K\r", i) - continue - } - return "", err - } - println() - - var data struct { - Address string `json:"address"` - PendingUpdate bool `json:"pendingUpdate"` - } - if err := json.Unmarshal(body, &data); err != nil { - return "", err - } - return data.Address, nil - } - panic("unreachable") -} - -// get_realms lists all realms the user has access to -func get_realms() ([]Realm, error) { - data, err := realms_get("worlds") - if err != nil { - return nil, err - } - - var realms struct { - Servers []Realm `json:"servers"` - } - if err := json.Unmarshal(data, &realms); err != nil { - return nil, err - } - - return realms.Servers, nil -} - -func get_realm(realm_name, id string) (name string, address string, err error) { - realms, err := get_realms() +func get_realm(ctx context.Context, api *realms.Client, realm_name, id string) (name string, address string, err error) { + realms, err := api.Realms(ctx) if err != nil { return "", "", err } @@ -104,7 +22,7 @@ func get_realm(realm_name, id string) (name string, address string, err error) { continue } name = realm.Name - address, err = realm.Address() + address, err = realm.Address(ctx) if err != nil { return "", "", err } @@ -114,21 +32,6 @@ func get_realm(realm_name, id string) (name string, address string, err error) { return "", "", fmt.Errorf("realm not found") } -type TokenCMD struct{} - -func (*TokenCMD) Name() string { return "realms-token" } -func (*TokenCMD) Synopsis() string { return "print xbl3.0 token for realms api" } - -func (c *TokenCMD) SetFlags(f *flag.FlagSet) {} -func (c *TokenCMD) Usage() string { - return c.Name() + ": " + c.Synopsis() + "\n" -} - -func (c *TokenCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus { - fmt.Printf("%s\n", GetXBLToken(ctx).AuthorizationToken.Token) - return 0 -} - type RealmListCMD struct{} func (*RealmListCMD) Name() string { return "list-realms" } @@ -139,19 +42,19 @@ func (c *RealmListCMD) Usage() string { return c.Name() + ": " + c.Synopsis() + "\n" } -func (c *RealmListCMD) Execute(_ context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus { - realms, err := get_realms() +func (c *RealmListCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus { + api := realms.NewClient(GetTokenSource()) + realms, err := api.Realms(ctx) if err != nil { fmt.Fprintln(os.Stderr, err) return 1 } for _, realm := range realms { - fmt.Printf("Name: %s\tid: %d\n", realm.Name, realm.Id) + fmt.Printf("Name: %s\tid: %d\n", realm.Name, realm.ID) } return 0 } func init() { - register_command(&TokenCMD{}) register_command(&RealmListCMD{}) } diff --git a/utils.go b/utils.go index a34f3fa..cf59271 100644 --- a/utils.go +++ b/utils.go @@ -65,7 +65,7 @@ func server_input(server string) (address, name string, err error) { if len(realm_info) == 3 { id = realm_info[2] } - name, address, err = get_realm(realm_info[1], id) + name, address, err = get_realm(context.Background(), getRealmsApi(), realm_info[1], id) if err != nil { return "", "", err }