Semi-automatic command setup system
This commit is contained in:
parent
71436bb935
commit
5433468509
@ -28,6 +28,7 @@ import com.massivecraft.massivecore.command.requirement.Requirement;
|
||||
import com.massivecraft.massivecore.command.requirement.RequirementAbstract;
|
||||
import com.massivecraft.massivecore.command.requirement.RequirementHasPerm;
|
||||
import com.massivecraft.massivecore.command.type.Type;
|
||||
import com.massivecraft.massivecore.command.type.enumeration.TypeEnum;
|
||||
import com.massivecraft.massivecore.mixin.MixinMessage;
|
||||
import com.massivecraft.massivecore.mson.Mson;
|
||||
import com.massivecraft.massivecore.predicate.PredicateStartsWithIgnoreCase;
|
||||
@ -76,6 +77,7 @@ public class MassiveCommand implements Active, PluginIdentifiableCommand
|
||||
if (active)
|
||||
{
|
||||
getAllInstances().add(this);
|
||||
if (this.isSetupEnabled()) this.setup();
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -183,7 +185,20 @@ public class MassiveCommand implements Active, PluginIdentifiableCommand
|
||||
protected List<?> help = new ArrayList<>();
|
||||
|
||||
// The visibility of this command in help command.
|
||||
protected Visibility visibility = Visibility.VISIBLE;
|
||||
protected Visibility visibility = Visibility.VISIBLE;
|
||||
|
||||
// === SETUP ===
|
||||
|
||||
// Determines whether the smart setup process will be used, works for most of commands
|
||||
protected boolean setupEnabled = false;
|
||||
|
||||
// A base prefix such as "CmdFactions" that all names of commands in a plugin start with.
|
||||
// Used for finding the right permission.
|
||||
// Should be set in a super class for all the commands in a plugin.
|
||||
protected String setupPermBaseClassName = null;
|
||||
|
||||
// The Class representing the permissions.
|
||||
protected Class<? extends Enum<?>> setupPermClass = null;
|
||||
|
||||
// === EXECUTION ===
|
||||
|
||||
@ -888,7 +903,143 @@ public class MassiveCommand implements Active, PluginIdentifiableCommand
|
||||
if (this.getVisibility() == Visibility.INVISIBLE) return false;
|
||||
return this.isRequirementsMet(sender, false);
|
||||
}
|
||||
|
||||
|
||||
// -------------------------------------------- //
|
||||
// SETUP
|
||||
// -------------------------------------------- //
|
||||
|
||||
public boolean isSetupEnabled() { return this.setupEnabled; }
|
||||
public void setSetupEnabled(boolean setupEnabled) { this.setupEnabled = setupEnabled; }
|
||||
|
||||
public String getSetupPermBaseClassName()
|
||||
{
|
||||
// Use field if present
|
||||
if (this.setupPermBaseClassName != null) return this.setupPermBaseClassName;
|
||||
|
||||
// Otherwise guess
|
||||
return this.getRoot().getClass().getSimpleName();
|
||||
}
|
||||
public void setSetupPermBaseClassName(String setupPermBaseClassName) { this.setupPermBaseClassName = setupPermBaseClassName; }
|
||||
|
||||
public <T extends Enum<T>> Class<T> getSetupPermClass()
|
||||
{
|
||||
// Use field if present
|
||||
if (this.setupPermClass != null) return (Class) this.setupPermClass;
|
||||
|
||||
// Otherwise guess
|
||||
String nameClass = this.getRoot().getPlugin().getClass().getPackage().getName() + ".Perm";
|
||||
try
|
||||
{
|
||||
return (Class) Class.forName(nameClass);
|
||||
}
|
||||
catch (ClassNotFoundException e)
|
||||
{
|
||||
// If setup is enabled but the class is neither specified nor findable
|
||||
// an error should be thrown to notify the developer.
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
public <T extends Enum<T>> void setSetupPermClass(Class<T> setupPermClass) { this.setupPermClass = setupPermClass; }
|
||||
|
||||
public void setup()
|
||||
{
|
||||
String name = this.calcName();
|
||||
if (name != null) this.getAliases().add(0, name);
|
||||
|
||||
Object permission = this.calcPerm();
|
||||
if (permission != null) this.addRequirements(RequirementHasPerm.get(permission));
|
||||
|
||||
this.setupChildren();
|
||||
}
|
||||
|
||||
public void setupChildren()
|
||||
{
|
||||
for (MassiveCommand child : this.getChildren())
|
||||
{
|
||||
if (child.isSetupEnabled()) child.setup();
|
||||
}
|
||||
}
|
||||
|
||||
protected String calcName()
|
||||
{
|
||||
// If this is a child command
|
||||
if (this.isRoot()) return null;
|
||||
|
||||
// ... get name of parent ...
|
||||
String parentName = this.getParent().getClass().getSimpleName();
|
||||
|
||||
// ... and only try if the names match ...
|
||||
String name = this.getClass().getSimpleName();
|
||||
if ( ! name.startsWith(parentName)) return null;
|
||||
|
||||
// ... and without parent prefix ...
|
||||
String ret = name.substring(parentName.length());
|
||||
|
||||
// ... and lowercase the first character.
|
||||
ret = Character.toLowerCase(ret.charAt(0)) + ret.substring(1);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
protected <T extends Enum<T>> T calcPerm()
|
||||
{
|
||||
Class<T> permClass = this.getSetupPermClass();
|
||||
String basePrefix = this.getSetupPermBaseClassName();
|
||||
|
||||
if (permClass == null) return null;
|
||||
if (basePrefix == null) return null;
|
||||
|
||||
// Only try if the name matches with the expected prefix ...
|
||||
String name = this.getClass().getSimpleName();
|
||||
if ( ! name.startsWith(basePrefix)) return null;
|
||||
|
||||
// ... and remove the prefix ...
|
||||
String permName = name.substring(basePrefix.length());
|
||||
|
||||
// ... split at new words and separate with underscore.
|
||||
permName = Txt.implode(Txt.camelsplit(permName), "_");
|
||||
|
||||
// Enums are alway upper case.
|
||||
permName = permName.toUpperCase();
|
||||
|
||||
// If the name is empty it is the base command
|
||||
if (permName.isEmpty()) permName = "BASECOMMAND";
|
||||
|
||||
// Create ret
|
||||
T ret = null;
|
||||
|
||||
// Try non-lenient
|
||||
ret = getPerm(permName, false, permClass);
|
||||
if (ret != null) return ret;
|
||||
|
||||
// Try lenient
|
||||
ret = getPerm(permName, true, permClass);
|
||||
if (ret != null) return ret;
|
||||
|
||||
throw new RuntimeException("Could not find permission matching: " + permName);
|
||||
}
|
||||
|
||||
protected static <T extends Enum<T>> T getPerm(String permName, boolean lenient, Class<T> permClass)
|
||||
{
|
||||
permName = getPermCompareString(permName, lenient);
|
||||
for (T perm : TypeEnum.getEnumValues(permClass))
|
||||
{
|
||||
String compare = getPermCompareString(perm.name(), lenient);
|
||||
if (compare.equals(permName)) return perm;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
protected static String getPermCompareString(String permName, boolean lenient)
|
||||
{
|
||||
if (lenient)
|
||||
{
|
||||
permName = permName.toUpperCase();
|
||||
permName = permName.replace("_", "");
|
||||
}
|
||||
return permName;
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// EXECUTION
|
||||
// -------------------------------------------- //
|
||||
@ -1179,6 +1330,7 @@ public class MassiveCommand implements Active, PluginIdentifiableCommand
|
||||
}
|
||||
|
||||
// Then ourself
|
||||
if (this.getAliases().isEmpty()) throw new IllegalStateException(this.getClass().getSimpleName() + " has no aliases.");
|
||||
ret.append(this.getAliases().get(0));
|
||||
|
||||
// Then args
|
||||
|
Loading…
Reference in New Issue
Block a user