version compat system
This commit is contained in:
@@ -15,6 +15,15 @@ type ConfigIgnorer struct {
|
||||
*proto.Conn
|
||||
}
|
||||
|
||||
func (c *ConfigIgnorer) OnStart() (err error) {
|
||||
c.Register(c.Default)
|
||||
c.RegisterUntilLatest(c.OnKnownPacks)
|
||||
c.RegisterUntilLatest(c.OnFinish)
|
||||
c.RegisterUntilLatest(c.OnPing)
|
||||
c.RegisterUntilLatest(c.OnKeepAlive)
|
||||
return
|
||||
}
|
||||
|
||||
func (c *ConfigIgnorer) Default(event event.Anything) (err error) {
|
||||
slog.Debug("Config ignorer", "packet", fmt.Sprintf("%#v", event))
|
||||
return
|
||||
|
||||
@@ -2,6 +2,7 @@ package client
|
||||
|
||||
import (
|
||||
"net"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
@@ -20,3 +21,20 @@ func LookupMinecraftSRV(host string, port uint16) (hostRet string, portRet uint1
|
||||
portRet = srvs[0].Port
|
||||
return
|
||||
}
|
||||
|
||||
func DoDNS(in string) (out string, err error) { // Bad code should match minecraft
|
||||
// https://mcsrc.dev/1/26.1-pre-1/net/minecraft/client/multiplayer/resolver/ServerAddress#L34
|
||||
host, port, _ := net.SplitHostPort(in)
|
||||
var portN uint16 = 25565
|
||||
if port != "" {
|
||||
var porti int
|
||||
porti, err = strconv.Atoi(port)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
portN = uint16(porti)
|
||||
}
|
||||
host, portN = LookupMinecraftSRV(host, portN)
|
||||
out = net.JoinHostPort(host, strconv.Itoa(int(portN)))
|
||||
return
|
||||
}
|
||||
|
||||
+38
-24
@@ -27,6 +27,12 @@ type LoginClient struct {
|
||||
GivenAccount *v1_21_8.LoginToClientPacketSuccess
|
||||
}
|
||||
|
||||
var (
|
||||
NoTokenErr = errors.New("the account has no token so we cant join online servers")
|
||||
BadPublicKeyTypeErr = errors.New("the public key is not rsa")
|
||||
FailedToLoginErr = errors.New("failed to login")
|
||||
)
|
||||
|
||||
type KickedDuringLoginErr struct {
|
||||
text.Component
|
||||
}
|
||||
@@ -35,7 +41,7 @@ func (k KickedDuringLoginErr) Error() string {
|
||||
return k.String()
|
||||
}
|
||||
|
||||
func (s *LoginClient) Default(event event.Unhandled) (err error) {
|
||||
func (s *LoginClient) OnDefault(event event.Unhandled) (err error) {
|
||||
err = fmt.Errorf("unexpected event: %#v", event)
|
||||
return
|
||||
}
|
||||
@@ -48,25 +54,6 @@ func (s *LoginClient) OnClose(_ event.Close) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (s *LoginClient) OnStart(_ event.Start) (err error) {
|
||||
p, err := MakeHandshakePacket(s.Conn, proto_base.Login)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if s.ServerHost == "" && s.ServerPort == 0 {
|
||||
p.ServerHost = s.ServerHost
|
||||
p.ServerPort = s.ServerPort
|
||||
}
|
||||
|
||||
err = s.Send(p)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
s.SetState(proto_base.Login)
|
||||
err = s.Send(&v1_21_8.LoginToServerPacketLoginStart{Username: s.Account.Name, PlayerUUID: s.Account.Uuid})
|
||||
return
|
||||
}
|
||||
|
||||
func (s *LoginClient) OnCompress(compress *v1_21_8.LoginToClientPacketCompress) (err error) {
|
||||
s.SetCompressionThreshold(compress.Threshold)
|
||||
return
|
||||
@@ -78,7 +65,7 @@ func (s *LoginClient) OnEncrypt(packet *v1_21_8.LoginToClientPacketEncryptionBeg
|
||||
|
||||
if packet.ShouldAuthenticate {
|
||||
if s.Account.Ygg == "" {
|
||||
err = fmt.Errorf("the account has no token so we cant join online servers")
|
||||
err = NoTokenErr
|
||||
return
|
||||
}
|
||||
serverId := crypto.AuthDigest([]byte(packet.ServerId), sharedSecret, packet.PublicKey)
|
||||
@@ -94,7 +81,7 @@ func (s *LoginClient) OnEncrypt(packet *v1_21_8.LoginToClientPacketEncryptionBeg
|
||||
}
|
||||
pub, ok := pubAny.(*rsa.PublicKey)
|
||||
if !ok {
|
||||
err = fmt.Errorf("public key is not rsa")
|
||||
err = BadPublicKeyTypeErr
|
||||
return
|
||||
}
|
||||
verifyTokenEnc, err := rsa.EncryptPKCS1v15(rand.Reader, pub, packet.VerifyToken)
|
||||
@@ -136,13 +123,40 @@ func (s *LoginClient) OnSuccess(success *v1_21_8.LoginToClientPacketSuccess) (er
|
||||
return
|
||||
}
|
||||
|
||||
func (s *LoginClient) OnStart() (err error) {
|
||||
s.Register(s.OnDefault)
|
||||
s.Register(s.OnCycle)
|
||||
s.Register(s.OnClose)
|
||||
s.RegisterUntilLatest(s.OnCompress)
|
||||
s.RegisterUntilLatest(s.OnEncrypt)
|
||||
s.RegisterUntilLatest(s.OnDisconnect)
|
||||
s.RegisterUntilLatest(s.OnSuccess)
|
||||
|
||||
p, err := MakeHandshakePacket(s.Conn, proto_base.Login)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if s.ServerHost == "" && s.ServerPort == 0 {
|
||||
p.ServerHost = s.ServerHost
|
||||
p.ServerPort = s.ServerPort
|
||||
}
|
||||
|
||||
err = s.Send(p)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
s.SetState(proto_base.Login)
|
||||
err = s.Send(&v1_21_8.LoginToServerPacketLoginStart{Username: s.Account.Name, PlayerUUID: s.Account.Uuid})
|
||||
return
|
||||
}
|
||||
|
||||
func Login(c *proto.Conn, account *api.Account) (err error) {
|
||||
err = c.Start(&LoginClient{
|
||||
Conn: c,
|
||||
Account: account,
|
||||
})
|
||||
if err != nil {
|
||||
err = errors.Join(err, errors.New("failed to login"))
|
||||
err = errors.Join(FailedToLoginErr, err)
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -157,7 +171,7 @@ func ConnectAndLogin(connectTo string, account *api.Account) (c *proto.Conn, err
|
||||
Account: account,
|
||||
})
|
||||
if err != nil {
|
||||
err = errors.Join(errors.New("failed to login"), err)
|
||||
err = errors.Join(FailedToLoginErr, err)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
+3
-6
@@ -2,7 +2,6 @@ package client
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/admin-else/strom/event"
|
||||
@@ -19,12 +18,10 @@ type StatusClient struct {
|
||||
PingSendTime, PingReceiveTime time.Time
|
||||
}
|
||||
|
||||
func (s *StatusClient) Default(event any) (err error) {
|
||||
err = fmt.Errorf("unexpected event: %v", event)
|
||||
return
|
||||
}
|
||||
func (s *StatusClient) OnStart() (err error) {
|
||||
s.RegisterUntilLatest(s.OnStatus)
|
||||
s.RegisterUntilLatest(s.OnPong)
|
||||
|
||||
func (s *StatusClient) OnStart(_ event.Start) (err error) {
|
||||
p, err := MakeHandshakePacket(s.Conn, proto_base.Status)
|
||||
if err != nil {
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user