diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 260d7265..76b33496 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -226,6 +226,7 @@ namespace TShockAPI add(Permissions.savessi, SaveSSI, "savessi"); add(Permissions.savessi, OverrideSSI, "overridessi", "ossi"); add(Permissions.xmas, ForceXmas, "forcexmas"); + add(Permissions.sudo, Sudo, "sudo"); //add(null, TestCallbackCommand, "test"); } @@ -433,6 +434,7 @@ namespace TShockAPI args.Player.IgnoreActionsForDisabledArmor = "none"; args.Player.Group = group; + args.Player.tempGroup = null; args.Player.UserAccountName = user.Name; args.Player.UserID = TShock.Users.GetUserID(args.Player.UserAccountName); args.Player.IsLoggedIn = true; @@ -1198,6 +1200,42 @@ namespace TShockAPI (TShock.Config.ForceXmas ? "in" : "not in"))); } + public static void Sudo(CommandArgs args) + { + if (args.Parameters.Count < 2) + { + args.Player.SendInfoMessage("Invalid usage"); + args.Player.SendInfoMessage("Usage: /sudo "); + return; + } + + List ply = TShock.Utils.FindPlayer(args.Parameters[0]); + if(ply.Count < 1) + { + args.Player.SendErrorMessage(string.Format("Could not find player {0}.", args.Parameters[0])); + return; + } + + if (ply.Count > 1) + { + args.Player.SendErrorMessage(string.Format("Found more than one match for {0}.", args.Parameters[0])); + return; + } + + if(!TShock.Groups.GroupExists(args.Parameters[1])) + { + args.Player.SendErrorMessage(string.Format("Could not find group {0}", args.Parameters[1])); + return; + } + + Group g = TShock.Utils.GetGroup(args.Parameters[1]); + + ply[0].tempGroup = g; + + args.Player.SendSuccessMessage(string.Format("You have changed {0}'s group to {1}", ply[0].Name, g.Name)); + ply[0].SendSuccessMessage(string.Format("Your group has temporarily been changed to {0}", g.Name)); + } + #endregion Player Management Commands #region Server Maintenence Commands diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index f7f00283..73f2b7cf 100644 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -1372,6 +1372,7 @@ namespace TShockAPI args.Player.IgnoreActionsForDisabledArmor = "none"; args.Player.Group = group; + args.Player.tempGroup = null; args.Player.UserAccountName = args.Player.Name; args.Player.UserID = TShock.Users.GetUserID(args.Player.UserAccountName); args.Player.IsLoggedIn = true; diff --git a/TShockAPI/Permissions.cs b/TShockAPI/Permissions.cs index b1e3c11d..a8fd0e12 100644 --- a/TShockAPI/Permissions.cs +++ b/TShockAPI/Permissions.cs @@ -175,7 +175,7 @@ namespace TShockAPI [Description("User can use /spawn.")] public static readonly string spawn; - + [Description("User can elevate other users' groups temporarily.")] public static readonly string sudo; static Permissions() { foreach (var field in typeof (Permissions).GetFields()) diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index a488018b..175d4972 100644 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -71,10 +71,26 @@ namespace TShockAPI public int FirstMaxMP { get; set; } - /// - /// The player's group. - /// - public Group Group { get; set; } + /// + /// The player's group. + /// + public Group Group + { + get + { + if (tempGroup != null) + return tempGroup; + return group; + } + set { group = value; } + } + + /// + /// The player's temporary group. This overrides the user's actual group. + /// + public Group tempGroup = null; + + private Group group = null; public bool ReceivedInfo { get; set; }