public override void HandleCommand(IWebSocketConnection socket, RemoteConnectionInfo info, Room room) { if (Args.Length > 0) { var command = CommandManager.GetCommand(Args[0].ToLower()); if (command != null) { var capitalized = command.Command.Capitalize(); socket.GetInfo().SendChatMessage(capitalized + ": " + command.HelpString); socket.GetInfo().SendChatMessage("Minimum required arguments: " + command.MinimumArgCount); } else { socket.GetInfo().SendChatMessage("There is no command with this name.", Helper.ServerErrorColor); } } else { string result = "-- Commands --\n"; foreach (var command in CommandManager.GetCommands()) { result += "• " + command.Command.Capitalize() + ": " + command.HelpString + "\n"; } result += "-- End of commands --"; info.SendChatMessage(result); } }
public void RemoveSocket(IWebSocketConnection socket) { if (!Sockets.Contains(socket)) { return; } socket.GetInfo().RoomName = null; Sockets.Remove(socket); SendRemoveUserToAll(socket); SendChatMessageToAll(socket.GetInfo().Name + " left the room."); if (socket == Owner) { var newOwner = NextOwner ?? Sockets.FirstOrDefault(); if (newOwner != null) { Owner = newOwner; newOwner.GetInfo().SendSetOwner(); newOwner.GetInfo().SendChatMessage("You are now the proud owner of " + RoomName + "!", Helper.ServerRoomColor); } } else if (socket == NextOwner) { NextOwner = null; Owner.GetInfo().SendChatMessage("Caution: the next owner left the room.", Helper.ServerRoomColor); } }
public void KickUser(IWebSocketConnection user) { if (Sockets.Contains(user)) { RemoveSocket(user); user.GetInfo().SendChatMessage("You have been kicked from the room.", Helper.ServerErrorColor); } SendChatMessageToAll(user.GetInfo().Name + " was kicked from the room."); }
private void OnMessage(string data, IWebSocketConnection socket) { //Console.WriteLine("Message: " + data); Dictionary <string, object> dict; try { dict = JsonConvert.DeserializeObject <Dictionary <string, object> >(data); } catch (Exception ex) { var info = socket.GetInfo(); if (info != null) { //socket.GetInfo().SendChatMessage("Invalid data received! (" + ex.Message +")", Helper.ServerExceptionColor); info.SendDisconnect("Invalid data received. (" + ex.Message + ")", Helper.ServerExceptionColor); } socket.Close(); return; } try { if (!PacketManager.HandlePacket((string)dict["intent"], socket, dict)) { socket.GetInfo().SendChatMessage("Failed to handle packet: " + (string)dict["intent"]); } } catch (Exception ex) { var info = socket.GetInfo(); if (info != null) { //info.SendChatMessage("Invalid request! (" + ex.Message + ")", Helper.ServerExceptionColor); info.SendDisconnect("Invalid request. (" + ex + ")", Helper.ServerExceptionColor); Console.WriteLine("(" + Helper.IPString(socket) + ")\n" + ex); Directory.CreateDirectory("Errors"); var file = File.CreateText("Errors/" + DateTime.Now.ToString("yyyy_MM_dd-HH-mm-ss--fff") + ".txt"); file.WriteLine(Helper.IPString(socket)); file.WriteLine("\r\nException: " + ex); file.WriteLine("\r\nStacktrace: " + ex.StackTrace); file.WriteLine("\r\nMethod name: " + ex.TargetSite.Name); file.WriteLine("\r\nConnection info: " + JsonConvert.SerializeObject(socket.ConnectionInfo)); file.WriteLine("\r\nData: " + data); file.Close(); } socket.Close(); } }
public static bool RemoveUserFromRoom(IWebSocketConnection socket, string roomName) { if (!Exists(roomName)) { return(false); } var info = socket.GetInfo(); var room = info.RoomName != null ? Rooms[info.RoomName] : null; if (room != null) { if (!room.Sockets.Contains(socket)) { return(true); } room.RemoveSocket(socket); if (room.Sockets.Count == 0) { room.UpdateCurrentPlayingVideoThread.Abort(); Rooms.Remove(room.RoomName); } } return(true); }
public static bool AddUserToRoom(IWebSocketConnection socket, string roomName) { if (!Exists(roomName)) { return(false); } var info = socket.GetInfo(); var oldRoom = info.RoomName != null ? Rooms[info.RoomName] : null; var newRoom = Rooms[roomName]; if (newRoom == oldRoom) { return(true); } if (oldRoom != null) { RemoveUserFromRoom(socket, oldRoom.RoomName); } // Change name if a user with this name already exists in the new room. Helper.VerifyFixUsername(newRoom, info); newRoom.AddSocket(socket); return(true); }
public void AddSocket(IWebSocketConnection socket) { if (socket == null) { throw new ArgumentNullException("socket"); } if (Sockets.Contains(socket)) { return; } socket.GetInfo().RoomName = RoomName; Sockets.Add(socket); Helper.SendQuick(socket, new Dictionary <string, object> { { "intent", "newRoom" }, { "message", "Changed room to " + RoomName + "." }, { "color", Helper.ServerMessageColor }, { "history", ChatHistory }, { "owner", socket == Owner }, { "roomName", RoomName }, { "users", Sockets.Select(s => { var info = s.GetInfo(); return(new object[] { info.ID, info.Name }); }).ToArray() }, }); SendUserToAll(socket); if (CurrentPlayingVideo != null) { socket.GetInfo().SendSetVideo(CurrentVideo, CurrentPlayingVideo.PlayState, CurrentPlayingVideo.ElapsedSeconds); } socket.GetInfo().SendRoomPlaylist(); SendChatMessageToAll(socket.GetInfo().Name + " joined the room. (" + RoomName + ")"); }
public void SendRemoveUser(IWebSocketConnection user) { var info = user.GetInfo(); Helper.SendQuick(Socket, new Dictionary <string, object> { { "intent", "removeUser" }, { "id", info.ID }, }); }
public static bool HandleCommand(string command, IWebSocketConnection socket) { if (!command.StartsWith("/") || command.Trim() == "/") { return(false); } var args = command.Substring(command.EndIndexOf("/ ")).Split(' '); if (args.Length > 1) { args = args.Skip(1).ToArray(); } else { args = new string[] {} }; var commandName = command.Split(' ')[0]; commandName = commandName.Substring(1).ToLower(); if (chatCommands.ContainsKey(commandName)) { if (args.Length >= chatCommands[commandName].MinimumArgCount) { chatCommands[commandName].Args = args; var info = socket.GetInfo(); var room = info != null?info.GetRoom() : null; chatCommands[commandName].HandleCommand(socket, info, room); } else { socket.GetInfo().SendChatMessage("Not enough arguments: " + chatCommands[commandName].NotEnoughArgumentsString, Helper.ServerErrorColor); } return(true); } return(false); }
public override void HandlePacket(Dictionary <string, object> data, IWebSocketConnection socket, RemoteConnectionInfo info, Room room, ref List <IWebSocketConnection> allSockets) { var name = data["name"] as string; if (name == "") { name = socket.ConnectionInfo.ClientIpAddress; } socket.SetInfo(new RemoteConnectionInfo(name, socket, Helper.GetMD5(name + DateTime.Now.ToLongTimeString()))); Helper.SendQuick(socket, new Dictionary <string, object> { { "intent", "connectResult" }, { "success", true }, { "myName", name }, { "id", socket.GetInfo().ID }, }); if (data.ContainsKey("room")) { var roomName = data["room"] as string; if (roomName != null) { if (Helper.VerifyName(roomName)) { if (RoomManager.Exists(roomName)) { Helper.VerifyFixUsername(RoomManager.Rooms[roomName], socket.GetInfo()); RoomManager.AddUserToRoom(socket, roomName); } else { RoomManager.CreateRoom(roomName, socket); } } } } Console.WriteLine(name + "(" + Helper.IPString(socket) + ") connected"); }
private void OnClose(IWebSocketConnection socket) { Sockets.Remove(socket); var info = socket.GetInfo(); if (info != null) { Console.WriteLine(info.Name + "(" + Helper.IPString(socket) + ") disconnected."); RoomManager.ClearUser(socket); } //Console.WriteLine("OnClose: " + Helper.IPString(socket)); //Console.WriteLine("Connection count: " + Sockets.Count); }
public static bool HandlePacket(string intent, IWebSocketConnection socket, Dictionary <string, object> data) { if (packets.ContainsKey(intent)) { // If any parameter in RequiredParameters doesn't exist in the incoming packet data, return false. if (packets[intent].RequiredParams.Any(keyParam => !data.ContainsKey(keyParam))) { return(false); } var info = socket.GetInfo(); packets[intent].HandlePacket(data, socket, info, info != null // room param ? info.GetRoom() : null, ref syncHandler.Sockets); return(true); } Console.WriteLine("Unhandled packet: " + intent); return(false); }