Add server infrastructure with login, status, and kick handlers

This commit is contained in:
adman
2026-02-24 23:28:25 +01:00
parent bd83b9689e
commit 29b1b92113
7 changed files with 460 additions and 0 deletions
+111
View File
@@ -0,0 +1,111 @@
package main
import (
"encoding/json"
"errors"
"fmt"
"log/slog"
"github.com/admin-else/strom/api"
"github.com/admin-else/strom/client"
"github.com/admin-else/strom/client/modules"
"github.com/admin-else/strom/data"
"github.com/admin-else/strom/event"
"github.com/admin-else/strom/proto"
"github.com/admin-else/strom/proto_base"
"github.com/admin-else/strom/proto_generated/v1_21_8"
"github.com/admin-else/strom/server"
"github.com/admin-else/strom/text"
)
func wontFail[T any](v T, err error) T {
if err != nil {
panic(err)
}
return v
}
var (
CompatibleProtocolVersion = wontFail(data.LookUpVersionByName("1.21.8")).Version
FinishedConfigErr = errors.New("finished configuration")
)
var Status = wontFail(json.Marshal(server.StatusResponse{
Version: server.StatusResponseVersion{
Name: nil,
Protocol: CompatibleProtocolVersion,
},
Description: text.Pretty("Registry data hunter"),
}))
type Proxy struct {
Client, Servee *proto.Conn
}
func (p *Proxy) OnAnything(e event.Anything) (err error) {
packet, ok := e.Val.(proto_base.EncodeDecodeAble)
if !ok {
return
}
packetInfo, ok := proto.LookupPacketInfoByType(packet)
if !ok {
return
}
slog.Debug("packet", "type", packetInfo.Name, "packet", fmt.Sprintf("%#v", packet))
switch packetInfo.Direction {
case proto_base.ToServer:
err = p.Client.Send(packet)
case proto_base.ToClient:
err = p.Servee.Send(packet)
}
return
}
func (p *Proxy) OnFinishConfiguration(_ *v1_21_8.ConfigurationToServerPacketFinishConfiguration) (err error) {
err = FinishedConfigErr
return
}
func (p *Proxy) OnData(data *v1_21_8.ConfigurationToClientPacketRegistryData) (err error) {
return
}
func handleClient(c *proto.Conn) (err error) {
acc := api.NewOfflineAccount("RegistryHunter")
// ignore resource leak warning we own c conn so we should not close it here
_, err = server.ServeLogin(c, server.WithOtherAccount(acc), server.WithCompatibleVersions(CompatibleProtocolVersion), server.WithRawStatus(Status))
if err != nil {
return
}
sockPuppet, err := client.Connect(":25566")
if err != nil {
return
}
defer sockPuppet.Close()
err = sockPuppet.Start(&modules.LoginClient{
Conn: sockPuppet,
Account: acc,
})
if err != nil {
return
}
errChan := make(chan error)
p := &Proxy{Client: sockPuppet, Servee: c}
go func() {
errChan <- p.Client.Start(p)
}()
go func() {
errChan <- p.Servee.Start(p)
}()
err = <-errChan
return
}
func main() {
slog.SetLogLoggerLevel(slog.LevelDebug)
err := server.StartServerWithOnConn(":25565", handleClient)
if err != nil {
panic(err)
}
}
+52
View File
@@ -0,0 +1,52 @@
package main
import (
"log/slog"
"github.com/admin-else/strom/event"
"github.com/admin-else/strom/proto"
"github.com/admin-else/strom/server"
"github.com/admin-else/strom/text"
)
func wontFail[T any](v T, err error) T {
if err != nil {
panic(err)
}
return v
}
var StatusResponse = server.StatusResponse{
Version: server.StatusResponseVersion{
Name: text.Pretty("STROM"),
Protocol: 772,
},
Players: server.StatusResponsePlayers{},
Description: text.Pretty("GO TO LIMBO"),
Favicon: "",
EnforcesSecureChat: false,
}.MustMarshal()
type Server struct {
*proto.Conn
}
func (s *Server) OnStart(_ event.OnStart) (err error) {
//goland:noinspection GoResourceLeak captures the conn object which should NOT be closed
_, err = server.ServeLogin(s.Conn, server.WithRawStatus(StatusResponse))
if err != nil {
return
}
return
}
func main() {
slog.SetLogLoggerLevel(slog.LevelDebug)
err := server.StartServerWithFactory(":25565", func(c *proto.Conn) (h any, err error) {
h = &Server{Conn: c}
return
})
if err != nil {
panic(err)
}
}