mirror of
https://github.com/ClassiCube/MCGalaxy.git
synced 2025-09-21 19:42:37 -04:00
Cleanup permission commands.
This commit is contained in:
parent
4c8e6fd95b
commit
362112697b
@ -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;
|
||||
|
@ -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) {
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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" />
|
||||
|
Loading…
x
Reference in New Issue
Block a user