/* * Leave sends a LEAVE message to the client associated to given connection */ func (reg *ClientRegistry) Leave(reason string, c *network.Conn) { clientData := c.GetUserData().(ClientData) // send LEAVE to client leave := messages.New(messages.LeaveId, messages.Leave{ Id: uint32(clientData.Id), Reason: reason, }) if err := c.AsyncSendPacket(leave, 5*time.Millisecond); err != nil { // either the client received the LEAVE or not, we will close the // connection afterwards, so there's nothing more to do in order to // gracefully handle this error log.WithError(err).WithField("clientID", clientData.Id).Error("LEAVE message couldn't be sent") } else { log.WithField("clientID", clientData.Id).Info("LEAVE message has been sent") } // TODO: Remove this: the client should remain alive even when the connection // is closed. Example: when the lobby will be implemented // closes the connection, registry cleanup will be performed in OnClose go func() { time.Sleep(100 * time.Millisecond) if !c.IsClosed() { c.Close() } }() }