Skip to content

Commit

Permalink
Allow changing perbuild/pervisit of multiple levels at once by comma …
Browse files Browse the repository at this point in the history
…separating map names
  • Loading branch information
UnknownShadow200 committed Jul 25, 2022
1 parent b8329b0 commit 84958c1
Showing 1 changed file with 69 additions and 44 deletions.
113 changes: 69 additions & 44 deletions MCGalaxy/Commands/World/PermissionCmds.cs
Expand Up @@ -18,13 +18,15 @@
using System;
using System.Collections.Generic;

namespace MCGalaxy.Commands.World {
public abstract class PermissionCmd : Command2 {
namespace MCGalaxy.Commands.World
{
public abstract class PermissionCmd : Command2
{
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 bool Do(Player p, string[] args, int offset, bool max,
public static bool Do(Player p, string[] args, int offset, bool max,
AccessController access, CommandData data, Level lvl) {
for (int i = offset; i < args.Length; i++) {
string arg = args[i];
Expand All @@ -42,40 +44,14 @@ public abstract class PermissionCmd : Command2 {
}
return true;
}

protected void DoLevel(Player p, string message, CommandData data, bool visit) {
const string maxPrefix = "-max ";
bool max = message.CaselessStarts(maxPrefix);
if (max) message = message.Substring(maxPrefix.Length);

string[] args = message.SplitSpaces();
if (message.Length == 0 || args.Length > 2) { Help(p); return; }
if (args.Length == 1 && p.IsSuper) {
Command.SuperRequiresArgs(name, p, "level"); return;
}

string map = args.Length == 1 ? p.level.name : Matcher.FindMaps(p, args[0]);
if (map == null) return;
Level lvl;
LevelConfig cfg = LevelInfo.GetConfig(map, out lvl);
int offset = args.Length == 1 ? 0 : 1;

AccessController access;
if (lvl == null) {
access = new LevelAccessController(cfg, map, visit);
} else {
access = visit ? lvl.VisitAccess : lvl.BuildAccess;
}
Do(p, args, offset, max, access, data, lvl);
}


static bool SetList(Player p, string name,
AccessController access, CommandData data, Level lvl) {
bool include = name[0] == '+';
string mode = include ? "whitelist" : "blacklist";
name = name.Substring(1);
if (name.Length == 0) {
p.Message("You must provide a player name to {0}.", mode);
p.Message("You must provide a player name to {0}.", mode);
return false;
}

Expand All @@ -92,45 +68,94 @@ public abstract class PermissionCmd : Command2 {
access.Blacklist(p, data.Rank, lvl, name);
}
return true;
}
}
}

public abstract class LevelPermissionCmd : PermissionCmd
{
public abstract bool IsVisit { get; }

public override void Use(Player p, string message, CommandData data) {
const string maxPrefix = "-max ";
bool max = message.CaselessStarts(maxPrefix);
if (max) message = message.Substring(maxPrefix.Length);

string[] args = message.SplitSpaces();
if (message.Length == 0 || args.Length > 2) { Help(p); return; }

if (args.Length == 1) {
// special case /perbuild [permission] to current level
if (p.IsSuper) {
Command.SuperRequiresArgs(name, p, "level");
} else {
UpdatePerms(p, p.level.name, data, args, max);
}
return;
}

foreach (string name in args[0].SplitComma())
{
string map = Matcher.FindMaps(p, name);
if (map == null) continue;

UpdatePerms(p, map, data, args, max);
}
}

void UpdatePerms(Player p, string map, CommandData data, string[] args, bool max) {
Level lvl;
LevelConfig cfg = LevelInfo.GetConfig(map, out lvl);
int offset = args.Length == 1 ? 0 : 1;

AccessController access;
if (lvl == null) {
access = new LevelAccessController(cfg, map, IsVisit);
} else {
access = IsVisit ? lvl.VisitAccess : lvl.BuildAccess;
}
Do(p, args, offset, max, access, data, lvl);
}

public override void Help(Player p) {
string action = IsVisit ? "visit" : "build on";
string verb = IsVisit ? "visit" : "build";

protected void ShowHelp(Player p, string action, string action2) {
p.Message("&T/{0} [level] [rank]", name);
p.Message("&HSets the lowest rank able to {0} the given level.", action);
p.Message("&T/{0} -max [level] [Rank]", name);
p.Message("&HSets the highest rank able to {0} the given level.", action);
p.Message("&T/{0} [level] +[name]", name);
p.Message("&HAllows [name] to {0}, even if their rank cannot.", action2);
p.Message("&HAllows [name] to {0}, even if their rank cannot.", verb);
p.Message("&T/{0} [level] -[name]", name);
p.Message("&HPrevents [name] from {0}ing, even if their rank can.", action2);
p.Message("&HPrevents [name] from {0}ing, even if their rank can.", verb);
}
}

public sealed class CmdPermissionBuild : PermissionCmd {
public sealed class CmdPermissionBuild : LevelPermissionCmd
{
public override string name { get { return "PerBuild"; } }
public override string shortcut { get { return "WBuild"; } }
public override bool IsVisit { get { return false; } }

public override CommandAlias[] Aliases {
get { return new[] { new CommandAlias("WorldBuild"), new CommandAlias("PerBuildMax", "-max") }; }
}
public override CommandPerm[] ExtraPerms {
get { return new[] { new CommandPerm(LevelPermission.Operator, "bypass max build rank restriction") }; }
}

public override void Use(Player p, string message, CommandData data) { DoLevel(p, message, data, false); }
public override void Help(Player p) { ShowHelp(p, "build on", "build"); }
}

public sealed class CmdPermissionVisit : PermissionCmd {
public sealed class CmdPermissionVisit : LevelPermissionCmd
{
public override string name { get { return "PerVisit"; } }
public override string shortcut { get { return "WAccess"; } }
public override bool IsVisit { get { return true; } }

public override CommandAlias[] Aliases {
get { return new[] { new CommandAlias("WorldAccess"), new CommandAlias("PerVisitMax", "-max") }; }
}
public override CommandPerm[] ExtraPerms {
get { return new[] { new CommandPerm(LevelPermission.Operator, "bypass max visit rank restriction") }; }
}

public override void Use(Player p, string message, CommandData data) { DoLevel(p, message, data, true); }
public override void Help(Player p) { ShowHelp(p, "visit", "visit"); }
}
}
}

0 comments on commit 84958c1

Please sign in to comment.