From 0bbd128f13368c23e9c72f490fbb53b7e8500559 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Sat, 2 Dec 2017 15:06:32 -0700 Subject: [PATCH] Implement /su command & default group owner /su elevates you to superadmin for 10 minutes. Account creation instructions tell you to use the "owner" group. If you fail to run a command but have the su permission, you're told that you can override it. Fixes #1505 --- TShockAPI/Commands.cs | 35 ++++++++++++++++++++++++++++++++--- TShockAPI/DB/GroupManager.cs | 2 ++ TShockAPI/Permissions.cs | 3 +++ 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 493aa956..8ebee559 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -311,6 +311,10 @@ namespace TShockAPI { HelpText = "Temporarily sets another player's group." }); + add(new Command(Permissions.su, SubstituteUser, "su") + { + HelpText = "Temporarily elevates you to Super Admin." + }); add(new Command(Permissions.userinfo, GrabUserUserInfo, "userinfo", "ui") { HelpText = "Shows information about a player." @@ -685,6 +689,10 @@ namespace TShockAPI { TShock.Utils.SendLogs(string.Format("{0} tried to execute {1}{2}.", player.Name, Specifier, cmdText), Color.PaleVioletRed, player); player.SendErrorMessage("You do not have access to this command."); + if (player.HasPermission(Permissions.su)) + { + player.SendInfoMessage("You can use {0}su to temporarily become Super Admin, which can run this command.", Specifier); + } } else if (!cmd.AllowServer && !player.RealPlayer) { @@ -1814,6 +1822,27 @@ namespace TShockAPI } } + private static void SubstituteUser(CommandArgs args) + { + + if (args.Player.tempGroup != null) + { + args.Player.tempGroup = null; + args.Player.tempGroupTimer.Stop(); + args.Player.SendSuccessMessage("Your previous permission set has been restored."); + return; + } + else + { + args.Player.tempGroup = new SuperAdminGroup(); + args.Player.tempGroupTimer = new System.Timers.Timer(600 * 1000); + args.Player.tempGroupTimer.Elapsed += args.Player.TempGroupTimerElapsed; + args.Player.tempGroupTimer.Start(); + args.Player.SendSuccessMessage("Your account has been elevated to Super Admin for 10 minutes."); + return; + } + } + #endregion Player Management Commands #region Server Maintenence Commands @@ -4842,10 +4871,10 @@ namespace TShockAPI if (args.Player.Group.Name != "superadmin") args.Player.tempGroup = new SuperAdminGroup(); - args.Player.SendInfoMessage("Superadmin has been temporarily given to you. It will be removed on logout."); + args.Player.SendInfoMessage("Temporary system access has been given to you, so you can run one command."); args.Player.SendInfoMessage("Please use the following to create a permanent account for you."); - args.Player.SendInfoMessage("{0}user add superadmin", Specifier); - args.Player.SendInfoMessage("Creates: with the password as part of the superadmin group."); + args.Player.SendInfoMessage("{0}user add owner", Specifier); + args.Player.SendInfoMessage("Creates: with the password as part of the owner group."); args.Player.SendInfoMessage("Please use {0}login after this process.", Specifier); args.Player.SendInfoMessage("If you understand, please {0}login now, and then type {0}auth.", Specifier); return; diff --git a/TShockAPI/DB/GroupManager.cs b/TShockAPI/DB/GroupManager.cs index 7d4f5a1b..9da13b9e 100644 --- a/TShockAPI/DB/GroupManager.cs +++ b/TShockAPI/DB/GroupManager.cs @@ -77,6 +77,8 @@ namespace TShockAPI.DB string.Join(",", Permissions.maintenance, "tshock.cfg.*", "tshock.world.*", Permissions.butcher, Permissions.item, Permissions.give, Permissions.heal, Permissions.immunetoban, Permissions.usebanneditem)); + AddDefaultGroup("owner", "trustedadmin", string.Join(",", Permissions.su)); + AddDefaultGroup("vip", "default", string.Join(",", Permissions.reservedslot)); } diff --git a/TShockAPI/Permissions.cs b/TShockAPI/Permissions.cs index 95eb6153..37340e48 100644 --- a/TShockAPI/Permissions.cs +++ b/TShockAPI/Permissions.cs @@ -221,6 +221,9 @@ namespace TShockAPI [Description("Meant for super admins only.")] public static readonly string user = "tshock.superadmin.user"; + [Description("Allows a user to elevate to superadmin for 10 minutes.")] + public static readonly string su = "tshock.su"; + // tshock.tp nodes [Description("User can teleport *everyone* to them.")]