diff --git a/internal/app/controller/controller.go b/internal/app/controller/controller.go index 3d5835d1..00ca907f 100644 --- a/internal/app/controller/controller.go +++ b/internal/app/controller/controller.go @@ -49,10 +49,12 @@ func NewGameController() (c *GameController) { c.AutoRefServer = rcon.NewAutoRefServer() c.AutoRefServer.LoadTrustedKeys(c.Config.Server.AutoRef.TrustedKeysDir) c.AutoRefServer.ProcessRequest = c.ProcessAutoRefRequests + c.AutoRefServer.ClientsChangedObservers = []func(){c.updateOnlineStates} c.TeamServer = rcon.NewTeamServer() c.TeamServer.LoadTrustedKeys(c.Config.Server.Team.TrustedKeysDir) c.TeamServer.ProcessTeamRequest = c.ProcessTeamRequests + c.TeamServer.ClientsChangedObservers = []func(){c.updateOnlineStates} c.CiServer = rcon.NewCiServer() @@ -84,6 +86,7 @@ func (c *GameController) Run() { c.ApiServer.PublishUiProtocol(c.Engine.PersistentState.Protocol) c.TeamServer.AllowedTeamNames = []string{c.Engine.State.TeamState[TeamYellow].Name, c.Engine.State.TeamState[TeamBlue].Name} + c.updateOnlineStates() go c.AutoRefServer.Listen(c.Config.Server.AutoRef.Address) go c.AutoRefServer.ListenTls(c.Config.Server.AutoRef.AddressTls) @@ -150,7 +153,6 @@ func (c *GameController) publish() { c.PublishMutex.Lock() defer c.PublishMutex.Unlock() - c.updateOnlineStates() c.statePreserver.Save(c.Engine.PersistentState) c.TeamServer.AllowedTeamNames = []string{ @@ -184,6 +186,8 @@ func (c *GameController) updateOnlineStates() { } sort.Strings(autoRefs) c.Engine.GcState.AutoRefsConnected = autoRefs + + c.publish() } // publishToNetwork publishes the current state to the network (multicast) every 25ms diff --git a/internal/app/rcon/autoRefServer.go b/internal/app/rcon/autoRefServer.go index 1f598ccc..4ad0b4a9 100644 --- a/internal/app/rcon/autoRefServer.go +++ b/internal/app/rcon/autoRefServer.go @@ -117,6 +117,9 @@ func (s *AutoRefServer) handleClientConnection(conn net.Conn) { s.Clients[client.Id] = client.Client defer s.CloseConnection(conn, client.Id) log.Printf("Client %v connected", client.Id) + for _, observer := range s.ClientsChangedObservers { + observer() + } for { req := refproto.AutoRefToController{} diff --git a/internal/app/rcon/server.go b/internal/app/rcon/server.go index 1cac9121..0e9b79f6 100644 --- a/internal/app/rcon/server.go +++ b/internal/app/rcon/server.go @@ -17,9 +17,10 @@ import ( ) type Server struct { - Clients map[string]*Client - TrustedKeys map[string]*rsa.PublicKey - ConnectionHandler func(net.Conn) + Clients map[string]*Client + TrustedKeys map[string]*rsa.PublicKey + ConnectionHandler func(net.Conn) + ClientsChangedObservers []func() } type Client struct { @@ -93,6 +94,9 @@ func (s *Server) ListenTls(address string) { func (s *Server) CloseConnection(conn net.Conn, id string) { delete(s.Clients, id) log.Printf("Connection to %v closed", id) + for _, observer := range s.ClientsChangedObservers { + observer() + } } func (c *Client) Ok() (reply refproto.ControllerReply) { diff --git a/internal/app/rcon/teamServer.go b/internal/app/rcon/teamServer.go index d6da67c5..d59d31c5 100644 --- a/internal/app/rcon/teamServer.go +++ b/internal/app/rcon/teamServer.go @@ -129,6 +129,9 @@ func (s *TeamServer) handleClientConnection(conn net.Conn) { s.Clients[client.Id] = client.Client defer s.CloseConnection(conn, client.Id) log.Printf("Client %v connected", client.Id) + for _, observer := range s.ClientsChangedObservers { + observer() + } for { req := refproto.TeamToController{}