diff --git a/.gitignore b/.gitignore index 408c231..63b4839 100644 --- a/.gitignore +++ b/.gitignore @@ -1,25 +1,3 @@ -# Eclipse stuff -/.classpath -/.project -/.settings - -# netbeans -/nbproject - -# we use maven! -/build.xml - -# maven -/target - -# vim -.*.sw[a-p] - -# various other potential build files -/build -/bin -/dist -/manifest.mf - -# Mac filesystem dust -/.DS_Store \ No newline at end of file +/build/ +/.gradle/ +/target/classes/ diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..647b1d9 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../../../:\Users\jim\IdeaProjects\Dynmap-WorldGuard\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..c1d5cf9 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +Dynmap-WorldGuard \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..1e32a67 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/discord.xml b/.idea/discord.xml new file mode 100644 index 0000000..cd711a0 --- /dev/null +++ b/.idea/discord.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..611e7c8 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9ba3c3f --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries-with-intellij-classes.xml b/.idea/libraries-with-intellij-classes.xml new file mode 100644 index 0000000..9fa3156 --- /dev/null +++ b/.idea/libraries-with-intellij-classes.xml @@ -0,0 +1,65 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..2288807 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/Dynmap-WorldGuard.main.iml b/.idea/modules/Dynmap-WorldGuard.main.iml new file mode 100644 index 0000000..fa63d4b --- /dev/null +++ b/.idea/modules/Dynmap-WorldGuard.main.iml @@ -0,0 +1,12 @@ + + + + + + + SPIGOT + + + + + \ No newline at end of file diff --git a/.idea/modules/Dynmap-WorldGuard_main.iml b/.idea/modules/Dynmap-WorldGuard_main.iml new file mode 100644 index 0000000..fa63d4b --- /dev/null +++ b/.idea/modules/Dynmap-WorldGuard_main.iml @@ -0,0 +1,12 @@ + + + + + + + SPIGOT + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Dynmap-WorldGuard.iml b/Dynmap-WorldGuard.iml new file mode 100644 index 0000000..6d44b22 --- /dev/null +++ b/Dynmap-WorldGuard.iml @@ -0,0 +1,12 @@ + + + + + + + BUKKIT + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..dc6f737 --- /dev/null +++ b/build.gradle @@ -0,0 +1,61 @@ +import org.apache.tools.ant.filters.ReplaceTokens + +plugins { + id 'java' + id 'maven-publish' +} + +repositories { + mavenLocal() + mavenCentral() + + maven { + url 'https://repo.mikeprimm.com/' + } + + maven { + url 'https://maven.enginehub.org/repo/' + } +} + +dependencies { + compileOnly 'us.dynmap:dynmap-api:3.0-SNAPSHOT' + compileOnly 'com.sk89q.worldguard:worldguard-bukkit:7.0.5' + compileOnly 'com.sk89q.worldedit:worldedit-bukkit:7.0.0' + compileOnly 'com.sk89q:squirrelid:0.2.0' + compileOnly 'io.papermc.paper:paper-api:1.17.1-R0.1-SNAPSHOT' +} + +group = 'org.dynmap' +version = '1.3-SNAPSHOT' + +java.sourceCompatibility = JavaVersion.VERSION_16 +java.targetCompatibility = JavaVersion.VERSION_16 + +tasks { + processResources { + from("${project.rootDir}/src/main/resources") { + duplicatesStrategy = DuplicatesStrategy.INCLUDE + project.properties.findAll().each { + prop -> + if (prop.value != null && prop.value instanceof java.lang.String) { + filter(ReplaceTokens, tokens: [(prop.key): prop.value]) + filter(ReplaceTokens, tokens: [('project.' + prop.key): prop.value]) + } + } + } + } + + compileJava { + options.compilerArgs += ["-Xlint:all", "-Xlint:-processing"] + options.encoding = 'UTF-8' + } +} + +publishing { + publications { + maven(MavenPublication) { + from(components.java) + } + } +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..7454180 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..05679dc --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..744e882 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MSYS* | MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/pom.xml b/pom.xml index cdc91ce..a3cfc76 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 org.dynmap Dynmap-WorldGuard - + @@ -22,7 +22,7 @@ - + org.apache.maven.plugins @@ -61,7 +61,7 @@ - + @@ -79,6 +79,10 @@ sk89q-repo http://maven.sk89q.com/repo/ + + papermc + https://papermc.io/repo/repository/maven-public/ + @@ -87,11 +91,12 @@ dynmap-api 3.0-SNAPSHOT - - org.bukkit - bukkit - 1.7.10-R0.1-SNAPSHOT - + + io.papermc.paper + paper-api + 1.17.1-R0.1-SNAPSHOT + provided + com.sk89q.worldguard worldguard-bukkit diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..e8c0963 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,5 @@ +/* + * This file was generated by the Gradle 'init' task. + */ + +rootProject.name = 'Dynmap-WorldGuard' diff --git a/src/main/assembly/package.xml b/src/main/assembly/package.xml deleted file mode 100644 index 2ec55c3..0000000 --- a/src/main/assembly/package.xml +++ /dev/null @@ -1,16 +0,0 @@ - - bin - false - - zip - - - - - - ${project.build.directory}/${artifactId}-${version}.jar - / - ${artifactId}.jar - - - diff --git a/src/main/java/org/dynmap/worldguard/DynmapWorldGuardPlugin.java b/src/main/java/org/dynmap/worldguard/DynmapWorldGuardPlugin.java index 51df3b7..a52d48a 100644 --- a/src/main/java/org/dynmap/worldguard/DynmapWorldGuardPlugin.java +++ b/src/main/java/org/dynmap/worldguard/DynmapWorldGuardPlugin.java @@ -1,6 +1,5 @@ package org.dynmap.worldguard; -import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -11,6 +10,7 @@ import java.util.logging.Level; import java.util.logging.Logger; +import com.sk89q.worldguard.util.profile.cache.ProfileCache; import org.bukkit.Bukkit; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; @@ -26,7 +26,6 @@ import org.dynmap.markers.MarkerAPI; import org.dynmap.markers.MarkerSet; -import com.sk89q.squirrelid.cache.ProfileCache; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.World; @@ -52,7 +51,6 @@ public class DynmapWorldGuardPlugin extends JavaPlugin { BooleanFlag boost_flag; int updatesPerTick = 20; - FileConfiguration cfg; MarkerSet set; long updperiod; boolean use3d; @@ -108,7 +106,7 @@ public static void severe(String msg) { log.log(Level.SEVERE, msg); } - private Map resareas = new HashMap(); + private Map resareas = new HashMap<>(); private String formatInfoWindow(ProtectedRegion region, AreaMarker m) { String v = "
"+infowindow+"
"; @@ -124,24 +122,24 @@ private String formatInfoWindow(ProtectedRegion region, AreaMarker m) { v = v.replace("%parent%", ""); v = v.replace("%priority%", String.valueOf(region.getPriority())); Map, Object> map = region.getFlags(); - String flgs = ""; + StringBuilder flgs = new StringBuilder(); for(Flag f : map.keySet()) { - flgs += f.getName() + ": " + map.get(f).toString() + "
"; + flgs.append(f.getName()).append(": ").append(map.get(f).toString()).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) && - (visible.contains(worldname + "/" + id) == false)) { + if((!visible.contains(id)) && (!visible.contains("world:" + worldname)) && + (!visible.contains(worldname + "/" + id))) { return false; } } if((hidden != null) && (hidden.size() > 0)) { - if(hidden.contains(id) || hidden.contains("world:" + worldname) || hidden.contains(worldname + "/" + id)) - return false; + return !hidden.contains(id) && !hidden.contains("world:" + worldname) && !hidden.contains( + worldname + "/" + id); } return true; } @@ -161,15 +159,13 @@ else if((tok.length >= 2) && resid.startsWith(tok[0]) && resid.endsWith(tok[1])) } } if(as == null) { /* Check for owner style matches */ - if(ownerstyle.isEmpty() != true) { + if(!ownerstyle.isEmpty()) { DefaultDomain dd = region.getOwners(); PlayerDomain pd = dd.getPlayerDomain(); if(pd != null) { for(String p : pd.getPlayers()) { - if(as == null) { - as = ownerstyle.get(p.toLowerCase()); - if (as != null) break; - } + as = ownerstyle.get(p.toLowerCase()); + if (as != null) break; } if (as == null) { for(UUID uuid : pd.getUniqueIds()) { @@ -200,12 +196,9 @@ else if((tok.length >= 2) && resid.startsWith(tok[0]) && resid.endsWith(tok[1])) if(as == null) as = defstyle; - boolean unowned = false; - if((region.getOwners().getPlayers().size() == 0) && - (region.getOwners().getUniqueIds().size() == 0 )&& - (region.getOwners().getGroups().size() == 0)) { - unowned = true; - } + boolean unowned = (region.getOwners().getPlayers().size() == 0) && + (region.getOwners().getUniqueIds().size() == 0) && + (region.getOwners().getGroups().size() == 0); int sc = 0xFF0000; int fc = 0xFF0000; try { @@ -214,7 +207,7 @@ else if((tok.length >= 2) && resid.startsWith(tok[0]) && resid.endsWith(tok[1])) else sc = Integer.parseInt(as.strokecolor.substring(1), 16); fc = Integer.parseInt(as.fillcolor.substring(1), 16); - } catch (NumberFormatException nfx) { + } catch (NumberFormatException ignored) { } m.setLineStyle(as.strokeweight, as.strokeopacity, sc); m.setFillStyle(as.fillopacity, fc); @@ -223,7 +216,7 @@ else if((tok.length >= 2) && resid.startsWith(tok[0]) && resid.endsWith(tok[1])) } if (boost_flag != null) { Boolean b = region.getFlag(boost_flag); - m.setBoostFlag((b == null)?false:b.booleanValue()); + m.setBoostFlag(b != null && b); } } @@ -232,8 +225,8 @@ private void handleRegion(World world, ProtectedRegion region, Map newmap = new HashMap(); /* Build new map */ + Map newmap = new HashMap<>(); /* Build new map */ List worldsToDo = null; List regionsToDo = null; World curworld = null; @@ -304,7 +297,7 @@ public void run() { // If worlds list isn't primed, prime it if (worldsToDo == null) { List w = Bukkit.getWorlds(); - worldsToDo = new ArrayList(); + worldsToDo = new ArrayList<>(); for (org.bukkit.World wrld : w) { worldsToDo.add(WorldGuard.getInstance().getPlatform().getMatcher().getWorldByName(wrld.getName())); } @@ -327,8 +320,8 @@ public void run() { RegionManager rm = rc.get(curworld); /* Get region manager for world */ if(rm != null) { Map regions = rm.getRegions(); /* Get all the regions */ - if ((regions != null) && (regions.isEmpty() == false)) { - regionsToDo = new ArrayList(regions.values()); + if (!regions.isEmpty()) { + regionsToDo = new ArrayList<>(regions.values()); } } } @@ -392,13 +385,6 @@ public void onEnable() { /* If both enabled, activate */ if(dynmap.isEnabled() && wgp.isEnabled()) activate(); - /* Start up metrics */ - try { - MetricsLite ml = new MetricsLite(this); - ml.start(); - } catch (IOException iox) { - - } } private void registerCustomFlags() { @@ -457,9 +443,9 @@ private void activate() { /* Get style information */ defstyle = new AreaStyle(cfg, "regionstyle"); - cusstyle = new HashMap(); - ownerstyle = new HashMap(); - cuswildstyle = new HashMap(); + cusstyle = new HashMap<>(); + ownerstyle = new HashMap<>(); + cuswildstyle = new HashMap<>(); ConfigurationSection sect = cfg.getConfigurationSection("custstyle"); if(sect != null) { Set ids = sect.getKeys(false); @@ -481,17 +467,17 @@ private void activate() { } List vis = cfg.getStringList("visibleregions"); if(vis != null) { - visible = new HashSet(vis); + visible = new HashSet<>(vis); } List hid = cfg.getStringList("hiddenregions"); if(hid != null) { - hidden = new HashSet(hid); + hidden = new HashSet<>(hid); } /* Set up update job - based on periond */ int per = cfg.getInt("update.period", 300); if(per < 15) per = 15; - updperiod = (long)(per*20); + updperiod = per* 20L; stop = false; getServer().getScheduler().scheduleSyncDelayedTask(this, new UpdateJob(), 40); /* First time is 2 seconds */ @@ -507,5 +493,4 @@ public void onDisable() { resareas.clear(); stop = true; } - } diff --git a/src/main/java/org/dynmap/worldguard/MetricsLite.java b/src/main/java/org/dynmap/worldguard/MetricsLite.java deleted file mode 100644 index 911af3b..0000000 --- a/src/main/java/org/dynmap/worldguard/MetricsLite.java +++ /dev/null @@ -1,358 +0,0 @@ -/* - * Copyright 2011 Tyler Blair. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those of the - * authors and contributors and should not be interpreted as representing official policies, - * either expressed or implied, of anybody else. - */ - -package org.dynmap.worldguard; - -import org.bukkit.Bukkit; -import org.bukkit.configuration.InvalidConfigurationException; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.plugin.Plugin; -import org.bukkit.plugin.PluginDescriptionFile; -import org.bukkit.scheduler.BukkitTask; - -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.io.UnsupportedEncodingException; -import java.net.Proxy; -import java.net.URL; -import java.net.URLConnection; -import java.net.URLEncoder; -import java.util.UUID; -import java.util.logging.Level; - -public class MetricsLite { - - /** - * The current revision number - */ - private final static int REVISION = 5; - - /** - * The base url of the metrics domain - */ - private static final String BASE_URL = "http://mcstats.org"; - - /** - * The url used to report a server's status - */ - private static final String REPORT_URL = "/report/%s"; - - /** - * Interval of time to ping (in minutes) - */ - private final static int PING_INTERVAL = 10; - - /** - * The plugin this metrics submits for - */ - private final Plugin plugin; - - /** - * The plugin configuration file - */ - private final YamlConfiguration configuration; - - /** - * The plugin configuration file - */ - private final File configurationFile; - - /** - * Unique server id - */ - private final String guid; - - /** - * Lock for synchronization - */ - private final Object optOutLock = new Object(); - - /** - * Id of the scheduled task - */ - private volatile BukkitTask taskId = null; - - public MetricsLite(Plugin plugin) throws IOException { - if (plugin == null) { - throw new IllegalArgumentException("Plugin cannot be null"); - } - - this.plugin = plugin; - - // load the config - configurationFile = getConfigFile(); - configuration = YamlConfiguration.loadConfiguration(configurationFile); - - // add some defaults - configuration.addDefault("opt-out", false); - configuration.addDefault("guid", UUID.randomUUID().toString()); - - // Do we need to create the file? - if (configuration.get("guid", null) == null) { - configuration.options().header("http://mcstats.org").copyDefaults(true); - configuration.save(configurationFile); - } - - // Load the guid then - guid = configuration.getString("guid"); - } - - /** - * Start measuring statistics. This will immediately create an async repeating task as the plugin and send - * the initial data to the metrics backend, and then after that it will post in increments of - * PING_INTERVAL * 1200 ticks. - * - * @return True if statistics measuring is running, otherwise false. - */ - public boolean start() { - synchronized (optOutLock) { - // Did we opt out? - if (isOptOut()) { - return false; - } - - // Is metrics already running? - if (taskId != null) { - return true; - } - - // Begin hitting the server with glorious data - taskId = plugin.getServer().getScheduler().runTaskTimerAsynchronously(plugin, new Runnable() { - - private boolean firstPost = true; - - public void run() { - try { - // This has to be synchronized or it can collide with the disable method. - synchronized (optOutLock) { - // Disable Task, if it is running and the server owner decided to opt-out - if (isOptOut() && (taskId != null)) { - taskId.cancel(); - taskId = null; - } - } - - // We use the inverse of firstPost because if it is the first time we are posting, - // it is not a interval ping, so it evaluates to FALSE - // Each time thereafter it will evaluate to TRUE, i.e PING! - postPlugin(!firstPost); - - // After the first post we set firstPost to false - // Each post thereafter will be a ping - firstPost = false; - } catch (IOException e) { - //Bukkit.getLogger().log(Level.INFO, "[Metrics] " + e.getMessage()); - } - } - }, 0, PING_INTERVAL * 1200); - - return true; - } - } - - /** - * Has the server owner denied plugin metrics? - * - * @return true if metrics should be opted out of it - */ - public boolean isOptOut() { - synchronized(optOutLock) { - try { - // Reload the metrics file - configuration.load(getConfigFile()); - } catch (IOException ex) { - Bukkit.getLogger().log(Level.INFO, "[Metrics] " + ex.getMessage()); - return true; - } catch (InvalidConfigurationException ex) { - Bukkit.getLogger().log(Level.INFO, "[Metrics] " + ex.getMessage()); - return true; - } - return configuration.getBoolean("opt-out", false); - } - } - - /** - * Enables metrics for the server by setting "opt-out" to false in the config file and starting the metrics task. - * - * @throws IOException - */ - public void enable() throws IOException { - // This has to be synchronized or it can collide with the check in the task. - synchronized (optOutLock) { - // Check if the server owner has already set opt-out, if not, set it. - if (isOptOut()) { - configuration.set("opt-out", false); - configuration.save(configurationFile); - } - - // Enable Task, if it is not running - if (taskId == null) { - start(); - } - } - } - - /** - * Disables metrics for the server by setting "opt-out" to true in the config file and canceling the metrics task. - * - * @throws IOException - */ - public void disable() throws IOException { - // This has to be synchronized or it can collide with the check in the task. - synchronized (optOutLock) { - // Check if the server owner has already set opt-out, if not, set it. - if (!isOptOut()) { - configuration.set("opt-out", true); - configuration.save(configurationFile); - } - - // Disable Task, if it is running - if (taskId != null) { - taskId.cancel(); - taskId = null; - } - } - } - - /** - * Gets the File object of the config file that should be used to store data such as the GUID and opt-out status - * - * @return the File object for the config file - */ - public File getConfigFile() { - // I believe the easiest way to get the base folder (e.g craftbukkit set via -P) for plugins to use - // is to abuse the plugin object we already have - // plugin.getDataFolder() => base/plugins/PluginA/ - // pluginsFolder => base/plugins/ - // The base is not necessarily relative to the startup directory. - File pluginsFolder = plugin.getDataFolder().getParentFile(); - - // return => base/plugins/PluginMetrics/config.yml - return new File(new File(pluginsFolder, "PluginMetrics"), "config.yml"); - } - - /** - * Generic method that posts a plugin to the metrics website - */ - private void postPlugin(boolean isPing) throws IOException { - // The plugin's description file containg all of the plugin data such as name, version, author, etc - final PluginDescriptionFile description = plugin.getDescription(); - - // Construct the post data - final StringBuilder data = new StringBuilder(); - data.append(encode("guid")).append('=').append(encode(guid)); - encodeDataPair(data, "version", description.getVersion()); - encodeDataPair(data, "server", Bukkit.getVersion()); - encodeDataPair(data, "players", Integer.toString(Bukkit.getServer().getOnlinePlayers().size())); - encodeDataPair(data, "revision", String.valueOf(REVISION)); - - // If we're pinging, append it - if (isPing) { - encodeDataPair(data, "ping", "true"); - } - - // Create the url - URL url = new URL(BASE_URL + String.format(REPORT_URL, encode(plugin.getDescription().getName()))); - - // Connect to the website - URLConnection connection; - - // Mineshafter creates a socks proxy, so we can safely bypass it - // It does not reroute POST requests so we need to go around it - if (isMineshafterPresent()) { - connection = url.openConnection(Proxy.NO_PROXY); - } else { - connection = url.openConnection(); - } - - connection.setDoOutput(true); - - // Write the data - final OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream()); - writer.write(data.toString()); - writer.flush(); - - // Now read the response - final BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); - final String response = reader.readLine(); - - // close resources - writer.close(); - reader.close(); - - if (response == null || response.startsWith("ERR")) { - throw new IOException(response); //Throw the exception - } - //if (response.startsWith("OK")) - We should get "OK" followed by an optional description if everything goes right - } - - /** - * Check if mineshafter is present. If it is, we need to bypass it to send POST requests - * - * @return true if mineshafter is installed on the server - */ - private boolean isMineshafterPresent() { - try { - Class.forName("mineshafter.MineServer"); - return true; - } catch (Exception e) { - return false; - } - } - - /** - *

Encode a key/value data pair to be used in a HTTP post request. This INCLUDES a & so the first - * key/value pair MUST be included manually, e.g:

- * - * StringBuffer data = new StringBuffer(); - * data.append(encode("guid")).append('=').append(encode(guid)); - * encodeDataPair(data, "version", description.getVersion()); - * - * - * @param buffer the stringbuilder to append the data pair onto - * @param key the key value - * @param value the value - */ - private static void encodeDataPair(final StringBuilder buffer, final String key, final String value) throws UnsupportedEncodingException { - buffer.append('&').append(encode(key)).append('=').append(encode(value)); - } - - /** - * Encode text as UTF-8 - * - * @param text the text to encode - * @return the encoded text, as UTF-8 - */ - private static String encode(final String text) throws UnsupportedEncodingException { - return URLEncoder.encode(text, "UTF-8"); - } - -} \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index a5dddbe..6f0e5e8 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ name: Dynmap-WorldGuard main: org.dynmap.worldguard.DynmapWorldGuardPlugin -version: "${project.version}" +version: @project.version@ author: mikeprimm depend: [ dynmap, WorldGuard ] - +api-version: 1.16