From 5a8da27f6b6b8966416bae4a7d49b07e34aeb007 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Wed, 24 Aug 2016 18:33:21 +1000 Subject: [PATCH] Implement perbuild whitelist/blacklist in /mapinfo and /perbuild. --- Commands/Information/CmdMapInfo.cs | 25 +++++++++++----- Commands/World/PermissionCmd.cs | 46 ++++++++++++++++-------------- Commands/World/PermissionCmds.cs | 32 +++++++-------------- Levels/LevelAccess.cs | 2 +- 4 files changed, 54 insertions(+), 51 deletions(-) diff --git a/Commands/Information/CmdMapInfo.cs b/Commands/Information/CmdMapInfo.cs index 79dd06602..700f963bc 100644 --- a/Commands/Information/CmdMapInfo.cs +++ b/Commands/Information/CmdMapInfo.cs @@ -89,14 +89,19 @@ namespace MCGalaxy.Commands { " %S: Visit rank = " + Group.findPerm(data.visit).ColoredName); Player.Message(p, " BuildMax Rank = " + Group.findPerm(data.buildmax).ColoredName + " %S: VisitMax Rank = " + Group.findPerm(data.visitmax).ColoredName); - List whitelist = data.VisitWhitelist; - List blacklist = data.VisitBlacklist; - GetBlacklistedPlayers(data.Name, blacklist); + + List vWhitelist = data.VisitWhitelist, vBlacklist = data.VisitBlacklist; + List bWhitelist = data.BuildWhitelist, bBlacklist = data.BuildBlacklist; + GetBlacklistedPlayers(data.Name, vBlacklist); - if (whitelist.Count > 0) - Player.Message(p, " Visit whitelist: &a" + whitelist.Join("%S, &a")); - if (blacklist.Count > 0) - Player.Message(p, " Visit blacklist: &c" + blacklist.Join("%S, &c")); + if (vWhitelist.Count > 0) + Player.Message(p, " Visit whitelist: &a" + vWhitelist.Join("%S, &a")); + if (vBlacklist.Count > 0) + Player.Message(p, " Visit blacklist: &c" + vBlacklist.Join("%S, &c")); + if (bWhitelist.Count > 0) + Player.Message(p, " Build whitelist: &a" + bWhitelist.Join("%S, &a")); + if (bBlacklist.Count > 0) + Player.Message(p, " Build blacklist: &c" + bBlacklist.Join("%S, &c")); if (String.IsNullOrEmpty(data.RealmOwner)) data.RealmOwner = GetRealmMapOwner(data.Name); @@ -165,6 +170,8 @@ namespace MCGalaxy.Commands { public LevelPermission visit, build, visitmax, buildmax; public List VisitWhitelist = new List(); public List VisitBlacklist = new List(); + public List BuildWhitelist = new List(); + public List BuildBlacklist = new List(); // Zombie data public string Authors; public int TotalRounds, HumanRounds; @@ -180,6 +187,8 @@ namespace MCGalaxy.Commands { visitmax = lvl.pervisitmax; buildmax = lvl.perbuildmax; VisitWhitelist = new List(lvl.VisitWhitelist); VisitBlacklist = new List(lvl.VisitBlacklist); + BuildWhitelist = new List(lvl.BuildWhitelist); + BuildBlacklist = new List(lvl.BuildBlacklist); Fog = lvl.FogColor; Sky = lvl.SkyColor; Clouds = lvl.CloudColor; Light = lvl.LightColor; Shadow = lvl.ShadowColor; @@ -222,6 +231,8 @@ namespace MCGalaxy.Commands { case "pervisitmax": visitmax = GetPerm(value); break; case "visitwhitelist": VisitWhitelist = Parse(value); break; case "visitblacklist": VisitBlacklist = Parse(value); break; + case "buildwhitelist": BuildWhitelist = Parse(value); break; + case "buildblacklist": BuildBlacklist = Parse(value); break; case "authors": Authors = value; break; case "roundsplayed": TotalRounds = int.Parse(value); break; diff --git a/Commands/World/PermissionCmd.cs b/Commands/World/PermissionCmd.cs index 9f2f7a922..00526afea 100644 --- a/Commands/World/PermissionCmd.cs +++ b/Commands/World/PermissionCmd.cs @@ -37,19 +37,20 @@ namespace MCGalaxy.Commands.World { return grp != null ? level : null; } - public static void UseList(Player p, string[] args, string target, - Func getter, - Func> wlGetter, Func> blGetter) { + protected void UseList(Player p, string[] args, bool isVisit) { + string target = isVisit ? "pervisit" : "perbuild"; if (args.Length == 1 && Player.IsSuper(p)) { Command.SuperRequiresArgs(target, p, "level"); return; } Level level = args.Length == 1 ? p.level : LevelInfo.FindMatches(p, args[0]); if (level == null) return; + LevelAccess access = isVisit ? level.VisitAccess : level.BuildAccess; string name = args.Length == 1 ? args[0] : args[1]; - string mode = name[0] == '+' ? "whitelist" : "blacklist"; - List list = name[0] == '+' ? wlGetter(level) : blGetter(level); - List other = name[0] == '+' ? blGetter(level) : wlGetter(level); + bool include = name[0] == '+'; + string mode = include ? "whitelist" : "blacklist"; + List list = include ? access.Whitelisted : access.Blacklisted; + List other = include ? access.Blacklisted : access.Whitelisted; name = name.Substring(1); if (name == "") { @@ -59,12 +60,8 @@ namespace MCGalaxy.Commands.World { Player.Message(p, "You cannot {0} yourself.", mode); return; } - if (p != null && getter(level) > p.Rank) { - Player.Message(p, "You cannot change the {0} {1} permissions " + - "for a player higher than your rank.", target, mode); return; - } - if (p != null && blGetter(level).CaselessContains(p.name)) { - Player.Message(p, "You cannot change {0} permissions as you are blacklisted.", target); return; + if (p != null && !access.CheckDetailed(p, false)) { + Player.Message(p, "Hence you cannot modify the {0} {1}.", target, mode); return; } if (p != null && PlayerInfo.GetGroup(name).Permission > p.Rank) { Player.Message(p, "You cannot whitelist/blacklist players of a higher rank."); return; @@ -73,10 +70,10 @@ namespace MCGalaxy.Commands.World { if (list.CaselessContains(name)) { Player.Message(p, "\"{0}\" is already {1}ed.", name, mode); return; } - list.Add(name); - other.CaselessRemove(name); + if (!other.CaselessRemove(name)) + list.Add(name); - UpdateAllowBuild(level); + access.UpdateAllowBuild(); Level.SaveSettings(level); string msg = name + " was " + target + " " + mode + "ed"; @@ -85,13 +82,20 @@ namespace MCGalaxy.Commands.World { if (p == null || p.level != level) Player.Message(p, msg + " on {0}.", level.name); } + - static void UpdateAllowBuild(Level level) { - Player[] players = PlayerInfo.Online.Items; - foreach (Player p in players) { - if (p.level != level) continue; - p.AllowBuild = level.BuildAccess.Check(p, false); - } + protected void MaxHelp(Player p, string action) { + Player.Message(p, "%T/{0} [Level] [Rank]", name); + Player.Message(p, "%HSets the highest rank able to {0} the given level.", action); + } + + protected void NormalHelp(Player p, string action, string action2) { + Player.Message(p, "%T/{0} [level] [rank]", name); + Player.Message(p, "%HSets the lowest rank able to {0} the given level.", action); + Player.Message(p, "%T/{0} [level] +[name]", name); + Player.Message(p, "%HAllows [name] to {0}, even if their rank cannot.", action2); + Player.Message(p, "%T/{0} [level] -[name]", name); + Player.Message(p, "%HPrevents [name] from {0}ing, even if their rank can.", action2); } } } \ No newline at end of file diff --git a/Commands/World/PermissionCmds.cs b/Commands/World/PermissionCmds.cs index 0e58b2e85..7a4731771 100644 --- a/Commands/World/PermissionCmds.cs +++ b/Commands/World/PermissionCmds.cs @@ -31,10 +31,7 @@ namespace MCGalaxy.Commands.World { if (lvl != null) lvl.BuildAccess.SetMax(p, grp); } - public override void Help(Player p) { - Player.Message(p, "%T/perbuildmax [Level] [Rank]"); - Player.Message(p, "%HSets the highest rank able to build on the given level."); - } + public override void Help(Player p) { MaxHelp(p, "build on"); } } public sealed class CmdPermissionBuild : PermissionCmd { @@ -44,15 +41,17 @@ namespace MCGalaxy.Commands.World { string[] args = message.Split(' '); if (args.Length < 1 || args.Length > 2) { Help(p); return; } + string name = args[args.Length - 1]; + if (name.Length > 0 && (name[0] == '+' || name[0] == '-')) { + UseList(p, args, false); return; + } + Group grp = null; Level lvl = GetArgs(p, args, ref grp); if (lvl != null) lvl.BuildAccess.SetMin(p, grp); } - public override void Help(Player p) { - Player.Message(p, "%T/perbuild [Level] [Rank]"); - Player.Message(p, "%HSets the lowest rank able to build on the given level."); - } + public override void Help(Player p) { NormalHelp(p, "build on", "build"); } } public sealed class CmdPervisitMax : PermissionCmd { @@ -67,10 +66,7 @@ namespace MCGalaxy.Commands.World { if (lvl != null) lvl.VisitAccess.SetMax(p, grp); } - public override void Help(Player p) { - Player.Message(p, "%T/pervisitmax [level] [rank]"); - Player.Message(p, "%HSets the highest rank able to visit the given level."); - } + public override void Help(Player p) { MaxHelp(p, "visit"); } } public sealed class CmdPermissionVisit : PermissionCmd { @@ -82,8 +78,7 @@ namespace MCGalaxy.Commands.World { string name = args[args.Length - 1]; if (name.Length > 0 && (name[0] == '+' || name[0] == '-')) { - PermissionCmd.UseList(p, args, "pervisit", l => l.permissionvisit, - l => l.VisitWhitelist, l => l.VisitBlacklist); return; + UseList(p, args, true); return; } Group grp = null; @@ -91,13 +86,6 @@ namespace MCGalaxy.Commands.World { if (lvl != null) lvl.VisitAccess.SetMin(p, grp); } - public override void Help(Player p) { - Player.Message(p, "%T/pervisit [level] [rank]"); - Player.Message(p, "%HSets the lowest rank able to visit the given level."); - Player.Message(p, "%T/pervisit [level] +[name]"); - Player.Message(p, "%HAllows [name] to visit the map, even if their rank cannot."); - Player.Message(p, "%T/pervisit [level] -[name]"); - Player.Message(p, "%HPrevents [name] from visiting the map, even if their rank can."); - } + public override void Help(Player p) { NormalHelp(p, "visit", "visit"); } } } \ No newline at end of file diff --git a/Levels/LevelAccess.cs b/Levels/LevelAccess.cs index e197c7d86..f39548cdd 100644 --- a/Levels/LevelAccess.cs +++ b/Levels/LevelAccess.cs @@ -148,7 +148,7 @@ namespace MCGalaxy { Player.Message(p, "{0} permission changed to {1}%S on {2}.", target, grp.ColoredName, lvl.name); } - void UpdateAllowBuild() { + internal void UpdateAllowBuild() { if (IsVisit) return; Player[] players = PlayerInfo.Online.Items; foreach (Player p in players) {