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; }
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); }
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); }
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); }
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); } } }
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); }
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); }
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); }
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); }
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; }
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); }
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); }
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); }
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); } } } }
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); } }