Updated /f config to support modifying "factionFlagDefaults" and "factionPermDefaults". Both of these settings require an additional argument more than other settings.

Examples:
/f config factionFlagDefaults firespread false  - set default "FIRESPREAD" faction flag to false
/f config factionFlagDefaults monsters true  - set default "MONSTERS" faction flag to true
/f config factionPermDefaults build ally  - for default "BUILD" faction permission, add/remove permission for allies
/f config factionPermDefaults withdraw member  - for default "WITHDRAW" faction permission, add/remove permission for regular faction members
This commit is contained in:
Brettflan 2012-03-11 07:33:47 -05:00
parent fd44983ae2
commit a888a9c5b5

View File

@ -5,6 +5,8 @@ import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.Set; import java.util.Set;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
@ -13,7 +15,10 @@ import org.bukkit.entity.Player;
import com.massivecraft.factions.Conf; import com.massivecraft.factions.Conf;
import com.massivecraft.factions.P; import com.massivecraft.factions.P;
import com.massivecraft.factions.integration.SpoutFeatures; import com.massivecraft.factions.integration.SpoutFeatures;
import com.massivecraft.factions.struct.FFlag;
import com.massivecraft.factions.struct.FPerm;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import com.massivecraft.factions.struct.Rel;
public class CmdConfig extends FCommand public class CmdConfig extends FCommand
{ {
@ -174,76 +179,186 @@ public class CmdConfig extends FCommand
ParameterizedType targSet = (ParameterizedType)target.getGenericType(); ParameterizedType targSet = (ParameterizedType)target.getGenericType();
Type innerType = targSet.getActualTypeArguments()[0]; Type innerType = targSet.getActualTypeArguments()[0];
// not a Set, somehow, and that should be the only collection we're using in Conf.java // Set<?>
if (targSet.getRawType() != Set.class) if (targSet.getRawType() == Set.class)
{ {
sendMessage("\""+fieldName+"\" is not a data collection type which can be modified with this command."); // Set<Material>
return; if (innerType == Material.class)
} {
Material newMat = null;
try
{
newMat = Material.valueOf(value.toUpperCase());
}
catch (IllegalArgumentException ex)
{
// Set<Material> }
else if (innerType == Material.class) if (newMat == null)
{ {
Material newMat = null; sendMessage("Cannot change \""+fieldName+"\" set: \""+value.toUpperCase()+"\" is not a valid material.");
try return;
{ }
newMat = Material.valueOf(value.toUpperCase());
} @SuppressWarnings("unchecked")
catch (IllegalArgumentException ex) Set<Material> matSet = (Set<Material>)target.get(null);
{
// Material already present, so remove it
} if (matSet.contains(newMat))
if (newMat == null) {
{ matSet.remove(newMat);
sendMessage("Cannot change \""+fieldName+"\" set: \""+value.toUpperCase()+"\" is not a valid material."); target.set(null, matSet);
return; 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.";
}
} }
@SuppressWarnings("unchecked") // Set<String>
Set<Material> matSet = (Set<Material>)target.get(null); else if (innerType == String.class)
// Material already present, so remove it
if (matSet.contains(newMat))
{ {
matSet.remove(newMat); @SuppressWarnings("unchecked")
target.set(null, matSet); Set<String> stringSet = (Set<String>)target.get(null);
success = "\""+fieldName+"\" set: Material \""+value.toUpperCase()+"\" removed.";
// String already present, so remove it
if (stringSet.contains(value))
{
stringSet.remove(value);
success = "\""+fieldName+"\" set: \""+value+"\" removed.";
}
// String not present yet, add it
else
{
stringSet.add(value);
success = "\""+fieldName+"\" set: \""+value+"\" added.";
}
target.set(null, stringSet);
} }
// Material not present yet, add it
// Set of unknown type
else else
{ {
matSet.add(newMat); sendMessage("\""+fieldName+"\" is not a data type set which can be modified with this command.");
target.set(null, matSet); return;
success = "\""+fieldName+"\" set: Material \""+value.toUpperCase()+"\" added.";
} }
} }
// Set<String> // Map<?, ?>
else if (innerType == String.class) else if (targSet.getRawType() == Map.class)
{ {
@SuppressWarnings("unchecked") if (args.size() < 3)
Set<String> stringSet = (Set<String>)target.get(null);
// String already present, so remove it
if (stringSet.contains(value))
{ {
stringSet.remove(value); sendMessage("Cannot change \""+fieldName+"\" map: not enough arguments passed.");
target.set(null, stringSet); return;
success = "\""+fieldName+"\" set: \""+value+"\" removed.";
} }
// String not present yet, add it Type innerType2 = targSet.getActualTypeArguments()[1];
else String value1 = args.get(1);
String value2 = value.substring(value1.length() + 1);
// Map<FFlag, Boolean>
if (innerType == FFlag.class && innerType2 == Boolean.class)
{ {
stringSet.add(value); value1 = value1.toUpperCase();
target.set(null, stringSet); FFlag newFlag = null;
success = "\""+fieldName+"\" set: \""+value+"\" added."; try
{
newFlag = FFlag.valueOf(value1);
}
catch (IllegalArgumentException ex) {}
if (newFlag == null)
{
sendMessage("Cannot change \""+fieldName+"\" map: \""+value1+"\" is not a valid FFlag.");
return;
}
@SuppressWarnings("unchecked")
Map<FFlag, Boolean> map = (Map<FFlag, Boolean>)target.get(null);
Boolean targetValue = this.strAsBool(value2);
map.put(newFlag, targetValue);
target.set(null, map);
if (targetValue)
success = "\""+fieldName+"\" flag \""+value1+"\" set to true (enabled).";
else
success = "\""+fieldName+"\" flag \""+value1+"\" set to false (disabled).";
}
// Map<FPerm, Set<Rel>>
else if (innerType == FPerm.class && innerType2 instanceof ParameterizedType)
{
if (((ParameterizedType)innerType2).getRawType() != Set.class)
{
sendMessage("\""+fieldName+"\" is not a data type map which can be modified with this command, due to the inner collection type.");
return;
}
value1 = value1.toUpperCase();
value2 = value2.toUpperCase();
FPerm newPerm = null;
Rel newRel = null;
try
{
newPerm = FPerm.valueOf(value1);
newRel = Rel.valueOf(value2);
}
catch (IllegalArgumentException ex) {}
if (newPerm == null)
{
sendMessage("Cannot change \""+fieldName+"\" map: \""+value1+"\" is not a valid FPerm.");
return;
}
if (newRel == null)
{
sendMessage("Cannot change \""+fieldName+"\" map: \""+value2+"\" is not a valid Rel.");
return;
}
@SuppressWarnings("unchecked")
Map<FPerm, Set<Rel>> map = (Map<FPerm, Set<Rel>>)target.get(null);
Set<Rel> relSet = map.get(newPerm);
if (relSet == null)
relSet = new HashSet<Rel>();
// Rel already present, so remove it
if (relSet.contains(newRel))
{
relSet.remove(newRel);
success = "\""+fieldName+"\" permission \""+value1+"\": relation \""+value2+"\" removed.";
}
// Rel not present yet, add it
else
{
relSet.add(newRel);
success = "\""+fieldName+"\" permission \""+value1+"\": relation \""+value2+"\" added.";
}
map.put(newPerm, relSet);
target.set(null, map);
}
// Map of unknown type
else
{
sendMessage("\""+fieldName+"\" is not a data type map which can be modified with this command.");
return;
} }
} }
// Set of unknown type // not a Set or Map?
else else
{ {
sendMessage("\""+fieldName+"\" is not a data type set which can be modified with this command."); sendMessage("\""+fieldName+"\" is not a data collection type which can be modified with this command.");
return; return;
} }
} }