From d4ed77fdc605b4589c0498bdf6fcc196aa396740 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Sun, 13 Dec 2020 21:11:29 -0500 Subject: [PATCH 1/8] Update FakeServer (#3829) --- .../src/test/java/com/earth2me/essentials/FakeServer.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Essentials/src/test/java/com/earth2me/essentials/FakeServer.java b/Essentials/src/test/java/com/earth2me/essentials/FakeServer.java index 6ae104a6e..554e4c390 100644 --- a/Essentials/src/test/java/com/earth2me/essentials/FakeServer.java +++ b/Essentials/src/test/java/com/earth2me/essentials/FakeServer.java @@ -1399,4 +1399,8 @@ public class FakeServer implements Server { } } + @Override + public int getMaxWorldSize() { + throw new UnsupportedOperationException("Not supported yet."); + } } From f3207052168a56eb668b66a5955632755ae61d94 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Sun, 13 Dec 2020 23:54:54 -0500 Subject: [PATCH 2/8] Fix build script not working when git repo isn't cloned (#3831) --- build.gradle | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 7bcbfd4fc..2ced1ac05 100644 --- a/build.gradle +++ b/build.gradle @@ -20,6 +20,9 @@ allprojects { } def commitsSinceLastTag() { + if (grgit == null) { + return 0 + } def tags = grgit.tag.list().stream().map({it.commit}).toList() def commit = grgit.head() def depth = 0 @@ -32,7 +35,7 @@ def commitsSinceLastTag() { } ext { - GIT_COMMIT = grgit.head().abbreviatedId + GIT_COMMIT = grgit == null ? "unknown" : grgit.head().abbreviatedId GIT_DEPTH = commitsSinceLastTag() fullVersion = "${version}-${GIT_COMMIT}".replace("-SNAPSHOT", "-dev+${GIT_DEPTH}") From 001213ee2cc71808bb167f03f9d3b1bd6d39c118 Mon Sep 17 00:00:00 2001 From: MD <1917406+mdcfe@users.noreply.github.com> Date: Sat, 19 Dec 2020 16:27:07 +0000 Subject: [PATCH 3/8] Update bStats Metrics class to 1.8 (#3845) Replace modified bStats Metrics 1.7 class with official 1.8 artifact. 1.8 adds random submit intervals and changes the way submissions are scheduled, and our custom modifications are no longer needed as we now use the plugin ID. --- Essentials/build.gradle | 4 + .../earth2me/essentials/metrics/Metrics.java | 729 ------------------ .../essentials/metrics/MetricsWrapper.java | 1 + EssentialsXMPP/build.gradle | 1 + .../essentials/xmpp/EssentialsXMPP.java | 2 +- build.gradle | 6 + 6 files changed, 13 insertions(+), 730 deletions(-) delete mode 100644 Essentials/src/main/java/com/earth2me/essentials/metrics/Metrics.java diff --git a/Essentials/build.gradle b/Essentials/build.gradle index 7fe365bb5..559b8fbe3 100644 --- a/Essentials/build.gradle +++ b/Essentials/build.gradle @@ -6,6 +6,8 @@ dependencies { api 'io.papermc:paperlib:1.0.6' + api 'org.bstats:bstats-bukkit:1.8' + // Providers api project(':providers:BaseProviders') api project(':providers:PaperProvider') @@ -20,10 +22,12 @@ dependencies { shadowJar { dependencies { include (dependency('io.papermc:paperlib')) + include (dependency('org.bstats:bstats-bukkit')) include (project(':providers:BaseProviders')) include (project(':providers:PaperProvider')) include (project(':providers:NMSReflectionProvider')) include (project(':providers:1_8Provider')) } relocate 'io.papermc.lib', 'com.earth2me.essentials.paperlib' + relocate 'org.bstats.bukkit', 'com.earth2me.essentials.metrics' } diff --git a/Essentials/src/main/java/com/earth2me/essentials/metrics/Metrics.java b/Essentials/src/main/java/com/earth2me/essentials/metrics/Metrics.java deleted file mode 100644 index 24eb88713..000000000 --- a/Essentials/src/main/java/com/earth2me/essentials/metrics/Metrics.java +++ /dev/null @@ -1,729 +0,0 @@ -package com.earth2me.essentials.metrics; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import com.google.gson.JsonPrimitive; -import org.bukkit.Bukkit; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; -import org.bukkit.plugin.RegisteredServiceProvider; -import org.bukkit.plugin.ServicePriority; - -import javax.net.ssl.HttpsURLConnection; -import java.io.BufferedReader; -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Timer; -import java.util.TimerTask; -import java.util.UUID; -import java.util.concurrent.Callable; -import java.util.logging.Level; -import java.util.zip.GZIPOutputStream; - -/** - * bStats collects some data for plugin authors. - *

- * Check out https://bStats.org/ to learn more about bStats! - */ -@SuppressWarnings({"WeakerAccess", "unused"}) -public class Metrics { - - // The version of this bStats class - public static final int B_STATS_VERSION = 1; - // The url to which the data is sent - private static final String URL = "https://bStats.org/submitData/bukkit"; - // Should failed requests be logged? - private static boolean logFailedRequests; - // Should the sent data be logged? - private static boolean logSentData; - // Should the response text be logged? - private static boolean logResponseStatusText; - // The uuid of the server - private static String serverUUID; - - static { - // You can use the property to disable the check in your test environment - if (System.getProperty("bstats.relocatecheck") == null || !System.getProperty("bstats.relocatecheck").equals("false")) { - // Maven's Relocate is clever and changes strings, too. So we have to use this little "trick" ... :D - final String defaultPackage = new String( - new byte[] {'o', 'r', 'g', '.', 'b', 's', 't', 'a', 't', 's', '.', 'b', 'u', 'k', 'k', 'i', 't'}); - final String examplePackage = new String(new byte[] {'y', 'o', 'u', 'r', '.', 'p', 'a', 'c', 'k', 'a', 'g', 'e'}); - // We want to make sure nobody just copy & pastes the example and use the wrong package names - if (Metrics.class.getPackage().getName().equals(defaultPackage) || Metrics.class.getPackage().getName().equals(examplePackage)) { - throw new IllegalStateException("bStats Metrics class has not been relocated correctly!"); - } - } - } - - // Is bStats enabled on this server? - private final boolean enabled; - // The plugin - private final Plugin plugin; - - // The plugin id - private final int pluginId; - - // A list with all custom charts - private final List charts = new ArrayList<>(); - - /** - * Class constructor. - * - * @param plugin The plugin which stats should be submitted. - * @param pluginId The id of the plugin. - * It can be found at What is my plugin id? - */ - public Metrics(final Plugin plugin, final int pluginId) { - if (plugin == null) { - throw new IllegalArgumentException("Plugin cannot be null!"); - } - this.plugin = plugin; - this.pluginId = pluginId; - - // Get the config file - final File bStatsFolder = new File(plugin.getDataFolder().getParentFile(), "bStats"); - final File configFile = new File(bStatsFolder, "config.yml"); - final YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile); - - // Check if the config file exists - if (!config.isSet("serverUuid")) { - - // Add default values - config.addDefault("enabled", true); - // Every server gets it's unique random id. - config.addDefault("serverUuid", UUID.randomUUID().toString()); - // Should failed request be logged? - config.addDefault("logFailedRequests", false); - // Should the sent data be logged? - config.addDefault("logSentData", false); - // Should the response text be logged? - config.addDefault("logResponseStatusText", false); - - // Inform the server owners about bStats - config.options().header( - "bStats collects some data for plugin authors like how many servers are using their plugins.\n" + - "To honor their work, you should not disable it.\n" + - "This has nearly no effect on the server performance!\n" + - "Check out https://bStats.org/ to learn more :)" - ).copyDefaults(true); - try { - config.save(configFile); - } catch (final IOException ignored) { - } - } - - // Load the data - enabled = config.getBoolean("enabled", true); - serverUUID = config.getString("serverUuid"); - logFailedRequests = config.getBoolean("logFailedRequests", false); - logSentData = config.getBoolean("logSentData", false); - logResponseStatusText = config.getBoolean("logResponseStatusText", false); - - if (enabled) { - boolean found = false; - // Search for all other bStats Metrics classes to see if we are the first one - for (final Class service : Bukkit.getServicesManager().getKnownServices()) { - try { - service.getField("B_STATS_VERSION"); // Our identifier :) - found = true; // We aren't the first - break; - } catch (final NoSuchFieldException ignored) { - } - } - // Register our service - Bukkit.getServicesManager().register(Metrics.class, this, plugin, ServicePriority.Normal); - if (!found) { - // We are the first! - startSubmitting(); - } - } - } - - /** - * Sends the data to the bStats server. - * - * @param plugin Any plugin. It's just used to get a logger instance. - * @param data The data to send. - * @throws Exception If the request failed. - */ - private static void sendData(final Plugin plugin, final JsonObject data) throws Exception { - if (data == null) { - throw new IllegalArgumentException("Data cannot be null!"); - } - if (Bukkit.isPrimaryThread()) { - throw new IllegalAccessException("This method must not be called from the main thread!"); - } - if (logSentData) { - plugin.getLogger().info("Sending data to bStats: " + data); - } - final HttpsURLConnection connection = (HttpsURLConnection) new URL(URL).openConnection(); - - // Compress the data to save bandwidth - final byte[] compressedData = compress(data.toString()); - - // Add headers - connection.setRequestMethod("POST"); - connection.addRequestProperty("Accept", "application/json"); - connection.addRequestProperty("Connection", "close"); - connection.addRequestProperty("Content-Encoding", "gzip"); // We gzip our request - connection.addRequestProperty("Content-Length", String.valueOf(compressedData.length)); - connection.setRequestProperty("Content-Type", "application/json"); // We send our data in JSON format - connection.setRequestProperty("User-Agent", "MC-Server/" + B_STATS_VERSION); - - // Send data - connection.setDoOutput(true); - try (final DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream())) { - outputStream.write(compressedData); - } - - final StringBuilder builder = new StringBuilder(); - try (final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { - String line; - while ((line = bufferedReader.readLine()) != null) { - builder.append(line); - } - } - - if (logResponseStatusText) { - plugin.getLogger().info("Sent data to bStats and received response: " + builder); - } - } - - /** - * Gzips the given String. - * - * @param str The string to gzip. - * @return The gzipped String. - * @throws IOException If the compression failed. - */ - private static byte[] compress(final String str) throws IOException { - if (str == null) { - return null; - } - final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - try (final GZIPOutputStream gzip = new GZIPOutputStream(outputStream)) { - gzip.write(str.getBytes(StandardCharsets.UTF_8)); - } - return outputStream.toByteArray(); - } - - /** - * Checks if bStats is enabled. - * - * @return Whether bStats is enabled or not. - */ - public boolean isEnabled() { - return enabled; - } - - /** - * Adds a custom chart. - * - * @param chart The chart to add. - */ - public void addCustomChart(final CustomChart chart) { - if (chart == null) { - throw new IllegalArgumentException("Chart cannot be null!"); - } - charts.add(chart); - } - - /** - * Starts the Scheduler which submits our data every 30 minutes. - */ - private void startSubmitting() { - final Timer timer = new Timer(true); // We use a timer cause the Bukkit scheduler is affected by server lags - timer.scheduleAtFixedRate(new TimerTask() { - @Override - public void run() { - if (!plugin.isEnabled()) { // Plugin was disabled - timer.cancel(); - return; - } - // Nevertheless we want our code to run in the Bukkit main thread, so we have to use the Bukkit scheduler - // Don't be afraid! The connection to the bStats server is still async, only the stats collection is sync ;) - Bukkit.getScheduler().runTask(plugin, () -> submitData()); - } - }, 1000 * 60 * 5, 1000 * 60 * 30); - // Submit the data every 30 minutes, first time after 5 minutes to give other plugins enough time to start - // WARNING: Changing the frequency has no effect but your plugin WILL be blocked/deleted! - // WARNING: Just don't do it! - } - - /** - * Gets the plugin specific data. - * This method is called using Reflection. - * - * @return The plugin specific data. - */ - public JsonObject getPluginData() { - final JsonObject data = new JsonObject(); - - final String pluginName = plugin.getDescription().getName().replace("Essentials", "EssentialsX"); - final String pluginVersion = plugin.getDescription().getVersion(); - - data.addProperty("pluginName", pluginName); // Append the name of the plugin - data.addProperty("id", pluginId); // Append the id of the plugin - data.addProperty("pluginVersion", pluginVersion); // Append the version of the plugin - final JsonArray customCharts = new JsonArray(); - for (final CustomChart customChart : charts) { - // Add the data of the custom charts - final JsonObject chart = customChart.getRequestJsonObject(); - if (chart == null) { // If the chart is null, we skip it - continue; - } - customCharts.add(chart); - } - data.add("customCharts", customCharts); - - return data; - } - - /** - * Gets the server specific data. - * - * @return The server specific data. - */ - private JsonObject getServerData() { - // Minecraft specific data - int playerAmount; - try { - // Around MC 1.8 the return type was changed to a collection from an array, - // This fixes java.lang.NoSuchMethodError: org.bukkit.Bukkit.getOnlinePlayers()Ljava/util/Collection; - final Method onlinePlayersMethod = Class.forName("org.bukkit.Server").getMethod("getOnlinePlayers"); - playerAmount = onlinePlayersMethod.getReturnType().equals(Collection.class) - ? ((Collection) onlinePlayersMethod.invoke(Bukkit.getServer())).size() - : ((Player[]) onlinePlayersMethod.invoke(Bukkit.getServer())).length; - } catch (final Exception e) { - playerAmount = Bukkit.getOnlinePlayers().size(); // Just use the new method if the Reflection failed - } - final int onlineMode = Bukkit.getOnlineMode() ? 1 : 0; - final String bukkitVersion = Bukkit.getVersion(); - final String bukkitName = Bukkit.getName(); - - // OS/Java specific data - final String javaVersion = System.getProperty("java.version"); - final String osName = System.getProperty("os.name"); - final String osArch = System.getProperty("os.arch"); - final String osVersion = System.getProperty("os.version"); - final int coreCount = Runtime.getRuntime().availableProcessors(); - - final JsonObject data = new JsonObject(); - - data.addProperty("serverUUID", serverUUID); - - data.addProperty("playerAmount", playerAmount); - data.addProperty("onlineMode", onlineMode); - data.addProperty("bukkitVersion", bukkitVersion); - data.addProperty("bukkitName", bukkitName); - - data.addProperty("javaVersion", javaVersion); - data.addProperty("osName", osName); - data.addProperty("osArch", osArch); - data.addProperty("osVersion", osVersion); - data.addProperty("coreCount", coreCount); - - return data; - } - - /** - * Collects the data and sends it afterwards. - */ - private void submitData() { - final JsonObject data = getServerData(); - - final JsonArray pluginData = new JsonArray(); - // Search for all other bStats Metrics classes to get their plugin data - for (final Class service : Bukkit.getServicesManager().getKnownServices()) { - try { - service.getField("B_STATS_VERSION"); // Our identifier :) - - for (final RegisteredServiceProvider provider : Bukkit.getServicesManager().getRegistrations(service)) { - try { - final Object plugin = provider.getService().getMethod("getPluginData").invoke(provider.getProvider()); - if (plugin instanceof JsonObject) { - pluginData.add((JsonObject) plugin); - } else { // old bstats version compatibility - try { - final Class jsonObjectJsonSimple = Class.forName("org.json.simple.JSONObject"); - if (plugin.getClass().isAssignableFrom(jsonObjectJsonSimple)) { - final Method jsonStringGetter = jsonObjectJsonSimple.getDeclaredMethod("toJSONString"); - jsonStringGetter.setAccessible(true); - final String jsonString = (String) jsonStringGetter.invoke(plugin); - final JsonObject object = new JsonParser().parse(jsonString).getAsJsonObject(); - pluginData.add(object); - } - } catch (final ClassNotFoundException e) { - // minecraft version 1.14+ - if (logFailedRequests) { - this.plugin.getLogger().log(Level.SEVERE, "Encountered unexpected exception", e); - } - } - } - } catch (final NullPointerException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ignored) { - } - } - } catch (final NoSuchFieldException ignored) { - } - } - - data.add("plugins", pluginData); - - // Create a new thread for the connection to the bStats server - new Thread(() -> { - try { - // Send the data - sendData(plugin, data); - } catch (final Exception e) { - // Something went wrong! :( - if (logFailedRequests) { - plugin.getLogger().log(Level.WARNING, "Could not submit plugin stats of " + plugin.getName(), e); - } - } - }).start(); - } - - /** - * Represents a custom chart. - */ - public static abstract class CustomChart { - - // The id of the chart - final String chartId; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - */ - CustomChart(final String chartId) { - if (chartId == null || chartId.isEmpty()) { - throw new IllegalArgumentException("ChartId cannot be null or empty!"); - } - this.chartId = chartId; - } - - private JsonObject getRequestJsonObject() { - final JsonObject chart = new JsonObject(); - chart.addProperty("chartId", chartId); - try { - final JsonObject data = getChartData(); - if (data == null) { - // If the data is null we don't send the chart. - return null; - } - chart.add("data", data); - } catch (final Throwable t) { - if (logFailedRequests) { - Bukkit.getLogger().log(Level.WARNING, "Failed to get data for custom chart with id " + chartId, t); - } - return null; - } - return chart; - } - - protected abstract JsonObject getChartData() throws Exception; - - } - - /** - * Represents a custom simple pie. - */ - public static class SimplePie extends CustomChart { - - private final Callable callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public SimplePie(final String chartId, final Callable callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JsonObject getChartData() throws Exception { - final JsonObject data = new JsonObject(); - final String value = callable.call(); - if (value == null || value.isEmpty()) { - // Null = skip the chart - return null; - } - data.addProperty("value", value); - return data; - } - } - - /** - * Represents a custom advanced pie. - */ - public static class AdvancedPie extends CustomChart { - - private final Callable> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public AdvancedPie(final String chartId, final Callable> callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JsonObject getChartData() throws Exception { - final JsonObject data = new JsonObject(); - final JsonObject values = new JsonObject(); - final Map map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - boolean allSkipped = true; - for (final Map.Entry entry : map.entrySet()) { - if (entry.getValue() == 0) { - continue; // Skip this invalid - } - allSkipped = false; - values.addProperty(entry.getKey(), entry.getValue()); - } - if (allSkipped) { - // Null = skip the chart - return null; - } - data.add("values", values); - return data; - } - } - - /** - * Represents a custom drilldown pie. - */ - public static class DrilldownPie extends CustomChart { - - private final Callable>> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public DrilldownPie(final String chartId, final Callable>> callable) { - super(chartId); - this.callable = callable; - } - - @Override - public JsonObject getChartData() throws Exception { - final JsonObject data = new JsonObject(); - final JsonObject values = new JsonObject(); - final Map> map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - boolean reallyAllSkipped = true; - for (final Map.Entry> entryValues : map.entrySet()) { - final JsonObject value = new JsonObject(); - boolean allSkipped = true; - for (final Map.Entry valueEntry : map.get(entryValues.getKey()).entrySet()) { - value.addProperty(valueEntry.getKey(), valueEntry.getValue()); - allSkipped = false; - } - if (!allSkipped) { - reallyAllSkipped = false; - values.add(entryValues.getKey(), value); - } - } - if (reallyAllSkipped) { - // Null = skip the chart - return null; - } - data.add("values", values); - return data; - } - } - - /** - * Represents a custom single line chart. - */ - public static class SingleLineChart extends CustomChart { - - private final Callable callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public SingleLineChart(final String chartId, final Callable callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JsonObject getChartData() throws Exception { - final JsonObject data = new JsonObject(); - final int value = callable.call(); - if (value == 0) { - // Null = skip the chart - return null; - } - data.addProperty("value", value); - return data; - } - - } - - /** - * Represents a custom multi line chart. - */ - public static class MultiLineChart extends CustomChart { - - private final Callable> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public MultiLineChart(final String chartId, final Callable> callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JsonObject getChartData() throws Exception { - final JsonObject data = new JsonObject(); - final JsonObject values = new JsonObject(); - final Map map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - boolean allSkipped = true; - for (final Map.Entry entry : map.entrySet()) { - if (entry.getValue() == 0) { - continue; // Skip this invalid - } - allSkipped = false; - values.addProperty(entry.getKey(), entry.getValue()); - } - if (allSkipped) { - // Null = skip the chart - return null; - } - data.add("values", values); - return data; - } - - } - - /** - * Represents a custom simple bar chart. - */ - public static class SimpleBarChart extends CustomChart { - - private final Callable> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public SimpleBarChart(final String chartId, final Callable> callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JsonObject getChartData() throws Exception { - final JsonObject data = new JsonObject(); - final JsonObject values = new JsonObject(); - final Map map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - for (final Map.Entry entry : map.entrySet()) { - final JsonArray categoryValues = new JsonArray(); - categoryValues.add(new JsonPrimitive(entry.getValue())); - values.add(entry.getKey(), categoryValues); - } - data.add("values", values); - return data; - } - - } - - /** - * Represents a custom advanced bar chart. - */ - public static class AdvancedBarChart extends CustomChart { - - private final Callable> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public AdvancedBarChart(final String chartId, final Callable> callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JsonObject getChartData() throws Exception { - final JsonObject data = new JsonObject(); - final JsonObject values = new JsonObject(); - final Map map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - boolean allSkipped = true; - for (final Map.Entry entry : map.entrySet()) { - if (entry.getValue().length == 0) { - continue; // Skip this invalid - } - allSkipped = false; - final JsonArray categoryValues = new JsonArray(); - for (final int categoryValue : entry.getValue()) { - categoryValues.add(new JsonPrimitive(categoryValue)); - } - values.add(entry.getKey(), categoryValues); - } - if (allSkipped) { - // Null = skip the chart - return null; - } - data.add("values", values); - return data; - } - } - -} diff --git a/Essentials/src/main/java/com/earth2me/essentials/metrics/MetricsWrapper.java b/Essentials/src/main/java/com/earth2me/essentials/metrics/MetricsWrapper.java index 2b8f8ea06..0292b6fe9 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/metrics/MetricsWrapper.java +++ b/Essentials/src/main/java/com/earth2me/essentials/metrics/MetricsWrapper.java @@ -3,6 +3,7 @@ package com.earth2me.essentials.metrics; import com.earth2me.essentials.Essentials; import com.earth2me.essentials.register.payment.Methods; import com.google.common.collect.ImmutableList; +import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; diff --git a/EssentialsXMPP/build.gradle b/EssentialsXMPP/build.gradle index 298599b63..e6b77baff 100644 --- a/EssentialsXMPP/build.gradle +++ b/EssentialsXMPP/build.gradle @@ -7,4 +7,5 @@ shadowJar { dependencies { include (dependency('org.igniterealtime.smack:smack')) } + relocate 'org.bstats.bukkit', 'com.earth2me.essentials.metrics' } diff --git a/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/EssentialsXMPP.java b/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/EssentialsXMPP.java index 86fd10fc1..3314d6b6a 100644 --- a/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/EssentialsXMPP.java +++ b/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/EssentialsXMPP.java @@ -1,9 +1,9 @@ package com.earth2me.essentials.xmpp; import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.metrics.Metrics; import com.earth2me.essentials.metrics.MetricsWrapper; import net.ess3.api.IUser; +import org.bstats.bukkit.Metrics; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; diff --git a/build.gradle b/build.gradle index 2ced1ac05..31ecde36b 100644 --- a/build.gradle +++ b/build.gradle @@ -62,6 +62,12 @@ subprojects { includeGroup "com.github.milkbowl" } } + maven { + url = 'https://repo.codemc.org/repository/maven-public' + content { + includeGroup "org.bstats" + } + } } dependencies { From 7bb12fd33c12615b2d87c288436f081771b47013 Mon Sep 17 00:00:00 2001 From: triagonal <10545540+triagonal@users.noreply.github.com> Date: Mon, 21 Dec 2020 15:08:11 +1100 Subject: [PATCH 4/8] Fix incorrect radius check in /me command (#3848) --- .../main/java/com/earth2me/essentials/commands/Commandme.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandme.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandme.java index 36d9a289d..114b0ddd7 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandme.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandme.java @@ -40,12 +40,13 @@ public class Commandme extends EssentialsCommand { message = FormatUtil.formatMessage(user, "essentials.chat", message); user.setDisplayNick(); - final int radius = ess.getSettings().getChatRadius(); + long radius = ess.getSettings().getChatRadius(); final String toSend = tl("action", user.getDisplayName(), message); if (radius < 1) { ess.broadcastMessage(user, toSend); return; } + radius *= radius; final World world = user.getWorld(); final Location loc = user.getLocation(); From c4ca0e51e21b1eab8f39cadcce2d4d9bc0492f09 Mon Sep 17 00:00:00 2001 From: Jason <51760372+JasonHorkles@users.noreply.github.com> Date: Sun, 20 Dec 2020 21:41:26 -0700 Subject: [PATCH 5/8] Add restart note to respawn listener priority option (#3789) --- Essentials/src/main/resources/config.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Essentials/src/main/resources/config.yml b/Essentials/src/main/resources/config.yml index 2ad976755..3ad7dc799 100644 --- a/Essentials/src/main/resources/config.yml +++ b/Essentials/src/main/resources/config.yml @@ -1034,11 +1034,13 @@ newbies: # Set this to lowest, if you want Multiverse to handle the respawning. # Set this to high, if you want EssentialsSpawn to handle the respawning. # Set this to highest, if you want to force EssentialsSpawn to handle the respawning. +# Note: Changes will not apply until after the server is restarted. respawn-listener-priority: high # What priority should we use for handling spawning on joining the server? # See respawn-listener-priority for possible values. -# Note: changing this may impact or break spawn-on-join functionality. +# Note: Changing this may impact or break spawn-on-join functionality. +# Note: Changes will not apply until after the server is restarted. spawn-join-listener-priority: high # When users die, should they respawn at their first home or bed, instead of the spawnpoint? From cb45867de813bac7b29f19dda4ac97d51d010857 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Mon, 21 Dec 2020 10:21:36 -0500 Subject: [PATCH 6/8] Remove Jenkins from README (#3850) EssX website is PogU, Jenkins is PogO --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c24a4614c..fb0b139a6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ [![EssentialsX](https://i.imgur.com/CP4SZpB.png)](https://essentialsx.net) -[Jenkins](http://ci.ender.zone/job/EssentialsX/) +[Dev Builds](https://essentialsx.net/downloads.html) [Discord](https://discord.gg/casfFyh) From 318df64e54fb61dfa0306a59c143b13ea5dc2ac1 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Mon, 21 Dec 2020 13:35:58 -0500 Subject: [PATCH 7/8] Fix Improper Use of Event API (#3853) * Fix Improper Use of Event API * Checkstyle OOOO --- .../net/ess3/api/events/AfkStatusChangeEvent.java | 11 +++++++++++ .../net/ess3/api/events/FlyStatusChangeEvent.java | 12 ++++++++++++ .../net/ess3/api/events/GodStatusChangeEvent.java | 12 ++++++++++++ .../ess3/api/events/IgnoreStatusChangeEvent.java | 12 ++++++++++++ .../net/ess3/api/events/JailStatusChangeEvent.java | 12 ++++++++++++ .../net/ess3/api/events/MuteStatusChangeEvent.java | 11 +++++++++++ .../java/net/ess3/api/events/NickChangeEvent.java | 11 +++++++++++ .../java/net/ess3/api/events/SignBreakEvent.java | 12 ++++++++++++ .../java/net/ess3/api/events/SignCreateEvent.java | 12 ++++++++++++ .../main/java/net/ess3/api/events/SignEvent.java | 13 +------------ .../java/net/ess3/api/events/SignInteractEvent.java | 12 ++++++++++++ .../java/net/ess3/api/events/StateChangeEvent.java | 11 ----------- .../ess3/api/events/VanishStatusChangeEvent.java | 12 ++++++++++++ 13 files changed, 130 insertions(+), 23 deletions(-) diff --git a/Essentials/src/main/java/net/ess3/api/events/AfkStatusChangeEvent.java b/Essentials/src/main/java/net/ess3/api/events/AfkStatusChangeEvent.java index fae2e9be5..ab974d607 100644 --- a/Essentials/src/main/java/net/ess3/api/events/AfkStatusChangeEvent.java +++ b/Essentials/src/main/java/net/ess3/api/events/AfkStatusChangeEvent.java @@ -1,11 +1,13 @@ package net.ess3.api.events; import net.ess3.api.IUser; +import org.bukkit.event.HandlerList; /** * Fired when a player's AFK status changes. */ public class AfkStatusChangeEvent extends StatusChangeEvent { + private static final HandlerList handlers = new HandlerList(); private final Cause cause; @Deprecated @@ -22,6 +24,15 @@ public class AfkStatusChangeEvent extends StatusChangeEvent { return cause; } + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } + /** * The cause of the AFK status change. */ diff --git a/Essentials/src/main/java/net/ess3/api/events/FlyStatusChangeEvent.java b/Essentials/src/main/java/net/ess3/api/events/FlyStatusChangeEvent.java index 2bd0cf2f0..28b3d98f6 100644 --- a/Essentials/src/main/java/net/ess3/api/events/FlyStatusChangeEvent.java +++ b/Essentials/src/main/java/net/ess3/api/events/FlyStatusChangeEvent.java @@ -1,12 +1,24 @@ package net.ess3.api.events; import net.ess3.api.IUser; +import org.bukkit.event.HandlerList; /** * Fired when a player's flight status is toggled using /fly. */ public class FlyStatusChangeEvent extends StatusChangeEvent { + private static final HandlerList handlers = new HandlerList(); + public FlyStatusChangeEvent(final IUser affected, final IUser controller, final boolean value) { super(affected, controller, value); } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } } diff --git a/Essentials/src/main/java/net/ess3/api/events/GodStatusChangeEvent.java b/Essentials/src/main/java/net/ess3/api/events/GodStatusChangeEvent.java index 50b3fe501..c40379ba7 100644 --- a/Essentials/src/main/java/net/ess3/api/events/GodStatusChangeEvent.java +++ b/Essentials/src/main/java/net/ess3/api/events/GodStatusChangeEvent.java @@ -1,6 +1,7 @@ package net.ess3.api.events; import net.ess3.api.IUser; +import org.bukkit.event.HandlerList; /** * Fired when a user's god status is toggled. @@ -9,7 +10,18 @@ import net.ess3.api.IUser; * and #getController methods are inverted. */ public class GodStatusChangeEvent extends StatusChangeEvent { + private static final HandlerList handlers = new HandlerList(); + public GodStatusChangeEvent(final IUser affected, final IUser controller, final boolean value) { super(affected, controller, value); } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } } diff --git a/Essentials/src/main/java/net/ess3/api/events/IgnoreStatusChangeEvent.java b/Essentials/src/main/java/net/ess3/api/events/IgnoreStatusChangeEvent.java index 435dc57c8..2af70f8d1 100644 --- a/Essentials/src/main/java/net/ess3/api/events/IgnoreStatusChangeEvent.java +++ b/Essentials/src/main/java/net/ess3/api/events/IgnoreStatusChangeEvent.java @@ -1,12 +1,24 @@ package net.ess3.api.events; import net.ess3.api.IUser; +import org.bukkit.event.HandlerList; /** * This event is currently unused, and is retained for ABI compatibility and potential future implementation. */ public class IgnoreStatusChangeEvent extends StatusChangeEvent { + private static final HandlerList handlers = new HandlerList(); + public IgnoreStatusChangeEvent(final IUser affected, final IUser controller, final boolean value) { super(affected, controller, value); } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } } diff --git a/Essentials/src/main/java/net/ess3/api/events/JailStatusChangeEvent.java b/Essentials/src/main/java/net/ess3/api/events/JailStatusChangeEvent.java index 37d1040cb..a37157d0a 100644 --- a/Essentials/src/main/java/net/ess3/api/events/JailStatusChangeEvent.java +++ b/Essentials/src/main/java/net/ess3/api/events/JailStatusChangeEvent.java @@ -1,6 +1,7 @@ package net.ess3.api.events; import net.ess3.api.IUser; +import org.bukkit.event.HandlerList; /** * Fired when a player's jail status changes. @@ -9,7 +10,18 @@ import net.ess3.api.IUser; * You can, however, access the player's current jail when they are about to be unjailed by calling {@link IUser#getJail()}. */ public class JailStatusChangeEvent extends StatusChangeEvent { + private static final HandlerList handlers = new HandlerList(); + public JailStatusChangeEvent(final IUser affected, final IUser controller, final boolean value) { super(affected, controller, value); } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } } diff --git a/Essentials/src/main/java/net/ess3/api/events/MuteStatusChangeEvent.java b/Essentials/src/main/java/net/ess3/api/events/MuteStatusChangeEvent.java index 30de86b0e..318781c87 100644 --- a/Essentials/src/main/java/net/ess3/api/events/MuteStatusChangeEvent.java +++ b/Essentials/src/main/java/net/ess3/api/events/MuteStatusChangeEvent.java @@ -1,6 +1,7 @@ package net.ess3.api.events; import net.ess3.api.IUser; +import org.bukkit.event.HandlerList; import java.util.Optional; @@ -8,6 +9,7 @@ import java.util.Optional; * Fired when a player's mute status is changed. */ public class MuteStatusChangeEvent extends StatusChangeEvent { + private static final HandlerList handlers = new HandlerList(); private final Long timestamp; private final String reason; @@ -30,4 +32,13 @@ public class MuteStatusChangeEvent extends StatusChangeEvent { public String getReason() { return reason; } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } } diff --git a/Essentials/src/main/java/net/ess3/api/events/NickChangeEvent.java b/Essentials/src/main/java/net/ess3/api/events/NickChangeEvent.java index 0b9db24f8..dbcdeee16 100644 --- a/Essentials/src/main/java/net/ess3/api/events/NickChangeEvent.java +++ b/Essentials/src/main/java/net/ess3/api/events/NickChangeEvent.java @@ -2,6 +2,7 @@ package net.ess3.api.events; import net.ess3.api.IUser; import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; /** * Fired when a player's nickname is changed. @@ -9,6 +10,7 @@ import org.bukkit.event.Cancellable; * WARNING: The values of {@link NickChangeEvent#getAffected()} and {@link NickChangeEvent#getController()} are inverted due to a long-standing implementation bug. */ public class NickChangeEvent extends StateChangeEvent implements Cancellable { + private static final HandlerList handlers = new HandlerList(); private final String newValue; public NickChangeEvent(final IUser affected, final IUser controller, final String value) { @@ -41,4 +43,13 @@ public class NickChangeEvent extends StateChangeEvent implements Cancellable { public IUser getController() { return super.getController(); } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } } diff --git a/Essentials/src/main/java/net/ess3/api/events/SignBreakEvent.java b/Essentials/src/main/java/net/ess3/api/events/SignBreakEvent.java index a0aff73ac..41dc7155b 100644 --- a/Essentials/src/main/java/net/ess3/api/events/SignBreakEvent.java +++ b/Essentials/src/main/java/net/ess3/api/events/SignBreakEvent.java @@ -2,6 +2,7 @@ package net.ess3.api.events; import com.earth2me.essentials.signs.EssentialsSign; import net.ess3.api.IUser; +import org.bukkit.event.HandlerList; /** * Fired when an Essentials sign is broken. @@ -9,7 +10,18 @@ import net.ess3.api.IUser; * This is primarily intended for use with EssentialsX's sign abstraction - external plugins should not listen on this event. */ public class SignBreakEvent extends SignEvent { + private static final HandlerList handlers = new HandlerList(); + public SignBreakEvent(final EssentialsSign.ISign sign, final EssentialsSign essSign, final IUser user) { super(sign, essSign, user); } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } } diff --git a/Essentials/src/main/java/net/ess3/api/events/SignCreateEvent.java b/Essentials/src/main/java/net/ess3/api/events/SignCreateEvent.java index bab9227ce..e7c5f5b12 100644 --- a/Essentials/src/main/java/net/ess3/api/events/SignCreateEvent.java +++ b/Essentials/src/main/java/net/ess3/api/events/SignCreateEvent.java @@ -2,6 +2,7 @@ package net.ess3.api.events; import com.earth2me.essentials.signs.EssentialsSign; import net.ess3.api.IUser; +import org.bukkit.event.HandlerList; /** * Fired when an Essentials sign is created. @@ -9,7 +10,18 @@ import net.ess3.api.IUser; * This is primarily intended for use with EssentialsX's sign abstraction - external plugins should not listen on this event. */ public class SignCreateEvent extends SignEvent { + private static final HandlerList handlers = new HandlerList(); + public SignCreateEvent(final EssentialsSign.ISign sign, final EssentialsSign essSign, final IUser user) { super(sign, essSign, user); } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } } diff --git a/Essentials/src/main/java/net/ess3/api/events/SignEvent.java b/Essentials/src/main/java/net/ess3/api/events/SignEvent.java index f0ed49566..de223ce78 100644 --- a/Essentials/src/main/java/net/ess3/api/events/SignEvent.java +++ b/Essentials/src/main/java/net/ess3/api/events/SignEvent.java @@ -6,13 +6,11 @@ import net.ess3.api.IUser; import org.bukkit.Bukkit; import org.bukkit.event.Cancellable; import org.bukkit.event.Event; -import org.bukkit.event.HandlerList; /** * This handles common boilerplate for other SignEvent */ -public class SignEvent extends Event implements Cancellable { - private static final HandlerList handlers = new HandlerList(); +public abstract class SignEvent extends Event implements Cancellable { final ISign sign; final EssentialsSign essSign; final IUser user; @@ -25,10 +23,6 @@ public class SignEvent extends Event implements Cancellable { this.user = user; } - public static HandlerList getHandlerList() { - return handlers; - } - public ISign getSign() { return sign; } @@ -41,11 +35,6 @@ public class SignEvent extends Event implements Cancellable { return user; } - @Override - public HandlerList getHandlers() { - return handlers; - } - @Override public boolean isCancelled() { return cancelled; diff --git a/Essentials/src/main/java/net/ess3/api/events/SignInteractEvent.java b/Essentials/src/main/java/net/ess3/api/events/SignInteractEvent.java index 357880765..c97ca593a 100644 --- a/Essentials/src/main/java/net/ess3/api/events/SignInteractEvent.java +++ b/Essentials/src/main/java/net/ess3/api/events/SignInteractEvent.java @@ -2,6 +2,7 @@ package net.ess3.api.events; import com.earth2me.essentials.signs.EssentialsSign; import net.ess3.api.IUser; +import org.bukkit.event.HandlerList; /** * Fired when an Essentials sign is interacted with. @@ -9,7 +10,18 @@ import net.ess3.api.IUser; * This is primarily intended for use with EssentialsX's sign abstraction - external plugins should not listen on this event. */ public class SignInteractEvent extends SignEvent { + private static final HandlerList handlers = new HandlerList(); + public SignInteractEvent(final EssentialsSign.ISign sign, final EssentialsSign essSign, final IUser user) { super(sign, essSign, user); } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } } diff --git a/Essentials/src/main/java/net/ess3/api/events/StateChangeEvent.java b/Essentials/src/main/java/net/ess3/api/events/StateChangeEvent.java index 1c240797c..15f799dd6 100644 --- a/Essentials/src/main/java/net/ess3/api/events/StateChangeEvent.java +++ b/Essentials/src/main/java/net/ess3/api/events/StateChangeEvent.java @@ -3,14 +3,12 @@ package net.ess3.api.events; import net.ess3.api.IUser; import org.bukkit.event.Cancellable; import org.bukkit.event.Event; -import org.bukkit.event.HandlerList; /** * This handles common boilerplate for events for changes in state. * For boolean state, events should extend StatusChangeEvent instead. */ public abstract class StateChangeEvent extends Event implements Cancellable { - private static final HandlerList handlers = new HandlerList(); final IUser affected; final IUser controller; private boolean cancelled = false; @@ -27,10 +25,6 @@ public abstract class StateChangeEvent extends Event implements Cancellable { this.controller = controller; } - public static HandlerList getHandlerList() { - return handlers; - } - /** * Get the user who is affected by the state change. * @@ -49,11 +43,6 @@ public abstract class StateChangeEvent extends Event implements Cancellable { return controller; } - @Override - public HandlerList getHandlers() { - return handlers; - } - @Override public boolean isCancelled() { return cancelled; diff --git a/Essentials/src/main/java/net/ess3/api/events/VanishStatusChangeEvent.java b/Essentials/src/main/java/net/ess3/api/events/VanishStatusChangeEvent.java index 604e33012..13fdc6b0c 100644 --- a/Essentials/src/main/java/net/ess3/api/events/VanishStatusChangeEvent.java +++ b/Essentials/src/main/java/net/ess3/api/events/VanishStatusChangeEvent.java @@ -1,6 +1,7 @@ package net.ess3.api.events; import net.ess3.api.IUser; +import org.bukkit.event.HandlerList; /** * Fired when a player's vanish status changes due to the /vanish command. @@ -9,7 +10,18 @@ import net.ess3.api.IUser; * check with {@link IUser#isVanished()}. */ public class VanishStatusChangeEvent extends StatusChangeEvent { + private static final HandlerList handlers = new HandlerList(); + public VanishStatusChangeEvent(final IUser affected, final IUser controller, final boolean value) { super(affected, controller, value); } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } } From a717f6d8ffc76ecd9b7e43326e3d5cfb50a92159 Mon Sep 17 00:00:00 2001 From: speed <43330808+speedxx@users.noreply.github.com> Date: Thu, 24 Dec 2020 13:45:28 -0500 Subject: [PATCH 8/8] resolve? --- EssentialsXMPP/build.gradle | 11 - .../essentials/xmpp/Commandsetxmpp.java | 22 -- .../earth2me/essentials/xmpp/Commandxmpp.java | 34 -- .../essentials/xmpp/Commandxmppspy.java | 35 -- .../essentials/xmpp/EssentialsXMPP.java | 139 ------- .../xmpp/EssentialsXMPPPlayerListener.java | 58 --- .../essentials/xmpp/IEssentialsXMPP.java | 30 -- .../earth2me/essentials/xmpp/UserManager.java | 80 ---- .../earth2me/essentials/xmpp/XMPPManager.java | 345 ------------------ EssentialsXMPP/src/main/resources/config.yml | 17 - EssentialsXMPP/src/main/resources/plugin.yml | 20 - 11 files changed, 791 deletions(-) delete mode 100644 EssentialsXMPP/build.gradle delete mode 100644 EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/Commandsetxmpp.java delete mode 100644 EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/Commandxmpp.java delete mode 100644 EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/Commandxmppspy.java delete mode 100644 EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/EssentialsXMPP.java delete mode 100644 EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/EssentialsXMPPPlayerListener.java delete mode 100644 EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/IEssentialsXMPP.java delete mode 100644 EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/UserManager.java delete mode 100644 EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/XMPPManager.java delete mode 100644 EssentialsXMPP/src/main/resources/config.yml delete mode 100644 EssentialsXMPP/src/main/resources/plugin.yml diff --git a/EssentialsXMPP/build.gradle b/EssentialsXMPP/build.gradle deleted file mode 100644 index e6b77baff..000000000 --- a/EssentialsXMPP/build.gradle +++ /dev/null @@ -1,11 +0,0 @@ -dependencies { - compileOnly project(':EssentialsX') - implementation 'org.igniterealtime.smack:smack:3.2.1' -} - -shadowJar { - dependencies { - include (dependency('org.igniterealtime.smack:smack')) - } - relocate 'org.bstats.bukkit', 'com.earth2me.essentials.metrics' -} diff --git a/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/Commandsetxmpp.java b/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/Commandsetxmpp.java deleted file mode 100644 index 3c29d90b7..000000000 --- a/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/Commandsetxmpp.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.earth2me.essentials.xmpp; - -import com.earth2me.essentials.User; -import com.earth2me.essentials.commands.EssentialsCommand; -import com.earth2me.essentials.commands.NotEnoughArgumentsException; -import org.bukkit.Server; - -public class Commandsetxmpp extends EssentialsCommand { - public Commandsetxmpp() { - super("setxmpp"); - } - - @Override - protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws NotEnoughArgumentsException { - if (args.length == 0) { - throw new NotEnoughArgumentsException(); - } - - EssentialsXMPP.getInstance().setAddress(user.getBase(), args[0]); - user.sendMessage("XMPP address set to " + args[0]); - } -} diff --git a/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/Commandxmpp.java b/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/Commandxmpp.java deleted file mode 100644 index 6d070863c..000000000 --- a/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/Commandxmpp.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.earth2me.essentials.xmpp; - -import com.earth2me.essentials.CommandSource; -import com.earth2me.essentials.Console; -import com.earth2me.essentials.commands.EssentialsCommand; -import com.earth2me.essentials.commands.NotEnoughArgumentsException; -import org.bukkit.ChatColor; -import org.bukkit.Server; - -public class Commandxmpp extends EssentialsCommand { - public Commandxmpp() { - super("xmpp"); - } - - @Override - protected void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws NotEnoughArgumentsException { - if (args.length < 2) { - throw new NotEnoughArgumentsException(); - } - - final String address = EssentialsXMPP.getInstance().getAddress(args[0]); - if (address == null) { - sender.sendMessage(ChatColor.RED + "There are no players matching that name."); - return; - } - - final String message = getFinalArg(args, 1); - final String senderName = sender.isPlayer() ? ess.getUser(sender.getPlayer()).getDisplayName() : Console.DISPLAY_NAME; - sender.sendMessage("[" + senderName + ">" + address + "] " + message); - if (!EssentialsXMPP.getInstance().sendMessage(address, "[" + senderName + "] " + message)) { - sender.sendMessage(ChatColor.RED + "Error sending message."); - } - } -} diff --git a/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/Commandxmppspy.java b/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/Commandxmppspy.java deleted file mode 100644 index ef586c4b1..000000000 --- a/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/Commandxmppspy.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.earth2me.essentials.xmpp; - -import com.earth2me.essentials.ChargeException; -import com.earth2me.essentials.CommandSource; -import com.earth2me.essentials.User; -import com.earth2me.essentials.commands.EssentialsLoopCommand; -import com.earth2me.essentials.commands.NotEnoughArgumentsException; -import com.earth2me.essentials.commands.PlayerExemptException; -import com.earth2me.essentials.commands.PlayerNotFoundException; -import net.ess3.api.MaxMoneyException; -import org.bukkit.Server; - -public class Commandxmppspy extends EssentialsLoopCommand { - public Commandxmppspy() { - super("xmppspy"); - } - - @Override - protected void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws NotEnoughArgumentsException, PlayerExemptException, MaxMoneyException, ChargeException, PlayerNotFoundException { - if (args.length == 0) { - throw new NotEnoughArgumentsException(); - } - - loopOnlinePlayers(server, sender, false, true, args[0], args); - } - - @Override - protected void updatePlayer(final Server server, final CommandSource sender, final User user, final String[] args) { - try { - sender.sendMessage("XMPP Spy " + (EssentialsXMPP.getInstance().toggleSpy(user.getBase()) ? "enabled" : "disabled") + " for " + user.getDisplayName()); - } catch (final Exception ex) { - sender.sendMessage("Error: " + ex.getMessage()); - } - } -} diff --git a/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/EssentialsXMPP.java b/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/EssentialsXMPP.java deleted file mode 100644 index 3314d6b6a..000000000 --- a/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/EssentialsXMPP.java +++ /dev/null @@ -1,139 +0,0 @@ -package com.earth2me.essentials.xmpp; - -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.metrics.MetricsWrapper; -import net.ess3.api.IUser; -import org.bstats.bukkit.Metrics; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.PluginManager; -import org.bukkit.plugin.java.JavaPlugin; - -import java.util.List; -import java.util.Locale; -import java.util.logging.Level; - -import static com.earth2me.essentials.I18n.tl; - -public class EssentialsXMPP extends JavaPlugin implements IEssentialsXMPP { - private static EssentialsXMPP instance = null; - private transient UserManager users; - private transient XMPPManager xmpp; - private transient IEssentials ess; - private transient MetricsWrapper metrics = null; - - static IEssentialsXMPP getInstance() { - return instance; - } - - static void updatePresence() { - instance.xmpp.updatePresence(); - } - - @Override - public void onEnable() { - instance = this; - - final PluginManager pluginManager = getServer().getPluginManager(); - ess = (IEssentials) pluginManager.getPlugin("Essentials"); - if (!this.getDescription().getVersion().equals(ess.getDescription().getVersion())) { - getLogger().log(Level.WARNING, tl("versionMismatchAll")); - } - if (!ess.isEnabled()) { - this.setEnabled(false); - return; - } - - final EssentialsXMPPPlayerListener playerListener = new EssentialsXMPPPlayerListener(ess); - pluginManager.registerEvents(playerListener, this); - - users = new UserManager(this.getDataFolder()); - xmpp = new XMPPManager(this); - - ess.addReloadListener(users); - ess.addReloadListener(xmpp); - - if (metrics == null) { - metrics = new MetricsWrapper(this, 3818, true); - metrics.addCustomChart(new Metrics.SimplePie("config-valid", () -> xmpp.isConfigValid() ? "yes" : "no")); - } - } - - @Override - public void onDisable() { - if (xmpp != null) { - xmpp.disconnect(); - } - instance = null; - } - - @Override - public boolean onCommand(final CommandSender sender, final Command command, final String commandLabel, final String[] args) { - metrics.markCommand(command.getName(), true); - return ess.onCommandEssentials(sender, command, commandLabel, args, EssentialsXMPP.class.getClassLoader(), "com.earth2me.essentials.xmpp.Command", "essentials.", null); - } - - @Override - public void setAddress(final Player user, final String address) { - final String username = user.getName().toLowerCase(Locale.ENGLISH); - instance.users.setAddress(username, address); - } - - @Override - public String getAddress(final String name) { - return instance.users.getAddress(name); - } - - @Override - public IUser getUserByAddress(final String address) { - final String username = instance.users.getUserByAddress(address); - return username == null ? null : ess.getUser(username); - } - - @Override - public boolean toggleSpy(final Player user) { - final String username = user.getName().toLowerCase(Locale.ENGLISH); - final boolean spy = !instance.users.isSpy(username); - instance.users.setSpy(username, spy); - return spy; - } - - @Override - public String getAddress(final Player user) { - return instance.users.getAddress(user.getName()); - } - - @Override - public boolean sendMessage(final Player user, final String message) { - return instance.xmpp.sendMessage(instance.users.getAddress(user.getName()), message); - } - - @Override - public boolean sendMessage(final String address, final String message) { - return instance.xmpp.sendMessage(address, message); - } - - @Override - public List getSpyUsers() { - return instance.users.getSpyUsers(); - } - - @Override - public void broadcastMessage(final IUser sender, final String message, final String xmppAddress) { - ess.broadcastMessage(sender, message); - try { - for (final String address : getSpyUsers()) { - if (!address.equalsIgnoreCase(xmppAddress)) { - sendMessage(address, message); - } - } - } catch (final Exception ignored) { - } - } - - @Override - public IEssentials getEss() { - return ess; - } -} diff --git a/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/EssentialsXMPPPlayerListener.java b/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/EssentialsXMPPPlayerListener.java deleted file mode 100644 index 7bb591463..000000000 --- a/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/EssentialsXMPPPlayerListener.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.earth2me.essentials.xmpp; - -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.User; -import org.bukkit.Bukkit; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerQuitEvent; - -import java.util.List; - -class EssentialsXMPPPlayerListener implements Listener { - private final transient IEssentials ess; - - EssentialsXMPPPlayerListener(final IEssentials ess) { - super(); - this.ess = ess; - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerJoin(final PlayerJoinEvent event) { - final User user = ess.getUser(event.getPlayer()); - - Bukkit.getScheduler().scheduleSyncDelayedTask(ess, EssentialsXMPP::updatePresence); - - sendMessageToSpyUsers("Player " + user.getDisplayName() + " joined the game"); - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerChat(final AsyncPlayerChatEvent event) { - final User user = ess.getUser(event.getPlayer()); - sendMessageToSpyUsers(String.format(event.getFormat(), user.getDisplayName(), event.getMessage())); - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerQuit(final PlayerQuitEvent event) { - final User user = ess.getUser(event.getPlayer()); - - Bukkit.getScheduler().scheduleSyncDelayedTask(ess, EssentialsXMPP::updatePresence); - - sendMessageToSpyUsers("Player " + user.getDisplayName() + " left the game"); - } - - private void sendMessageToSpyUsers(final String message) { - try { - final List users = EssentialsXMPP.getInstance().getSpyUsers(); - synchronized (users) { - for (final String address : users) { - Bukkit.getScheduler().scheduleSyncDelayedTask(ess, () -> EssentialsXMPP.getInstance().sendMessage(address, message)); - } - } - } catch (final Exception ignored) { - } - } -} diff --git a/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/IEssentialsXMPP.java b/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/IEssentialsXMPP.java deleted file mode 100644 index 69bcca3fa..000000000 --- a/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/IEssentialsXMPP.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.earth2me.essentials.xmpp; - -import com.earth2me.essentials.IEssentials; -import net.ess3.api.IUser; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.util.List; - -public interface IEssentialsXMPP extends Plugin { - String getAddress(final Player user); - - String getAddress(final String name); - - List getSpyUsers(); - - IUser getUserByAddress(final String address); - - boolean sendMessage(final Player user, final String message); - - boolean sendMessage(final String address, final String message); - - void setAddress(final Player user, final String address); - - boolean toggleSpy(final Player user); - - void broadcastMessage(final IUser sender, final String message, final String xmppAddress); - - IEssentials getEss(); -} diff --git a/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/UserManager.java b/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/UserManager.java deleted file mode 100644 index 64d5541db..000000000 --- a/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/UserManager.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.earth2me.essentials.xmpp; - -import com.earth2me.essentials.EssentialsConf; -import com.earth2me.essentials.IConf; - -import java.io.File; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; - -public class UserManager implements IConf { - private static final String ADDRESS = "address"; - private static final String SPY = "spy"; - private final transient EssentialsConf users; - private final transient List spyusers = Collections.synchronizedList(new ArrayList<>()); - - UserManager(final File folder) { - users = new EssentialsConf(new File(folder, "users.yml")); - reloadConfig(); - } - - final boolean isSpy(final String username) { - return users.getBoolean(username.toLowerCase(Locale.ENGLISH) + "." + SPY, false); - } - - void setSpy(final String username, final boolean spy) { - setUser(username.toLowerCase(Locale.ENGLISH), getAddress(username), spy); - } - - final String getAddress(final String username) { - return users.getString(username.toLowerCase(Locale.ENGLISH) + "." + ADDRESS, null); - } - - final String getUserByAddress(final String search) { - final Set usernames = users.getKeys(false); - for (final String username : usernames) { - final String address = users.getString(username + "." + ADDRESS, null); - if (search.equalsIgnoreCase(address)) { - return username; - } - } - return null; - } - - void setAddress(final String username, final String address) { - setUser(username.toLowerCase(Locale.ENGLISH), address, isSpy(username)); - } - - List getSpyUsers() { - return spyusers; - } - - private void setUser(final String username, final String address, final boolean spy) { - final Map userdata = new HashMap<>(); - userdata.put(ADDRESS, address); - userdata.put(SPY, spy); - users.setProperty(username, userdata); - users.save(); - reloadConfig(); - } - - @Override - public final void reloadConfig() { - users.load(); - spyusers.clear(); - final Set keys = users.getKeys(false); - for (final String key : keys) { - if (isSpy(key)) { - final String address = getAddress(key); - if (address != null) { - spyusers.add(address); - } - } - } - } -} diff --git a/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/XMPPManager.java b/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/XMPPManager.java deleted file mode 100644 index 4fc9a2dbf..000000000 --- a/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/XMPPManager.java +++ /dev/null @@ -1,345 +0,0 @@ -package com.earth2me.essentials.xmpp; - -import com.earth2me.essentials.Console; -import com.earth2me.essentials.EssentialsConf; -import com.earth2me.essentials.IConf; -import com.earth2me.essentials.utils.FormatUtil; -import net.ess3.api.IUser; -import org.bukkit.entity.Player; -import org.jivesoftware.smack.Chat; -import org.jivesoftware.smack.ChatManager; -import org.jivesoftware.smack.ChatManagerListener; -import org.jivesoftware.smack.ConnectionConfiguration; -import org.jivesoftware.smack.MessageListener; -import org.jivesoftware.smack.Roster.SubscriptionMode; -import org.jivesoftware.smack.XMPPConnection; -import org.jivesoftware.smack.XMPPException; -import org.jivesoftware.smack.packet.Message; -import org.jivesoftware.smack.packet.Presence; -import org.jivesoftware.smack.util.StringUtils; - -import java.io.File; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import java.util.logging.Handler; -import java.util.logging.Level; -import java.util.logging.LogRecord; -import java.util.logging.Logger; -import java.util.logging.SimpleFormatter; - -import static com.earth2me.essentials.I18n.tl; - -public class XMPPManager extends Handler implements MessageListener, ChatManagerListener, IConf { - private static final Logger logger = Logger.getLogger("EssentialsXMPP"); - private static final SimpleFormatter formatter = new SimpleFormatter(); - private final transient EssentialsConf config; - private final transient Map chats = Collections.synchronizedMap(new HashMap<>()); - private final transient Set logrecords = Collections.synchronizedSet(new HashSet<>()); - private final transient IEssentialsXMPP parent; - private transient XMPPConnection connection; - private transient ChatManager chatManager; - private transient List logUsers; - private transient Level logLevel; - private transient boolean ignoreLagMessages = true; - private transient Thread loggerThread; - private transient boolean threadrunning = true; - - XMPPManager(final IEssentialsXMPP parent) { - super(); - this.parent = parent; - config = new EssentialsConf(new File(parent.getDataFolder(), "config.yml")); - config.setTemplateName("/config.yml", EssentialsXMPP.class); - reloadConfig(); - } - - boolean sendMessage(final String address, final String message) { - if (address != null && !address.isEmpty()) { - try { - startChat(address); - final Chat chat; - synchronized (chats) { - chat = chats.get(address); - } - if (chat != null) { - if (!connection.isConnected()) { - disconnect(); - connect(); - } - chat.sendMessage(FormatUtil.stripFormat(message)); - return true; - } - } catch (final XMPPException ex) { - disableChat(address); - } - } - return false; - } - - @Override - public void processMessage(final Chat chat, final Message msg) { - // Normally we should log the error message - // But we would create a loop if the connection to a log-user fails. - if (msg.getType() != Message.Type.error && msg.getBody().length() > 0) { - final String message = msg.getBody(); - switch (message.charAt(0)) { - case '@': - sendPrivateMessage(chat, message); - break; - case '/': - sendCommand(chat, message); - break; - default: - final IUser sender = parent.getUserByAddress(StringUtils.parseBareAddress(chat.getParticipant())); - parent.broadcastMessage(sender, "=" + sender.getBase().getDisplayName() + ": " + message, StringUtils.parseBareAddress(chat.getParticipant())); - break; - } - } - } - - private boolean connect() { - final String server = config.getString("xmpp.server"); - if (server == null || server.equals("example.com")) { - logger.log(Level.WARNING, tl("xmppNotConfigured")); - return false; - } - final int port = config.getInt("xmpp.port", 5222); - final String serviceName = config.getString("xmpp.servicename", server); - final String xmppuser = config.getString("xmpp.user"); - final String password = config.getString("xmpp.password"); - final ConnectionConfiguration connConf = new ConnectionConfiguration(server, port, serviceName); - final String stringBuilder = "Connecting to xmpp server " + server + ":" + port + " as user " + xmppuser + "."; - logger.log(Level.INFO, stringBuilder); - connConf.setSASLAuthenticationEnabled(config.getBoolean("xmpp.sasl-enabled", false)); - connConf.setSendPresence(true); - connConf.setReconnectionAllowed(true); - connConf.setDebuggerEnabled(config.getBoolean("debug", false)); - connection = new XMPPConnection(connConf); - try { - connection.connect(); - - connection.login(xmppuser, password, "Essentials-XMPP"); - connection.sendPacket(new Presence(Presence.Type.available, "No one online.", 2, Presence.Mode.available)); - - connection.getRoster().setSubscriptionMode(SubscriptionMode.accept_all); - chatManager = connection.getChatManager(); - chatManager.addChatListener(this); - return true; - } catch (final XMPPException ex) { - logger.log(Level.WARNING, "Failed to connect to server: " + server, ex); - return false; - } - } - - final void disconnect() { - if (loggerThread != null) { - loggerThread.interrupt(); - } - if (chatManager != null) { - chatManager.removeChatListener(this); - chatManager = null; - } - if (connection != null) { - connection.disconnect(new Presence(Presence.Type.unavailable)); - } - } - - final void updatePresence() { - if (connection == null) { - parent.getEss().getLogger().warning(tl("xmppNotConfigured")); - return; - } - - final int usercount; - final StringBuilder stringBuilder = new StringBuilder(); - - usercount = parent.getEss().getOnlinePlayers().size(); - - if (usercount == 0) { - final String presenceMsg = "No one online."; - connection.sendPacket(new Presence(Presence.Type.available, presenceMsg, 2, Presence.Mode.dnd)); - } - if (usercount == 1) { - final String presenceMsg = "1 player online."; - connection.sendPacket(new Presence(Presence.Type.available, presenceMsg, 2, Presence.Mode.available)); - } - if (usercount > 1) { - stringBuilder.append(usercount).append(" players online."); - connection.sendPacket(new Presence(Presence.Type.available, stringBuilder.toString(), 2, Presence.Mode.available)); - } - } - - @Override - public void chatCreated(final Chat chat, final boolean createdLocally) { - if (!createdLocally) { - chat.addMessageListener(this); - final Chat old = chats.put(StringUtils.parseBareAddress(chat.getParticipant()), chat); - if (old != null) { - old.removeMessageListener(this); - } - } - } - - @Override - public final void reloadConfig() { - logger.removeHandler(this); - config.load(); - synchronized (chats) { - disconnect(); - chats.clear(); - if (!connect()) { - return; - } - startLoggerThread(); - } - if (config.getBoolean("log-enabled", false)) { - logger.addHandler(this); - logUsers = config.getStringList("log-users"); - final String level = config.getString("log-level", "info"); - try { - logLevel = Level.parse(level.toUpperCase(Locale.ENGLISH)); - } catch (final IllegalArgumentException e) { - logLevel = Level.INFO; - } - ignoreLagMessages = config.getBoolean("ignore-lag-messages", true); - } - } - - @Override - public void publish(final LogRecord logRecord) { - try { - if (ignoreLagMessages && logRecord.getMessage().equals("Can't keep up! Did the system time change, or is the server overloaded?")) { - return; - } - if (logRecord.getLevel().intValue() >= logLevel.intValue()) { - synchronized (logrecords) { - logrecords.add(logRecord); - } - } - } catch (final Exception ignored) { - // Ignore all exceptions - // Otherwise we create a loop. - } - } - - @Override - public void flush() { - // Ignore this - } - - @Override - public void close() throws SecurityException { - // Ignore this - } - - private void startLoggerThread() { - loggerThread = new Thread(() -> { - final Set copy = new HashSet<>(); - final Set failedUsers = new HashSet<>(); - while (threadrunning) { - synchronized (logrecords) { - if (!logrecords.isEmpty()) { - copy.addAll(logrecords); - logrecords.clear(); - } - } - if (!copy.isEmpty()) { - for (final String user : logUsers) { - try { - XMPPManager.this.startChat(user); - for (final LogRecord logRecord : copy) { - final String message = formatter.format(logRecord); - if (!XMPPManager.this.sendMessage(user, FormatUtil.stripLogColorFormat(message))) { - failedUsers.add(user); - break; - } - - } - } catch (final XMPPException ex) { - failedUsers.add(user); - logger.removeHandler(XMPPManager.this); - logger.log(Level.SEVERE, "Failed to deliver log message! Disabling logging to XMPP.", ex); - } - } - logUsers.removeAll(failedUsers); - if (logUsers.isEmpty()) { - logger.removeHandler(XMPPManager.this); - threadrunning = false; - } - copy.clear(); - } - try { - Thread.sleep(2000); - } catch (final InterruptedException ex) { - threadrunning = false; - } - } - logger.removeHandler(XMPPManager.this); - }); - loggerThread.start(); - } - - private void startChat(final String address) throws XMPPException { - if (chatManager == null) { - return; - } - synchronized (chats) { - if (!chats.containsKey(address)) { - final Chat chat = chatManager.createChat(address, this); - if (chat == null) { - throw new XMPPException("Could not start Chat with " + address); - } - chats.put(address, chat); - } - } - } - - private void sendPrivateMessage(final Chat chat, final String message) { - final String[] parts = message.split(" ", 2); - if (parts.length == 2) { - final List matches = parent.getServer().matchPlayer(parts[0].substring(1)); - - if (matches.isEmpty()) { - try { - chat.sendMessage("User " + parts[0] + " not found"); - } catch (final XMPPException ex) { - logger.log(Level.WARNING, "Failed to send xmpp message.", ex); - } - } else { - final String from = "[" + parent.getUserByAddress(StringUtils.parseBareAddress(chat.getParticipant())) + ">"; - for (final Player p : matches) { - p.sendMessage(from + p.getDisplayName() + "] " + message); - } - } - } - } - - private void sendCommand(final Chat chat, final String message) { - if (config.getStringList("op-users").contains(StringUtils.parseBareAddress(chat.getParticipant()))) { - parent.getServer().getScheduler().runTask(parent, () -> { - try { - parent.getServer().dispatchCommand(Console.getInstance().getCommandSender(), message.substring(1)); - } catch (final Exception ex) { - logger.log(Level.SEVERE, ex.getMessage(), ex); - } - }); - } - } - - private void disableChat(final String address) { - final Chat chat = chats.get(address); - if (chat != null) { - chat.removeMessageListener(this); - chats.remove(address); - } - } - - public boolean isConfigValid() { - final String server = config.getString("xmpp.server"); - return server != null && !server.equals("example.com"); - } -} diff --git a/EssentialsXMPP/src/main/resources/config.yml b/EssentialsXMPP/src/main/resources/config.yml deleted file mode 100644 index 3826dd773..000000000 --- a/EssentialsXMPP/src/main/resources/config.yml +++ /dev/null @@ -1,17 +0,0 @@ -xmpp: - server: 'example.com' - user: 'name@example.com' - password: 'password' -# servicename: 'example.com' -# port: 5222 -# sasl-enabled: false - -op-users: -# - 'name@example.com' - -debug: false -log-enabled: false -# Level is minimum level that should be send: info, warning, severe -log-level: warning -log-users: -# - 'name@example.com' \ No newline at end of file diff --git a/EssentialsXMPP/src/main/resources/plugin.yml b/EssentialsXMPP/src/main/resources/plugin.yml deleted file mode 100644 index 77ae92bd0..000000000 --- a/EssentialsXMPP/src/main/resources/plugin.yml +++ /dev/null @@ -1,20 +0,0 @@ -# This determines the command prefix when there are conflicts (/name:home, /name:help, etc.) -name: EssentialsXMPP -main: com.earth2me.essentials.xmpp.EssentialsXMPP -# Note to developers: This next line cannot change, or the automatic versioning system will break. -version: ${full.version} -website: http://ess.khhq.net/wiki/XMPP -description: Provides XMPP communication. -authors: [snowleo] -depend: [Essentials] -api-version: 1.13 -commands: - setxmpp: - description: Sets your XMPP address. - usage: /

- xmpp: - description: Sends a message to a player. - usage: / - xmppspy: - description: Toggles XMPP spy for all messages. - usage: /