示例#1
0
        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);
            }
        }
示例#2
0
        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);
            }
        }
示例#3
0
        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.");
        }
示例#4
0
        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();
            }
        }
示例#5
0
        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);
        }
示例#6
0
        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);
        }
示例#7
0
        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 },
            });
        }
示例#9
0
        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);
        }
示例#10
0
        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");
        }
示例#11
0
        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);
        }
示例#12
0
        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);
        }