remove onstart handler thing in favor of the user doing that themselves

This commit is contained in:
adman
2026-03-20 22:10:40 +01:00
parent 33cec6ecc9
commit 254b75e76b
14 changed files with 110 additions and 343 deletions
+8 -6
View File
@@ -16,11 +16,6 @@ type ConfigIgnorer struct {
} }
func (c *ConfigIgnorer) OnStart() (err error) { func (c *ConfigIgnorer) OnStart() (err error) {
c.RegisterCritical(c.Default)
c.RegisterUntilLatest(c.OnKnownPacks)
c.RegisterUntilLatest(c.OnFinish)
c.RegisterUntilLatest(c.OnPing)
c.RegisterUntilLatest(c.OnKeepAlive)
return return
} }
@@ -54,7 +49,14 @@ func (c *ConfigIgnorer) OnKeepAlive(packet *v1_21_8.ConfigurationToClientPacketK
} }
func IgnoreConfig(c *proto.Conn) (err error) { func IgnoreConfig(c *proto.Conn) (err error) {
err = c.Start(&ConfigIgnorer{c}) ci := &ConfigIgnorer{c}
ci.RegisterCritical(ci.Default)
ci.RegisterUntilLatest(ci.OnKnownPacks)
ci.RegisterUntilLatest(ci.OnFinish)
ci.RegisterUntilLatest(ci.OnPing)
ci.RegisterUntilLatest(ci.OnKeepAlive)
err = ci.Start()
if err != nil { if err != nil {
err = errors.Join(err, errors.New("failed to ignore config")) err = errors.Join(err, errors.New("failed to ignore config"))
} }
+24 -29
View File
@@ -124,37 +124,35 @@ func (s *LoginClient) OnSuccess(success *v1_21_8.LoginToClientPacketSuccess) (er
} }
func (s *LoginClient) OnStart() (err error) { func (s *LoginClient) OnStart() (err error) {
s.RegisterCritical(s.OnDefault)
s.RegisterCritical(s.OnCycle)
s.RegisterCritical(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 return
} }
func Login(c *proto.Conn, account *api.Account) (err error) { func Login(c *proto.Conn, account *api.Account) (err error) {
err = c.Start(&LoginClient{ lc := &LoginClient{
Conn: c, Conn: c,
Account: account, Account: account,
}) }
lc.RegisterCritical(lc.OnDefault)
lc.RegisterCritical(lc.OnCycle)
lc.RegisterCritical(lc.OnClose)
lc.RegisterUntilLatest(lc.OnCompress)
lc.RegisterUntilLatest(lc.OnEncrypt)
lc.RegisterUntilLatest(lc.OnDisconnect)
lc.RegisterUntilLatest(lc.OnSuccess)
p, err := MakeHandshakePacket(lc.Conn, proto_base.Login)
if err != nil {
return
}
err = lc.Send(p)
if err != nil {
return
}
lc.SetState(proto_base.Login)
err = lc.Send(&v1_21_8.LoginToServerPacketLoginStart{Username: lc.Account.Name, PlayerUUID: lc.Account.Uuid})
err = lc.Start()
if err != nil { if err != nil {
err = errors.Join(FailedToLoginErr, err) err = errors.Join(FailedToLoginErr, err)
} }
@@ -166,10 +164,7 @@ func ConnectAndLogin(connectTo string, account *api.Account) (c *proto.Conn, err
if err != nil { if err != nil {
return return
} }
err = c.Start(&LoginClient{ err = Login(c, account)
Conn: c,
Account: account,
})
if err != nil { if err != nil {
err = errors.Join(FailedToLoginErr, err) err = errors.Join(FailedToLoginErr, err)
} }
+22 -15
View File
@@ -16,29 +16,21 @@ type StatusClient struct {
*proto.Conn *proto.Conn
Status string Status string
PingSendTime, PingReceiveTime time.Time PingSendTime, PingReceiveTime time.Time
DoPingRoundTripTime bool
} }
func (s *StatusClient) OnStart() (err error) { func (s *StatusClient) OnStart() (err error) {
s.RegisterUntilLatest(s.OnStatus)
s.RegisterUntilLatest(s.OnPong)
p, err := MakeHandshakePacket(s.Conn, proto_base.Status)
if err != nil {
return
}
err = s.Send(p)
if err != nil {
return
}
s.SetState(proto_base.Status)
err = s.Send(&v1_21_8.StatusToServerPacketPingStart{})
return return
} }
func (s *StatusClient) OnStatus(p *v1_21_8.StatusToClientPacketServerInfo) (err error) { func (s *StatusClient) OnStatus(p *v1_21_8.StatusToClientPacketServerInfo) (err error) {
s.Status = p.Response s.Status = p.Response
s.PingSendTime = time.Now() s.PingSendTime = time.Now()
err = s.Send(&v1_21_8.StatusToServerPacketPing{Time: s.PingSendTime.UnixMilli()}) if s.DoPingRoundTripTime {
err = s.Send(&v1_21_8.StatusToServerPacketPing{Time: s.PingSendTime.UnixMilli()})
} else {
err = event.HandlerDoneErr{}
}
return return
} }
@@ -63,7 +55,22 @@ func StatusRaw(addr string) (s *StatusClient, err error) {
s = &StatusClient{ s = &StatusClient{
Conn: c, Conn: c,
} }
err = s.Start(s) s.Loop = event.NewLoop()
s.RegisterUntilLatest(s.OnStatus)
s.RegisterUntilLatest(s.OnPong)
p, err := MakeHandshakePacket(s.Conn, proto_base.Status)
if err != nil {
return
}
err = s.Send(p)
if err != nil {
return
}
s.SetState(proto_base.Status)
err = s.Send(&v1_21_8.StatusToServerPacketPingStart{})
err = s.StartConn()
return return
} }
+15 -15
View File
@@ -15,12 +15,8 @@ const (
TimePerLoop = time.Second / LoopsPerSecond TimePerLoop = time.Second / LoopsPerSecond
) )
type Handler interface {
OnStart() (err error)
}
type Loop struct { type Loop struct {
handlerFunctions map[reflect.Type][]reflect.Value HandlerFunctions map[reflect.Type][]reflect.Value
Ctx context.Context Ctx context.Context
ErrChan chan error ErrChan chan error
@@ -105,13 +101,13 @@ func (l *Loop) RegisterCritical(h any) {
} }
func (l *Loop) RegisterDirect(k reflect.Type, h reflect.Value) { func (l *Loop) RegisterDirect(k reflect.Type, h reflect.Value) {
l.handlerFunctions[k] = append(l.handlerFunctions[k], h) l.HandlerFunctions[k] = append(l.HandlerFunctions[k], h)
} }
// FireFound triggers all handlers registered for the specified event type and returns if handlers were found or an error occurred. // FireFound triggers all handlers registered for the specified event type and returns if handlers were found or an error occurred.
func (l *Loop) FireFound(event any) (found bool, err error) { func (l *Loop) FireFound(event any) (found bool, err error) {
var handlers []reflect.Value var handlers []reflect.Value
if handlers, found = l.handlerFunctions[reflect.TypeOf(event)]; found { if handlers, found = l.HandlerFunctions[reflect.TypeOf(event)]; found {
for _, handler := range handlers { for _, handler := range handlers {
errV := handler.Call([]reflect.Value{reflect.ValueOf(event)})[0] errV := handler.Call([]reflect.Value{reflect.ValueOf(event)})[0]
if !errV.IsNil() { if !errV.IsNil() {
@@ -143,11 +139,9 @@ func (l *Loop) Fire(event any) (err error) {
return return
} }
func (l *Loop) startLoop(handler Handler) (err error) { func (l *Loop) startLoop() (err error) {
_ = *l // exit early on nil loop _ = *l // exit early on nil loop
l.handlerFunctions = make(map[reflect.Type][]reflect.Value) for {
err = handler.OnStart()
for err == nil {
tickStartTime := time.Now() tickStartTime := time.Now()
err = l.Fire(Tick{}) err = l.Fire(Tick{})
if err != nil { if err != nil {
@@ -165,13 +159,19 @@ func (l *Loop) startLoop(handler Handler) (err error) {
return return
} }
func (l *Loop) Start(handler Handler) (err error) { func (l *Loop) Start() (err error) {
l.ErrChan = make(chan error)
l.Ctx, l.cancel = context.WithCancel(context.Background())
go func() { go func() {
l.ErrChan <- l.startLoop(handler) l.ErrChan <- l.startLoop()
}() }()
err = <-l.ErrChan err = <-l.ErrChan
l.cancel() l.cancel()
return return
} }
func NewLoop() (l *Loop) {
l = &Loop{}
l.ErrChan = make(chan error)
l.Ctx, l.cancel = context.WithCancel(context.Background())
l.HandlerFunctions = make(map[reflect.Type][]reflect.Value)
return
}
+4 -6
View File
@@ -54,14 +54,13 @@ type Conn struct {
Version string Version string
ProtocolVersion int32 ProtocolVersion int32
handler event.Handler
receiveRoutine bool receiveRoutine bool
packetCh chan proto_base.EncodeDecodeAble packetCh chan proto_base.EncodeDecodeAble
} }
func (c *Conn) OnStart() (err error) { func (c *Conn) StartConn() (err error) {
c.RegisterCritical(c.OnTick) c.RegisterCritical(c.OnTick)
return c.handler.OnStart() return c.Loop.Start()
} }
func (c *Conn) ReceiveJob() { func (c *Conn) ReceiveJob() {
@@ -235,10 +234,9 @@ func (c *Conn) OnTick(_ event.Tick) (err error) {
return return
} }
func (c *Conn) Start(handler event.Handler) (err error) { func (c *Conn) Start() (err error) {
if c.Loop == nil { if c.Loop == nil {
c.Loop = &event.Loop{} c.Loop = &event.Loop{}
} }
c.handler = handler return c.Loop.Start()
return c.Loop.Start(c)
} }
+6 -117
View File
@@ -16635,30 +16635,15 @@ func (ret *PlayToClientPacketEntityUpdateAttributes) Encode(w io.Writer) (err er
} }
type PlayToClientPacketEntityVelocity struct { type PlayToClientPacketEntityVelocity struct {
EntityId int32 Val proto_base.ToDo
Velocity proto_base.LpVec3d
} }
func (ret *PlayToClientPacketEntityVelocity) Decode(r io.Reader) (err error) { func (ret *PlayToClientPacketEntityVelocity) Decode(r io.Reader) (err error) {
ret.EntityId, err = proto_base.DecodeVarInt(r) err = proto_base.ToDoError
if err != nil {
return
}
err = ret.Velocity.Decode(r)
if err != nil {
return
}
return return
} }
func (ret *PlayToClientPacketEntityVelocity) Encode(w io.Writer) (err error) { func (ret *PlayToClientPacketEntityVelocity) Encode(w io.Writer) (err error) {
err = proto_base.EncodeVarInt(w, ret.EntityId) err = proto_base.ToDoError
if err != nil {
return
}
err = ret.Velocity.Encode(w)
if err != nil {
return
}
return return
} }
@@ -20435,111 +20420,15 @@ func (ret *PlayToClientPacketSoundEffect) Encode(w io.Writer) (err error) {
} }
type PlayToClientPacketSpawnEntity struct { type PlayToClientPacketSpawnEntity struct {
EntityId int32 Val proto_base.ToDo
ObjectUUID uuid.UUID
Type int32
X float64
Y float64
Z float64
Velocity proto_base.LpVec3d
Pitch int8
Yaw int8
HeadPitch int8
ObjectData int32
} }
func (ret *PlayToClientPacketSpawnEntity) Decode(r io.Reader) (err error) { func (ret *PlayToClientPacketSpawnEntity) Decode(r io.Reader) (err error) {
ret.EntityId, err = proto_base.DecodeVarInt(r) err = proto_base.ToDoError
if err != nil {
return
}
_, err = io.ReadFull(r, ret.ObjectUUID[:])
if err != nil {
return
}
ret.Type, err = proto_base.DecodeVarInt(r)
if err != nil {
return
}
err = binary.Read(r, binary.BigEndian, &ret.X)
if err != nil {
return
}
err = binary.Read(r, binary.BigEndian, &ret.Y)
if err != nil {
return
}
err = binary.Read(r, binary.BigEndian, &ret.Z)
if err != nil {
return
}
err = ret.Velocity.Decode(r)
if err != nil {
return
}
err = binary.Read(r, binary.BigEndian, &ret.Pitch)
if err != nil {
return
}
err = binary.Read(r, binary.BigEndian, &ret.Yaw)
if err != nil {
return
}
err = binary.Read(r, binary.BigEndian, &ret.HeadPitch)
if err != nil {
return
}
ret.ObjectData, err = proto_base.DecodeVarInt(r)
if err != nil {
return
}
return return
} }
func (ret *PlayToClientPacketSpawnEntity) Encode(w io.Writer) (err error) { func (ret *PlayToClientPacketSpawnEntity) Encode(w io.Writer) (err error) {
err = proto_base.EncodeVarInt(w, ret.EntityId) err = proto_base.ToDoError
if err != nil {
return
}
_, err = w.Write(ret.ObjectUUID[:])
if err != nil {
return
}
err = proto_base.EncodeVarInt(w, ret.Type)
if err != nil {
return
}
err = binary.Write(w, binary.BigEndian, ret.X)
if err != nil {
return
}
err = binary.Write(w, binary.BigEndian, ret.Y)
if err != nil {
return
}
err = binary.Write(w, binary.BigEndian, ret.Z)
if err != nil {
return
}
err = ret.Velocity.Encode(w)
if err != nil {
return
}
err = binary.Write(w, binary.BigEndian, ret.Pitch)
if err != nil {
return
}
err = binary.Write(w, binary.BigEndian, ret.Yaw)
if err != nil {
return
}
err = binary.Write(w, binary.BigEndian, ret.HeadPitch)
if err != nil {
return
}
err = proto_base.EncodeVarInt(w, ret.ObjectData)
if err != nil {
return
}
return return
} }
+6 -117
View File
@@ -16458,30 +16458,15 @@ func (ret *PlayToClientPacketEntityUpdateAttributes) Encode(w io.Writer) (err er
} }
type PlayToClientPacketEntityVelocity struct { type PlayToClientPacketEntityVelocity struct {
EntityId int32 Val proto_base.ToDo
Velocity proto_base.LpVec3d
} }
func (ret *PlayToClientPacketEntityVelocity) Decode(r io.Reader) (err error) { func (ret *PlayToClientPacketEntityVelocity) Decode(r io.Reader) (err error) {
ret.EntityId, err = proto_base.DecodeVarInt(r) err = proto_base.ToDoError
if err != nil {
return
}
err = ret.Velocity.Decode(r)
if err != nil {
return
}
return return
} }
func (ret *PlayToClientPacketEntityVelocity) Encode(w io.Writer) (err error) { func (ret *PlayToClientPacketEntityVelocity) Encode(w io.Writer) (err error) {
err = proto_base.EncodeVarInt(w, ret.EntityId) err = proto_base.ToDoError
if err != nil {
return
}
err = ret.Velocity.Encode(w)
if err != nil {
return
}
return return
} }
@@ -20258,111 +20243,15 @@ func (ret *PlayToClientPacketSoundEffect) Encode(w io.Writer) (err error) {
} }
type PlayToClientPacketSpawnEntity struct { type PlayToClientPacketSpawnEntity struct {
EntityId int32 Val proto_base.ToDo
ObjectUUID uuid.UUID
Type int32
X float64
Y float64
Z float64
Velocity proto_base.LpVec3d
Pitch int8
Yaw int8
HeadPitch int8
ObjectData int32
} }
func (ret *PlayToClientPacketSpawnEntity) Decode(r io.Reader) (err error) { func (ret *PlayToClientPacketSpawnEntity) Decode(r io.Reader) (err error) {
ret.EntityId, err = proto_base.DecodeVarInt(r) err = proto_base.ToDoError
if err != nil {
return
}
_, err = io.ReadFull(r, ret.ObjectUUID[:])
if err != nil {
return
}
ret.Type, err = proto_base.DecodeVarInt(r)
if err != nil {
return
}
err = binary.Read(r, binary.BigEndian, &ret.X)
if err != nil {
return
}
err = binary.Read(r, binary.BigEndian, &ret.Y)
if err != nil {
return
}
err = binary.Read(r, binary.BigEndian, &ret.Z)
if err != nil {
return
}
err = ret.Velocity.Decode(r)
if err != nil {
return
}
err = binary.Read(r, binary.BigEndian, &ret.Pitch)
if err != nil {
return
}
err = binary.Read(r, binary.BigEndian, &ret.Yaw)
if err != nil {
return
}
err = binary.Read(r, binary.BigEndian, &ret.HeadPitch)
if err != nil {
return
}
ret.ObjectData, err = proto_base.DecodeVarInt(r)
if err != nil {
return
}
return return
} }
func (ret *PlayToClientPacketSpawnEntity) Encode(w io.Writer) (err error) { func (ret *PlayToClientPacketSpawnEntity) Encode(w io.Writer) (err error) {
err = proto_base.EncodeVarInt(w, ret.EntityId) err = proto_base.ToDoError
if err != nil {
return
}
_, err = w.Write(ret.ObjectUUID[:])
if err != nil {
return
}
err = proto_base.EncodeVarInt(w, ret.Type)
if err != nil {
return
}
err = binary.Write(w, binary.BigEndian, ret.X)
if err != nil {
return
}
err = binary.Write(w, binary.BigEndian, ret.Y)
if err != nil {
return
}
err = binary.Write(w, binary.BigEndian, ret.Z)
if err != nil {
return
}
err = ret.Velocity.Encode(w)
if err != nil {
return
}
err = binary.Write(w, binary.BigEndian, ret.Pitch)
if err != nil {
return
}
err = binary.Write(w, binary.BigEndian, ret.Yaw)
if err != nil {
return
}
err = binary.Write(w, binary.BigEndian, ret.HeadPitch)
if err != nil {
return
}
err = proto_base.EncodeVarInt(w, ret.ObjectData)
if err != nil {
return
}
return return
} }
+1 -1
View File
@@ -577,7 +577,7 @@ func (g *Generator) RegisterDecoderNatives() {
"varlong": VarLongDecoder, "varlong": VarLongDecoder,
"anonymousNbt": DefaultDecoder, "anonymousNbt": DefaultDecoder,
"anonOptionalNbt": DefaultDecoder, // I have no idea what the difference is between these two "anonOptionalNbt": DefaultDecoder, // I have no idea what the difference is between these two
"lpVec3": DefaultDecoder, "lpVec3": ToDoDecoder,
"UUID": UUIDDecoder, "UUID": UUIDDecoder,
"restBuffer": DefaultDecoder, "restBuffer": DefaultDecoder,
+1 -1
View File
@@ -373,7 +373,7 @@ func (g *Generator) RegisterEncoderNatives() {
"anonOptionalNbt": DefaultEncoder, // I have no idea what the difference is between these two "anonOptionalNbt": DefaultEncoder, // I have no idea what the difference is between these two
"UUID": UUIDEncoder, "UUID": UUIDEncoder,
"restBuffer": DefaultEncoder, "restBuffer": DefaultEncoder,
"lpVec3": DefaultEncoder, "lpVec3": ToDoEncoder,
"string": StringEncoder, "string": StringEncoder,
"f32": SimpleTypeEncoder, "f32": SimpleTypeEncoder,
+3 -8
View File
@@ -21,7 +21,7 @@ func (c *ConfigServer) Default(event event.Anything) (err error) {
return return
} }
func (c *ConfigServer) OnStart() (err error) { func ServeConfig(c *proto.Conn) (err error) {
n, err := data.LoadRegistry(c.Version) n, err := data.LoadRegistry(c.Version)
if err != nil { if err != nil {
return return
@@ -64,7 +64,8 @@ func (c *ConfigServer) OnStart() (err error) {
return return
} }
err = c.Send(&v1_21_8.ConfigurationToClientPacketFinishConfiguration{}) err = c.Send(&v1_21_8.ConfigurationToClientPacketFinishConfiguration{})
return cs := &ConfigServer{c}
return cs.Start()
} }
func (c *ConfigServer) OnFinishConfiguration(_ *v1_21_8.ConfigurationToServerPacketFinishConfiguration) (err error) { func (c *ConfigServer) OnFinishConfiguration(_ *v1_21_8.ConfigurationToServerPacketFinishConfiguration) (err error) {
@@ -72,9 +73,3 @@ func (c *ConfigServer) OnFinishConfiguration(_ *v1_21_8.ConfigurationToServerPac
err = event.HandlerDoneErr{} err = event.HandlerDoneErr{}
return return
} }
func ServeConfig(c *proto.Conn) (err error) {
cs := &ConfigServer{c}
err = cs.Start(cs)
return
}
+7 -13
View File
@@ -112,18 +112,6 @@ func (l *LoginServer) OnDefault(event event.Unhandled) (err error) {
return return
} }
func (l *LoginServer) OnStart() (err error) {
return
}
func (l *LoginServer) OnCycle(_ event.Tick) (err error) {
return
}
func (l *LoginServer) OnClose(_ event.Close) (err error) {
return
}
type LoginServerSetting func(*LoginServer) type LoginServerSetting func(*LoginServer)
func WithOtherAccount(a *api.Account) LoginServerSetting { func WithOtherAccount(a *api.Account) LoginServerSetting {
@@ -170,10 +158,16 @@ func WithCompatibleVersions(versions ...int32) LoginServerSetting {
func ServeLogin(c *proto.Conn, settings ...LoginServerSetting) (ret *LoginServer, err error) { func ServeLogin(c *proto.Conn, settings ...LoginServerSetting) (ret *LoginServer, err error) {
ret = &LoginServer{Conn: c} ret = &LoginServer{Conn: c}
ret.RegisterCritical(ret.OnDefault)
ret.RegisterUntilLatest(ret.OnHandshake)
ret.RegisterUntilLatest(ret.OnLoginStart)
ret.RegisterUntilLatest(ret.OnLoginAcknowledged)
ret.RegisterUntilLatest(ret.OnStatusRequest)
ret.RegisterUntilLatest(ret.OnStatusPing)
for _, s := range settings { for _, s := range settings {
s(ret) s(ret)
} }
ret.CompressionThreshold = 256 ret.CompressionThreshold = 256
err = ret.Start(ret) err = ret.Start()
return return
} }
+4 -3
View File
@@ -5,7 +5,6 @@ import (
"log/slog" "log/slog"
"net" "net"
"github.com/admin-else/strom/event"
"github.com/admin-else/strom/proto" "github.com/admin-else/strom/proto"
"github.com/admin-else/strom/proto_base" "github.com/admin-else/strom/proto_base"
"github.com/admin-else/strom/text" "github.com/admin-else/strom/text"
@@ -23,7 +22,9 @@ func Servee(c net.Conn) (ret *proto.Conn) {
return return
} }
type Factory func(c *proto.Conn) (h event.Handler, err error) type ConnAcceptor func(c net.Conn) (err error)
type Factory func(c *proto.Conn) (h ConnAcceptor, err error)
func ServeClient(cNet net.Conn, factory Factory) { func ServeClient(cNet net.Conn, factory Factory) {
c := Servee(cNet) c := Servee(cNet)
@@ -32,7 +33,7 @@ func ServeClient(cNet net.Conn, factory Factory) {
if err != nil { if err != nil {
return return
} }
err = c.Start(h) err = h(c)
if errors.Is(err, StatusServedErr) { if errors.Is(err, StatusServedErr) {
return return
} }
+3 -9
View File
@@ -48,14 +48,6 @@ type StatusServer struct {
Status string Status string
} }
func (p *StatusServer) OnStart() (err error) {
return
}
func (p *StatusServer) Default(_ any) (err error) {
return
}
func (p *StatusServer) OnStatusRequest(_ *v1_21_8.StatusToServerPacketPingStart) (err error) { func (p *StatusServer) OnStatusRequest(_ *v1_21_8.StatusToServerPacketPingStart) (err error) {
return p.Send(&v1_21_8.StatusToClientPacketServerInfo{Response: p.Status}) return p.Send(&v1_21_8.StatusToClientPacketServerInfo{Response: p.Status})
} }
@@ -73,6 +65,8 @@ func ServeStatus(c *proto.Conn, s StatusResponse) (err error) {
Conn: c, Conn: c,
Status: string(status), Status: string(status),
} }
err = server.Start(server) server.RegisterUntilLatest(server.OnStatusRequest)
server.RegisterUntilLatest(server.OnStatusPing)
err = server.Start()
return return
} }
+6 -3
View File
@@ -28,21 +28,24 @@ func Help(args []string) (err error) {
} }
func mainE() (err error) { func mainE() (err error) {
slog.SetLogLoggerLevel(slog.LevelDebug)
subcommands["help"] = Help // this is here because if it isn't tools/cli/main.go:17:5: initialization cycle for subcommands subcommands["help"] = Help // this is here because if it isn't tools/cli/main.go:17:5: initialization cycle for subcommands
// tools/cli/main.go:17:5: subcommands refers to Help // tools/cli/main.go:17:5: subcommands refers to Help
// tools/cli/main.go:22:6: Help refers to subcommands // tools/cli/main.go:22:6: Help refers to subcommands
args := os.Args
args = []string{"TEST", "status", "-addr", "tcpshield.1f2d.net:25565"}
if len(os.Args) < 2 { if len(args) < 2 {
err = ExpectedASubcommandErr err = ExpectedASubcommandErr
return return
} }
f, ok := subcommands[os.Args[1]] f, ok := subcommands[args[1]]
if !ok { if !ok {
err = UnknownSubcommandErr err = UnknownSubcommandErr
return return
} }
err = f(os.Args[2:]) err = f(args[2:])
return return
} }