/// <summary> /// Sends a private message to another member /// </summary> /// <param name="memberName">Member to message</param> /// <param name="message">Unformatted message to send</param> /// <param name="client">Client sending the message</param> /// <returns>True if member was found and false otherwise</returns> public static bool MessageMember(string memberName, string message, ClientInfo client) { foreach (var curClient in Globals.ClientList) { if (curClient.GetUsername() == memberName) { curClient.MessageClient(FormatMessage(Headers.PrivMsgData, client.GetUsername(), curClient.GetUsername(), message)); client.MessageClient(FormatMessage(Headers.PrivMsgData, client.GetUsername(), curClient.GetUsername(), message)); return(true); } } return(false); }
/// <summary> /// Handles the commands sent from the client to the server /// </summary> /// <param name="command">The command received from the client</param> /// <param name="client">Client that sent the command</param> public static void CommandHandler(string command, ClientInfo client) { // Our format is // COMMAND<EOL>COMMAND DATA<EOF> string[] commandStrings = command.Split(new[] { "<EOL>" }, StringSplitOptions.None); switch (commandStrings[0]) { // Set username // USERNAME<EOL>username<EOF> // Will return // USERNAMERESULT<EOL>TRUE?FALSE?USERNAME<EOL>NOTE<EOF> // USERNAMECHANGE<EOL>OLDUSERNAME<EOL>NEWUSERNAME<EOF> case Headers.Username: string oldUsername = client.GetUsername(); // trim to remove white space from begging and end if (ChangeClientUsername(commandStrings[1].Trim(), client)) { client.MessageClient(FormatMessage(Headers.UsernameResult, "TRUE", client.GetUsername(), "Change successful")); MessageAllClients(FormatMessage(Headers.UsernameChange, oldUsername, client.GetUsername())); // Message all clients of username change } else { client.MessageClient(FormatMessage(Headers.UsernameResult, "FALSE", client.GetUsername(), "Change unsuccessful; username taken")); } break; // Make room // MAKEROOM<EOL>ROOMNANE<EOF> // Will return // MAKEROOMRESULT<EOL>TRUE?FALSE<EOL>NOTE<EOL>ROOMCREATEDNAME<EOF> case Headers.MakeRoom: if (CreateRoom(commandStrings[1].Trim(), client)) { client.MessageClient(FormatMessage(Headers.MakeRoomResult, "TRUE", "Created room successfully", commandStrings[1].Trim())); MessageAllClients(FormatMessage(Headers.GetRoomsResult, GetRoomNameList().ToArray())); // Send all clients all of the rooms } else { client.MessageClient(FormatMessage(Headers.MakeRoomResult, "FALSE", "Error creating room. Room name could be taken")); } break; // Delete room(can only be done by server or client who made it) // REMOVEROOM<EOL>ROOMNAME<EOF> // Will return // REMOVEROOMRESULT<EOL>TRUE?FALSE<EOL>NOTE<EOF> // ROOMREMOVED<EOL>ROOMNAME<EOF> case Headers.RemoveRoom: if (RemoveRoom(commandStrings[1].Trim(), client)) { client.MessageClient(FormatMessage(Headers.RemoveRoomResult, "TRUE", "Removed room successfully")); MessageAllClients(FormatMessage(Headers.RoomRemoved, commandStrings[1].Trim())); // Notify clients that the room was removed } else { client.MessageClient(FormatMessage(Headers.RemoveRoomResult, "FALSE", "Error removing room. Not owner or invalid room name")); } break; // Get all rooms // GETROOMS<EOF> // Will return rooms in format // GETROOMSRESULT<EOL>RM1<EOL>RM2<EOF> case Headers.GetRooms: client.MessageClient(FormatMessage(Headers.GetRoomsResult, GetRoomNameList().ToArray())); break; // Join room // JOINROOM<EOL>ROOMNAME<EOF> // Will return // JOINROOMRESULT<EOL>TRUE?FALSE<EOF> case Headers.JoinRoom: client.MessageClient(AddClientToRoom(commandStrings[1].Trim(), client) ? FormatMessage(Headers.JoinRoomResult, "TRUE") : FormatMessage(Headers.JoinRoomResult, "FALSE")); break; // Leave room // LEAVEROOM<EOL>ROOMNAME<EOF> // Will return // LEAVEROOMRESULT<EOL>TRUE?FALSE<EOF> case Headers.LeaveRoom: client.MessageClient(RemoveClientFromRoom(commandStrings[1].Trim(), client) ? FormatMessage(Headers.LeaveRoomResult, "TRUE") : FormatMessage(Headers.LeaveRoomResult, "FALSE")); break; // Get room members // ROOMMEMBERS<EOL>ROOMNAME<EOF> // Will return // ROOMMEMBERSRESULT<EOL>ROOMNAME<EOL>MEM1<EOL>MEM2<EOF> case Headers.RoomMembers: List <string> roomMembers = new List <string> { commandStrings[1].Trim() }; if (GetRoomMembers(commandStrings[1].Trim(), ref roomMembers)) { client.MessageClient(FormatMessage(Headers.RoomMembersResult, roomMembers.ToArray())); } break; // Message to room // ROOMMSG<EOL>ROOMNAME<EOL>MSG<EOF> // Will return to client // ROOMMSGRETURN<EOL>TRUE?FALSE<EOF> // Will send to all room members // ROOMMSGDATA<EOL>ROOMNAME<EOL>SENDERNAME<EOL>MSG<EOF> // msg will be formatted in <username> CLIENTMSG case Headers.RoomMsg: client.MessageClient(MessageRoomMembers(commandStrings[1].Trim(), commandStrings[2].Trim(), client) ? FormatMessage(Headers.RoomMsgReturn, "TRUE") : FormatMessage(Headers.RoomMsgReturn, "FALSE")); break; // Message from client to client // PRIVMSG<EOL>DESTUSERNAME<EOL>MSG<EOF> // Will return to client // PRIVMSGRETURN<EOL>TRUE?FALSE<EOF> // Will send to dest client // PRIVMSGDATA<EOL>FROMUSERNAME<EOL>TOUSERNAME<EOL>MSG<EOF> case Headers.PrivMsg: client.MessageClient(MessageMember(commandStrings[1].Trim(), commandStrings[2].Trim(), client) ? FormatMessage(Headers.PrivMsgReturn, "TRUE") : FormatMessage(Headers.PrivMsgReturn, "FALSE")); break; // CLIENTDISCONNECTING<EOF> // Will return to all // CLIENTDISCONNECTED<EOL>USERNAME<EOF> case Headers.ClientDisconnecting: RemoveClientFromAll(client); break; // Ping pong // PING<EOF> // Will return // PONG<EOF> case Headers.Ping: client.MessageClient(FormatMessage(Headers.Pong)); break; default: // We don't know the command break; } }