diff --git a/nbproject/private/private.xml b/nbproject/private/private.xml index 800132876..6807a2ba1 100644 --- a/nbproject/private/private.xml +++ b/nbproject/private/private.xml @@ -2,21 +2,6 @@ - - file:/C:/Users/Risto/Documents/NetBeansProjects/PlayerAnalyticsPlugin-0.0.1/src/com/djrapitops/plan/Plan.java - file:/C:/Users/Risto/Documents/NetBeansProjects/PlayerAnalyticsPlugin-0.0.1/src/plugin.yml - file:/C:/Users/Risto/Documents/NetBeansProjects/PlayerAnalyticsPlugin-0.0.1/src/com/djrapitops/plan/command/hooks/Hook.java - file:/C:/Users/Risto/Documents/NetBeansProjects/PlayerAnalyticsPlugin-0.0.1/src/com/djrapitops/plan/command/hooks/VaultHook.java - file:/C:/Users/Risto/Documents/NetBeansProjects/PlayerAnalyticsPlugin-0.0.1/src/com/djrapitops/plan/command/utils/DataFormatUtils.java - file:/C:/Users/Risto/Documents/NetBeansProjects/PlayerAnalyticsPlugin-0.0.1/src/com/djrapitops/plan/command/hooks/FactionsHook.java - file:/C:/Users/Risto/Documents/NetBeansProjects/PlayerAnalyticsPlugin-0.0.1/src/com/djrapitops/plan/command/commands/InspectCommand.java - file:/C:/Users/Risto/Documents/NetBeansProjects/PlayerAnalyticsPlugin-0.0.1/src/config.yml - file:/C:/Users/Risto/Documents/NetBeansProjects/PlayerAnalyticsPlugin-0.0.1/src/com/djrapitops/plan/API.java - file:/C:/Users/Risto/Documents/NetBeansProjects/PlayerAnalyticsPlugin-0.0.1/src/com/djrapitops/plan/PlanCommand.java - file:/C:/Users/Risto/Documents/NetBeansProjects/PlayerAnalyticsPlugin-0.0.1/src/com/djrapitops/plan/command/hooks/PlaceholderAPIHook.java - file:/C:/Users/Risto/Documents/NetBeansProjects/PlayerAnalyticsPlugin-0.0.1/src/com/djrapitops/plan/command/utils/DataUtils.java - file:/C:/Users/Risto/Documents/NetBeansProjects/PlayerAnalyticsPlugin-0.0.1/src/com/djrapitops/plan/command/commands/AnalyzeCommand.java - file:/C:/Users/Risto/Documents/NetBeansProjects/PlayerAnalyticsPlugin-0.0.1/src/com/djrapitops/plan/command/hooks/AdvancedAchievementsHook.java - + diff --git a/src/com/djrapitops/plan/API.java b/src/com/djrapitops/plan/API.java index c296c67af..6fae7a801 100644 --- a/src/com/djrapitops/plan/API.java +++ b/src/com/djrapitops/plan/API.java @@ -3,6 +3,7 @@ package com.djrapitops.plan; import com.djrapitops.plan.command.hooks.Hook; import com.djrapitops.plan.command.utils.DataFormatUtils; import com.djrapitops.plan.command.utils.DataUtils; +import java.util.Date; import java.util.HashMap; public class API { @@ -57,6 +58,24 @@ public class API { return DataFormatUtils.removeExtraDataPoints(DataUtils.getData(true, playerName)); } + // use (new Date) on after parameter for time since moment to now + public static String formatTimeSinceDate(Date before, Date after) { + return DataFormatUtils.formatTimeAmountSinceDate(before, after); + } + + // use (new Date) on after parameter for time since moment to now + public static String formatTimeSinceString(String before, Date after) { + return DataFormatUtils.formatTimeAmountSinceString(before, after); + } + + public static String formatTimeAmount(String timeInMs) { + return DataFormatUtils.formatTimeAmount(timeInMs); + } + + public static String formatTimeStamp(String timeInMs) { + return DataFormatUtils.formatTimeStamp(timeInMs); + } + public void addExtraHook(String name, Hook hook) { plugin.addExtraHook(name, hook); } diff --git a/src/com/djrapitops/plan/Plan.java b/src/com/djrapitops/plan/Plan.java index a74d1194e..a9ff9f695 100644 --- a/src/com/djrapitops/plan/Plan.java +++ b/src/com/djrapitops/plan/Plan.java @@ -179,5 +179,6 @@ public class Plan extends JavaPlugin { public void addExtraHook(String name, Hook hook) { this.extraHooks.put(name, hook); + this.hooks.put(name, hook); } } diff --git a/src/com/djrapitops/plan/PlanCommand.java b/src/com/djrapitops/plan/PlanCommand.java index cd5342425..21b5222f9 100644 --- a/src/com/djrapitops/plan/PlanCommand.java +++ b/src/com/djrapitops/plan/PlanCommand.java @@ -26,9 +26,7 @@ public class PlanCommand implements CommandExecutor { commands.add(new HelpCommand(plugin, this)); commands.add(new InspectCommand(plugin)); - if (plugin.getConfig().getBoolean("analysis")) { - commands.add(new AnalyzeCommand(plugin)); - } + commands.add(new AnalyzeCommand(plugin)); commands.add(new ReloadCommand(plugin)); } diff --git a/src/com/djrapitops/plan/command/commands/AnalyzeCommand.java b/src/com/djrapitops/plan/command/commands/AnalyzeCommand.java index ae52a7659..4e0a3fb2a 100644 --- a/src/com/djrapitops/plan/command/commands/AnalyzeCommand.java +++ b/src/com/djrapitops/plan/command/commands/AnalyzeCommand.java @@ -5,13 +5,8 @@ import com.djrapitops.plan.command.CommandType; import com.djrapitops.plan.command.SubCommand; import com.djrapitops.plan.command.utils.DataFormatUtils; import com.djrapitops.plan.command.utils.DataUtils; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; import java.util.Date; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.UUID; import org.bukkit.ChatColor; @@ -28,11 +23,6 @@ public class AnalyzeCommand extends SubCommand { public AnalyzeCommand(Plan plugin) { super("analyze", "plan.analyze", "Analyze data of all players /plan analyze [-refresh]", CommandType.CONSOLE); this.plugin = plugin; -// this.plugin.log("Refreshing playerDataMap, this might take a while.."); -// this.playerData = DataUtils.getTotalData(); -// this.analyzedPlayerdata = analyze(this.playerData); -// this.refreshDate = new Date(); -// this.plugin.log("PlayerDataMap refresh complete."); } @Override @@ -42,33 +32,20 @@ public class AnalyzeCommand extends SubCommand { for (String arg : args) { if (arg.toLowerCase().equals("-refresh")) { if (sender.hasPermission("plan.analyze.refresh")) { - sender.sendMessage(textColor + "[" + operatorColor + "Plan" + textColor + "] " - + "Refreshing playerData, this might take a while.."); - this.playerData = DataUtils.getTotalData(); - this.refreshDate = new Date(); - this.analyzedPlayerdata = analyze(this.playerData); - + refreshAnalysisData(sender); } } } if (this.playerData == null || this.refreshDate == null || this.analyzedPlayerdata == null) { - sender.sendMessage(textColor + "[" + operatorColor + "Plan" + textColor + "] " - + "Refreshing playerData, this might take a while.."); - this.playerData = DataUtils.getTotalData(); - this.refreshDate = new Date(); - this.analyzedPlayerdata = analyze(this.playerData); + refreshAnalysisData(sender); } - List dataList = new ArrayList<>(); - sender.sendMessage(textColor + "-- [" + operatorColor + "PLAN - Analysis results, refreshed " + DataFormatUtils.formatTimeAmount(refreshDate, new Date()) + " ago:" + textColor + "] --"); - for (String key : this.analyzedPlayerdata.keySet()) { - dataList.add(new String[]{key, this.analyzedPlayerdata.get(key)}); - } - Collections.sort(dataList, new Comparator() { - public int compare(String[] strings, String[] otherStrings) { - return strings[0].compareTo(otherStrings[0]); - } - }); - sender.sendMessage("" + textColor + "Averages for "+this.playerData.size()+" player(s)"); + + //header + sender.sendMessage(textColor + "-- [" + operatorColor + "PLAN - Analysis results, refreshed " + DataFormatUtils.formatTimeAmountSinceDate(refreshDate, new Date()) + " ago:" + textColor + "] --"); + + List dataList = DataFormatUtils.turnDataHashMapToSortedListOfArrays(analyzedPlayerdata); + + sender.sendMessage("" + textColor + "Averages for " + this.playerData.size() + " player(s)"); for (String[] dataString : dataList) { sender.sendMessage("" + operatorColor + dataString[0].charAt(4) + dataString[0].toLowerCase().substring(5) + ": " + textColor + dataString[1]); } @@ -76,94 +53,18 @@ public class AnalyzeCommand extends SubCommand { return true; } - private HashMap analyze(HashMap> playerData) { - HashMap> playerDataLists = new HashMap<>(); - String[] ignore = {"ESS-BAN REASON", "ESS-OPPED", "ESS-MUTE TIME", "ESS-LOCATION", "ESS-HUNGER", "ESS-LOCATION WORLD", - "ESS-NICKNAME", "ESS-UUID", "FAC-FACTION", "ONT-LAST LOGIN", "TOW-TOWN", "TOW-REGISTERED", - "TOW-LAST LOGIN", "TOW-OWNER OF", "TOW-PLOT PERMS", "TOW-PLOT OPTIONS", "TOW-FRIENDS", "ESS-ONLINE SINCE", - "ESS-OFFLINE SINCE"}; - List ignoreKeys = new ArrayList<>(); - ignoreKeys.addAll(Arrays.asList(ignore)); - for (UUID key : playerData.keySet()) { - for (String dataKey : playerData.get(key).keySet()) { - if (!ignoreKeys.contains(dataKey)) { - if (playerDataLists.get(dataKey) == null) { - playerDataLists.put(dataKey, new ArrayList<>()); - } - playerDataLists.get(dataKey).add(playerData.get(key).get(dataKey)); - } - } - } - - String[] numbers = {"ESS-HEALTH", "ESS-XP LEVEL", "FAC-POWER", "FAC-POWER PER HOUR", - "FAC-POWER PER DEATH", "SVO-VOTES", "ONT-TOTAL VOTES", "ONT-TOTAL REFERRED", "ECO-BALANCE"}; - List numberKeys = new ArrayList<>(); - numberKeys.addAll(Arrays.asList(numbers)); - String[] booleanValues = {"ESS-BANNED", "ESS-JAILED", "ESS-MUTED", "ESS-FLYING", "TOW-ONLINE"}; - List boolKeys = new ArrayList<>(); - boolKeys.addAll(Arrays.asList(booleanValues)); - String[] timeValues = {"ONT-TOTAL PLAY"}; - List timeKeys = new ArrayList<>(); - timeKeys.addAll(Arrays.asList(timeValues)); - - HashMap analyzedData = new HashMap<>(); - int errors = 0; - HashSet errorTypes = new HashSet<>(); - - for (String dataKey : playerDataLists.keySet()) { - if (numberKeys.contains(dataKey)) { - double sum = 0; - - for (String dataPoint : playerDataLists.get(dataKey)) { - try { - if (dataKey.equals("FAC-POWER")) { - sum += Double.parseDouble(dataPoint.split(" ")[0]); - } else if (dataKey.equals("ECO-BALANCE")) { - sum += Double.parseDouble(DataFormatUtils.removeLetters(dataPoint)); - } else { - sum += Double.parseDouble(dataPoint); - } - } catch (Exception e) { - errors++; - errorTypes.add("" + e); - } - } - analyzedData.put(dataKey, "" + (sum / this.playerData.size())); - - } else if (boolKeys.contains(dataKey)) { - int amount = 0; - for (String dataPoint : playerDataLists.get(dataKey)) { - try { - if (Boolean.parseBoolean(dataPoint)) { - amount++; - } - } catch (Exception e) { - errors++; - errorTypes.add("" + e); - } - } - analyzedData.put(dataKey, "" + ((amount / this.playerData.size())*100) + "%"); - } else if (timeKeys.contains(dataKey)) { - Long time = Long.parseLong("0"); - for (String dataPoint : playerDataLists.get(dataKey)) { - try { - time += Long.parseLong(dataPoint); - } catch (Exception e) { - errors++; - errorTypes.add("" + e); - } - } - analyzedData.put(dataKey, "" + (time / this.playerData.size())); - } - } - if (errors > 0) { - String log = "ANALYZE\n" + errors + " error(s) occurred while analyzing total data.\nFollowing types:"; - for (String errorType : errorTypes) { - log += "\n " + errorType; - } - plugin.logToFile(log); - } - return DataFormatUtils.formatAnalyzed(analyzedData); + private void refreshAnalysisData(CommandSender sender) { + ChatColor operatorColor = ChatColor.DARK_GREEN; + ChatColor textColor = ChatColor.GRAY; + sender.sendMessage(textColor + "[" + operatorColor + "Plan" + textColor + "] " + + "Refreshing playerData, this might take a while.."); + this.playerData = DataUtils.getTotalData(); + this.refreshDate = new Date(); + this.analyzedPlayerdata = DataUtils.analyze(this.playerData); } + @Deprecated + private HashMap analyze(HashMap> playerData) { + return DataUtils.analyze(playerData); + } } diff --git a/src/com/djrapitops/plan/command/commands/InspectCommand.java b/src/com/djrapitops/plan/command/commands/InspectCommand.java index 69f59ba2a..d848ac1cf 100644 --- a/src/com/djrapitops/plan/command/commands/InspectCommand.java +++ b/src/com/djrapitops/plan/command/commands/InspectCommand.java @@ -32,10 +32,6 @@ public class InspectCommand extends SubCommand { @Override public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) { String playerName = getPlayerDisplayname(args, sender); -// if (args.length < 1 && !(sender instanceof Player)) { -// sender.sendMessage(ChatColor.RED+"Console use of inspect requires arguments."); -// return false; -// } if (this.plugin.getHooks().isEmpty()) { this.plugin.logError("noHookedPluginsError on InspectCommand"); @@ -55,9 +51,9 @@ public class InspectCommand extends SubCommand { } } - HashMap data = getData(allData, playerName); + HashMap data = DataUtils.getData(allData, playerName); if (format && !data.isEmpty()) { - data = format(data); + data = DataFormatUtils.removeExtraDataPoints(data); } if (data.isEmpty()) { data.put("ERR-NO RESULTS", "No results were found."); @@ -66,19 +62,12 @@ public class InspectCommand extends SubCommand { } - List dataList = new ArrayList<>(); - for (String key : data.keySet()) { - dataList.add(new String[]{key, data.get(key)}); - } - Collections.sort(dataList, new Comparator() { - public int compare(String[] strings, String[] otherStrings) { - return strings[0].compareTo(otherStrings[0]); - } - }); + List dataList = DataFormatUtils.turnDataHashMapToSortedListOfArrays(data); ChatColor operatorColor = ChatColor.DARK_GREEN; ChatColor textColor = ChatColor.GRAY; + //header sender.sendMessage(textColor + "-- [" + operatorColor + "PLAN - Inspect results: " + playerName + textColor + "] --"); for (String[] dataString : dataList) { @@ -88,10 +77,12 @@ public class InspectCommand extends SubCommand { return true; } + @Deprecated public HashMap getData(boolean allData, String playerName) { return DataUtils.getData(allData, playerName); } + @Deprecated public HashMap format(HashMap data) throws NumberFormatException { return DataFormatUtils.removeExtraDataPoints(data); } diff --git a/src/com/djrapitops/plan/command/utils/DataFormatUtils.java b/src/com/djrapitops/plan/command/utils/DataFormatUtils.java index 37ab24e1e..a241fa74c 100644 --- a/src/com/djrapitops/plan/command/utils/DataFormatUtils.java +++ b/src/com/djrapitops/plan/command/utils/DataFormatUtils.java @@ -4,6 +4,8 @@ package com.djrapitops.plan.command.utils; import com.djrapitops.plan.Plan; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -85,7 +87,7 @@ public class DataFormatUtils { if (key.equals("ONT-TOTAL PLAY")) { formatted = formatTimeAmount(data.get(key)); } else { - formatted = formatTimeAmount(data.get(key), new Date()); + formatted = formatTimeAmountSinceString(data.get(key), new Date()); } if (formatted != null) { data.replace(key, formatted); @@ -138,7 +140,7 @@ public class DataFormatUtils { return returnValue; } - public static String formatTimeAmount(String string, Date date) throws NumberFormatException { + public static String formatTimeAmountSinceString(String string, Date date) throws NumberFormatException { String returnValue = ""; long ms = (date.toInstant().getEpochSecond() * 1000) - Long.parseLong(string); long x = ms / 1000; @@ -163,7 +165,7 @@ public class DataFormatUtils { } return returnValue; } - public static String formatTimeAmount(Date before, Date now) throws NumberFormatException { + public static String formatTimeAmountSinceDate(Date before, Date now) throws NumberFormatException { String returnValue = ""; long ms = (now.toInstant().getEpochSecond() * 1000) - (before.toInstant().getEpochSecond() * 1000); long x = ms / 1000; @@ -208,4 +210,17 @@ public class DataFormatUtils { } return returnString; } + + public static List turnDataHashMapToSortedListOfArrays(HashMap data) { + List dataList = new ArrayList<>(); + for (String key : data.keySet()) { + dataList.add(new String[]{key, data.get(key)}); + } + Collections.sort(dataList, new Comparator() { + public int compare(String[] strings, String[] otherStrings) { + return strings[0].compareTo(otherStrings[0]); + } + }); + return dataList; + } } diff --git a/src/com/djrapitops/plan/command/utils/DataUtils.java b/src/com/djrapitops/plan/command/utils/DataUtils.java index 5bd1d3cf5..4056993fa 100644 --- a/src/com/djrapitops/plan/command/utils/DataUtils.java +++ b/src/com/djrapitops/plan/command/utils/DataUtils.java @@ -2,7 +2,11 @@ package com.djrapitops.plan.command.utils; import com.djrapitops.plan.Plan; import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; +import java.util.List; import java.util.Scanner; import java.util.UUID; import org.bukkit.Bukkit; @@ -66,4 +70,96 @@ public class DataUtils { } return null; } + + public static HashMap analyze(HashMap> playerData) { + Plan plugin = getPlugin(Plan.class); + HashMap> playerDataLists = new HashMap<>(); + String[] ignore = {"ESS-BAN REASON", "ESS-OPPED", "ESS-MUTE TIME", "ESS-LOCATION", "ESS-HUNGER", "ESS-LOCATION WORLD", + "ESS-NICKNAME", "ESS-UUID", "FAC-FACTION", "ONT-LAST LOGIN", "TOW-TOWN", "TOW-REGISTERED", + "TOW-LAST LOGIN", "TOW-OWNER OF", "TOW-PLOT PERMS", "TOW-PLOT OPTIONS", "TOW-FRIENDS", "ESS-ONLINE SINCE", + "ESS-OFFLINE SINCE"}; + List ignoreKeys = new ArrayList<>(); + ignoreKeys.addAll(Arrays.asList(ignore)); + for (UUID key : playerData.keySet()) { + for (String dataKey : playerData.get(key).keySet()) { + if (ignoreKeys.contains(dataKey)) { + continue; + } + if (playerDataLists.get(dataKey) == null) { + playerDataLists.put(dataKey, new ArrayList<>()); + } + playerDataLists.get(dataKey).add(playerData.get(key).get(dataKey)); + } + } + + String[] numbers = {"ESS-HEALTH", "ESS-XP LEVEL", "FAC-POWER", "FAC-POWER PER HOUR", + "FAC-POWER PER DEATH", "SVO-VOTES", "ONT-TOTAL VOTES", "ONT-TOTAL REFERRED", "ECO-BALANCE"}; + List numberKeys = new ArrayList<>(); + numberKeys.addAll(Arrays.asList(numbers)); + String[] booleanValues = {"ESS-BANNED", "ESS-JAILED", "ESS-MUTED", "ESS-FLYING", "TOW-ONLINE"}; + List boolKeys = new ArrayList<>(); + boolKeys.addAll(Arrays.asList(booleanValues)); + String[] timeValues = {"ONT-TOTAL PLAY"}; + List timeKeys = new ArrayList<>(); + timeKeys.addAll(Arrays.asList(timeValues)); + + HashMap analyzedData = new HashMap<>(); + int errors = 0; + HashSet errorTypes = new HashSet<>(); + + for (String dataKey : playerDataLists.keySet()) { + if (numberKeys.contains(dataKey)) { + double sum = 0; + + for (String dataPoint : playerDataLists.get(dataKey)) { + try { + if (dataKey.equals("FAC-POWER") || dataKey.equals("AAC-ACHIEVEMENTS")) { + sum += Double.parseDouble(dataPoint.split(" ")[0]); + } else if (dataKey.equals("ECO-BALANCE")) { + sum += Double.parseDouble(DataFormatUtils.removeLetters(dataPoint)); + } else { + sum += Double.parseDouble(dataPoint); + } + } catch (Exception e) { + errors++; + errorTypes.add("" + e); + } + } + analyzedData.put(dataKey, "" + (sum / playerData.size())); + + } else if (boolKeys.contains(dataKey)) { + int amount = 0; + for (String dataPoint : playerDataLists.get(dataKey)) { + try { + if (Boolean.parseBoolean(dataPoint)) { + amount++; + } + } catch (Exception e) { + errors++; + errorTypes.add("" + e); + } + } + analyzedData.put(dataKey, "" + ((amount / playerData.size()) * 100) + "%"); + } else if (timeKeys.contains(dataKey)) { + Long time = Long.parseLong("0"); + for (String dataPoint : playerDataLists.get(dataKey)) { + try { + time += Long.parseLong(dataPoint); + } catch (Exception e) { + errors++; + errorTypes.add("" + e); + } + } + analyzedData.put(dataKey, "" + (time / playerData.size())); + } + } + if (errors > 0) { + String log = "ANALYZE\n" + errors + " error(s) occurred while analyzing total data.\nFollowing types:"; + for (String errorType : errorTypes) { + log += "\n " + errorType; + } + plugin.logToFile(log); + } + return DataFormatUtils.formatAnalyzed(analyzedData); + } } diff --git a/src/config.yml b/src/config.yml index 6c09d1022..aed3e27d6 100644 --- a/src/config.yml +++ b/src/config.yml @@ -1,5 +1,4 @@ debug: true -analysis: true visible: ontime: true diff --git a/src/plugin.yml b/src/plugin.yml index 88ebaa148..32e0941c7 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,6 +1,6 @@ name: Plan main: com.djrapitops.plan.Plan -version: 1.4.0 +version: 1.4.2 commands: plan: