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"
|
|
|
|
|
2022-02-26 20:14:40 +00:00
|
|
|
var G_src oauth2.TokenSource
|
2022-02-27 10:08:19 +00:00
|
|
|
var G_debug bool
|
2022-02-26 20:14:40 +00:00
|
|
|
|
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-20 12:56:09 +00:00
|
|
|
|
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-26 20:14:40 +00:00
|
|
|
|
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
|
|
|
}
|
|
|
|
}
|