diff --git a/client/client.go b/client/client.go index 56f0b90..b0b7e19 100644 --- a/client/client.go +++ b/client/client.go @@ -8,6 +8,7 @@ import ( ) // Connect connects to the given address note that it does not resolve the SRV records it's just a raw net.Dial +// You must close the connection when you're done with it func Connect(addr string) (ret *proto.Conn, err error) { s, err := Status(addr) if err != nil { @@ -23,6 +24,7 @@ func Connect(addr string) (ret *proto.Conn, err error) { // ConnectVersionLess connects to the given address without setting the version you should set it // when using this function. +// You must close the connection when you're done with it func ConnectVersionLess(addr string) (ret *proto.Conn, err error) { ret = &proto.Conn{} ret.SetState(proto_base.Handshaking) diff --git a/client/status.go b/client/status.go index d2a9f34..282a3a2 100644 --- a/client/status.go +++ b/client/status.go @@ -53,6 +53,7 @@ func StatusRaw(addr string) (s *StatusClient, err error) { if err != nil { return } + defer c.Close() err = c.SetVersion("1.21.8") if err != nil { return @@ -61,7 +62,6 @@ func StatusRaw(addr string) (s *StatusClient, err error) { Conn: c, } err = s.Start(s) - defer c.Close() return } diff --git a/tools/cli/main.go b/tools/cli/main.go new file mode 100644 index 0000000..c5cd045 --- /dev/null +++ b/tools/cli/main.go @@ -0,0 +1,52 @@ +package main + +import ( + "errors" + "fmt" + "log/slog" + "maps" + "os" + "slices" + + "github.com/admin-else/strom/tools/cli/offline_uuid" + "github.com/admin-else/strom/tools/cli/print_nbt" +) + +var ExpectedASubcommandErr = errors.New("expected a subcommand") +var UnknownSubcommandErr = errors.New("unknown subcommand") + +var subcommands = map[string]func(args []string) error{ + "offline-uuid": offline_uuid.Run, + "print-nbt": print_nbt.Run, +} + +func Help(args []string) (err error) { + fmt.Println("Available subcommands", slices.Collect(maps.Keys(subcommands))) + return +} + +func mainE() (err error) { + subcommands["help"] = Help // this is here because if it isn't tools/cli/main.go:17:5: initialization cycle for subcommands + // tools/cli/main.go:17:5: subcommands refers to Help + // tools/cli/main.go:22:6: Help refers to subcommands + + if len(os.Args) < 2 { + err = ExpectedASubcommandErr + return + } + + f, ok := subcommands[os.Args[1]] + if !ok { + err = UnknownSubcommandErr + return + } + err = f(os.Args[2:]) + return +} + +func main() { + err := mainE() + if err != nil { + slog.Error("exiting", "err", err) + } +} diff --git a/tools/cli/offline_uuid/offline_uuid.go b/tools/cli/offline_uuid/offline_uuid.go new file mode 100644 index 0000000..8a01a38 --- /dev/null +++ b/tools/cli/offline_uuid/offline_uuid.go @@ -0,0 +1,20 @@ +package offline_uuid + +import ( + "flag" + "fmt" + + "github.com/admin-else/strom/crypto" +) + +var cmd = flag.NewFlagSet("offline-uuid", flag.ContinueOnError) +var nameFlag = cmd.String("name", "Notch", "name of the player") + +func Run(args []string) (err error) { + err = cmd.Parse(args) + if err != nil { + return + } + fmt.Println(crypto.FromOfflinePlayer(*nameFlag)) + return +} diff --git a/tools/print_nbt/main.go b/tools/cli/print_nbt/main.go similarity index 62% rename from tools/print_nbt/main.go rename to tools/cli/print_nbt/main.go index 971cfde..039bd41 100644 --- a/tools/print_nbt/main.go +++ b/tools/cli/print_nbt/main.go @@ -1,4 +1,4 @@ -package main +package print_nbt import ( "encoding/json" @@ -9,11 +9,15 @@ import ( ) var ( - FileFlag = flag.String("file", "", "The NBT file to print") + cmd = flag.NewFlagSet("print-nbt", flag.ContinueOnError) + FileFlag = cmd.String("file", "", "The NBT file to print") ) -func mainE() (err error) { - flag.Parse() +func Run(args []string) (err error) { + err = cmd.Parse(args) + if err != nil { + return + } f, err := os.Open(*FileFlag) if err != nil { return @@ -30,10 +34,3 @@ func mainE() (err error) { _, err = os.Stdout.Write(b) return } - -func main() { - err := mainE() - if err != nil { - panic(err) - } -} diff --git a/tools/status/main.go b/tools/cli/status/main.go similarity index 64% rename from tools/status/main.go rename to tools/cli/status/main.go index 4d15a07..c4506a9 100644 --- a/tools/status/main.go +++ b/tools/cli/status/main.go @@ -1,4 +1,4 @@ -package main +package status import ( "flag" @@ -7,23 +7,26 @@ import ( "github.com/admin-else/strom/client" ) +var cmd = flag.NewFlagSet("status", flag.ContinueOnError) var addrFlag = flag.String("addr", "localhost:25565", "address to connect to") var srvFlag = flag.Bool("srv", false, "use SRV records to resolve the address") -func main() { - flag.Parse() - var err error +func Run(args []string) (err error) { + err = cmd.Parse(args) + if err != nil { + return + } if *srvFlag { *addrFlag, err = client.DoDNS(*addrFlag) if err != nil { - panic(err) + return } } status, err := client.StatusRaw(*addrFlag) if err != nil { - panic(err) + return } - fmt.Println(status.Status) - fmt.Printf("%v ping", status.PingReceiveTime.Sub(status.PingSendTime)) + fmt.Println(status) + return }