Refactor: Rename Connection to Conn, add proxy example, and enhance login client functionality

This commit is contained in:
adman
2025-11-12 01:19:45 +01:00
parent f91424236b
commit 275f28a7c8
7 changed files with 203 additions and 39 deletions
+24 -6
View File
@@ -4,6 +4,7 @@ import (
"bytes" "bytes"
"compress/zlib" "compress/zlib"
"errors" "errors"
"fmt"
"io" "io"
"net" "net"
@@ -42,7 +43,7 @@ func (a Actor) ReceiveDirection() queser.Direction {
} }
} }
type Connection struct { type Conn struct {
net.Conn net.Conn
R io.Reader R io.Reader
W io.Writer W io.Writer
@@ -52,7 +53,7 @@ type Connection struct {
Version string 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) packetIdentifier := generated.TypeToPacketIdentifier(c.Version, c.Actor.SendDirection(), c.State, packet)
if packetIdentifier == "" { if packetIdentifier == "" {
err = BadPacketTypeError err = BadPacketTypeError
@@ -97,7 +98,7 @@ func (c *Connection) Send(packet any) (err error) {
return return
} }
func (c *Connection) Receive() (packet any, err error) { func (c *Conn) Receive() (packet any, err error) {
var rawPacketLen queser.VarInt var rawPacketLen queser.VarInt
rawPacketLen, err = rawPacketLen.Decode(c.R) rawPacketLen, err = rawPacketLen.Decode(c.R)
if err != nil { if err != nil {
@@ -132,12 +133,17 @@ func (c *Connection) Receive() (packet any, err error) {
} else { } else {
packetBytes = rawPacketBytes 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 return
} }
func ClientConnect(addr string) (ret *Connection, err error) { func Connect(addr string) (ret *Conn, err error) {
ret = &Connection{} ret = &Conn{}
ret.Version = "1.21.8" ret.Version = "1.21.8"
ret.State = queser.Handshaking ret.State = queser.Handshaking
ret.CompressionThreshold = -1 ret.CompressionThreshold = -1
@@ -150,3 +156,15 @@ func ClientConnect(addr string) (ret *Connection, err error) {
ret.W = ret.Conn ret.W = ret.Conn
return 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
}
+1 -1
View File
@@ -43,7 +43,7 @@ func FireEvent(inst HandlerInst, event any, handlers map[reflect.Type]reflect.Va
return return
} }
func (c *Connection) Start(inst HandlerInst) (err error) { func (c *Conn) Start(inst HandlerInst) (err error) {
handlers := FindHandlers(inst) handlers := FindHandlers(inst)
err = FireEvent(inst, OnStart{}, handlers) err = FireEvent(inst, OnStart{}, handlers)
for err == nil { for err == nil {
+45
View File
@@ -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)
}
}
+119
View File
@@ -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)
}
}
-28
View File
@@ -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)
}
+13 -3
View File
@@ -29,8 +29,10 @@ type Account struct {
Token string Token string
} }
type LoginClient struct { type LoginClient struct {
*strom.Connection *strom.Conn
Account Account Account Account
GivenAccount v1_21_8.LoginToClientPacketSuccess
} }
func (s *LoginClient) Default(event any) (err error) { func (s *LoginClient) Default(event any) (err error) {
@@ -124,7 +126,7 @@ func JoinServerAPI(a Account, serverId string) (err error) {
if err != nil { if err != nil {
return 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
} }
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) { 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{}) err = s.Send(v1_21_8.LoginToServerPacketLoginAcknowledged{})
if err != nil { if err != nil {
return return
} }
s.State = queser.Configuration s.State = queser.Configuration
err = strom.HandlerDone
return return
} }
func Login(c *strom.Conn, account Account) (err error) {
return c.Start(&LoginClient{
Conn: c,
Account: account,
})
}
+1 -1
View File
@@ -12,7 +12,7 @@ import (
) )
type StatusClient struct { type StatusClient struct {
*strom.Connection *strom.Conn
Status string Status string
} }