bedrocktool/skins-proxy.go

101 lines
2.2 KiB
Go
Raw Normal View History

2022-03-18 18:22:31 +00:00
package main
import (
"context"
2022-03-18 18:36:44 +00:00
"errors"
2022-03-18 18:22:31 +00:00
"flag"
"fmt"
"os"
"github.com/google/subcommands"
2022-03-18 18:22:31 +00:00
"github.com/sandertv/gophertunnel/minecraft"
)
type SkinProxyCMD struct {
server_address string
filter string
2022-03-18 18:22:31 +00:00
}
func (*SkinProxyCMD) Name() string { return "skins-proxy" }
func (*SkinProxyCMD) Synopsis() string { return "download skins from players on a server with proxy" }
2022-07-29 16:12:06 +00:00
func (c *SkinProxyCMD) SetFlags(f *flag.FlagSet) {
f.StringVar(&c.server_address, "address", "", "remote server address")
f.StringVar(&c.filter, "filter", "", "player name filter prefix")
}
func (c *SkinProxyCMD) Usage() string {
2022-08-15 00:29:01 +00:00
return c.Name() + ": " + c.Synopsis() + "\n" + SERVER_ADDRESS_HELP
}
2022-03-18 18:22:31 +00:00
func (c *SkinProxyCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus {
address, hostname, err := server_input(c.server_address)
2022-03-18 18:22:31 +00:00
if err != nil {
fmt.Fprintln(os.Stderr, err)
return 1
2022-03-18 18:22:31 +00:00
}
2022-08-13 14:30:46 +00:00
listener, clientConn, serverConn, err := create_proxy(ctx, address)
2022-03-18 18:22:31 +00:00
if err != nil {
fmt.Fprintln(os.Stderr, err)
return 1
2022-03-18 18:22:31 +00:00
}
2022-08-13 14:30:46 +00:00
defer listener.Close()
2022-03-18 18:22:31 +00:00
2022-04-16 11:02:32 +00:00
out_path := fmt.Sprintf("skins/%s", hostname)
2022-03-18 18:22:31 +00:00
println("Connected")
println("Press ctrl+c to exit")
os.MkdirAll(out_path, 0755)
2022-03-18 18:36:44 +00:00
errs := make(chan error, 2)
2022-03-18 18:22:31 +00:00
go func() { // server -> client
2022-03-18 18:36:44 +00:00
defer serverConn.Close()
2022-08-13 14:30:46 +00:00
defer listener.Disconnect(clientConn, "connection lost")
2022-03-18 18:22:31 +00:00
for {
pk, err := serverConn.ReadPacket()
if err != nil {
2022-03-18 18:36:44 +00:00
if disconnect, ok := errors.Unwrap(err).(minecraft.DisconnectError); ok {
2022-08-13 14:30:46 +00:00
_ = listener.Disconnect(clientConn, disconnect.Error())
2022-03-18 18:36:44 +00:00
}
2022-03-18 18:22:31 +00:00
return
}
2022-08-13 14:30:46 +00:00
process_packet_skins(clientConn, out_path, pk)
2022-03-18 18:22:31 +00:00
2022-08-13 14:30:46 +00:00
if err = clientConn.WritePacket(pk); err != nil {
2022-03-18 18:36:44 +00:00
return
}
2022-03-18 18:22:31 +00:00
}
}()
go func() { // client -> server
for {
2022-08-13 14:30:46 +00:00
pk, err := clientConn.ReadPacket()
2022-03-18 18:22:31 +00:00
if err != nil {
return
}
2022-03-18 18:36:44 +00:00
if err := serverConn.WritePacket(pk); err != nil {
if disconnect, ok := errors.Unwrap(err).(minecraft.DisconnectError); ok {
2022-08-13 14:30:46 +00:00
_ = listener.Disconnect(clientConn, disconnect.Error())
2022-03-18 18:36:44 +00:00
}
return
}
2022-03-18 18:22:31 +00:00
}
}()
for {
select {
case err := <-errs:
fmt.Fprintln(os.Stderr, err)
return 1
2022-03-18 18:22:31 +00:00
case <-ctx.Done():
return 0
2022-03-18 18:22:31 +00:00
}
}
}
func init() {
register_command(&SkinProxyCMD{})
}