Exemple #1
0
 public void Shutdown()
 {
     if (MyClient != null)
     {
         MyClient.Close();
     }
 }
Exemple #2
0
        private void OnMessage(object sender, MessageEventArgs e)
        {
            if (e == null || e.Data == null)
            {
                return;
            }

            TransportMessage newReply = DeSerialize(e.Data);

            switch (newReply.Event)
            {
            case "restart":
                dynamic downtime = newReply.Payload.downtime;

                MyClient.Close(CloseStatusCode.Normal);

                Task.Run(() => Task.Delay(Convert.ToInt32(1000 * downtime)))
                .ContinueWith((t) => ReconnectLoop());

                ReconnectLoop();
                break;

            case "heartbeat":
                HeartbeatResponse whoBlock = new HeartbeatResponse()
                {
                    Players = UserList().Select(player => player.Name).ToArray()
                };

                TransportMessage response = new TransportMessage()
                {
                    Event   = whoBlock.Type,
                    Payload = whoBlock
                };

                MyClient.Send(Serialize(response));
                break;

            case "tells/receive":
                dynamic myName      = newReply.Payload.player.Value;
                dynamic theirName   = newReply.Payload.from.Value;
                dynamic theirGame   = newReply.Payload.game.Value;
                dynamic messageBody = newReply.Payload.message.Value;
                dynamic fullName    = string.Format("{0}@{1}", theirGame, theirName);

                Member validPlayer = UserList().FirstOrDefault(user => user.Name.Equals(myName, StringComparison.InvariantCultureIgnoreCase));

                if (validPlayer != null)
                {
                    validPlayer.WriteTo(string.Format("{0} gossip-tells you, '{1}'", fullName, messageBody));
                }

                break;

            case "channels/broadcast":
                string messageText   = newReply.Payload.message.Value;
                string messageSender = newReply.Payload.name.Value;
                string source        = newReply.Payload.game.Value;
                string channel       = newReply.Payload.channel.Value;

                if (!string.IsNullOrWhiteSpace(messageText))
                {
                    foreach (Member user in UserList().Where(usr => !usr.BlockedMembers.Contains(messageSender)))
                    {
                        user.WriteTo(string.Format("{0}@{1} {3}s, '{2}'", messageSender, source, messageText, channel));
                    }
                }
                break;

            case "players/sign-in":
                if (newReply.ReferenceID == null)
                {
                    //This is a request from the server
                    string fullSignInName = string.Format("{0}@{1}", newReply.Payload.game.Value, newReply.Payload.name.Value);

                    foreach (Member user in UserList().Where(usr => usr.Friends.Contains(fullSignInName)))
                    {
                        user.WriteTo(string.Format("{0} has logged into GOSSIP.", fullSignInName));
                    }
                }
                else
                {
                    //This is a response to our request
                }
                break;

            case "players/sign-out":
                if (newReply.ReferenceID == null)
                {
                    //This is a request from the server
                    string fullSignoutName = string.Format("{0}@{1}", newReply.Payload.game.Value, newReply.Payload.name.Value);

                    foreach (Member user in UserList().Where(usr => usr.Friends.Contains(fullSignoutName)))
                    {
                        user.WriteTo(string.Format("{0} has logged out of GOSSIP.", fullSignoutName));
                    }
                }
                else
                {
                    //This is a response to our request
                }
                break;

            case "channels/subscribe":
            case "channels/unsubscribe":
            case "channels/send":
            case "tells/send":
            case "authenticate":
                //These are the "request-response"
                if (newReply.Status.Equals("failure"))
                {
                    //Do something?
                }

                break;

            default:
                //do nothing
                break;
            }
        }
Exemple #3
0
        public void Process()
        {
            NetworkStream stream = null;

            Messages = new List <Message>();
            try
            {
                stream = MyClient.GetStream();
                Name   = Listen(stream);
                Console.WriteLine("Пользователь " + Name + " подключился");
                Send(stream, "Добро пожаловать!");
                int k = 0;
                while (k != 3)
                {
                    k = Convert.ToInt32(Listen(stream));
                    String message = "";
                    switch (k)
                    {
                    case 1:
                        message = "";
                        for (int i = 0; i < Server.Clients.Count; i++)
                        {
                            if (Server.Clients[i].Name != this.Name)
                            {
                                message = message + " " + i.ToString() + " " + Server.Clients[i].Name + " ";
                            }
                        }
                        Send(stream, message);
                        SendToClient(Listen(stream));
                        Send(stream, "Сообщение отправлено");
                        break;

                    case 2:
                        message = "";
                        int num = 0;
                        foreach (Message m in Messages)
                        {
                            num++;
                            message = message + num.ToString() + "." + "Отправитель: " + m.Sender.Name + " Сообщение: " + m.Text + " ";
                        }
                        Send(stream, message);
                        break;

                    case 3:
                        Console.WriteLine("Пользователь " + Name + " отключился");
                        Server.Clients.Remove(this);
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                if (stream != null)
                {
                    stream.Close();
                }
                if (MyClient != null)
                {
                    MyClient.Close();
                }
            }
        }