From c19c27c17dc5bff3c5455c31f828f73864cb8e32 Mon Sep 17 00:00:00 2001 From: Terminator_97 <50580453+francesco132@users.noreply.github.com> Date: Mon, 27 Jul 2020 17:39:41 +0200 Subject: [PATCH] 2.1.0 --- README.md | 1 + SCPUtils/Commands/AsnUnwhitelist.cs | 50 +++ SCPUtils/Commands/AsnWhitelist.cs | 50 +++ SCPUtils/Commands/CommandExtensions.cs | 13 + SCPUtils/Commands/Commands.cs | 436 -------------------- SCPUtils/Commands/ConsoleCommands.cs | 256 ------------ SCPUtils/Commands/Help.cs | 28 ++ SCPUtils/Commands/HideBadge.cs | 41 ++ SCPUtils/Commands/Info.cs | 25 ++ SCPUtils/Commands/PlayTime.cs | 73 ++++ SCPUtils/Commands/PlayerInfo.cs | 59 +++ SCPUtils/Commands/PlayerList.cs | 54 +++ SCPUtils/Commands/PlayerReset.cs | 51 +++ SCPUtils/Commands/PlayerResetPreferences.cs | 49 +++ SCPUtils/Commands/RevokeBadge.cs | 52 +++ SCPUtils/Commands/SetBadge.cs | 65 +++ SCPUtils/Commands/SetColor.cs | 98 +++++ SCPUtils/Commands/SetName.cs | 114 +++++ SCPUtils/Commands/ShowBadge.cs | 40 ++ SCPUtils/Configs.cs | 9 +- SCPUtils/Database/Player.cs | 1 + SCPUtils/Functions/EventHandlers.cs | 5 +- SCPUtils/Functions/Extensions.cs | 1 - SCPUtils/Patches/SCPSpeak.cs | 1 - SCPUtils/Plugin.cs | 39 +- SCPUtils/Properties/AssemblyInfo.cs | 6 +- SCPUtils/SCPUtils.csproj | 21 +- 27 files changed, 909 insertions(+), 729 deletions(-) create mode 100644 SCPUtils/Commands/AsnUnwhitelist.cs create mode 100644 SCPUtils/Commands/AsnWhitelist.cs create mode 100644 SCPUtils/Commands/CommandExtensions.cs delete mode 100644 SCPUtils/Commands/Commands.cs delete mode 100644 SCPUtils/Commands/ConsoleCommands.cs create mode 100644 SCPUtils/Commands/Help.cs create mode 100644 SCPUtils/Commands/HideBadge.cs create mode 100644 SCPUtils/Commands/Info.cs create mode 100644 SCPUtils/Commands/PlayTime.cs create mode 100644 SCPUtils/Commands/PlayerInfo.cs create mode 100644 SCPUtils/Commands/PlayerList.cs create mode 100644 SCPUtils/Commands/PlayerReset.cs create mode 100644 SCPUtils/Commands/PlayerResetPreferences.cs create mode 100644 SCPUtils/Commands/RevokeBadge.cs create mode 100644 SCPUtils/Commands/SetBadge.cs create mode 100644 SCPUtils/Commands/SetColor.cs create mode 100644 SCPUtils/Commands/SetName.cs create mode 100644 SCPUtils/Commands/ShowBadge.cs diff --git a/README.md b/README.md index 42b9f4a..d8f8c36 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,7 @@ You can see settings and edit them inside Exiled/port-config.yml file(example Ex | Permisssion | Description | | ------------- | ------------- | | scputils.bypassnickrestriction | Allows to bypass nickname restrictions | +| scputils.help | Show also admin command list in scputils_help command, without this permission only user commands are shown | Pro tip: use scputils_speak.* to allow someone to speak with all the SCPs, set permission to default role to allow everyone to speak with that scp. diff --git a/SCPUtils/Commands/AsnUnwhitelist.cs b/SCPUtils/Commands/AsnUnwhitelist.cs new file mode 100644 index 0000000..c79c13f --- /dev/null +++ b/SCPUtils/Commands/AsnUnwhitelist.cs @@ -0,0 +1,50 @@ +using System; +using CommandSystem; + + +namespace SCPUtils.Commands +{ + [CommandHandler(typeof(RemoteAdminCommandHandler))] + [CommandHandler(typeof(GameConsoleCommandHandler))] + public class AsnUnWhitelist : ICommand + { + + + public string Command { get; } = "scputils_unwhitelist_asn"; + + public string[] Aliases { get; } = new string[] { "asnuw" }; + + public string Description { get; } = "Un-Whitelist a player to disallow him access the server even if ASN is blacklisted!"; + + public bool Execute(ArraySegment arguments, ICommandSender sender, out string response) + { + if (!CommandExtensions.IsAllowed(((CommandSender)sender).SenderId, "scputils.whitelist") || !((CommandSender)sender).FullPermissions) + { + response = " You need a higher administration level to use this command!"; + return false; + } + else if (arguments.Count < 1) + { + response = $"Usage: {Command} "; + return false; + } + + else + { + var target = arguments.Array[1]; + var databasePlayer = target.GetDatabasePlayer(); + + if (databasePlayer == null) + { + response = "Player not found on Database or Player is loading data!"; + return false; + } + + databasePlayer.ASNWhitelisted = false; + Database.LiteDatabase.GetCollection().Update(databasePlayer); + response = "Player has been removed from whitelist!"; + return true; + } + } + } +} diff --git a/SCPUtils/Commands/AsnWhitelist.cs b/SCPUtils/Commands/AsnWhitelist.cs new file mode 100644 index 0000000..a1dfb26 --- /dev/null +++ b/SCPUtils/Commands/AsnWhitelist.cs @@ -0,0 +1,50 @@ +using System; +using CommandSystem; + + +namespace SCPUtils.Commands +{ + [CommandHandler(typeof(RemoteAdminCommandHandler))] + [CommandHandler(typeof(GameConsoleCommandHandler))] + public class AsnWhitelist : ICommand + { + + + public string Command { get; } = "scputils_whitelist_asn"; + + public string[] Aliases { get; } = new string[] { "asnw" }; + + public string Description { get; } = "Whitelist a player to make him access the server even if ASN is blacklisted!"; + + public bool Execute(ArraySegment arguments, ICommandSender sender, out string response) + { + if (!CommandExtensions.IsAllowed(((CommandSender)sender).SenderId, "scputils.whitelist") || !((CommandSender)sender).FullPermissions) + { + response = " You need a higher administration level to use this command!"; + return false; + } + else if (arguments.Count < 1) + { + response = $"Usage: {Command} "; + return false; + } + + else + { + var target = arguments.Array[1]; + var databasePlayer = target.GetDatabasePlayer(); + + if (databasePlayer == null) + { + response = "Player not found on Database or Player is loading data!"; + return false; + } + + databasePlayer.ASNWhitelisted = true; + Database.LiteDatabase.GetCollection().Update(databasePlayer); + response = "Player has been whitelisted!"; + return true; + } + } + } +} diff --git a/SCPUtils/Commands/CommandExtensions.cs b/SCPUtils/Commands/CommandExtensions.cs new file mode 100644 index 0000000..f84d707 --- /dev/null +++ b/SCPUtils/Commands/CommandExtensions.cs @@ -0,0 +1,13 @@ +using Log = Exiled.API.Features.Log; + +namespace SCPUtils.Commands +{ + public static class CommandExtensions + { + public static bool IsAllowed(string sender, string permission) + { + Exiled.API.Features.Player player; + return sender != null && (sender == "GAME CONSOLE" || (player = Exiled.API.Features.Player.Get(sender)) == null || Exiled.Permissions.Extensions.Permissions.CheckPermission(player, permission)); + } + } +} diff --git a/SCPUtils/Commands/Commands.cs b/SCPUtils/Commands/Commands.cs deleted file mode 100644 index 068554e..0000000 --- a/SCPUtils/Commands/Commands.cs +++ /dev/null @@ -1,436 +0,0 @@ -using Exiled.Events.EventArgs; -using System; -using System.Collections.Generic; -using System.Linq; -using Log = Exiled.API.Features.Log; - -namespace SCPUtils -{ - - public class Commands - { - private readonly List validColors = new List { "pink", "red", "default", "brown", "silver", "light_green", "crismon", "cyan", "aqua", "deep_pink", "tomato", "yellow", "magenta", "blue_green", "orange", "lime", "green", "emerald", "carmine", "nickel", "mint", "army_green", "pumpkin" }; - public void OnRaCommand(SendingRemoteAdminCommandEventArgs ev) - { - switch (ev.Name) - { - case "scputils_help": - { - ev.IsAllowed = false; - - ev.CommandSender.RAMessage($"SCPUtils info:\n" + - $"Avaible commands: scputils_help, scputils_player_info, scputils_player_list, scputils_player_reset_preferences, scputils_player_reset, scputils_set_color, scputils_set_name, scputils_set_badge, scputils_revoke_badge, scputils_play_time, scputils_whitelist_asn, scputils_unwhitelist_asn", true); - break; - } - - - case "scputils_player_info": - { - ev.IsAllowed = false; - var commandSender = Exiled.API.Features.Player.Get(ev.Sender.Nickname); - - if (ev.Arguments.Count < 1) - { - ev.CommandSender.RAMessage("Usage: scputils_player_info ", false); - break; - } - - if (IsAllowed(ev.Sender.Nickname, "scputils.playerinfo")) - { - var databasePlayer = ev.Arguments[0].GetDatabasePlayer(); - if (databasePlayer == null) - { - ev.CommandSender.RAMessage("Player not found on Database or Player is loading data!", false); - break; - } - ev.CommandSender.RAMessage($"\n[{databasePlayer.Name} ({databasePlayer.Id}@{databasePlayer.Authentication})]\n\n" + - $"Total SCP Suicides/Quits: [ {databasePlayer.ScpSuicideCount} ]\n" + - $"Total SCP Suicides/Quits Kicks: [ {databasePlayer.TotalScpSuicideKicks} ]\n" + - $"Total SCP Suicides/Quits Bans: [ {databasePlayer.TotalScpSuicideBans} ]\n" + - $"Total Games played as SCP: [ {databasePlayer.TotalScpGamesPlayed} ]\n" + - $"Total Suicides/Quits Percentage: [ {Math.Round(databasePlayer.SuicidePercentage, 2)}% ]\n" + - $"First Join: [ {databasePlayer.FirstJoin} ]\n" + - $"Last Seen: [ {databasePlayer.LastSeen} ]\n" + - $"Custom Color: [ {databasePlayer.ColorPreference} ]\n" + - $"Custom Name: [ {databasePlayer.CustomNickName} ]\n" + - $"Temporarily Badge: [ {databasePlayer.BadgeName} ]\n" + - $"Badge Expire: [ {databasePlayer.BadgeExpire} ]\n" + - $"Hide Badge: [ {databasePlayer.HideBadge} ]\n" + - $"Asn Whitelisted: [ {databasePlayer.ASNWhitelisted} ]\n" + - $"Total Playtime: [ { new TimeSpan(0, 0, databasePlayer.PlayTimeRecords.Values.Sum()).ToString() } ]"); - } - else ev.CommandSender.RAMessage("You need a higher administration level to use this command!", false); - - break; - } - - case "scputils_play_time": - { - ev.IsAllowed = false; - var commandSender = Exiled.API.Features.Player.Get(ev.Sender.Nickname); - if (ev.Arguments.Count < 2) - { - ev.CommandSender.RAMessage("Usage: scputils_play_time ", false); - break; - } - if (IsAllowed(ev.Sender.Nickname, "scputils.playtime")) - { - int.TryParse(ev.Arguments[1], out int range); - - if (range < 0) - { - ev.CommandSender.RAMessage("You have to specify a positive number!", false); - return; - } - var databasePlayer = ev.Arguments[0].GetDatabasePlayer(); - if (databasePlayer == null) - { - ev.CommandSender.RAMessage("Player not found on Database or Player is loading data!", false); - break; - } - string message = $"\n[{databasePlayer.Name} ({databasePlayer.Id}@{databasePlayer.Authentication})]\n\n" + - $"Total Playtime: [ { new TimeSpan(0, 0, databasePlayer.PlayTimeRecords.Values.Sum()).ToString() } ]\n"; - - - for (int i = 0; i <= range; i++) - { - DateTime.TryParse((DateTime.Now.Date.AddDays(-i)).ToString(), out DateTime date); - if (databasePlayer.PlayTimeRecords.ContainsKey(date.Date.ToShortDateString())) message += $"{date.Date.ToShortDateString()} Playtime: [ { new TimeSpan(0, 0, databasePlayer.PlayTimeRecords[date.Date.ToShortDateString()]).ToString() } ]\n"; - else message += $"{date.Date.ToShortDateString()} Playtime: [ No activity ]\n"; - } - - ev.CommandSender.RAMessage(message); - } - else ev.CommandSender.RAMessage("You need a higher administration level to use this command!", false); - break; - } - - case "scputils_player_list": - { - ev.IsAllowed = false; - - var commandSender = Exiled.API.Features.Player.Get(ev.Sender.Nickname); - - if (ev.Arguments.Count < 1) - { - ev.CommandSender.RAMessage("Usage: scputils_player_list ", false); - break; - } - - - if (IsAllowed(ev.Sender.Nickname, "scputils.playerlist")) - { - - var playerListString = "[Quits/Suicides Percentage]\n"; - - if (int.TryParse(ev.Arguments[0], out int minpercentage)) - { - foreach (var databasePlayer in Database.LiteDatabase.GetCollection().Find(x => x.SuicidePercentage >= minpercentage)) - { - playerListString += $"\n{databasePlayer.Name} ({databasePlayer.Id}@{databasePlayer.Authentication}) -[ {Math.Round(databasePlayer.SuicidePercentage, 2)}% ]"; - } - if (playerListString == "[Quits/Suicides as SCP]\n") ev.CommandSender.RAMessage("No results found!", false); - else ev.CommandSender.RAMessage($"{playerListString}"); - } - else - { - ev.CommandSender.RAMessage("Arg1 is not an integer, Comand usage example: scputils_player_list 50", false); - break; - } - - - } - else ev.CommandSender.RAMessage("You need a higher administration level to use this command!", false); - break; - } - - case "scputils_player_reset": - { - ev.IsAllowed = false; - - var commandSender = Exiled.API.Features.Player.Get(ev.Sender.Nickname); - - if (ev.Arguments.Count < 1) - { - ev.CommandSender.RAMessage("Usage: scputils_player_reset ", false); - break; - } - - if (IsAllowed(ev.Sender.Nickname, "scputils.playerreset")) - { - var databasePlayer = ev.Arguments[0].GetDatabasePlayer(); - if (databasePlayer == null) - { - ev.CommandSender.RAMessage("Player not found on Database or Player is loading data!", false); - break; - } - databasePlayer.Reset(); - Database.LiteDatabase.GetCollection().Update(databasePlayer); - ev.CommandSender.RAMessage("Success!", false); - } - else ev.CommandSender.RAMessage("You need a higher administration level to use this command!", false); - break; - } - - case "scputils_player_reset_preferences": - { - ev.IsAllowed = false; - - var commandSender = Exiled.API.Features.Player.Get(ev.Sender.Nickname); - - if (ev.Arguments.Count < 1) - { - ev.CommandSender.RAMessage("Usage: scputils_player_reset_preferences ", false); - break; - } - - if (IsAllowed(ev.Sender.Nickname, "scputils.playerresetpreferences")) - { - var databasePlayer = ev.Arguments[0].GetDatabasePlayer(); - if (databasePlayer == null) - { - ev.CommandSender.RAMessage("Player not found on Database or Player is loading data!", false); - break; - } - databasePlayer.ResetPreferences(); - Database.LiteDatabase.GetCollection().Update(databasePlayer); - ev.CommandSender.RAMessage("Success!", false); - } - else ev.CommandSender.RAMessage("You need a higher administration level to use this command!", false); - break; - } - - case "scputils_set_color": - { - ev.IsAllowed = false; - - var commandSender = Exiled.API.Features.Player.Get(ev.Sender.Nickname); - - if (ev.Arguments.Count < 2) - { - ev.CommandSender.RAMessage("Usage: scputils_set_color ", false); - break; - } - ev.Arguments[1].ToLower().ToString(); - - if (IsAllowed(ev.Sender.Nickname, "scputils.playersetcolor")) - { - var databasePlayer = ev.Arguments[0].GetDatabasePlayer(); - var target = Exiled.API.Features.Player.Get(ev.Arguments[0]); - if (databasePlayer == null) - { - ev.CommandSender.RAMessage("Player not found on Database or Player is loading data!", false); - break; - } - if (ev.Arguments[1] == "none") - { - databasePlayer.ColorPreference = ""; - Database.LiteDatabase.GetCollection().Update(databasePlayer); - ev.CommandSender.RAMessage("Success, effects will take effect next round!", false); - break; - } - if (validColors.Contains(ev.Arguments[1])) - { - if (target != null) target.ReferenceHub.serverRoles.SetColor(ev.Arguments[1]); - string color = ev.Arguments[1]; - databasePlayer.ColorPreference = color; - Database.LiteDatabase.GetCollection().Update(databasePlayer); - ev.CommandSender.RAMessage("Success!", false); - } - else ev.CommandSender.RAMessage("Invalid color!", false); - } - else ev.CommandSender.RAMessage("You need a higher administration level to use this command!", false); - break; - } - - case "scputils_set_name": - { - ev.IsAllowed = false; - - var commandSender = Exiled.API.Features.Player.Get(ev.Sender.Nickname); - - if (ev.Arguments.Count < 2) - { - ev.CommandSender.RAMessage("Usage: scputils_set_name ", false); - break; - } - - - if (IsAllowed(ev.Sender.Nickname, "scputils.playersetname")) - { - var databasePlayer = ev.Arguments[0].GetDatabasePlayer(); - var target = Exiled.API.Features.Player.Get(ev.Arguments[0]); - if (databasePlayer == null) - { - ev.CommandSender.RAMessage("Player not found on Database or Player is loading data!", false); - break; - } - if (ev.Arguments[1].ToLower() == "none") - { - databasePlayer.CustomNickName = ""; - Database.LiteDatabase.GetCollection().Update(databasePlayer); - ev.CommandSender.RAMessage("Success, changes will take effect next round!", false); - break; - } - string name = ev.Arguments[1]; - databasePlayer.CustomNickName = name; - Database.LiteDatabase.GetCollection().Update(databasePlayer); - ev.CommandSender.RAMessage("Success, choice has been saved!", false); - if (target != null) target.Nickname = ev.Arguments[1].ToString(); - - } - else ev.CommandSender.RAMessage("You need a higher administration level to use this command!", false); - break; - } - - - - case "scputils_set_badge": - { - ev.IsAllowed = false; - - var commandSender = Exiled.API.Features.Player.Get(ev.Sender.Nickname); - - if (ev.Arguments.Count < 3) - { - ev.CommandSender.RAMessage("Usage: scputils_set_badge ", false); - break; - } - - if (IsAllowed(ev.Sender.Nickname, "scputils.handlebadges")) - { - var databasePlayer = ev.Arguments[0].GetDatabasePlayer(); - var player = Exiled.API.Features.Player.Get(ev.Arguments[0]); - if (databasePlayer == null) - { - ev.CommandSender.RAMessage("Player not found on Database or Player is loading data!", false); - break; - } - if (!ServerStatic.GetPermissionsHandler().GetAllGroups().ContainsKey(ev.Arguments[1])) - { - ev.CommandSender.RAMessage("Invalid role name!", false); - break; - } - - else if (int.TryParse(ev.Arguments[2], out int duration)) - { - string badgeName = ev.Arguments[1].ToString(); - databasePlayer.BadgeName = badgeName; - databasePlayer.BadgeExpire = DateTime.Now.AddMinutes(duration); - Database.LiteDatabase.GetCollection().Update(databasePlayer); - if (player != null) player.ReferenceHub.serverRoles.Group = ServerStatic.GetPermissionsHandler()._groups[ev.Arguments[1]]; - ev.CommandSender.RAMessage("Badge set!", false); - - } - else ev.CommandSender.RAMessage("Arg3 must be integer!", false); - } - else ev.CommandSender.RAMessage("You need a higher administration level to use this command!", false); - break; - } - - case "scputils_revoke_badge": - { - ev.IsAllowed = false; - - var commandSender = Exiled.API.Features.Player.Get(ev.Sender.Nickname); - - if (ev.Arguments.Count < 1) - { - ev.CommandSender.RAMessage("Usage: scputils_revoke_badge ", false); - break; - } - - if (IsAllowed(ev.Sender.Nickname, "scputils.handlebadges")) - { - var player = Exiled.API.Features.Player.Get(ev.Arguments[0]); - var databasePlayer = ev.Arguments[0].GetDatabasePlayer(); - if (databasePlayer == null) - { - ev.CommandSender.RAMessage("Player not found on Database or Player is loading data!", false); - break; - } - - databasePlayer.BadgeName = ""; - databasePlayer.BadgeExpire = DateTime.MinValue; - Database.LiteDatabase.GetCollection().Update(databasePlayer); - if (player != null) player.SetRank(null, null); - ev.CommandSender.RAMessage("Badge revoked!", false); - - } - else ev.CommandSender.RAMessage("You need a higher administration level to use this command!", false); - break; - } - - case "scputils_whitelist_asn": - { - ev.IsAllowed = false; - - var commandSender = Exiled.API.Features.Player.Get(ev.Sender.Nickname); - - if (ev.Arguments.Count < 1) - { - ev.CommandSender.RAMessage("Usage: scputils_whitelist_asn ", false); - break; - } - - if (IsAllowed(ev.Sender.Nickname, "scputils.whitelist")) - { - var player = Exiled.API.Features.Player.Get(ev.Arguments[0]); - var databasePlayer = ev.Arguments[0].GetDatabasePlayer(); - if (databasePlayer == null) - { - ev.CommandSender.RAMessage("Player not found on Database or Player is loading data!", false); - break; - } - - databasePlayer.ASNWhitelisted = true; - Database.LiteDatabase.GetCollection().Update(databasePlayer); - ev.CommandSender.RAMessage("Player has been successfully whitelisted!", false); - - } - else ev.CommandSender.RAMessage("You need a higher administration level to use this command!", false); - break; - } - - case "scputils_unwhitelist_asn": - { - ev.IsAllowed = false; - - var commandSender = Exiled.API.Features.Player.Get(ev.Sender.Nickname); - - if (ev.Arguments.Count < 1) - { - ev.CommandSender.RAMessage("Usage: scputils_unwhitelist_asn ", false); - break; - } - - if (IsAllowed(ev.Sender.Nickname, "scputils.whitelist")) - { - var player = Exiled.API.Features.Player.Get(ev.Arguments[0]); - var databasePlayer = ev.Arguments[0].GetDatabasePlayer(); - if (databasePlayer == null) - { - ev.CommandSender.RAMessage("Player not found on Database or Player is loading data!", false); - break; - } - - databasePlayer.ASNWhitelisted = false; - Database.LiteDatabase.GetCollection().Update(databasePlayer); - ev.CommandSender.RAMessage("Player has been successfully removed from whitelist!", false); - - } - else ev.CommandSender.RAMessage("You need a higher administration level to use this command!", false); - break; - } - } - } - - - private bool IsAllowed(string sender, string permission) - { - Exiled.API.Features.Player player; - return sender != null && (sender == "GAME CONSOLE" || (player = Exiled.API.Features.Player.Get(sender)) == null || Exiled.Permissions.Extensions.Permissions.CheckPermission(player, permission)); - } - } - -} diff --git a/SCPUtils/Commands/ConsoleCommands.cs b/SCPUtils/Commands/ConsoleCommands.cs deleted file mode 100644 index 5f3e0ca..0000000 --- a/SCPUtils/Commands/ConsoleCommands.cs +++ /dev/null @@ -1,256 +0,0 @@ -using System; -using System.Collections.Generic; -using Exiled.Events.EventArgs; -using Player = Exiled.API.Features.Player; -using Exiled.Permissions.Extensions; -using System.Linq; - -namespace SCPUtils -{ - public class ConsoleCommands - { - private readonly ScpUtils pluginInstance; - public ConsoleCommands(ScpUtils pluginInstance) => this.pluginInstance = pluginInstance; - - private readonly List validColors = new List { "pink", "red", "default", "brown", "silver", "light_green", "crismon", "cyan", "aqua", "deep_pink", "tomato", "yellow", "magenta", "blue_green", "orange", "lime", "green", "emerald", "carmine", "nickel", "mint", "army_green", "pumpkin" }; - public void OnConsoleCommand(SendingConsoleCommandEventArgs ev) - { - - - switch (ev.Name) - { - case "scputils_help": - { - ev.Allow = false; - ev.Color = "green"; - ev.ReturnMessage = "Avaible commands: \n" + - ".scputils_info, .scputils_help, .scputils_change_nickname, .scputils_change_color, .scputils_show_badge, .scputils_hide_badge"; - break; - } - - - case "scputils_info": - { - ev.Allow = false; - ev.Color = "green"; - ev.ReturnMessage = "Plugin Info: \n" + - "SCPUtils is a public plugin created by Terminator_97#0507, you can download this plugin at: github.com/terminator-97/SCPUtils \n" + - $"This server is running SCPUtils version {ScpUtils.pluginVersion}"; - break; - } - - - case "scputils_change_nickname": - { - ev.Allow = false; - var commandSender = Exiled.API.Features.Player.Get(ev.Player.UserId); - - if (commandSender == null) - { - ev.Color = "red"; - ev.ReturnMessage = "An error has occured while executing this command!"; - break; - } - - if (ev.Arguments.Count < 1) - { - ev.Color = "red"; - ev.ReturnMessage = "Usage: scputils_changenickname "; - break; - } - - if (IsAllowed(commandSender.Nickname, "scputils.changenickname")) - { - - if (ev.Arguments[0].ToLower() == "none") - { - ev.Color = "green"; - ev.ReturnMessage = "Your nickname has been removed, changes will take effect next round!"; - ev.Player.GetDatabasePlayer().CustomNickName = ""; - } - - else - { - bool allowChange = true; - foreach (var player in Exiled.API.Features.Player.List) - { - if (player.Nickname.ToLower() == ev.Arguments[0].ToLower()) - { - allowChange = false; - break; - } - } - if (!allowChange) - { - ev.Color = "red"; - ev.ReturnMessage = "This nickname is already used by another player, please choose another name!"; - break; - } - else if (pluginInstance.Functions.CheckNickname(ev.Arguments[0]) && !IsAllowed(commandSender.Nickname, "scputils.bypassnickrestriction")) - { - ev.Color = "red"; - ev.ReturnMessage = pluginInstance.Config.InvalidNicknameText; - break; - } - ev.Color = "green"; - ev.ReturnMessage = "Your nickname has been changed, changes will take effect next round, use scputils_change_nickname None to remove the nickname"; - string nickname = ev.Arguments[0]; - ev.Player.GetDatabasePlayer().CustomNickName = nickname; - ev.Player.Nickname = nickname; - } - } - else - { - ev.Color = "red"; - ev.ReturnMessage = pluginInstance.Config.UnauthorizedNickNameChange; - } - break; - } - - case "scputils_change_color": - { - ev.Allow = false; - var commandSender = Exiled.API.Features.Player.Get(ev.Player.UserId); - - if (commandSender == null) - { - ev.Color = "red"; - ev.ReturnMessage = "An error has occured while executing this command!"; - break; - } - if (ev.Arguments.Count < 1) - { - ev.Color = "red"; - ev.ReturnMessage = "Usage: scputils_changecolor "; - break; - } - if (IsAllowed(commandSender.Nickname, "scputils.changecolor")) - { - - if (ev.Arguments[0].ToLower() == "none") - { - ev.Color = "green"; - ev.ReturnMessage = "Your color has been removed, changes will take effect next round!"; - ev.Player.GetDatabasePlayer().ColorPreference = ""; - } - if (validColors.Contains(ev.Arguments[0])) - { - if (pluginInstance.Config.RestrictedRoleColors.Contains(ev.Arguments[0])) - { - ev.Color = "red"; - ev.ReturnMessage = "This color has been restricted by server owner, please use another color!"; - break; - } - else - { - ev.Color = "green"; - ev.ReturnMessage = "Your color has been changed, use scputils_change_color None to remove the color!"; - commandSender.RankColor = ev.Arguments[0]; - string colorPreference = ev.Arguments[0]; - ev.Player.GetDatabasePlayer().ColorPreference = colorPreference; - } - } - else - { - ev.Color = "red"; - ev.ReturnMessage = "Invalid color, type color in console to see valid SCP colors"; - } - } - else - { - ev.Color = "red"; - ev.ReturnMessage = pluginInstance.Config.UnauthorizedColorChange; - } - break; - } - - - case "scputils_hide_badge": - { - ev.Allow = false; - var commandSender = Exiled.API.Features.Player.Get(ev.Player.UserId); - - if (commandSender == null) - { - ev.Color = "red"; - ev.ReturnMessage = "An error has occured while executing this command!"; - break; - } - if (IsAllowed(commandSender.Nickname, "scputils.badgevisibility")) - { - ev.Player.BadgeHidden = true; - commandSender.GetDatabasePlayer().HideBadge = true; - ev.Color = "green"; - ev.ReturnMessage = "Your badge has been hidden!"; - } - else - { - ev.Color = "red"; - ev.ReturnMessage = pluginInstance.Config.UnauthorizedBadgeChangeVisibility; - } - break; - } - - - case "scputils_show_badge": - { - ev.Allow = false; - var commandSender = Exiled.API.Features.Player.Get(ev.Player.UserId); - - if (commandSender == null) - { - ev.Color = "red"; - ev.ReturnMessage = "An error has occured while executing this command!"; - break; - } - - if (IsAllowed(commandSender.Nickname, "scputils.badgevisibility")) - { - ev.Player.BadgeHidden = false; - commandSender.GetDatabasePlayer().HideBadge = false; - ev.Color = "green"; - ev.ReturnMessage = "Your badge has been shown!"; - } - else - { - ev.Color = "red"; - ev.ReturnMessage = pluginInstance.Config.UnauthorizedBadgeChangeVisibility; - } - break; - } - - case "scputils_my_info": - { - ev.Allow = false; - var commandSender = Exiled.API.Features.Player.Get(ev.Player.UserId); - - if (commandSender == null) - { - ev.Color = "red"; - ev.ReturnMessage = "An error has occured while executing this command!"; - break; - } - ev.Color = "green"; - var databasePlayer = commandSender.GetDatabasePlayer(); - ev.ReturnMessage = "Those are your preferences and informations:\n" + - $"Custom Name: [ {databasePlayer.CustomNickName} ]\n" + - $"Badge Color: [ {databasePlayer.ColorPreference} ]\n" + - $"Hide Badge: [ {databasePlayer.HideBadge} ]\n" + - $"Temporarily Badge: [ {databasePlayer.BadgeName} ]\n" + - $"Badge Expire: [ {databasePlayer.BadgeExpire} ]\n" + - $"First Join: [ {databasePlayer.FirstJoin} ]\n" + - $"Total Playtime: [ { new TimeSpan(0, 0, databasePlayer.PlayTimeRecords.Values.Sum()).ToString() } ]"; - break; - } - } - - } - private bool IsAllowed(string sender, string permission) - { - Exiled.API.Features.Player player; - return sender != null && (sender == "GAME CONSOLE" || (player = Exiled.API.Features.Player.Get(sender)) == null || Exiled.Permissions.Extensions.Permissions.CheckPermission(player, permission)); - } - - - } -} \ No newline at end of file diff --git a/SCPUtils/Commands/Help.cs b/SCPUtils/Commands/Help.cs new file mode 100644 index 0000000..415bff9 --- /dev/null +++ b/SCPUtils/Commands/Help.cs @@ -0,0 +1,28 @@ +using System; +using CommandSystem; + +namespace SCPUtils.Commands +{ + [CommandHandler(typeof(RemoteAdminCommandHandler))] + [CommandHandler(typeof(GameConsoleCommandHandler))] + [CommandHandler(typeof(ClientCommandHandler))] + class Help : ICommand + { + public string Command => "scputils_help"; + + public string[] Aliases { get; } = new string[] { }; + + public string Description => "Show plugin info"; + + public bool Execute(ArraySegment arguments, ICommandSender sender, out string response) + { + string text = ""; + text = $"User commands: \n" + + ".scputils_info, .scputils_help, .scputils_change_nickname, .scputils_change_color, .scputils_show_badge, .scputils_hide_badge, .scputils_my_info"; + if (CommandExtensions.IsAllowed(((CommandSender)sender).SenderId, "scputils.help") && !((CommandSender)sender).FullPermissions) text += "\nAdministration commands (Remote Admin): \n" + + "scputils_help, scputils_player_info, scputils_player_list, scputils_player_reset_preferences, scputils_player_reset, scputils_set_color, scputils_set_name, scputils_set_badge, scputils_revoke_badge, scputils_play_time, scputils_whitelist_asn, scputils_unwhitelist_asn"; + response = text; + return true; + } + } +} \ No newline at end of file diff --git a/SCPUtils/Commands/HideBadge.cs b/SCPUtils/Commands/HideBadge.cs new file mode 100644 index 0000000..704ef18 --- /dev/null +++ b/SCPUtils/Commands/HideBadge.cs @@ -0,0 +1,41 @@ +using System; +using CommandSystem; + + + +namespace SCPUtils.Commands +{ + [CommandHandler(typeof(RemoteAdminCommandHandler))] + [CommandHandler(typeof(ClientCommandHandler))] + public class HideBadge : ICommand + { + public string Command { get; } = "scputils_hide_badge"; + + public string[] Aliases { get; } = new string[] { "hb" }; + + public string Description { get; } = "Hides your badge permanently until you execute scputils_show_badge or sb"; + + public bool Execute(ArraySegment arguments, ICommandSender sender, out string response) + { + if (!CommandExtensions.IsAllowed(((CommandSender)sender).SenderId, "scputils.badgevisibility")) + { + response = $"{ScpUtils.StaticInstance.Config.UnauthorizedBadgeChangeVisibility} "; + return false; + } + else if (((CommandSender)sender).Nickname.Equals("SERVER CONSOLE")) + { + response = "This command cannot be executed from console!"; + return false; + } + else + { + var player = Exiled.API.Features.Player.Get(((CommandSender)sender).SenderId); + player.BadgeHidden = true; + player.GetDatabasePlayer().HideBadge = true; + response = "Your badge has been hidden!"; + + return true; + } + } + } +} diff --git a/SCPUtils/Commands/Info.cs b/SCPUtils/Commands/Info.cs new file mode 100644 index 0000000..d5a591c --- /dev/null +++ b/SCPUtils/Commands/Info.cs @@ -0,0 +1,25 @@ +using System; +using CommandSystem; + +namespace SCPUtils.Commands +{ + [CommandHandler(typeof(RemoteAdminCommandHandler))] + [CommandHandler(typeof(GameConsoleCommandHandler))] + [CommandHandler(typeof(ClientCommandHandler))] + class Info : ICommand + { + public string Command => "scputils_info"; + + public string[] Aliases { get; } = new string[] { }; + + public string Description => "Show plugin info"; + + public bool Execute(ArraySegment arguments, ICommandSender sender, out string response) + { + response = $"Plugin Info: \n" + + "SCPUtils is a public plugin created by Terminator_97#0507, you can download this plugin at: github.com/terminator-97/SCPUtils \n" + + $"This server is running SCPUtils version {ScpUtils.pluginVersion}"; + return true; + } + } +} diff --git a/SCPUtils/Commands/PlayTime.cs b/SCPUtils/Commands/PlayTime.cs new file mode 100644 index 0000000..29e517d --- /dev/null +++ b/SCPUtils/Commands/PlayTime.cs @@ -0,0 +1,73 @@ +using System; +using System.Linq; +using CommandSystem; + +namespace SCPUtils.Commands +{ + [CommandHandler(typeof(RemoteAdminCommandHandler))] + [CommandHandler(typeof(GameConsoleCommandHandler))] + class PlayTime : ICommand + { + + public string Command { get; } = "scputils_play_time"; + + public string[] Aliases { get; } = new string[] { "pt" }; + + public string Description { get; } = "You can see detailed informations about playtime"; + + public bool Execute(ArraySegment arguments, ICommandSender sender, out string response) + { + string target; + if (!CommandExtensions.IsAllowed(((CommandSender)sender).SenderId, "scputils.playtime") && !((CommandSender)sender).FullPermissions) + { + response = " You need a higher administration level to use this command!"; + return false; + } + else + { + if (arguments.Count < 2) + { + response = $"Usage: {Command} "; + return false; + } + else target = arguments.Array[1].ToString(); + } + var databasePlayer = target.GetDatabasePlayer(); + + if (databasePlayer == null) + { + response = "Player not found on Database or Player is loading data!"; + return false; + } + + + int.TryParse(arguments.Array[2], out int range); + + if (range < 0) + { + response = "You have to specify a positive number!"; + return false; + } + + if (databasePlayer == null) + { + response = "Player not found on Database or Player is loading data!"; + return false; + } + string message = $"\n[{databasePlayer.Name} ({databasePlayer.Id}@{databasePlayer.Authentication})]\n\n" + + $"Total Playtime: [ { new TimeSpan(0, 0, databasePlayer.PlayTimeRecords.Values.Sum()).ToString() } ]\n"; + + + for (int i = 0; i <= range; i++) + { + DateTime.TryParse((DateTime.Now.Date.AddDays(-i)).ToString(), out DateTime date); + if (databasePlayer.PlayTimeRecords.ContainsKey(date.Date.ToShortDateString())) message += $"{date.Date.ToShortDateString()} Playtime: [ { new TimeSpan(0, 0, databasePlayer.PlayTimeRecords[date.Date.ToShortDateString()]).ToString() } ]\n"; + else message += $"{date.Date.ToShortDateString()} Playtime: [ No activity ]\n"; + } + + response = $"{message}"; + + return true; + } + } +} diff --git a/SCPUtils/Commands/PlayerInfo.cs b/SCPUtils/Commands/PlayerInfo.cs new file mode 100644 index 0000000..ace1cb2 --- /dev/null +++ b/SCPUtils/Commands/PlayerInfo.cs @@ -0,0 +1,59 @@ +using System; +using System.Linq; +using CommandSystem; + +namespace SCPUtils.Commands +{ + [CommandHandler(typeof(RemoteAdminCommandHandler))] + [CommandHandler(typeof(GameConsoleCommandHandler))] + [CommandHandler(typeof(ClientCommandHandler))] + class PlayerInfo : ICommand + { + + public string Command { get; } = "scputils_player_info"; + + public string[] Aliases { get; } = new string[] { "upi", "scputils_my_info" }; + + public string Description { get; } = "Show player info, in case you are not admin you can see only your info"; + + public bool Execute(ArraySegment arguments, ICommandSender sender, out string response) + { + string target; + if (!CommandExtensions.IsAllowed(((CommandSender)sender).SenderId, "scputils.playerinfo") && !((CommandSender)sender).FullPermissions) target = Exiled.API.Features.Player.Get(((CommandSender)sender).SenderId).ToString().Split(new string[] { " " }, StringSplitOptions.None)[2]; + else + { + if (arguments.Count < 1) + { + response = $"Usage: {Command} "; + return false; + } + else target = arguments.Array[1].ToString(); + } + var databasePlayer = target.GetDatabasePlayer(); + + if (databasePlayer == null) + { + response = $"Player not found on Database or Player is loading data! ({target})"; + return false; + } + + response = $"\n[{databasePlayer.Name} ({databasePlayer.Id}@{databasePlayer.Authentication})]\n\n" + + $"Total SCP Suicides/Quits: [ {databasePlayer.ScpSuicideCount} ]\n" + + $"Total SCP Suicides/Quits Kicks: [ {databasePlayer.TotalScpSuicideKicks} ]\n" + + $"Total SCP Suicides/Quits Bans: [ {databasePlayer.TotalScpSuicideBans} ]\n" + + $"Total Games played as SCP: [ {databasePlayer.TotalScpGamesPlayed} ]\n" + + $"Total Suicides/Quits Percentage: [ {Math.Round(databasePlayer.SuicidePercentage, 2)}% ]\n" + + $"First Join: [ {databasePlayer.FirstJoin} ]\n" + + $"Last Seen: [ {databasePlayer.LastSeen} ]\n" + + $"Custom Color: [ {databasePlayer.ColorPreference} ]\n" + + $"Custom Name: [ {databasePlayer.CustomNickName} ]\n" + + $"Temporarily Badge: [ {databasePlayer.BadgeName} ]\n" + + $"Badge Expire: [ {databasePlayer.BadgeExpire} ]\n" + + $"Hide Badge: [ {databasePlayer.HideBadge} ]\n" + + $"Asn Whitelisted: [ {databasePlayer.ASNWhitelisted} ]\n" + + $"Total Playtime: [ { new TimeSpan(0, 0, databasePlayer.PlayTimeRecords.Values.Sum()).ToString() } ]"; + + return true; + } + } +} diff --git a/SCPUtils/Commands/PlayerList.cs b/SCPUtils/Commands/PlayerList.cs new file mode 100644 index 0000000..470c7b3 --- /dev/null +++ b/SCPUtils/Commands/PlayerList.cs @@ -0,0 +1,54 @@ +using System; +using CommandSystem; + +namespace SCPUtils.Commands +{ + [CommandHandler(typeof(RemoteAdminCommandHandler))] + [CommandHandler(typeof(GameConsoleCommandHandler))] + class PlayerList : ICommand + { + + public string Command { get; } = "scputils_player_list"; + + public string[] Aliases { get; } = new string[] { "pl" }; + + public string Description { get; } = "Show player list in scputils database with some basic informations, don't use values like 0 otherwise the list may get huge"; + + public bool Execute(ArraySegment arguments, ICommandSender sender, out string response) + { + if (!CommandExtensions.IsAllowed(((CommandSender)sender).SenderId, "scputils.playerlist") && !((CommandSender)sender).FullPermissions) + { + response = "You need a higher administration level to use this command!"; + return false; + } + else + { + if (arguments.Count < 1) + { + response = $"Usage: {Command} "; + return false; + } + } + var playerListString = "[Quits/Suicides Percentage]\n"; + + if (int.TryParse(arguments.Array[1].ToString(), out int minpercentage)) + { + foreach (var databasePlayer in Database.LiteDatabase.GetCollection().Find(x => x.SuicidePercentage >= minpercentage)) + { + playerListString += $"\n{databasePlayer.Name} ({databasePlayer.Id}@{databasePlayer.Authentication}) -[ {Math.Round(databasePlayer.SuicidePercentage, 2)}% ]"; + } + if (playerListString == "[Quits/Suicides as SCP]\n") response = "No results found"; + else response = $"{playerListString}"; + } + + else + { + response = "Arg1 is not an integer, Comand usage example: scputils_player_list 50"; + return false; + } + + + return true; + } + } +} diff --git a/SCPUtils/Commands/PlayerReset.cs b/SCPUtils/Commands/PlayerReset.cs new file mode 100644 index 0000000..b1be37f --- /dev/null +++ b/SCPUtils/Commands/PlayerReset.cs @@ -0,0 +1,51 @@ +using System; +using CommandSystem; + +namespace SCPUtils.Commands +{ + [CommandHandler(typeof(RemoteAdminCommandHandler))] + [CommandHandler(typeof(GameConsoleCommandHandler))] + public class Reset : ICommand + { + + public string Command { get; } = "scputils_player_reset"; + + public string[] Aliases { get; } = new string[] { "pr" }; + + public string Description { get; } = "Reset player data (Quits,Ban,Kicks,Nickname,Badge etc, everything)!"; + + public bool Execute(ArraySegment arguments, ICommandSender sender, out string response) + { + + if (!CommandExtensions.IsAllowed(((CommandSender)sender).SenderId, "scputils.playerreset") && !((CommandSender)sender).FullPermissions) + { + response = " You need a higher administration level to use this command!"; + return false; + } + else if (arguments.Count < 1) + { + response = $"Usage: {Command} "; + return false; + } + else + { + var target = arguments.Array[1].ToString(); + + var databasePlayer = target.GetDatabasePlayer(); + + if (databasePlayer == null) + { + response = "Player not found on Database or Player is loading data!"; + return false; + } + + databasePlayer.Reset(); + Database.LiteDatabase.GetCollection().Update(databasePlayer); + response = "Player has been reset!"; + + return true; + } + } + } +} + diff --git a/SCPUtils/Commands/PlayerResetPreferences.cs b/SCPUtils/Commands/PlayerResetPreferences.cs new file mode 100644 index 0000000..4d623b8 --- /dev/null +++ b/SCPUtils/Commands/PlayerResetPreferences.cs @@ -0,0 +1,49 @@ +using System; +using CommandSystem; + +namespace SCPUtils.Commands +{ + [CommandHandler(typeof(RemoteAdminCommandHandler))] + [CommandHandler(typeof(GameConsoleCommandHandler))] + public class PlayerResetReset : ICommand + { + + public string Command { get; } = "scputils_player_reset_preferences"; + + public string[] Aliases { get; } = new string[] { "prp" }; + + public string Description { get; } = "Reset player preferences (Nickname, badges etc)!"; + + public bool Execute(ArraySegment arguments, ICommandSender sender, out string response) + { + + if (!CommandExtensions.IsAllowed(((CommandSender)sender).SenderId, "scputils.playerresetpreferences") && !((CommandSender)sender).FullPermissions) + { + response = " You need a higher administration level to use this command!"; + return false; + } + else if (arguments.Count < 1) + { + response = $"Usage: {Command} "; + return false; + } + else + { + var target = arguments.Array[1].ToString(); + var databasePlayer = target.GetDatabasePlayer(); + + if (databasePlayer == null) + { + response = "Player not found on Database or Player is loading data!"; + return false; + } + + databasePlayer.ResetPreferences(); + Database.LiteDatabase.GetCollection().Update(databasePlayer); + response = "Player preferences have been resetted!"; + + return true; + } + } + } +} \ No newline at end of file diff --git a/SCPUtils/Commands/RevokeBadge.cs b/SCPUtils/Commands/RevokeBadge.cs new file mode 100644 index 0000000..a751c8f --- /dev/null +++ b/SCPUtils/Commands/RevokeBadge.cs @@ -0,0 +1,52 @@ +using System; +using CommandSystem; + + +namespace SCPUtils.Commands +{ + [CommandHandler(typeof(RemoteAdminCommandHandler))] + [CommandHandler(typeof(GameConsoleCommandHandler))] + public class RevokeBadge : ICommand + { + public string Command { get; } = "scputils_revoke_badge"; + + public string[] Aliases { get; } = new string[] { "rb" }; + + public string Description { get; } = "Removes a temporarily badge that has been given to a player!"; + + public bool Execute(ArraySegment arguments, ICommandSender sender, out string response) + { + string target; + if (!CommandExtensions.IsAllowed(((CommandSender)sender).SenderId, "scputils.handlebadges") && !((CommandSender)sender).FullPermissions) + { + response = " You need a higher administration level to use this command!"; + return false; + } + + else if (arguments.Count < 1) + { + response = $"Usage: {Command} "; + return false; + } + + else target = arguments.Array[1].ToString(); + + var player = Exiled.API.Features.Player.Get(target); + var databasePlayer = target.GetDatabasePlayer(); + + if (databasePlayer == null) + { + response = "Player not found on Database or Player is loading data!"; + return false; + } + + databasePlayer.BadgeName = ""; + databasePlayer.BadgeExpire = DateTime.MinValue; + Database.LiteDatabase.GetCollection().Update(databasePlayer); + if (player != null) player.BadgeHidden = false; + response = "Badge revoked!"; + return true; + + } + } +} diff --git a/SCPUtils/Commands/SetBadge.cs b/SCPUtils/Commands/SetBadge.cs new file mode 100644 index 0000000..4906243 --- /dev/null +++ b/SCPUtils/Commands/SetBadge.cs @@ -0,0 +1,65 @@ +using System; +using CommandSystem; + +namespace SCPUtils.Commands +{ + [CommandHandler(typeof(RemoteAdminCommandHandler))] + [CommandHandler(typeof(GameConsoleCommandHandler))] + class SeetBadge : ICommand + { + + public string Command { get; } = "scputils_set_badge"; + + public string[] Aliases { get; } = new string[] { "setb", "issue_badge" }; + + public string Description { get; } = "You can change everyone admin or only your name based on the permissions you have"; + + public bool Execute(ArraySegment arguments, ICommandSender sender, out string response) + { + string target; + string badge; + if (!CommandExtensions.IsAllowed(((CommandSender)sender).SenderId, "scputils.handlebadges") && !((CommandSender)sender).FullPermissions) + { + response = " You need a higher administration level to use this command!"; + return false; + } + + else if (arguments.Count < 3) + { + response = $"Usage: {Command} "; + return false; + } + + target = arguments.Array[1].ToString(); + badge = arguments.Array[2].ToString(); + var player = Exiled.API.Features.Player.Get(target); + var databasePlayer = target.GetDatabasePlayer(); + + if (databasePlayer == null) + { + response = "Player not found on Database or Player is loading data!"; + return false; + } + + else if (!ServerStatic.GetPermissionsHandler().GetAllGroups().ContainsKey(badge)) + { + response = "Invalid role name!"; + return false; + } + + + else if (int.TryParse(arguments.Array[3], out int duration)) + { + databasePlayer.BadgeName = badge; + databasePlayer.BadgeExpire = DateTime.Now.AddMinutes(duration); + Database.LiteDatabase.GetCollection().Update(databasePlayer); + if (player != null) player.ReferenceHub.serverRoles.Group = ServerStatic.GetPermissionsHandler()._groups[badge]; + response = "Badge set!"; + + } + else response = "Arg3 must be integer!"; + + return true; + } + } +} diff --git a/SCPUtils/Commands/SetColor.cs b/SCPUtils/Commands/SetColor.cs new file mode 100644 index 0000000..d28e2d6 --- /dev/null +++ b/SCPUtils/Commands/SetColor.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using CommandSystem; + +namespace SCPUtils.Commands +{ + [CommandHandler(typeof(RemoteAdminCommandHandler))] + [CommandHandler(typeof(GameConsoleCommandHandler))] + [CommandHandler(typeof(ClientCommandHandler))] + class SetColor : ICommand + { + private readonly List validColors = new List { "pink", "red", "default", "brown", "silver", "light_green", "crismon", "cyan", "aqua", "deep_pink", "tomato", "yellow", "magenta", "blue_green", "orange", "lime", "green", "emerald", "carmine", "nickel", "mint", "army_green", "pumpkin" }; + public string Command { get; } = "scputils_set_color"; + + public string[] Aliases { get; } = new string[] { "sc", "scputils_change_color" }; + + public string Description { get; } = "You can change everyone color or only your one based on the permissions you have"; + + public bool Execute(ArraySegment arguments, ICommandSender sender, out string response) + { + string target; + string color; + if (CommandExtensions.IsAllowed(((CommandSender)sender).SenderId, "scputils.playersetcolor") || ((CommandSender)sender).FullPermissions) + { + if (arguments.Count < 2) + { + response = $"Usage: {Command} "; + return false; + } + else + { + target = arguments.Array[1].ToString(); + color = arguments.Array[2].ToString(); + + if (!validColors.Contains(color)) + { + response = "Invalid color, type color in console to see valid SCP colors"; + return false; + } + } + } + else if (CommandExtensions.IsAllowed(((CommandSender)sender).SenderId, "scputils.changecolor")) + { + if (arguments.Count < 1) + { + response = $"Usage: {Command} "; + return false; + } + else + { + target = Exiled.API.Features.Player.Get(((CommandSender)sender).SenderId).ToString().Split(new string[] { " " }, StringSplitOptions.None)[2]; + color = arguments.Array[1].ToString().ToLower(); + if (!validColors.Contains(color)) + { + response = "Invalid color, type color in console to see valid SCP colors"; + return false; + } + + else if (ScpUtils.StaticInstance.Config.RestrictedRoleColors.Contains(color)) + { + + response = "This color has been restricted by server owner, please use another color!"; + return false; + } + + } + } + else + { + response = $"{ScpUtils.StaticInstance.Config.UnauthorizedColorChange} "; + return false; + } + + var databasePlayer = target.GetDatabasePlayer(); + + if (databasePlayer == null) + { + response = "Player not found on Database or Player is loading data!"; + return false; + } + + if (color == "none") + { + databasePlayer.ColorPreference = ""; + Database.LiteDatabase.GetCollection().Update(databasePlayer); + response = "Success, changes will take effect next round!"; + return true; + } + + databasePlayer.ColorPreference = color; + Database.LiteDatabase.GetCollection().Update(databasePlayer); + response = "Success, choice has been saved!"; + var player = Exiled.API.Features.Player.Get(target); + if (player != null) player.RankColor = color; + return true; + } + } +} diff --git a/SCPUtils/Commands/SetName.cs b/SCPUtils/Commands/SetName.cs new file mode 100644 index 0000000..0d6bd74 --- /dev/null +++ b/SCPUtils/Commands/SetName.cs @@ -0,0 +1,114 @@ +using System; +using System.Linq; +using CommandSystem; +using HarmonyLib; +using Log = Exiled.API.Features.Log; + +namespace SCPUtils.Commands +{ + [CommandHandler(typeof(RemoteAdminCommandHandler))] + [CommandHandler(typeof(GameConsoleCommandHandler))] + [CommandHandler(typeof(ClientCommandHandler))] + class SetName : ICommand + { + + public string Command { get; } = "scputils_set_name"; + + public string[] Aliases { get; } = new string[] { "un", "scputils_change_nickname" }; + + public string Description { get; } = "You can change everyone name or only your name based on the permissions you have"; + + public bool Execute(ArraySegment arguments, ICommandSender sender, out string response) + { + string target; + string nickname = ""; + if (CommandExtensions.IsAllowed(((CommandSender)sender).SenderId, "scputils.playersetname") || ((CommandSender)sender).FullPermissions) + { + if (arguments.Count < 2) + { + response = $"Usage: {Command} "; + return false; + } + else + { + target = arguments.Array[1].ToString(); + nickname = string.Join(" ", arguments.Array, 2, arguments.Array.Length - 2); + } + } + else if (CommandExtensions.IsAllowed(((CommandSender)sender).SenderId, "scputils.changenickname")) + { + if (arguments.Count < 1) + { + response = $"Usage: {Command} "; + return false; + } + else + { + target = Exiled.API.Features.Player.Get(((CommandSender)sender).SenderId).UserId; + nickname = string.Join(" ", arguments.Array, 1, arguments.Array.Length - 1); + bool allowChange = true; + foreach (var playerList in Exiled.API.Features.Player.List) + { + if (playerList.Nickname.ToLower() == nickname.ToLower()) + { + allowChange = false; + break; + } + } + + if (!allowChange) + { + + response = "This nickname is already used by another player, please choose another name!"; + return false; + } + else if (ScpUtils.StaticInstance.Functions.CheckNickname(nickname) && !CommandExtensions.IsAllowed(target, "scputils.bypassnickrestriction")) + { + + response = $"{ScpUtils.StaticInstance.Config.InvalidNicknameText} "; + return false; + } + + + } + } + else + { + response = $"{ScpUtils.StaticInstance.Config.UnauthorizedNickNameChange} "; + return false; + } + + + var databasePlayer = target.GetDatabasePlayer(); + + if (databasePlayer == null) + { + response = "Player not found on Database or Player is loading data!"; + return false; + } + + if (nickname.ToLower() == "none") + { + databasePlayer.CustomNickName = ""; + Database.LiteDatabase.GetCollection().Update(databasePlayer); + response = "Success, changes will take effect next round!"; + return true; + } + + if (nickname.Length > ScpUtils.StaticInstance.Config.NicknameMaxLength) + { + response = "Nickname is too long!"; + return false; + } + + + databasePlayer.CustomNickName = nickname; + Database.LiteDatabase.GetCollection().Update(databasePlayer); + response = "Success, choice has been saved!"; + var player = Exiled.API.Features.Player.Get(target); + if (player != null) player.Nickname = nickname; + + return true; + } + } +} diff --git a/SCPUtils/Commands/ShowBadge.cs b/SCPUtils/Commands/ShowBadge.cs new file mode 100644 index 0000000..b75d232 --- /dev/null +++ b/SCPUtils/Commands/ShowBadge.cs @@ -0,0 +1,40 @@ +using System; +using CommandSystem; + + +namespace SCPUtils.Commands +{ + [CommandHandler(typeof(RemoteAdminCommandHandler))] + [CommandHandler(typeof(ClientCommandHandler))] + public class ShowBadge : ICommand + { + + public string Command { get; } = "scputils_show_badge"; + + public string[] Aliases { get; } = new string[] { "sb" }; + + public string Description { get; } = "Shows your badge permanently until you execute scputils_hide_badge or hb"; + + public bool Execute(ArraySegment arguments, ICommandSender sender, out string response) + { + if (!CommandExtensions.IsAllowed(((CommandSender)sender).SenderId, "scputils.badgevisibility")) + { + response = $"{ScpUtils.StaticInstance.Config.UnauthorizedBadgeChangeVisibility} "; + return false; + } + else if (((CommandSender)sender).Nickname.Equals("SERVER CONSOLE")) + { + response = "This command cannot be executed from console!"; + return false; + } + else + { + var player = Exiled.API.Features.Player.Get(((CommandSender)sender).SenderId); + player.BadgeHidden = false; + player.GetDatabasePlayer().HideBadge = false; + response = "Your badge has been shown!"; + return true; + } + } + } +} diff --git a/SCPUtils/Configs.cs b/SCPUtils/Configs.cs index 783d1eb..a5e9225 100644 --- a/SCPUtils/Configs.cs +++ b/SCPUtils/Configs.cs @@ -70,13 +70,13 @@ public class Configs : IConfig public string AutoBanMessage { get; private set; } = "Exceeded SCP suicide limit Duration: {0} minutes"; [Description("Message if player is not authorized to use this command")] - public string UnauthorizedNickNameChange { get; private set; } = "Permission denied."; + public string UnauthorizedNickNameChange { get; private set; } = "Permission denied."; [Description("Message if player is not authorized to use this command")] - public string UnauthorizedColorChange { get; private set; } = "Permission denied."; + public string UnauthorizedColorChange { get; private set; } = "Permission denied."; [Description("Message if player is not authorized to use this command")] - public string UnauthorizedBadgeChangeVisibility { get; private set; } = "Permission denied."; + public string UnauthorizedBadgeChangeVisibility { get; private set; } = "Permission denied."; [Description("Message if player try to change his nickname to a restricted one")] public string InvalidNicknameText { get; private set; } = "This nickname has been restricted by server owner, please use another nickname!"; @@ -105,6 +105,9 @@ public class Configs : IConfig [Description("SCP Suicide / Quit base ban duration (if enabled)")] public int AutoBanDuration { get; private set; } = 15; + [Description("Which is the max length of a nickname using change name command?")] + public int NicknameMaxLength { get; private set; } = 32; + [Description("If 079 trigger tesla for how many seconds player shouldn't get warned for suicide? (2 is enough for most of servers)")] public int Scp079TeslaEventWait { get; private set; } = 2; diff --git a/SCPUtils/Database/Player.cs b/SCPUtils/Database/Player.cs index cb8bad2..e2b00b6 100644 --- a/SCPUtils/Database/Player.cs +++ b/SCPUtils/Database/Player.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Log = Exiled.API.Features.Log; namespace SCPUtils { diff --git a/SCPUtils/Functions/EventHandlers.cs b/SCPUtils/Functions/EventHandlers.cs index 53494d0..c152092 100644 --- a/SCPUtils/Functions/EventHandlers.cs +++ b/SCPUtils/Functions/EventHandlers.cs @@ -1,6 +1,5 @@ using Exiled.API.Features; using Exiled.Events.EventArgs; -using Exiled.Permissions.Extensions; using MEC; using System; @@ -49,6 +48,8 @@ internal void On079TeslaEvent(InteractingTeslaEventArgs ev) lastTeslaEvent = DateTime.Now; } + + internal void OnPlayerJoin(JoinedEventArgs ev) { if (!Database.LiteDatabase.GetCollection().Exists(player => player.Id == DatabasePlayer.GetRawUserId(ev.Player))) @@ -65,7 +66,7 @@ internal void OnPlayerJoin(JoinedEventArgs ev) if (databasePlayer.FirstJoin == DateTime.MinValue) databasePlayer.FirstJoin = DateTime.Now; if (pluginInstance.Config.WelcomeEnabled) ev.Player.Broadcast(pluginInstance.Config.WelcomeMessageDuration, pluginInstance.Config.WelcomeMessage, Broadcast.BroadcastFlags.Normal); if (!string.IsNullOrEmpty(databasePlayer.CustomNickName) && databasePlayer.CustomNickName != "None") ev.Player.Nickname = databasePlayer.CustomNickName; - else if (pluginInstance.Config.ASNBlacklist.Contains(ev.Player.ReferenceHub.characterClassManager.Asn) && !databasePlayer.ASNWhitelisted) ev.Player.Kick($"Auto-Kick: {pluginInstance.Config.AsnKickMessage}", "SCPUtils"); + if (pluginInstance.Config.ASNBlacklist.Contains(ev.Player.ReferenceHub.characterClassManager.Asn) && !databasePlayer.ASNWhitelisted) ev.Player.Kick($"Auto-Kick: {pluginInstance.Config.AsnKickMessage}", "SCPUtils"); else pluginInstance.Functions.PostLoadPlayer(ev.Player); } diff --git a/SCPUtils/Functions/Extensions.cs b/SCPUtils/Functions/Extensions.cs index 1e27bb2..13adaad 100644 --- a/SCPUtils/Functions/Extensions.cs +++ b/SCPUtils/Functions/Extensions.cs @@ -1,4 +1,3 @@ -using System.Collections.Generic; using System; namespace SCPUtils diff --git a/SCPUtils/Patches/SCPSpeak.cs b/SCPUtils/Patches/SCPSpeak.cs index 4a0ec1e..f0215d4 100644 --- a/SCPUtils/Patches/SCPSpeak.cs +++ b/SCPUtils/Patches/SCPSpeak.cs @@ -1,6 +1,5 @@ using Assets._Scripts.Dissonance; using HarmonyLib; -using System; using System.Linq; using Exiled.Permissions.Extensions; diff --git a/SCPUtils/Plugin.cs b/SCPUtils/Plugin.cs index 8c61afd..d128b21 100644 --- a/SCPUtils/Plugin.cs +++ b/SCPUtils/Plugin.cs @@ -6,35 +6,38 @@ using MEC; using HarmonyLib; using System; -using System.IO; namespace SCPUtils { public class ScpUtils : Features.Plugin { + private static readonly Lazy LazyInstance = new Lazy(() => new ScpUtils()); + public static ScpUtils StaticInstance => LazyInstance.Value; public static bool IsStarted { get; set; } - public static string pluginVersion = "2.0.2"; - + public static string pluginVersion = "2.1.0"; + public override string Author { get; } = "Terminator_9#0507"; + public override string Name { get; } = "SCPUtils"; + public override Version Version { get; } = new Version(2, 1, 0); + public override Version RequiredExiledVersion { get; } = new Version(2, 0, 7); public EventHandlers EventHandlers { get; private set; } - public Commands Commands { get; private set; } public Functions Functions { get; private set; } public Player Player { get; private set; } - public ConsoleCommands PlayerConsoleCommands { get; private set; } + public Commands.ShowBadge ShowBadge { get; private set; } + public Commands.HideBadge HideBadge { get; private set; } public Database DatabasePlayerData { get; private set; } public int PatchesCounter { get; private set; } public Harmony Harmony { get; private set; } + private ScpUtils() + { - - - + } public void LoadEvents() { - ServerEvents.RoundStarted += EventHandlers.OnRoundStart; ServerEvents.RoundEnded += EventHandlers.OnRoundEnd; ServerEvents.RestartingRound += EventHandlers.OnRoundRestart; @@ -44,28 +47,15 @@ public void LoadEvents() PlayerEvents.Spawning += EventHandlers.OnPlayerSpawn; PlayerEvents.Dying += EventHandlers.OnPlayerDeath; Exiled.Events.Handlers.Scp079.InteractingTesla += EventHandlers.On079TeslaEvent; - } - public void LoadCommands() - { - ServerEvents.SendingRemoteAdminCommand += Commands.OnRaCommand; - ServerEvents.SendingConsoleCommand += PlayerConsoleCommands.OnConsoleCommand; - - } - - - public override void OnEnabled() { if (!Config.IsEnabled) return; - Commands = new Commands(); Functions = new Functions(this); EventHandlers = new EventHandlers(this); - PlayerConsoleCommands = new ConsoleCommands(this); DatabasePlayerData = new Database(this); LoadEvents(); - LoadCommands(); DatabasePlayerData.CreateDatabase(); DatabasePlayerData.OpenDatabase(); @@ -91,14 +81,13 @@ public override void OnDisabled() PlayerEvents.Joined -= EventHandlers.OnPlayerJoin; PlayerEvents.Left -= EventHandlers.OnPlayerLeave; PlayerEvents.Spawning -= EventHandlers.OnPlayerSpawn; - ServerEvents.SendingRemoteAdminCommand -= Commands.OnRaCommand; - ServerEvents.SendingConsoleCommand -= PlayerConsoleCommands.OnConsoleCommand; PlayerEvents.Dying -= EventHandlers.OnPlayerDeath; Exiled.Events.Handlers.Scp079.InteractingTesla -= EventHandlers.On079TeslaEvent; Timing.KillCoroutines(Functions.DT); EventHandlers = null; - Commands = null; Functions = null; + HideBadge = null; + ShowBadge = null; Database.LiteDatabase.Dispose(); Harmony.UnpatchAll(); } diff --git a/SCPUtils/Properties/AssemblyInfo.cs b/SCPUtils/Properties/AssemblyInfo.cs index 2d9192f..f76d2be 100644 --- a/SCPUtils/Properties/AssemblyInfo.cs +++ b/SCPUtils/Properties/AssemblyInfo.cs @@ -5,7 +5,7 @@ // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("SCPUtils")] -[assembly: AssemblyDescription("Public plugin for Exiled 2.0.1")] +[assembly: AssemblyDescription("SCPUtils 2.1.0")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("SCPUtils")] @@ -31,5 +31,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.0.1.0")] -[assembly: AssemblyFileVersion("2.0.1.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.1.0.0")] +[assembly: AssemblyFileVersion("2.1.0.0")] \ No newline at end of file diff --git a/SCPUtils/SCPUtils.csproj b/SCPUtils/SCPUtils.csproj index 7cf663f..80e1b58 100644 --- a/SCPUtils/SCPUtils.csproj +++ b/SCPUtils/SCPUtils.csproj @@ -45,6 +45,9 @@ False ..\..\..\..\..\release\Assembly-CSharp-Publicized.dll + + ..\..\..\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\CommandSystem.Core.dll + False ..\..\..\..\..\release\Exiled\EXILED\Plugins\dependencies\Exiled.API.dll @@ -86,13 +89,21 @@ + + + + + + + + + - + - @@ -103,6 +114,12 @@ True Settings.settings + + + + + +