1.6.0 - New Data Structure, API changes, data handling changes, Player Logger Hook, Info Command

- Changed data format to include the Type the data is for easier
analysis (Of Future data and API Using plugins)

- API Changes:
- Hook moved to com.djrapitops.plan.api
- Hook now returns HashMap<Strring, DataPoint>
- added DataPoint to ..plan.api
- added DataType Enum to ..plan.api
- New format uses: data.put("XXX-Key", new Datapoint(String data,
Enum(DataType) datatype));
- Depricated getData(String playername) that returns old format of data,
still returns correct format
- Depricated getAllData(String playername)
- Move to get(All)Data(String name, boolean [anything]) to get the new
format of data.

- Added Player Logger Hook

- Added Info Command that gives version, hooks and checks for new
version.

- Check for new version upon startup
This commit is contained in:
Rsl1122 2016-12-19 17:30:08 +02:00
parent 615b4994b5
commit 728cfc1271
29 changed files with 571 additions and 337 deletions

View File

@ -3,13 +3,20 @@
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/>
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
<group>
<file>file:/C:/Users/Risto/Documents/NetBeansProjects/Plan/src/com/djrapitops/plan/command/hooks/EssentialsHook.java</file>
<file>file:/C:/Users/Risto/Documents/NetBeansProjects/Plan/src/config.yml</file>
<file>file:/C:/Users/Risto/Documents/NetBeansProjects/Plan/src/com/djrapitops/plan/command/utils/MiscUtils.java</file>
<file>file:/C:/Users/Risto/Documents/NetBeansProjects/Plan/src/com/djrapitops/plan/command/utils/Analysis.java</file>
<file>file:/C:/Users/Risto/Documents/NetBeansProjects/Plan/src/com/djrapitops/plan/command/hooks/BukkitDataHook.java</file>
<file>file:/C:/Users/Risto/Documents/NetBeansProjects/Plan/src/com/djrapitops/plan/Plan.java</file>
<file>file:/C:/Users/Risto/Documents/NetBeansProjects/Plan/src/com/djrapitops/plan/api/DataType.java</file>
<file>file:/C:/Users/Risto/Documents/NetBeansProjects/Plan/src/com/djrapitops/plan/command/utils/DataFormatUtils.java</file>
<file>file:/C:/Users/Risto/Documents/NetBeansProjects/Plan/src/com/djrapitops/plan/PlanCommand.java</file>
<file>file:/C:/Users/Risto/Documents/NetBeansProjects/Plan/src/com/djrapitops/plan/command/commands/InfoCommand.java</file>
<file>file:/C:/Users/Risto/Documents/NetBeansProjects/Plan/src/com/djrapitops/plan/api/API.java</file>
<file>file:/C:/Users/Risto/Documents/NetBeansProjects/Plan/src/com/djrapitops/plan/command/utils/AnalysisUtils.java</file>
<file>file:/C:/Users/Risto/Documents/NetBeansProjects/Plan/src/com/djrapitops/plan/command/hooks/EssentialsHook.java</file>
<file>file:/C:/Users/Risto/Documents/NetBeansProjects/Plan/src/com/djrapitops/plan/command/hooks/AdvancedAchievementsHook.java</file>
<file>file:/C:/Users/Risto/Documents/NetBeansProjects/Plan/src/com/djrapitops/plan/Plan.java</file>
<file>file:/C:/Users/Risto/Documents/NetBeansProjects/Plan/src/com/djrapitops/plan/command/utils/DataUtils.java</file>
<file>file:/C:/Users/Risto/Documents/NetBeansProjects/Plan/src/plugin.yml</file>
<file>file:/C:/Users/Risto/Documents/NetBeansProjects/Plan/src/com/djrapitops/plan/command/hooks/OnTimeHook.java</file>
</group>
</open-files>
</project-private>

View File

@ -34,6 +34,7 @@ file.reference.Factions.jar=D:\\Minecraft Servers\\TestServer\\plugins\\Uusi kan
file.reference.MassiveCore.jar=D:\\Minecraft Servers\\TestServer\\plugins\\Uusi kansio\\MassiveCore.jar
file.reference.mcMMO.jar=D:\\Minecraft Servers\\TestServer\\plugins\\Uusi kansio\\mcMMO.jar
file.reference.PlaceholderAPI.jar=D:\\Minecraft Servers\\TestServer\\plugins\\Uusi kansio\\PlaceholderAPI.jar
file.reference.PlayerLogger_v1.0_.jar=D:\\Minecraft Servers\\TestServer\\plugins\\Uusi kansio\\PlayerLogger[v1.0].jar
file.reference.SuperbVote-0.3.2.jar=D:\\Minecraft Servers\\TestServer\\plugins\\Uusi kansio\\SuperbVote-0.3.2.jar
file.reference.Towny.jar=D:\\Downloads\\Towny.jar
file.reference.Vault.jar=D:\\Minecraft Servers\\TestServer\\plugins\\Vault.jar
@ -50,7 +51,8 @@ javac.classpath=\
${file.reference.mcMMO.jar}:\
${file.reference.SuperbVote-0.3.2.jar}:\
${file.reference.PlaceholderAPI.jar}:\
${file.reference.AdvancedAchievements-4.0.2.jar}
${file.reference.AdvancedAchievements-4.0.2.jar}:\
${file.reference.PlayerLogger_v1.0_.jar}
# Space-separated list of extra javac options
javac.compilerargs=
javac.deprecation=false

View File

@ -1,9 +1,10 @@
package com.djrapitops.plan;
import com.djrapitops.plan.api.API;
import com.djrapitops.plan.command.hooks.EssentialsHook;
import com.djrapitops.plan.command.hooks.FactionsHook;
import com.djrapitops.plan.command.hooks.OnTimeHook;
import com.djrapitops.plan.command.hooks.Hook;
import com.djrapitops.plan.api.Hook;
import com.djrapitops.plan.command.hooks.PlaceholderAPIHook;
import com.djrapitops.plan.command.hooks.SuperbVoteHook;
//import com.djrapitops.plan.command.hooks.McMMOHook;
@ -11,7 +12,9 @@ import com.djrapitops.plan.command.hooks.TownyHook;
import com.djrapitops.plan.command.hooks.VaultHook;
import com.djrapitops.plan.command.hooks.AdvancedAchievementsHook;
import com.djrapitops.plan.command.hooks.BukkitDataHook;
import com.djrapitops.plan.command.hooks.PlayerLoggerHook;
import com.djrapitops.plan.command.utils.DataUtils;
import com.djrapitops.plan.command.utils.MiscUtils;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.ArrayList;
@ -81,6 +84,8 @@ public class Plan extends JavaPlugin {
this.api = new API(this);
log(MiscUtils.checkVersion());
String loadedMsg = "Hooked into: ";
for (String key : this.hooks.keySet()) {
loadedMsg += ChatColor.GREEN + key + " ";
@ -102,7 +107,8 @@ public class Plan extends JavaPlugin {
public List<String> hookInit() {
this.hooks.clear();
List<String> hookFail = new ArrayList<>();
String[] pluginsArray = {"OnTime", "Essentials", "Towny", "Vault", "Factions", "SuperbVote", "AdvancedAchievements", "BukkitData"};
String[] pluginsArray = {"OnTime", "Essentials", "Towny", "Vault", "Factions", "SuperbVote",
"AdvancedAchievements", "BukkitData", "PlayerLogger"};
List<String> plugins = new ArrayList<>();
plugins.addAll(Arrays.asList(pluginsArray));
plugins.parallelStream().forEach((pluginName) -> {
@ -181,8 +187,12 @@ public class Plan extends JavaPlugin {
}
public void addExtraHook(String name, Hook hook) {
this.extraHooks.put(name, hook);
this.hooks.put(name, hook);
log("Registered additional hook: "+name);
try {
this.extraHooks.put(name, hook);
this.hooks.put(name, hook);
log("Registered additional hook: " + name);
} catch (Exception | NoClassDefFoundError e) {
logToFile("Failed to hook " + name + "\n" + e);
}
}
}

View File

@ -4,10 +4,11 @@ import com.djrapitops.plan.command.CommandType;
import com.djrapitops.plan.command.SubCommand;
import com.djrapitops.plan.command.commands.AnalyzeCommand;
import com.djrapitops.plan.command.commands.HelpCommand;
import com.djrapitops.plan.command.commands.InfoCommand;
import com.djrapitops.plan.command.commands.InspectCommand;
import com.djrapitops.plan.command.commands.ReloadCommand;
import com.djrapitops.plan.command.commands.SearchCommand;
import com.djrapitops.plan.command.utils.DataFormatUtils;
import com.djrapitops.plan.command.utils.MiscUtils;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
@ -29,6 +30,7 @@ public class PlanCommand implements CommandExecutor {
commands.add(new InspectCommand(plugin));
commands.add(new AnalyzeCommand(plugin));
commands.add(new SearchCommand(plugin));
commands.add(new InfoCommand(plugin));
commands.add(new ReloadCommand(plugin));
}
@ -54,7 +56,7 @@ public class PlanCommand implements CommandExecutor {
if (args.length < 1) {
command = "help";
}
onCommand(sender, cmd, commandLabel, DataFormatUtils.mergeArrays(new String[]{command}, args));
onCommand(sender, cmd, commandLabel, MiscUtils.mergeArrays(new String[]{command}, args));
}
@Override

View File

@ -1,6 +1,6 @@
package com.djrapitops.plan;
package com.djrapitops.plan.api;
import com.djrapitops.plan.command.hooks.Hook;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.command.utils.DataFormatUtils;
import com.djrapitops.plan.command.utils.DataUtils;
import java.util.Date;
@ -50,14 +50,44 @@ public class API {
return plugin.getConfig().getBoolean("visible.placeholderapi");
}
public HashMap<String, String> getData(String playerName) {
public HashMap<String, DataPoint> getData(String playerName, boolean dataPoint) {
return DataFormatUtils.removeExtraDataPoints(DataUtils.getData(false, playerName));
}
public HashMap<String, String> getAllData(String playerName) {
// Please move to DataPoint system as soon as possible
@Deprecated
public HashMap<String, String> getData(String playerName) {
HashMap<String, String> data = new HashMap<>();
HashMap<String, DataPoint> dataWPoints = getData(playerName, true);
dataWPoints.keySet().parallelStream().forEach((key) -> {
data.put(key, dataWPoints.get(key).data());
});
return data;
}
public HashMap<String, DataPoint> getAllData(String playerName, boolean dataPoint) {
return DataFormatUtils.removeExtraDataPoints(DataUtils.getData(true, playerName));
}
// Please move to DataPoint system as soon as possible
@Deprecated
public HashMap<String, String> getAllData(String playerName) {
HashMap<String, String> data = new HashMap<>();
HashMap<String, DataPoint> dataWPoints = getAllData(playerName, true);
dataWPoints.keySet().parallelStream().forEach((key) -> {
data.put(key, dataWPoints.get(key).data());
});
return data;
}
public HashMap<String, DataPoint> transformOldDataFormat(HashMap<String, String> oldData) {
HashMap<String, DataPoint> data = new HashMap<>();
for (String key : oldData.keySet()) {
data.put(key, new DataPoint(oldData.get(key), DataType.OTHER));
}
return data;
}
// 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);

View File

@ -0,0 +1,26 @@
package com.djrapitops.plan.api;
public class DataPoint {
private String data;
private final DataType type;
public DataPoint(String data, DataType type) {
this.data = data;
this.type = type;
}
public String data() {
return data;
}
public void setData(String data) {
this.data = data;
}
public DataType type() {
return type;
}
}

View File

@ -0,0 +1,6 @@
package com.djrapitops.plan.api;
public enum DataType {
STRING, TIME, DATE, LOCATION, AMOUNT, AMOUNT_WITH_MAX, AMOUNT_WITH_LETTERS, BOOLEAN, PERCENT, OTHER, MAP, LINK, HEATMAP, DEPRECATED
}

View File

@ -1,13 +1,13 @@
package com.djrapitops.plan.command.hooks;
package com.djrapitops.plan.api;
import com.djrapitops.plan.Plan;
import java.util.HashMap;
public interface Hook {
public HashMap<String, String> getData(String player) throws Exception;
public HashMap<String, String> getAllData(String player) throws Exception;
public HashMap<String, DataPoint> getData(String player) throws Exception;
public HashMap<String, DataPoint> getAllData(String player) throws Exception;
public default void setPlan(Plan plan) throws Exception {

View File

@ -3,6 +3,7 @@ package com.djrapitops.plan.command.commands;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.command.CommandType;
import com.djrapitops.plan.command.SubCommand;
import com.djrapitops.plan.api.DataPoint;
import com.djrapitops.plan.command.utils.DataFormatUtils;
import com.djrapitops.plan.command.utils.DataUtils;
import com.djrapitops.plan.command.utils.Analysis;
@ -18,8 +19,8 @@ import org.bukkit.entity.Player;
public class AnalyzeCommand extends SubCommand {
private Plan plugin;
private HashMap<UUID, HashMap<String, String>> playerData;
private HashMap<String, String> analyzedPlayerdata;
private HashMap<UUID, HashMap<String, DataPoint>> playerData;
private HashMap<String, DataPoint> analyzedPlayerdata;
private Date refreshDate;
public AnalyzeCommand(Plan plugin) {
@ -67,9 +68,4 @@ public class AnalyzeCommand extends SubCommand {
sender.sendMessage(textColor + "[" + operatorColor + "Plan" + textColor + "] "
+ "Refreshed, took "+DataFormatUtils.formatTimeAmountSinceDate(refreshDate, new Date()));
}
@Deprecated
private HashMap<String, String> analyze(HashMap<UUID, HashMap<String, String>> playerData) {
return DataUtils.analyze(playerData);
}
}

View File

@ -0,0 +1,37 @@
package com.djrapitops.plan.command.commands;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.command.CommandType;
import com.djrapitops.plan.command.SubCommand;
import com.djrapitops.plan.command.hooks.PlaceholderAPIHook;
import com.djrapitops.plan.command.utils.DataUtils;
import com.djrapitops.plan.command.utils.MiscUtils;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
public class InfoCommand extends SubCommand {
private Plan plugin;
public InfoCommand(Plan plugin) {
super("info", "plan.info", "View version and enabled hooks", CommandType.CONSOLE);
this.plugin = plugin;
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
plugin.reloadConfig();
ChatColor operatorColor = ChatColor.DARK_GREEN;
ChatColor textColor = ChatColor.GRAY;
sender.sendMessage(textColor +"--["+operatorColor+"PLAN - Info"+textColor+"]--");
sender.sendMessage(operatorColor+"Version: "+textColor+plugin.getDescription().getVersion());
sender.sendMessage(textColor+MiscUtils.checkVersion());
sender.sendMessage(operatorColor+"Enabled Hooks: "+textColor+plugin.getHooks().keySet());
return true;
}
}

View File

@ -6,18 +6,15 @@ 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.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import com.djrapitops.plan.UUIDFetcher;
import com.djrapitops.plan.api.DataPoint;
import com.djrapitops.plan.api.DataType;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class InspectCommand extends SubCommand {
@ -51,12 +48,12 @@ public class InspectCommand extends SubCommand {
}
}
Date refreshDate = new Date();
HashMap<String, String> data = DataUtils.getData(allData, playerName);
HashMap<String, DataPoint> data = DataUtils.getData(allData, playerName);
if (format && !data.isEmpty()) {
data = DataFormatUtils.removeExtraDataPoints(data);
}
if (data.isEmpty()) {
data.put("ERR-NO RESULTS", "No results were found.");
data.put("ERR-NO RESULTS", new DataPoint("No results were found.", DataType.OTHER));
plugin.logToFile("INSPECT-Results\nNo results were found for: " + playerName);
@ -76,22 +73,4 @@ public class InspectCommand extends SubCommand {
sender.sendMessage(textColor + "-- o --");
return true;
}
// Use DataUtils.getData instead
@Deprecated
public HashMap<String, String> getData(boolean allData, String playerName) {
return DataUtils.getData(allData, playerName);
}
// Use DataFormatUtils.removeExtraDataPoints instead
@Deprecated
public HashMap<String, String> format(HashMap<String, String> data) throws NumberFormatException {
return DataFormatUtils.removeExtraDataPoints(data);
}
// Use DataUtils.getPlayerDisplayname instead
@Deprecated
private String getPlayerDisplayname(String[] args, CommandSender sender) {
return DataUtils.getPlayerDisplayname(args, sender);
}
}

View File

@ -3,6 +3,8 @@ package com.djrapitops.plan.command.commands;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.command.CommandType;
import com.djrapitops.plan.command.SubCommand;
import com.djrapitops.plan.api.DataPoint;
import com.djrapitops.plan.api.DataType;
import com.djrapitops.plan.command.utils.DataFormatUtils;
import com.djrapitops.plan.command.utils.DataUtils;
import java.util.Arrays;
@ -43,7 +45,7 @@ public class SearchCommand extends SubCommand {
matchingPlayers = DataUtils.getMatchingDisplaynames(args, sender, false);
}
args = DataFormatUtils.parseSearchArgs(args);
HashMap<UUID, HashMap<String, String>> data = DataUtils.getTotalData(matchingPlayers);
HashMap<UUID, HashMap<String, DataPoint>> data = DataUtils.getTotalData(matchingPlayers);
if (this.plugin.getHooks().isEmpty()) {
this.plugin.logError("noHookedPluginsError on SearchCommand");
this.plugin.logToFile("SEARCH\nnoHookedPluginsError on SearchCommand");
@ -55,12 +57,12 @@ public class SearchCommand extends SubCommand {
HashMap<String, List<String[]>> dataLists = new HashMap<>();
for (UUID key : data.keySet()) {
OfflinePlayer p = getOfflinePlayer(key);
HashMap<String, String> dataMap = data.get(key);
HashMap<String, DataPoint> dataMap = data.get(key);
if (!dataMap.isEmpty()) {
dataMap = DataFormatUtils.removeExtraDataPointsSearch(dataMap, args);
}
if (dataMap.isEmpty()) {
dataMap.put("ERR-NO RESULTS", "No results were found.");
dataMap.put("ERR-NO RESULTS", new DataPoint("No results were found.", DataType.OTHER));
plugin.logToFile("SEARCH-Results\nNo results were found for: " + p.getName() + Arrays.toString(args));
}
dataLists.put(p.getName(), DataFormatUtils.turnDataHashMapToSortedListOfArrays(dataMap));

View File

@ -1,7 +1,10 @@
package com.djrapitops.plan.command.hooks;
import com.djrapitops.plan.api.Hook;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.UUIDFetcher;
import com.djrapitops.plan.api.DataPoint;
import com.djrapitops.plan.api.DataType;
import com.hm.achievement.AdvancedAchievements;
import com.hm.achievement.category.MultipleAchievements;
import com.hm.achievement.category.NormalAchievements;
@ -73,15 +76,15 @@ public class AdvancedAchievementsHook implements Hook {
}
@Override
public HashMap<String, String> getData(String player) throws Exception {
HashMap<String, String> data = new HashMap<>();
public HashMap<String, DataPoint> getData(String player) throws Exception {
HashMap<String, DataPoint> data = new HashMap<>();
// Check if achievements exist
if (totalAchievements > 0) {
UUID uuid = UUIDFetcher.getUUIDOf(player);
try {
// Check if correct method is present
if (this.usingUUID) {
data.put("AAC-ACHIEVEMENTS", aAPlugin.getDb().getPlayerAchievementsAmount(uuid.toString()) + " / " + totalAchievements);
data.put("AAC-ACHIEVEMENTS", new DataPoint(aAPlugin.getDb().getPlayerAchievementsAmount(uuid.toString()) + " / " + totalAchievements, DataType.AMOUNT_WITH_MAX));
} else {
// Fallback method for older versions, only returns Online player data
Player p;
@ -92,7 +95,7 @@ public class AdvancedAchievementsHook implements Hook {
}
if (p != null) {
data.put("AAC-ACHIEVEMENTS", aAPlugin.getDb().getPlayerAchievementsAmount(p) + " / " + totalAchievements);
data.put("AAC-ACHIEVEMENTS", new DataPoint(aAPlugin.getDb().getPlayerAchievementsAmount(p) + " / " + totalAchievements, DataType.AMOUNT_WITH_MAX));
}
}
} catch (Exception e) {
@ -103,7 +106,7 @@ public class AdvancedAchievementsHook implements Hook {
}
@Override
public HashMap<String, String> getAllData(String player) throws Exception {
public HashMap<String, DataPoint> getAllData(String player) throws Exception {
return getData(player);
}

View File

@ -1,7 +1,10 @@
package com.djrapitops.plan.command.hooks;
import com.djrapitops.plan.api.Hook;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.UUIDFetcher;
import com.djrapitops.plan.api.DataPoint;
import com.djrapitops.plan.api.DataType;
import java.util.HashMap;
import static org.bukkit.Bukkit.getOfflinePlayer;
import org.bukkit.Location;
@ -16,32 +19,32 @@ public class BukkitDataHook implements Hook {
}
@Override
public HashMap<String, String> getData(String player) throws Exception {
HashMap<String, String> data = new HashMap<>();
public HashMap<String, DataPoint> getData(String player) throws Exception {
HashMap<String, DataPoint> data = new HashMap<>();
OfflinePlayer p = getOfflinePlayer(UUIDFetcher.getUUIDOf(player));
if (p.hasPlayedBefore()) {
data.put("BUK-REGISTERED", "" + p.getFirstPlayed());
data.put("BUK-LAST LOGIN", "" + p.getLastPlayed());
data.put("BUK-REGISTERED", new DataPoint("" + p.getFirstPlayed(), DataType.DATE));
data.put("BUK-LAST LOGIN", new DataPoint("" + p.getLastPlayed(), DataType.DATE));
if (p.isBanned()) {
data.put("BUK-BANNED", "" + p.isBanned());
data.put("BUK-BANNED", new DataPoint("" + p.isBanned(), DataType.BOOLEAN));
}
data.put("BUK-ONLINE", "" + p.isOnline());
data.put("BUK-ONLINE", new DataPoint("" + p.isOnline(), DataType.BOOLEAN));
}
return data;
}
@Override
public HashMap<String, String> getAllData(String player) throws Exception {
HashMap<String, String> data = new HashMap<>();
public HashMap<String, DataPoint> getAllData(String player) throws Exception {
HashMap<String, DataPoint> data = new HashMap<>();
data.putAll(getData(player));
OfflinePlayer p = getOfflinePlayer(UUIDFetcher.getUUIDOf(player));
Location loc = p.getBedSpawnLocation();
if (p.hasPlayedBefore()) {
Location loc = p.getBedSpawnLocation();
if (loc != null) {
data.put("BUK-BED LOCATION WORLD", loc.getWorld().getName());
data.put("BUK-BED LOCATION", " X:" + loc.getBlockX() + " Y:" + loc.getBlockY() + " Z:" + loc.getBlockZ());
data.put("BUK-BED LOCATION WORLD", new DataPoint(loc.getWorld().getName(), DataType.STRING));
data.put("BUK-BED LOCATION", new DataPoint(" X:" + loc.getBlockX() + " Y:" + loc.getBlockY() + " Z:" + loc.getBlockZ(), DataType.LOCATION));
}
data.put("BUK-UUID", "" + p.getUniqueId());
data.put("BUK-UUID", new DataPoint("" + p.getUniqueId(), DataType.OTHER));
}
return data;
}

View File

@ -1,6 +1,9 @@
package com.djrapitops.plan.command.hooks;
import com.djrapitops.plan.api.Hook;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.api.DataPoint;
import com.djrapitops.plan.api.DataType;
import java.util.HashMap;
import com.earth2me.essentials.Essentials;
@ -23,60 +26,60 @@ public class EssentialsHook implements Hook {
// Gets data with Essentials own User methods
@Override
public HashMap<String, String> getData(String player) throws Exception {
HashMap<String, String> data = new HashMap<>();
public HashMap<String, DataPoint> getData(String player) throws Exception {
HashMap<String, DataPoint> data = new HashMap<>();
User user = this.ess.getOfflineUser(player);
if (user != null) {
if (this.ess.getServer().getBanList(BanList.Type.IP).isBanned(player)
|| BanLookup.isBanned(this.ess, player)) {
data.put("ESS-BANNED", "" + true);
data.put("ESS-BAN REASON", "" + BanLookup.getBanEntry(this.ess, player).getReason());
data.put("ESS-BANNED", new DataPoint("" + true, DataType.BOOLEAN));
data.put("ESS-BAN REASON", new DataPoint("" + BanLookup.getBanEntry(this.ess, player).getReason(), DataType.STRING));
}
if (user.isJailed()) {
data.put("ESS-JAILED", "" + true);
data.put("ESS-JAIL TIME", "" + user.getJailTimeout());
data.put("ESS-JAILED", new DataPoint("" + true, DataType.BOOLEAN));
data.put("ESS-JAIL TIME", new DataPoint("" + user.getJailTimeout(), DataType.TIME));
}
if (user.isMuted()) {
data.put("ESS-MUTED", "" + true);
data.put("ESS-MUTE TIME", "" + user.getMuteTimeout());
data.put("ESS-MUTED", new DataPoint("" + true, DataType.BOOLEAN));
data.put("ESS-MUTE TIME", new DataPoint("" + user.getMuteTimeout(), DataType.TIME));
}
try {
if (user.isReachable()) {
Location loc = user.getLocation();
data.put("ESS-LOCATION WORLD", loc.getWorld().getName());
data.put("ESS-LOCATION", " X:" + loc.getBlockX() + " Y:" + loc.getBlockY() + " Z:" + loc.getBlockZ());
data.put("ESS-LOCATION WORLD", new DataPoint(loc.getWorld().getName(), DataType.STRING));
data.put("ESS-LOCATION", new DataPoint(" X:" + loc.getBlockX() + " Y:" + loc.getBlockY() + " Z:" + loc.getBlockZ(), DataType.LOCATION));
} else {
Location loc = user.getLogoutLocation();
data.put("ESS-LOCATION WORLD", loc.getWorld().getName());
data.put("ESS-LOCATION", "X:" + loc.getBlockX() + " Y:" + loc.getBlockY() + " Z:" + loc.getBlockZ());
data.put("ESS-LOCATION WORLD", new DataPoint(loc.getWorld().getName(), DataType.STRING));
data.put("ESS-LOCATION", new DataPoint("X:" + loc.getBlockX() + " Y:" + loc.getBlockY() + " Z:" + loc.getBlockZ(), DataType.LOCATION));
}
} catch (Exception e) {
this.plugin.logToFile("ESSENTIALSHOOK\n" + e + "\n" + e.getMessage());
}
data.put("ESS-NICKNAME", "" + user.getDisplayName());
data.put("ESS-NICKNAME", new DataPoint("" + user.getDisplayName(), DataType.STRING));
if (user.isReachable()) {
data.put("ESS-ONLINE SINCE", "" + user.getLastOnlineActivity());
data.put("ESS-ONLINE SINCE", new DataPoint("" + user.getLastOnlineActivity(), DataType.TIME));
} else {
data.put("ESS-OFFLINE SINCE", "" + user.getLastOnlineActivity());
data.put("ESS-OFFLINE SINCE", new DataPoint("" + user.getLastOnlineActivity(), DataType.TIME));
}
}
return data;
}
@Override
public HashMap<String, String> getAllData(String player) throws Exception {
HashMap<String, String> data = new HashMap<>();
public HashMap<String, DataPoint> getAllData(String player) throws Exception {
HashMap<String, DataPoint> data = new HashMap<>();
data.putAll(getData(player));
User user = this.ess.getOfflineUser(player);
if (user != null) {
data.put("ESS-UUID", "" + user.getBase().getUniqueId().toString());
data.put("ESS-HEALTH", "" + user.getBase().getHealth());
data.put("ESS-HUNGER", "" + user.getBase().getFoodLevel());
data.put("ESS-XP LEVEL", "" + user.getBase().getLevel());
data.put("ESS-OPPED", "" + user.getBase().isOp());
data.put("ESS-UUID", new DataPoint("" + user.getBase().getUniqueId().toString(), DataType.OTHER));
data.put("ESS-HEALTH", new DataPoint("" + user.getBase().getHealth(), DataType.AMOUNT));
data.put("ESS-HUNGER", new DataPoint("" + user.getBase().getFoodLevel(), DataType.AMOUNT));
data.put("ESS-XP LEVEL", new DataPoint("" + user.getBase().getLevel(), DataType.AMOUNT));
data.put("ESS-OPPED", new DataPoint("" + user.getBase().isOp(), DataType.BOOLEAN));
// data.put("ESS-GOD MODE", "" + user.isGodModeEnabled());
data.put("ESS-FLYING", "" + user.getBase().isFlying());
data.put("ESS-FLYING", new DataPoint("" + user.getBase().isFlying(), DataType.BOOLEAN));
}
return data;
}

View File

@ -1,7 +1,10 @@
package com.djrapitops.plan.command.hooks;
import com.djrapitops.plan.api.Hook;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.UUIDFetcher;
import com.djrapitops.plan.api.DataPoint;
import com.djrapitops.plan.api.DataType;
import com.massivecraft.factions.Factions;
import java.util.HashMap;
@ -22,8 +25,8 @@ public class FactionsHook implements Hook {
}
@Override
public HashMap<String, String> getData(String player) throws Exception {
HashMap<String, String> data = new HashMap<>();
public HashMap<String, DataPoint> getData(String player) throws Exception {
HashMap<String, DataPoint> data = new HashMap<>();
MPlayer mplayer;
UUID uuid = UUIDFetcher.getUUIDOf(player);
OfflinePlayer p;
@ -38,20 +41,20 @@ public class FactionsHook implements Hook {
// Check if player has played on server
if (p.hasPlayedBefore()) {
if (mplayer.hasFaction()) {
data.put("FAC-FACTION", mplayer.getFactionName());
data.put("FAC-FACTION", new DataPoint(mplayer.getFactionName(), DataType.STRING));
if (mplayer.hasTitle()) {
data.put("FAC-TITLE", mplayer.getTitle());
data.put("FAC-TITLE", new DataPoint(mplayer.getTitle(), DataType.STRING));
}
}
data.put("FAC-POWER", mplayer.getPowerRounded() + " / " + mplayer.getPowerMax());
data.put("FAC-POWER PER HOUR", "" + mplayer.getPowerPerHour());
data.put("FAC-POWER PER DEATH", "" + mplayer.getPowerPerDeath());
data.put("FAC-POWER", new DataPoint(mplayer.getPowerRounded() + " / " + mplayer.getPowerMax(), DataType.AMOUNT_WITH_MAX));
data.put("FAC-POWER PER HOUR", new DataPoint("" + mplayer.getPowerPerHour(), DataType.AMOUNT));
data.put("FAC-POWER PER DEATH", new DataPoint("" + mplayer.getPowerPerDeath(), DataType.AMOUNT));
}
return data;
}
@Override
public HashMap<String, String> getAllData(String player) throws Exception {
public HashMap<String, DataPoint> getAllData(String player) throws Exception {
return getData(player);
}
}

View File

@ -1,6 +1,9 @@
package com.djrapitops.plan.command.hooks;
import com.djrapitops.plan.api.Hook;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.api.DataPoint;
import com.djrapitops.plan.api.DataType;
import java.util.HashMap;
import me.edge209.OnTime.OnTimeAPI;
@ -16,13 +19,13 @@ public class OnTimeHook implements Hook {
}
@Override
public HashMap<String, String> getData(String player) throws Exception {
HashMap<String, String> data = new HashMap<>();
public HashMap<String, DataPoint> getData(String player) throws Exception {
HashMap<String, DataPoint> data = new HashMap<>();
try {
data.put("ONT-LAST LOGIN", "" + OnTimeAPI.getPlayerTimeData(player, OnTimeAPI.data.LASTLOGIN));
data.put("ONT-TOTAL PLAY", "" + OnTimeAPI.getPlayerTimeData(player, OnTimeAPI.data.TOTALPLAY));
data.put("ONT-TOTAL VOTES", "" + OnTimeAPI.getPlayerTimeData(player, OnTimeAPI.data.TOTALVOTE));
data.put("ONT-TOTAL REFERRED", "" + OnTimeAPI.getPlayerTimeData(player, OnTimeAPI.data.TOTALREFER));
data.put("ONT-LAST LOGIN", new DataPoint("" + OnTimeAPI.getPlayerTimeData(player, OnTimeAPI.data.LASTLOGIN), DataType.DEPRECATED));
data.put("ONT-TOTAL PLAY", new DataPoint("" + OnTimeAPI.getPlayerTimeData(player, OnTimeAPI.data.TOTALPLAY), DataType.TIME));
data.put("ONT-TOTAL VOTES", new DataPoint("" + OnTimeAPI.getPlayerTimeData(player, OnTimeAPI.data.TOTALVOTE), DataType.AMOUNT));
data.put("ONT-TOTAL REFERRED", new DataPoint("" + OnTimeAPI.getPlayerTimeData(player, OnTimeAPI.data.TOTALREFER), DataType.AMOUNT));
} catch (NoClassDefFoundError e) {
plugin.logToFile("ONTIME HOOK ERROR"
+ "\nOntimeHook enabled but failing, could not get data."
@ -34,7 +37,7 @@ public class OnTimeHook implements Hook {
}
@Override
public HashMap<String, String> getAllData(String player) throws Exception {
public HashMap<String, DataPoint> getAllData(String player) throws Exception {
return getData(player);
}
}

View File

@ -1,7 +1,10 @@
package com.djrapitops.plan.command.hooks;
import com.djrapitops.plan.api.Hook;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.UUIDFetcher;
import com.djrapitops.plan.api.DataPoint;
import com.djrapitops.plan.api.DataType;
import com.djrapitops.plan.command.utils.DataFormatUtils;
import com.djrapitops.plan.command.utils.DataUtils;
import java.util.ArrayList;
@ -27,10 +30,10 @@ public class PlaceholderAPIHook extends EZPlaceholderHook implements Hook {
@Override
public String onPlaceholderRequest(Player player, String identifier) {
HashMap<String, String> data = DataFormatUtils.removeExtraDataPoints(DataUtils.getData(true, player.getDisplayName()));
HashMap<String, DataPoint> data = DataFormatUtils.removeExtraDataPoints(DataUtils.getData(true, player.getDisplayName()));
String key = identifier.toUpperCase();
if (data.get(key) != null) {
return data.get(key);
return data.get(key).data();
} else {
plan.logToFile("PlaceholderAPIHOOK\nFailed to get data\n" + player.getDisplayName() + "\n" + key);
}
@ -38,20 +41,20 @@ public class PlaceholderAPIHook extends EZPlaceholderHook implements Hook {
}
@Override
public HashMap<String, String> getData(String playerName) throws Exception {
HashMap<String, String> data = new HashMap<>();
public HashMap<String, DataPoint> getData(String playerName) throws Exception {
HashMap<String, DataPoint> data = new HashMap<>();
Player player = Bukkit.getPlayer(UUIDFetcher.getUUIDOf(playerName));
for (String placeholder : placeholders) {
if (placeholder.length() > 0 && placeholder.contains("%") || placeholder.contains("{")) {
String key = ("" + placeholder.subSequence(1, placeholder.length() - 1)).toUpperCase();
data.put("PHA-" + key.toUpperCase(), PlaceholderAPI.setPlaceholders(player, placeholder));
data.put("PHA-" + key.toUpperCase(), new DataPoint(PlaceholderAPI.setPlaceholders(player, placeholder), DataType.OTHER));
}
}
return data;
}
@Override
public HashMap<String, String> getAllData(String player) throws Exception {
public HashMap<String, DataPoint> getAllData(String player) throws Exception {
return getData(player);
}

View File

@ -0,0 +1,57 @@
package com.djrapitops.plan.command.hooks;
import com.djrapitops.plan.api.Hook;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.UUIDFetcher;
import com.djrapitops.plan.api.DataPoint;
import com.djrapitops.plan.api.DataType;
import java.util.HashMap;
import java.util.UUID;
import me.BadBones69.Logger.SettingsManager;
import static org.bukkit.Bukkit.getOfflinePlayer;
import org.bukkit.OfflinePlayer;
import org.bukkit.configuration.file.FileConfiguration;
public class PlayerLoggerHook implements Hook {
private Plan plugin;
public PlayerLoggerHook(Plan plugin) throws Exception, NoClassDefFoundError {
this.plugin = plugin;
SettingsManager.getInstance();
}
@Override
public HashMap<String, DataPoint> getData(String player) throws Exception {
HashMap<String, DataPoint> data = new HashMap<>();
FileConfiguration file = SettingsManager.getInstance().getData();
UUID uuid = UUIDFetcher.getUUIDOf(player);
OfflinePlayer p = getOfflinePlayer(uuid);
if (p.hasPlayedBefore()) {
data.put("PLG-REGISTERED", new DataPoint(file.getString("Players." + uuid + ".DateJoined"), DataType.DEPRECATED));
data.put("PLG-LAST LOGIN", new DataPoint(file.getString("Players." + uuid + ".LastSeen"), DataType.DEPRECATED));
data.put("PLG-TIMES JOINED", new DataPoint(file.getString("Players." + uuid + ".TimePlayed"), DataType.AMOUNT));
data.put("PLG-KILLS", new DataPoint(file.getString("Players." + uuid + ".Kills"), DataType.AMOUNT));
data.put("PLG-DEATHS", new DataPoint(file.getString("Players." + uuid + ".Deaths"), DataType.AMOUNT));
data.put("PLG-TIMES KICKED", new DataPoint(file.getString("Players." + uuid + ".Kicks"), DataType.AMOUNT));
}
return data;
}
@Override
public HashMap<String, DataPoint> getAllData(String player) throws Exception {
HashMap<String, DataPoint> data = new HashMap<>();
data.putAll(getData(player));
UUID uuid = UUIDFetcher.getUUIDOf(player);
OfflinePlayer p = getOfflinePlayer(uuid);
FileConfiguration file = SettingsManager.getInstance().getData();
if (p.hasPlayedBefore()) {
data.put("PLG-STICKS MADE", new DataPoint(file.getString("Players." + uuid + ".Sticks"), DataType.AMOUNT));
data.put("PLG-STEPS", new DataPoint(file.getString("Players." + uuid + ".Steps"), DataType.AMOUNT));
data.put("PLG-CROUCHES", new DataPoint(file.getString("Players." + uuid + ".Twerks"), DataType.AMOUNT));
}
return data;
}
}

View File

@ -1,7 +1,10 @@
package com.djrapitops.plan.command.hooks;
import com.djrapitops.plan.api.Hook;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.UUIDFetcher;
import com.djrapitops.plan.api.DataPoint;
import com.djrapitops.plan.api.DataType;
import io.minimum.minecraft.superbvote.SuperbVote;
import java.util.HashMap;
@ -16,14 +19,14 @@ public class SuperbVoteHook implements Hook {
}
@Override
public HashMap<String, String> getData(String player) throws Exception {
HashMap<String, String> data = new HashMap<>();
data.put("SVO-VOTES", "" + hookP.getVoteStorage().getVotes(UUIDFetcher.getUUIDOf(player)));
public HashMap<String, DataPoint> getData(String player) throws Exception {
HashMap<String, DataPoint> data = new HashMap<>();
data.put("SVO-VOTES", new DataPoint("" + hookP.getVoteStorage().getVotes(UUIDFetcher.getUUIDOf(player)), DataType.AMOUNT));
return data;
}
@Override
public HashMap<String, String> getAllData(String player) throws Exception {
public HashMap<String, DataPoint> getAllData(String player) throws Exception {
return getData(player);
}

View File

@ -1,9 +1,11 @@
package com.djrapitops.plan.command.hooks;
import com.djrapitops.plan.api.Hook;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.api.DataPoint;
import com.djrapitops.plan.api.DataType;
import com.palmergames.bukkit.towny.Towny;
import static com.palmergames.bukkit.towny.TownyFormatter.getFormattedName;
import static com.palmergames.bukkit.towny.TownyFormatter.getFormattedResidents;
import static com.palmergames.bukkit.towny.TownyFormatter.lastOnlineFormat;
import static com.palmergames.bukkit.towny.TownyFormatter.registeredFormat;
import com.palmergames.bukkit.towny.exceptions.TownyException;
@ -26,22 +28,22 @@ public class TownyHook implements Hook {
}
@Override
public HashMap<String, String> getData(String player) throws Exception {
HashMap<String, String> data = new HashMap<>();
public HashMap<String, DataPoint> getData(String player) throws Exception {
HashMap<String, DataPoint> data = new HashMap<>();
try {
Resident resident = TownyUniverse.getDataSource().getResident(player);
if (resident != null) {
data.put("TOW-ONLINE", "" + BukkitTools.isOnline(player));
data.put("TOW-REGISTERED", registeredFormat.format(resident.getRegistered()));
data.put("TOW-LAST LOGIN", lastOnlineFormat.format(resident.getLastOnline()));
data.put("TOW-OWNER OF", resident.getTownBlocks().size() + " plots");
data.put("TOW-ONLINE", new DataPoint("" + BukkitTools.isOnline(player), DataType.BOOLEAN));
data.put("TOW-REGISTERED", new DataPoint(registeredFormat.format(resident.getRegistered()), DataType.DEPRECATED));
data.put("TOW-LAST LOGIN", new DataPoint(lastOnlineFormat.format(resident.getLastOnline()), DataType.DEPRECATED));
data.put("TOW-OWNER OF", new DataPoint(resident.getTownBlocks().size() + " plots", DataType.STRING));
try {
if (resident.hasTown()) {
data.put("TOW-TOWN", getFormattedName(resident.getTown()));
data.put("TOW-TOWN", new DataPoint(getFormattedName(resident.getTown()), DataType.STRING));
}
if (resident.hasNation()) {
if (!resident.getNationRanks().isEmpty()) {
data.put("TOW-NATION", resident.getTown().getNation().getName());
data.put("TOW-NATION", new DataPoint(resident.getTown().getNation().getName(), DataType.STRING));
}
}
} catch (TownyException e) {
@ -58,16 +60,16 @@ public class TownyHook implements Hook {
}
@Override
public HashMap<String, String> getAllData(String player) throws Exception {
HashMap<String, String> data = new HashMap<>();
public HashMap<String, DataPoint> getAllData(String player) throws Exception {
HashMap<String, DataPoint> data = new HashMap<>();
data.putAll(getData(player));
try {
Resident resident = TownyUniverse.getDataSource().getResident(player);
data.put("TOW-PLOT PERMS", resident.getPermissions().getColourString());
data.put("TOW-PLOT OPTIONS", "PVP: " + ((resident.getPermissions().pvp) ? "ON" : "OFF") + " Explosions: " + ((resident.getPermissions().explosion) ? "ON" : "OFF") + " Firespread: " + ((resident.getPermissions().fire) ? "ON" : "OFF") + " Mob Spawns: " + ((resident.getPermissions().mobs) ? "ON" : "OFF"));
data.put("TOW-PLOT PERMS", new DataPoint(resident.getPermissions().getColourString(), DataType.STRING));
data.put("TOW-PLOT OPTIONS", new DataPoint("PVP: " + ((resident.getPermissions().pvp) ? "ON" : "OFF") + " Explosions: " + ((resident.getPermissions().explosion) ? "ON" : "OFF") + " Firespread: " + ((resident.getPermissions().fire) ? "ON" : "OFF") + " Mob Spawns: " + ((resident.getPermissions().mobs) ? "ON" : "OFF"), DataType.STRING));
List<Resident> friends = resident.getFriends();
data.put("TOW-FRIENDS", getFormattedResidents("Friends", friends).toString());
data.put("TOW-FRIENDS", new DataPoint(getFormattedResidents("Friends", friends).toString(), DataType.STRING));
} catch (TownyException e) {
plugin.logToFile("TOWNYHOOK-All\n" + e + "\nError resident: " + player);

View File

@ -1,7 +1,10 @@
package com.djrapitops.plan.command.hooks;
import com.djrapitops.plan.api.Hook;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.UUIDFetcher;
import com.djrapitops.plan.api.DataPoint;
import com.djrapitops.plan.api.DataType;
import java.util.HashMap;
import java.util.UUID;
import org.bukkit.OfflinePlayer;
@ -20,8 +23,8 @@ public class VaultHook implements Hook {
}
@Override
public HashMap<String, String> getData(String player) throws Exception {
HashMap<String, String> data = new HashMap<>();
public HashMap<String, DataPoint> getData(String player) throws Exception {
HashMap<String, DataPoint> data = new HashMap<>();
try {
UUID uuid = UUIDFetcher.getUUIDOf(player);
OfflinePlayer p;
@ -31,7 +34,7 @@ public class VaultHook implements Hook {
p = getOfflinePlayer(player);
}
if (p.hasPlayedBefore()) {
data.put("ECO-BALANCE", this.econ.format(this.econ.getBalance(p)));
data.put("ECO-BALANCE", new DataPoint(this.econ.format(this.econ.getBalance(p)), DataType.AMOUNT_WITH_LETTERS));
}
} catch (Exception e) {
plugin.logToFile("VAULTHOOK\n" + e + "\nError player: " + player);
@ -41,7 +44,7 @@ public class VaultHook implements Hook {
}
@Override
public HashMap<String, String> getAllData(String player) throws Exception {
public HashMap<String, DataPoint> getAllData(String player) throws Exception {
return getData(player);
}

View File

@ -1,9 +1,9 @@
package com.djrapitops.plan.command.utils;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.command.hooks.AdvancedAchievementsHook;
import com.djrapitops.plan.command.utils.DataFormatUtils;
import com.djrapitops.plan.api.DataPoint;
import com.djrapitops.plan.api.DataType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@ -13,16 +13,17 @@ import java.util.UUID;
import static org.bukkit.plugin.java.JavaPlugin.getPlugin;
public class Analysis {
public static HashMap<String, String> analyze(HashMap<UUID, HashMap<String, String>> playerData) {
public static HashMap<String, DataPoint> analyze(HashMap<UUID, HashMap<String, DataPoint>> playerData) {
Plan plugin = getPlugin(Plan.class);
HashMap<String, List<String>> playerDataLists = new HashMap<>();
HashMap<String, DataType> dataTypes = new HashMap<>();
// Ignore following keys (Strings, unprocessable or irrelevant data)
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", "BUK-BED LOCATION", "BUK-BED LOCATION WORLD", "BUK-UUID", "BUK-LAST LOGIN", "BUK-REGISTERED"};
DataType[] ignoreType = {DataType.DEPRECATED, DataType.STRING, DataType.LOCATION, DataType.LINK, DataType.HEATMAP,
DataType.MAP, DataType.OTHER, DataType.DATE};
String[] ignore = {"ESS-ONLINE SINCE", "ESS-OFFLINE SINCE", "ESS-HEALTH", "ESS-HUNGER", "ESS-XP LEVEL", "ESS-OPPED"};
List<String> ignoreKeys = new ArrayList<>();
List<DataType> ignoreTypes = new ArrayList<>();
try {
AdvancedAchievementsHook aaHook = (AdvancedAchievementsHook) plugin.getHooks().get("AdvancedAchievements");
if (!aaHook.isUsingUUID()) {
@ -32,11 +33,19 @@ public class Analysis {
ignoreKeys.add("AAC-ACHIEVEMENTS");
}
ignoreKeys.addAll(Arrays.asList(ignore));
ignoreTypes.addAll(Arrays.asList(ignoreType));
// Turn playerData into Hashmap of Lists sorted by keys.
playerData.keySet().parallelStream().forEach((key) -> {
playerData.get(key).keySet().parallelStream()
.filter((dataKey) -> !(ignoreKeys.contains(dataKey)))
.map((dataKey) -> {
if (dataTypes.get(dataKey) == null) {
dataTypes.put(dataKey, playerData.get(key).get(dataKey).type());
}
return dataKey;
})
.filter((dataKey) -> !(ignoreTypes.contains(dataTypes.get(dataKey))))
.map((dataKey) -> {
if (playerDataLists.get(dataKey) == null) {
playerDataLists.put(dataKey, new ArrayList<>());
@ -44,110 +53,39 @@ public class Analysis {
return dataKey;
})
.forEach((dataKey) -> {
playerDataLists.get(dataKey).add(playerData.get(key).get(dataKey));
playerDataLists.get(dataKey).add(playerData.get(key).get(dataKey).data());
});
});
// Define analysis method for keys
String[] numbers = {"AAC-ACHIEVEMENTS", "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", "DEM-AGE"};
String[] booleanValues = {"ESS-BANNED", "ESS-JAILED", "ESS-MUTED", "ESS-FLYING", "TOW-ONLINE", "BUK-BANNED", "BUK-ONLINE"};
String[] timeValues = {"ONT-TOTAL PLAY"};
HashMap<String, DataPoint> analyzedData = new HashMap<>();
List<String> numberKeys = new ArrayList<>();
List<String> boolKeys = new ArrayList<>();
List<String> timeKeys = new ArrayList<>();
numberKeys.addAll(Arrays.asList(numbers));
boolKeys.addAll(Arrays.asList(booleanValues));
timeKeys.addAll(Arrays.asList(timeValues));
// Attempt to determine if undefined data is usable
// List<String> unusedKeys = new ArrayList<>();
// unusedKeys.addAll(playerDataLists.keySet());
// unusedKeys.removeAll(numberKeys);
// unusedKeys.removeAll(boolKeys);
// unusedKeys.removeAll(timeKeys);
// unusedKeys.removeAll(ignoreKeys);
// for (String key : unusedKeys) {
// try {
// Double.parseDouble(playerDataLists.get(key).get(0));
// numberKeys.add(key);
// continue;
// } catch (Exception e) {
//
// }
// try {
// Boolean.parseBoolean(playerDataLists.get(key).get(0));
// boolKeys.add(key);
// } catch (Exception e) {
//
// }
// }
HashMap<String, String> averagesAndPercents = new HashMap<>();
int errors = 0;
HashSet<String> errorTypes = new HashSet<>();
// Analyze - Go through each key - Go through each point of data in the list.
for (String dataKey : playerDataLists.keySet()) {
if (numberKeys.contains(dataKey)) {
double sum = 0;
for (String dataPoint : playerDataLists.get(dataKey)) {
// Special cases separated.
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);
}
// Analyze
playerDataLists.keySet().parallelStream().forEach((dataKey) -> {
if (null != dataTypes.get(dataKey)) {
switch (dataTypes.get(dataKey)) {
case AMOUNT:
analyzedData.put(dataKey, new DataPoint(AnalysisUtils.AmountAverage(playerDataLists.get(dataKey)), DataType.AMOUNT));
break;
case AMOUNT_WITH_LETTERS:
analyzedData.put(dataKey, new DataPoint(AnalysisUtils.AmountWLettersAverage(playerDataLists.get(dataKey)), DataType.AMOUNT));
break;
case AMOUNT_WITH_MAX:
analyzedData.put(dataKey, new DataPoint(AnalysisUtils.AmountWMaxAverage(playerDataLists.get(dataKey)), DataType.AMOUNT));
break;
case TIME:
analyzedData.put(dataKey, new DataPoint(AnalysisUtils.TimeAverage(playerDataLists.get(dataKey)), DataType.TIME));
break;
case BOOLEAN:
analyzedData.put(dataKey, new DataPoint(AnalysisUtils.BooleanPercent(playerDataLists.get(dataKey)), DataType.PERCENT));
break;
case PERCENT:
analyzedData.put(dataKey, new DataPoint(AnalysisUtils.AmountWLettersAverage(playerDataLists.get(dataKey))+"%", DataType.PERCENT));
break;
default:
break;
}
// Average
averagesAndPercents.put(dataKey, "" + (sum * 1.0 / playerDataLists.get(dataKey).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);
}
}
// Percent
averagesAndPercents.put(dataKey, "" + ((amount * 1.0 / playerDataLists.get(dataKey).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);
}
}
// Average
averagesAndPercents.put(dataKey, "" + (time * 1.0 / playerDataLists.get(dataKey).size()));
}
}
// Log errors
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(averagesAndPercents);
});
return DataFormatUtils.formatAnalyzed(analyzedData);
}
}

View File

@ -0,0 +1,62 @@
package com.djrapitops.plan.command.utils;
import java.util.ArrayList;
import java.util.List;
class AnalysisUtils {
static String AmountAverage(List<String> dataPoints) {
double sum = 0;
for (String dataPoint : dataPoints) {
try {
sum += Double.parseDouble(dataPoint);
} catch (Exception e) {
}
}
return "" + (sum * 1.0 / dataPoints.size());
}
static String AmountWLettersAverage(List<String> dataPoints) {
List<String> parsed = new ArrayList<>();
dataPoints.parallelStream().forEach((dataPoint) -> {
parsed.add(DataFormatUtils.removeLetters(dataPoint));
});
return AmountAverage(parsed);
}
static String AmountWMaxAverage(List<String> dataPoints) {
List<String> parsed = new ArrayList<>();
dataPoints.parallelStream().forEach((dataPoint) -> {
parsed.add(dataPoint.split(" ")[0]);
});
return AmountAverage(parsed);
}
static String TimeAverage(List<String> dataPoints) {
Long time = Long.parseLong("0");
for (String dataPoint : dataPoints) {
try {
time += Long.parseLong(dataPoint);
} catch (Exception e) {
}
}
return "" + (time * 1.0 / dataPoints.size());
}
static String BooleanPercent(List<String> dataPoints) {
int amount = 0;
for (String dataPoint : dataPoints) {
try {
if (Boolean.parseBoolean(dataPoint)) {
amount++;
}
} catch (Exception e) {
}
}
return "" + ((amount * 1.0 / dataPoints.size())*100)+"%";
}
}

View File

@ -1,10 +1,11 @@
package com.djrapitops.plan.command.utils;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.api.DataPoint;
import com.djrapitops.plan.api.DataType;
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;
@ -12,20 +13,20 @@ import static org.bukkit.plugin.java.JavaPlugin.getPlugin;
public class DataFormatUtils {
public static HashMap<String, String> removeExtraDataPoints(HashMap<String, String> data) throws NumberFormatException {
public static HashMap<String, DataPoint> removeExtraDataPoints(HashMap<String, DataPoint> data) throws NumberFormatException {
List<String> remove = new ArrayList<>();
Plan plugin = getPlugin(Plan.class);
data.keySet().parallelStream().forEach((key) -> {
try {
// Process OnTime empty data (returns -1 if empty)
if (key.subSequence(0, 3).equals("ONT")) {
if ((data.get(key)).equals("-1") || (data.get(key)).equals("-1.0")) {
if ((data.get(key)).data().equals("-1") || (data.get(key)).data().equals("-1.0")) {
remove.add(key);
}
}
// Process failed PlaceholderAPI requests (%string%)
if (key.subSequence(0, 3).equals("PHA")) {
if ((data.get(key)).contains("%")) {
if ((data.get(key)).data().contains("%")) {
remove.add(key);
}
}
@ -34,13 +35,13 @@ public class DataFormatUtils {
}
});
// Remove faulty data to prevent TOW-LAST LOGIN from being removed with empty data
for (String removedKey : remove) {
remove.parallelStream().forEach((removedKey) -> {
data.remove(removedKey);
}
});
remove.clear();
// Process Towny data (Empty returns Java Epoch date 1970 for REGISTERED)
if (data.get("TOW-REGISTERED") != null) {
if (data.get("TOW-REGISTERED").contains("1970")) {
if (data.get("TOW-REGISTERED").data().contains("1970")) {
remove.add("TOW-REGISTERED");
remove.add("TOW-ONLINE");
remove.add("TOW-LAST LOGIN");
@ -51,20 +52,21 @@ public class DataFormatUtils {
remove.add("TOW-PLOT OPTIONS");
}
}
// If both OnTime and Towny data found, OnTime priority.
if (data.get("ONT-LAST LOGIN") != null) {
remove.add("TOW-LAST LOGIN");
}
}
// If both OnTime and Towny data found, OnTime priority.
if (data.get("ONT-LAST LOGIN") != null) {
remove.add("TOW-LAST LOGIN");
remove.add("PLG-LAST LOGIN");
}
// Remove faulty Towny data
for (String removedKey : remove) {
data.remove(removedKey);
}
remove.parallelStream().forEach((removeKey) -> {
data.remove(removeKey);
});
// Remove faulty Essentials SINCE data, reload turns data to 0
String[] keysRemoveIfZero = {"ESS-ONLINE SINCE", "ESS-OFFLINE SINCE"};
for (String key : keysRemoveIfZero) {
if (data.get(key) != null) {
if (data.get(key).equals("0")) {
if (data.get(key).data().equals("0")) {
data.remove(key);
}
}
@ -75,72 +77,54 @@ public class DataFormatUtils {
data.remove("ONT-TOTAL VOTES");
}
}
// Remove Bukkit data points if plugin present
if (data.get("ONT-LAST LOGIN") != null || data.get("TOW-LAST LOGIN") != null) {
data.remove("BUK-LAST LOGIN");
}
if (data.get("TOW-REGISTERED") != null) {
data.remove("BUK-REGISTERED");
}
if (data.get("TOW-ONLINE") != null) {
data.remove("BUK-ONLINE");
}
if (data.get("ESS-BANNED") != null) {
data.remove("BUK-BANNED");
}
// Remove Bukkit uuid points if essentials present
if (data.get("ESS-UUID") != null) {
data.remove("BUK-UUID");
}
// Format TimeStamps
String[] keysTimestamp = {"ONT-LAST LOGIN", "BUK-LAST LOGIN", "BUK-REGISTERED"};
for (String key : keysTimestamp) {
if (data.get(key) != null) {
try {
String formatted = formatTimeStamp(data.get(key));
data.replace(key, formatted);
} catch (NumberFormatException e) {
plugin.logToFile("FORMAT-TimeStamp\nError Parsing Last Login.\n" + e + "\n" + data.get(key));
data.remove(key);
}
}
// Remove colliding Player Logger Data
if (data.get("TOW-LAST LOGIN") != null) {
data.remove("PLG-LAST LOGIN");
}
// Format Milliseconds to readable format
String[] keysTimeAmount = {"ONT-TOTAL PLAY", "ESS-ONLINE SINCE", "ESS-OFFLINE SINCE"};
for (String key : keysTimeAmount) {
if (data.get(key) != null) {
try {
String formatted;
if (key.equals("ONT-TOTAL PLAY")) {
formatted = formatTimeAmount(data.get(key));
} else {
formatted = formatTimeAmountSinceString(data.get(key), new Date());
}
if (formatted != null) {
data.replace(key, formatted);
}
} catch (NumberFormatException e) {
plugin.logToFile("FORMAT-Since\nError Parsing number.\n" + e + "\n" + data.get(key));
data.remove(key);
data.keySet().parallelStream()
.filter((key) -> (data.get(key).type() == DataType.DEPRECATED))
.forEach((key) -> {
remove.add(key);
});
remove.parallelStream().forEach((key) -> {
data.remove(key);
});
// Format TimeStamps and Time Amounts
for (String key : data.keySet()) {
if (data.get(key).type() == DataType.DATE) {
String formatted = formatTimeStamp(data.get(key).data());
data.get(key).setData(formatted);
} else if (data.get(key).type() == DataType.TIME) {
String formatted;
if (key.equals("ESS-ONLINE SINCE") || key.equals("ESS_OFFLINE SINCE")) {
formatted = formatTimeAmountSinceString(data.get(key).data(), new Date());
} else {
formatted = formatTimeAmount(data.get(key).data());
}
if (formatted != null) {
data.get(key).setData(formatted);
}
}
}
return data;
}
// Analysis data Formatting, will be updated after more analysis is added
public static HashMap<String, String> formatAnalyzed(HashMap<String, String> analyzedData) {
public static HashMap<String, DataPoint> formatAnalyzed(HashMap<String, DataPoint> analyzedData) {
return removeExtraDataPoints(analyzedData);
}
// Format Search Results
public static HashMap<String, String> removeExtraDataPointsSearch(HashMap<String, String> dataMap, String[] args) {
public static HashMap<String, DataPoint> removeExtraDataPointsSearch(HashMap<String, DataPoint> dataMap, String[] args) {
if (args.length <= 1) {
return removeExtraDataPoints(dataMap);
}
HashMap<String, String> returnMap = new HashMap<>();
HashMap<String, DataPoint> returnMap = new HashMap<>();
String errors = "FORMAT-SEARCH\n";
for (String key : dataMap.keySet()) {
for (String arg : args) {
@ -150,7 +134,7 @@ public class DataFormatUtils {
}
} catch (Exception e) {
if (!errors.contains(Arrays.toString(args))) {
errors += Arrays.toString(args)+"\n";
errors += Arrays.toString(args) + "\n";
}
errors += (e + "\n" + key + " " + arg + "\n");
}
@ -217,7 +201,7 @@ public class DataFormatUtils {
}
returnArray[i] = args[i];
if (args[i].equals("-p")) {
returnArray[0] = args[0]+"_(Playername)";
returnArray[0] = args[0] + "_(Playername)";
returnArray[i] = "---";
}
}
@ -296,27 +280,12 @@ public class DataFormatUtils {
}
// Sorts HashMap into Sorted List of Arrays
public static List<String[]> turnDataHashMapToSortedListOfArrays(HashMap<String, String> data) {
public static List<String[]> turnDataHashMapToSortedListOfArrays(HashMap<String, DataPoint> data) {
List<String[]> dataList = new ArrayList<>();
data.keySet().parallelStream().forEach((key) -> {
dataList.add(new String[]{key, data.get(key)});
dataList.add(new String[]{key, data.get(key).data()});
});
Collections.sort(dataList, (String[] strings, String[] otherStrings) -> strings[0].compareTo(otherStrings[0]));
return dataList;
}
public static String[] mergeArrays(String[]... arrays) {
int arraySize = 0;
for (String[] array : arrays) {
arraySize += array.length;
}
String[] result = new String[arraySize];
int j = 0;
for (String[] array : arrays) {
for (String string : array) {
result[j++] = string;
}
}
return result;
}
}

View File

@ -2,7 +2,7 @@ package com.djrapitops.plan.command.utils;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.UUIDFetcher;
import com.djrapitops.plan.command.hooks.AdvancedAchievementsHook;
import com.djrapitops.plan.api.DataPoint;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
@ -22,8 +22,8 @@ public class DataUtils {
// allData defined by -a argument in InspectCommand
// returns data given by each Hook
public static HashMap<String, String> getData(boolean allData, String playerName) {
HashMap<String, String> data = new HashMap<>();
public static HashMap<String, DataPoint> getData(boolean allData, String playerName) {
HashMap<String, DataPoint> data = new HashMap<>();
Plan plugin = getPlugin(Plan.class);
plugin.getHooks().keySet().parallelStream().forEach((hook) -> {
try {
@ -47,8 +47,8 @@ public class DataUtils {
}
// Returns data HashMaps for all pplayers in a HashMap.
public static HashMap<UUID, HashMap<String, String>> getTotalData(Set<OfflinePlayer> ofPlayers) {
HashMap<UUID, HashMap<String, String>> playerData = new HashMap<>();
public static HashMap<UUID, HashMap<String, DataPoint>> getTotalData(Set<OfflinePlayer> ofPlayers) {
HashMap<UUID, HashMap<String, DataPoint>> playerData = new HashMap<>();
List<OfflinePlayer> players = new ArrayList<>();
players.addAll(ofPlayers);
@ -81,7 +81,7 @@ public class DataUtils {
}
@Deprecated
public static HashMap<String, String> analyze(HashMap<UUID, HashMap<String, String>> playerData) {
public static HashMap<String, DataPoint> analyze(HashMap<UUID, HashMap<String, DataPoint>> playerData) {
return Analysis.analyze(playerData);
}

View File

@ -0,0 +1,61 @@
package com.djrapitops.plan.command.utils;
import com.djrapitops.plan.Plan;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import static org.bukkit.plugin.java.JavaPlugin.getPlugin;
public class MiscUtils {
// <h1>Plan - Player Analytics <span class="muted">
public static String checkVersion() {
Plan plugin = getPlugin(Plan.class);
String[] nVersion;
String[] cVersion;
String lineWithVersion;
try {
URL githubUrl = new URL("https://raw.githubusercontent.com/Rsl1122/Plan-PlayerAnalytics/master/src/plugin.yml");
lineWithVersion = "";
Scanner websiteScanner = new Scanner(githubUrl.openStream());
while (websiteScanner.hasNextLine()) {
String line = websiteScanner.nextLine();
if (line.toLowerCase().contains("version")) {
lineWithVersion = line;
break;
}
}
String versionString = lineWithVersion.split(": ")[1];
nVersion = versionString.split("\\.");
double newestVersionNumber = Double.parseDouble(nVersion[0] + "." + nVersion[1] + nVersion[2]);
cVersion = plugin.getDescription().getVersion().split("\\.");
double currentVersionNumber = Double.parseDouble(cVersion[0] + "." + cVersion[1] + cVersion[2]);
if (newestVersionNumber > currentVersionNumber) {
return "New Version (" + versionString + ") is availible at https://www.spigotmc.org/resources/plan-player-analytics.32536/";
} else {
return "You're running the latest version";
}
} catch (Exception e) {
plugin.logToFile("Failed to compare versions.\n"+e);
}
return "Failed to get newest version number.";
}
public static String[] mergeArrays(String[]... arrays) {
int arraySize = 0;
for (String[] array : arrays) {
arraySize += array.length;
}
String[] result = new String[arraySize];
int j = 0;
for (String[] array : arrays) {
for (String string : array) {
result[j++] = string;
}
}
return result;
}
}

View File

@ -9,4 +9,5 @@ visible:
vault: true
superbvote: true
placeholderapi: true
advancedachievements: true
advancedachievements: true
playerlogger: true

View File

@ -1,6 +1,6 @@
name: Plan
main: com.djrapitops.plan.Plan
version: 1.5.2
version: 1.6.0
commands:
plan:
@ -27,6 +27,7 @@ softdepend:
- SuperbVote
- PlaceholderAPI
- AdvancedAchievements
- PlayerLogger
permissions:
plan.?:
@ -49,4 +50,26 @@ permissions:
default: true
plan.search:
description: Allows search
default: true
default: true
plan.info:
description: Allows to view info
default: true
plan.basic:
children:
plan.?: true
plan.inspect: true
plan.info: true
plan.search: true
plan.advanced:
childer:
plan.basic: true
plan.analyze: true
plan.staff:
children:
plan.advanced: true
plan.inspect.other: true
plan.analyze.refresh: true
plan.reload: true
plan.*:
children:
plan.staff: true