예제 #1
0
        private void Server_OnPersonalPacketReceived(object sender, PersonalPacketEvent e)
        {
            if (e.Packet.Package is UserConnectionPacket ucp)
            {
                var notification = new ChatPacket
                {
                    Username  = "******",
                    Message   = "A new user has joined the chat",
                    UserColor = Colors.Purple.ToString()
                };

                if (_usernames.Keys.Contains(ucp.UserGuid))
                {
                    _usernames.Remove(ucp.UserGuid);
                }
                else
                {
                    _usernames.Add(ucp.UserGuid, ucp.Username);
                }

                ucp.Users = _usernames.Values.ToArray();

                Task.Run(() => _server.SendObjectToClients(ucp)).Wait();
                Thread.Sleep(500);
                Task.Run(() => _server.SendObjectToClients(notification)).Wait();
            }
            WriteOutput("Personal Packet Received");
        }
예제 #2
0
        private void MonitorStreams()
        {
            while (IsRunning)
            {
                foreach (var client in Connections.ToList())
                {
                    if (!client.IsSocketConnected())
                    {
                        var removeClientEvent = new PingPacketEvent(client, null, string.Empty);
                        Connections.Remove(client);
                        OnConnectionRemoved?.Invoke(this, removeClientEvent);
                        continue;
                    }

                    if (client.Socket.Available != 0)
                    {
                        var readObject     = ReadObject(client.Socket);
                        var testConnection = new PingPacketEvent(client, null, readObject);
                        OnPacketReceived?.Invoke(this, testConnection);

                        if (readObject is PingPacket ping)
                        {
                            client.SendObject(ping).Wait();
                            continue;
                        }

                        if (readObject is PersonalPacket pp)
                        {
                            var destination = Connections.FirstOrDefault(c => c.ClientId.ToString() == pp.GuidId);
                            var e4          = new PersonalPacketEvent(client, destination, pp);
                            OnPersonalPacketReceived?.Invoke(this, e4);

                            if (destination != null)
                            {
                                destination.SendObject(pp).Wait();
                                var personPaketEventSuccess = new PersonalPacketEvent(client, destination, pp);
                                OnPersonalPacketSent?.Invoke(this, personPaketEventSuccess);
                            }
                        }
                        else
                        {
                            foreach (var c in Connections.ToList())
                            {
                                c.SendObject(readObject).Wait();
                                var waitPacketEvent = new PingPacketEvent(client, c, readObject);
                                OnPacketSent?.Invoke(this, waitPacketEvent);
                            }
                        }
                    }
                }
            }
        }
예제 #3
0
 private void Server_OnPersonalPacketSent(object sender, PersonalPacketEvent e)
 {
     WriteOutput("Personal Packet Sent");
 }