Skip to content

Flag filter #75

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
# netbeans
/nbproject

# IntelliJ IDEA
/.idea/

# we use maven!
/build.xml

Expand All @@ -22,4 +25,4 @@
/manifest.mf

# Mac filesystem dust
/.DS_Store
/.DS_Store
13 changes: 12 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@
<groupId>org.dynmap</groupId>
<artifactId>Dynmap-WorldGuard</artifactId>

<properties>
<!-- dependency versions -->
<json.version>20220924</json.version>
</properties>

<build>
<resources>
<resource>
Expand Down Expand Up @@ -138,6 +143,12 @@
<version>0.2.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>${json.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.sk89q.worldedit</groupId>
<artifactId>worldedit-bukkit</artifactId>
Expand All @@ -152,4 +163,4 @@
</dependency>
</dependencies>
<version>1.4-SNAPSHOT</version>
</project>
</project>
73 changes: 66 additions & 7 deletions src/main/java/org/dynmap/worldguard/DynmapWorldGuardPlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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 = "<div class=\"infowindow\"><span style=\"font-size:120%;\">%regionname%</span><br /> Owner <span style=\"font-weight:bold;\">%playerowners%</span><br />Flags<br /><span style=\"font-weight:bold;\">%flags%</span></div>";
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;
Expand All @@ -66,6 +73,8 @@ public class DynmapWorldGuardPlugin extends JavaPlugin {
Set<String> hidden;
boolean stop;
int maxdepth;
boolean flagFilterEnabled;
boolean flagFilterHiddenByDefault;

@Override
public void onLoad() {
Expand Down Expand Up @@ -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<Flag<?>, Object> map = region.getFlags();
String flgs = "";
for(Flag<?> f : map.keySet()) {
flgs += f.getName() + ": " + map.get(f).toString() + "<br/>";

String flagsFilter = region.getFlag(flags_filter_flag);
JSONObject flagsJson = StringFlagUtils.generateJson(
flagsFilter
);
Map<Flag<?>, 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("<br/>");
}
}
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) &&
Expand Down Expand Up @@ -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) {
Expand All @@ -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;
Expand Down Expand Up @@ -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");
Expand Down
72 changes: 72 additions & 0 deletions src/main/java/org/dynmap/worldguard/StringFlagUtils.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
7 changes: 7 additions & 0 deletions src/main/resources/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 2 additions & 0 deletions src/main/resources/plugin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,5 @@ author: mikeprimm
depend: [ dynmap, WorldGuard ]
api-version: 1.13

libraries:
- org.json:json:${json.version}
24 changes: 24 additions & 0 deletions src/test/java/org/dynmap/worldguard/StringFlagUtilsTest.java
Original file line number Diff line number Diff line change
@@ -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"));
}
}