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", $"vChar 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("[vChar] Invalid command syntax. Use 'vmenuserver weather <weatherType>' instead."); } else { string wtype = args[1].ToString().ToUpper(); if (WeatherTypes.Contains(wtype)) { TriggerEvent("vChar:UpdateServerWeather", wtype, BlackoutEnabled, DynamicWeatherEnabled); Debug.WriteLine($"[vChar] 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("vChar:UpdateServerWeather", CurrentWeather, BlackoutEnabled, true); Debug.WriteLine("[vChar] Dynamic weather is now turned on."); } else if ((args[2].ToString().ToLower() ?? $"{DynamicWeatherEnabled}") == "false") { TriggerEvent("vChar:UpdateServerWeather", CurrentWeather, BlackoutEnabled, false); Debug.WriteLine("[vChar] Dynamic weather is now turned off."); } else { Debug.WriteLine("[vChar] Invalid command usage. Correct syntax: vmenuserver weather dynamic <true|false>"); } } else { Debug.WriteLine("[vChar] Invalid command usage. Correct syntax: vmenuserver weather dynamic <true|false>"); } } else { Debug.WriteLine("[vChar] This weather type is not valid!"); } } } else if (args[0].ToString().ToLower() == "time") { if (args.Count == 2) { if (args[1].ToString().ToLower() == "freeze") { TriggerEvent("vChar: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("vChar: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("[vChar] 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("[vChar] 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($"[vChar] Player {p.Name}^7 has been banned by Server Console for [{reason}]."); TriggerEvent("vChar: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: {vCharShared.ConfigManager.GetSettingsString(vCharShared.ConfigManager.Setting.vmenu_default_ban_message_information)}."); } else { Debug.WriteLine("[vChar] Player not found, could not ban player."); } } else { Debug.WriteLine("[vChar] 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 vChar 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[vChar] [ERROR]^7 No bans.json file found or it's empty."); return; } Debug.WriteLine("^5[vChar] [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[vChar] [SUCCESS]^7 All ban records have been imported. You now no longer need the bans.json file."); } else { Debug.WriteLine($"vChar is currently running version: {Version}. Try ^5vmenuserver help^7 for info."); } } else { Debug.WriteLine($"vChar is currently running version: {Version}. Try ^5vmenuserver help^7 for info."); } } else { Debug.WriteLine($"vChar is currently running version: {Version}. Try ^5vmenuserver help^7 for info."); } }