diff --git a/Commands/World/PermissionCmd.cs b/Commands/World/PermissionCmd.cs index 3a3cd2df0..6a8fd6fbf 100644 --- a/Commands/World/PermissionCmd.cs +++ b/Commands/World/PermissionCmd.cs @@ -18,44 +18,23 @@ using System; using System.Collections.Generic; -namespace MCGalaxy.Commands.World { - static class PermissionCmd { +namespace MCGalaxy.Commands.World { + public abstract class PermissionCmd : Command { + public override string shortcut { get { return ""; } } + public override string type { get { return CommandTypes.World; } } + public override bool museumUsable { get { return false; } } + public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } - public static void Use(Player p, string[] args, bool skipNobodyPerm, string target, - Func getter, Action setter) { - if (args.Length == 1 && p == null) { - Player.Message(p, "You must provide a level name when using this command from console."); - return; + protected Level GetArgs(Player p, string[] args, out Group grp) { + if (args.Length == 1 && Player.IsSuper(p)) { + SuperRequiresArgs(p, "level"); return null; } Level level = args.Length == 1 ? p.level : LevelInfo.FindMatches(p, args[0]); if (level == null) return; string rank = args.Length == 1 ? args[0] : args[1]; - Group grp = Group.FindMatches(p, rank); - if (grp == null) return; - - if (p != null && getter(level) > p.Rank) { - if (skipNobodyPerm || (getter(level) != LevelPermission.Nobody)) { - Player.Message(p, "You cannot change the {0} of a level with a {0} higher than your rank.", target); - return; - } - } - - if (p != null && grp.Permission > p.Rank) { - if (skipNobodyPerm || (grp.Permission != LevelPermission.Nobody)) { - Player.Message(p, "You cannot change the {0} of a level to a {0} higher than your rank.", target); - return; - } - } - - setter(level, grp.Permission); - UpdateAllowBuild(level); - Level.SaveSettings(level); - - Server.s.Log(level.name + " " + target + " permission changed to " + grp.Permission + "."); - Chat.MessageLevel(level, target + " permission changed to " + grp.ColoredName + "%S."); - if (p == null || p.level != level) - Player.Message(p, "{0} permission changed to {1}%S on {2}.", target, grp.ColoredName, level.name); + grp = Group.FindMatches(p, rank); + return grp != null ? level : null; } public static void UseList(Player p, string[] args, string target, @@ -71,7 +50,7 @@ namespace MCGalaxy.Commands.World { string mode = name[0] == '+' ? "whitelist" : "blacklist"; List list = name[0] == '+' ? wlGetter(level) : blGetter(level); List other = name[0] == '+' ? blGetter(level) : wlGetter(level); - name = name.Substring(1); + name = name.Substring(1); if (name == "") { Player.Message(p, "You must provide a player name to {0}.", mode); return; diff --git a/Commands/World/CmdPermissions.cs b/Commands/World/PermissionCmds.cs similarity index 61% rename from Commands/World/CmdPermissions.cs rename to Commands/World/PermissionCmds.cs index 8f42f8785..ebd08754f 100644 --- a/Commands/World/CmdPermissions.cs +++ b/Commands/World/PermissionCmds.cs @@ -19,21 +19,16 @@ using System; using System.Collections.Generic; namespace MCGalaxy.Commands.World { - public sealed class CmdPerbuildMax : Command { + public sealed class CmdPerbuildMax : PermissionCmd { public override string name { get { return "perbuildmax"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return CommandTypes.World; } } - public override bool museumUsable { get { return false; } } - public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } - public CmdPerbuildMax() { } public override void Use(Player p, string message) { string[] args = message.Split(' '); if (args.Length < 1 || args.Length > 2) { Help(p); return; } - PermissionCmd.Use( - p, args, false, "perbuildmax", l => l.perbuildmax, - (l, v) => l.perbuildmax = v); + Group grp = null; + Level lvl = GetArgs(p, args, out grp); + if (lvl != null) lvl.BuildAccess.SetMax(p, grp); } public override void Help(Player p) { @@ -42,21 +37,16 @@ namespace MCGalaxy.Commands.World { } } - public sealed class CmdPermissionBuild : Command { + public sealed class CmdPermissionBuild : PermissionCmd { public override string name { get { return "perbuild"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return CommandTypes.World; } } - public override bool museumUsable { get { return false; } } - public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } - public CmdPermissionBuild() { } public override void Use(Player p, string message) { string[] args = message.Split(' '); if (args.Length < 1 || args.Length > 2) { Help(p); return; } - PermissionCmd.Use( - p, args, true, "perbuild", l => l.permissionbuild, - (l, v) => l.permissionbuild = v); + Group grp = null; + Level lvl = GetArgs(p, args, out grp); + if (lvl != null) lvl.BuildAccess.SetMin(p, grp); } public override void Help(Player p) { @@ -65,21 +55,16 @@ namespace MCGalaxy.Commands.World { } } - public sealed class CmdPervisitMax : Command { + public sealed class CmdPervisitMax : PermissionCmd { public override string name { get { return "pervisitmax"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return CommandTypes.World; } } - public override bool museumUsable { get { return false; } } - public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } - public CmdPervisitMax() { } public override void Use(Player p, string message) { string[] args = message.Split(' '); if (args.Length < 1 || args.Length > 2) { Help(p); return; } - PermissionCmd.Use( - p, args, false, "pervisitmax", l => l.pervisitmax, - (l, v) => l.pervisitmax = v); + Group grp = null; + Level lvl = GetArgs(p, args, out grp); + if (lvl != null) lvl.VisitAccess.SetMax(p, grp); } public override void Help(Player p) { @@ -88,13 +73,8 @@ namespace MCGalaxy.Commands.World { } } - public sealed class CmdPermissionVisit : Command { + public sealed class CmdPermissionVisit : PermissionCmd { public override string name { get { return "pervisit"; } } - public override string shortcut { get { return ""; } } - public override string type { get { return CommandTypes.World; } } - public override bool museumUsable { get { return false; } } - public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } - public CmdPermissionVisit() { } public override void Use(Player p, string message) { string[] args = message.Split(' '); @@ -106,9 +86,9 @@ namespace MCGalaxy.Commands.World { l => l.VisitWhitelist, l => l.VisitBlacklist); return; } - PermissionCmd.Use( - p, args, true, "pervisit", l => l.permissionvisit, - (l, v) => l.permissionvisit = v); + Group grp = null; + Level lvl = GetArgs(p, args, out grp); + if (lvl != null) lvl.VisitAccess.SetMin(p, grp); } public override void Help(Player p) { diff --git a/Levels/LevelAccess.cs b/Levels/LevelAccess.cs index 31e3156f4..694ffd06d 100644 --- a/Levels/LevelAccess.cs +++ b/Levels/LevelAccess.cs @@ -36,11 +36,19 @@ namespace MCGalaxy { /// Lowest allowed rank. public LevelPermission Min { get { return IsVisit ? lvl.permissionvisit : lvl.permissionbuild; } + set { + if (IsVisit) lvl.permissionvisit = value; + else lvl.permissionbuild = value; + } } /// Highest allowed rank. public LevelPermission Max { get { return IsVisit ? lvl.pervisitmax : lvl.perbuildmax; } + set { + if (IsVisit) lvl.pervisitmax = value; + else lvl.perbuildmax = value; + } } /// List of always allowed players, overrides rank allowances. @@ -53,6 +61,7 @@ namespace MCGalaxy { get { return IsVisit ? lvl.VisitBlacklist : lvl.BuildBlacklist; } } + /// Returns whether the given player is allowed by these access permissions. public bool Check(Player p, bool ignoreRankPerm = false) { if (Blacklisted.CaselessContains(p.name)) return false; @@ -90,5 +99,62 @@ namespace MCGalaxy { } return true; } + + + /// Sets the minimum rank allowed to access these permissions. + /// true if the minimum rank was changed, false if the given player + /// had insufficient permission to change the minimum rank. + public bool SetMin(Player p, Group grp) { + string target = IsVisit ? "pervisit" : "perbuild"; + if (!CheckRank(p, grp, target)) return false; + Min = grp.Permission; + + UpdateAllowBuild(); + OnPermissionChanged(p, grp, target); + return true; + } + + /// Sets the minimum rank allowed to access these permissions. + /// true if the minimum rank was changed, false if the given player + /// had insufficient permission to change the minimum rank. + public bool SetMax(Player p, Group grp) { + string target = IsVisit ? "pervisitmax" : "perbuildmax"; + if (grp.Permission != LevelPermission.Nobody && !CheckRank(p, grp, target)) return false; + Max = grp.Permission; + + UpdateAllowBuild(); + OnPermissionChanged(p, grp, target); + return true; + } + + + bool CheckRank(Player p, Group grp, string target) { + if (p != null && Min > p.Rank) { + Player.Message(p, "You cannot change the {0} of a level with a {0} higher than your rank.", target); + return false; + } + if (p != null && grp.Permission > p.Rank) { + Player.Message(p, "You cannot change the {0} of a level to a {0} higher than your rank.", target); + return false; + } + return true; + } + + void OnPermissionChanged(Player p, Group grp, string target) { + Level.SaveSettings(lvl); + Server.s.Log(lvl.name + " " + target + " permission changed to " + grp.Permission + "."); + Chat.MessageLevel(lvl, target + " permission changed to " + grp.ColoredName + "%S."); + if (p == null || p.level != lvl) + Player.Message(p, "{0} permission changed to {1}%S on {2}.", target, grp.ColoredName, lvl.name); + } + + void UpdateAllowBuild() { + if (IsVisit) return; + Player[] players = PlayerInfo.Online.Items; + foreach (Player p in players) { + if (p.level != lvl) continue; + p.AllowBuild = lvl.BuildAccess.Check(p, false); + } + } } -} +} \ No newline at end of file diff --git a/MCGalaxy_.csproj b/MCGalaxy_.csproj index 2802ed379..7eb3b5b84 100644 --- a/MCGalaxy_.csproj +++ b/MCGalaxy_.csproj @@ -385,7 +385,7 @@ - +