Cleanup permission commands.

This commit is contained in:
UnknownShadow200 2016-08-24 16:36:34 +10:00
parent 4c8e6fd95b
commit 362112697b
4 changed files with 96 additions and 71 deletions

View File

@ -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<Level, LevelPermission> getter, Action<Level, LevelPermission> 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<string> list = name[0] == '+' ? wlGetter(level) : blGetter(level);
List<string> 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;

View File

@ -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) {

View File

@ -36,11 +36,19 @@ namespace MCGalaxy {
/// <summary> Lowest allowed rank. </summary>
public LevelPermission Min {
get { return IsVisit ? lvl.permissionvisit : lvl.permissionbuild; }
set {
if (IsVisit) lvl.permissionvisit = value;
else lvl.permissionbuild = value;
}
}
/// <summary> Highest allowed rank. </summary>
public LevelPermission Max {
get { return IsVisit ? lvl.pervisitmax : lvl.perbuildmax; }
set {
if (IsVisit) lvl.pervisitmax = value;
else lvl.perbuildmax = value;
}
}
/// <summary> List of always allowed players, overrides rank allowances. </summary>
@ -53,6 +61,7 @@ namespace MCGalaxy {
get { return IsVisit ? lvl.VisitBlacklist : lvl.BuildBlacklist; }
}
/// <summary> Returns whether the given player is allowed by these access permissions. </summary>
public bool Check(Player p, bool ignoreRankPerm = false) {
if (Blacklisted.CaselessContains(p.name)) return false;
@ -90,5 +99,62 @@ namespace MCGalaxy {
}
return true;
}
/// <summary> Sets the minimum rank allowed to access these permissions. </summary>
/// <returns> true if the minimum rank was changed, false if the given player
/// had insufficient permission to change the minimum rank. </returns>
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;
}
/// <summary> Sets the minimum rank allowed to access these permissions. </summary>
/// <returns> true if the minimum rank was changed, false if the given player
/// had insufficient permission to change the minimum rank. </returns>
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);
}
}
}
}
}

View File

@ -385,7 +385,7 @@
<Compile Include="Commands\World\CmdMuseum.cs" />
<Compile Include="Commands\World\CmdNewLvl.cs" />
<Compile Include="Commands\World\CmdPause.cs" />
<Compile Include="Commands\World\CmdPermissions.cs" />
<Compile Include="Commands\World\PermissionCmds.cs" />
<Compile Include="Commands\World\CmdPhysics.cs" />
<Compile Include="Commands\World\CmdRenameLvl.cs" />
<Compile Include="Commands\World\CmdResizeLvl.cs" />