diff --git a/build.gradle b/build.gradle index 672d3be..ebb3ec9 100644 --- a/build.gradle +++ b/build.gradle @@ -21,18 +21,13 @@ repositories { name 'Sponge API repo' url 'http://repo.spongepowered.org/maven' } - maven { - name = 'minecrell' - url = 'http://repo.minecrell.net/releases' - } maven { url "https://jitpack.io" } } dependencies { compile 'org.spongepowered:spongeapi:${project.apiVersion}' compile 'com.github.flibio:updatifier:v1.4.0:api' - compile 'net.minecrell.mcstats:statslite-sponge:0.2.2' - compile 'com.github.flibiostudio:utils:f2f5a13' + compile 'com.github.flibiostudio:utils:1.8.1' } shadowJar { @@ -46,7 +41,6 @@ shadowJar { } relocate 'me.flibio.updatifier', 'io.github.flibio.economylite.updatifier' - relocate 'net.minecrell.mcstats', 'io.github.flibio.economylite.statslite' relocate 'io.github.flibio.utils', 'io.github.flibio.economylite.utils' } diff --git a/gradle.properties b/gradle.properties index 208b0bb..d022bbe 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,5 +2,5 @@ name=EconomyLite owner=Flibio inceptionYear=2015 currentYear=2016 -version=2.5.1 +version=2.6.0 apiVersion=5.0.0-SNAPSHOT diff --git a/src/main/java/io/github/flibio/economylite/EconomyLite.java b/src/main/java/io/github/flibio/economylite/EconomyLite.java index cf99978..38ab209 100644 --- a/src/main/java/io/github/flibio/economylite/EconomyLite.java +++ b/src/main/java/io/github/flibio/economylite/EconomyLite.java @@ -29,6 +29,7 @@ import io.github.flibio.economylite.api.CurrencyEconService; import io.github.flibio.economylite.api.PlayerEconService; import io.github.flibio.economylite.api.VirtualEconService; +import io.github.flibio.economylite.bstats.Metrics; import io.github.flibio.economylite.commands.MigrateCommand; import io.github.flibio.economylite.commands.PayCommand; import io.github.flibio.economylite.commands.admin.AddCommand; @@ -58,13 +59,13 @@ import io.github.flibio.economylite.modules.loan.LoanModule; import io.github.flibio.economylite.modules.sql.SqlModule; import io.github.flibio.utils.commands.CommandLoader; -import io.github.flibio.utils.file.ConfigManager; +import io.github.flibio.utils.file.FileManager; import io.github.flibio.utils.message.MessageStorage; import me.flibio.updatifier.Updatifier; -import net.minecrell.mcstats.SpongeStatsLite; import ninja.leaping.configurate.ConfigurationNode; import org.slf4j.Logger; import org.spongepowered.api.Game; +import org.spongepowered.api.config.ConfigDir; import org.spongepowered.api.event.Listener; import org.spongepowered.api.event.game.state.GameInitializationEvent; import org.spongepowered.api.plugin.Plugin; @@ -73,6 +74,7 @@ import org.spongepowered.api.service.economy.EconomyService; import org.spongepowered.api.text.serializer.TextSerializers; +import java.nio.file.Path; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -81,15 +83,17 @@ @Plugin(id = PluginInfo.ID, name = PluginInfo.NAME, version = PluginInfo.VERSION, description = PluginInfo.DESCRIPTION) public class EconomyLite { + @Inject @ConfigDir(sharedRoot = false) private Path configDir; + + @SuppressWarnings("unused") @Inject private Metrics metrics; + @Inject private Logger logger; @Inject private Game game; - @Inject private SpongeStatsLite statsLite; - @Inject private PluginContainer container; - private static ConfigManager configManager; + private static FileManager fileManager; private static MessageStorage messageStorage; private static EconomyLite instance; @@ -102,10 +106,8 @@ public class EconomyLite { public void onServerInitialize(GameInitializationEvent event) { logger.info("EconomyLite " + PluginInfo.VERSION + " is initializing!"); instance = this; - // Start Statslite - this.statsLite.start(); // File setup - configManager = ConfigManager.createInstance(this).get(); + fileManager = FileManager.createInstance(this, configDir.toString()); initializeFiles(); initializeCurrencies(); // Load Message Storage @@ -166,14 +168,15 @@ public void onServerInitialize(GameInitializationEvent event) { } private void initializeFiles() { - configManager.setDefault("config.conf", "default-balance", Double.class, 0.0); - configManager.setDefault("config.conf", "virt-default-balance", Double.class, 0.0); - configManager.setDefault("config.conf", "debug-logging", Boolean.class, true); + fileManager.setDefault("config.conf", "default-balance", Double.class, 0.0); + fileManager.setDefault("config.conf", "virt-default-balance", Double.class, 0.0); + fileManager.setDefault("config.conf", "debug-logging", Boolean.class, true); + fileManager.setDefault("config.conf", "notify-on-admin-commands", Boolean.class, false); } public static boolean isEnabled(String path) { - if (configManager.getValue("config.conf", path, Boolean.class).isPresent()) { - return configManager.getValue("config.conf", path, Boolean.class).get(); + if (fileManager.getValue("config.conf", path, Boolean.class).isPresent()) { + return fileManager.getValue("config.conf", path, Boolean.class).get(); } else { getInstance().getLogger().error("An error has occurred loading config value " + path + "! Defaulting to false."); return false; @@ -182,25 +185,25 @@ public static boolean isEnabled(String path) { private void initializeCurrencies() { // Initialize the default currency into file - configManager.setDefault("currencies.conf", "current", String.class, "coin"); - configManager.setDefault("currencies.conf", "coin.singular", String.class, "Coin"); - configManager.setDefault("currencies.conf", "coin.plural", String.class, "Coins"); - configManager.setDefault("currencies.conf", "coin.symbol", String.class, "C"); + fileManager.setDefault("currencies.conf", "current", String.class, "coin"); + fileManager.setDefault("currencies.conf", "coin.singular", String.class, "Coin"); + fileManager.setDefault("currencies.conf", "coin.plural", String.class, "Coins"); + fileManager.setDefault("currencies.conf", "coin.symbol", String.class, "C"); Currency defaultCurrency = - new LiteCurrency(configManager.getValue("currencies.conf", "coin.singular", String.class).get(), configManager.getValue( - "currencies.conf", "coin.plural", String.class).get(), configManager.getValue("currencies.conf", "coin.symbol", String.class) + new LiteCurrency(fileManager.getValue("currencies.conf", "coin.singular", String.class).get(), fileManager.getValue( + "currencies.conf", "coin.plural", String.class).get(), fileManager.getValue("currencies.conf", "coin.symbol", String.class) .get(), true, 2); currencyEconService = new CurrencyService(defaultCurrency); // Load all of the currencies - Optional fOpt = configManager.getFile("currencies.conf"); + Optional fOpt = fileManager.getFile("currencies.conf"); if (fOpt.isPresent()) { ConfigurationNode root = fOpt.get(); for (Object raw : root.getChildrenMap().keySet()) { if (raw instanceof String) { String currencyId = (String) raw; - Optional sOpt = configManager.getValue("currencies.conf", currencyId + ".singular", String.class); - Optional pOpt = configManager.getValue("currencies.conf", currencyId + ".plural", String.class); - Optional syOpt = configManager.getValue("currencies.conf", currencyId + ".symbol", String.class); + Optional sOpt = fileManager.getValue("currencies.conf", currencyId + ".singular", String.class); + Optional pOpt = fileManager.getValue("currencies.conf", currencyId + ".plural", String.class); + Optional syOpt = fileManager.getValue("currencies.conf", currencyId + ".symbol", String.class); if (sOpt.isPresent() && pOpt.isPresent() && syOpt.isPresent() && !currencyId.equals("coin")) { Currency currency = new LiteCurrency(sOpt.get(), pOpt.get(), syOpt.get(), false, 2); currencyEconService.addCurrency(currency); @@ -209,7 +212,7 @@ private void initializeCurrencies() { } } // Attempt to load the current currency - Optional cOpt = configManager.getValue("currencies.conf", "current", String.class); + Optional cOpt = fileManager.getValue("currencies.conf", "current", String.class); if (cOpt.isPresent()) { String currentCur = cOpt.get(); currencyEconService.getCurrencies().forEach(c -> { @@ -221,7 +224,7 @@ private void initializeCurrencies() { } // If the current currency string failed to load set it to default if (currencyEconService.getCurrentCurrency().equals(defaultCurrency)) { - configManager.setValue("currencies.conf", "current", String.class, "coin"); + fileManager.setValue("currencies.conf", "current", String.class, "coin"); } logger.info("Using currency: " + currencyEconService.getCurrentCurrency().getName()); } @@ -242,8 +245,8 @@ public PluginContainer getPluginContainer() { return container; } - public static ConfigManager getConfigManager() { - return configManager; + public static FileManager getFileManager() { + return fileManager; } public static MessageStorage getMessageStorage() { @@ -274,6 +277,10 @@ public static List getModules() { return ImmutableList.of(new SqlModule(), new LoanModule()); } + public String getConfigDir() { + return configDir.toString(); + } + // Setters public static void setPlayerService(PlayerEconService serv) { diff --git a/src/main/java/io/github/flibio/economylite/bstats/Metrics.java b/src/main/java/io/github/flibio/economylite/bstats/Metrics.java new file mode 100644 index 0000000..21ef2ad --- /dev/null +++ b/src/main/java/io/github/flibio/economylite/bstats/Metrics.java @@ -0,0 +1,1068 @@ +/* + * This file is part of EconomyLite, licensed under the MIT License (MIT). + * + * Copyright (c) 2015 - 2016 Flibio + * Copyright (c) Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package io.github.flibio.economylite.bstats; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.inject.Inject; +import ninja.leaping.configurate.commented.CommentedConfigurationNode; +import ninja.leaping.configurate.hocon.HoconConfigurationLoader; +import org.apache.commons.lang3.Validate; +import org.slf4j.Logger; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.config.ConfigDir; +import org.spongepowered.api.plugin.PluginContainer; +import org.spongepowered.api.scheduler.Scheduler; +import org.spongepowered.api.scheduler.Task; + +import javax.net.ssl.HttpsURLConnection; +import java.io.*; +import java.lang.reflect.InvocationTargetException; +import java.net.URL; +import java.nio.file.Path; +import java.util.*; +import java.util.zip.GZIPOutputStream; + +/** + * bStats collects some data for plugin authors. + * + * Check out https://bStats.org/ to learn more about bStats! + */ +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/sponge"; + + // We use this flag to ensure only one instance of this class exist + private static boolean created = false; + + // The logger + private Logger logger; + + // The plugin + private final PluginContainer plugin; + + // Is bStats enabled on this server? + private boolean enabled; + + // The uuid of the server + private String serverUUID; + + // Should failed requests be logged? + private boolean logFailedRequests = false; + + // A list with all known metrics class objects including this one + private static final List knownMetricsInstances = new ArrayList<>(); + + // A list with all custom charts + private final List charts = new ArrayList<>(); + + // The config path + private Path configDir; + + // The constructor is not meant to be called by the user himself. + // The instance is created using Dependency Injection + // (https://docs.spongepowered.org/master/en/plugin/injection.html) + @Inject + private Metrics(PluginContainer plugin, Logger logger, @ConfigDir(sharedRoot = true) Path configDir) { + if (created) { + // We don't want more than one instance of this class + throw new IllegalStateException("There's already an instance of this Metrics class!"); + } else { + created = true; + } + + this.plugin = plugin; + this.logger = logger; + this.configDir = configDir; + + try { + loadConfig(); + } catch (IOException e) { + // Failed to load configuration + logger.warn("Failed to load bStats config!", e); + return; + } + + // We are not allowed to send data about this server :( + if (!enabled) { + return; + } + + Class usedMetricsClass = getFirstBStatsClass(); + if (usedMetricsClass == null) { + // Failed to get first metrics class + return; + } + if (usedMetricsClass == getClass()) { + // We are the first! :) + linkMetrics(this); + startSubmitting(); + } else { + // We aren't the first so we link to the first metrics class + try { + usedMetricsClass.getMethod("linkMetrics", Object.class).invoke(null, this); + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { + if (logFailedRequests) { + logger.warn("Failed to link to first metrics class {}!", usedMetricsClass.getName(), e); + } + } + } + } + + /** + * Adds a custom chart. + * + * @param chart The chart to add. + */ + public void addCustomChart(CustomChart chart) { + Validate.notNull(chart, "Chart cannot be null"); + charts.add(chart); + } + + /** + * Links an other metrics class with this class. This method is called using + * Reflection. + * + * @param metrics An object of the metrics class to link. + */ + public static void linkMetrics(Object metrics) { + knownMetricsInstances.add(metrics); + } + + /** + * Gets the plugin specific data. This method is called using Reflection. + * + * @return The plugin specific data. + */ + public JsonObject getPluginData() { + JsonObject data = new JsonObject(); + + String pluginName = plugin.getName(); + String pluginVersion = plugin.getVersion().orElse("unknown"); + + data.addProperty("pluginName", pluginName); + data.addProperty("pluginVersion", pluginVersion); + + JsonArray customCharts = new JsonArray(); + for (CustomChart customChart : charts) { + // Add the data of the custom charts + JsonObject chart = customChart.getRequestJsonObject(logger, logFailedRequests); + if (chart == null) { // If the chart is null, we skip it + continue; + } + customCharts.add(chart); + } + data.add("customCharts", customCharts); + + return data; + } + + private void startSubmitting() { + // We use a timer cause want to be independent from the server tps + final Timer timer = new Timer(true); + timer.scheduleAtFixedRate(new TimerTask() { + + @Override + public void run() { + // Plugin was disabled, e.g. because of a reload (is this even + // possible in Sponge?) + if (!Sponge.getPluginManager().isLoaded(plugin.getId())) { + timer.cancel(); + return; + } + // The data collection (e.g. for custom graphs) is done sync + // Don't be afraid! The connection to the bStats server is still + // async, only the stats collection is sync ;) + Scheduler scheduler = Sponge.getScheduler(); + Task.Builder taskBuilder = scheduler.createTaskBuilder(); + taskBuilder.execute(() -> submitData()).submit(plugin); + } + }, 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 server specific data. + * + * @return The server specific data. + */ + private JsonObject getServerData() { + // Minecraft specific data + int playerAmount = Sponge.getServer().getOnlinePlayers().size(); + playerAmount = playerAmount > 200 ? 200 : playerAmount; + int onlineMode = Sponge.getServer().getOnlineMode() ? 1 : 0; + String minecraftVersion = Sponge.getGame().getPlatform().getMinecraftVersion().getName(); + + // OS/Java specific data + String javaVersion = System.getProperty("java.version"); + String osName = System.getProperty("os.name"); + String osArch = System.getProperty("os.arch"); + String osVersion = System.getProperty("os.version"); + int coreCount = Runtime.getRuntime().availableProcessors(); + + JsonObject data = new JsonObject(); + + data.addProperty("serverUUID", serverUUID); + + data.addProperty("playerAmount", playerAmount); + data.addProperty("onlineMode", onlineMode); + data.addProperty("minecraftVersion", minecraftVersion); + + 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(); + + JsonArray pluginData = new JsonArray(); + // Search for all other bStats Metrics classes to get their plugin data + for (Object metrics : knownMetricsInstances) { + try { + Object plugin = metrics.getClass().getMethod("getPluginData").invoke(metrics); + if (plugin instanceof JsonObject) { + pluginData.add((JsonObject) plugin); + } + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ignored) { + } + } + + data.add("plugins", pluginData); + + // Create a new thread for the connection to the bStats server + new Thread(() -> { + try { + // Send the data + sendData(data); + } catch (Exception e) { + // Something went wrong! :( + if (logFailedRequests) { + logger.warn("Could not submit plugin stats!", e); + } + } + }).start(); + } + + /** + * Loads the bStats configuration. + * + * @throws IOException If something did not work :( + */ + private void loadConfig() throws IOException { + Path configPath = configDir.resolve("bStats"); + configPath.toFile().mkdirs(); + File configFile = new File(configPath.toFile(), "config.conf"); + HoconConfigurationLoader configurationLoader = HoconConfigurationLoader.builder().setFile(configFile).build(); + CommentedConfigurationNode node; + if (!configFile.exists()) { + configFile.createNewFile(); + node = configurationLoader.load(); + + // Add default values + node.getNode("enabled").setValue(true); + // Every server gets it's unique random id. + node.getNode("serverUuid").setValue(UUID.randomUUID().toString()); + // Should failed request be logged? + node.getNode("logFailedRequests").setValue(false); + + // Add information about bStats + node.getNode("enabled").setComment( + "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 :)" + ); + + configurationLoader.save(node); + } else { + node = configurationLoader.load(); + } + + // Load configuration + enabled = node.getNode("enabled").getBoolean(true); + serverUUID = node.getNode("serverUuid").getString(); + logFailedRequests = node.getNode("logFailedRequests").getBoolean(false); + } + + /** + * Gets the first bStat Metrics class. + * + * @return The first bStats metrics class. + */ + private Class getFirstBStatsClass() { + Path configPath = configDir.resolve("bStats"); + configPath.toFile().mkdirs(); + File tempFile = new File(configPath.toFile(), "temp.txt"); + + try { + String className = readFile(tempFile); + if (className != null) { + try { + // Let's check if a class with the given name exists. + return Class.forName(className); + } catch (ClassNotFoundException ignored) { + } + } + writeFile(tempFile, getClass().getName()); + return getClass(); + } catch (IOException e) { + if (logFailedRequests) { + logger.warn("Failed to get first bStats class!", e); + } + return null; + } + } + + /** + * Reads the first line of the file. + * + * @param file The file to read. Cannot be null. + * @return The first line of the file or null if the file does + * not exist or is empty. + * @throws IOException If something did not work :( + */ + private String readFile(File file) throws IOException { + if (!file.exists()) { + return null; + } + try ( + FileReader fileReader = new FileReader(file); + BufferedReader bufferedReader = new BufferedReader(fileReader);) { + return bufferedReader.readLine(); + } + } + + /** + * Writes a String to a file. It also adds a note for the user, + * + * @param file The file to write to. Cannot be null. + * @param text The text to write. + * @throws IOException If something did not work :( + */ + private void writeFile(File file, String text) throws IOException { + if (!file.exists()) { + file.createNewFile(); + } + try ( + FileWriter fileWriter = new FileWriter(file); + BufferedWriter bufferedWriter = new BufferedWriter(fileWriter)) { + bufferedWriter.write(text); + bufferedWriter.newLine(); + bufferedWriter.write("Note: This class only exists for internal purpose. You can ignore it :)"); + } + } + + /** + * Sends the data to the bStats server. + * + * @param data The data to send. + * @throws Exception If the request failed. + */ + private static void sendData(JsonObject data) throws Exception { + Validate.notNull(data, "Data cannot be null"); + HttpsURLConnection connection = (HttpsURLConnection) new URL(URL).openConnection(); + + // Compress the data to save bandwidth + 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); + DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream()); + outputStream.write(compressedData); + outputStream.flush(); + outputStream.close(); + + connection.getInputStream().close(); // We don't care about the response + // - Just send our data :) + } + + /** + * 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; + } + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + GZIPOutputStream gzip = new GZIPOutputStream(outputStream); + gzip.write(str.getBytes("UTF-8")); + gzip.close(); + return outputStream.toByteArray(); + } + + /** + * Represents a custom chart. + */ + public static abstract class CustomChart { + + // The id of the chart + protected final String chartId; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + */ + public CustomChart(String chartId) { + if (chartId == null || chartId.isEmpty()) { + throw new IllegalArgumentException("ChartId cannot be null or empty!"); + } + this.chartId = chartId; + } + + protected JsonObject getRequestJsonObject(Logger logger, boolean logFailedRequests) { + JsonObject chart = new JsonObject(); + chart.addProperty("chartId", chartId); + try { + JsonObject data = getChartData(); + if (data == null) { + // If the data is null we don't send the chart. + return null; + } + chart.add("data", data); + } catch (Throwable t) { + if (logFailedRequests) { + logger.warn("Failed to get data for custom chart with id {}", chartId, t); + } + return null; + } + return chart; + } + + protected abstract JsonObject getChartData(); + + } + + /** + * Represents a custom simple pie. + */ + public static abstract class SimplePie extends CustomChart { + + /** + * Class constructor. + * + * @param chartId The id of the chart. + */ + public SimplePie(String chartId) { + super(chartId); + } + + /** + * Gets the value of the pie. + * + * @return The value of the pie. + */ + public abstract String getValue(); + + @Override + protected JsonObject getChartData() { + JsonObject data = new JsonObject(); + String value = getValue(); + if (value == null || value.isEmpty()) { + // Null = skip the chart + return null; + } + data.addProperty("value", value); + return data; + } + } + + /** + * Represents a custom advanced pie. + */ + public static abstract class AdvancedPie extends CustomChart { + + /** + * Class constructor. + * + * @param chartId The id of the chart. + */ + public AdvancedPie(String chartId) { + super(chartId); + } + + /** + * Gets the values of the pie. + * + * @param valueMap Just an empty map. The only reason it exists is to + * make your life easier. You don't have to create a map + * yourself! + * @return The values of the pie. + */ + public abstract HashMap getValues(HashMap valueMap); + + @Override + protected JsonObject getChartData() { + JsonObject data = new JsonObject(); + JsonObject values = new JsonObject(); + HashMap map = getValues(new HashMap()); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean allSkipped = true; + for (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 single line chart. + */ + public static abstract class SingleLineChart extends CustomChart { + + /** + * Class constructor. + * + * @param chartId The id of the chart. + */ + public SingleLineChart(String chartId) { + super(chartId); + } + + /** + * Gets the value of the chart. + * + * @return The value of the chart. + */ + public abstract int getValue(); + + @Override + protected JsonObject getChartData() { + JsonObject data = new JsonObject(); + int value = getValue(); + if (value == 0) { + // Null = skip the chart + return null; + } + data.addProperty("value", value); + return data; + } + + } + + /** + * Represents a custom multi line chart. + */ + public static abstract class MultiLineChart extends CustomChart { + + /** + * Class constructor. + * + * @param chartId The id of the chart. + */ + public MultiLineChart(String chartId) { + super(chartId); + } + + /** + * Gets the values of the chart. + * + * @param valueMap Just an empty map. The only reason it exists is to + * make your life easier. You don't have to create a map + * yourself! + * @return The values of the chart. + */ + public abstract HashMap getValues(HashMap valueMap); + + @Override + protected JsonObject getChartData() { + JsonObject data = new JsonObject(); + JsonObject values = new JsonObject(); + HashMap map = getValues(new HashMap()); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean allSkipped = true; + for (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 map chart. + */ + public static abstract class SimpleMapChart extends CustomChart { + + /** + * Class constructor. + * + * @param chartId The id of the chart. + */ + public SimpleMapChart(String chartId) { + super(chartId); + } + + /** + * Gets the value of the chart. + * + * @return The value of the chart. + */ + public abstract Country getValue(); + + @Override + protected JsonObject getChartData() { + JsonObject data = new JsonObject(); + Country value = getValue(); + + if (value == null) { + // Null = skip the chart + return null; + } + data.addProperty("value", value.getCountryIsoTag()); + return data; + } + + } + + /** + * Represents a custom advanced map chart. + */ + public static abstract class AdvancedMapChart extends CustomChart { + + /** + * Class constructor. + * + * @param chartId The id of the chart. + */ + public AdvancedMapChart(String chartId) { + super(chartId); + } + + /** + * Gets the value of the chart. + * + * @param valueMap Just an empty map. The only reason it exists is to + * make your life easier. You don't have to create a map + * yourself! + * @return The value of the chart. + */ + public abstract HashMap getValues(HashMap valueMap); + + @Override + protected JsonObject getChartData() { + JsonObject data = new JsonObject(); + JsonObject values = new JsonObject(); + HashMap map = getValues(new HashMap()); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean allSkipped = true; + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue() == 0) { + continue; // Skip this invalid + } + allSkipped = false; + values.addProperty(entry.getKey().getCountryIsoTag(), entry.getValue()); + } + if (allSkipped) { + // Null = skip the chart + return null; + } + data.add("values", values); + return data; + } + + } + + /** + * A enum which is used for custom maps. + */ + public enum Country { + + /** + * bStats will use the country of the server. + */ + AUTO_DETECT("AUTO", "Auto Detected"), + + ANDORRA("AD", "Andorra"), + UNITED_ARAB_EMIRATES("AE", "United Arab Emirates"), + AFGHANISTAN("AF", "Afghanistan"), + ANTIGUA_AND_BARBUDA("AG", "Antigua and Barbuda"), + ANGUILLA("AI", "Anguilla"), + ALBANIA("AL", "Albania"), + ARMENIA("AM", "Armenia"), + NETHERLANDS_ANTILLES("AN", "Netherlands Antilles"), + ANGOLA("AO", "Angola"), + ANTARCTICA("AQ", "Antarctica"), + ARGENTINA("AR", "Argentina"), + AMERICAN_SAMOA("AS", "American Samoa"), + AUSTRIA("AT", "Austria"), + AUSTRALIA("AU", "Australia"), + ARUBA("AW", "Aruba"), + ALAND_ISLANDS("AX", "Aland Islands"), + AZERBAIJAN("AZ", "Azerbaijan"), + BOSNIA_AND_HERZEGOVINA("BA", "Bosnia and Herzegovina"), + BARBADOS("BB", "Barbados"), + BANGLADESH("BD", "Bangladesh"), + BELGIUM("BE", "Belgium"), + BURKINA_FASO("BF", "Burkina Faso"), + BULGARIA("BG", "Bulgaria"), + BAHRAIN("BH", "Bahrain"), + BURUNDI("BI", "Burundi"), + BENIN("BJ", "Benin"), + SAINT_BARTHELEMY("BL", "Saint Barthelemy"), + BERMUDA("BM", "Bermuda"), + BRUNEI("BN", "Brunei"), + BOLIVIA("BO", "Bolivia"), + BONAIRE_SINT_EUSTATIUS_AND_SABA("BQ", "Bonaire, Sint Eustatius and Saba"), + BRAZIL("BR", "Brazil"), + BAHAMAS("BS", "Bahamas"), + BHUTAN("BT", "Bhutan"), + BOUVET_ISLAND("BV", "Bouvet Island"), + BOTSWANA("BW", "Botswana"), + BELARUS("BY", "Belarus"), + BELIZE("BZ", "Belize"), + CANADA("CA", "Canada"), + COCOS_ISLANDS("CC", "Cocos Islands"), + THE_DEMOCRATIC_REPUBLIC_OF_CONGO("CD", "The Democratic Republic Of Congo"), + CENTRAL_AFRICAN_REPUBLIC("CF", "Central African Republic"), + CONGO("CG", "Congo"), + SWITZERLAND("CH", "Switzerland"), + COTE_D_IVOIRE("CI", "Cote d'Ivoire"), + COOK_ISLANDS("CK", "Cook Islands"), + CHILE("CL", "Chile"), + CAMEROON("CM", "Cameroon"), + CHINA("CN", "China"), + COLOMBIA("CO", "Colombia"), + COSTA_RICA("CR", "Costa Rica"), + CUBA("CU", "Cuba"), + CAPE_VERDE("CV", "Cape Verde"), + CURACAO("CW", "Curacao"), + CHRISTMAS_ISLAND("CX", "Christmas Island"), + CYPRUS("CY", "Cyprus"), + CZECH_REPUBLIC("CZ", "Czech Republic"), + GERMANY("DE", "Germany"), + DJIBOUTI("DJ", "Djibouti"), + DENMARK("DK", "Denmark"), + DOMINICA("DM", "Dominica"), + DOMINICAN_REPUBLIC("DO", "Dominican Republic"), + ALGERIA("DZ", "Algeria"), + ECUADOR("EC", "Ecuador"), + ESTONIA("EE", "Estonia"), + EGYPT("EG", "Egypt"), + WESTERN_SAHARA("EH", "Western Sahara"), + ERITREA("ER", "Eritrea"), + SPAIN("ES", "Spain"), + ETHIOPIA("ET", "Ethiopia"), + FINLAND("FI", "Finland"), + FIJI("FJ", "Fiji"), + FALKLAND_ISLANDS("FK", "Falkland Islands"), + MICRONESIA("FM", "Micronesia"), + FAROE_ISLANDS("FO", "Faroe Islands"), + FRANCE("FR", "France"), + GABON("GA", "Gabon"), + UNITED_KINGDOM("GB", "United Kingdom"), + GRENADA("GD", "Grenada"), + GEORGIA("GE", "Georgia"), + FRENCH_GUIANA("GF", "French Guiana"), + GUERNSEY("GG", "Guernsey"), + GHANA("GH", "Ghana"), + GIBRALTAR("GI", "Gibraltar"), + GREENLAND("GL", "Greenland"), + GAMBIA("GM", "Gambia"), + GUINEA("GN", "Guinea"), + GUADELOUPE("GP", "Guadeloupe"), + EQUATORIAL_GUINEA("GQ", "Equatorial Guinea"), + GREECE("GR", "Greece"), + SOUTH_GEORGIA_AND_THE_SOUTH_SANDWICH_ISLANDS("GS", "South Georgia And The South Sandwich Islands"), + GUATEMALA("GT", "Guatemala"), + GUAM("GU", "Guam"), + GUINEA_BISSAU("GW", "Guinea-Bissau"), + GUYANA("GY", "Guyana"), + HONG_KONG("HK", "Hong Kong"), + HEARD_ISLAND_AND_MCDONALD_ISLANDS("HM", "Heard Island And McDonald Islands"), + HONDURAS("HN", "Honduras"), + CROATIA("HR", "Croatia"), + HAITI("HT", "Haiti"), + HUNGARY("HU", "Hungary"), + INDONESIA("ID", "Indonesia"), + IRELAND("IE", "Ireland"), + ISRAEL("IL", "Israel"), + ISLE_OF_MAN("IM", "Isle Of Man"), + INDIA("IN", "India"), + BRITISH_INDIAN_OCEAN_TERRITORY("IO", "British Indian Ocean Territory"), + IRAQ("IQ", "Iraq"), + IRAN("IR", "Iran"), + ICELAND("IS", "Iceland"), + ITALY("IT", "Italy"), + JERSEY("JE", "Jersey"), + JAMAICA("JM", "Jamaica"), + JORDAN("JO", "Jordan"), + JAPAN("JP", "Japan"), + KENYA("KE", "Kenya"), + KYRGYZSTAN("KG", "Kyrgyzstan"), + CAMBODIA("KH", "Cambodia"), + KIRIBATI("KI", "Kiribati"), + COMOROS("KM", "Comoros"), + SAINT_KITTS_AND_NEVIS("KN", "Saint Kitts And Nevis"), + NORTH_KOREA("KP", "North Korea"), + SOUTH_KOREA("KR", "South Korea"), + KUWAIT("KW", "Kuwait"), + CAYMAN_ISLANDS("KY", "Cayman Islands"), + KAZAKHSTAN("KZ", "Kazakhstan"), + LAOS("LA", "Laos"), + LEBANON("LB", "Lebanon"), + SAINT_LUCIA("LC", "Saint Lucia"), + LIECHTENSTEIN("LI", "Liechtenstein"), + SRI_LANKA("LK", "Sri Lanka"), + LIBERIA("LR", "Liberia"), + LESOTHO("LS", "Lesotho"), + LITHUANIA("LT", "Lithuania"), + LUXEMBOURG("LU", "Luxembourg"), + LATVIA("LV", "Latvia"), + LIBYA("LY", "Libya"), + MOROCCO("MA", "Morocco"), + MONACO("MC", "Monaco"), + MOLDOVA("MD", "Moldova"), + MONTENEGRO("ME", "Montenegro"), + SAINT_MARTIN("MF", "Saint Martin"), + MADAGASCAR("MG", "Madagascar"), + MARSHALL_ISLANDS("MH", "Marshall Islands"), + MACEDONIA("MK", "Macedonia"), + MALI("ML", "Mali"), + MYANMAR("MM", "Myanmar"), + MONGOLIA("MN", "Mongolia"), + MACAO("MO", "Macao"), + NORTHERN_MARIANA_ISLANDS("MP", "Northern Mariana Islands"), + MARTINIQUE("MQ", "Martinique"), + MAURITANIA("MR", "Mauritania"), + MONTSERRAT("MS", "Montserrat"), + MALTA("MT", "Malta"), + MAURITIUS("MU", "Mauritius"), + MALDIVES("MV", "Maldives"), + MALAWI("MW", "Malawi"), + MEXICO("MX", "Mexico"), + MALAYSIA("MY", "Malaysia"), + MOZAMBIQUE("MZ", "Mozambique"), + NAMIBIA("NA", "Namibia"), + NEW_CALEDONIA("NC", "New Caledonia"), + NIGER("NE", "Niger"), + NORFOLK_ISLAND("NF", "Norfolk Island"), + NIGERIA("NG", "Nigeria"), + NICARAGUA("NI", "Nicaragua"), + NETHERLANDS("NL", "Netherlands"), + NORWAY("NO", "Norway"), + NEPAL("NP", "Nepal"), + NAURU("NR", "Nauru"), + NIUE("NU", "Niue"), + NEW_ZEALAND("NZ", "New Zealand"), + OMAN("OM", "Oman"), + PANAMA("PA", "Panama"), + PERU("PE", "Peru"), + FRENCH_POLYNESIA("PF", "French Polynesia"), + PAPUA_NEW_GUINEA("PG", "Papua New Guinea"), + PHILIPPINES("PH", "Philippines"), + PAKISTAN("PK", "Pakistan"), + POLAND("PL", "Poland"), + SAINT_PIERRE_AND_MIQUELON("PM", "Saint Pierre And Miquelon"), + PITCAIRN("PN", "Pitcairn"), + PUERTO_RICO("PR", "Puerto Rico"), + PALESTINE("PS", "Palestine"), + PORTUGAL("PT", "Portugal"), + PALAU("PW", "Palau"), + PARAGUAY("PY", "Paraguay"), + QATAR("QA", "Qatar"), + REUNION("RE", "Reunion"), + ROMANIA("RO", "Romania"), + SERBIA("RS", "Serbia"), + RUSSIA("RU", "Russia"), + RWANDA("RW", "Rwanda"), + SAUDI_ARABIA("SA", "Saudi Arabia"), + SOLOMON_ISLANDS("SB", "Solomon Islands"), + SEYCHELLES("SC", "Seychelles"), + SUDAN("SD", "Sudan"), + SWEDEN("SE", "Sweden"), + SINGAPORE("SG", "Singapore"), + SAINT_HELENA("SH", "Saint Helena"), + SLOVENIA("SI", "Slovenia"), + SVALBARD_AND_JAN_MAYEN("SJ", "Svalbard And Jan Mayen"), + SLOVAKIA("SK", "Slovakia"), + SIERRA_LEONE("SL", "Sierra Leone"), + SAN_MARINO("SM", "San Marino"), + SENEGAL("SN", "Senegal"), + SOMALIA("SO", "Somalia"), + SURINAME("SR", "Suriname"), + SOUTH_SUDAN("SS", "South Sudan"), + SAO_TOME_AND_PRINCIPE("ST", "Sao Tome And Principe"), + EL_SALVADOR("SV", "El Salvador"), + SINT_MAARTEN_DUTCH_PART("SX", "Sint Maarten (Dutch part)"), + SYRIA("SY", "Syria"), + SWAZILAND("SZ", "Swaziland"), + TURKS_AND_CAICOS_ISLANDS("TC", "Turks And Caicos Islands"), + CHAD("TD", "Chad"), + FRENCH_SOUTHERN_TERRITORIES("TF", "French Southern Territories"), + TOGO("TG", "Togo"), + THAILAND("TH", "Thailand"), + TAJIKISTAN("TJ", "Tajikistan"), + TOKELAU("TK", "Tokelau"), + TIMOR_LESTE("TL", "Timor-Leste"), + TURKMENISTAN("TM", "Turkmenistan"), + TUNISIA("TN", "Tunisia"), + TONGA("TO", "Tonga"), + TURKEY("TR", "Turkey"), + TRINIDAD_AND_TOBAGO("TT", "Trinidad and Tobago"), + TUVALU("TV", "Tuvalu"), + TAIWAN("TW", "Taiwan"), + TANZANIA("TZ", "Tanzania"), + UKRAINE("UA", "Ukraine"), + UGANDA("UG", "Uganda"), + UNITED_STATES_MINOR_OUTLYING_ISLANDS("UM", "United States Minor Outlying Islands"), + UNITED_STATES("US", "United States"), + URUGUAY("UY", "Uruguay"), + UZBEKISTAN("UZ", "Uzbekistan"), + VATICAN("VA", "Vatican"), + SAINT_VINCENT_AND_THE_GRENADINES("VC", "Saint Vincent And The Grenadines"), + VENEZUELA("VE", "Venezuela"), + BRITISH_VIRGIN_ISLANDS("VG", "British Virgin Islands"), + U_S__VIRGIN_ISLANDS("VI", "U.S. Virgin Islands"), + VIETNAM("VN", "Vietnam"), + VANUATU("VU", "Vanuatu"), + WALLIS_AND_FUTUNA("WF", "Wallis And Futuna"), + SAMOA("WS", "Samoa"), + YEMEN("YE", "Yemen"), + MAYOTTE("YT", "Mayotte"), + SOUTH_AFRICA("ZA", "South Africa"), + ZAMBIA("ZM", "Zambia"), + ZIMBABWE("ZW", "Zimbabwe"); + + private String isoTag; + private String name; + + Country(String isoTag, String name) { + this.isoTag = isoTag; + this.name = name; + } + + /** + * Gets the name of the country. + * + * @return The name of the country. + */ + public String getCountryName() { + return name; + } + + /** + * Gets the iso tag of the country. + * + * @return The iso tag of the country. + */ + public String getCountryIsoTag() { + return isoTag; + } + + /** + * Gets a country by it's iso tag. + * + * @param isoTag The iso tag of the county. + * @return The country with the given iso tag or null if + * unknown. + */ + public static Country byIsoTag(String isoTag) { + for (Country country : Country.values()) { + if (country.getCountryIsoTag().equals(isoTag)) { + return country; + } + } + return null; + } + + /** + * Gets a country by a locale. + * + * @param locale The locale. + * @return The country from the giben locale or null if + * unknown country or if the locale does not contain a country. + */ + public static Country byLocale(Locale locale) { + return byIsoTag(locale.getCountry()); + } + + } + +} diff --git a/src/main/java/io/github/flibio/economylite/commands/admin/AddCommand.java b/src/main/java/io/github/flibio/economylite/commands/admin/AddCommand.java index 46cb0dd..ef76a0c 100644 --- a/src/main/java/io/github/flibio/economylite/commands/admin/AddCommand.java +++ b/src/main/java/io/github/flibio/economylite/commands/admin/AddCommand.java @@ -24,11 +24,18 @@ */ package io.github.flibio.economylite.commands.admin; +import io.github.flibio.economylite.EconomyLite; +import io.github.flibio.utils.commands.AsyncCommand; +import io.github.flibio.utils.commands.BaseCommandExecutor; +import io.github.flibio.utils.commands.Command; +import io.github.flibio.utils.commands.ParentCommand; +import io.github.flibio.utils.message.MessageStorage; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.command.args.CommandContext; import org.spongepowered.api.command.args.GenericArguments; import org.spongepowered.api.command.spec.CommandSpec; import org.spongepowered.api.command.spec.CommandSpec.Builder; +import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.entity.living.player.User; import org.spongepowered.api.event.cause.Cause; import org.spongepowered.api.event.cause.NamedCause; @@ -36,13 +43,6 @@ import org.spongepowered.api.service.economy.transaction.ResultType; import org.spongepowered.api.text.Text; -import io.github.flibio.economylite.EconomyLite; -import io.github.flibio.utils.commands.AsyncCommand; -import io.github.flibio.utils.commands.BaseCommandExecutor; -import io.github.flibio.utils.commands.Command; -import io.github.flibio.utils.commands.ParentCommand; -import io.github.flibio.utils.message.MessageStorage; - import java.math.BigDecimal; import java.util.Optional; @@ -72,6 +72,7 @@ public void run(CommandSource src, CommandContext args) { if (targetAccount.deposit(EconomyLite.getCurrencyService().getCurrentCurrency(), toAdd, Cause.of(NamedCause.owner(EconomyLite.getInstance()))).getResult().equals(ResultType.SUCCESS)) { src.sendMessage(messageStorage.getMessage("command.econ.addsuccess", "name", targetName)); + attemptNotify(target); } else { src.sendMessage(messageStorage.getMessage("command.econ.addfail", "name", targetName)); } @@ -83,4 +84,10 @@ public void run(CommandSource src, CommandContext args) { } } + private void attemptNotify(User target) { + if (target instanceof Player) { + ((Player) target).sendMessage(messageStorage.getMessage("command.econ.notify")); + } + } + } diff --git a/src/main/java/io/github/flibio/economylite/commands/admin/RemoveCommand.java b/src/main/java/io/github/flibio/economylite/commands/admin/RemoveCommand.java index 92ed54c..f90b519 100644 --- a/src/main/java/io/github/flibio/economylite/commands/admin/RemoveCommand.java +++ b/src/main/java/io/github/flibio/economylite/commands/admin/RemoveCommand.java @@ -24,6 +24,8 @@ */ package io.github.flibio.economylite.commands.admin; +import org.spongepowered.api.entity.living.player.Player; + import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.command.args.CommandContext; import org.spongepowered.api.command.args.GenericArguments; @@ -35,7 +37,6 @@ import org.spongepowered.api.service.economy.account.UniqueAccount; import org.spongepowered.api.service.economy.transaction.ResultType; import org.spongepowered.api.text.Text; - import io.github.flibio.economylite.EconomyLite; import io.github.flibio.utils.commands.AsyncCommand; import io.github.flibio.utils.commands.BaseCommandExecutor; @@ -72,6 +73,7 @@ public void run(CommandSource src, CommandContext args) { if (targetAccount.withdraw(EconomyLite.getCurrencyService().getCurrentCurrency(), toRemove, Cause.of(NamedCause.owner(EconomyLite.getInstance()))).getResult().equals(ResultType.SUCCESS)) { src.sendMessage(messageStorage.getMessage("command.econ.removesuccess", "name", targetName)); + attemptNotify(target); } else { src.sendMessage(messageStorage.getMessage("command.econ.removefail", "name", targetName)); } @@ -83,4 +85,10 @@ public void run(CommandSource src, CommandContext args) { } } + private void attemptNotify(User target) { + if (target instanceof Player) { + ((Player) target).sendMessage(messageStorage.getMessage("command.econ.notify")); + } + } + } diff --git a/src/main/java/io/github/flibio/economylite/commands/admin/SetCommand.java b/src/main/java/io/github/flibio/economylite/commands/admin/SetCommand.java index 3785e29..997fa32 100644 --- a/src/main/java/io/github/flibio/economylite/commands/admin/SetCommand.java +++ b/src/main/java/io/github/flibio/economylite/commands/admin/SetCommand.java @@ -24,6 +24,8 @@ */ package io.github.flibio.economylite.commands.admin; +import org.spongepowered.api.entity.living.player.Player; + import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.command.args.CommandContext; import org.spongepowered.api.command.args.GenericArguments; @@ -35,7 +37,6 @@ import org.spongepowered.api.service.economy.account.UniqueAccount; import org.spongepowered.api.service.economy.transaction.ResultType; import org.spongepowered.api.text.Text; - import io.github.flibio.economylite.EconomyLite; import io.github.flibio.utils.commands.AsyncCommand; import io.github.flibio.utils.commands.BaseCommandExecutor; @@ -72,6 +73,7 @@ public void run(CommandSource src, CommandContext args) { if (targetAccount.setBalance(EconomyLite.getCurrencyService().getCurrentCurrency(), newBal, Cause.of(NamedCause.owner(EconomyLite.getInstance()))).getResult().equals(ResultType.SUCCESS)) { src.sendMessage(messageStorage.getMessage("command.econ.setsuccess", "name", targetName)); + attemptNotify(target); } else { src.sendMessage(messageStorage.getMessage("command.econ.setfail", "name", targetName)); } @@ -83,4 +85,10 @@ public void run(CommandSource src, CommandContext args) { } } + private void attemptNotify(User target) { + if (target instanceof Player) { + ((Player) target).sendMessage(messageStorage.getMessage("command.econ.notify")); + } + } + } diff --git a/src/main/java/io/github/flibio/economylite/commands/currency/CurrencyCreateCommand.java b/src/main/java/io/github/flibio/economylite/commands/currency/CurrencyCreateCommand.java index 71deed1..e774f3f 100644 --- a/src/main/java/io/github/flibio/economylite/commands/currency/CurrencyCreateCommand.java +++ b/src/main/java/io/github/flibio/economylite/commands/currency/CurrencyCreateCommand.java @@ -24,14 +24,6 @@ */ package io.github.flibio.economylite.commands.currency; -import org.spongepowered.api.command.CommandSource; -import org.spongepowered.api.command.args.CommandContext; -import org.spongepowered.api.command.args.GenericArguments; -import org.spongepowered.api.command.spec.CommandSpec; -import org.spongepowered.api.command.spec.CommandSpec.Builder; -import org.spongepowered.api.service.economy.Currency; -import org.spongepowered.api.text.Text; - import io.github.flibio.economylite.EconomyLite; import io.github.flibio.economylite.api.CurrencyEconService; import io.github.flibio.economylite.impl.economy.LiteCurrency; @@ -39,8 +31,15 @@ import io.github.flibio.utils.commands.BaseCommandExecutor; import io.github.flibio.utils.commands.Command; import io.github.flibio.utils.commands.ParentCommand; -import io.github.flibio.utils.file.ConfigManager; +import io.github.flibio.utils.file.FileManager; import io.github.flibio.utils.message.MessageStorage; +import org.spongepowered.api.command.CommandSource; +import org.spongepowered.api.command.args.CommandContext; +import org.spongepowered.api.command.args.GenericArguments; +import org.spongepowered.api.command.spec.CommandSpec; +import org.spongepowered.api.command.spec.CommandSpec.Builder; +import org.spongepowered.api.service.economy.Currency; +import org.spongepowered.api.text.Text; @AsyncCommand @ParentCommand(parentCommand = CurrencyCommand.class) @@ -49,7 +48,7 @@ public class CurrencyCreateCommand extends BaseCommandExecutor { private MessageStorage messageStorage = EconomyLite.getMessageStorage(); private CurrencyEconService currencyService = EconomyLite.getCurrencyService(); - private ConfigManager configManager = EconomyLite.getConfigManager(); + private FileManager configManager = EconomyLite.getFileManager(); @Override public Builder getCommandSpecBuilder() { diff --git a/src/main/java/io/github/flibio/economylite/impl/CurrencyService.java b/src/main/java/io/github/flibio/economylite/impl/CurrencyService.java index e4c1813..89ed139 100644 --- a/src/main/java/io/github/flibio/economylite/impl/CurrencyService.java +++ b/src/main/java/io/github/flibio/economylite/impl/CurrencyService.java @@ -63,7 +63,7 @@ public Currency getDefaultCurrency() { @Override public void setCurrentCurrency(Currency currency) { this.currentCurrency = currency; - EconomyLite.getConfigManager().setValue("currencies.conf", "current", String.class, currency.getId().replaceAll("economylite:", "")); + EconomyLite.getFileManager().setValue("currencies.conf", "current", String.class, currency.getId().replaceAll("economylite:", "")); } @Override @@ -77,7 +77,7 @@ public void deleteCurrency(Currency currency) { EconomyLite.getPlayerService().clearCurrency(currency, CauseFactory.create("Currency deletion")); EconomyLite.getVirtualService().clearCurrency(currency, CauseFactory.create("Currency deletion")); currencies.remove(currency); - EconomyLite.getConfigManager().deleteValue("currencies.conf", currency.getId().replaceAll("economylite:", "")); + EconomyLite.getFileManager().deleteValue("currencies.conf", currency.getId().replaceAll("economylite:", "")); } } } diff --git a/src/main/java/io/github/flibio/economylite/impl/PlayerDataService.java b/src/main/java/io/github/flibio/economylite/impl/PlayerDataService.java index f998e68..903c2cc 100644 --- a/src/main/java/io/github/flibio/economylite/impl/PlayerDataService.java +++ b/src/main/java/io/github/flibio/economylite/impl/PlayerDataService.java @@ -30,7 +30,7 @@ public class PlayerDataService extends PlayerServiceCommon { public PlayerDataService() { - super(LocalSqlManager.createInstance(EconomyLite.getInstance(), "data").get(), true); + super(LocalSqlManager.createInstance(EconomyLite.getInstance(), "data", EconomyLite.getInstance().getConfigDir()).get(), true); } } diff --git a/src/main/java/io/github/flibio/economylite/impl/VirtualDataService.java b/src/main/java/io/github/flibio/economylite/impl/VirtualDataService.java index 7223194..9ddbd40 100644 --- a/src/main/java/io/github/flibio/economylite/impl/VirtualDataService.java +++ b/src/main/java/io/github/flibio/economylite/impl/VirtualDataService.java @@ -30,7 +30,7 @@ public class VirtualDataService extends VirtualServiceCommon { public VirtualDataService() { - super(LocalSqlManager.createInstance(EconomyLite.getInstance(), "data").get(), true); + super(LocalSqlManager.createInstance(EconomyLite.getInstance(), "data", EconomyLite.getInstance().getConfigDir()).get(), true); } } diff --git a/src/main/java/io/github/flibio/economylite/impl/economy/account/LiteUniqueAccount.java b/src/main/java/io/github/flibio/economylite/impl/economy/account/LiteUniqueAccount.java index 1feda77..b115974 100644 --- a/src/main/java/io/github/flibio/economylite/impl/economy/account/LiteUniqueAccount.java +++ b/src/main/java/io/github/flibio/economylite/impl/economy/account/LiteUniqueAccount.java @@ -82,7 +82,7 @@ public Text getDisplayName() { @Override public BigDecimal getDefaultBalance(Currency currency) { - Optional bOpt = EconomyLite.getConfigManager().getValue("config.conf", "default-balance", Double.class); + Optional bOpt = EconomyLite.getFileManager().getValue("config.conf", "default-balance", Double.class); if (bOpt.isPresent()) { return BigDecimal.valueOf(bOpt.get()); } else { diff --git a/src/main/java/io/github/flibio/economylite/impl/economy/account/LiteVirtualAccount.java b/src/main/java/io/github/flibio/economylite/impl/economy/account/LiteVirtualAccount.java index 494c742..0a1a512 100644 --- a/src/main/java/io/github/flibio/economylite/impl/economy/account/LiteVirtualAccount.java +++ b/src/main/java/io/github/flibio/economylite/impl/economy/account/LiteVirtualAccount.java @@ -69,7 +69,7 @@ public Text getDisplayName() { @Override public BigDecimal getDefaultBalance(Currency currency) { - Optional bOpt = EconomyLite.getConfigManager().getValue("config.conf", "virt-default-balance", Double.class); + Optional bOpt = EconomyLite.getFileManager().getValue("config.conf", "virt-default-balance", Double.class); if (bOpt.isPresent()) { return BigDecimal.valueOf(bOpt.get()); } else { diff --git a/src/main/java/io/github/flibio/economylite/modules/loan/LoanManager.java b/src/main/java/io/github/flibio/economylite/modules/loan/LoanManager.java index 54d0df8..c885038 100644 --- a/src/main/java/io/github/flibio/economylite/modules/loan/LoanManager.java +++ b/src/main/java/io/github/flibio/economylite/modules/loan/LoanManager.java @@ -25,13 +25,12 @@ package io.github.flibio.economylite.modules.loan; import io.github.flibio.economylite.CauseFactory; -import org.spongepowered.api.service.economy.transaction.ResultType; - -import org.spongepowered.api.service.economy.account.UniqueAccount; import io.github.flibio.economylite.EconomyLite; -import io.github.flibio.utils.file.ConfigManager; +import io.github.flibio.utils.file.FileManager; import org.spongepowered.api.service.economy.Currency; import org.spongepowered.api.service.economy.EconomyService; +import org.spongepowered.api.service.economy.account.UniqueAccount; +import org.spongepowered.api.service.economy.transaction.ResultType; import java.math.BigDecimal; import java.util.Optional; @@ -39,7 +38,7 @@ public class LoanManager { - private ConfigManager manager = EconomyLite.getConfigManager(); + private FileManager manager = EconomyLite.getFileManager(); private EconomyService eco = EconomyLite.getEconomyService(); private LoanModule module; diff --git a/src/main/java/io/github/flibio/economylite/modules/loan/LoanModule.java b/src/main/java/io/github/flibio/economylite/modules/loan/LoanModule.java index 3966862..851005f 100644 --- a/src/main/java/io/github/flibio/economylite/modules/loan/LoanModule.java +++ b/src/main/java/io/github/flibio/economylite/modules/loan/LoanModule.java @@ -31,7 +31,7 @@ import io.github.flibio.economylite.modules.loan.command.LoanPayCommand; import io.github.flibio.economylite.modules.loan.command.LoanTakeCommand; import io.github.flibio.utils.commands.CommandLoader; -import io.github.flibio.utils.file.ConfigManager; +import io.github.flibio.utils.file.FileManager; import io.github.flibio.utils.message.MessageStorage; import org.slf4j.Logger; import org.spongepowered.api.Sponge; @@ -44,7 +44,7 @@ public class LoanModule implements Module { private MessageStorage messages = EconomyLite.getMessageStorage(); - private ConfigManager configManager = EconomyLite.getConfigManager(); + private FileManager configManager = EconomyLite.getFileManager(); private LoanManager loanManager; private double interestRate = 1.0; private double maxLoan = 1000.0; diff --git a/src/main/java/io/github/flibio/economylite/modules/sql/SqlModule.java b/src/main/java/io/github/flibio/economylite/modules/sql/SqlModule.java index e970f92..a77279a 100644 --- a/src/main/java/io/github/flibio/economylite/modules/sql/SqlModule.java +++ b/src/main/java/io/github/flibio/economylite/modules/sql/SqlModule.java @@ -24,17 +24,16 @@ */ package io.github.flibio.economylite.modules.sql; -import org.slf4j.Logger; - import io.github.flibio.economylite.EconomyLite; import io.github.flibio.economylite.modules.Module; -import io.github.flibio.utils.file.ConfigManager; +import io.github.flibio.utils.file.FileManager; +import org.slf4j.Logger; import java.util.Optional; public class SqlModule implements Module { - private ConfigManager configManager = EconomyLite.getConfigManager(); + private FileManager configManager = EconomyLite.getFileManager(); @Override public boolean initialize(Logger logger, Object plugin) { diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties index 6847c3a..aeaad68 100644 --- a/src/main/resources/messages.properties +++ b/src/main/resources/messages.properties @@ -55,6 +55,7 @@ command.econ.removefail=&cFailed to remove currency from the balance of {name}! command.econ.removesuccess=&aSuccessfully removed currency from the balance of &6{name}! command.econ.setfail=&cFailed to set the balance of {name}! command.econ.setsuccess=&aSuccessfully set the balance of &6{name}! +command.econ.notify=&6Your balance has been modified! command.migrate.completed=&aMigration completed! command.migrate.confirm=&cMigrating will override any existing balances. &6Run &a/migrate yes &6to confirm the migration!