bedrocktool/main.go

176 lines
3.7 KiB
Go
Raw Normal View History

2022-02-12 22:27:49 +00:00
package main
import (
"bufio"
2022-02-20 11:39:02 +00:00
"bytes"
"context"
2022-02-12 22:27:49 +00:00
"flag"
"fmt"
2022-02-20 11:39:02 +00:00
"net"
2022-02-12 22:27:49 +00:00
"os"
"os/signal"
2022-02-20 11:39:02 +00:00
"reflect"
2022-02-27 10:08:19 +00:00
"regexp"
2022-02-12 22:27:49 +00:00
"strings"
"syscall"
2022-02-12 22:27:49 +00:00
"github.com/sandertv/gophertunnel/minecraft/auth"
2022-02-20 11:39:02 +00:00
"github.com/sandertv/gophertunnel/minecraft/protocol"
"github.com/sandertv/gophertunnel/minecraft/protocol/packet"
2022-02-12 22:27:49 +00:00
"golang.org/x/oauth2"
)
const TOKEN_FILE = "token.json"
var G_src oauth2.TokenSource
2022-04-16 11:02:32 +00:00
var G_xbl_token *auth.XBLToken
2022-02-27 10:08:19 +00:00
var G_debug bool
var G_help bool
var G_exit func() = func() { os.Exit(0) }
2022-02-20 11:39:02 +00:00
var pool = packet.NewPool()
func PacketLogger(header packet.Header, payload []byte, src, dst net.Addr) {
var pk packet.Packet
buf := bytes.NewBuffer(payload)
r := protocol.NewReader(buf, 0)
pkFunc, ok := pool[header.PacketID]
if !ok {
pk = &packet.Unknown{PacketID: header.PacketID}
} else {
pk = pkFunc()
2022-02-20 11:39:02 +00:00
}
pk.Unmarshal(r)
dir := "<-C"
if strings.HasPrefix(strings.Split(src.String(), ":")[1], "19132") {
dir = "S->"
}
2022-07-30 00:06:04 +00:00
switch pk.(type) {
case *packet.UpdateBlock:
return
case *packet.MoveActorAbsolute:
return
case *packet.SetActorMotion:
return
case *packet.SetTime:
return
case *packet.RemoveActor:
return
case *packet.AddActor:
return
case *packet.UpdateAttributes:
return
case *packet.Interact:
return
case *packet.LevelEvent:
return
case *packet.SetActorData:
return
case *packet.MoveActorDelta:
return
case *packet.MovePlayer:
return
case *packet.BlockActorData:
return
2022-07-29 16:12:06 +00:00
case *packet.ResourcePacksInfo:
2022-07-30 00:03:09 +00:00
/*
for _, pack := range pk.TexturePacks {
fmt.Printf("%s %s\n", pack.ContentIdentity, pack.ContentKey)
}
fmt.Printf("writing keys file")
var keys map[string]string = make(map[string]string)
for _, pack := range pk.TexturePacks {
keys[pack.ContentIdentity] = pack.ContentKey
}
dump_keys(keys)
*/
2022-07-29 16:12:06 +00:00
return
2022-02-20 11:39:02 +00:00
}
fmt.Printf("P: %s 0x%x, %s\n", dir, pk.ID(), reflect.TypeOf(pk))
2022-02-20 11:39:02 +00:00
}
2022-02-27 10:08:19 +00:00
type CMD struct {
Name string
Desc string
Main func(context.Context, []string) error
2022-02-27 10:08:19 +00:00
}
2022-02-12 22:27:49 +00:00
2022-02-27 10:08:19 +00:00
var cmds map[string]CMD = make(map[string]CMD)
func register_command(name, desc string, main_func func(context.Context, []string) error) {
2022-02-27 10:08:19 +00:00
cmds[name] = CMD{
Name: name,
Desc: desc,
Main: main_func,
}
}
2022-02-12 22:27:49 +00:00
2022-02-27 10:08:19 +00:00
func main() {
flag.BoolVar(&G_debug, "debug", false, "debug mode")
flag.BoolVar(&G_help, "help", false, "show help")
ctx, cancel := context.WithCancel(context.Background())
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
go func() {
<-sigs
fmt.Printf("\nExiting\n")
cancel()
G_exit()
}()
2022-02-20 11:39:02 +00:00
2022-02-12 22:27:49 +00:00
// authenticate
token := get_token()
2022-02-27 10:08:19 +00:00
G_src = auth.RefreshTokenSource(&token)
2022-04-16 11:02:32 +00:00
{
_token, err := G_src.Token()
if err != nil {
panic(err)
}
G_xbl_token, err = auth.RequestXBLToken(ctx, _token, "https://pocket.realms.minecraft.net/")
if err != nil {
panic(err)
}
}
2022-02-27 10:08:19 +00:00
if len(os.Args) < 2 {
select {
case <-ctx.Done():
return
default:
fmt.Println("Available commands:")
for name, cmd := range cmds {
fmt.Printf("\t%s\t%s\n", name, cmd.Desc)
}
fmt.Printf("Use '%s <command>' to run a command\n", os.Args[0])
fmt.Printf("Input Command: ")
reader := bufio.NewReader(os.Stdin)
target, _ := reader.ReadString('\n')
r, _ := regexp.Compile(`[\n\r]`)
target = string(r.ReplaceAll([]byte(target), []byte("")))
os.Args = append(os.Args, target)
2022-02-20 11:39:02 +00:00
}
2022-02-12 22:27:49 +00:00
}
2022-02-27 10:08:19 +00:00
cmd := cmds[os.Args[1]]
if cmd.Main == nil {
fmt.Fprintf(os.Stderr, "Unknown command: %s\n", os.Args[1])
os.Exit(1)
}
if err := cmd.Main(ctx, os.Args[2:]); err != nil {
2022-02-27 10:08:19 +00:00
fmt.Fprintf(os.Stderr, "Error: %s\n", err)
os.Exit(1)
2022-02-12 22:27:49 +00:00
}
}
2022-07-29 16:12:06 +00:00
func token_main(ctx context.Context, args []string) error {
fmt.Printf("%s\n", G_xbl_token.AuthorizationToken.Token)
return nil
}
func init() {
register_command("realms-token", "get xbl3.0 token for pocket.realms.minecraft.net", token_main)
}