private void p_OnConnection(P2PClient server, ulong userId)
 {
     try
     {
         crypter.AddUser(userId);
         OnUserConnect?.Invoke(this, userId);
     }
     catch (System.OperationCanceledException)
     {
         server.Disconnect(userId);
     }
 }
        private async Task Listen()
        {
            List <string> removeList = new List <string>();

            for (int i = clients.Count - 1; i >= 0; i--)
            {
                Client client = clients[i];

                if (client.IsAlive())
                {
                    Packet p = await client.Listen();

                    if (p != null)
                    {
                        PacketType type = p.GetPacketType();
                        if (type == PacketType.Identify)
                        {
                            OnUserConnect.Invoke(this, new UserConnectEventArgs(client));
                        }
                        else
                        {
                            OnPacketReceived.Invoke(this, new PacketReceivedEventArgs(client, p));
                        }
                    }
                }
                else
                {
                    await client.Stop();

                    Logger.Info($"Client dropped [{client.GetSessionId()}]");
                    clients.RemoveAt(i);
                    string sess = client.GetSessionId();

                    bool onlyone = true;
                    for (int j = clients.Count - 1; j >= 0; j--)
                    {
                        if (clients[j].GetSessionId() == sess)
                        {
                            onlyone = false;
                            break;
                        }
                    }

                    if (onlyone)
                    {
                        OnUserDisconnect.Invoke(this, new UserDosconnectEventArgs(client));
                    }
                }
            }
        }