public override async Task OnDisconnectAsync(TcpSocketClient <Message, Message> client,
                                                     CancellationToken cancellationToken)
        {
            int  id     = manager.GetId(client);
            bool result = await manager.RemoveSocketAsync(id, cancellationToken);

            if (!result)
            {
                IClient socket = client.GetSocket();
                logger.Error($"Failed to remove socket: {socket.Endpoint}");
            }
            logger.Information($"Player {id} disconnected");

            DisconnectPayload payload = new DisconnectPayload()
            {
                AgentID = id
            };
            Message message = new Message()
            {
                AgentID   = -1,
                MessageID = MessageID.PlayerDisconnected,
                Payload   = payload
            };
            await container.GMClient.SendAsync(message, cancellationToken);
        }
        private async Task CloseUnconfirmedSockets(CancellationToken stoppingToken)
        {
            foreach (var elem in container.ConfirmedAgents)
            {
                if (!elem.Value)
                {
                    bool result = await manager.RemoveSocketAsync(elem.Key, stoppingToken);

                    if (!result)
                    {
                        ISocketClient <Message, Message> socket = manager.GetSocketById(elem.Key);
                        logger.Error($"Failed to remove socket: {socket.GetSocket().Endpoint}");
                    }
                    logger.Information($"Player {elem.Key} has been forced to disconnect - connection after StartGame");
                }
            }
        }