diff --git a/.gitignore b/.gitignore index 408c231..eb0e1a5 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,9 @@ # netbeans /nbproject +# IntelliJ IDEA +/.idea/ + # we use maven! /build.xml @@ -22,4 +25,4 @@ /manifest.mf # Mac filesystem dust -/.DS_Store \ No newline at end of file +/.DS_Store diff --git a/pom.xml b/pom.xml index 5d92587..fc94a3a 100644 --- a/pom.xml +++ b/pom.xml @@ -3,6 +3,11 @@ org.dynmap Dynmap-WorldGuard + + + 20220924 + + @@ -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")); + } +}