Exemple #1
0
/*
 * 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()
		}
	}()
}