Exemplo n.º 1
0
        private void ServerCommandHandler(int source, List <object> args, string rawCommand)
        {
            if (args != null)
            {
                if (args.Count > 0)
                {
                    if (args[0].ToString().ToLower() == "debug")
                    {
                        DebugMode = !DebugMode;
                        if (source < 1)
                        {
                            Debug.WriteLine($"Debug mode is now set to: {DebugMode}.");
                        }
                        else
                        {
                            Players[source].TriggerEvent("chatMessage", $"aMenu Debug mode is now set to: {DebugMode}.");
                        }
                        return;
                    }
                    else if (args[0].ToString().ToLower() == "unban" && (source < 1))
                    {
                        if (args.Count() > 1 && !string.IsNullOrEmpty(args[1].ToString()))
                        {
                            var uuid      = args[1].ToString().Trim();
                            var bans      = BanManager.GetBanList();
                            var banRecord = bans.Find(b => { return(b.uuid.ToString() == uuid); });
                            if (banRecord != null)
                            {
                                BanManager.RemoveBan(banRecord);
                                Debug.WriteLine("Player has been successfully unbanned.");
                            }
                            else
                            {
                                Debug.WriteLine($"Could not find a banned player with the provided uuid '{uuid}'.");
                            }
                        }
                        else
                        {
                            Debug.WriteLine("You did not specify a player to unban, you must enter the FULL playername. Usage: vmenuserver unban \"playername\"");
                        }
                        return;
                    }
                    else if (args[0].ToString().ToLower() == "weather")
                    {
                        if (args.Count < 2 || string.IsNullOrEmpty(args[1].ToString()))
                        {
                            Debug.WriteLine("[aMenu] Invalid command syntax. Use 'vmenuserver weather <weatherType>' instead.");
                        }
                        else
                        {
                            string wtype = args[1].ToString().ToUpper();
                            if (WeatherTypes.Contains(wtype))
                            {
                                TriggerEvent("vMenu:UpdateServerWeather", wtype, BlackoutEnabled, DynamicWeatherEnabled);
                                Debug.WriteLine($"[aMenu] Weather is now set to: {wtype}");
                            }
                            else if (wtype.ToLower() == "dynamic")
                            {
                                if (args.Count == 3 && !string.IsNullOrEmpty(args[2].ToString()))
                                {
                                    if ((args[2].ToString().ToLower() ?? $"{DynamicWeatherEnabled}") == "true")
                                    {
                                        TriggerEvent("vMenu:UpdateServerWeather", CurrentWeather, BlackoutEnabled, true);
                                        Debug.WriteLine("[aMenu] Dynamic weather is now turned on.");
                                    }
                                    else if ((args[2].ToString().ToLower() ?? $"{DynamicWeatherEnabled}") == "false")
                                    {
                                        TriggerEvent("vMenu:UpdateServerWeather", CurrentWeather, BlackoutEnabled, false);
                                        Debug.WriteLine("[aMenu] Dynamic weather is now turned off.");
                                    }
                                    else
                                    {
                                        Debug.WriteLine("[aMenu] Invalid command usage. Correct syntax: vmenuserver weather dynamic <true|false>");
                                    }
                                }
                                else
                                {
                                    Debug.WriteLine("[aMenu] Invalid command usage. Correct syntax: vmenuserver weather dynamic <true|false>");
                                }
                            }
                            else
                            {
                                Debug.WriteLine("[aMenu] This weather type is not valid!");
                            }
                        }
                    }
                    else if (args[0].ToString().ToLower() == "time")
                    {
                        if (args.Count == 2)
                        {
                            if (args[1].ToString().ToLower() == "freeze")
                            {
                                TriggerEvent("vMenu:UpdateServerTime", CurrentHours, CurrentMinutes, !FreezeTime);
                                Debug.WriteLine($"Time is now {(FreezeTime ? "frozen" : "not frozen")}.");
                            }
                            else
                            {
                                Debug.WriteLine("Invalid syntax. Use: ^5vmenuserver time <freeze|<hour> <minute>>^7 instead.");
                            }
                        }
                        else if (args.Count > 2)
                        {
                            if (int.TryParse(args[1].ToString(), out int hour))
                            {
                                if (int.TryParse(args[2].ToString(), out int minute))
                                {
                                    if (hour >= 0 && hour < 24)
                                    {
                                        if (minute >= 0 && minute < 60)
                                        {
                                            TriggerEvent("vMenu:UpdateServerTime", hour, minute, FreezeTime);
                                            Debug.WriteLine($"Time is now {(hour < 10 ? ("0" + hour.ToString()) : hour.ToString())}:{(minute < 10 ? ("0" + minute.ToString()) : minute.ToString())}.");
                                        }
                                        else
                                        {
                                            Debug.WriteLine("Invalid minute provided. Value must be between 0 and 59.");
                                        }
                                    }
                                    else
                                    {
                                        Debug.WriteLine("Invalid hour provided. Value must be between 0 and 23.");
                                    }
                                }
                                else
                                {
                                    Debug.WriteLine("Invalid syntax. Use: ^5vmenuserver time <freeze|<hour> <minute>>^7 instead.");
                                }
                            }
                            else
                            {
                                Debug.WriteLine("Invalid syntax. Use: ^5vmenuserver time <freeze|<hour> <minute>>^7 instead.");
                            }
                        }
                        else
                        {
                            Debug.WriteLine("Invalid syntax. Use: ^5vmenuserver time <freeze|<hour> <minute>>^7 instead.");
                        }
                    }
                    else if (args[0].ToString().ToLower() == "ban" && source < 1)  // only do this via server console (server id < 1)
                    {
                        if (args.Count > 3)
                        {
                            Player p = null;

                            bool   findByServerId = args[1].ToString().ToLower() == "id";
                            string identifier     = args[2].ToString().ToLower();

                            if (findByServerId)
                            {
                                if (Players.Any(player => player.Handle == identifier))
                                {
                                    p = Players.Single(pl => pl.Handle == identifier);
                                }
                                else
                                {
                                    Debug.WriteLine("[aMenu] Could not find this player, make sure they are online.");
                                    return;
                                }
                            }
                            else
                            {
                                if (Players.Any(player => player.Name.ToLower() == identifier.ToLower()))
                                {
                                    p = Players.Single(pl => pl.Name.ToLower() == identifier.ToLower());
                                }
                                else
                                {
                                    Debug.WriteLine("[aMenu] Could not find this player, make sure they are online.");
                                    return;
                                }
                            }

                            string reason = "Banned by staff for:";
                            args.GetRange(3, args.Count - 3).ForEach(arg => reason += " " + arg);

                            if (p != null)
                            {
                                BanManager.BanRecord ban = new BanManager.BanRecord(
                                    BanManager.GetSafePlayerName(p.Name),
                                    p.Identifiers.ToList(),
                                    new DateTime(3000, 1, 1),
                                    reason,
                                    "Server Console",
                                    new Guid()
                                    );

                                BanManager.AddBan(ban);
                                BanManager.BanLog($"[aMenu] Player {p.Name}^7 has been banned by Server Console for [{reason}].");
                                TriggerEvent("vMenu:BanSuccessful", JsonConvert.SerializeObject(ban).ToString());
                                string timeRemaining = BanManager.GetRemainingTimeMessage(ban.bannedUntil.Subtract(DateTime.Now));
                                p.Drop($"You are banned from this server. Ban time remaining: {timeRemaining}. Banned by: {ban.bannedBy}. Ban reason: {ban.banReason}. Additional information: {vMenuShared.ConfigManager.GetSettingsString(vMenuShared.ConfigManager.Setting.vmenu_default_ban_message_information)}.");
                            }
                            else
                            {
                                Debug.WriteLine("[aMenu] Player not found, could not ban player.");
                            }
                        }
                        else
                        {
                            Debug.WriteLine("[aMenu] Not enough arguments, syntax: ^5vmenuserver ban <id|name> <server id|username> <reason>^7.");
                        }
                    }
                    else if (args[0].ToString().ToLower() == "help")
                    {
                        Debug.WriteLine("Available commands:");
                        Debug.WriteLine("(server console only): vmenuserver ban <id|name> <server id|username> <reason> (player must be online!)");
                        Debug.WriteLine("(server console only): vmenuserver unban <uuid>");
                        Debug.WriteLine("vmenuserver weather <new weather type | dynamic <true | false>>");
                        Debug.WriteLine("vmenuserver time <freeze|<hour> <minute>>");
                        Debug.WriteLine("vmenuserver migrate (This copies all banned players in the bans.json file to the new ban system in vMenu v3.3.0, you only need to do this once)");
                    }
                    else if (args[0].ToString().ToLower() == "migrate" && source < 1)
                    {
                        string file = LoadResourceFile(GetCurrentResourceName(), "bans.json");
                        if (string.IsNullOrEmpty(file) || file == "[]")
                        {
                            Debug.WriteLine("&1[aMenu] [ERROR]^7 No bans.json file found or it's empty.");
                            return;
                        }
                        Debug.WriteLine("^5[aMenu] [INFO]^7 Importing all ban records from the bans.json file into the new storage system. ^3This may take some time...^7");
                        var bans = JsonConvert.DeserializeObject <List <BanManager.BanRecord> >(file);
                        bans.ForEach((br) =>
                        {
                            var record = new BanManager.BanRecord(br.playerName, br.identifiers, br.bannedUntil, br.banReason, br.bannedBy, Guid.NewGuid());
                            BanManager.AddBan(record);
                        });
                        Debug.WriteLine("^2[aMenu] [SUCCESS]^7 All ban records have been imported. You now no longer need the bans.json file.");
                    }
                    else
                    {
                        Debug.WriteLine($"vMenu is currently running version: {Version}. Try ^5vmenuserver help^7 for info.");
                    }
                }
                else
                {
                    Debug.WriteLine($"vMenu is currently running version: {Version}. Try ^5vmenuserver help^7 for info.");
                }
            }
            else
            {
                Debug.WriteLine($"vMenu is currently running version: {Version}. Try ^5vmenuserver help^7 for info.");
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Constructor.
        /// </summary>
        public MainServer()
        {
            #region command
            RegisterCommand("vmenuserver", new Action <int, List <object>, string>(async(int source, List <object> args, string rawCommand) =>
            {
                if (args != null)
                {
                    if (args.Count > 0)
                    {
                        if (args[0].ToString().ToLower() == "debug")
                        {
                            DebugMode = !DebugMode;
                            if (source < 1)
                            {
                                Debug.WriteLine($"Debug mode is now set to: {DebugMode}.");
                            }
                            else
                            {
                                Players[source].TriggerEvent("chatMessage", $"vMenu Debug mode is now set to: {DebugMode}.");
                            }
                            return;
                        }
                        else if (args[0].ToString().ToLower() == "unban" && (source < 1))
                        {
                            if (args.Count() > 1 && !string.IsNullOrEmpty(args[1].ToString()))
                            {
                                string name   = args[1].ToString().Trim();
                                name          = name.Replace("\"", "");
                                name          = BanManager.GetSafePlayerName(name);
                                var bans      = await BanManager.GetBanList();
                                var banRecord = bans.Find(b => { return(b.playerName == name); });
                                if (banRecord.playerName != null)
                                {
                                    if (await BanManager.RemoveBan(banRecord))
                                    {
                                        Debug.WriteLine("Player has been successfully unbanned.");
                                    }
                                    else
                                    {
                                        Debug.WriteLine("Could not unban the player, are you sure this player is actually banned?");
                                    }
                                }
                                else
                                {
                                    Debug.WriteLine($"Could not find a banned player by the name of '{name}'.");
                                }
                                bans = null;
                            }
                            else
                            {
                                Debug.WriteLine("You did not specify a player to unban, you must enter the FULL playername. Usage: vmenuserver unban \"playername\"");
                            }
                            return;
                        }
                        else if (args[0].ToString().ToLower() == "weather")
                        {
                            if (args.Count < 2 || string.IsNullOrEmpty(args[1].ToString()))
                            {
                                Debug.WriteLine("[vMenu] Invalid command syntax. Use 'vmenuserver weather <weatherType>' instead.");
                            }
                            else
                            {
                                string wtype = args[1].ToString().ToUpper();
                                if (weatherTypes.Contains(wtype))
                                {
                                    TriggerEvent("vMenu:UpdateServerWeather", wtype, blackout, dynamicWeather);
                                    Debug.WriteLine($"[vMenu] Weather is now set to: {wtype}");
                                }
                                else if (wtype.ToLower() == "dynamic")
                                {
                                    if (args.Count == 3 && !string.IsNullOrEmpty(args[2].ToString()))
                                    {
                                        if ((args[2].ToString().ToLower() ?? $"{dynamicWeather}") == "true")
                                        {
                                            TriggerEvent("vMenu:UpdateServerWeather", currentWeather, blackout, true);
                                            Debug.WriteLine("[vMenu] Dynamic weather is now turned on.");
                                        }
                                        else if ((args[2].ToString().ToLower() ?? $"{dynamicWeather}") == "false")
                                        {
                                            TriggerEvent("vMenu:UpdateServerWeather", currentWeather, blackout, false);
                                            Debug.WriteLine("[vMenu] Dynamic weather is now turned off.");
                                        }
                                        else
                                        {
                                            Debug.WriteLine("[vMenu] Invalid command usage. Correct syntax: vmenuserver weather dynamic <true|false>");
                                        }
                                    }
                                    else
                                    {
                                        Debug.WriteLine("[vMenu] Invalid command usage. Correct syntax: vmenuserver weather dynamic <true|false>");
                                    }
                                }
                                else
                                {
                                    Debug.WriteLine("[vMenu] This weather type is not valid!");
                                }
                            }
                        }
                        else if (args[0].ToString().ToLower() == "time")
                        {
                            if (args.Count == 2)
                            {
                                if (args[1].ToString().ToLower() == "freeze")
                                {
                                    TriggerEvent("vMenu:UpdateServerTime", currentHours, currentMinutes, !freezeTime);
                                    Debug.WriteLine($"Time is now {(freezeTime ? "frozen" : "not frozen")}.");
                                }
                                else
                                {
                                    Debug.WriteLine("Invalid syntax. Use: ^5vmenuserver time <freeze|<hour> <minute>>^7 instead.");
                                }
                            }
                            else if (args.Count > 2)
                            {
                                if (int.TryParse(args[1].ToString(), out int hour))
                                {
                                    if (int.TryParse(args[2].ToString(), out int minute))
                                    {
                                        if (hour >= 0 && hour < 24)
                                        {
                                            if (minute >= 0 && minute < 60)
                                            {
                                                TriggerEvent("vMenu:UpdateServerTime", hour, minute, freezeTime);
                                                Debug.WriteLine($"Time is now {(hour < 10 ? ("0" + hour.ToString()) : hour.ToString())}:{(minute < 10 ? ("0" + minute.ToString()) : minute.ToString())}.");
                                            }
                                            else
                                            {
                                                Debug.WriteLine("Invalid minute provided. Value must be between 0 and 59.");
                                            }
                                        }
                                        else
                                        {
                                            Debug.WriteLine("Invalid hour provided. Value must be between 0 and 23.");
                                        }
                                    }
                                    else
                                    {
                                        Debug.WriteLine("Invalid syntax. Use: ^5vmenuserver time <freeze|<hour> <minute>>^7 instead.");
                                    }
                                }
                                else
                                {
                                    Debug.WriteLine("Invalid syntax. Use: ^5vmenuserver time <freeze|<hour> <minute>>^7 instead.");
                                }
                            }
                            else
                            {
                                Debug.WriteLine("Invalid syntax. Use: ^5vmenuserver time <freeze|<hour> <minute>>^7 instead.");
                            }
                        }
                        else if (args[0].ToString().ToLower() == "ban" && source < 1)  // only do this via server console (server id < 1)
                        {
                            if (args.Count > 3)
                            {
                                Player p = null;

                                bool findByServerId = args[1].ToString().ToLower() == "id";
                                string identifier   = args[2].ToString().ToLower();

                                if (findByServerId)
                                {
                                    if (Players.Any(player => player.Handle == identifier))
                                    {
                                        p = Players.Single(pl => pl.Handle == identifier);
                                    }
                                    else
                                    {
                                        Debug.WriteLine("[vMenu] Could not find this player, make sure they are online.");
                                        return;
                                    }
                                }
                                else
                                {
                                    if (Players.Any(player => player.Name.ToLower() == identifier.ToLower()))
                                    {
                                        p = Players.Single(pl => pl.Name.ToLower() == identifier.ToLower());
                                    }
                                    else
                                    {
                                        Debug.WriteLine("[vMenu] Could not find this player, make sure they are online.");
                                        return;
                                    }
                                }

                                string reason = "Banned by staff for:";
                                args.GetRange(3, args.Count - 3).ForEach(arg => reason += " " + arg);

                                if (p != null)
                                {
                                    var ban = new BanManager.BanRecord()
                                    {
                                        bannedBy    = "Server Console",
                                        bannedUntil = new DateTime(3000, 1, 1),
                                        banReason   = reason,
                                        identifiers = p.Identifiers.ToList(),
                                        playerName  = BanManager.GetSafePlayerName(p.Name)
                                    };

                                    if (await BanManager.AddBan(ban))
                                    {
                                        BanManager.BanLog($"[vMenu] Player {p.Name}^7 has been banned by Server Console for [{reason}].");
                                        TriggerEvent("vMenu:BanSuccessful", JsonConvert.SerializeObject(ban).ToString());
                                        string timeRemaining = BanManager.GetRemainingTimeMessage(ban.bannedUntil.Subtract(DateTime.Now));
                                        p.Drop($"You are banned from this server. Ban time remaining: {timeRemaining}. Banned by: {ban.bannedBy}. Ban reason: {ban.banReason}. Additional information: {vMenuShared.ConfigManager.GetSettingsString(vMenuShared.ConfigManager.Setting.vmenu_default_ban_message_information)}.");
                                    }
                                    else
                                    {
                                        // ban failed
                                        Debug.WriteLine("[vMenu] Banning player failed, reason unknown.");
                                    }
                                }
                                else
                                {
                                    Debug.WriteLine("[vMenu] Player not found, could not ban player.");
                                }
                            }
                            else
                            {
                                Debug.WriteLine("[vMenu] Not enough arguments, syntax: ^5vmenuserver ban <id|name> <server id|username> <reason>^7.");
                            }
                        }
                        else if (args[0].ToString().ToLower() == "help")
                        {
                            Debug.WriteLine("Available commands:");
                            Debug.WriteLine("(server console only): vmenuserver ban <id|name> <server id|username> <reason>");
                            Debug.WriteLine("(server console only): vmenuserver unban <\"player name\">");
                            Debug.WriteLine("vmenuserver weather <new weather type | dynamic <true | false>>");
                            Debug.WriteLine("vmenuserver time <freeze|<hour> <minute>>");
                        }
                        else if (args[0].ToString().ToLower() == "migrate" && source < 1)
                        {
                            BanManager.MigrateBansToDatabase();
                        }
                        else
                        {
                            Debug.WriteLine($"vMenu is currently running version: {Version}. Try ^5vmenuserver help^7 for info.");
                        }
                    }
                    else
                    {
                        Debug.WriteLine($"vMenu is currently running version: {Version}. Try ^5vmenuserver help^7 for info.");
                    }
                }
                else
                {
                    Debug.WriteLine($"vMenu is currently running version: {Version}. Try ^5vmenuserver help^7 for info.");
                }
            }), true);
            #endregion

            // name check
            if (GetCurrentResourceName() != "vMenu")
            {
                Exception InvalidNameException = new Exception("\r\n\r\n^1[vMenu] INSTALLATION ERROR!\r\nThe name of the resource is not valid. " +
                                                               "Please change the folder name from '^3" + GetCurrentResourceName() + "^1' to '^2vMenu^1' (case sensitive) instead!\r\n\r\n\r\n^7");
                try
                {
                    throw InvalidNameException;
                }
                catch (Exception e)
                {
                    Debug.Write(e.Message);
                }
            }
            else
            {
                // Add event handlers.
                EventHandlers.Add("vMenu:SummonPlayer", new Action <Player, int>(SummonPlayer));
                EventHandlers.Add("vMenu:KillPlayer", new Action <Player, int>(KillPlayer));
                EventHandlers.Add("vMenu:KickPlayer", new Action <Player, int, string>(KickPlayer));
                EventHandlers.Add("vMenu:RequestPermissions", new Action <Player>(vMenuShared.PermissionsManager.SetPermissionsForPlayer));
                EventHandlers.Add("vMenu:UpdateServerWeather", new Action <string, bool, bool>(UpdateWeather));
                EventHandlers.Add("vMenu:UpdateServerWeatherCloudsType", new Action <bool>(UpdateWeatherCloudsType));
                EventHandlers.Add("vMenu:UpdateServerTime", new Action <int, int, bool>(UpdateTime));
                //EventHandlers.Add("vMenu:DisconnectSelf", new Action<Player>(DisconnectSource));
                EventHandlers.Add("vMenu:ClearArea", new Action <float, float, float>(ClearAreaNearPos));
                EventHandlers.Add("vMenu:GetPlayerIdentifiers", new Action <int, NetworkCallbackDelegate>((TargetPlayer, CallbackFunction) =>
                {
                    List <string> data = new List <string>();
                    Players[TargetPlayer].Identifiers.ToList().ForEach(e =>
                    {
                        if (!e.Contains("ip:"))
                        {
                            data.Add(e);
                        }
                    });
                    CallbackFunction(JsonConvert.SerializeObject(data));
                }));
                EventHandlers.Add("vMenu:GetOutOfCar", new Action <Player, int, int>(GetOutOfCar));
                EventHandlers.Add("vMenu:SendMessageToPlayer", new Action <Player, int, string>(SendPrivateMessage));
                EventHandlers.Add("vMenu:PmsDisabled", new Action <Player, string>(NotifySenderThatDmsAreDisabled));
                EventHandlers.Add("vMenu:SaveTeleportLocation", new Action <Player, string>(AddTeleportLocation));


                // check addons file for errors
                string addons = LoadResourceFile(GetCurrentResourceName(), "config/addons.json") ?? "{}";
                try
                {
                    JsonConvert.DeserializeObject <Dictionary <string, List <string> > >(addons);
                    // If the above crashes, then the json is invalid and it'll throw warnings in the console.
                }
                catch (JsonReaderException ex)
                {
                    Debug.WriteLine($"\n\n^1[vMenu] [ERROR] ^7Your addons.json file contains a problem! Error details: {ex.Message}\n\n");
                }

                // check if permissions are setup (correctly)
                if (!GetSettingsBool(Setting.vmenu_use_permissions))
                {
                    Debug.WriteLine("^3[vMenu] [WARNING] vMenu is set up to ignore permissions!\nIf you did this on purpose then you can ignore this warning.\nIf you did not set this on purpose, then you must have made a mistake while setting up vMenu.\nPlease read the vMenu documentation (^5https://docs.vespura.com/vmenu^3).\nMost likely you are not executing the permissions.cfg (correctly).^7");
                }

                // manage weather and time sync stuff for first setup.
                dynamicWeather = GetSettingsBool(Setting.vmenu_enable_dynamic_weather);
                if (GetSettingsInt(Setting.vmenu_dynamic_weather_timer) != -1)
                {
                    dynamicWeatherMinutes = GetSettingsInt(Setting.vmenu_dynamic_weather_timer);
                }

                string defaultWeather = GetSettingsString(Setting.vmenu_default_weather);

                if (!string.IsNullOrEmpty(defaultWeather))
                {
                    if (weatherTypes.Contains(defaultWeather))
                    {
                        currentWeather = defaultWeather;
                    }
                }

                currentHours   = GetSettingsInt(Setting.vmenu_default_time_hour);
                currentHours   = (currentHours >= 0 && currentHours < 24) ? currentHours : 9;
                currentMinutes = GetSettingsInt(Setting.vmenu_default_time_min);
                currentMinutes = (currentMinutes >= 0 && currentMinutes < 60) ? currentMinutes : 0;

                minuteClockSpeed = GetSettingsInt(Setting.vmenu_ingame_minute_duration);
                minuteClockSpeed = (minuteClockSpeed > 0) ? minuteClockSpeed : 2000;

                // Start the loops
                Tick += WeatherLoop;
                Tick += TimeLoop;

                if (GetSettingsBool(Setting.vmenu_bans_use_database) && !string.IsNullOrEmpty(LoadResourceFile(GetCurrentResourceName(), "bans.json")))
                {
                    Log("^3You have setup vMenu to use the SQLite database for storing banned players, however you also have a bans.json file!\nPlease check your configuration and only use ONE of these methods at a time.\nIf you no longer want to use the bans.json file, feel free to delete it after migrating to the database!^7", LogLevel.warning);
                }
            }
        }