diff --git a/.classpath b/.classpath index 33dc2b9..d9bbf01 100644 --- a/.classpath +++ b/.classpath @@ -8,5 +8,6 @@ + diff --git a/README.md b/README.md index 0f313de..adf634f 100644 --- a/README.md +++ b/README.md @@ -23,10 +23,7 @@ For the added up stats of all known players: To fetch the stats of the given user: http://server:port/userstats.xml?player=username - -The following commands are planned but not implemented yet: - -to get data provided by the iConomy plugin: + +To get data provided by the iConomy plugin: http://server:port/money.xml - http://server:port/money.xml?player=username \ No newline at end of file diff --git a/lib/iConomy.jar b/lib/iConomy.jar new file mode 100644 index 0000000..0826420 Binary files /dev/null and b/lib/iConomy.jar differ diff --git a/src/de/sockenklaus/XmlStats/Datasource/MoneyDS.java b/src/de/sockenklaus/XmlStats/Datasource/MoneyDS.java index 17d6d64..dd8653b 100644 --- a/src/de/sockenklaus/XmlStats/Datasource/MoneyDS.java +++ b/src/de/sockenklaus/XmlStats/Datasource/MoneyDS.java @@ -14,9 +14,58 @@ */ package de.sockenklaus.XmlStats.Datasource; +import java.util.ArrayList; +import java.util.HashMap; + +import com.iConomy.iConomy; +import com.iConomy.system.Account; +import com.iConomy.system.Holdings; + +import de.sockenklaus.XmlStats.XmlStats; + /** * The Class MoneyDS. */ public class MoneyDS extends Datasource { + private iConomy iConomy; + private ArrayList allPlayers; + + public MoneyDS(){ + this.iConomy = XmlStats.getiConomyPlugin(); + this.allPlayers = fetchAllPlayers(); + } + + public HashMap getBalances(){ + HashMap result = new HashMap(); + + for (String playerName : allPlayers){ + result.put(playerName, getBalance(playerName)); + } + + return result; + } + + @SuppressWarnings("static-access") + private Double getBalance(String playerName){ + Double result = 0.0; + + if (XmlStats.isiConomyHooked()){ + if(this.iConomy.hasAccount(playerName)){ + Account account = this.iConomy.getAccount(playerName); + + if (account != null){ + Holdings balance = account.getHoldings(); + result = balance.balance(); + } + else XmlStats.LogError("The player has an account but it isn't valid. Bad data will return."); + } + else XmlStats.LogError("This player doesn't have a bank account and this action will return bad data"); + } + else { + XmlStats.LogError("Something went wrong! /money.xml shouldn't be enabled but it's datasource was called! This will return bad results."); + } + + return result; + } } diff --git a/src/de/sockenklaus/XmlStats/Datasource/StatsDS.java b/src/de/sockenklaus/XmlStats/Datasource/UserstatsDS.java similarity index 93% rename from src/de/sockenklaus/XmlStats/Datasource/StatsDS.java rename to src/de/sockenklaus/XmlStats/Datasource/UserstatsDS.java index 7104c8d..1643ca5 100644 --- a/src/de/sockenklaus/XmlStats/Datasource/StatsDS.java +++ b/src/de/sockenklaus/XmlStats/Datasource/UserstatsDS.java @@ -29,7 +29,7 @@ import de.sockenklaus.XmlStats.XmlStats; /** * The Class StatsDS. */ -public class StatsDS extends Datasource { +public class UserstatsDS extends Datasource { private Stats statsPlugin; private ArrayList allPlayerNames; @@ -38,7 +38,7 @@ public class StatsDS extends Datasource { /** * Instantiates a new stats ds. */ - public StatsDS() { + public UserstatsDS() { this.statsPlugin = XmlStats.getStatsPlugin(); this.allPlayerNames = fetchAllPlayers(); this.stats = fetchPlayerStats(allPlayerNames); @@ -129,4 +129,8 @@ public class StatsDS extends Datasource { return result; } + + public void sortStats(){ + + } } diff --git a/src/de/sockenklaus/XmlStats/Settings.java b/src/de/sockenklaus/XmlStats/Settings.java index 6bf34d8..e0e0b29 100644 --- a/src/de/sockenklaus/XmlStats/Settings.java +++ b/src/de/sockenklaus/XmlStats/Settings.java @@ -42,10 +42,6 @@ public class Settings { else { conf.setProperty("options.webserver-enabled", false); conf.setProperty("options.webserver-port", 9123); - conf.setProperty("plugins.stats", true); - conf.setProperty("plugins.users", true); - conf.setProperty("plugins.achievements", false); - conf.setProperty("plugins.economy", false); conf.save(); } } diff --git a/src/de/sockenklaus/XmlStats/WebServer.java b/src/de/sockenklaus/XmlStats/WebServer.java index 162a3e4..b390589 100644 --- a/src/de/sockenklaus/XmlStats/WebServer.java +++ b/src/de/sockenklaus/XmlStats/WebServer.java @@ -44,7 +44,14 @@ public class WebServer { server.createContext("/users.xml", new XmlWorkerUsers()); server.createContext("/userstats.xml", new XmlWorkerUserstats()); - server.createContext("/money.xml", new XmlWorkerMoney()); + + if (XmlStats.isiConomyHooked()){ + server.createContext("/money.xml", new XmlWorkerMoney()); + XmlStats.LogInfo("iConomy seems to be loaded correctly. Enabling /money.xml."); + } + else { + XmlStats.LogWarn("iConomy not loaded correctly. Disabling /money.xml"); + } this.server.start(); } diff --git a/src/de/sockenklaus/XmlStats/XmlStats.java b/src/de/sockenklaus/XmlStats/XmlStats.java index 5914fc6..9472ea0 100644 --- a/src/de/sockenklaus/XmlStats/XmlStats.java +++ b/src/de/sockenklaus/XmlStats/XmlStats.java @@ -18,8 +18,14 @@ import java.util.logging.Level; import java.util.logging.Logger; import org.bukkit.Server; +import org.bukkit.event.Event.Priority; +import org.bukkit.event.Event.Type; +import org.bukkit.event.server.PluginDisableEvent; +import org.bukkit.event.server.PluginEnableEvent; +import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; +import com.iConomy.iConomy; import com.nidefawl.Stats.Stats; // TODO: Auto-generated Javadoc @@ -32,9 +38,10 @@ public class XmlStats extends JavaPlugin { private final static double version = 0.01; private final static String logprefix = "[XmlStats]"; private boolean enabled = false; - private static Stats statsPlugin; + private static Stats Stats = null; + private static iConomy iConomy = null; private static Server serverRef; - private WebServer xmlQueryServer; + private WebServer webServer; private Settings settings; /* (non-Javadoc) @@ -42,10 +49,13 @@ public class XmlStats extends JavaPlugin { */ @Override public void onDisable() { - if(enabled && xmlQueryServer.isRunning()){ - enabled = false; + if(this.enabled && this.webServer.isRunning()){ + this.enabled = false; - xmlQueryServer.stopServer(); + iConomy = null; + Stats = null; + + this.webServer.stopServer(); getServer().getScheduler().cancelTasks(this); @@ -58,30 +68,26 @@ public class XmlStats extends JavaPlugin { */ @Override public void onEnable() { - + getDataFolder().mkdirs(); - statsPlugin = (Stats)getServer().getPluginManager().getPlugin("Stats"); + serverRef = getServer(); + this.settings = new Settings(this); - settings = new Settings(this); - - if (settings.getBoolean("options.webserver-enabled")){ - if (getServer().getPluginManager().isPluginEnabled("Stats")){ - try { - xmlQueryServer = new WebServer(settings.getInt("options.webserver-port")); + this.hookPlugins(); + + if (this.settings.getBoolean("options.webserver-enabled")){ + try { + this.webServer = new WebServer(settings.getInt("options.webserver-port")); - enabled = true; - LogInfo("Plugin Enabled"); - } - catch (Exception ex){ - LogError("Fehler beim Erstellen des Webservers:"); - LogError(ex.getMessage()); - } - - } - else { - LogError("Stats-Plugin laeuft nicht... Breche ab..."); + this.enabled = true; + LogInfo("Plugin Enabled"); } + catch (Exception ex){ + LogError("Fehler beim Erstellen des Webservers:"); + LogError(ex.getMessage()); + ex.printStackTrace(); + } } else { LogWarn("Webserver ist derzeit in der "+settings.getSettingsFilename()+" deaktiviert."); @@ -123,7 +129,7 @@ public class XmlStats extends JavaPlugin { * @return the stats plugin */ public static Stats getStatsPlugin(){ - return statsPlugin; + return Stats; } /** @@ -134,5 +140,66 @@ public class XmlStats extends JavaPlugin { public static Server getServerRef(){ return serverRef; } + + public static iConomy getiConomyPlugin(){ + return iConomy; + } + + public void onPluginDisable(PluginDisableEvent event){ + if(iConomy != null){ + if(event.getPlugin().getDescription().getName().equals("iConomy")){ + iConomy = null; + LogInfo("iConomy is disabled now. Unhooking."); + } + } + if(Stats != null){ + if(event.getPlugin().getDescription().getName().equals("Stats")){ + Stats = null; + LogInfo("Stats is disabled now. Unhooking."); + } + } + + } + + public void onPluginEnable(PluginEnableEvent event){ + this.hookPlugins(); + } + + private void hookPlugins(){ + Plugin StatsTemp = getServer().getPluginManager().getPlugin("Stats"); + Plugin iConomyTemp = getServer().getPluginManager().getPlugin("iConomy"); + if(StatsTemp != null){ + if(StatsTemp.isEnabled() && StatsTemp.getClass().getName().equals("com.nidefawl.Stats.Stats")){ + Stats = (Stats)StatsTemp; + LogInfo("Hooked into Stats!"); + } + } + else { + LogError("Stats not found! Can't hook into it."); + } + if (iConomyTemp != null) { + if (iConomyTemp.isEnabled() && iConomyTemp.getClass().getName().equals("com.iConomy.iConomy")) { + iConomy = (iConomy)iConomyTemp; + LogInfo("Hooked into iConomy"); + } + } + else { + LogError("iConomy not found! Can't hook into it."); + } + } + + public static boolean isStatsHooked(){ + if (Stats != null){ + if(Stats.getClass().getName().equals("com.nidefawl.Stats.Stats") && Stats.isEnabled()) return true; + } + return false; + } + + public static boolean isiConomyHooked(){ + if (iConomy != null){ + if (iConomy.getClass().getName().equals("com.iConomy.iConomy") && iConomy.isEnabled()) return true; + } + return false; + } } diff --git a/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorkerMoney.java b/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorkerMoney.java index 883774c..3a03c51 100644 --- a/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorkerMoney.java +++ b/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorkerMoney.java @@ -14,8 +14,25 @@ */ package de.sockenklaus.XmlStats.XmlWorkers; +import java.io.StringWriter; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.logging.Level; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import com.nidefawl.Stats.Stats; + +import de.sockenklaus.XmlStats.Datasource.MoneyDS; // TODO: Auto-generated Javadoc /** @@ -23,12 +40,57 @@ import java.util.Map; */ public class XmlWorkerMoney extends XmlWorker { + private MoneyDS moneyDS; + + public XmlWorkerMoney(){ + this.moneyDS = new MoneyDS(); + } + /* (non-Javadoc) * @see de.sockenklaus.XmlStats.XmlWorkers.XmlWorker#getXML(java.util.Map) */ @Override public String getXML(Map> parameters) { - // TODO Auto-generated method stub - return null; + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document doc = builder.newDocument(); + DOMSource source = new DOMSource(doc); + StringWriter writer = new StringWriter(); + StreamResult result = new StreamResult(writer); + TransformerFactory tf = TransformerFactory.newInstance(); + Transformer transformer = tf.newTransformer(); + + HashMap balances = moneyDS.getBalances(); + + Element root = doc.createElement("money"); + doc.appendChild(root); + + /* + * Hier wird das XML aufgebaut + */ + + for (String playerName : balances.keySet()){ + Element elem_player = doc.createElement("player"); + elem_player.setAttribute("name", playerName); + elem_player.setAttribute("balance", String.valueOf(balances.get(playerName))); + + root.appendChild(elem_player); + } + + /* + * Hier endet der XML-Aufbau + */ + + transformer.transform(source, result); + return writer.toString(); + } + + catch (Exception e){ + Stats.log.log(Level.SEVERE, "Something went terribly wrong!"); + Stats.log.log(Level.SEVERE, e.getMessage()); + } + + return ""; } } diff --git a/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorkerUserstats.java b/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorkerUserstats.java index 161b0f9..c03b391 100644 --- a/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorkerUserstats.java +++ b/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorkerUserstats.java @@ -37,7 +37,7 @@ import com.nidefawl.Stats.ItemResolver.hModItemResolver; import com.nidefawl.Stats.datasource.Category; import com.nidefawl.Stats.datasource.PlayerStat; -import de.sockenklaus.XmlStats.Datasource.StatsDS; +import de.sockenklaus.XmlStats.Datasource.UserstatsDS; // TODO: Auto-generated Javadoc /** @@ -46,7 +46,7 @@ import de.sockenklaus.XmlStats.Datasource.StatsDS; public class XmlWorkerUserstats extends XmlWorker { /** The stats ds. */ - private StatsDS statsDS; + private UserstatsDS statsDS; private hModItemResolver itemResolver; private String[] resolveCats; @@ -54,7 +54,7 @@ public class XmlWorkerUserstats extends XmlWorker { * Instantiates a new xml worker userstats. */ public XmlWorkerUserstats(){ - this.statsDS = new StatsDS(); + this.statsDS = new UserstatsDS(); itemResolver = new hModItemResolver(new File(statsDS.getDataFolder(),"items.txt")); resolveCats = new String[]{"blockdestroy", "blockcreate", "itemdrop", "itempickup"}; }