@@ -138,6 +143,12 @@
0.2.0
compile
+
+ org.json
+ json
+ ${json.version}
+ provided
+
com.sk89q.worldedit
worldedit-bukkit
@@ -152,4 +163,4 @@
1.4-SNAPSHOT
-
\ No newline at end of file
+
diff --git a/src/main/java/org/dynmap/worldguard/DynmapWorldGuardPlugin.java b/src/main/java/org/dynmap/worldguard/DynmapWorldGuardPlugin.java
index 74d9aad..10b78b5 100644
--- a/src/main/java/org/dynmap/worldguard/DynmapWorldGuardPlugin.java
+++ b/src/main/java/org/dynmap/worldguard/DynmapWorldGuardPlugin.java
@@ -11,6 +11,9 @@
import java.util.logging.Level;
import java.util.logging.Logger;
+import com.google.common.base.Strings;
+import com.sk89q.worldguard.protection.flags.StringFlag;
+import com.sk89q.worldguard.protection.flags.registry.FlagConflictException;
import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit;
import org.bukkit.configuration.ConfigurationSection;
@@ -42,15 +45,19 @@
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import com.sk89q.worldguard.protection.regions.RegionContainer;
import com.sk89q.worldguard.protection.regions.RegionType;
+import org.json.JSONException;
+import org.json.JSONObject;
public class DynmapWorldGuardPlugin extends JavaPlugin {
private static Logger log;
private static final String DEF_INFOWINDOW = "%regionname%
Owner %playerowners%
Flags
%flags%
";
public static final String BOOST_FLAG = "dynmap-boost";
+ public static final String FLAGS_FILTER_FLAG = "dynmap-flags-filter";
Plugin dynmap;
DynmapAPI api;
MarkerAPI markerapi;
BooleanFlag boost_flag;
+ StringFlag flags_filter_flag;
int updatesPerTick = 20;
FileConfiguration cfg;
@@ -66,6 +73,8 @@ public class DynmapWorldGuardPlugin extends JavaPlugin {
Set hidden;
boolean stop;
int maxdepth;
+ boolean flagFilterEnabled;
+ boolean flagFilterHiddenByDefault;
@Override
public void onLoad() {
@@ -124,15 +133,45 @@ private String formatInfoWindow(ProtectedRegion region, AreaMarker m) {
else
v = v.replace("%parent%", "");
v = v.replace("%priority%", String.valueOf(region.getPriority()));
- Map, Object> map = region.getFlags();
- String flgs = "";
- for(Flag> f : map.keySet()) {
- flgs += f.getName() + ": " + map.get(f).toString() + "
";
+
+ String flagsFilter = region.getFlag(flags_filter_flag);
+ JSONObject flagsJson = StringFlagUtils.generateJson(
+ flagsFilter
+ );
+ Map, Object> map = region.getFlags();
+ StringBuilder flgs = new StringBuilder();
+ for (Flag> f : map.keySet()) {
+ String flagName = f.getName();
+
+ if (Strings.isNullOrEmpty(flagName)) {
+ continue;
+ }
+
+ boolean flagFilter = true;
+ if (flagFilterEnabled) {
+ flagFilter = !flagFilterHiddenByDefault;
+
+ try {
+ Object flagFilterValue = flagsJson.get(flagName);
+ if (flagFilterValue instanceof Boolean) {
+ flagFilter = (Boolean)flagFilterValue;
+ }
+ } catch (JSONException e) {
+ }
+ }
+
+ if (flagFilter) {
+ flgs.append(flagName);
+ flgs.append(": ");
+ flgs.append(map.get(f).toString());
+ flgs.append("
");
+ }
}
- v = v.replace("%flags%", flgs);
+ v = v.replace("%flags%", flgs.toString());
+
return v;
}
-
+
private boolean isVisible(String id, String worldname) {
if((visible != null) && (visible.size() > 0)) {
if((visible.contains(id) == false) && (visible.contains("world:" + worldname) == false) &&
@@ -400,9 +439,10 @@ public void onEnable() {
}
private void registerCustomFlags() {
+ FlagRegistry fr = WorldGuard.getInstance().getFlagRegistry();
+
try {
BooleanFlag bf = new BooleanFlag(BOOST_FLAG);
- FlagRegistry fr = WorldGuard.getInstance().getFlagRegistry();
fr.register(bf);
boost_flag = bf;
} catch (Exception x) {
@@ -411,6 +451,17 @@ private void registerCustomFlags() {
if (boost_flag == null) {
log.info("Custom flag '" + BOOST_FLAG + "' not registered");
}
+
+ try {
+ StringFlag flagsFilterFlag = new StringFlag(FLAGS_FILTER_FLAG);
+ fr.register(flagsFilterFlag);
+ flags_filter_flag = flagsFilterFlag;
+ } catch (FlagConflictException ex) {
+ log.info("Error registering flag - " + ex.getMessage());
+ }
+ if (flags_filter_flag == null) {
+ log.info("Custom flag '" + FLAGS_FILTER_FLAG + "' not registered");
+ }
}
private boolean reload = false;
@@ -452,6 +503,14 @@ private void activate() {
infowindow = cfg.getString("infowindow", DEF_INFOWINDOW);
maxdepth = cfg.getInt("maxdepth", 16);
updatesPerTick = cfg.getInt("updates-per-tick", 20);
+ flagFilterEnabled = cfg.getBoolean(
+ "flag-filter.enable",
+ false
+ );
+ flagFilterHiddenByDefault = cfg.getBoolean(
+ "flag-filter.hidden-by-default",
+ false
+ );
/* Get style information */
defstyle = new AreaStyle(cfg, "regionstyle");
diff --git a/src/main/java/org/dynmap/worldguard/StringFlagUtils.java b/src/main/java/org/dynmap/worldguard/StringFlagUtils.java
new file mode 100644
index 0000000..ce9c4ff
--- /dev/null
+++ b/src/main/java/org/dynmap/worldguard/StringFlagUtils.java
@@ -0,0 +1,72 @@
+package org.dynmap.worldguard;
+
+import com.google.common.base.Strings;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import javax.annotation.Nullable;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class StringFlagUtils {
+ private static final String KEY_GROUP = "key";
+ private static final String VALUE_GROUP = "value";
+ private static final Pattern ENTRY_PATTERN = Pattern.compile(
+ "[\"']?(?<" + StringFlagUtils.KEY_GROUP +
+ ">[\\w-]+)[\"']?([:=][\"']?(?<" + StringFlagUtils.VALUE_GROUP +
+ ">[\\w-]+)[\"']?)?");
+
+ public static JSONObject generateJson(
+ final @Nullable String content
+ )
+ throws JSONException {
+ if (Strings.isNullOrEmpty(content)) {
+ return new JSONObject();
+ }
+
+ String jsonString = content.trim().replaceAll(
+ "[ \\t\\v\\r\\n]+",
+ ""
+ );
+
+ if (!jsonString.startsWith("{") && !jsonString.endsWith("}")) {
+ final StringBuilder jsonBuilder = new StringBuilder();
+ jsonBuilder.append('{');
+ String prefix = "";
+ for (String entry : jsonString.split("[,;]+")) {
+ final Matcher matcher = StringFlagUtils.ENTRY_PATTERN.matcher(
+ entry
+ );
+
+ if (!matcher.matches()) {
+ continue;
+ }
+
+ String key = matcher.group(StringFlagUtils.KEY_GROUP);
+ String value = matcher.group(StringFlagUtils.VALUE_GROUP);
+
+ if (
+ "yes".equalsIgnoreCase(value) ||
+ "allow".equalsIgnoreCase(value)
+ ) {
+ value = Boolean.TRUE.toString();
+ }
+
+ boolean boolValue = Boolean.parseBoolean(value);
+
+ jsonBuilder.append(prefix);
+ jsonBuilder.append('\"');
+ jsonBuilder.append(key);
+ jsonBuilder.append("\":");
+ jsonBuilder.append(boolValue);
+
+ prefix = ",";
+ }
+ jsonBuilder.append('}');
+
+ jsonString = jsonBuilder.toString();
+ }
+
+ return new JSONObject(jsonString);
+ }
+}
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index 1fa8105..b6b541d 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -52,3 +52,10 @@ maxdepth: 16
# Limit number of regions processed per tick (avoid lag spikes on servers with lots of regions)
updates-per-tick: 20
+
+# Filter region flags in info window
+flag-filter:
+ # Enable the flag filter feature
+ enable: false
+ # Should the flags hidden by default
+ hidden-by-default: false
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index 7043660..8b4da7a 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -5,3 +5,5 @@ author: mikeprimm
depend: [ dynmap, WorldGuard ]
api-version: 1.13
+libraries:
+ - org.json:json:${json.version}
diff --git a/src/test/java/org/dynmap/worldguard/StringFlagUtilsTest.java b/src/test/java/org/dynmap/worldguard/StringFlagUtilsTest.java
new file mode 100644
index 0000000..524543c
--- /dev/null
+++ b/src/test/java/org/dynmap/worldguard/StringFlagUtilsTest.java
@@ -0,0 +1,24 @@
+package org.dynmap.worldguard;
+
+import org.json.JSONObject;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StringFlagUtilsTest {
+ @Test
+ public void testGenerateJsonEmpty() {
+ JSONObject jsonObject = StringFlagUtils.generateJson("");
+
+ Assert.assertTrue(jsonObject.isEmpty());
+ }
+
+ @Test
+ public void testGenerateJsonMultipleFlags() {
+ JSONObject jsonObject = StringFlagUtils.generateJson(
+ "greeting:allow,farewell:deny"
+ );
+
+ Assert.assertTrue(jsonObject.getBoolean("greeting"));
+ Assert.assertFalse(jsonObject.getBoolean("farewell"));
+ }
+}