bedrocktool/main.go

132 lines
2.8 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"
2022-02-12 22:27:49 +00:00
"encoding/json"
"flag"
"fmt"
2022-02-20 11:39:02 +00:00
"net"
2022-02-12 22:27:49 +00:00
"os"
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"
"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-02-27 10:08:19 +00:00
var G_debug bool
2022-02-12 22:27:49 +00:00
func get_token() oauth2.Token {
var token oauth2.Token
2022-02-27 10:08:19 +00:00
if _, err := os.Stat(TOKEN_FILE); err == nil {
2022-02-12 22:27:49 +00:00
f, err := os.Open(TOKEN_FILE)
if err != nil {
panic(err)
}
defer f.Close()
if err := json.NewDecoder(f).Decode(&token); err != nil {
panic(err)
}
} else {
2022-02-27 10:08:19 +00:00
token, err := auth.RequestLiveToken()
2022-02-12 22:27:49 +00:00
if err != nil {
panic(err)
}
buf, err := json.Marshal(token)
if err != nil {
panic(err)
}
os.WriteFile(TOKEN_FILE, buf, 0666)
}
return token
}
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}
}
pk = pkFunc()
pk.Unmarshal(r)
dir := "<-C"
if strings.HasPrefix(strings.Split(src.String(), ":")[1], "19132") {
dir = "S->"
}
fmt.Printf("P: %s 0x%x, %s\n", dir, pk.ID(), reflect.TypeOf(pk))
switch p := pk.(type) {
case *packet.ResourcePackDataInfo:
fmt.Printf("info %s\n", p.UUID)
}
}
2022-02-27 10:08:19 +00:00
type CMD struct {
Name string
Desc string
Main func([]string) error
}
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)
2022-02-27 10:08:19 +00:00
func register_command(name, desc string, main_func func([]string) error) {
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 input_server() string {
fmt.Printf("Enter Server: ")
reader := bufio.NewReader(os.Stdin)
target, _ := reader.ReadString('\n')
2022-03-05 12:59:11 +00:00
r, _ := regexp.Compile(`[\n\r]`)
2022-02-27 10:08:19 +00:00
target = string(r.ReplaceAll([]byte(target), []byte("")))
return target
}
2022-02-20 11:39:02 +00:00
2022-02-27 10:08:19 +00:00
func main() {
flag.BoolVar(&G_debug, "debug", false, "debug mode")
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-02-27 10:08:19 +00:00
if len(os.Args) < 2 {
fmt.Println("Available commands:")
for name, cmd := range cmds {
fmt.Printf("\t%s\t%s\n", name, cmd.Desc)
2022-02-20 11:39:02 +00:00
}
2022-02-27 10:08:19 +00:00
fmt.Printf("Use '%s <command>' to run a command\n", os.Args[0])
2022-03-05 12:09:59 +00:00
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-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(os.Args[2:]); err != nil {
fmt.Fprintf(os.Stderr, "Error: %s\n", err)
os.Exit(1)
2022-02-12 22:27:49 +00:00
}
}