Beispiel #1
0
        public void ChangeNickName(Client client, string name)
        {
            if (client.name == name)
            {
                client.WriteString("Nickname " + name + " is already your name.");
                return;
            }
            else if (credentials.ContainsKey(name))
            {
                client.WriteString("Nickname " + name + " is already taken.");
                return;
            }

            clients.Remove(client.name);
            clients.Add(name, client);

            if (client.room != null)
            {
                client.room.clients.Remove(client.name);
                client.room.clients.Add(name, client);
            }

            client.WriteString("Changed nickname to: " + name);
            Console.WriteLine("User " + client.name + " changed their nickname to " + name);
            client.name = name;
        }
Beispiel #2
0
        public override int Execute(Client client, string parameter, string[] parameters)
        {
            if (parameters != null)
            {
                if (!server.rooms.ContainsKey(parameters[0]))
                {
                    client.WriteString("Room " + parameters[0] + " does not exist.");
                    return(0);
                }

                if (parameters.Length > 1)
                {
                    server.MoveClientToRoom(client, server.rooms[parameters[0]], parameters[1]);
                }
                else
                {
                    server.MoveClientToRoom(client, server.rooms[parameters[0]], "");
                }
            }
            else
            {
                client.WriteString("0 parameters found, 1 or 2 expected");
            }

            return(0);
        }
Beispiel #3
0
        public override int Execute(Client client, string parameter, string[] parameters)
        {
            if (parameters == null)
            {
                string commands = "Commands:";
                foreach (string command in server.commands.Keys)
                {
                    if (command != "reconfirm")
                    {
                        commands += "\n\t" + command;
                    }
                }

                commands += "\n\n use /help followed by a command name for more information.";

                client.WriteString(commands);
            }
            else
            {
                if (server.commands.ContainsKey(parameters[0]))
                {
                    client.WriteString("\n" + server.commands[parameters[0]].GetInfo());
                }
                else
                {
                    client.WriteString("Command " + parameters[0] + " is unknown.");
                }
            }

            return(0);
        }
Beispiel #4
0
        public override int Execute(Client client, string parameter, string[] parameters)
        {
            if (parameters == null)
            {
                client.WriteString("0 parameters found, 1 or 2 expected");
                return(0);
            }
            string roomName = parameters[0];

            if (server.rooms.ContainsKey(roomName))
            {
                client.WriteString("Room " + roomName + " already exists.");
                return(0);
            }

            string password = "";

            if (parameters.Length > 1)
            {
                password = parameters[1];
            }

            Room room = new Room(client, roomName, password);

            server.rooms.Add(roomName, room);

            server.MoveClientToRoom(client, room, password);
            return(0);
        }
Beispiel #5
0
        public void RemoveClient(Client client)
        {
            if (!clients.ContainsKey(client.name))
            {
                return;
            }

            client.WriteString("Disconnected from room " + name);

            Console.WriteLine(client.name + " has disconnected from room " + name);

            clients.Remove(client.name);
            client.room = null;

            bool transfer = (client == owner && clients.Count > 0);

            if (transfer)
            {
                owner = clients.ElementAt(0).Value;
            }

            foreach (var other in clients)
            {
                other.Value.WriteString(client.name + " has left the room.");

                if (transfer)
                {
                    other.Value.WriteString("Transfered ownership to " + owner.name);
                }
            }
        }
Beispiel #6
0
        public override int Execute(Client client, string parameter, string[] parameters)
        {
            if (client.room == null)
            {
                client.WriteString("You're currently not in a room.");
            }
            else
            {
                string list = "Users in room " + client.room.name + ":";

                foreach (string name in client.room.clients.Keys)
                {
                    list += "\n\t" + name;
                }

                client.WriteString(list);
            }

            return(0);
        }
Beispiel #7
0
        public override int Execute(Client client, string parameter, string[] parameters)
        {
            if (parameters == null || parameters.Length < 2)
            {
                client.WriteString("This command requires at least 2 parameters.");
                return(0);
            }

            if (!server.clients.ContainsKey(parameters[0]))
            {
                client.WriteString("User " + parameters[0] + " cannot be found.");
                return(0);
            }

            string message = parameter.Substring(parameter.IndexOf(' ') + 1);

            server.clients[parameters[0]].WriteString(client.name + " whispered: " + message);
            client.WriteString("You whispered to " + parameters[0] + ": " + message);

            return(0);
        }
Beispiel #8
0
        public override int Execute(Client client, string parameter, string[] parameters)
        {
            string list = "Rooms:";

            foreach (string roomName in server.GetRoomList())
            {
                list += "\n\t" + roomName;
            }

            client.WriteString(list);
            return(0);
        }
Beispiel #9
0
        public override int Execute(Client client, string parameter, string[] parameters)
        {
            string list = "All users:";

            foreach (string name in server.GetClientList())
            {
                list += "\n\t" + name;
            }

            client.WriteString(list);

            return(0);
        }
Beispiel #10
0
        public void MoveClientToRoom(Client client, Room room, string password)
        {
            if (room.password != password)
            {
                client.WriteString("Incorrect password");
                Console.WriteLine(client.name + " tried to join " + room.name + " with the wrong password.");
                return;
            }

            DisconnectClientFromRoom(client);

            room.AddClient(client);
            client.room = room;
        }
Beispiel #11
0
        public void DisconnectClient(Client client)
        {
            DisconnectClientFromRoom(client);

            client.WriteString("/disconnect");
            client.Close();

            clientListMutex.WaitOne();
            if (clients.ContainsKey(client.name))
            {
                clients.Remove(client.name);
            }
            clientListMutex.ReleaseMutex();

            Console.WriteLine("Disconnected client: " + client.name);
        }
Beispiel #12
0
        public override int Execute(Client client, string parameter, string[] parameters)
        {
            if (parameters == null)
            {
                client.WriteString("0 parameters found, 1 expected");
                return(0);
            }

            string nick = parameters[0];

            nick = nick.ToLower();

            server.ChangeNickName(client, nick);

            return(-1);
        }
Beispiel #13
0
        public void AddClient(Client client)
        {
            if (clients.ContainsKey(client.name))
            {
                return;
            }

            client.WriteString("Welcome to room " + name + "!");
            Console.WriteLine(client.name + "has joined room " + name);

            foreach (var other in clients)
            {
                other.Value.WriteString("Welcome " + client.name + " to the room!");
            }

            clients.Add(client.name, client);
        }
Beispiel #14
0
        public void HandleNewClients()
        {
            while (!exit)
            {
                if (!listener.Pending())
                {
                    Thread.Sleep(100);
                    continue;
                }

                Client client = new Client(listener.AcceptTcpClient());

                string message = client.ReadString();

                if (message.StartsWith("/"))
                {
                    int paramToken = message.IndexOf(' ');
                    if (paramToken == 0)
                    {
                        continue;
                    }

                    string   command;
                    string[] parameters = null;
                    string   parameter  = "";

                    if (paramToken < 0)
                    {
                        command = message.Substring(1);
                    }
                    else
                    {
                        command   = message.Substring(1, paramToken - 1);
                        parameter = message.Substring(paramToken + 1);
                        if (parameter.Contains(" "))
                        {
                            parameters = parameter.Split(' ');
                        }
                    }

                    if (command == "login" && parameters.Length == 2)
                    {
                        if (credentials.ContainsKey(parameters[0]))
                        {
                            if (credentials[parameters[0]] == parameters[1])
                            {
                                clientListMutex.WaitOne();
                                if (clients.ContainsKey(parameters[0]))
                                {
                                    DisconnectClient(parameters[0]);
                                }
                                clients.Add(parameters[0], client);
                                clientListMutex.ReleaseMutex();

                                client.name = parameters[0];
                                client.WriteString("/accept");
                                Console.WriteLine("Accepted known client " + parameters[0] + '.');
                                client.WriteString("Welcome " + parameters[0] + "!");

                                MoveClientToRoom(client, rooms["global"], "");
                            }
                            else
                            {
                                client.WriteString("Incorrect password, you've been disconnected from the server");
                                Console.WriteLine("Incorrect password for user: "******"Credentials unknown, do you want to make a new account? Please type \"yes\"");

                            bool processed = false;
                            while (!processed && !exit)
                            {
                                if (client.Available == 0)
                                {
                                    continue;
                                }

                                string confirmationMessage = client.ReadString();
                                if (confirmationMessage == "yes")
                                {
                                    credentials.Add(parameters[0], parameters[1]);

                                    clientListMutex.WaitOne();
                                    clients.Add(parameters[0], client);
                                    clientListMutex.ReleaseMutex();

                                    client.name = parameters[0];
                                    client.WriteString("/accept");
                                    Console.WriteLine("Accepted new client " + parameters[0] + '.');
                                    client.WriteString("Welcome " + parameters[0] + "!");

                                    MoveClientToRoom(client, rooms["global"], "");

                                    client.timeout = 0;
                                    processed      = true;
                                }
                                else
                                {
                                    Console.WriteLine("Refused new account");
                                    DisconnectClient(client);
                                    processed = true;
                                }
                            }
                        }
                    }
                    else
                    {
                        client.WriteString("Something went wrong, you've been disconnected from the server");
                        Console.WriteLine("unknown command " + command + parameter);
                        DisconnectClient(client);
                    }
                }
            }
        }
Beispiel #15
0
        public void UpdateClients()
        {
            stopwatch = new Stopwatch();
            stopwatch.Start();
            float previousFrame = 0;

            while (!exit)
            {
                float currentTime = stopwatch.ElapsedTicks / (float)Stopwatch.Frequency;
                float deltaTime   = currentTime - previousFrame;
                previousFrame = currentTime;

                for (int i = 0; i < clients.Count; i++)
                {
                    Client client = clients.ElementAt(i).Value;
                    client.timeout += deltaTime;
                    if (client.timeout > 5f)
                    {
                        todisconnect.Add(client.name);
                    }
                }

                clientListMutex.WaitOne();
                for (int i = 0; i < todisconnect.Count; i++)
                {
                    string name = todisconnect[i];

                    DisconnectClient(name);
                }
                clientListMutex.ReleaseMutex();

                todisconnect.Clear();

                //Second big change, instead of blocking on one client,
                //we now process all clients IF they have data available
                for (int i = 0; i < clients.Count; i++)
                {
                    if (i >= clients.Count || i < 0)
                    {
                        continue;
                    }

                    Client client = clients.ElementAt(i).Value;

                    if (client.Available == 0)
                    {
                        continue;
                    }

                    string message = client.ReadString();

                    if (message.StartsWith("/"))
                    {
                        i += HandleCommand(message, client);
                    }
                    else
                    {
                        client.WriteString("You said: " + message);
                        message = client.name + " says: " + message;

                        if (client.room != null)
                        {
                            foreach (var other in client.room.clients)
                            {
                                if (other.Key == client.name)
                                {
                                    continue;
                                }
                                other.Value.WriteString(message);
                            }
                            message += " in room " + client.room.name;
                        }

                        Console.WriteLine(message);
                    }
                }

                foreach (string roomName in todestroy)
                {
                    rooms.Remove(roomName);
                }

                //Although technically not required, now that we are no longer blocking,
                //it is good to cut your CPU some slack
                //Thread.Sleep(100);
            }
        }