More PluginData, Abstractions, Import Offline players, Optimizations

Permission Group table
PluginData objects now use API#getUserDataInspectCache instead of
getOfflinePlayer (It was slow) - Using FakeOfflinePlayer when
OfflinePlayer is required.
Abstracted CommandSender
New Player UserData Creation optimized
Added Importer for players who haven't joined after Plan was installed.
Added Timings to Status command
Importing now temporarily disables Analysis
BenchmarkUtil now not static
Players Table (On analysis page) now limited to last 3000 players due to
browser performance hit with higher numbers.
GMTimes now saved & Get more efficiently (Batches & Single query)
This commit is contained in:
Rsl1122 2017-06-29 22:18:53 +03:00
parent d03d0836a1
commit cfe876580f
62 changed files with 822 additions and 265 deletions

View File

@ -85,6 +85,7 @@ public enum Phrase {
ERROR_LOGGED("Caught " + REPLACE0 + ". It has been logged to the Errors.txt"),
ERROR_SESSIONDATA_INITIALIZATION("Player's session was initialized in a wrong way! (" + REPLACE0 + ")"),
ERROR_ANALYSIS_FETCH_FAIL("Failed to fetch data for Analysis, Exception occurred."),
ERROR_ANALYSIS_DISABLED_TEMPORARILY(ChatColor.YELLOW + "Analysis has been temporarily disabled due to expensive task, use /plan status for info."),
//
CMD_FOOTER(COLOR_TER.color() + "" + ARROWS_RIGHT),
MANAGE_ERROR_INCORRECT_PLUGIN(ChatColor.RED + "" + PREFIX + "Plugin not supported: "),
@ -149,7 +150,7 @@ public enum Phrase {
ARG_SEARCH("<part of playername>"),
ARG_PLAYER("<player>"),
ARG_RESTORE("<Filename.db> <dbTo> [-a]"),
ARG_IMPORT("<plugin> [-a]"),
ARG_IMPORT("<plugin>/list [import args]"),
ARG_MOVE("<fromDB> <toDB> [-a]"),
//
USE_BACKUP("Use /plan manage backup <DB>"),
@ -158,7 +159,7 @@ public enum Phrase {
USE_PLAN("Use /plan for help"),
USE_MOVE("Use /plan manage move <fromDB> <toDB> [-a]"),
USE_COMBINE("Use /plan manage combine <fromDB> <toDB> [-a]"),
USE_IMPORT("Use /plan manage import <plugin> [-a]"),
USE_IMPORT("Use /plan manage import " + ARG_IMPORT),
//
WARN_REWRITE("Data in REPLACE0-database will be rewritten!"),
WARN_OVERWRITE("Data in REPLACE0-database will be overwritten!"),

View File

@ -116,7 +116,7 @@ public class Plan extends RslPlugin<Plan> {
registerListeners();
new TPSCountTimer(this).runTaskTimer(1000, 20);
getCommand("plan").setExecutor(new PlanCommand(this));
registerCommand(new PlanCommand(this));
this.api = new API(this);
handler.handleReload();

View File

@ -4,12 +4,18 @@ import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.StatusCommand;
import com.djrapitops.javaplugin.command.SubCommand;
import com.djrapitops.javaplugin.command.TreeCommand;
import com.djrapitops.javaplugin.command.sender.ISender;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.command.commands.*;
import main.java.com.djrapitops.plan.command.commands.AnalyzeCommand;
import main.java.com.djrapitops.plan.command.commands.InfoCommand;
import main.java.com.djrapitops.plan.command.commands.InspectCommand;
import main.java.com.djrapitops.plan.command.commands.ManageCommand;
import main.java.com.djrapitops.plan.command.commands.QuickAnalyzeCommand;
import main.java.com.djrapitops.plan.command.commands.QuickInspectCommand;
import main.java.com.djrapitops.plan.command.commands.ReloadCommand;
import main.java.com.djrapitops.plan.command.commands.SearchCommand;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
/**
* CommandExecutor for the /plan command, and all subcommands.
@ -17,7 +23,7 @@ import org.bukkit.command.CommandSender;
* @author Rsl1122
* @since 1.0.0
*/
public class PlanCommand extends TreeCommand<Plan> implements CommandExecutor {
public class PlanCommand extends TreeCommand<Plan> {
/**
* CommandExecutor class Constructor.
@ -29,7 +35,7 @@ public class PlanCommand extends TreeCommand<Plan> implements CommandExecutor {
public PlanCommand(Plan plugin) {
super(plugin, new SubCommand("plan", CommandType.CONSOLE, "") {
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
return true;
}
}, "plan");

View File

@ -2,6 +2,7 @@ package main.java.com.djrapitops.plan.command.commands;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import com.djrapitops.javaplugin.command.sender.ISender;
import com.djrapitops.javaplugin.task.RslBukkitRunnable;
import com.djrapitops.javaplugin.task.RslTask;
import main.java.com.djrapitops.plan.Log;
@ -15,8 +16,6 @@ import main.java.com.djrapitops.plan.ui.TextUI;
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
/**
@ -42,12 +41,19 @@ public class AnalyzeCommand extends SubCommand {
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
if (!ConditionUtils.pluginHasViewCapability()) {
sender.sendMessage(Phrase.ERROR_WEBSERVER_OFF_ANALYSIS + "");
return true;
}
sender.sendMessage(Phrase.GRABBING_DATA_MESSAGE + "");
if (!analysisCache.isAnalysisEnabled()) {
sender.sendMessage(Phrase.ERROR_ANALYSIS_DISABLED_TEMPORARILY + "");
if (!analysisCache.isCached()) {
return true;
}
} else {
sender.sendMessage(Phrase.GRABBING_DATA_MESSAGE + "");
}
if (!analysisCache.isCached() || MiscUtils.getTime() - analysisCache.getData().getRefreshDate() > 60000) {
int bootAnID = plugin.getBootAnalysisTaskID();
if (bootAnID != -1) {
@ -61,7 +67,7 @@ public class AnalyzeCommand extends SubCommand {
@Override
public void run() {
timesrun++;
if (analysisCache.isCached() && !analysisCache.isAnalysisBeingRun()) {
if (analysisCache.isCached() && (!analysisCache.isAnalysisBeingRun() || !analysisCache.isAnalysisEnabled())) {
sendAnalysisMessage(sender);
this.cancel();
return;
@ -83,7 +89,7 @@ public class AnalyzeCommand extends SubCommand {
*
* @param sender Command sender.
*/
final public void sendAnalysisMessage(CommandSender sender) {
final public void sendAnalysisMessage(ISender sender) {
boolean textUI = Settings.USE_ALTERNATIVE_UI.isTrue();
sender.sendMessage(Phrase.CMD_ANALYZE_HEADER + "");
if (textUI) {

View File

@ -2,6 +2,7 @@ package main.java.com.djrapitops.plan.command.commands;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import com.djrapitops.javaplugin.command.sender.ISender;
import com.djrapitops.javaplugin.utilities.VersionUtils;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
@ -32,7 +33,7 @@ public class InfoCommand extends SubCommand {
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
ChatColor tColor = Phrase.COLOR_SEC.color();
String[] messages = {

View File

@ -2,6 +2,7 @@ package main.java.com.djrapitops.plan.command.commands;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import com.djrapitops.javaplugin.command.sender.ISender;
import com.djrapitops.javaplugin.task.RslBukkitRunnable;
import com.djrapitops.javaplugin.task.RslTask;
import main.java.com.djrapitops.plan.command.ConditionUtils;
@ -17,9 +18,6 @@ import main.java.com.djrapitops.plan.ui.TextUI;
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandException;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
/**
@ -46,7 +44,7 @@ public class InspectCommand extends SubCommand {
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
if (!ConditionUtils.pluginHasViewCapability()) {
sender.sendMessage(Phrase.ERROR_WEBSERVER_OFF_INSPECT + "");
return true;
@ -96,7 +94,7 @@ public class InspectCommand extends SubCommand {
return true;
}
private void sendInspectMsg(CommandSender sender, String playerName, UUID uuid) throws CommandException {
private void sendInspectMsg(ISender sender, String playerName, UUID uuid) {
sender.sendMessage(Phrase.CMD_INSPECT_HEADER + playerName);
if (Settings.USE_ALTERNATIVE_UI.isTrue()) {
sender.sendMessage(TextUI.getInspectMessages(uuid));

View File

@ -3,6 +3,7 @@ package main.java.com.djrapitops.plan.command.commands;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import com.djrapitops.javaplugin.command.TreeCommand;
import com.djrapitops.javaplugin.command.sender.ISender;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
@ -28,7 +29,7 @@ public class ManageCommand extends TreeCommand<Plan> {
public ManageCommand(Plan plugin) {
super(plugin, new SubCommand("manage,m", CommandType.CONSOLE, Permissions.MANAGE.getPermission(), Phrase.CMD_USG_MANAGE + "") {
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
return true;
}
}, "plan manage");

View File

@ -2,6 +2,7 @@ package main.java.com.djrapitops.plan.command.commands;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import com.djrapitops.javaplugin.command.sender.ISender;
import com.djrapitops.javaplugin.task.RslBukkitRunnable;
import com.djrapitops.javaplugin.task.RslTask;
import main.java.com.djrapitops.plan.Log;
@ -11,8 +12,6 @@ import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.cache.AnalysisCacheHandler;
import main.java.com.djrapitops.plan.ui.TextUI;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
/**
* This subcommand is used to run the analysis and to view some of the data in
@ -38,8 +37,15 @@ public class QuickAnalyzeCommand extends SubCommand {
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
sender.sendMessage(Phrase.GRABBING_DATA_MESSAGE + "");
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
if (!analysisCache.isAnalysisEnabled()) {
sender.sendMessage(Phrase.ERROR_ANALYSIS_DISABLED_TEMPORARILY + "");
if (!analysisCache.isCached()) {
return true;
}
} else {
sender.sendMessage(Phrase.GRABBING_DATA_MESSAGE + "");
}
if (!analysisCache.isCached()) {
int bootAnID = plugin.getBootAnalysisTaskID();
if (bootAnID != -1) {
@ -56,7 +62,7 @@ public class QuickAnalyzeCommand extends SubCommand {
@Override
public void run() {
timesrun++;
if (analysisCache.isCached() && !analysisCache.isAnalysisBeingRun()) {
if (analysisCache.isCached() && (!analysisCache.isAnalysisBeingRun() || !analysisCache.isAnalysisEnabled())) {
sender.sendMessage(Phrase.CMD_ANALYZE_HEADER + "");
sender.sendMessage(TextUI.getAnalysisMessages());
sender.sendMessage(Phrase.CMD_FOOTER + "");

View File

@ -2,6 +2,7 @@ package main.java.com.djrapitops.plan.command.commands;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import com.djrapitops.javaplugin.command.sender.ISender;
import com.djrapitops.javaplugin.task.RslBukkitRunnable;
import com.djrapitops.javaplugin.task.RslTask;
import java.util.UUID;
@ -42,7 +43,7 @@ public class QuickInspectCommand extends SubCommand {
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
String playerName = MiscUtils.getPlayerName(args, sender, Permissions.QUICK_INSPECT_OTHER);
final RslTask inspectTask = new RslBukkitRunnable<Plan>("QinspectTask") {
@Override

View File

@ -2,6 +2,7 @@ package main.java.com.djrapitops.plan.command.commands;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import com.djrapitops.javaplugin.command.sender.ISender;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
@ -30,7 +31,7 @@ public class ReloadCommand extends SubCommand {
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
plugin.onDisable();
plugin.reloadConfig();
plugin.onEnable();

View File

@ -2,6 +2,7 @@ package main.java.com.djrapitops.plan.command.commands;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import com.djrapitops.javaplugin.command.sender.ISender;
import com.djrapitops.javaplugin.task.RslBukkitRunnable;
import com.djrapitops.javaplugin.task.RslTask;
import com.djrapitops.javaplugin.utilities.FormattingUtils;
@ -43,7 +44,7 @@ public class SearchCommand extends SubCommand {
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
Condition c = new Condition(args.length != 1, Phrase.COMMAND_REQUIRES_ARGUMENTS_ONE.toString());
if (c.pass()) {
sender.sendMessage(c.getFailMsg());

View File

@ -2,6 +2,7 @@ package main.java.com.djrapitops.plan.command.commands.manage;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import com.djrapitops.javaplugin.command.sender.ISender;
import com.djrapitops.javaplugin.task.RslBukkitRunnable;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Permissions;
@ -34,7 +35,7 @@ public class ManageBackupCommand extends SubCommand {
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
try {
if (args.length < 1) {
sender.sendMessage(Phrase.COMMAND_REQUIRES_ARGUMENTS.parse(Phrase.USE_BACKUP + ""));

View File

@ -2,6 +2,7 @@ package main.java.com.djrapitops.plan.command.commands.manage;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import com.djrapitops.javaplugin.command.sender.ISender;
import com.djrapitops.javaplugin.task.RslBukkitRunnable;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Permissions;
@ -33,7 +34,7 @@ public class ManageCleanCommand extends SubCommand {
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
if (args.length == 0) {
sender.sendMessage(Phrase.COMMAND_REQUIRES_ARGUMENTS_ONE + "");
return true;

View File

@ -2,6 +2,7 @@ package main.java.com.djrapitops.plan.command.commands.manage;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import com.djrapitops.javaplugin.command.sender.ISender;
import com.djrapitops.javaplugin.task.RslBukkitRunnable;
import java.sql.SQLException;
import java.util.Arrays;
@ -35,7 +36,7 @@ public class ManageClearCommand extends SubCommand {
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
if (args.length == 0) {
sender.sendMessage(Phrase.COMMAND_REQUIRES_ARGUMENTS_ONE + "");
return true;

View File

@ -2,6 +2,7 @@ package main.java.com.djrapitops.plan.command.commands.manage;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import com.djrapitops.javaplugin.command.sender.ISender;
import java.sql.SQLException;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Permissions;
@ -34,7 +35,7 @@ public class ManageHotswapCommand extends SubCommand {
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
if (args.length == 0) {
sender.sendMessage(Phrase.COMMAND_REQUIRES_ARGUMENTS_ONE + "");
return true;

View File

@ -2,6 +2,7 @@ package main.java.com.djrapitops.plan.command.commands.manage;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import com.djrapitops.javaplugin.command.sender.ISender;
import com.djrapitops.javaplugin.task.RslBukkitRunnable;
import com.djrapitops.javaplugin.task.RslTask;
import java.util.Arrays;
@ -15,8 +16,6 @@ import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.handling.importing.ImportUtils;
import main.java.com.djrapitops.plan.data.handling.importing.Importer;
import static org.bukkit.Bukkit.getOfflinePlayers;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
/**
* This manage subcommand is used to import data from 3rd party plugins.
@ -41,7 +40,7 @@ public class ManageImportCommand extends SubCommand {
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
if (args.length < 1) {
sender.sendMessage(Phrase.COMMAND_REQUIRES_ARGUMENTS_ONE.toString() + " " + Phrase.USE_IMPORT);
@ -49,6 +48,10 @@ public class ManageImportCommand extends SubCommand {
}
String importFromPlugin = args[0].toLowerCase();
if (importFromPlugin.equals("list")) {
list(sender);
return true;
}
Map<String, Importer> importPlugins = ImportUtils.getImporters();
if (!importPlugins.keySet().contains(importFromPlugin)) {
sender.sendMessage(Phrase.MANAGE_ERROR_INCORRECT_PLUGIN + importFromPlugin);
@ -60,18 +63,17 @@ public class ManageImportCommand extends SubCommand {
return true;
}
if (!Arrays.asList(args).contains("-a")) {
sender.sendMessage(Phrase.COMMAND_ADD_CONFIRMATION_ARGUMENT.parse(Phrase.WARN_OVERWRITE_SOME.parse(plugin.getDB().getConfigName())));
return true;
String[] arguments = new String[args.length-1];
for (int i = 1; i < args.length; i++) {
arguments[i-1] = args[i];
}
final Importer importer = importPlugins.get(importFromPlugin);
RslTask asyncImportTask = new RslBukkitRunnable<Plan>("ImportTask") {
@Override
public void run() {
sender.sendMessage(Phrase.MANAGE_IMPORTING + "");
List<UUID> uuids = Arrays.stream(getOfflinePlayers()).map(p -> p.getUniqueId()).collect(Collectors.toList());
if (importer.importData(uuids)) {
if (importer.importData(uuids, arguments)) {
sender.sendMessage(Phrase.MANAGE_SUCCESS + "");
} else {
sender.sendMessage(Phrase.MANAGE_PROCESS_FAIL + "");
@ -81,4 +83,13 @@ public class ManageImportCommand extends SubCommand {
}.runTaskAsynchronously();
return true;
}
private void list(ISender sender) {
sender.sendMessage(Phrase.CMD_FOOTER.parse());
Map<String, Importer> importers = ImportUtils.getImporters();
for (String key : importers.keySet()) {
sender.sendMessage(Phrase.CMD_BALL+" "+key+": "+importers.get(key).getInfo());
}
sender.sendMessage(Phrase.CMD_FOOTER.parse());
}
}

View File

@ -2,6 +2,7 @@ package main.java.com.djrapitops.plan.command.commands.manage;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import com.djrapitops.javaplugin.command.sender.ISender;
import com.djrapitops.javaplugin.task.RslBukkitRunnable;
import java.util.Arrays;
import java.util.Collection;
@ -39,7 +40,7 @@ public class ManageMoveCommand extends SubCommand {
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
if (args.length < 2) {
sender.sendMessage(Phrase.COMMAND_REQUIRES_ARGUMENTS.parse(Phrase.USE_MOVE + ""));
return true;

View File

@ -2,6 +2,7 @@ package main.java.com.djrapitops.plan.command.commands.manage;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import com.djrapitops.javaplugin.command.sender.ISender;
import com.djrapitops.javaplugin.task.RslBukkitRunnable;
import java.sql.SQLException;
import java.util.Arrays;
@ -37,7 +38,7 @@ public class ManageRemoveCommand extends SubCommand {
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
if (args.length == 0) {
sender.sendMessage(Phrase.COMMAND_REQUIRES_ARGUMENTS_ONE.toString());
return true;

View File

@ -2,6 +2,7 @@ package main.java.com.djrapitops.plan.command.commands.manage;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import com.djrapitops.javaplugin.command.sender.ISender;
import com.djrapitops.javaplugin.task.RslBukkitRunnable;
import com.djrapitops.javaplugin.task.RslTask;
import java.io.File;
@ -40,7 +41,7 @@ public class ManageRestoreCommand extends SubCommand {
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
try {
if (args.length < 2) {
sender.sendMessage(Phrase.COMMAND_REQUIRES_ARGUMENTS.parse(Phrase.USE_RESTORE + ""));

View File

@ -2,6 +2,7 @@ package main.java.com.djrapitops.plan.command.commands.manage;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import com.djrapitops.javaplugin.command.sender.ISender;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
@ -29,7 +30,7 @@ public class ManageStatusCommand extends SubCommand {
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
String[] messages = new String[]{
Phrase.CMD_MANAGE_STATUS_HEADER + "",
Phrase.CMD_MANAGE_STATUS_ACTIVE_DB.parse(plugin.getDB().getConfigName()),

View File

@ -148,7 +148,7 @@ public abstract class PluginData {
* @see AnalysisType
*/
public final String parseContainer(String modifier, String contents) {
return "<div class=\"plugin-data\">" + (icon.isEmpty() ? "" : Html.FONT_AWESOME_ICON.parse(icon)) + " " + modifier + prefix + contents + suffix + "</div>";
return "<div class=\"plugin-data\">" + (icon.isEmpty() ? "<br>" : Html.FONT_AWESOME_ICON.parse(icon)) + " " + modifier + prefix + contents + suffix + "</div>";
}
/**

View File

@ -16,6 +16,7 @@ public class AnalysisCacheHandler {
private final Plan plugin;
private AnalysisData cache;
private final Analysis analysis;
private boolean analysisEnabled;
/**
* Class Constructor.
@ -27,6 +28,7 @@ public class AnalysisCacheHandler {
public AnalysisCacheHandler(Plan plugin) {
this.plugin = plugin;
analysis = new Analysis(plugin);
analysisEnabled = true;
}
/**
@ -70,4 +72,18 @@ public class AnalysisCacheHandler {
public boolean isAnalysisBeingRun() {
return analysis.isAnalysisBeingRun();
}
public boolean isAnalysisEnabled() {
return analysisEnabled;
}
public void disableAnalysisTemporarily() {
analysisEnabled = false;
analysis.setTaskId(-2);
}
public void enableAnalysis() {
analysis.setTaskId(-1);
analysisEnabled = true;
}
}

View File

@ -67,7 +67,7 @@ public class DataCacheHandler extends LocationCache {
private DataCacheGetQueue getTask;
// Variables
private boolean periodicTaskIsSaving = false;
/**
* Class Constructor.
@ -141,10 +141,14 @@ public class DataCacheHandler extends LocationCache {
}
RslTask asyncPeriodicCacheSaveTask = new RslBukkitRunnable<Plan>("PeriodicCacheSaveTask") {
private int timesSaved = 0;
@Override
public void run() {
if (periodicTaskIsSaving) {
return;
}
try {
periodicTaskIsSaving = true;
DataCacheHandler handler = Plan.getInstance().getHandler();
handler.saveHandlerDataToCache();
handler.saveCachedUserData();
@ -156,6 +160,8 @@ public class DataCacheHandler extends LocationCache {
timesSaved++;
} catch (Exception e) {
Log.toLog(this.getClass().getName() + "(" + this.getTaskName() + ")", e);
} finally {
periodicTaskIsSaving = false;
}
}
}.runTaskTimerAsynchronously(60 * 20 * minutes, 60 * 20 * minutes);
@ -243,6 +249,9 @@ public class DataCacheHandler extends LocationCache {
* @param i Object that extends HandlingInfo.
*/
public void addToPool(HandlingInfo i) {
if (i == null) {
return;
}
Log.debug(i.getUuid() + ": Adding to pool, type:" + i.getType().name());
processTask.addToPool(i);
}
@ -369,7 +378,7 @@ public class DataCacheHandler extends LocationCache {
if (unsavedTPSHistory.isEmpty()) {
return new ArrayList<>();
}
List<List<TPS>> copy = new ArrayList<>(unsavedTPSHistory);;
List<List<TPS>> copy = new ArrayList<>(unsavedTPSHistory);;
for (List<TPS> history : copy) {
final long lastdate = history.get(history.size() - 1).getDate();
final double averageTPS = MathUtils.averageDouble(history.stream().map(t -> t.getTps()));

View File

@ -1,6 +1,5 @@
package main.java.com.djrapitops.plan.data.handling.importing;
import com.djrapitops.pluginbridge.plan.Bridge;
import com.djrapitops.pluginbridge.plan.importing.OnTimeImporter;
import java.util.HashMap;
import java.util.Map;
@ -22,6 +21,9 @@ public class ImportUtils {
* @return true/false
*/
public static boolean isPluginEnabled(String pluginName) {
if ("offline".equals(pluginName)) {
return true;
}
return getPluginManager().isPluginEnabled(pluginName);
}
@ -34,6 +36,7 @@ public class ImportUtils {
Map<String, Importer> importers = new HashMap<>();
try {
importers.put("ontime", new OnTimeImporter());
importers.put("offline", new OfflinePlayerImporter());
} catch (Throwable e) {
Log.toLog("ImportUtils.getImporters", e);
Log.error("Plan Plugin Bridge not included in the plugin jar.");

View File

@ -2,17 +2,25 @@ package main.java.com.djrapitops.plan.data.handling.importing;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.function.Function;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.cache.DataCacheHandler;
import main.java.com.djrapitops.plan.data.handling.info.HandlingInfo;
import main.java.com.djrapitops.plan.data.handling.info.InfoType;
import main.java.com.djrapitops.plan.database.Database;
import main.java.com.djrapitops.plan.utilities.Benchmark;
import main.java.com.djrapitops.plan.utilities.NewPlayerCreator;
import static org.bukkit.Bukkit.getOfflinePlayers;
import org.bukkit.OfflinePlayer;
import static org.bukkit.Bukkit.getOfflinePlayer;
/**
* Abstract class used for importing data from other plugins.
@ -22,11 +30,25 @@ import static org.bukkit.Bukkit.getOfflinePlayer;
*/
public abstract class Importer {
private String info;
/**
* Constructor.
*/
public Importer() {
info = "No info specified";
}
/**
* Import data from users.
*
* @param uuids UUIDs of players to import
* @return Success of import
* @deprecated Use importData(Collection, String...) instead (new system)
*/
@Deprecated
public boolean importData(Collection<UUID> uuids) {
return importData(uuids, new String[0]);
}
/**
@ -35,37 +57,104 @@ public abstract class Importer {
* Creates UserData for players that have not been saved to the database.
*
* @param uuids UUIDs to be imported
* @param args arguments for the import
* @return success
*/
public boolean importData(Collection<UUID> uuids) {
public boolean importData(Collection<UUID> uuids, String... args) {
Plan plan = Plan.getInstance();
DataCacheHandler handler = plan.getHandler();
Database db = plan.getDB();
Set<UUID> saved;
plan.getAnalysisCache().disableAnalysisTemporarily();
try {
saved = db.getSavedUUIDs();
} catch (SQLException ex) {
Log.toLog(this.getClass().getName(), ex);
return false;
}
List<UUID> unSaved = new ArrayList<>(uuids);
unSaved.removeAll(saved);
for (UUID uuid : unSaved) {
OfflinePlayer player = getOfflinePlayer(uuid);
handler.newPlayer(player);
}
for (UUID uuid : uuids) {
handler.addToPool(importData(uuid));
String processName = "Import, " + getClass().getSimpleName();
plan.processStatus().startExecution(processName);
DataCacheHandler handler = plan.getHandler();
Database db = plan.getDB();
Set<UUID> saved;
try {
saved = db.getSavedUUIDs();
} catch (SQLException ex) {
Log.toLog(this.getClass().getName(), ex);
return false;
}
List<UUID> unSaved = new ArrayList<>(uuids);
unSaved.removeAll(saved);
String createUserObjects = "Creating new UserData objects for: " + unSaved.size();
plan.processStatus().setStatus(processName, createUserObjects);
Map<UUID, OfflinePlayer> offlinePlayers = Arrays.stream(getOfflinePlayers()).collect(Collectors.toMap(OfflinePlayer::getUniqueId, Function.identity()));
Benchmark.start(createUserObjects);
List<OfflinePlayer> offlineP = unSaved.stream().map(uuid
-> offlinePlayers.get(uuid)).collect(Collectors.toList());
List<UserData> newUsers = new ArrayList<>();
for (OfflinePlayer p : offlineP) {
UserData newPlayer = NewPlayerCreator.createNewPlayer(p);
newPlayer.setLastPlayed(newPlayer.getRegistered());
newUsers.add(newPlayer);
plan.processStatus().setStatus(processName, "Creating new UserData objects: " + newUsers.size() + "/" + unSaved.size());
}
Benchmark.stop(createUserObjects);
plan.processStatus().setStatus(processName, "Save new UserData objects (" + unSaved.size() + ")");
try {
plan.getDB().saveMultipleUserData(newUsers);
} catch (SQLException ex) {
Log.toLog(this.getClass().getName(), ex);
}
for (UUID uuid : uuids) {
handler.addToPool(importData(uuid, args));
}
plan.processStatus().finishExecution(processName);
} finally {
plan.getAnalysisCache().enableAnalysis();
}
return true;
}
/**
* Returns the info for import command.
*
* @return Information about the import options
* @since 3.5.0
*/
public final String getInfo() {
return info;
}
/**
* Set the info for import command.
*
* @param info Information about the import options
* @since 3.5.0
*/
public final void setInfo(String info) {
this.info = info;
}
/**
* Import data of a single player.
*
* @param uuid UUID of the player
* @return HandlingInfo used to modify saved userdata.
* @deprecated Deprecated (new system), use importData(UUID, String...)
* instead
*/
@Deprecated
public HandlingInfo importData(UUID uuid) {
return importData(uuid, new String[0]);
}
/**
* Method used for getting the HandlingInfo object for the import data.
*
* @param uuid UUID of the player
* @param args Arguments for import
* @return HandlingInfo object that modifies the UserData so that the data
* is imported.
* @since 3.5.0
*/
public abstract HandlingInfo importData(UUID uuid);
public HandlingInfo importData(UUID uuid, String... args) {
return new HandlingInfo(uuid, InfoType.OTHER, 0) {
@Override
public boolean process(UserData uData) {
return true;
}
};
}
}

View File

@ -0,0 +1,22 @@
package main.java.com.djrapitops.plan.data.handling.importing;
import java.util.UUID;
import main.java.com.djrapitops.plan.data.handling.info.HandlingInfo;
/**
* Imports all players who have not joined since Plan was installed.
*
* @author Rsl1122
* @since 3.5.0
*/
public class OfflinePlayerImporter extends Importer {
public OfflinePlayerImporter() {
super.setInfo("Import all players who have not joined since Plan was installed.");
}
@Override
public HandlingInfo importData(UUID uuid, String... args) {
return null;
}
}

View File

@ -325,7 +325,7 @@ public abstract class SQLDB extends Database {
List<InetAddress> ips = ipsTable.getIPAddresses(userId);
data.addIpAddresses(ips);
HashMap<GameMode, Long> times = gmTimesTable.getGMTimes(userId);
Map<GameMode, Long> times = gmTimesTable.getGMTimes(userId);
data.setGmTimes(times);
List<SessionData> sessions = sessionsTable.getSessionData(userId);
data.addSessions(sessions);
@ -370,6 +370,7 @@ public abstract class SQLDB extends Database {
Map<Integer, Set<InetAddress>> ipList = ipsTable.getIPList(ids);
Map<Integer, List<KillData>> playerKills = killsTable.getPlayerKills(ids, idUuidRel);
Map<Integer, List<SessionData>> sessionData = sessionsTable.getSessionData(ids);
Map<Integer, Map<GameMode, Long>> gmTimes = gmTimesTable.getGMTimes(ids);
Log.debug("Sizes: UUID:" + uuids.size() + " DATA:" + data.size() + " ID:" + userIds.size() + " N:" + nicknames.size() + " I:" + ipList.size() + " K:" + playerKills.size() + " S:" + sessionData.size());
for (UserData uData : data) {
UUID uuid = uData.getUuid();
@ -378,7 +379,7 @@ public abstract class SQLDB extends Database {
uData.addNicknames(nicknames.get(id));
uData.addSessions(sessionData.get(id));
uData.setPlayerKills(playerKills.get(id));
uData.setGmTimes(gmTimesTable.getGMTimes(id));
uData.setGmTimes(gmTimes.get(id));
}
Benchmark.stop("DB get UserData for " + uuidsCol.size());
setAvailable();
@ -435,11 +436,7 @@ public abstract class SQLDB extends Database {
ipsTable.saveIPList(ips);
killsTable.savePlayerKills(kills, uuids);
sessionsTable.saveSessionData(sessions);
Benchmark.start("Save GMTimes");
for (Integer id : gmTimes.keySet()) {
gmTimesTable.saveGMTimes(id, gmTimes.get(id));
}
Benchmark.stop("Save GMTimes");
gmTimesTable.saveGMTimes(gmTimes);
userDatas.values().stream()
.filter(u -> u != null)
.filter(uData -> uData.isAccessed())

View File

@ -3,10 +3,14 @@ package main.java.com.djrapitops.plan.database.tables;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.database.databases.SQLDB;
import main.java.com.djrapitops.plan.utilities.Benchmark;
import org.bukkit.GameMode;
/**
@ -85,7 +89,7 @@ public class GMTimesTable extends Table {
* @return
* @throws SQLException
*/
public HashMap<GameMode, Long> getGMTimes(int userId) throws SQLException {
public Map<GameMode, Long> getGMTimes(int userId) throws SQLException {
PreparedStatement statement = null;
ResultSet set = null;
try {
@ -108,6 +112,35 @@ public class GMTimesTable extends Table {
close(statement);
}
}
public Map<Integer, Map<GameMode, Long>> getGMTimes(Collection<Integer> userIds) throws SQLException {
PreparedStatement statement = null;
ResultSet set = null;
Map<Integer, Map<GameMode, Long>> times = new HashMap<>();
try {
statement = prepareStatement("SELECT * FROM " + tableName);
set = statement.executeQuery();
Map<GameMode, Long> gmTimes = new HashMap<>();
while (set.next()) {
int id = set.getInt(columnUserID);
if (!userIds.contains(id)) {
continue;
}
gmTimes.put(GameMode.SURVIVAL, set.getLong(columnSurvivalTime));
gmTimes.put(GameMode.CREATIVE, set.getLong(columnCreativeTime));
gmTimes.put(GameMode.ADVENTURE, set.getLong(columnAdventureTime));
try {
gmTimes.put(GameMode.SPECTATOR, set.getLong(columnSpectatorTime));
} catch (NoSuchFieldError e) {
}
times.put(id, gmTimes);
}
return times;
} finally {
close(set);
close(statement);
}
}
/**
*
@ -119,7 +152,6 @@ public class GMTimesTable extends Table {
if (gamemodeTimes == null || gamemodeTimes.isEmpty()) {
return;
}
PreparedStatement statement = null;
GameMode[] gms = new GameMode[]{GameMode.SURVIVAL, GameMode.CREATIVE, GameMode.ADVENTURE, GameMode.SPECTATOR};
int update = 0;
@ -151,7 +183,114 @@ public class GMTimesTable extends Table {
if (update == 0) {
addNewGMTimesRow(userId, gamemodeTimes);
}
}
private Set<Integer> getSavedIDs() throws SQLException {
PreparedStatement statement = null;
ResultSet set = null;
try {
statement = prepareStatement("SELECT " + columnUserID + " FROM " + tableName);
set = statement.executeQuery();
Set<Integer> ids = new HashSet<>();
while (set.next()) {
ids.add(set.getInt(columnUserID));
}
return ids;
} finally {
close(set);
close(statement);
}
}
public void saveGMTimes(Map<Integer, Map<GameMode, Long>> gamemodeTimes) throws SQLException {
if (gamemodeTimes == null || gamemodeTimes.isEmpty()) {
return;
}
Benchmark.start("Save GMTimes");
PreparedStatement statement = null;
GameMode[] gms = new GameMode[]{GameMode.SURVIVAL, GameMode.CREATIVE, GameMode.ADVENTURE, GameMode.SPECTATOR};
Set<Integer> savedIDs = getSavedIDs();
try {
statement = prepareStatement(
"UPDATE " + tableName + " SET "
+ columnSurvivalTime + "=?, "
+ columnCreativeTime + "=?, "
+ columnAdventureTime + "=?, "
+ columnSpectatorTime + "=? "
+ " WHERE (" + columnUserID + "=?)");
boolean commitRequired = false;
for (Integer id : gamemodeTimes.keySet()) {
if (!savedIDs.contains(id)) {
continue;
}
statement.setInt(5, id);
for (int i = 0; i < gms.length; i++) {
try {
Map<GameMode, Long> times = gamemodeTimes.get(id);
Long time = times.get(gms[i]);
if (time != null) {
statement.setLong(i + 1, time);
} else {
statement.setLong(i + 1, 0);
}
} catch (NoSuchFieldError e) {
statement.setLong(i + 1, 0);
}
}
statement.addBatch();
commitRequired = true;
}
if (commitRequired) {
statement.executeBatch();
}
gamemodeTimes.keySet().removeAll(savedIDs);
} finally {
close(statement);
}
addNewGMTimesRows(gamemodeTimes);
Benchmark.stop("Save GMTimes");
}
private void addNewGMTimesRows(Map<Integer, Map<GameMode, Long>> gamemodeTimes) throws SQLException {
if (gamemodeTimes == null || gamemodeTimes.isEmpty()) {
return;
}
PreparedStatement statement = null;
GameMode[] gms = new GameMode[]{GameMode.SURVIVAL, GameMode.CREATIVE, GameMode.ADVENTURE, GameMode.SPECTATOR};
try {
statement = prepareStatement(
"INSERT INTO " + tableName + " ("
+ columnUserID + ", "
+ columnSurvivalTime + ", "
+ columnCreativeTime + ", "
+ columnAdventureTime + ", "
+ columnSpectatorTime
+ ") VALUES (?, ?, ?, ?, ?)");
boolean commitRequired = false;
for (Integer id : gamemodeTimes.keySet()) {
statement.setInt(1, id);
for (int i = 0; i < gms.length; i++) {
try {
Map<GameMode, Long> times = gamemodeTimes.get(id);
Long time = times.get(gms[i]);
if (time != null) {
statement.setLong(i + 2, time);
} else {
statement.setLong(i + 2, 0);
}
} catch (NoSuchFieldError e) {
statement.setLong(i + 2, 0);
}
}
statement.addBatch();
commitRequired = true;
}
if (commitRequired) {
statement.executeBatch();
}
} finally {
close(statement);
}
}
private void addNewGMTimesRow(int userId, Map<GameMode, Long> gamemodeTimes) throws SQLException {

View File

@ -224,6 +224,9 @@ public class SessionsTable extends Table {
}
private void saveSessionBatch(List<Container<SessionData>> batch) throws SQLException {
if (batch.isEmpty()) {
return;
}
PreparedStatement statement = null;
try {
statement = prepareStatement("INSERT INTO " + tableName + " ("

View File

@ -17,6 +17,7 @@ import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.api.Gender;
import main.java.com.djrapitops.plan.data.DemographicsData;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.database.DBUtils;
import main.java.com.djrapitops.plan.database.databases.SQLDB;
import main.java.com.djrapitops.plan.utilities.Benchmark;
import main.java.com.djrapitops.plan.utilities.uuid.UUIDUtility;
@ -643,7 +644,12 @@ public class UsersTable extends Table {
try {
List<UserData> newUserdata = updateExistingUserData(data);
Benchmark.start("Insert new UserInfo multiple " + newUserdata.size());
insertNewUserData(newUserdata);
List<List<UserData>> batches = DBUtils.splitIntoBatches(newUserdata);
for (List<UserData> batch : batches) {
Benchmark.start("Insert new UserInfo Batch " + batch.size());
insertNewUserData(batch);
Benchmark.stop("Insert new UserInfo Batch " + batch.size());
}
Benchmark.stop("Insert new UserInfo multiple " + newUserdata.size());
} finally {
Benchmark.stop("Save UserInfo multiple " + data.size());
@ -850,8 +856,7 @@ public class UsersTable extends Table {
/**
*
* @return
* @throws SQLException
* @return @throws SQLException
*/
public Map<Integer, Integer> getLoginTimes() throws SQLException {
Benchmark.start("Get Logintimes");

View File

@ -16,7 +16,7 @@ import main.java.com.djrapitops.plan.utilities.comparators.TPSComparator;
*/
public class TPSGraphCreator {
public static String[] generateDataArray(List<TPS> tpsData, long scale) {
Benchmark.start("TPSGraph generate array: "+tpsData.size());
Benchmark.start("TPSGraph generate array");
long now = MiscUtils.getTime();
List<TPS> filtered = filterTPS(tpsData, now-scale);
Log.debug("TPSGraph, filtered: "+filtered.size());
@ -24,7 +24,7 @@ public class TPSGraphCreator {
List<Long> dates = filtered.stream().map(t -> t.getDate()).collect(Collectors.toList());
List<Double> tps = filtered.stream().map(t -> t.getTps()).collect(Collectors.toList());
List<Integer> players = filtered.stream().map(t -> t.getPlayers()).collect(Collectors.toList());
Benchmark.stop("TPSGraph generate array: "+tpsData.size());
Benchmark.stop("TPSGraph generate array");
return new String[]{dates.toString(), tps.toString(), players.toString()};
}

View File

@ -1,6 +1,7 @@
package main.java.com.djrapitops.plan.ui.tables;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.ui.Html;
@ -9,6 +10,7 @@ import main.java.com.djrapitops.plan.utilities.Benchmark;
import main.java.com.djrapitops.plan.utilities.FormatUtils;
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
import main.java.com.djrapitops.plan.utilities.comparators.UserDataLastPlayedComparator;
/**
*
@ -21,31 +23,54 @@ public class SortablePlayersTableCreator {
* @param data
* @return
*/
public static String createSortablePlayersTable(Collection<UserData> data) {
public static String createSortablePlayersTable(List<UserData> data) {
Benchmark.start("Create Players table " + data.size());
String html = "";
StringBuilder html = new StringBuilder();
long now = MiscUtils.getTime();
boolean showImages = Settings.PLAYERLIST_SHOW_IMAGES.isTrue();
for (UserData uData : data) {
try {
String banOunknownOactiveOinactive = uData.isBanned() ? Html.GRAPH_BANNED.parse()
: uData.getLoginTimes() == 1 ? Html.GRAPH_UNKNOWN.parse()
: AnalysisUtils.isActive(now, uData.getLastPlayed(), uData.getPlayTime(), uData.getLoginTimes()) ? Html.GRAPH_ACTIVE.parse()
: Html.GRAPH_INACTIVE.parse();
String img = showImages ? Html.MINOTAR_SMALL_IMG.parse(uData.getName()) : "";
html += Html.TABLELINE_PLAYERS.parse(
img + Html.LINK.parse(HtmlUtils.getInspectUrl(uData.getName()), uData.getName()),
banOunknownOactiveOinactive,
uData.getPlayTime() + "", FormatUtils.formatTimeAmount(uData.getPlayTime()),
uData.getLoginTimes() + "",
uData.getRegistered() + "", FormatUtils.formatTimeStampYear(uData.getRegistered()),
uData.getLastPlayed() + "", FormatUtils.formatTimeStamp(uData.getLastPlayed()),
uData.getDemData().getGeoLocation()
);
} catch (NullPointerException e) {
boolean showImages = Settings.PLAYERLIST_SHOW_IMAGES.isTrue() && data.size() < 3000;
if (data.size() < 3000) {
for (UserData uData : data) {
try {
String banOunknownOactiveOinactive = uData.isBanned() ? Html.GRAPH_BANNED.parse()
: uData.getLoginTimes() == 1 ? Html.GRAPH_UNKNOWN.parse()
: AnalysisUtils.isActive(now, uData.getLastPlayed(), uData.getPlayTime(), uData.getLoginTimes()) ? Html.GRAPH_ACTIVE.parse()
: Html.GRAPH_INACTIVE.parse();
String img = showImages ? Html.MINOTAR_SMALL_IMG.parse(uData.getName()) : "";
html.append(Html.TABLELINE_PLAYERS.parse(
img + Html.LINK.parse(HtmlUtils.getInspectUrl(uData.getName()), uData.getName()),
banOunknownOactiveOinactive,
uData.getPlayTime() + "", FormatUtils.formatTimeAmount(uData.getPlayTime()),
uData.getLoginTimes() + "",
uData.getRegistered() + "", FormatUtils.formatTimeStampYear(uData.getRegistered()),
uData.getLastPlayed() + "", FormatUtils.formatTimeStamp(uData.getLastPlayed()),
uData.getDemData().getGeoLocation()
));
} catch (NullPointerException e) {
}
}
} else {
Collections.sort(data, new UserDataLastPlayedComparator());
int i = 0;
for (UserData uData : data) {
if (i >= 3000) {
break;
}
try {
html.append(Html.TABLELINE_PLAYERS.parse(
Html.LINK.parse(HtmlUtils.getInspectUrl(uData.getName()), uData.getName()),
"",
"",
"",
uData.getRegistered() + "", FormatUtils.formatTimeStampYear(uData.getRegistered()),
uData.getLastPlayed() + "", FormatUtils.formatTimeStamp(uData.getLastPlayed()),
uData.getDemData().getGeoLocation()
));
} catch (NullPointerException e) {
}
i++;
}
}
Benchmark.stop("Create Players table " + data.size());
return html;
return html.toString();
}
}

View File

@ -1,7 +1,7 @@
package main.java.com.djrapitops.plan.utilities;
import com.djrapitops.javaplugin.utilities.BenchmarkUtil;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan;
/**
*
@ -14,7 +14,7 @@ public class Benchmark {
* @param source
*/
public static void start(String source) {
BenchmarkUtil.start(source);
Plan.getInstance().benchmark().start(source);
Log.debug(source);
}
@ -24,7 +24,7 @@ public class Benchmark {
* @return
*/
public static long stop(String source) {
long ms = BenchmarkUtil.stop(source);
long ms = Plan.getInstance().benchmark().stop(source);
if (ms != -1) {
Log.debug(source + " took " + ms+" ms");
}

View File

@ -75,6 +75,7 @@ public class ManageUtils {
List<UserData> allUserData = copyFromDB.getUserDataForUUIDS(copyFromDB.getSavedUUIDs());
clearAndCopyToDB.saveMultipleUserData(allUserData);
clearAndCopyToDB.getCommandUseTable().saveCommandUse(copyFromDB.getCommandUseTable().getCommandUse());
clearAndCopyToDB.getTpsTable().saveTPSData(copyFromDB.getTpsTable().getTPSData());
} catch (SQLException | NullPointerException e) {
Log.toLog("ManageUtils.move", e);
return false;

View File

@ -1,17 +1,14 @@
package main.java.com.djrapitops.plan.utilities;
import java.io.IOException;
import java.net.URL;
import com.djrapitops.javaplugin.command.CommandUtils;
import com.djrapitops.javaplugin.command.sender.ISender;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
@ -40,7 +37,7 @@ public class MiscUtils {
* @param sender
* @return
*/
public static String getPlayerName(String[] args, CommandSender sender) {
public static String getPlayerName(String[] args, ISender sender) {
return getPlayerName(args, sender, Permissions.INSPECT_OTHER);
}
@ -52,13 +49,13 @@ public class MiscUtils {
* @param perm
* @return The name of the player (first argument or sender)
*/
public static String getPlayerName(String[] args, CommandSender sender, Permissions perm) {
public static String getPlayerName(String[] args, ISender sender, Permissions perm) {
String playerName = "";
boolean isConsole = !(sender instanceof Player);
boolean isConsole = CommandUtils.isConsole(sender);
if (isConsole) {
playerName = args[0];
} else if (args.length > 0) {
if (perm.userHasThisPermission(sender)) {
if (sender.hasPermission(perm.getPermission())) {
playerName = args[0];
} else if (args[0].toLowerCase().equals(sender.getName().toLowerCase())) {
playerName = sender.getName();

View File

@ -41,18 +41,19 @@ public class NewPlayerCreator {
* @return a new UserData object
*/
public static UserData createNewPlayer(OfflinePlayer player, GameMode gm) {
UserData data = new UserData(player, new DemographicsData());
long registered = player.getFirstPlayed();
UserData data = new UserData(player.getUniqueId(), registered, null, player.isOp(), GameMode.SURVIVAL, new DemographicsData(), player.getName(), player.isOnline());
data.setLastGamemode(gm);
data.setLastPlayed(MiscUtils.getTime());
long zero = Long.parseLong("0");
data.setPlayTime(zero);
data.setPlayTime(0L);
data.setTimesKicked(0);
data.setLoginTimes(0);
data.setLastGmSwapTime(zero);
data.setLastGmSwapTime(0L);
data.setDeaths(0);
data.setMobKills(0);
Log.debug(player.getUniqueId()+": Created a new UserData object.");
data.setBanned(false);
Log.debug(player.getUniqueId() + ": Created a new UserData object.");
return data;
}
}

View File

@ -451,4 +451,13 @@ public class Analysis {
public boolean isAnalysisBeingRun() {
return taskId != -1;
}
public void setTaskId(int id) {
if (id == -2) {
plugin.processStatus().setStatus("Analysis", "Temporarily Disabled");
} else if (id == -1) {
plugin.processStatus().setStatus("Analysis", "Enabled");
}
taskId = id;
}
}

View File

@ -0,0 +1,20 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package main.java.com.djrapitops.plan.utilities.comparators;
import java.util.Comparator;
import main.java.com.djrapitops.plan.data.UserData;
/**
*
* @author Risto
*/
public class UserDataLastPlayedComparator implements Comparator<UserData> {
@Override
public int compare(UserData u1, UserData u2) {
return Long.compare(u1.getLastPlayed(), u2.getLastPlayed());
}
}

View File

@ -5,11 +5,12 @@
*/
package test.java.main.java.com.djrapitops.plan.utilities;
import com.djrapitops.javaplugin.command.sender.BukkitCMDSender;
import com.djrapitops.javaplugin.command.sender.ISender;
import java.util.Set;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin;
import org.easymock.EasyMock;
import static org.junit.Assert.*;
@ -58,7 +59,7 @@ public class MiscUtilsTest {
@Test
public void testGetPlayerDisplaynameArgsPerm() {
String[] args = new String[]{"Rsl1122", "Test"};
CommandSender sender = MockUtils.mockPlayer();
ISender sender = new BukkitCMDSender(MockUtils.mockPlayer());
String expResult = "Rsl1122";
String result = MiscUtils.getPlayerName(args, sender);
assertEquals(expResult, result);
@ -70,7 +71,7 @@ public class MiscUtilsTest {
@Test
public void testGetPlayerDisplaynameArgsNoPerm() {
String[] args = new String[]{"Rsl1122", "Test"};
CommandSender sender = MockUtils.mockPlayer();
ISender sender = new BukkitCMDSender(MockUtils.mockPlayer());
String expResult = "Rsl1122";
String result = MiscUtils.getPlayerName(args, sender);
assertEquals(expResult, result);
@ -82,7 +83,7 @@ public class MiscUtilsTest {
@Test
public void testGetPlayerDisplaynameNoArgsPerm() {
String[] args = new String[]{};
CommandSender sender = MockUtils.mockPlayer();
ISender sender = new BukkitCMDSender(MockUtils.mockPlayer());
String expResult = "TestName";
String result = MiscUtils.getPlayerName(args, sender);
assertEquals(expResult, result);
@ -94,7 +95,7 @@ public class MiscUtilsTest {
@Test
public void testGetPlayerDisplaynameNoArgsNoPerm() {
String[] args = new String[]{};
CommandSender sender = MockUtils.mockPlayer2();
ISender sender = new BukkitCMDSender(MockUtils.mockPlayer2());
String expResult = "TestName2";
String result = MiscUtils.getPlayerName(args, sender);
assertEquals(expResult, result);
@ -106,7 +107,7 @@ public class MiscUtilsTest {
@Test
public void testGetPlayerDisplaynameOwnNameNoPerm() {
String[] args = new String[]{"testname2"};
CommandSender sender = MockUtils.mockPlayer2();
ISender sender = new BukkitCMDSender(MockUtils.mockPlayer2());
String expResult = "TestName2";
String result = MiscUtils.getPlayerName(args, sender);
assertEquals(expResult, result);
@ -118,7 +119,7 @@ public class MiscUtilsTest {
@Test
public void testGetPlayerDisplaynameConsole() {
String[] args = new String[]{"TestConsoleSender"};
CommandSender sender = MockUtils.mockConsoleSender();
ISender sender = new BukkitCMDSender(MockUtils.mockConsoleSender());
String expResult = "TestConsoleSender";
String result = MiscUtils.getPlayerName(args, sender);
assertEquals(expResult, result);

View File

@ -6,6 +6,7 @@
package test.java.utils;
import com.djrapitops.javaplugin.status.ProcessStatus;
import com.djrapitops.javaplugin.utilities.BenchmarkUtil;
import com.djrapitops.javaplugin.utilities.log.BukkitLog;
import java.io.File;
import java.io.FileInputStream;
@ -72,6 +73,8 @@ public class TestInit {
when(planMock.getPluginLogger()).thenReturn(log);
ProcessStatus<Plan> process = new ProcessStatus(planMock);
when(planMock.processStatus()).thenReturn(process);
BenchmarkUtil bench = new BenchmarkUtil();
when(planMock.benchmark()).thenReturn(bench);
Plan.setInstance(planMock);
// Mockito.doReturn("0.0.0.0").when(planMock).getServer().getIp();
Settings.DEBUG.setValue(true);

View File

@ -0,0 +1,100 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.djrapitops.pluginbridge.plan;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import main.java.com.djrapitops.plan.data.UserData;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
/**
*
* @author Rsl1122
*/
public class FakeOfflinePlayer implements OfflinePlayer {
private final UserData data;
public FakeOfflinePlayer(UserData data) {
this.data = data;
}
@Override
public boolean isOnline() {
return data.isOnline();
}
@Override
public String getName() {
return data.getName();
}
@Override
public UUID getUniqueId() {
return data.getUuid();
}
@Override
public boolean isBanned() {
return data.isBanned();
}
@Override
public void setBanned(boolean bln) {
}
@Override
public boolean isWhitelisted() {
return true;
}
@Override
public void setWhitelisted(boolean bln) {
}
@Override
public Player getPlayer() {
return null;
}
@Override
public long getFirstPlayed() {
return data.getRegistered();
}
@Override
public long getLastPlayed() {
return data.getLastPlayed();
}
@Override
public boolean hasPlayedBefore() {
return true;
}
@Override
public Location getBedSpawnLocation() {
return new Location(null, 0, 0, 0);
}
@Override
public boolean isOp() {
return data.isOp();
}
@Override
public void setOp(boolean bln) {
}
@Override
public Map<String, Object> serialize() {
return new HashMap<>();
}
}

View File

@ -21,7 +21,7 @@ import main.java.com.djrapitops.plan.utilities.MiscUtils;
*/
public class AdvancedAchievementsAchievements extends PluginData {
private AdvancedAchievementsAPI aaAPI;
private final AdvancedAchievementsAPI aaAPI;
private long lastRefresh;
private Map<UUID, Integer> totalAchievements;
@ -43,7 +43,7 @@ public class AdvancedAchievementsAchievements extends PluginData {
@Override
public String getHtmlReplaceValue(String modifierPrefix, UUID uuid) {
if (MiscUtils.getTime() - lastRefresh > 60000) {
totalAchievements = aaAPI.getPlayersTotalAchievements();
refreshTotalAchievements();
}
Integer total = totalAchievements.get(uuid);
if (total != null) {
@ -52,10 +52,15 @@ public class AdvancedAchievementsAchievements extends PluginData {
return parseContainer(modifierPrefix, 0 + "");
}
private void refreshTotalAchievements() {
totalAchievements = aaAPI.getPlayersTotalAchievements();
lastRefresh = MiscUtils.getTime();
}
@Override
public Serializable getValue(UUID uuid) {
if (MiscUtils.getTime() - lastRefresh > 60000) {
totalAchievements = aaAPI.getPlayersTotalAchievements();
refreshTotalAchievements();
}
Integer total = totalAchievements.get(uuid);
if (total != null) {

View File

@ -24,7 +24,7 @@ import main.java.com.djrapitops.plan.utilities.HtmlUtils;
*/
public class AdvancedAchievementsTable extends PluginData {
private AdvancedAchievementsAPI aaAPI;
private final AdvancedAchievementsAPI aaAPI;
/**
* Class Constructor, sets the parameters of the PluginData object.

View File

@ -20,7 +20,7 @@ import main.java.com.djrapitops.plan.data.additional.PluginData;
*/
public class EssentialsJailed extends PluginData {
private Essentials essentials;
private final Essentials essentials;
/**
* Class Constructor, sets the parameters of the PluginData object.

View File

@ -20,7 +20,7 @@ import main.java.com.djrapitops.plan.data.additional.PluginData;
*/
public class EssentialsMuted extends PluginData {
private Essentials essentials;
private final Essentials essentials;
/**
* Class Constructor, sets the parameters of the PluginData object.

View File

@ -2,13 +2,6 @@ package com.djrapitops.pluginbridge.plan.factions;
import main.java.com.djrapitops.plan.data.additional.HookHandler;
import com.djrapitops.pluginbridge.plan.Hook;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.FactionColl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.api.API;
/**
@ -33,26 +26,7 @@ public class FactionsHook extends Hook {
hookH.addPluginDataSource(new FactionsFaction());
hookH.addPluginDataSource(new FactionsPower());
hookH.addPluginDataSource(new FactionsMaxPower());
hookH.addPluginDataSource(new FactionsTable(this.getTopFactions()));
hookH.addPluginDataSource(new FactionsTable());
}
}
/**
* Used to get the list of Factions and filter out unnessecary ones.
*
* @return List of Factions sorted by power
*/
public List<Faction> getTopFactions() {
List<Faction> topFactions = new ArrayList<>();
topFactions.addAll(FactionColl.get().getAll());
topFactions.remove(FactionColl.get().getWarzone());
topFactions.remove(FactionColl.get().getSafezone());
topFactions.remove(FactionColl.get().getNone());
List<String> hide = Settings.HIDE_FACTIONS.getStringList();
Collections.sort(topFactions, new FactionComparator());
List<Faction> factionNames = topFactions.stream()
.filter(faction -> !hide.contains(faction.getName()))
.collect(Collectors.toList());
return factionNames;
}
}

View File

@ -1,10 +1,15 @@
package com.djrapitops.pluginbridge.plan.factions;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.FactionColl;
import com.massivecraft.factions.entity.MPlayer;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.additional.AnalysisType;
import main.java.com.djrapitops.plan.data.additional.PluginData;
import main.java.com.djrapitops.plan.ui.Html;
@ -29,20 +34,39 @@ public class FactionsTable extends PluginData {
*
* Uses Html to easily parse Html for the table.
*
* @param factions List of filtered Factions.
* @see FactionsHook
* @see Html
*/
public FactionsTable(List<Faction> factions) {
public FactionsTable() {
super("Factions", "factionstable", AnalysisType.HTML);
this.factions = factions;
this.factions = getTopFactions();
super.setPrefix(Html.TABLE_FACTIONS_START.parse());
super.setSuffix(Html.TABLE_END.parse());
}
/**
* Used to get the list of Factions and filter out unnessecary ones.
*
* @return List of Factions sorted by power
*/
public final List<Faction> getTopFactions() {
List<Faction> topFactions = new ArrayList<>();
topFactions.addAll(FactionColl.get().getAll());
topFactions.remove(FactionColl.get().getWarzone());
topFactions.remove(FactionColl.get().getSafezone());
topFactions.remove(FactionColl.get().getNone());
List<String> hide = Settings.HIDE_FACTIONS.getStringList();
Collections.sort(topFactions, new FactionComparator());
List<Faction> factionNames = topFactions.stream()
.filter(faction -> !hide.contains(faction.getName()))
.collect(Collectors.toList());
return factionNames;
}
@Override
public String getHtmlReplaceValue(String modifierPrefix, UUID uuid) {
StringBuilder html = new StringBuilder();
this.factions = getTopFactions();
if (factions.isEmpty()) {
html.append(Html.TABLELINE_4.parse(Html.FACTION_NO_FACTIONS.parse(), "", "", ""));
} else {

View File

@ -24,6 +24,7 @@ public class OnTimeImporter extends Importer {
* Constructor.
*/
public OnTimeImporter() {
super.setInfo("Imports playtime from OnTime & resets GMTimes to survival");
}
/**
@ -35,7 +36,7 @@ public class OnTimeImporter extends Importer {
* @return HandlingInfo object
*/
@Override
public HandlingInfo importData(UUID uuid) {
public HandlingInfo importData(UUID uuid, String... args) {
OfflinePlayer p = getOfflinePlayer(uuid);
Long playTime = OnTimeAPI.getPlayerTimeData(p.getName(), OnTimeAPI.data.TOTALPLAY);
return new HandlingInfo(uuid, InfoType.OTHER, 0L) {

View File

@ -4,7 +4,6 @@ import com.gamingmesh.jobs.Jobs;
import com.gamingmesh.jobs.PlayerManager;
import com.gamingmesh.jobs.container.JobProgression;
import java.io.Serializable;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -16,7 +15,6 @@ import main.java.com.djrapitops.plan.data.additional.PluginData;
import main.java.com.djrapitops.plan.ui.Html;
import main.java.com.djrapitops.plan.utilities.FormatUtils;
import main.java.com.djrapitops.plan.utilities.analysis.MathUtils;
import static org.bukkit.Bukkit.getOfflinePlayers;
/**
* PluginData class for Jobs-plugin.

View File

@ -2,11 +2,11 @@ package com.djrapitops.pluginbridge.plan.ontime;
import java.io.Serializable;
import java.util.UUID;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.additional.AnalysisType;
import main.java.com.djrapitops.plan.data.additional.PluginData;
import me.edge209.OnTime.OnTimeAPI;
import static org.bukkit.Bukkit.getOfflinePlayer;
import org.bukkit.OfflinePlayer;
/**
* PluginData class for Ontime-plugin.
@ -33,11 +33,11 @@ public class OntimeRefer extends PluginData {
@Override
public String getHtmlReplaceValue(String modifierPrefix, UUID uuid) {
OfflinePlayer offlinePlayer = getOfflinePlayer(uuid);
if (!offlinePlayer.hasPlayedBefore()) {
return "";
UserData data = Plan.getPlanAPI().getInspectCachedUserDataMap().get(uuid);
if (data == null) {
return parseContainer(modifierPrefix, "No Referrals.");
}
String name = offlinePlayer.getName();
String name = data.getName();
long referTotal = OnTimeAPI.getPlayerTimeData(name, OnTimeAPI.data.TOTALREFER);
if (referTotal == -1) {
return parseContainer(modifierPrefix, "No Referrals.");
@ -47,11 +47,11 @@ public class OntimeRefer extends PluginData {
@Override
public Serializable getValue(UUID uuid) {
OfflinePlayer offlinePlayer = getOfflinePlayer(uuid);
if (!offlinePlayer.hasPlayedBefore()) {
UserData data = Plan.getPlanAPI().getInspectCachedUserDataMap().get(uuid);
if (data == null) {
return -1L;
}
String name = offlinePlayer.getName();
String name = data.getName();
long referTotal = OnTimeAPI.getPlayerTimeData(name, OnTimeAPI.data.TOTALREFER);
if (referTotal == -1) {
return -1L;

View File

@ -1,7 +1,11 @@
package com.djrapitops.pluginbridge.plan.ontime;
import com.djrapitops.pluginbridge.plan.FakeOfflinePlayer;
import java.io.Serializable;
import java.util.Arrays;
import java.util.UUID;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.additional.AnalysisType;
import main.java.com.djrapitops.plan.data.additional.PluginData;
import me.edge209.OnTime.OnTimeAPI;
@ -33,11 +37,11 @@ public class OntimeReferMonth extends PluginData {
@Override
public String getHtmlReplaceValue(String modifierPrefix, UUID uuid) {
OfflinePlayer offlinePlayer = getOfflinePlayer(uuid);
if (!offlinePlayer.hasPlayedBefore()) {
return "";
UserData data = Plan.getPlanAPI().getInspectCachedUserDataMap().get(uuid);
if (data == null) {
return parseContainer(modifierPrefix, "No Referrals.");
}
String name = offlinePlayer.getName();
String name = data.getName();
long referTotal = OnTimeAPI.getPlayerTimeData(name, OnTimeAPI.data.MONTHREFER);
if (referTotal == -1) {
return parseContainer(modifierPrefix, "No Referrals.");
@ -47,11 +51,11 @@ public class OntimeReferMonth extends PluginData {
@Override
public Serializable getValue(UUID uuid) {
OfflinePlayer offlinePlayer = getOfflinePlayer(uuid);
if (!offlinePlayer.hasPlayedBefore()) {
UserData data = Plan.getPlanAPI().getInspectCachedUserDataMap().get(uuid);
if (data == null) {
return -1L;
}
String name = offlinePlayer.getName();
String name = data.getName();
long referTotal = OnTimeAPI.getPlayerTimeData(name, OnTimeAPI.data.MONTHREFER);
if (referTotal == -1) {
return -1L;

View File

@ -2,11 +2,11 @@ package com.djrapitops.pluginbridge.plan.ontime;
import java.io.Serializable;
import java.util.UUID;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.additional.AnalysisType;
import main.java.com.djrapitops.plan.data.additional.PluginData;
import me.edge209.OnTime.OnTimeAPI;
import static org.bukkit.Bukkit.getOfflinePlayer;
import org.bukkit.OfflinePlayer;
/**
* PluginData class for Ontime-plugin.
@ -33,11 +33,11 @@ public class OntimeReferWeek extends PluginData {
@Override
public String getHtmlReplaceValue(String modifierPrefix, UUID uuid) {
OfflinePlayer offlinePlayer = getOfflinePlayer(uuid);
if (!offlinePlayer.hasPlayedBefore()) {
return "";
UserData data = Plan.getPlanAPI().getInspectCachedUserDataMap().get(uuid);
if (data == null) {
return parseContainer(modifierPrefix, "No Referrals.");
}
String name = offlinePlayer.getName();
String name = data.getName();
long referTotal = OnTimeAPI.getPlayerTimeData(name, OnTimeAPI.data.WEEKREFER);
if (referTotal == -1) {
return parseContainer(modifierPrefix, "No Referrals.");
@ -47,11 +47,11 @@ public class OntimeReferWeek extends PluginData {
@Override
public Serializable getValue(UUID uuid) {
OfflinePlayer offlinePlayer = getOfflinePlayer(uuid);
if (!offlinePlayer.hasPlayedBefore()) {
UserData data = Plan.getPlanAPI().getInspectCachedUserDataMap().get(uuid);
if (data == null) {
return -1L;
}
String name = offlinePlayer.getName();
String name = data.getName();
long referTotal = OnTimeAPI.getPlayerTimeData(name, OnTimeAPI.data.WEEKREFER);
if (referTotal == -1) {
return -1L;

View File

@ -2,11 +2,11 @@ package com.djrapitops.pluginbridge.plan.ontime;
import java.io.Serializable;
import java.util.UUID;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.additional.AnalysisType;
import main.java.com.djrapitops.plan.data.additional.PluginData;
import me.edge209.OnTime.OnTimeAPI;
import static org.bukkit.Bukkit.getOfflinePlayer;
import org.bukkit.OfflinePlayer;
/**
* PluginData class for Ontime-plugin.
@ -33,11 +33,11 @@ public class OntimeVotes extends PluginData {
@Override
public String getHtmlReplaceValue(String modifierPrefix, UUID uuid) {
OfflinePlayer offlinePlayer = getOfflinePlayer(uuid);
if (!offlinePlayer.hasPlayedBefore()) {
return "";
UserData data = Plan.getPlanAPI().getInspectCachedUserDataMap().get(uuid);
if (data == null) {
return parseContainer(modifierPrefix, "No votes.");
}
String name = offlinePlayer.getName();
String name = data.getName();
long votesTotal = OnTimeAPI.getPlayerTimeData(name, OnTimeAPI.data.TOTALVOTE);
if (votesTotal == -1) {
return parseContainer(modifierPrefix, "No votes.");
@ -47,11 +47,11 @@ public class OntimeVotes extends PluginData {
@Override
public Serializable getValue(UUID uuid) {
OfflinePlayer offlinePlayer = getOfflinePlayer(uuid);
if (!offlinePlayer.hasPlayedBefore()) {
UserData data = Plan.getPlanAPI().getInspectCachedUserDataMap().get(uuid);
if (data == null) {
return -1L;
}
String name = offlinePlayer.getName();
String name = data.getName();
long votesTotal = OnTimeAPI.getPlayerTimeData(name, OnTimeAPI.data.TOTALVOTE);
if (votesTotal == -1) {
return -1L;

View File

@ -2,11 +2,11 @@ package com.djrapitops.pluginbridge.plan.ontime;
import java.io.Serializable;
import java.util.UUID;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.additional.AnalysisType;
import main.java.com.djrapitops.plan.data.additional.PluginData;
import me.edge209.OnTime.OnTimeAPI;
import static org.bukkit.Bukkit.getOfflinePlayer;
import org.bukkit.OfflinePlayer;
/**
* PluginData class for Ontime-plugin.
@ -33,11 +33,11 @@ public class OntimeVotesMonth extends PluginData {
@Override
public String getHtmlReplaceValue(String modifierPrefix, UUID uuid) {
OfflinePlayer offlinePlayer = getOfflinePlayer(uuid);
if (!offlinePlayer.hasPlayedBefore()) {
return "";
UserData data = Plan.getPlanAPI().getInspectCachedUserDataMap().get(uuid);
if (data == null) {
return parseContainer(modifierPrefix, "No votes.");
}
String name = offlinePlayer.getName();
String name = data.getName();
long votesTotal = OnTimeAPI.getPlayerTimeData(name, OnTimeAPI.data.MONTHVOTE);
if (votesTotal == -1) {
return parseContainer(modifierPrefix, "No votes.");
@ -47,11 +47,11 @@ public class OntimeVotesMonth extends PluginData {
@Override
public Serializable getValue(UUID uuid) {
OfflinePlayer offlinePlayer = getOfflinePlayer(uuid);
if (!offlinePlayer.hasPlayedBefore()) {
UserData data = Plan.getPlanAPI().getInspectCachedUserDataMap().get(uuid);
if (data == null) {
return -1L;
}
String name = offlinePlayer.getName();
String name = data.getName();
long votesTotal = OnTimeAPI.getPlayerTimeData(name, OnTimeAPI.data.MONTHVOTE);
if (votesTotal == -1) {
return -1L;

View File

@ -2,11 +2,11 @@ package com.djrapitops.pluginbridge.plan.ontime;
import java.io.Serializable;
import java.util.UUID;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.additional.AnalysisType;
import main.java.com.djrapitops.plan.data.additional.PluginData;
import me.edge209.OnTime.OnTimeAPI;
import static org.bukkit.Bukkit.getOfflinePlayer;
import org.bukkit.OfflinePlayer;
/**
* PluginData class for Ontime-plugin.
@ -33,11 +33,11 @@ public class OntimeVotesWeek extends PluginData {
@Override
public String getHtmlReplaceValue(String modifierPrefix, UUID uuid) {
OfflinePlayer offlinePlayer = getOfflinePlayer(uuid);
if (!offlinePlayer.hasPlayedBefore()) {
return "";
UserData data = Plan.getPlanAPI().getInspectCachedUserDataMap().get(uuid);
if (data == null) {
return parseContainer(modifierPrefix, "No votes.");
}
String name = offlinePlayer.getName();
String name = data.getName();
long votesTotal = OnTimeAPI.getPlayerTimeData(name, OnTimeAPI.data.WEEKVOTE);
if (votesTotal == -1) {
return parseContainer(modifierPrefix, "No votes.");
@ -47,11 +47,11 @@ public class OntimeVotesWeek extends PluginData {
@Override
public Serializable getValue(UUID uuid) {
OfflinePlayer offlinePlayer = getOfflinePlayer(uuid);
if (!offlinePlayer.hasPlayedBefore()) {
UserData data = Plan.getPlanAPI().getInspectCachedUserDataMap().get(uuid);
if (data == null) {
return -1L;
}
String name = offlinePlayer.getName();
String name = data.getName();
long votesTotal = OnTimeAPI.getPlayerTimeData(name, OnTimeAPI.data.WEEKVOTE);
if (votesTotal == -1) {
return -1L;

View File

@ -2,12 +2,6 @@ package com.djrapitops.pluginbridge.plan.towny;
import main.java.com.djrapitops.plan.data.additional.HookHandler;
import com.djrapitops.pluginbridge.plan.Hook;
import com.palmergames.bukkit.towny.object.Town;
import com.palmergames.bukkit.towny.object.TownyUniverse;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.api.API;
/**
@ -30,23 +24,8 @@ public class TownyHook extends Hook {
public TownyHook(HookHandler hookH) throws NoClassDefFoundError {
super("com.palmergames.bukkit.towny.Towny");
if (enabled) {
hookH.addPluginDataSource(new TownyTable(getTopTowns()));
hookH.addPluginDataSource(new TownyTable());
hookH.addPluginDataSource(new TownyTown());
}
}
/**
* Used to get the list of Towns and filter out unnessecary ones.
*
* @return List of Towns sorted by amount of residents.
*/
public List<Town> getTopTowns() {
List<Town> topTowns = TownyUniverse.getDataSource().getTowns();
Collections.sort(topTowns, new TownComparator());
List<String> hide = Settings.HIDE_TOWNS.getStringList();
List<Town> townNames = topTowns.stream()
.filter(town -> !hide.contains(town.getName()))
.collect(Collectors.toList());
return townNames;
}
}

View File

@ -3,9 +3,13 @@ package com.djrapitops.pluginbridge.plan.towny;
import com.massivecraft.factions.entity.MPlayer;
import com.palmergames.bukkit.towny.object.Resident;
import com.palmergames.bukkit.towny.object.Town;
import com.palmergames.bukkit.towny.object.TownyUniverse;
import java.io.Serializable;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.additional.AnalysisType;
import main.java.com.djrapitops.plan.data.additional.PluginData;
import main.java.com.djrapitops.plan.ui.Html;
@ -29,13 +33,11 @@ public class TownyTable extends PluginData {
*
* Uses Html to easily parse Html for the table.
*
* @param towns List of filtered Towns.
* @see TownyHook
* @see Html
*/
public TownyTable(List<Town> towns) {
public TownyTable() {
super("Towny", "townstable", AnalysisType.HTML);
this.towns = towns;
super.setPrefix(Html.TABLE_TOWNS_START.parse());
super.setSuffix(Html.TABLE_END.parse());
}
@ -43,6 +45,7 @@ public class TownyTable extends PluginData {
@Override
public String getHtmlReplaceValue(String modifierPrefix, UUID uuid) {
StringBuilder html = new StringBuilder();
this.towns = getTopTowns();
if (towns.isEmpty()) {
html.append(Html.TABLELINE_4.parse(Html.TOWN_NO_TOWNS.parse(), "", "", ""));
} else {
@ -67,6 +70,21 @@ public class TownyTable extends PluginData {
return parseContainer(modifierPrefix, html.toString());
}
/**
* Used to get the list of Towns and filter out unnessecary ones.
*
* @return List of Towns sorted by amount of residents.
*/
public List<Town> getTopTowns() {
List<Town> topTowns = TownyUniverse.getDataSource().getTowns();
Collections.sort(topTowns, new TownComparator());
List<String> hide = Settings.HIDE_TOWNS.getStringList();
List<Town> townNames = topTowns.stream()
.filter(town -> !hide.contains(town.getName()))
.collect(Collectors.toList());
return townNames;
}
@Override
public Serializable getValue(UUID uuid) {
MPlayer mPlayer = MPlayer.get(uuid);

View File

@ -6,9 +6,9 @@ import com.palmergames.bukkit.towny.object.TownyUniverse;
import java.io.Serializable;
import java.util.UUID;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.additional.PluginData;
import static org.bukkit.Bukkit.getOfflinePlayer;
import org.bukkit.OfflinePlayer;
/**
* PluginData class for Towny-plugin.
@ -35,11 +35,11 @@ public class TownyTown extends PluginData {
@Override
public String getHtmlReplaceValue(String modifierPrefix, UUID uuid) {
OfflinePlayer offlinePlayer = getOfflinePlayer(uuid);
if (!offlinePlayer.hasPlayedBefore()) {
UserData data = Plan.getPlanAPI().getInspectCachedUserDataMap().get(uuid);
if (data == null) {
return parseContainer(modifierPrefix, Phrase.NOT_IN_TOWN + "");
}
String name = offlinePlayer.getName();
String name = data.getName();
try {
Resident res = TownyUniverse.getDataSource().getResident(name);
String town;
@ -56,11 +56,11 @@ public class TownyTown extends PluginData {
@Override
public Serializable getValue(UUID uuid) {
OfflinePlayer offlinePlayer = getOfflinePlayer(uuid);
if (!offlinePlayer.hasPlayedBefore()) {
return "";
UserData data = Plan.getPlanAPI().getInspectCachedUserDataMap().get(uuid);
if (data == null) {
return Phrase.NOT_IN_TOWN + "";
}
String name = offlinePlayer.getName();
String name = data.getName();
try {
Resident res = TownyUniverse.getDataSource().getResident(name);
String town;
@ -71,7 +71,7 @@ public class TownyTown extends PluginData {
}
return town;
} catch (NotRegisteredException ex) {
return "";
return ex + "";
}
}

View File

@ -1,7 +1,11 @@
package com.djrapitops.pluginbridge.plan.vault;
import com.djrapitops.pluginbridge.plan.FakeOfflinePlayer;
import java.io.Serializable;
import java.util.UUID;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.additional.AnalysisType;
import main.java.com.djrapitops.plan.data.additional.PluginData;
import main.java.com.djrapitops.plan.utilities.FormatUtils;
@ -22,7 +26,7 @@ import org.bukkit.OfflinePlayer;
*/
public class EconomyBalance extends PluginData {
private Economy econ;
private final Economy econ;
/**
* Class Constructor, sets the parameters of the PluginData object.
@ -40,7 +44,11 @@ public class EconomyBalance extends PluginData {
@Override
public String getHtmlReplaceValue(String modifierPrefix, UUID uuid) {
OfflinePlayer p = getOfflinePlayer(uuid);
UserData data = Plan.getPlanAPI().getInspectCachedUserDataMap().get(uuid);
if (data == null) {
return parseContainer(modifierPrefix, "0");
}
OfflinePlayer p = new FakeOfflinePlayer(data);
if (this.econ.hasAccount(p)) {
return parseContainer(modifierPrefix, this.econ.getBalance(p) + "");
}

View File

@ -0,0 +1,60 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.djrapitops.pluginbridge.plan.vault;
import com.djrapitops.pluginbridge.plan.FakeOfflinePlayer;
import java.io.Serializable;
import java.util.UUID;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.additional.AnalysisType;
import main.java.com.djrapitops.plan.data.additional.PluginData;
import main.java.com.djrapitops.plan.ui.Html;
import main.java.com.djrapitops.plan.utilities.FormatUtils;
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import net.milkbowl.vault.economy.Economy;
/**
* PluginData class for Vault-plugin.
*
* @author Rsl1122
* @since 3.5.0
*/
public class EconomyBalanceTable extends PluginData {
private final Economy econ;
public EconomyBalanceTable(Economy econ) {
super("Vault", "ecobalancetable", AnalysisType.HTML);
this.econ = econ;
String user = Html.FONT_AWESOME_ICON.parse("user") + " Player";
String balance = Html.FONT_AWESOME_ICON.parse("money") + " Balance";
super.setPrefix(Html.TABLE_START_2.parse(user, balance));
super.setSuffix(Html.TABLE_END.parse());
}
@Override
public String getHtmlReplaceValue(String modifierPrefix, UUID uuid) {
String tableLines = getTableLines();
return parseContainer("", tableLines);
}
@Override
public Serializable getValue(UUID uuid) {
return -1;
}
private String getTableLines() {
StringBuilder html = new StringBuilder();
Plan.getPlanAPI().getInspectCachedUserData().stream()
.forEach(data -> {
String link = Html.LINK.parse(HtmlUtils.getInspectUrl(data.getName()), data.getName());
String bal = FormatUtils.cutDecimals(econ.getBalance(new FakeOfflinePlayer(data)));
html.append(Html.TABLELINE_2.parse(link, bal));
});
return html.toString();
}
}

View File

@ -5,16 +5,19 @@
*/
package com.djrapitops.pluginbridge.plan.vault;
import com.djrapitops.pluginbridge.plan.FakeOfflinePlayer;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.additional.AnalysisType;
import main.java.com.djrapitops.plan.data.additional.PluginData;
import main.java.com.djrapitops.plan.ui.Html;
import net.milkbowl.vault.permission.Permission;
import org.apache.commons.lang3.StringUtils;
import static org.bukkit.Bukkit.getOfflinePlayers;
import org.bukkit.OfflinePlayer;
/**
@ -49,7 +52,8 @@ public class PermGroupTable extends PluginData {
private String getTableLines() {
Map<String, Integer> groups = new HashMap<>();
for (OfflinePlayer p : getOfflinePlayers()) {
List<FakeOfflinePlayer> userData = Plan.getPlanAPI().getInspectCachedUserData().stream().map(u -> new FakeOfflinePlayer(u)).collect(Collectors.toList());
for (OfflinePlayer p : userData) {
String group = permSys.getPrimaryGroup(null, p);
if (!groups.containsKey(group)) {
groups.put(group, 0);

View File

@ -31,15 +31,16 @@ public class VaultHook extends Hook {
}
try {
Economy econ = getServer().getServicesManager().getRegistration(Economy.class).getProvider();
hookH.addPluginDataSource(new EconomyBalance(econ));
Permission permSys = getServer().getServicesManager().getRegistration(Permission.class).getProvider();
hookH.addPluginDataSource(new PermGroup(permSys));
hookH.addPluginDataSource(new PermGroupTable(permSys));
} catch (Throwable e) {
}
try {
Permission permSys = getServer().getServicesManager().getRegistration(Permission.class).getProvider();
// hookH.addPluginDataSource(new PermGroupTable(permSys)); // Disabled due to getOfflinePlayers method
hookH.addPluginDataSource(new PermGroup(permSys));
Economy econ = getServer().getServicesManager().getRegistration(Economy.class).getProvider();
hookH.addPluginDataSource(new EconomyBalance(econ));
hookH.addPluginDataSource(new EconomyBalanceTable(econ));
} catch (Throwable e) {
}
}