diff --git a/session/processor.go b/session/processor.go index 69391f7..01ba5f6 100644 --- a/session/processor.go +++ b/session/processor.go @@ -39,6 +39,10 @@ type Processor interface { ProcessClientEncoded(ctx *Context, pk *[]byte) // ProcessFlush is called before flushing the player's minecraft.Conn buffer in response to a downstream server request. ProcessFlush(ctx *Context) + // ProcessDiscover is called to determine the primary server to send the player to. + ProcessDiscover(ctx *Context, target *string) + // ProcessDiscoverFallback is called to determine the fallback server to send the player to. + ProcessDiscoverFallback(ctx *Context, target *string) // ProcessPreTransfer is called before transferring the player to a different server. ProcessPreTransfer(ctx *Context, origin *string, target *string) // ProcessTransferFailure is called when the player transfer to a different server fails. @@ -63,6 +67,8 @@ func (NopProcessor) ProcessServerEncoded(_ *Context, _ *[]byte) {} func (NopProcessor) ProcessClient(_ *Context, _ *packet.Packet) {} func (NopProcessor) ProcessClientEncoded(_ *Context, _ *[]byte) {} func (NopProcessor) ProcessFlush(_ *Context) {} +func (NopProcessor) ProcessDiscover(_ *Context, target *string) {} +func (NopProcessor) ProcessDiscoverFallback(_ *Context, target *string) {} func (NopProcessor) ProcessPreTransfer(_ *Context, _ *string, _ *string) {} func (NopProcessor) ProcessTransferFailure(_ *Context, _ *string, _ *string) {} func (NopProcessor) ProcessPostTransfer(_ *Context, _ *string, _ *string) {} diff --git a/session/session.go b/session/session.go index 2284f40..0786934 100644 --- a/session/session.go +++ b/session/session.go @@ -96,6 +96,8 @@ func (s *Session) LoginContext(ctx context.Context) (err error) { return err } + s.Processor().ProcessDiscover(NewContext(), &serverAddr) + conn, err := s.dial(ctx, serverAddr) if err != nil { s.logger.Debug("dialer failed", "err", err) @@ -325,6 +327,8 @@ func (s *Session) fallback() error { return fmt.Errorf("discovery failed: %w", err) } + s.Processor().ProcessDiscoverFallback(NewContext(), &addr) + s.logger.Debug("transferring session to a fallback server", "addr", addr) if err := s.Transfer(addr); err != nil { return fmt.Errorf("transfer failed: %w", err)