mirror of
https://github.com/MassiveCraft/Factions.git
synced 2024-11-30 06:03:59 +01:00
New command /f config [setting] [value] which can be used to change any conf.json setting. This is mainly for people who have trouble editing the file manually, for whatever reason. It even fixes any capitalization errors, and saves the conf.json file immediately after an option is changed. Can be run by player or from server console. Uses new permission node "factions.config".
This commit is contained in:
parent
5dc6dcd9ed
commit
c818ddff99
@ -77,6 +77,7 @@ public class Factions extends JavaPlugin {
|
|||||||
commands.add(new FCommandBypass());
|
commands.add(new FCommandBypass());
|
||||||
commands.add(new FCommandChat());
|
commands.add(new FCommandChat());
|
||||||
commands.add(new FCommandClaim());
|
commands.add(new FCommandClaim());
|
||||||
|
commands.add(new FCommandConfig());
|
||||||
commands.add(new FCommandCreate());
|
commands.add(new FCommandCreate());
|
||||||
commands.add(new FCommandDeinvite());
|
commands.add(new FCommandDeinvite());
|
||||||
commands.add(new FCommandDescription());
|
commands.add(new FCommandDescription());
|
||||||
@ -337,6 +338,10 @@ public class Factions extends JavaPlugin {
|
|||||||
return hasPerm(sender, "factions.lock");
|
return hasPerm(sender, "factions.lock");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean hasPermConfigure(CommandSender sender) {
|
||||||
|
return hasPerm(sender, "factions.config");
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean hasPermDisband(CommandSender sender) {
|
public static boolean hasPermDisband(CommandSender sender) {
|
||||||
return hasPerm(sender, "factions.disband");
|
return hasPerm(sender, "factions.disband");
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.massivecraft.factions.commands;
|
package com.massivecraft.factions.commands;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
@ -229,15 +230,10 @@ public class FBaseCommand {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean parseBool(String str) {
|
public static final List<String> aliasTrue = new ArrayList<String>(Arrays.asList("true", "yes", "y", "ok", "on", "+"));
|
||||||
List<String> aliasTrue = new ArrayList<String>();
|
public static final List<String> aliasFalse = new ArrayList<String>(Arrays.asList("false", "no", "n", "off", "-"));
|
||||||
aliasTrue.add("true");
|
|
||||||
aliasTrue.add("yes");
|
|
||||||
aliasTrue.add("y");
|
|
||||||
aliasTrue.add("ok");
|
|
||||||
aliasTrue.add("on");
|
|
||||||
aliasTrue.add("+");
|
|
||||||
|
|
||||||
|
public boolean parseBool(String str) {
|
||||||
return aliasTrue.contains(str.toLowerCase());
|
return aliasTrue.contains(str.toLowerCase());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
225
src/com/massivecraft/factions/commands/FCommandConfig.java
Normal file
225
src/com/massivecraft/factions/commands/FCommandConfig.java
Normal file
@ -0,0 +1,225 @@
|
|||||||
|
package com.massivecraft.factions.commands;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.ParameterizedType;
|
||||||
|
import java.lang.reflect.Type;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import com.massivecraft.factions.Conf;
|
||||||
|
import com.massivecraft.factions.Factions;
|
||||||
|
|
||||||
|
public class FCommandConfig extends FBaseCommand {
|
||||||
|
|
||||||
|
private static HashMap<String, String> properFieldNames = new HashMap<String, String>();
|
||||||
|
|
||||||
|
public FCommandConfig() {
|
||||||
|
aliases.add("config");
|
||||||
|
|
||||||
|
senderMustBePlayer = false;
|
||||||
|
|
||||||
|
requiredParameters.add("setting");
|
||||||
|
requiredParameters.add("value");
|
||||||
|
|
||||||
|
helpDescription = "change a conf.json setting";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasPermission(CommandSender sender) {
|
||||||
|
return Factions.hasPermConfigure(sender);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void perform() {
|
||||||
|
|
||||||
|
if( isLocked() ) {
|
||||||
|
sendLockMessage();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// store a lookup map of lowercase field names paired with proper capitalization field names
|
||||||
|
// that way, if the person using this command messes up the capitalization, we can fix that
|
||||||
|
if (properFieldNames.isEmpty()) {
|
||||||
|
Field[] fields = Conf.class.getDeclaredFields();
|
||||||
|
for(int i = 0; i < fields.length; i++) {
|
||||||
|
properFieldNames.put(fields[i].getName().toLowerCase(), fields[i].getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String fieldName = properFieldNames.get(parameters.get(0).toLowerCase());
|
||||||
|
|
||||||
|
if (fieldName == null || fieldName.isEmpty()) {
|
||||||
|
sendMessage("No configuration setting \""+parameters.get(0)+"\" exists.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String success = "";
|
||||||
|
|
||||||
|
String value = parameters.get(1);
|
||||||
|
for(int i = 2; i < parameters.size(); i++) {
|
||||||
|
value += ' ' + parameters.get(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
Field target = Conf.class.getField(fieldName);
|
||||||
|
|
||||||
|
// boolean
|
||||||
|
if (target.getType() == boolean.class) {
|
||||||
|
if (aliasTrue.contains(value.toLowerCase())) {
|
||||||
|
target.setBoolean(null, true);
|
||||||
|
success = "\""+fieldName+"\" option set to true (enabled).";
|
||||||
|
}
|
||||||
|
else if (aliasFalse.contains(value.toLowerCase())) {
|
||||||
|
target.setBoolean(null, false);
|
||||||
|
success = "\""+fieldName+"\" option set to false (disabled).";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sendMessage("Cannot set \""+fieldName+"\": boolean value required (true or false).");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// int
|
||||||
|
else if (target.getType() == int.class) {
|
||||||
|
try {
|
||||||
|
int intVal = Integer.parseInt(value);
|
||||||
|
target.setInt(null, intVal);
|
||||||
|
success = "\""+fieldName+"\" option set to "+intVal+".";
|
||||||
|
}
|
||||||
|
catch(NumberFormatException ex) {
|
||||||
|
sendMessage("Cannot set \""+fieldName+"\": integer (whole number) value required.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// double
|
||||||
|
else if (target.getType() == double.class) {
|
||||||
|
try {
|
||||||
|
double doubleVal = Double.parseDouble(value);
|
||||||
|
target.setDouble(null, doubleVal);
|
||||||
|
success = "\""+fieldName+"\" option set to "+doubleVal+".";
|
||||||
|
}
|
||||||
|
catch(NumberFormatException ex) {
|
||||||
|
sendMessage("Cannot set \""+fieldName+"\": double (numeric) value required.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// String
|
||||||
|
else if (target.getType() == String.class) {
|
||||||
|
target.set(null, value);
|
||||||
|
success = "\""+fieldName+"\" option set to \""+value+"\".";
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChatColor
|
||||||
|
else if (target.getType() == ChatColor.class) {
|
||||||
|
ChatColor newColor = null;
|
||||||
|
try {
|
||||||
|
newColor = ChatColor.valueOf(value.toUpperCase());
|
||||||
|
}
|
||||||
|
catch (IllegalArgumentException ex) {
|
||||||
|
}
|
||||||
|
if (newColor == null) {
|
||||||
|
sendMessage("Cannot set \""+fieldName+"\": \""+value.toUpperCase()+"\" is not a valid color.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
target.set(null, newColor);
|
||||||
|
success = "\""+fieldName+"\" color option set to \""+value.toUpperCase()+"\".";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set<?> or other parameterized collection
|
||||||
|
else if (target.getGenericType() instanceof ParameterizedType) {
|
||||||
|
ParameterizedType targSet = (ParameterizedType)target.getGenericType();
|
||||||
|
Type innerType = targSet.getActualTypeArguments()[0];
|
||||||
|
|
||||||
|
// not a Set, somehow, and that should be the only collection we're using in Conf.java
|
||||||
|
if (targSet.getRawType() != Set.class) {
|
||||||
|
sendMessage("\""+fieldName+"\" is not a data collection type which can be modified with this command.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set<Material>
|
||||||
|
else if (innerType == Material.class) {
|
||||||
|
Material newMat = null;
|
||||||
|
try {
|
||||||
|
newMat = Material.valueOf(value.toUpperCase());
|
||||||
|
}
|
||||||
|
catch (IllegalArgumentException ex) {
|
||||||
|
}
|
||||||
|
if (newMat == null) {
|
||||||
|
sendMessage("Cannot change \""+fieldName+"\" set: \""+value.toUpperCase()+"\" is not a valid material.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Set<Material> matSet = (Set<Material>)target.get(null);
|
||||||
|
|
||||||
|
// Material already present, so remove it
|
||||||
|
if (matSet.contains(newMat)) {
|
||||||
|
matSet.remove(newMat);
|
||||||
|
target.set(null, matSet);
|
||||||
|
success = "\""+fieldName+"\" set: Material \""+value.toUpperCase()+"\" removed.";
|
||||||
|
}
|
||||||
|
// Material not present yet, add it
|
||||||
|
else {
|
||||||
|
matSet.add(newMat);
|
||||||
|
target.set(null, matSet);
|
||||||
|
success = "\""+fieldName+"\" set: Material \""+value.toUpperCase()+"\" added.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set<String>
|
||||||
|
else if (innerType == String.class) {
|
||||||
|
Set<String> stringSet = (Set<String>)target.get(null);
|
||||||
|
|
||||||
|
// String already present, so remove it
|
||||||
|
if (stringSet.contains(value)) {
|
||||||
|
stringSet.remove(value);
|
||||||
|
target.set(null, stringSet);
|
||||||
|
success = "\""+fieldName+"\" set: \""+value+"\" removed.";
|
||||||
|
}
|
||||||
|
// String not present yet, add it
|
||||||
|
else {
|
||||||
|
stringSet.add(value);
|
||||||
|
target.set(null, stringSet);
|
||||||
|
success = "\""+fieldName+"\" set: \""+value+"\" added.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set of unknown type
|
||||||
|
else {
|
||||||
|
sendMessage("\""+fieldName+"\" is not a data type set which can be modified with this command.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// unknown type
|
||||||
|
else {
|
||||||
|
sendMessage("\""+fieldName+"\" is not a data type which can be modified with this command.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (NoSuchFieldException ex) {
|
||||||
|
sendMessage("Configuration setting \""+fieldName+"\" couldn't be matched, though it should be... please report this error.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
catch (IllegalAccessException ex) {
|
||||||
|
sendMessage("Error setting configuration setting \""+fieldName+"\" to \""+value+"\".");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!success.isEmpty()) {
|
||||||
|
sendMessage(success);
|
||||||
|
if (sender instanceof Player) {
|
||||||
|
Factions.log(success + " Command was run by "+player.getName()+".");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// save change to disk
|
||||||
|
Conf.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -147,6 +147,7 @@ public class FCommandHelp extends FBaseCommand {
|
|||||||
pageLines.add( new FCommandReload().getUseageTemplate() );
|
pageLines.add( new FCommandReload().getUseageTemplate() );
|
||||||
pageLines.add( new FCommandSaveAll().getUseageTemplate() );
|
pageLines.add( new FCommandSaveAll().getUseageTemplate() );
|
||||||
pageLines.add( new FCommandVersion().getUseageTemplate() );
|
pageLines.add( new FCommandVersion().getUseageTemplate() );
|
||||||
|
pageLines.add( new FCommandConfig().getUseageTemplate() );
|
||||||
helpPages.add(pageLines);
|
helpPages.add(pageLines);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@ permissions:
|
|||||||
factions.disband: true
|
factions.disband: true
|
||||||
factions.worldOptions: true
|
factions.worldOptions: true
|
||||||
factions.commandDisable.none: true
|
factions.commandDisable.none: true
|
||||||
|
factions.config: true
|
||||||
factions.participate:
|
factions.participate:
|
||||||
description: Allows the player to participate in a faction
|
description: Allows the player to participate in a faction
|
||||||
default: true
|
default: true
|
||||||
@ -57,6 +58,9 @@ permissions:
|
|||||||
factions.worldOptions:
|
factions.worldOptions:
|
||||||
description: Can use the /f worldnoclaim and /f worldnopowerloss commands
|
description: Can use the /f worldnoclaim and /f worldnopowerloss commands
|
||||||
default: op
|
default: op
|
||||||
|
factions.config:
|
||||||
|
description: Can use /f config command to change conf.json options
|
||||||
|
default: op
|
||||||
factions.commandDisable.none:
|
factions.commandDisable.none:
|
||||||
description: no commands disabled (ignore all other commandDisable permissions)
|
description: no commands disabled (ignore all other commandDisable permissions)
|
||||||
default: op
|
default: op
|
||||||
|
Loading…
Reference in New Issue
Block a user