From 275f28a7c8fa5cb755a998f554fe9a04786be260 Mon Sep 17 00:00:00 2001 From: adman Date: Wed, 12 Nov 2025 01:19:45 +0100 Subject: [PATCH] Refactor: Rename `Connection` to `Conn`, add proxy example, and enhance login client functionality --- connection.go | 30 +++++++-- event_bus.go | 2 +- examples/client/main.go | 45 +++++++++++++ examples/proxy/main.go | 119 +++++++++++++++++++++++++++++++++ examples/status/main.go | 28 -------- modules/loginclient/login.go | 16 ++++- modules/statusclient/status.go | 2 +- 7 files changed, 203 insertions(+), 39 deletions(-) create mode 100644 examples/client/main.go create mode 100644 examples/proxy/main.go delete mode 100644 examples/status/main.go diff --git a/connection.go b/connection.go index 4911b16..b952eef 100644 --- a/connection.go +++ b/connection.go @@ -4,6 +4,7 @@ import ( "bytes" "compress/zlib" "errors" + "fmt" "io" "net" @@ -42,7 +43,7 @@ func (a Actor) ReceiveDirection() queser.Direction { } } -type Connection struct { +type Conn struct { net.Conn R io.Reader W io.Writer @@ -52,7 +53,7 @@ type Connection struct { Version string } -func (c *Connection) Send(packet any) (err error) { +func (c *Conn) Send(packet any) (err error) { packetIdentifier := generated.TypeToPacketIdentifier(c.Version, c.Actor.SendDirection(), c.State, packet) if packetIdentifier == "" { err = BadPacketTypeError @@ -97,7 +98,7 @@ func (c *Connection) Send(packet any) (err error) { return } -func (c *Connection) Receive() (packet any, err error) { +func (c *Conn) Receive() (packet any, err error) { var rawPacketLen queser.VarInt rawPacketLen, err = rawPacketLen.Decode(c.R) if err != nil { @@ -132,12 +133,17 @@ func (c *Connection) Receive() (packet any, err error) { } else { packetBytes = rawPacketBytes } - packet, err = generated.DecodePacket(c.Version, c.Actor.ReceiveDirection(), c.State, bytes.NewReader(packetBytes)) + packetBuff := bytes.NewBuffer(packetBytes) + packet, err = generated.DecodePacket(c.Version, c.Actor.ReceiveDirection(), c.State, packetBuff) + if err != nil { + fmt.Printf("%#v\n", packetBytes) + return + } return } -func ClientConnect(addr string) (ret *Connection, err error) { - ret = &Connection{} +func Connect(addr string) (ret *Conn, err error) { + ret = &Conn{} ret.Version = "1.21.8" ret.State = queser.Handshaking ret.CompressionThreshold = -1 @@ -150,3 +156,15 @@ func ClientConnect(addr string) (ret *Connection, err error) { ret.W = ret.Conn return } + +func Servee(c net.Conn) (ret *Conn) { + ret = &Conn{} + ret.Version = "1.21.8" + ret.State = queser.Handshaking + ret.CompressionThreshold = -1 + ret.Actor = Server + ret.Conn = c + ret.R = c + ret.W = c + return +} diff --git a/event_bus.go b/event_bus.go index 0ebdc3c..c3b1f23 100644 --- a/event_bus.go +++ b/event_bus.go @@ -43,7 +43,7 @@ func FireEvent(inst HandlerInst, event any, handlers map[reflect.Type]reflect.Va return } -func (c *Connection) Start(inst HandlerInst) (err error) { +func (c *Conn) Start(inst HandlerInst) (err error) { handlers := FindHandlers(inst) err = FireEvent(inst, OnStart{}, handlers) for err == nil { diff --git a/examples/client/main.go b/examples/client/main.go new file mode 100644 index 0000000..71be96a --- /dev/null +++ b/examples/client/main.go @@ -0,0 +1,45 @@ +package main + +import ( + "errors" + "fmt" + "strom" + "strom/modules/loginclient" + + "github.com/google/uuid" +) + +var altAccount = loginclient.Account{ + Username: "449stan_Ytb", + Uuid: uuid.MustParse("caec076c80c34637a31b44874ffa009d"), + Token: "eyJraWQiOiIwNDkxODEiLCJhbGciOiJSUzI1NiJ9.eyJ4dWlkIjoiMjUzNTQwOTA1OTUxMzgxOSIsImFnZyI6IkFkdWx0Iiwic3ViIjoiMjY4OGQ0ZTktZmZiZi00N2FkLTlkYWYtZDU3ZWY5Yzg5YWE0IiwiYXV0aCI6IlhCT1giLCJucyI6ImRlZmF1bHQiLCJyb2xlcyI6W10sImlzcyI6ImF1dGhlbnRpY2F0aW9uIiwiZmxhZ3MiOlsib3JkZXJzXzIwMjIiLCJtdWx0aXBsYXllciIsInR3b2ZhY3RvcmF1dGgiLCJtc2FtaWdyYXRpb25fc3RhZ2U0Il0sInByb2ZpbGVzIjp7Im1jIjoiY2FlYzA3NmMtODBjMy00NjM3LWEzMWItNDQ4NzRmZmEwMDlkIn0sInBsYXRmb3JtIjoiUENfTEFVTkNIRVIiLCJwZmQiOlt7InR5cGUiOiJtYyIsImlkIjoiY2FlYzA3NmMtODBjMy00NjM3LWEzMWItNDQ4NzRmZmEwMDlkIiwibmFtZSI6IjQ0OXN0YW5fWXRiIn1dLCJuYmYiOjE3NjI4NDc4OTgsImV4cCI6MTc2MjkzNDI5OCwiaWF0IjoxNzYyODQ3ODk4LCJhaWQiOiJjMzZhOWZiNi00ZjJhLTQxZmYtOTBiZC1hZTdjYzkyMDMxZWIifQ.bcyq-FrP4XXESyKBr4TFstsjw8tgjY5cz_p7ansohPV_VfbKqBeLV-E1XYySwKj6BRuc0dAuW6nGdwE9qlv94tRtapVb1q1W__-GguVWOD16TaEi6dmzDyw8--lpI6eL657lPkzFaVeNrSHNPCPn0ltGcZzlOv1XYJwZM8D1yj57x7aXaOMmJqLY8R5zCgfWp_TnGPjJrbd_gV-N5wP9z_vL6jQKj5bvaTkYqItLq5tTFWbX1wAoeSV47D3mtZfx2N4rGgeUSQ1bYanUZ_eMuH6hSwrwxzqn_-HwN2PA7j0VFVUOu54FRqJbw8D4H6tAf3SY1xIjFC5GUu22IbVP3Q", +} + +type Client struct { + *strom.Conn +} + +func (c *Client) Default(event any) (err error) { + fmt.Printf("%T%v\n", event, event) + return +} + +func (c *Client) OnStart(_ strom.OnStart) (err error) { + err = loginclient.Login(c.Conn, altAccount) + if errors.Is(err, strom.HandlerDone) { + return nil + } + return +} + +func main() { + c, err := strom.Connect("127.0.0.1:25566") + if err != nil { + panic(err) + } + defer c.Close() + err = c.Start(&Client{c}) + if err != nil { + panic(err) + } +} diff --git a/examples/proxy/main.go b/examples/proxy/main.go new file mode 100644 index 0000000..f8f6995 --- /dev/null +++ b/examples/proxy/main.go @@ -0,0 +1,119 @@ +package main + +import ( + "fmt" + "log" + "net" + "strom" + + "github.com/admin-else/queser" + "github.com/admin-else/queser/generated/v1_21_8" +) + +type ProxyClient struct { + *strom.Conn + Proxy *Proxy +} + +func (p *ProxyClient) Default(event any) (err error) { + fmt.Printf("1 %T%v\n", event, event) + err = p.Proxy.Send(event) + return +} + +func (p *ProxyClient) Compress(packet v1_21_8.LoginToClientPacketCompress) (err error) { + err = p.Proxy.Send(packet) + if err != nil { + return + } + p.CompressionThreshold = int32(packet.Threshold) + p.Proxy.CompressionThreshold = int32(packet.Threshold) + return +} + +func (p *ProxyClient) OnStart(_ strom.OnStart) (err error) { + return +} + +type Proxy struct { + *strom.Conn + ProxyClient *ProxyClient +} + +func (p *Proxy) Default(event any) (err error) { + fmt.Printf("2 %T%v\n", event, event) + err = p.ProxyClient.Send(event) + return +} + +func (p *Proxy) OnHandshake(packet v1_21_8.HandshakingToServerPacketSetProtocol) (err error) { + err = p.ProxyClient.Send(packet) + if err != nil { + return + } + p.State = queser.State(packet.NextState) + p.ProxyClient.State = queser.State(packet.NextState) + return +} + +func (p *Proxy) OnLoginAcknowledged(packet v1_21_8.LoginToServerPacketLoginAcknowledged) (err error) { + err = p.ProxyClient.Send(packet) + if err != nil { + return + } + p.State = queser.Configuration + p.ProxyClient.State = queser.Configuration + return +} + +func (p *Proxy) OnConfigFinish(packet v1_21_8.ConfigurationToServerPacketFinishConfiguration) (err error) { + err = p.ProxyClient.Send(packet) + if err != nil { + return + } + p.State = queser.Play + p.ProxyClient.State = queser.Play + return +} + +func (p *Proxy) OnStart(_ strom.OnStart) (err error) { + return +} + +func handleConn(conn net.Conn) { + defer conn.Close() + s := strom.Servee(conn) + p := &Proxy{Conn: s} + c, err := strom.Connect("127.0.0.1:25566") + if err != nil { + return + } + p.ProxyClient = &ProxyClient{Conn: c, Proxy: p} + errChan := make(chan error) + go func() { + errChan <- c.Start(p.ProxyClient) + }() + go func() { + errChan <- s.Start(p) + }() + err = <-errChan + if err != nil { + log.Println(err) + } + return +} + +func main() { + l, err := net.Listen("tcp", ":25565") + if err != nil { + panic(err) + } + for { + var c net.Conn + c, err = l.Accept() + if err != nil { + panic(err) + } + go handleConn(c) + } +} diff --git a/examples/status/main.go b/examples/status/main.go deleted file mode 100644 index 3a625b4..0000000 --- a/examples/status/main.go +++ /dev/null @@ -1,28 +0,0 @@ -package main - -import ( - "strom" - "strom/modules/loginclient" - - "github.com/google/uuid" -) - -func must(err error) { - if err != nil { - panic(err) - } -} - -func main() { - c, err := strom.ClientConnect("127.0.0.1:25566") - must(err) - err = c.Start(&loginclient.LoginClient{ - Account: loginclient.Account{ - Username: "449stan_Ytb", - Uuid: uuid.MustParse("caec076c80c34637a31b44874ffa009d"), - Token: "eyJraWQiOiIwNDkxODEiLCJhbGciOiJSUzI1NiJ9.eyJ4dWlkIjoiMjUzNTQwOTA1OTUxMzgxOSIsImFnZyI6IkFkdWx0Iiwic3ViIjoiMjY4OGQ0ZTktZmZiZi00N2FkLTlkYWYtZDU3ZWY5Yzg5YWE0IiwiYXV0aCI6IlhCT1giLCJucyI6ImRlZmF1bHQiLCJyb2xlcyI6W10sImlzcyI6ImF1dGhlbnRpY2F0aW9uIiwiZmxhZ3MiOlsib3JkZXJzXzIwMjIiLCJtdWx0aXBsYXllciIsInR3b2ZhY3RvcmF1dGgiLCJtc2FtaWdyYXRpb25fc3RhZ2U0Il0sInByb2ZpbGVzIjp7Im1jIjoiY2FlYzA3NmMtODBjMy00NjM3LWEzMWItNDQ4NzRmZmEwMDlkIn0sInBsYXRmb3JtIjoiUENfTEFVTkNIRVIiLCJwZmQiOlt7InR5cGUiOiJtYyIsImlkIjoiY2FlYzA3NmMtODBjMy00NjM3LWEzMWItNDQ4NzRmZmEwMDlkIiwibmFtZSI6IjQ0OXN0YW5fWXRiIn1dLCJuYmYiOjE3NjI4NDc4OTgsImV4cCI6MTc2MjkzNDI5OCwiaWF0IjoxNzYyODQ3ODk4LCJhaWQiOiJjMzZhOWZiNi00ZjJhLTQxZmYtOTBiZC1hZTdjYzkyMDMxZWIifQ.bcyq-FrP4XXESyKBr4TFstsjw8tgjY5cz_p7ansohPV_VfbKqBeLV-E1XYySwKj6BRuc0dAuW6nGdwE9qlv94tRtapVb1q1W__-GguVWOD16TaEi6dmzDyw8--lpI6eL657lPkzFaVeNrSHNPCPn0ltGcZzlOv1XYJwZM8D1yj57x7aXaOMmJqLY8R5zCgfWp_TnGPjJrbd_gV-N5wP9z_vL6jQKj5bvaTkYqItLq5tTFWbX1wAoeSV47D3mtZfx2N4rGgeUSQ1bYanUZ_eMuH6hSwrwxzqn_-HwN2PA7j0VFVUOu54FRqJbw8D4H6tAf3SY1xIjFC5GUu22IbVP3Q", - }, - Connection: c, - }) - must(err) -} diff --git a/modules/loginclient/login.go b/modules/loginclient/login.go index a83bca4..b814880 100644 --- a/modules/loginclient/login.go +++ b/modules/loginclient/login.go @@ -29,8 +29,10 @@ type Account struct { Token string } type LoginClient struct { - *strom.Connection + *strom.Conn Account Account + + GivenAccount v1_21_8.LoginToClientPacketSuccess } func (s *LoginClient) Default(event any) (err error) { @@ -124,7 +126,7 @@ func JoinServerAPI(a Account, serverId string) (err error) { if err != nil { return } - err = fmt.Errorf("bad status code %v body %v", resp.StatusCode, string(body)) + err = fmt.Errorf("bad client code %v body %v", resp.StatusCode, string(body)) return } return @@ -187,11 +189,19 @@ func (s *LoginClient) OnEncrypt(packet v1_21_8.LoginToClientPacketEncryptionBegi } func (s *LoginClient) OnSuccess(success v1_21_8.LoginToClientPacketSuccess) (err error) { - fmt.Println("login success", success) + s.GivenAccount = success err = s.Send(v1_21_8.LoginToServerPacketLoginAcknowledged{}) if err != nil { return } s.State = queser.Configuration + err = strom.HandlerDone return } + +func Login(c *strom.Conn, account Account) (err error) { + return c.Start(&LoginClient{ + Conn: c, + Account: account, + }) +} diff --git a/modules/statusclient/status.go b/modules/statusclient/status.go index 454477e..2fdbf9d 100644 --- a/modules/statusclient/status.go +++ b/modules/statusclient/status.go @@ -12,7 +12,7 @@ import ( ) type StatusClient struct { - *strom.Connection + *strom.Conn Status string }