Refactor: Rename Connection to Conn, add proxy example, and enhance login client functionality
This commit is contained in:
+24
-6
@@ -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
@@ -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 {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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)
|
|
||||||
}
|
|
||||||
@@ -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,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type StatusClient struct {
|
type StatusClient struct {
|
||||||
*strom.Connection
|
*strom.Conn
|
||||||
Status string
|
Status string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user