Swap Abstract Plugin Framework for Platform Abstraction Layer library (#1787)

Replaced Abstract Plugin Framework with Platform Abstraction Layer

Large amount of changes due to removal of features from the library,
and change of the way the abstraction is achieved.
Removes features from Plan:

    Removed debug logging (Considered useless when debugging issues)
    Removed /debug page (Considered useless when debugging issues)
    Removed enable timing (Benchmarking utility was removed from the library)
This commit is contained in:
Risto Lahtela 2021-03-09 11:36:07 +02:00 committed by GitHub
parent 4da7497d82
commit e1bffbcc1f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
237 changed files with 1678 additions and 3125 deletions

View File

@ -17,6 +17,7 @@
package com.djrapitops.plan.extension;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
@ -74,4 +75,8 @@ public enum ElementOrder {
return order.toArray(new ElementOrder[0]);
}
public static List<ElementOrder> valuesAsList() {
return Arrays.asList(values());
}
}

View File

@ -66,7 +66,7 @@ subprojects {
ext.daggerVersion = "2.33"
ext.daggerCompilerVersion = "2.33"
ext.abstractPluginFrameworkVersion = "3.4.2"
ext.palVersion = "4.0.2"
ext.bukkitVersion = "1.13.2-R0.1-SNAPSHOT"
ext.spigotVersion = "1.13.2-R0.1-SNAPSHOT"

View File

@ -9,7 +9,7 @@ dependencies {
compile project(path: ":common", configuration: 'shadow')
compileOnly project(":api")
compile "com.djrapitops:AbstractPluginFramework-bukkit:$abstractPluginFrameworkVersion"
compile "net.playeranalytics:platform-abstraction-layer-bukkit:$palVersion"
compile "org.bstats:bstats-bukkit:$bstatsVersion"
compileOnly "me.clip:placeholderapi:$placeholderapiVersion"

View File

@ -16,7 +16,6 @@
*/
package com.djrapitops.plan;
import com.djrapitops.plugin.api.Check;
import org.bstats.bukkit.Metrics;
import org.bstats.charts.SimplePie;
@ -38,7 +37,7 @@ public class BStatsBukkit {
private void registerConfigSettingGraphs() {
String serverType = plugin.getServer().getName();
if ("CraftBukkit".equals(serverType) && Check.isSpigotAvailable()) {
if ("CraftBukkit".equals(serverType) && isSpigotAvailable()) {
serverType = "Spigot";
}
String databaseType = plugin.getSystem().getDatabaseSystem().getDatabase().getType().getName();
@ -47,6 +46,15 @@ public class BStatsBukkit {
addStringSettingPie("database_type", databaseType);
}
private boolean isSpigotAvailable() {
try {
Class.forName("org.spigotmc.CustomTimingsHandler");
return true;
} catch (Exception e) {
return false;
}
}
protected void addStringSettingPie(String id, String setting) {
metrics.addCustomChart(new SimplePie(id, () -> setting));
}

View File

@ -21,7 +21,7 @@ import com.djrapitops.plan.settings.locale.Locale;
import com.djrapitops.plan.storage.database.DBSystem;
import com.djrapitops.plan.utilities.java.Reflection;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.logging.console.PluginLogger;
import net.playeranalytics.plugin.server.PluginLogger;
import javax.inject.Inject;
import javax.inject.Singleton;
@ -49,7 +49,6 @@ public class BukkitServerShutdownSave extends ServerShutdownSave {
try {
return performCheck();
} catch (Exception | NoClassDefFoundError | NoSuchFieldError e) {
logger.debug("Server shutdown check failed, using JVM ShutdownHook instead. Error: " + e.toString());
return false; // ShutdownHook handles save in case this fails upon plugin disable.
}
}

View File

@ -18,19 +18,21 @@ package com.djrapitops.plan;
import com.djrapitops.plan.addons.placeholderapi.BukkitPlaceholderRegistrar;
import com.djrapitops.plan.commands.use.BukkitCommand;
import com.djrapitops.plan.commands.use.ColorScheme;
import com.djrapitops.plan.commands.use.Subcommand;
import com.djrapitops.plan.exceptions.EnableException;
import com.djrapitops.plan.gathering.ServerShutdownSave;
import com.djrapitops.plan.settings.locale.Locale;
import com.djrapitops.plan.settings.locale.lang.PluginLang;
import com.djrapitops.plan.settings.theme.PlanColorScheme;
import com.djrapitops.plugin.BukkitPlugin;
import com.djrapitops.plugin.benchmarking.Benchmark;
import com.djrapitops.plugin.command.ColorScheme;
import com.djrapitops.plugin.task.AbsRunnable;
import net.playeranalytics.plugin.BukkitPlatformLayer;
import net.playeranalytics.plugin.PlatformAbstractionLayer;
import net.playeranalytics.plugin.scheduling.RunnableFactory;
import net.playeranalytics.plugin.server.PluginLogger;
import org.bukkit.Bukkit;
import org.bukkit.command.PluginCommand;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -40,17 +42,26 @@ import java.util.logging.Logger;
*
* @author AuroraLS3
*/
public class Plan extends BukkitPlugin implements PlanPlugin {
public class Plan extends JavaPlugin implements PlanPlugin {
private PlanSystem system;
private Locale locale;
private ServerShutdownSave serverShutdownSave;
private PluginLogger logger;
private RunnableFactory runnableFactory;
@Override
public void onEnable() {
PlanBukkitComponent component = DaggerPlanBukkitComponent.builder().plan(this).build();
PlatformAbstractionLayer abstractionLayer = new BukkitPlatformLayer(this);
logger = abstractionLayer.getPluginLogger();
runnableFactory = abstractionLayer.getRunnableFactory();
PlanBukkitComponent component = DaggerPlanBukkitComponent.builder()
.plan(this)
.abstractionLayer(abstractionLayer)
.server(getServer())
.build();
try {
timings.start("Enable");
system = component.system();
serverShutdownSave = component.serverShutdownSave();
locale = system.getLocaleSystem().getLocale();
@ -59,9 +70,7 @@ public class Plan extends BukkitPlugin implements PlanPlugin {
registerMetrics();
registerPlaceholderAPIExtension(component.placeholders());
logger.debug("Verbose debug messages are enabled.");
String benchTime = " (" + timings.end("Enable").map(Benchmark::toDurationString).orElse("-") + ")";
logger.info(locale.getString(PluginLang.ENABLED) + benchTime);
logger.info(locale.getString(PluginLang.ENABLED));
} catch (AbstractMethodError e) {
logger.error("Plugin ran into AbstractMethodError - Server restart is required. Likely cause is updating the jar without a restart.");
} catch (EnableException e) {
@ -71,7 +80,8 @@ public class Plan extends BukkitPlugin implements PlanPlugin {
logger.error("Plugin Failed to Initialize Correctly. If this issue is caused by config settings you can use /plan reload");
onDisable();
} catch (Exception e) {
Logger.getGlobal().log(Level.SEVERE, this.getClass().getSimpleName() + "-v" + getVersion(), e);
String version = abstractionLayer.getPluginInformation().getVersion();
Logger.getGlobal().log(Level.SEVERE, e, () -> this.getClass().getSimpleName() + "-v" + version);
logger.error("Plugin Failed to Initialize Correctly. If this issue is caused by config settings you can use /plan reload");
logger.error("This error should be reported at https://github.com/plan-player-analytics/Plan/issues");
onDisable();
@ -84,16 +94,14 @@ public class Plan extends BukkitPlugin implements PlanPlugin {
private void registerPlaceholderAPIExtension(BukkitPlaceholderRegistrar placeholders) {
if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
runnableFactory.create("Placeholders Registrar", new AbsRunnable() {
@Override
public void run() {
try {
placeholders.register();
} catch (Exception | NoClassDefFoundError | NoSuchMethodError failed) {
logger.warn("Failed to register PlaceholderAPI placeholders: " + failed.toString());
runnableFactory.create(() -> {
try {
placeholders.register();
} catch (Exception | NoClassDefFoundError | NoSuchMethodError failed) {
logger.warn("Failed to register PlaceholderAPI placeholders: " + failed.toString());
}
}
}
}).runTask();
).runTask();
}
}
@ -102,12 +110,7 @@ public class Plan extends BukkitPlugin implements PlanPlugin {
// Spigot 1.14 requires Sync events to be fired from a server thread.
// Registering a service fires a sync event, and bStats registers a service,
// so this has to be run on the server thread.
runnableFactory.create("Register Metrics task", new AbsRunnable() {
@Override
public void run() {
new BStatsBukkit(plugin).registerMetrics();
}
}).runTask();
runnableFactory.create(() -> new BStatsBukkit(plugin).registerMetrics()).runTask();
}
@Override
@ -127,27 +130,11 @@ public class Plan extends BukkitPlugin implements PlanPlugin {
logger.info(locale != null ? locale.getString(PluginLang.DISABLED) : PluginLang.DISABLED.getDefault());
}
@Override
public void cancelAllTasks() {
runnableFactory.cancelAllKnownTasks();
Bukkit.getScheduler().cancelTasks(this);
}
@Override
public String getVersion() {
return getDescription().getVersion();
}
@Override
public void onReload() {
// Nothing to be done, systems are disabled
}
@Override
public boolean isReloading() {
return reloading;
}
@Override
public void registerCommand(Subcommand command) {
if (command == null) {

View File

@ -26,6 +26,8 @@ import com.djrapitops.plan.modules.bukkit.BukkitSuperClassBindingModule;
import com.djrapitops.plan.modules.bukkit.BukkitTaskModule;
import dagger.BindsInstance;
import dagger.Component;
import net.playeranalytics.plugin.PlatformAbstractionLayer;
import org.bukkit.Server;
import javax.inject.Singleton;
@ -38,7 +40,7 @@ import javax.inject.Singleton;
@Component(modules = {
BukkitPlanModule.class,
SystemObjectProvidingModule.class,
APFModule.class,
PlatformAbstractionLayerModule.class,
FiltersModule.class,
PlaceholderModule.class,
@ -61,7 +63,13 @@ public interface PlanBukkitComponent {
interface Builder {
@BindsInstance
Builder plan(Plan plan);
Builder plan(PlanPlugin plan);
@BindsInstance
Builder abstractionLayer(PlatformAbstractionLayer abstractionLayer);
@BindsInstance
Builder server(Server server);
PlanBukkitComponent build();
}

View File

@ -22,7 +22,6 @@ import com.djrapitops.plan.processing.Processing;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plan.version.VersionChecker;
import com.djrapitops.plugin.logging.L;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import me.clip.placeholderapi.PlaceholderAPIPlugin;
@ -113,7 +112,7 @@ public class PlanPlaceholderExtension extends PlaceholderExpansion {
return value;
} catch (Exception e) {
errorLogger.log(L.WARN, e, ErrorContext.builder().whatToDo("Report this").related("Placeholder Request", params, uuid).build());
errorLogger.warn(e, ErrorContext.builder().whatToDo("Report this").related("Placeholder Request", params, uuid).build());
return null;
}
}

View File

@ -18,9 +18,7 @@ package com.djrapitops.plan.commands.use;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.logging.L;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory;
import net.playeranalytics.plugin.scheduling.RunnableFactory;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
@ -57,17 +55,14 @@ public class BukkitCommand implements CommandExecutor, TabCompleter {
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
runnableFactory.create("", new AbsRunnable() {
@Override
public void run() {
try {
command.getExecutor().accept(getSender(sender), new Arguments(args));
} catch (Exception e) {
errorLogger.log(L.ERROR, e, ErrorContext.builder()
.related(sender.getClass())
.related(label + " " + Arrays.toString(args))
.build());
}
runnableFactory.create(() -> {
try {
command.getExecutor().accept(getSender(sender), new Arguments(args));
} catch (Exception e) {
errorLogger.error(e, ErrorContext.builder()
.related(sender.getClass())
.related(label + " " + Arrays.toString(args))
.build());
}
}).runTaskAsynchronously();
return true;
@ -78,7 +73,7 @@ public class BukkitCommand implements CommandExecutor, TabCompleter {
try {
return command.getArgumentResolver().apply(getSender(sender), new Arguments(args));
} catch (Exception e) {
errorLogger.log(L.ERROR, e, ErrorContext.builder()
errorLogger.error(e, ErrorContext.builder()
.related(sender.getClass())
.related("tab completion")
.related(label + " " + Arrays.toString(args))

View File

@ -16,8 +16,6 @@
*/
package com.djrapitops.plan.gathering;
import com.djrapitops.plan.Plan;
import com.djrapitops.plugin.api.Check;
import org.bukkit.Server;
import org.bukkit.World;
@ -27,7 +25,7 @@ import javax.inject.Singleton;
@Singleton
public class BukkitSensor implements ServerSensor<World> {
private final Plan plugin;
private final Server server;
private final boolean hasTPSMethod;
private final boolean hasEntityCountMethod;
@ -35,15 +33,24 @@ public class BukkitSensor implements ServerSensor<World> {
@Inject
public BukkitSensor(
Plan plugin
Server server
) {
this.plugin = plugin;
boolean hasPaper = Check.isPaperAvailable();
this.server = server;
boolean hasPaper = isPaperAvailable();
hasTPSMethod = hasPaper && hasPaperMethod(Server.class, "getTPS");
hasEntityCountMethod = hasPaper && hasPaperMethod(World.class, "getEntityCount");
hasChunkCountMethod = hasPaper && hasPaperMethod(World.class, "getChunkCount");
}
public static boolean isPaperAvailable() {
try {
Class.forName("co.aikar.timings.Timing");
return true;
} catch (Exception e) {
return false;
}
}
@Override
public boolean supportsDirectTPS() {
return hasTPSMethod;
@ -51,7 +58,7 @@ public class BukkitSensor implements ServerSensor<World> {
@Override
public double getTPS() {
return plugin.getServer().getTPS()[0];
return server.getTPS()[0];
}
@Override
@ -96,12 +103,12 @@ public class BukkitSensor implements ServerSensor<World> {
@Override
public int getOnlinePlayerCount() {
return plugin.getServer().getOnlinePlayers().size();
return server.getOnlinePlayers().size();
}
@Override
public Iterable<World> getWorlds() {
return plugin.getServer().getWorlds();
return server.getWorlds();
}
private boolean hasPaperMethod(Class<?> clazz, String methodName) {

View File

@ -16,10 +16,8 @@
*/
package com.djrapitops.plan.gathering.importing.data;
import com.djrapitops.plan.DebugChannels;
import com.djrapitops.plan.Plan;
import com.djrapitops.plugin.api.utility.UUIDFetcher;
import com.djrapitops.plugin.benchmarking.Timings;
import net.playeranalytics.plugin.player.UUIDFetcher;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import java.util.*;
@ -36,8 +34,6 @@ import java.util.stream.Collectors;
*/
public class BukkitUserImportRefiner {
private final Plan plugin;
private final Timings timings;
private final boolean onlineMode;
private final List<UserImportData> importers = new ArrayList<>();
@ -48,29 +44,18 @@ public class BukkitUserImportRefiner {
private final Map<UserImportData, String> foundUUIDs = new HashMap<>();
private final Map<UserImportData, String> foundNames = new HashMap<>();
public BukkitUserImportRefiner(Plan plugin, List<UserImportData> importers) {
this.plugin = plugin;
this.timings = plugin.getTimings();
public BukkitUserImportRefiner(List<UserImportData> importers) {
this.importers.addAll(importers);
onlineMode = plugin.getServer().getOnlineMode();
onlineMode = Bukkit.getOnlineMode();
}
public List<UserImportData> refineData() {
String benchmarkName = "Refining UserImportData";
timings.start(benchmarkName);
processMissingIdentifiers();
timings.end(DebugChannels.IMPORTING, benchmarkName);
return importers;
}
private void processMissingIdentifiers() {
String benchmarkName = "Processing missing identifiers";
timings.start(benchmarkName);
List<UserImportData> invalidData = new ArrayList<>();
importers.parallelStream().forEach(importer -> {
@ -93,15 +78,9 @@ public class BukkitUserImportRefiner {
processMissingUUIDs();
processMissingNames();
timings.end(DebugChannels.IMPORTING, benchmarkName);
}
private void processMissingUUIDs() {
String benchmarkName = "Processing missing UUIDs";
timings.start(benchmarkName);
if (onlineMode) {
addMissingUUIDsOverFetcher();
addMissingUUIDsOverOfflinePlayer();
@ -119,8 +98,6 @@ public class BukkitUserImportRefiner {
});
importers.removeAll(missingUUIDs.keySet());
timings.end(DebugChannels.IMPORTING, benchmarkName);
}
private void addMissingUUIDsOverFetcher() {
@ -172,7 +149,7 @@ public class BukkitUserImportRefiner {
@SuppressWarnings("deprecation")
private String getUuidByOfflinePlayer(String name) {
OfflinePlayer player = plugin.getServer().getOfflinePlayer(name);
OfflinePlayer player = Bukkit.getOfflinePlayer(name);
if (!player.hasPlayedBefore()) {
return null;
@ -182,17 +159,11 @@ public class BukkitUserImportRefiner {
}
private void processMissingNames() {
String benchmarkNames = "Processing missing names";
timings.start(benchmarkNames);
findMissingNames();
foundNames.entrySet().parallelStream().forEach(entry -> entry.getKey().setName(entry.getValue()));
importers.removeAll(missingNames.keySet());
timings.end(DebugChannels.IMPORTING, benchmarkNames);
}
private void findMissingNames() {
@ -224,7 +195,7 @@ public class BukkitUserImportRefiner {
}
private String getNameByOfflinePlayer(String uuid) {
OfflinePlayer player = plugin.getServer().getOfflinePlayer(UUID.fromString(uuid));
OfflinePlayer player = Bukkit.getOfflinePlayer(UUID.fromString(uuid));
if (!player.hasPlayedBefore()) {
return null;

View File

@ -16,7 +16,6 @@
*/
package com.djrapitops.plan.gathering.importing.importers;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.delivery.domain.Nickname;
import com.djrapitops.plan.gathering.domain.*;
import com.djrapitops.plan.gathering.geolocation.GeolocationCache;
@ -29,7 +28,6 @@ import com.djrapitops.plan.storage.database.Database;
import com.djrapitops.plan.storage.database.queries.LargeStoreQueries;
import com.djrapitops.plan.storage.database.queries.objects.UserIdentifierQueries;
import com.djrapitops.plan.storage.database.transactions.Transaction;
import com.djrapitops.plugin.utilities.Verify;
import java.util.*;
import java.util.concurrent.ExecutorService;
@ -49,10 +47,8 @@ public abstract class BukkitImporter implements Importer {
private final GeolocationCache geolocationCache;
private final DBSystem dbSystem;
private final String name;
private final Plan plugin;
protected BukkitImporter(
Plan plugin,
GeolocationCache geolocationCache,
DBSystem dbSystem,
ServerInfo serverInfo,
@ -63,7 +59,6 @@ public abstract class BukkitImporter implements Importer {
this.serverUUID = serverInfo::getServerUUID;
this.name = name;
this.plugin = plugin;
}
@Override
@ -105,11 +100,11 @@ public abstract class BukkitImporter implements Importer {
private void processUserData() {
List<UserImportData> userImportData = getUserImportData();
if (Verify.isEmpty(userImportData)) {
if (userImportData == null || userImportData.isEmpty()) {
return;
}
BukkitUserImportRefiner userImportRefiner = new BukkitUserImportRefiner(plugin, userImportData);
BukkitUserImportRefiner userImportRefiner = new BukkitUserImportRefiner(userImportData);
userImportData = userImportRefiner.refineData();
Database db = dbSystem.getDatabase();

View File

@ -16,7 +16,6 @@
*/
package com.djrapitops.plan.gathering.importing.importers;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.gathering.geolocation.GeolocationCache;
import com.djrapitops.plan.gathering.importing.data.ServerImportData;
import com.djrapitops.plan.gathering.importing.data.UserImportData;
@ -40,12 +39,11 @@ public class OfflinePlayerImporter extends BukkitImporter {
@Inject
public OfflinePlayerImporter(
Plan plugin,
GeolocationCache geolocationCache,
DBSystem dbSystem,
ServerInfo serverInfo
) {
super(plugin, geolocationCache, dbSystem, serverInfo, "offline");
super(geolocationCache, dbSystem, serverInfo, "offline");
}
@Override

View File

@ -16,19 +16,18 @@
*/
package com.djrapitops.plan.gathering.listeners;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.api.events.PlanBukkitEnableEvent;
import com.djrapitops.plan.capability.CapabilitySvc;
import com.djrapitops.plan.gathering.listeners.bukkit.*;
import net.playeranalytics.plugin.server.Listeners;
import org.bukkit.Bukkit;
import org.bukkit.event.HandlerList;
import javax.inject.Inject;
public class BukkitListenerSystem extends ListenerSystem {
private final Plan plugin;
private final Listeners listeners;
private final Status status;
private final PlayerOnlineListener playerOnlineListener;
@ -40,7 +39,7 @@ public class BukkitListenerSystem extends ListenerSystem {
@Inject
public BukkitListenerSystem(
Plan plugin,
Listeners listeners,
Status status,
PlayerOnlineListener playerOnlineListener,
ChatListener chatListener,
@ -49,7 +48,7 @@ public class BukkitListenerSystem extends ListenerSystem {
DeathEventListener deathEventListener,
BukkitAFKListener afkListener
) {
this.plugin = plugin;
this.listeners = listeners;
this.status = status;
this.playerOnlineListener = playerOnlineListener;
@ -62,20 +61,18 @@ public class BukkitListenerSystem extends ListenerSystem {
@Override
protected void registerListeners() {
plugin.registerListener(
playerOnlineListener,
chatListener,
gamemodeChangeListener,
worldChangeListener,
deathEventListener,
afkListener
);
listeners.registerListener(playerOnlineListener);
listeners.registerListener(chatListener);
listeners.registerListener(gamemodeChangeListener);
listeners.registerListener(worldChangeListener);
listeners.registerListener(deathEventListener);
listeners.registerListener(afkListener);
status.setCountKicks(true);
}
@Override
protected void unregisterListeners() {
HandlerList.unregisterAll(plugin);
listeners.unregisterListeners();
}
@Override

View File

@ -21,7 +21,6 @@ import com.djrapitops.plan.settings.Permissions;
import com.djrapitops.plan.settings.config.PlanConfig;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.logging.L;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@ -80,7 +79,7 @@ public class BukkitAFKListener implements Listener {
AFK_TRACKER.performedAction(uuid, time);
} catch (Exception e) {
errorLogger.log(L.ERROR, e, ErrorContext.builder().related(event).build());
errorLogger.error(e, ErrorContext.builder().related(event).build());
}
}

View File

@ -23,7 +23,6 @@ import com.djrapitops.plan.storage.database.DBSystem;
import com.djrapitops.plan.storage.database.transactions.events.NicknameStoreTransaction;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.logging.L;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@ -67,7 +66,7 @@ public class ChatListener implements Listener {
try {
actOnChatEvent(event);
} catch (Exception e) {
errorLogger.log(L.ERROR, e, ErrorContext.builder().related(event).build());
errorLogger.error(e, ErrorContext.builder().related(event).build());
}
}

View File

@ -25,7 +25,6 @@ import com.djrapitops.plan.processing.processors.player.MobKillProcessor;
import com.djrapitops.plan.processing.processors.player.PlayerKillProcessor;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.logging.L;
import org.bukkit.Material;
import org.bukkit.entity.*;
import org.bukkit.event.EventHandler;
@ -80,7 +79,7 @@ public class DeathEventListener implements Listener {
UUID uuid = dead instanceof Player ? dead.getUniqueId() : null;
handleKill(time, uuid, killerEntity);
} catch (Exception e) {
errorLogger.log(L.ERROR, e, ErrorContext.builder().related(event, dead).build());
errorLogger.error(e, ErrorContext.builder().related(event, dead).build());
}
}

View File

@ -24,7 +24,6 @@ import com.djrapitops.plan.storage.database.DBSystem;
import com.djrapitops.plan.storage.database.transactions.events.WorldNameStoreTransaction;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.logging.L;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@ -68,7 +67,7 @@ public class GameModeChangeListener implements Listener {
try {
actOnEvent(event);
} catch (Exception e) {
errorLogger.log(L.ERROR, e, ErrorContext.builder().related(event, event.getPlayer().getGameMode() + "->" + event.getNewGameMode()).build());
errorLogger.error(e, ErrorContext.builder().related(event, event.getPlayer().getGameMode() + "->" + event.getNewGameMode()).build());
}
}

View File

@ -36,7 +36,6 @@ import com.djrapitops.plan.storage.database.Database;
import com.djrapitops.plan.storage.database.transactions.events.*;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.logging.L;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@ -106,7 +105,7 @@ public class PlayerOnlineListener implements Listener {
dbSystem.getDatabase().executeTransaction(new BanStatusTransaction(playerUUID, () -> banned));
dbSystem.getDatabase().executeTransaction(new OperatorStatusTransaction(playerUUID, operator));
} catch (Exception e) {
errorLogger.log(L.ERROR, e, ErrorContext.builder().related(event, event.getResult()).build());
errorLogger.error(e, ErrorContext.builder().related(event, event.getResult()).build());
}
}
@ -131,7 +130,7 @@ public class PlayerOnlineListener implements Listener {
dbSystem.getDatabase().executeTransaction(new KickStoreTransaction(uuid));
} catch (Exception e) {
errorLogger.log(L.ERROR, e, ErrorContext.builder().related(event).build());
errorLogger.error(e, ErrorContext.builder().related(event).build());
}
}
@ -140,7 +139,7 @@ public class PlayerOnlineListener implements Listener {
try {
actOnJoinEvent(event);
} catch (Exception e) {
errorLogger.log(L.ERROR, e, ErrorContext.builder().related(event).build());
errorLogger.error(e, ErrorContext.builder().related(event).build());
}
}
@ -205,7 +204,7 @@ public class PlayerOnlineListener implements Listener {
try {
actOnQuitEvent(event);
} catch (Exception e) {
errorLogger.log(L.ERROR, e, ErrorContext.builder().related(event).build());
errorLogger.error(e, ErrorContext.builder().related(event).build());
}
}

View File

@ -24,7 +24,6 @@ import com.djrapitops.plan.storage.database.DBSystem;
import com.djrapitops.plan.storage.database.transactions.events.WorldNameStoreTransaction;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.logging.L;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@ -60,7 +59,7 @@ public class WorldChangeListener implements Listener {
try {
actOnEvent(event);
} catch (Exception e) {
errorLogger.log(L.ERROR, e, ErrorContext.builder().related(event).build());
errorLogger.error(e, ErrorContext.builder().related(event).build());
}
}

View File

@ -23,7 +23,6 @@
*/
package com.djrapitops.plan.gathering.timed;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.TaskSystem;
import com.djrapitops.plan.delivery.domain.DateObj;
import com.djrapitops.plan.identification.ServerInfo;
@ -33,9 +32,9 @@ import com.djrapitops.plan.settings.config.paths.TimeSettings;
import com.djrapitops.plan.storage.database.DBSystem;
import com.djrapitops.plan.storage.database.transactions.events.PingStoreTransaction;
import com.djrapitops.plan.utilities.java.Reflection;
import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory;
import net.playeranalytics.plugin.scheduling.RunnableFactory;
import net.playeranalytics.plugin.scheduling.TimeAmount;
import net.playeranalytics.plugin.server.Listeners;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@ -75,7 +74,7 @@ public class BukkitPingCounter extends TaskSystem.Task implements Listener {
private final Map<UUID, List<DateObj<Integer>>> playerHistory;
private final Plan plugin;
private final Listeners listeners;
private final PlanConfig config;
private final DBSystem dbSystem;
private final ServerInfo serverInfo;
@ -83,13 +82,13 @@ public class BukkitPingCounter extends TaskSystem.Task implements Listener {
@Inject
public BukkitPingCounter(
Plan plugin,
Listeners listeners,
PlanConfig config,
DBSystem dbSystem,
ServerInfo serverInfo,
RunnableFactory runnableFactory
) {
this.plugin = plugin;
this.listeners = listeners;
BukkitPingCounter.loadPingMethodDetails();
this.config = config;
this.dbSystem = dbSystem;
@ -146,10 +145,10 @@ public class BukkitPingCounter extends TaskSystem.Task implements Listener {
public void register(RunnableFactory runnableFactory) {
Long startDelay = config.get(TimeSettings.PING_SERVER_ENABLE_DELAY);
if (startDelay < TimeUnit.HOURS.toMillis(1L) && config.isTrue(DataGatheringSettings.PING)) {
plugin.registerListener(this);
listeners.registerListener(this);
long delay = TimeAmount.toTicks(startDelay, TimeUnit.MILLISECONDS);
long period = 40L;
runnableFactory.create(null, this).runTaskTimer(delay, period);
runnableFactory.create(this).runTaskTimer(delay, period);
}
}
@ -217,12 +216,9 @@ public class BukkitPingCounter extends TaskSystem.Task implements Listener {
if (pingDelay >= TimeUnit.HOURS.toMillis(2L)) {
return;
}
runnableFactory.create("Add Player to Ping list", new AbsRunnable() {
@Override
public void run() {
if (player.isOnline()) {
addPlayer(player);
}
runnableFactory.create(() -> {
if (player.isOnline()) {
addPlayer(player);
}
}).runTaskLater(TimeAmount.toTicks(pingDelay, TimeUnit.MILLISECONDS));
}

View File

@ -18,13 +18,18 @@ package com.djrapitops.plan.identification.properties;
import org.bukkit.Server;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* ServerProperties for Bukkit.
*
* @author AuroraLS3
*/
@Singleton
public class BukkitServerProperties extends ServerProperties {
@Inject
public BukkitServerProperties(Server server) {
super(
server.getName(),

View File

@ -16,8 +16,6 @@
*/
package com.djrapitops.plan.modules.bukkit;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.gathering.importing.importers.Importer;
import com.djrapitops.plan.gathering.importing.importers.OfflinePlayerImporter;
import dagger.Binds;
@ -31,10 +29,6 @@ import dagger.multibindings.IntoSet;
*/
@Module
public interface BukkitPlanModule {
@Binds
PlanPlugin bindPlanPlugin(Plan plugin);
@Binds
@IntoSet
Importer bindOfflinePlayerImporter(OfflinePlayerImporter importer);

View File

@ -16,7 +16,6 @@
*/
package com.djrapitops.plan.modules.bukkit;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.identification.properties.BukkitServerProperties;
import com.djrapitops.plan.identification.properties.ServerProperties;
import dagger.Module;
@ -34,7 +33,7 @@ public class BukkitServerPropertiesModule {
@Provides
@Singleton
ServerProperties provideServerProperties(Plan plugin) {
return new BukkitServerProperties(plugin.getServer());
ServerProperties provideServerProperties(BukkitServerProperties serverProperties) {
return serverProperties;
}
}

View File

@ -19,7 +19,7 @@ package com.djrapitops.plan.storage.database;
import com.djrapitops.plan.settings.config.PlanConfig;
import com.djrapitops.plan.settings.config.paths.DatabaseSettings;
import com.djrapitops.plan.settings.locale.Locale;
import com.djrapitops.plugin.logging.console.PluginLogger;
import net.playeranalytics.plugin.server.PluginLogger;
import javax.inject.Inject;
import javax.inject.Singleton;

View File

@ -17,12 +17,19 @@
package utilities.mocks;
import com.djrapitops.plan.DaggerPlanBukkitComponent;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.PlanBukkitComponent;
import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.PlanSystem;
import org.bukkit.Server;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.scheduler.BukkitScheduler;
import org.mockito.Mockito;
import utilities.TestConstants;
import java.nio.file.Path;
import static org.mockito.Mockito.doReturn;
/**
* Test utility for creating a dagger PlanComponent using a mocked Plan.
*
@ -32,20 +39,17 @@ public class BukkitMockComponent {
private final Path tempDir;
private Plan planMock;
private PlanPlugin planMock;
private PlanBukkitComponent component;
public BukkitMockComponent(Path tempDir) {
this.tempDir = tempDir;
}
public Plan getPlanMock() throws Exception {
public PlanPlugin getPlanMock() throws Exception {
if (planMock == null) {
planMock = PlanBukkitMocker.setUp()
.withDataFolder(tempDir.toFile())
.withPluginDescription()
.withResourceFetchingFromJar()
.withServer()
planMock = PlanPluginMocker.setUp()
.withDataFolder(tempDir.resolve("data").toFile())
.getPlanMock();
}
return planMock;
@ -53,8 +57,30 @@ public class BukkitMockComponent {
public PlanSystem getPlanSystem() throws Exception {
if (component == null) {
component = DaggerPlanBukkitComponent.builder().plan(getPlanMock()).build();
PlanPlugin planMock = getPlanMock();
component = DaggerPlanBukkitComponent.builder()
.plan(planMock)
.abstractionLayer(new TestPlatformAbstractionLayer(planMock))
.server(mockServer())
.build();
}
return component.system();
}
private Server mockServer() {
Server serverMock = Mockito.mock(Server.class);
doReturn("").when(serverMock).getIp();
doReturn("Bukkit").when(serverMock).getName();
doReturn(25565).when(serverMock).getPort();
doReturn("1.12.2").when(serverMock).getVersion();
doReturn("32423").when(serverMock).getBukkitVersion();
doReturn(TestConstants.SERVER_MAX_PLAYERS).when(serverMock).getMaxPlayers();
ConsoleCommandSender sender = Mockito.mock(ConsoleCommandSender.class);
doReturn(sender).when(serverMock).getConsoleSender();
BukkitScheduler bukkitScheduler = Mockito.mock(BukkitScheduler.class);
doReturn(bukkitScheduler).when(serverMock).getScheduler();
return serverMock;
}
}

View File

@ -1,128 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package utilities.mocks;
import com.djrapitops.plan.Plan;
import com.djrapitops.plugin.benchmarking.Timings;
import com.djrapitops.plugin.command.ColorScheme;
import com.djrapitops.plugin.logging.console.PluginLogger;
import com.djrapitops.plugin.logging.console.TestPluginLogger;
import com.djrapitops.plugin.logging.debug.CombineDebugLogger;
import com.djrapitops.plugin.logging.debug.DebugLogger;
import com.djrapitops.plugin.logging.debug.MemoryDebugLogger;
import com.djrapitops.plugin.logging.error.ConsoleErrorLogger;
import com.djrapitops.plugin.logging.error.ErrorHandler;
import com.djrapitops.plugin.task.RunnableFactory;
import org.bukkit.Server;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.plugin.InvalidDescriptionException;
import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.scheduler.BukkitScheduler;
import org.mockito.Mockito;
import utilities.TestConstants;
import utilities.mocks.objects.TestLogger;
import utilities.mocks.objects.TestRunnableFactory;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import static org.mockito.Mockito.doReturn;
/**
* Mocking Utility for Bukkit version of Plan.
*
* @author AuroraLS3
*/
public class PlanBukkitMocker extends Mocker {
private Plan planMock;
private PlanBukkitMocker() {
}
public static PlanBukkitMocker setUp() {
return new PlanBukkitMocker().mockPlugin();
}
private PlanBukkitMocker mockPlugin() {
planMock = Mockito.mock(Plan.class);
super.planMock = planMock;
doReturn(new ColorScheme("§1", "§2", "§3")).when(planMock).getColorScheme();
doReturn("1.0.0").when(planMock).getVersion();
TestLogger testLogger = new TestLogger();
RunnableFactory runnableFactory = new TestRunnableFactory();
PluginLogger testPluginLogger = new TestPluginLogger();
DebugLogger debugLogger = new CombineDebugLogger(new MemoryDebugLogger());
ErrorHandler consoleErrorLogger = new ConsoleErrorLogger(testPluginLogger);
Timings timings = new Timings(debugLogger);
doReturn(testLogger).when(planMock).getLogger();
doReturn(runnableFactory).when(planMock).getRunnableFactory();
doReturn(testPluginLogger).when(planMock).getPluginLogger();
doReturn(debugLogger).when(planMock).getDebugLogger();
doReturn(consoleErrorLogger).when(planMock).getErrorHandler();
doReturn(timings).when(planMock).getTimings();
return this;
}
PlanBukkitMocker withDataFolder(File tempFolder) {
doReturn(tempFolder).when(planMock).getDataFolder();
return this;
}
PlanBukkitMocker withPluginDescription() {
try (InputStream in = Files.newInputStream(getFile("/plugin.yml").toPath())) {
PluginDescriptionFile description = new PluginDescriptionFile(in);
doReturn(description).when(planMock).getDescription();
} catch (IOException | InvalidDescriptionException e) {
System.out.println("Error while setting plugin description");
}
return this;
}
PlanBukkitMocker withResourceFetchingFromJar() {
withPluginFiles();
return this;
}
PlanBukkitMocker withServer() {
Server serverMock = Mockito.mock(Server.class);
doReturn("").when(serverMock).getIp();
doReturn("Bukkit").when(serverMock).getName();
doReturn(25565).when(serverMock).getPort();
doReturn("1.12.2").when(serverMock).getVersion();
doReturn("32423").when(serverMock).getBukkitVersion();
doReturn(TestConstants.SERVER_MAX_PLAYERS).when(serverMock).getMaxPlayers();
ConsoleCommandSender sender = Mockito.mock(ConsoleCommandSender.class);
doReturn(sender).when(serverMock).getConsoleSender();
BukkitScheduler bukkitScheduler = Mockito.mock(BukkitScheduler.class);
doReturn(bukkitScheduler).when(serverMock).getScheduler();
doReturn(serverMock).when(planMock).getServer();
return this;
}
Plan getPlanMock() {
return planMock;
}
}

View File

@ -3,7 +3,7 @@ dependencies {
compile project(path: ":common", configuration: 'shadow')
compileOnly project(":api")
compile "com.djrapitops:AbstractPluginFramework-bungeecord:$abstractPluginFrameworkVersion"
compile "net.playeranalytics:platform-abstraction-layer-bungeecord:$palVersion"
compile "org.bstats:bstats-bungeecord:$bstatsVersion"
compileOnly "net.md-5:bungeecord-api:$bungeeVersion"

View File

@ -17,30 +17,44 @@
package com.djrapitops.plan;
import com.djrapitops.plan.command.use.BungeeCommand;
import com.djrapitops.plan.commands.use.ColorScheme;
import com.djrapitops.plan.commands.use.Subcommand;
import com.djrapitops.plan.exceptions.EnableException;
import com.djrapitops.plan.settings.locale.Locale;
import com.djrapitops.plan.settings.locale.lang.PluginLang;
import com.djrapitops.plan.settings.theme.PlanColorScheme;
import com.djrapitops.plugin.BungeePlugin;
import com.djrapitops.plugin.command.ColorScheme;
import com.djrapitops.plugin.logging.L;
import net.md_5.bungee.api.plugin.Plugin;
import net.playeranalytics.plugin.BungeePlatformLayer;
import net.playeranalytics.plugin.PlatformAbstractionLayer;
import net.playeranalytics.plugin.scheduling.RunnableFactory;
import net.playeranalytics.plugin.server.PluginLogger;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Bungee Main class.
*
* @author AuroraLS3
*/
public class PlanBungee extends BungeePlugin implements PlanPlugin {
public class PlanBungee extends Plugin implements PlanPlugin {
private PlanSystem system;
private Locale locale;
private PluginLogger logger;
private RunnableFactory runnableFactory;
@Override
public void onEnable() {
PlanBungeeComponent component = DaggerPlanBungeeComponent.builder().plan(this).build();
PlatformAbstractionLayer abstractionLayer = new BungeePlatformLayer(this);
logger = abstractionLayer.getPluginLogger();
runnableFactory = abstractionLayer.getRunnableFactory();
PlanBungeeComponent component = DaggerPlanBungeeComponent.builder()
.plan(this)
.abstractionLayer(abstractionLayer)
.build();
try {
system = component.system();
locale = system.getLocaleSystem().getLocale();
@ -61,7 +75,8 @@ public class PlanBungee extends BungeePlugin implements PlanPlugin {
logger.error("Plugin Failed to Initialize Correctly. If this issue is caused by config settings you can use /planbungee reload");
onDisable();
} catch (Exception e) {
errorHandler.log(L.CRITICAL, this.getClass(), e);
String version = abstractionLayer.getPluginInformation().getVersion();
Logger.getGlobal().log(Level.SEVERE, e, () -> this.getClass().getSimpleName() + "-v" + version);
logger.error("Plugin Failed to Initialize Correctly. If this issue is caused by config settings you can use /planbungee reload");
logger.error("This error should be reported at https://github.com/plan-player-analytics/Plan/issues");
onDisable();
@ -74,22 +89,12 @@ public class PlanBungee extends BungeePlugin implements PlanPlugin {
@Override
public void onDisable() {
cancelAllTasks();
runnableFactory.cancelAllKnownTasks();
if (system != null) system.disable();
logger.info(locale.getString(PluginLang.DISABLED));
}
@Override
public String getVersion() {
return super.getDescription().getVersion();
}
@Override
public void onReload() {
// Nothing to be done, systems are disabled
}
@Override
public void registerCommand(Subcommand command) {
if (command == null) {
@ -115,9 +120,4 @@ public class PlanBungee extends BungeePlugin implements PlanPlugin {
public PlanSystem getSystem() {
return system;
}
@Override
public boolean isReloading() {
return reloading;
}
}

View File

@ -21,6 +21,7 @@ import com.djrapitops.plan.modules.*;
import com.djrapitops.plan.modules.bungee.*;
import dagger.BindsInstance;
import dagger.Component;
import net.playeranalytics.plugin.PlatformAbstractionLayer;
import javax.inject.Singleton;
@ -34,7 +35,7 @@ import javax.inject.Singleton;
BungeePlanModule.class,
BungeeCommandModule.class,
SystemObjectProvidingModule.class,
APFModule.class,
PlatformAbstractionLayerModule.class,
FiltersModule.class,
PlaceholderModule.class,
@ -55,6 +56,9 @@ public interface PlanBungeeComponent {
@BindsInstance
Builder plan(PlanBungee plan);
@BindsInstance
Builder abstractionLayer(PlatformAbstractionLayer abstractionLayer);
PlanBungeeComponent build();
}
}

View File

@ -21,13 +21,11 @@ import com.djrapitops.plan.commands.use.CMDSender;
import com.djrapitops.plan.commands.use.Subcommand;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.logging.L;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.plugin.Command;
import net.md_5.bungee.api.plugin.TabExecutor;
import net.playeranalytics.plugin.scheduling.RunnableFactory;
import java.util.Arrays;
import java.util.Collections;
@ -61,17 +59,14 @@ public class BungeeCommand extends Command implements TabExecutor {
@Override
public void execute(CommandSender sender, String[] args) {
runnableFactory.create("", new AbsRunnable() {
@Override
public void run() {
try {
command.getExecutor().accept(getSender(sender), new Arguments(args));
} catch (Exception e) {
errorLogger.log(L.ERROR, e, ErrorContext.builder()
.related(sender.getClass())
.related(Arrays.toString(args))
.build());
}
runnableFactory.create(() -> {
try {
command.getExecutor().accept(getSender(sender), new Arguments(args));
} catch (Exception e) {
errorLogger.error(e, ErrorContext.builder()
.related(sender.getClass())
.related(Arrays.toString(args))
.build());
}
}).runTaskAsynchronously();
}
@ -81,7 +76,7 @@ public class BungeeCommand extends Command implements TabExecutor {
try {
return command.getArgumentResolver().apply(getSender(sender), new Arguments(args));
} catch (Exception e) {
errorLogger.log(L.ERROR, e, ErrorContext.builder()
errorLogger.error(e, ErrorContext.builder()
.related(sender.getClass())
.related("tab completion")
.related(Arrays.toString(args))

View File

@ -21,28 +21,29 @@ import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.api.events.PlanBungeeEnableEvent;
import com.djrapitops.plan.capability.CapabilitySvc;
import com.djrapitops.plan.gathering.listeners.bungee.PlayerOnlineListener;
import net.playeranalytics.plugin.server.Listeners;
import javax.inject.Inject;
public class BungeeListenerSystem extends ListenerSystem {
private final PlanBungee plugin;
private PlayerOnlineListener playerOnlineListener;
private final Listeners listeners;
private final PlayerOnlineListener playerOnlineListener;
@Inject
public BungeeListenerSystem(PlanBungee plugin, PlayerOnlineListener playerOnlineListener) {
this.plugin = plugin;
public BungeeListenerSystem(Listeners listeners, PlayerOnlineListener playerOnlineListener) {
this.listeners = listeners;
this.playerOnlineListener = playerOnlineListener;
}
@Override
protected void registerListeners() {
plugin.registerListener(playerOnlineListener);
listeners.registerListener(playerOnlineListener);
}
@Override
protected void unregisterListeners() {
plugin.getProxy().getPluginManager().unregisterListeners(plugin);
listeners.unregisterListeners();
}
@Override

View File

@ -34,7 +34,6 @@ import com.djrapitops.plan.storage.database.transactions.events.GeoInfoStoreTran
import com.djrapitops.plan.storage.database.transactions.events.PlayerRegisterTransaction;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.logging.L;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.PlayerDisconnectEvent;
import net.md_5.bungee.api.event.PostLoginEvent;
@ -91,7 +90,7 @@ public class PlayerOnlineListener implements Listener {
try {
actOnLogin(event);
} catch (Exception e) {
errorLogger.log(L.ERROR, e, ErrorContext.builder().related(event).build());
errorLogger.error(e, ErrorContext.builder().related(event).build());
}
}
@ -135,7 +134,7 @@ public class PlayerOnlineListener implements Listener {
try {
actOnLogout(event);
} catch (Exception e) {
errorLogger.log(L.ERROR, e, ErrorContext.builder().related(event).build());
errorLogger.error(e, ErrorContext.builder().related(event).build());
}
}
@ -155,7 +154,7 @@ public class PlayerOnlineListener implements Listener {
try {
actOnServerSwitch(event);
} catch (Exception e) {
errorLogger.log(L.ERROR, e, ErrorContext.builder().related(event).build());
errorLogger.error(e, ErrorContext.builder().related(event).build());
}
}

View File

@ -23,7 +23,6 @@
*/
package com.djrapitops.plan.gathering.timed;
import com.djrapitops.plan.PlanBungee;
import com.djrapitops.plan.TaskSystem;
import com.djrapitops.plan.delivery.domain.DateObj;
import com.djrapitops.plan.identification.ServerInfo;
@ -32,15 +31,15 @@ import com.djrapitops.plan.settings.config.paths.DataGatheringSettings;
import com.djrapitops.plan.settings.config.paths.TimeSettings;
import com.djrapitops.plan.storage.database.DBSystem;
import com.djrapitops.plan.storage.database.transactions.events.PingStoreTransaction;
import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.ServerConnectedEvent;
import net.md_5.bungee.api.event.ServerDisconnectEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
import net.playeranalytics.plugin.scheduling.RunnableFactory;
import net.playeranalytics.plugin.scheduling.TimeAmount;
import net.playeranalytics.plugin.server.Listeners;
import javax.inject.Inject;
import javax.inject.Singleton;
@ -57,7 +56,7 @@ public class BungeePingCounter extends TaskSystem.Task implements Listener {
private final Map<UUID, List<DateObj<Integer>>> playerHistory;
private final PlanBungee plugin;
private final Listeners listeners;
private final PlanConfig config;
private final DBSystem dbSystem;
private final ServerInfo serverInfo;
@ -65,13 +64,13 @@ public class BungeePingCounter extends TaskSystem.Task implements Listener {
@Inject
public BungeePingCounter(
PlanBungee plugin,
Listeners listeners,
PlanConfig config,
DBSystem dbSystem,
ServerInfo serverInfo,
RunnableFactory runnableFactory
) {
this.plugin = plugin;
this.listeners = listeners;
this.config = config;
this.dbSystem = dbSystem;
this.serverInfo = serverInfo;
@ -112,11 +111,11 @@ public class BungeePingCounter extends TaskSystem.Task implements Listener {
public void register(RunnableFactory runnableFactory) {
Long startDelay = config.get(TimeSettings.PING_SERVER_ENABLE_DELAY);
if (startDelay < TimeUnit.HOURS.toMillis(1L) && config.isTrue(DataGatheringSettings.PING)) {
plugin.registerListener(this);
listeners.registerListener(this);
long delay = TimeAmount.toTicks(startDelay, TimeUnit.MILLISECONDS);
long period = 40L;
runnableFactory.create(null, this).runTaskTimerAsynchronously(delay, period);
runnableFactory.create(this).runTaskTimerAsynchronously(delay, period);
}
}
@ -139,12 +138,9 @@ public class BungeePingCounter extends TaskSystem.Task implements Listener {
if (pingDelay >= TimeUnit.HOURS.toMillis(2L)) {
return;
}
runnableFactory.create("Add Player to Ping list", new AbsRunnable() {
@Override
public void run() {
if (player.isConnected()) {
addPlayer(player);
}
runnableFactory.create(() -> {
if (player.isConnected()) {
addPlayer(player);
}
}).runTaskLater(TimeAmount.toTicks(pingDelay, TimeUnit.MILLISECONDS));
}

View File

@ -23,7 +23,7 @@ import com.djrapitops.plan.identification.storage.ServerDBLoader;
import com.djrapitops.plan.identification.storage.ServerFileLoader;
import com.djrapitops.plan.identification.storage.ServerLoader;
import com.djrapitops.plan.processing.Processing;
import com.djrapitops.plugin.logging.console.PluginLogger;
import net.playeranalytics.plugin.server.PluginLogger;
import javax.inject.Inject;
import javax.inject.Singleton;

View File

@ -16,8 +16,6 @@
*/
package com.djrapitops.plan.identification.properties;
import com.djrapitops.plugin.api.Check;
/**
* Utility class for checking if RedisBungee API is available.
*
@ -30,7 +28,12 @@ public class RedisCheck {
}
public static boolean isClassAvailable() {
return Check.isAvailable("com.imaginarycode.minecraft.redisbungee.RedisBungeeAPI");
try {
Class.forName("com.imaginarycode.minecraft.redisbungee.RedisBungeeAPI");
return true;
} catch (ClassNotFoundException e) {
return false;
}
}
}

View File

@ -53,7 +53,11 @@ public class BungeeMockComponent {
public PlanSystem getPlanSystem() throws Exception {
if (component == null) {
component = DaggerPlanBungeeComponent.builder().plan(getPlanMock()).build();
PlanBungee planMock = getPlanMock();
component = DaggerPlanBungeeComponent.builder()
.plan(planMock)
.abstractionLayer(new TestPlatformAbstractionLayer(this.planMock))
.build();
}
return component.system();
}

View File

@ -17,16 +17,7 @@
package utilities.mocks;
import com.djrapitops.plan.PlanBungee;
import com.djrapitops.plugin.benchmarking.Timings;
import com.djrapitops.plugin.command.ColorScheme;
import com.djrapitops.plugin.logging.console.PluginLogger;
import com.djrapitops.plugin.logging.console.TestPluginLogger;
import com.djrapitops.plugin.logging.debug.CombineDebugLogger;
import com.djrapitops.plugin.logging.debug.DebugLogger;
import com.djrapitops.plugin.logging.debug.MemoryDebugLogger;
import com.djrapitops.plugin.logging.error.ConsoleErrorLogger;
import com.djrapitops.plugin.logging.error.ErrorHandler;
import com.djrapitops.plugin.task.RunnableFactory;
import com.djrapitops.plan.commands.use.ColorScheme;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.ProxyConfig;
import net.md_5.bungee.api.ProxyServer;
@ -35,7 +26,6 @@ import net.md_5.bungee.api.plugin.PluginManager;
import org.mockito.Mockito;
import utilities.TestConstants;
import utilities.mocks.objects.TestLogger;
import utilities.mocks.objects.TestRunnableFactory;
import java.io.File;
import java.util.HashSet;
@ -64,21 +54,10 @@ public class PlanBungeeMocker extends Mocker {
super.planMock = planMock;
doReturn(new ColorScheme("§1", "§2", "§3")).when(planMock).getColorScheme();
doReturn("1.0.0").when(planMock).getVersion();
TestLogger testLogger = new TestLogger();
RunnableFactory runnableFactory = new TestRunnableFactory();
PluginLogger testPluginLogger = new TestPluginLogger();
DebugLogger debugLogger = new CombineDebugLogger(new MemoryDebugLogger());
ErrorHandler consoleErrorLogger = new ConsoleErrorLogger(testPluginLogger);
Timings timings = new Timings(debugLogger);
doReturn(testLogger).when(planMock).getLogger();
doReturn(runnableFactory).when(planMock).getRunnableFactory();
doReturn(testPluginLogger).when(planMock).getPluginLogger();
doReturn(debugLogger).when(planMock).getDebugLogger();
doReturn(consoleErrorLogger).when(planMock).getErrorHandler();
doReturn(timings).when(planMock).getTimings();
return this;
}
@ -89,7 +68,6 @@ public class PlanBungeeMocker extends Mocker {
}
PlanBungeeMocker withResourceFetchingFromJar() throws Exception {
withPluginFiles();
return this;
}

View File

@ -1,5 +1,5 @@
dependencies {
compile "com.djrapitops:AbstractPluginFramework-api:$abstractPluginFrameworkVersion"
compile "net.playeranalytics:platform-abstraction-layer-api:$palVersion"
compile project(":api")
compileOnly project(":extensions")
compile project(path: ":extensions", configuration: 'shadow')

View File

@ -1,35 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.plan;
/**
* Identifiers for different Debug channels.
*
* @author AuroraLS3
*/
public class DebugChannels {
private DebugChannels() {
/* Static variable class */
}
public static final String IMPORTING = "Importing";
public static final String SQL = "SQL";
public static final String DATA_EXTENSIONS = "DataExtensions";
public static final String JSON_CACHE = "JSON Cache";
}

View File

@ -16,9 +16,8 @@
*/
package com.djrapitops.plan;
import com.djrapitops.plan.commands.use.ColorScheme;
import com.djrapitops.plan.commands.use.Subcommand;
import com.djrapitops.plugin.IPlugin;
import com.djrapitops.plugin.command.ColorScheme;
import java.io.File;
import java.io.InputStream;
@ -28,18 +27,12 @@ import java.io.InputStream;
*
* @author AuroraLS3
*/
public interface PlanPlugin extends IPlugin {
@Override
File getDataFolder();
public interface PlanPlugin {
InputStream getResource(String resource);
ColorScheme getColorScheme();
@Override
boolean isReloading();
PlanSystem getSystem();
default boolean isSystemEnabled() {
@ -48,7 +41,11 @@ public interface PlanPlugin extends IPlugin {
void registerCommand(Subcommand command);
default void cancelAllTasks() {
getRunnableFactory().cancelAllKnownTasks();
}
void onEnable();
void onDisable();
@Deprecated
File getDataFolder();
}

View File

@ -39,10 +39,7 @@ import com.djrapitops.plan.storage.file.PlanFiles;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plan.version.VersionChecker;
import com.djrapitops.plugin.benchmarking.Benchmark;
import com.djrapitops.plugin.benchmarking.Timings;
import com.djrapitops.plugin.logging.L;
import com.djrapitops.plugin.logging.console.PluginLogger;
import net.playeranalytics.plugin.server.PluginLogger;
import javax.inject.Inject;
import javax.inject.Singleton;
@ -81,7 +78,6 @@ public class PlanSystem implements SubSystem {
private final QuerySvc queryService;
private final SettingsSvc settingsService;
private final PluginLogger logger;
private final Timings timings;
private final ErrorLogger errorLogger;
@Inject
@ -106,7 +102,6 @@ public class PlanSystem implements SubSystem {
QuerySvc queryService,
SettingsSvc settingsService,
PluginLogger logger,
Timings timings,
ErrorLogger errorLogger,
PlanAPI.PlanAPIHolder apiHolder
) {
@ -130,17 +125,14 @@ public class PlanSystem implements SubSystem {
this.queryService = queryService;
this.settingsService = settingsService;
this.logger = logger;
this.timings = timings;
this.errorLogger = errorLogger;
logger.log(L.INFO_COLOR,
"",
"§2 ██▌",
"§2 ██▌ ██▌",
"§2 ██▌██▌██▌██▌ §2Player Analytics",
"§2 ██▌██▌██▌██▌ §fv" + versionChecker.getCurrentVersion(),
""
);
logger.info("");
logger.info("§2 ██▌");
logger.info("§2 ██▌ ██▌");
logger.info("§2 ██▌██▌██▌██▌ §2Player Analytics");
logger.info("§2 ██▌██▌██▌██▌ §fv" + versionChecker.getCurrentVersion());
logger.info("");
}
@Deprecated
@ -185,13 +177,7 @@ public class PlanSystem implements SubSystem {
private void enableSystems(SubSystem... systems) {
for (SubSystem system : systems) {
logger.debug("Enabling: " + system.getClass().getSimpleName());
timings.start("subsystem-enable");
system.enable();
timings.end("subsystem-enable")
.map(Benchmark::toDurationString)
.map(duration -> "Took " + duration)
.ifPresent(logger::debug);
}
}
@ -222,7 +208,7 @@ public class PlanSystem implements SubSystem {
system.disable();
}
} catch (Exception e) {
errorLogger.log(L.WARN, e, ErrorContext.builder().related("Disabling PlanSystem: " + system).build());
errorLogger.warn(e, ErrorContext.builder().related("Disabling PlanSystem: " + system).build());
}
}
}

View File

@ -16,8 +16,8 @@
*/
package com.djrapitops.plan;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory;
import net.playeranalytics.plugin.scheduling.PluginRunnable;
import net.playeranalytics.plugin.scheduling.RunnableFactory;
import javax.inject.Inject;
import javax.inject.Singleton;
@ -54,7 +54,7 @@ public class TaskSystem implements SubSystem {
runnableFactory.cancelAllKnownTasks();
}
public static abstract class Task extends AbsRunnable {
public static abstract class Task extends PluginRunnable {
public abstract void register(RunnableFactory runnableFactory);
}

View File

@ -28,8 +28,7 @@ import com.djrapitops.plan.storage.database.queries.containers.ContainerFetchQue
import com.djrapitops.plan.storage.database.queries.objects.ServerQueries;
import com.djrapitops.plan.storage.database.queries.objects.UserIdentifierQueries;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.logging.L;
import com.djrapitops.plugin.logging.console.PluginLogger;
import net.playeranalytics.plugin.server.PluginLogger;
import javax.inject.Inject;
import javax.inject.Singleton;
@ -94,7 +93,7 @@ public class CommonAPI implements PlanAPI {
try {
return queryDB(UserIdentifierQueries.fetchAllPlayerNames());
} catch (DBOpException e) {
errorLogger.log(L.ERROR, this.getClass(), e);
errorLogger.error(e);
return new HashMap<>();
}
}

View File

@ -22,7 +22,7 @@ import com.djrapitops.plan.data.plugin.PluginData;
import com.djrapitops.plan.identification.UUIDUtility;
import com.djrapitops.plan.storage.database.DBSystem;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.logging.console.PluginLogger;
import net.playeranalytics.plugin.server.PluginLogger;
import javax.inject.Inject;
import javax.inject.Singleton;

View File

@ -17,10 +17,7 @@
package com.djrapitops.plan.commands;
import com.djrapitops.plan.commands.subcommands.*;
import com.djrapitops.plan.commands.use.Arguments;
import com.djrapitops.plan.commands.use.CMDSender;
import com.djrapitops.plan.commands.use.CommandWithSubcommands;
import com.djrapitops.plan.commands.use.Subcommand;
import com.djrapitops.plan.commands.use.*;
import com.djrapitops.plan.gathering.importing.ImportSystem;
import com.djrapitops.plan.settings.Permissions;
import com.djrapitops.plan.settings.locale.Locale;
@ -29,8 +26,6 @@ import com.djrapitops.plan.settings.locale.lang.HelpLang;
import com.djrapitops.plan.storage.database.DBType;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.command.ColorScheme;
import com.djrapitops.plugin.logging.L;
import javax.inject.Inject;
import javax.inject.Named;
@ -91,7 +86,7 @@ public class PlanCommand {
if (error instanceof IllegalArgumentException) {
sender.send("§c" + error.getMessage());
} else {
errorLogger.log(L.WARN, error, ErrorContext.builder().related(sender, arguments).build());
errorLogger.warn(error, ErrorContext.builder().related(sender, arguments).build());
}
}

View File

@ -18,6 +18,7 @@ package com.djrapitops.plan.commands.subcommands;
import com.djrapitops.plan.commands.use.Arguments;
import com.djrapitops.plan.commands.use.CMDSender;
import com.djrapitops.plan.commands.use.ColorScheme;
import com.djrapitops.plan.delivery.formatting.Formatter;
import com.djrapitops.plan.delivery.formatting.Formatters;
import com.djrapitops.plan.exceptions.database.DBOpException;
@ -42,8 +43,6 @@ import com.djrapitops.plan.storage.database.transactions.commands.SetServerAsUni
import com.djrapitops.plan.storage.file.PlanFiles;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.command.ColorScheme;
import com.djrapitops.plugin.logging.L;
import javax.inject.Inject;
import javax.inject.Singleton;
@ -128,7 +127,7 @@ public class DatabaseCommands {
toDB.init();
toDB.executeTransaction(new BackupCopyTransaction(fromDB, toDB)).get();
} catch (DBOpException | ExecutionException e) {
errorLogger.log(L.ERROR, e, ErrorContext.builder().related(sender, arguments).build());
errorLogger.error(e, ErrorContext.builder().related(sender, arguments).build());
} catch (InterruptedException e) {
toDB.close();
Thread.currentThread().interrupt();
@ -203,7 +202,7 @@ public class DatabaseCommands {
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} catch (DBOpException | ExecutionException e) {
errorLogger.log(L.ERROR, e, ErrorContext.builder().related(backupDBFile, toDB.getType(), toDB.getState()).build());
errorLogger.error(e, ErrorContext.builder().related(backupDBFile, toDB.getType(), toDB.getState()).build());
sender.send(locale.getString(CommandLang.PROGRESS_FAIL, e.getMessage()));
}
}
@ -265,7 +264,7 @@ public class DatabaseCommands {
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} catch (Exception e) {
errorLogger.log(L.ERROR, e, ErrorContext.builder().related(sender, fromDB.getName() + "->" + toDB.getName()).build());
errorLogger.error(e, ErrorContext.builder().related(sender, fromDB.getName() + "->" + toDB.getName()).build());
sender.send(locale.getString(CommandLang.PROGRESS_FAIL, e.getMessage()));
}
}
@ -320,7 +319,7 @@ public class DatabaseCommands {
Thread.currentThread().interrupt();
} catch (DBOpException | ExecutionException e) {
sender.send(locale.getString(CommandLang.PROGRESS_FAIL, e.getMessage()));
errorLogger.log(L.ERROR, e, ErrorContext.builder().related(sender, fromDB.getName()).build());
errorLogger.error(e, ErrorContext.builder().related(sender, fromDB.getName()).build());
}
}
@ -372,7 +371,7 @@ public class DatabaseCommands {
Thread.currentThread().interrupt();
} catch (DBOpException | ExecutionException e) {
sender.send(locale.getString(CommandLang.PROGRESS_FAIL, e.getMessage()));
errorLogger.log(L.ERROR, e, ErrorContext.builder().related(sender, database.getType().getName(), playerToRemove).build());
errorLogger.error(e, ErrorContext.builder().related(sender, database.getType().getName(), playerToRemove).build());
}
}
@ -415,7 +414,7 @@ public class DatabaseCommands {
config.set(DatabaseSettings.TYPE, toDB.getName());
config.save();
} catch (DBOpException | IOException e) {
errorLogger.log(L.WARN, e, ErrorContext.builder().related(toDB).build());
errorLogger.warn(e, ErrorContext.builder().related(toDB).build());
sender.send(locale.getString(CommandLang.PROGRESS_FAIL, e.getMessage()));
return;
}

View File

@ -18,6 +18,7 @@ package com.djrapitops.plan.commands.subcommands;
import com.djrapitops.plan.commands.use.Arguments;
import com.djrapitops.plan.commands.use.CMDSender;
import com.djrapitops.plan.commands.use.ColorScheme;
import com.djrapitops.plan.commands.use.MessageBuilder;
import com.djrapitops.plan.delivery.domain.auth.User;
import com.djrapitops.plan.delivery.rendering.html.Html;
@ -33,7 +34,6 @@ import com.djrapitops.plan.storage.database.Database;
import com.djrapitops.plan.storage.database.queries.objects.ServerQueries;
import com.djrapitops.plan.storage.database.queries.objects.UserIdentifierQueries;
import com.djrapitops.plan.storage.database.queries.objects.WebUserQueries;
import com.djrapitops.plugin.command.ColorScheme;
import javax.inject.Inject;
import javax.inject.Singleton;

View File

@ -29,7 +29,7 @@ import com.djrapitops.plan.storage.database.queries.objects.ServerQueries;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plan.version.VersionChecker;
import com.djrapitops.plugin.logging.L;
import net.playeranalytics.plugin.PluginInformation;
import javax.inject.Inject;
import javax.inject.Singleton;
@ -39,6 +39,7 @@ import java.util.Optional;
public class PluginStatusCommands {
private final PlanPlugin plugin;
private final PluginInformation pluginInformation;
private final Locale locale;
private final DBSystem dbSystem;
private final Status status;
@ -48,6 +49,7 @@ public class PluginStatusCommands {
@Inject
public PluginStatusCommands(
PlanPlugin plugin,
PluginInformation pluginInformation,
Locale locale,
DBSystem dbSystem,
Status status,
@ -55,6 +57,7 @@ public class PluginStatusCommands {
ErrorLogger errorLogger
) {
this.plugin = plugin;
this.pluginInformation = pluginInformation;
this.locale = locale;
this.dbSystem = dbSystem;
this.status = status;
@ -65,10 +68,11 @@ public class PluginStatusCommands {
public void onReload(CMDSender sender) {
new Thread(() -> {
try {
plugin.reloadPlugin(true);
plugin.onDisable();
plugin.onEnable();
sender.send(locale.getString(CommandLang.RELOAD_COMPLETE));
} catch (Exception e) {
errorLogger.log(L.CRITICAL, e, ErrorContext.builder().related(sender, "reload", Thread.currentThread().getName()).build());
errorLogger.critical(e, ErrorContext.builder().related(sender, "reload", Thread.currentThread().getName()).build());
sender.send(locale.getString(CommandLang.RELOAD_FAILED));
} finally {
Thread.currentThread().interrupt();
@ -105,7 +109,7 @@ public class PluginStatusCommands {
String[] messages = {
locale.getString(CommandLang.HEADER_INFO),
"",
locale.getString(CommandLang.INFO_VERSION, plugin.getVersion()),
locale.getString(CommandLang.INFO_VERSION, pluginInformation.getVersion()),
locale.getString(CommandLang.INFO_UPDATE, updateAvailable),
locale.getString(CommandLang.INFO_DATABASE, database.getType().getName() + " (" + database.getState().name() + ")"),
locale.getString(CommandLang.INFO_PROXY_CONNECTION, proxyAvailable),

View File

@ -18,6 +18,7 @@ package com.djrapitops.plan.commands.subcommands;
import com.djrapitops.plan.commands.use.Arguments;
import com.djrapitops.plan.commands.use.CMDSender;
import com.djrapitops.plan.commands.use.ColorScheme;
import com.djrapitops.plan.delivery.domain.auth.User;
import com.djrapitops.plan.delivery.webserver.auth.FailReason;
import com.djrapitops.plan.delivery.webserver.auth.RegistrationBin;
@ -34,9 +35,7 @@ import com.djrapitops.plan.storage.database.transactions.commands.RemoveWebUserT
import com.djrapitops.plan.utilities.PassEncryptUtil;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.command.ColorScheme;
import com.djrapitops.plugin.logging.L;
import com.djrapitops.plugin.logging.console.PluginLogger;
import net.playeranalytics.plugin.server.PluginLogger;
import javax.inject.Inject;
import javax.inject.Singleton;
@ -161,7 +160,7 @@ public class RegistrationCommands {
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} catch (DBOpException | ExecutionException e) {
errorLogger.log(L.WARN, e, ErrorContext.builder().related(sender, user, permissionLevel).build());
errorLogger.warn(e, ErrorContext.builder().related(sender, user, permissionLevel).build());
}
}
@ -221,7 +220,7 @@ public class RegistrationCommands {
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} catch (ExecutionException e) {
errorLogger.log(L.WARN, e, ErrorContext.builder().related("unregister command", sender, sender.getPlayerName().orElse("console"), arguments).build());
errorLogger.warn(e, ErrorContext.builder().related("unregister command", sender, sender.getPlayerName().orElse("console"), arguments).build());
}
} else {
sender.send(colors.getMainColor() + locale.getString(CommandLang.CONFIRM_CANCELLED_UNREGISTER, presentUser.getUsername()));

View File

@ -0,0 +1,106 @@
/*
* The MIT License (MIT)
*
* Copyright (c) 2021 AuroraLS3
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package com.djrapitops.plan.commands.use;
import java.util.Arrays;
import java.util.List;
/**
* Class that contains ChatColors for plugins.
* <p>
* Colors should be defined in MineCraft format, eg. "§1" "§a" "§o§3"
*
* @author AuroraLS3
*/
public class ColorScheme {
private final List<String> colors;
/**
* Create a new ColorScheme.
*
* @param colors colors in MineCraft format, eg. "§1" "§a" "§o§3"
*/
public ColorScheme(String... colors) {
this(Arrays.asList(colors));
}
/**
* Create a new ColorScheme.
*
* @param colors colors in MineCraft format, eg. "§1" "§a" "§o§3"
*/
public ColorScheme(List<String> colors) {
this.colors = colors;
}
/**
* Get a color with a particular index.
*
* @param i Index of the color.
* @return a color code, eg "§1" or empty string if index is out of bounds.
*/
public String getColor(int i) {
if (i < colors.size()) {
return colors.get(i);
}
return "";
}
/**
* Retrieve the first defined color.
*
* @return a color code, eg "§1" or empty string if index is out of bounds.
*/
public String getMainColor() {
return getColor(0);
}
/**
* Retrieve the second defined color.
*
* @return a color code, eg "§1" or empty string if index is out of bounds.
*/
public String getSecondaryColor() {
return getColor(1);
}
/**
* Retrieve the third defined color.
*
* @return a color code, eg "§1" or empty string if index is out of bounds.
*/
public String getTertiaryColor() {
return getColor(2);
}
/**
* Retrieve the fourth defined color.
*
* @return a color code, eg "§1" or empty string if index is out of bounds.
*/
public String getExtraColor() {
return getColor(3);
}
}

View File

@ -19,7 +19,6 @@ package com.djrapitops.plan.commands.use;
import com.djrapitops.plan.settings.locale.Locale;
import com.djrapitops.plan.settings.locale.lang.CommandLang;
import com.djrapitops.plan.utilities.java.TriConsumer;
import com.djrapitops.plugin.command.ColorScheme;
import java.util.ArrayList;
import java.util.Collections;

View File

@ -16,7 +16,6 @@
*/
package com.djrapitops.plan.commands.use;
import com.djrapitops.plugin.command.ColorScheme;
import org.apache.commons.text.TextStringBuilder;
import java.util.ArrayList;

View File

@ -17,8 +17,6 @@
package com.djrapitops.plan.data.element;
import com.djrapitops.plan.delivery.formatting.Formatter;
import com.djrapitops.plan.delivery.rendering.html.icon.Icon;
import com.djrapitops.plugin.utilities.ArrayUtil;
import java.io.Serializable;
import java.util.ArrayList;
@ -53,9 +51,7 @@ public class TableContainer {
}
public TableContainer(boolean players, String... header) {
this(
ArrayUtil.merge(new String[]{Icon.called("user").build() + " Player"}, header)
);
this(header);
}
public final void addRow(Serializable... values) {

View File

@ -19,7 +19,6 @@ package com.djrapitops.plan.delivery.domain.mutators;
import com.djrapitops.plan.delivery.rendering.json.graphs.line.LineGraph;
import com.djrapitops.plan.delivery.rendering.json.graphs.line.Point;
import com.djrapitops.plan.utilities.java.Lists;
import com.djrapitops.plugin.utilities.Verify;
import java.util.*;
@ -30,7 +29,7 @@ public class MutatorFunctions {
}
public static NavigableMap<Long, Integer> addMissing(NavigableMap<Long, Integer> points, long accuracy, Integer replacement) {
if (Verify.isEmpty(points)) return points;
if (points == null || points.isEmpty()) return points;
NavigableMap<Long, Integer> filled = new TreeMap<>();
Long lastX = null;
@ -45,7 +44,7 @@ public class MutatorFunctions {
}
long now = System.currentTimeMillis();
if (lastX != null && now - lastX > accuracy) {
if (now - lastX > accuracy) {
addMissing(lastX, now, filled, accuracy, replacement);
}
@ -61,7 +60,7 @@ public class MutatorFunctions {
}
public static List<Point> addMissing(List<Point> points, LineGraph.GapStrategy gapStrategy) {
if (Verify.isEmpty(points)) return points;
if (points == null || points.isEmpty()) return points;
List<Point> filled = new ArrayList<>();
Long lastX = null;

View File

@ -27,7 +27,7 @@ import com.djrapitops.plan.gathering.domain.Ping;
import com.djrapitops.plan.gathering.domain.Session;
import com.djrapitops.plan.utilities.java.Lists;
import com.djrapitops.plan.utilities.java.Maps;
import com.djrapitops.plugin.api.TimeAmount;
import net.playeranalytics.plugin.scheduling.TimeAmount;
import java.util.*;
import java.util.function.Function;

View File

@ -22,8 +22,8 @@ import com.djrapitops.plan.settings.config.paths.ExportSettings;
import com.djrapitops.plan.storage.database.DBSystem;
import com.djrapitops.plan.storage.database.queries.objects.ServerQueries;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.task.RunnableFactory;
import net.playeranalytics.plugin.scheduling.RunnableFactory;
import net.playeranalytics.plugin.scheduling.TimeAmount;
import javax.inject.Inject;
import javax.inject.Singleton;
@ -68,7 +68,7 @@ public class ExportScheduler {
private void schedulePlayersPageExport() {
long period = TimeAmount.toTicks(config.get(ExportSettings.EXPORT_PERIOD), TimeUnit.MILLISECONDS);
runnableFactory.create("Players page export",
runnableFactory.create(
new ExportTask(exporter, Exporter::exportPlayersPage, errorLogger)
).runTaskTimerAsynchronously(0L, period);
}
@ -84,14 +84,14 @@ public class ExportScheduler {
long offset = period / serverCount;
Optional<Server> proxy = servers.stream().filter(Server::isProxy).findFirst();
proxy.ifPresent(mainServer -> runnableFactory.create("Network export",
proxy.ifPresent(mainServer -> runnableFactory.create(
new ExportTask(exporter, same -> same.exportServerPage(mainServer), errorLogger))
.runTaskTimerAsynchronously(0L, period)
);
int offsetMultiplier = proxy.isPresent() ? 1 : 0; // Delay first server export if on a network.
for (Server server : servers) {
runnableFactory.create("Server export",
runnableFactory.create(
new ExportTask(exporter, same -> {
same.exportServerPage(server);
same.exportServerJSON(server);

View File

@ -21,10 +21,9 @@ import com.djrapitops.plan.exceptions.database.DBOpException;
import com.djrapitops.plan.utilities.java.ThrowingConsumer;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.logging.L;
import com.djrapitops.plugin.task.AbsRunnable;
import net.playeranalytics.plugin.scheduling.PluginRunnable;
public class ExportTask extends AbsRunnable {
public class ExportTask extends PluginRunnable {
private final Exporter exporter;
private final ThrowingConsumer<Exporter, ExportException> exportAction;
@ -45,11 +44,11 @@ public class ExportTask extends AbsRunnable {
try {
exportAction.accept(exporter);
} catch (ExportException e) {
errorLogger.log(L.WARN, e, ErrorContext.builder().related("Export task run").build());
errorLogger.warn(e, ErrorContext.builder().related("Export task run").build());
} catch (DBOpException dbException) {
handleDBException(dbException);
} catch (Exception | NoClassDefFoundError | NoSuchMethodError | NoSuchFieldError e) {
errorLogger.log(L.ERROR, e, ErrorContext.builder()
errorLogger.error(e, ErrorContext.builder()
.whatToDo("Export Task Disabled due to error - reload Plan to re-enable.")
.related("Export task run").build());
cancel();
@ -58,11 +57,11 @@ public class ExportTask extends AbsRunnable {
private void handleDBException(DBOpException dbException) {
if (dbException.getMessage().contains("closed")) {
errorLogger.log(L.ERROR, dbException, ErrorContext.builder()
errorLogger.error(dbException, ErrorContext.builder()
.whatToDo("Export Task Disabled due to error - database is closing, so this error can be ignored.).")
.related("Export task run").build());
} else {
errorLogger.log(L.ERROR, dbException, ErrorContext.builder()
errorLogger.error(dbException, ErrorContext.builder()
.whatToDo("Export Task Disabled due to error - reload Plan to re-enable.")
.related("Export task run").build());
}

View File

@ -16,10 +16,10 @@
*/
package com.djrapitops.plan.delivery.formatting;
import com.djrapitops.plugin.utilities.Format;
import org.apache.commons.lang3.StringUtils;
/**
* Formatter for entity names, that capitalizes the first word and removes symbols and numbers.
* Formatter for entity names, that capitalizes the first word and removes symbols.
*
* @author AuroraLS3
*/
@ -27,6 +27,8 @@ public class EntityNameFormatter implements Formatter<String> {
@Override
public String apply(String name) {
return new Format(name).removeNumbers().removeSymbols().capitalize().toString();
return StringUtils.capitalize(
StringUtils.removeAll(name, "[^a-zA-Z0-9_\\\\s]*").toLowerCase()
);
}
}

View File

@ -16,7 +16,6 @@
*/
package com.djrapitops.plan.delivery.formatting;
import com.djrapitops.plugin.utilities.Format;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.text.TextStringBuilder;
@ -33,7 +32,10 @@ public class ItemNameFormatter implements Formatter<String> {
public String apply(String name) {
String[] parts = StringUtils.split(name, '_');
TextStringBuilder builder = new TextStringBuilder();
builder.appendWithSeparators(Arrays.stream(parts).map(part -> new Format(part).capitalize()).iterator(), " ");
builder.appendWithSeparators(Arrays.stream(parts)
.map(StringUtils::lowerCase)
.map(StringUtils::capitalize)
.iterator(), " ");
return builder.toString();
}
}

View File

@ -16,8 +16,6 @@
*/
package com.djrapitops.plan.delivery.rendering.html.icon;
import com.djrapitops.plugin.utilities.Verify;
public class Icon {
private Family type;
@ -107,7 +105,7 @@ public class Icon {
}
public Icon build() {
Verify.nullCheck(icon.name, () -> new IllegalStateException("'name' was not defined yet!"));
if (icon.name == null) throw new IllegalStateException("'name' was not defined yet!");
return icon;
}

View File

@ -16,7 +16,7 @@
*/
package com.djrapitops.plan.delivery.rendering.html.structure;
import com.djrapitops.plugin.utilities.Format;
import org.apache.commons.lang3.StringUtils;
/**
* Represents a structural HTML element that has Tabs on the top.
@ -81,7 +81,7 @@ public class TabsElement {
}
public String getId() {
return "tab_" + new Format(navText).removeSymbols().removeWhitespace().lowerCase().toString();
return "tab_" + StringUtils.removeAll(navText, "[^a-zA-Z0-9]*").toLowerCase();
}
}
}

View File

@ -46,7 +46,7 @@ import com.djrapitops.plan.storage.database.queries.analysis.PlayerCountQueries;
import com.djrapitops.plan.storage.database.queries.objects.*;
import com.djrapitops.plan.utilities.java.Lists;
import com.djrapitops.plan.utilities.java.Maps;
import com.djrapitops.plugin.api.TimeAmount;
import net.playeranalytics.plugin.scheduling.TimeAmount;
import javax.inject.Inject;
import javax.inject.Singleton;

View File

@ -1,270 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.plan.delivery.rendering.pages;
import com.djrapitops.plan.delivery.domain.keys.SessionKeys;
import com.djrapitops.plan.delivery.formatting.Formatter;
import com.djrapitops.plan.delivery.formatting.Formatters;
import com.djrapitops.plan.delivery.formatting.PlaceholderReplacer;
import com.djrapitops.plan.delivery.rendering.html.Contributors;
import com.djrapitops.plan.delivery.rendering.html.Html;
import com.djrapitops.plan.delivery.rendering.html.icon.Icon;
import com.djrapitops.plan.delivery.rendering.html.structure.TabsElement;
import com.djrapitops.plan.gathering.cache.SessionCache;
import com.djrapitops.plan.gathering.domain.Session;
import com.djrapitops.plan.identification.ServerInfo;
import com.djrapitops.plan.identification.properties.ServerProperties;
import com.djrapitops.plan.storage.database.Database;
import com.djrapitops.plan.storage.file.ResourceCache;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plan.version.VersionChecker;
import com.djrapitops.plugin.benchmarking.Benchmark;
import com.djrapitops.plugin.benchmarking.Timings;
import com.djrapitops.plugin.logging.L;
import com.djrapitops.plugin.logging.debug.CombineDebugLogger;
import com.djrapitops.plugin.logging.debug.DebugLogger;
import com.djrapitops.plugin.logging.debug.MemoryDebugLogger;
import java.util.*;
/**
* Html String generator for /debug page.
*
* @author AuroraLS3
*/
public class DebugPage implements Page {
private final String template;
private final Database database;
private final ServerInfo serverInfo;
private final VersionChecker versionChecker;
private final CombineDebugLogger debugLogger;
private final Timings timings;
private final ErrorLogger errorLogger;
private final Formatter<Long> yearFormatter;
DebugPage(
String htmlTemplate,
Database database,
ServerInfo serverInfo,
Formatters formatters,
VersionChecker versionChecker,
DebugLogger debugLogger,
Timings timings,
ErrorLogger errorLogger
) {
this.template = htmlTemplate;
this.database = database;
this.serverInfo = serverInfo;
this.versionChecker = versionChecker;
this.debugLogger = (CombineDebugLogger) debugLogger;
this.timings = timings;
this.errorLogger = errorLogger;
this.yearFormatter = formatters.yearLong();
}
@Override
public String toHtml() {
PlaceholderReplacer placeholders = new PlaceholderReplacer();
placeholders.put("title", Icon.called("bug") + " Debug Information");
placeholders.put("titleText", "Debug Information");
placeholders.put("paragraph", createContent());
placeholders.put("version", versionChecker.getUpdateButton().orElse(versionChecker.getCurrentVersionButton()));
placeholders.put("updateModal", versionChecker.getUpdateModal());
placeholders.put("contributors", Contributors.generateContributorHtml());
return placeholders.apply(template);
}
private String createContent() {
StringBuilder preContent = new StringBuilder();
String issueLink = Html.LINK_EXTERNAL.create("https://github.com/plan-player-analytics/Plan/issues/new", "Create new issue on Github");
String hastebinLink = Html.LINK_EXTERNAL.create("https://hastebin.com/", "Create a new hastebin paste");
preContent.append("<p>")
.append(Html.separateWithDots(issueLink, hastebinLink)).append("<br><br>")
.append("This page contains debug information for an issue ticket. You can copy it directly into the issue, the info is pre-formatted.")
.append("</p>");
TabsElement.Tab info = new TabsElement.Tab(Icon.called("server") + " Server Information", createServerInfoContent());
TabsElement.Tab errors = new TabsElement.Tab(Icon.called("exclamation-circle") + " Errors", createErrorContent());
TabsElement.Tab debugLog = new TabsElement.Tab(Icon.called("bug") + " Debug Log", createDebugLogContent());
TabsElement.Tab caches = new TabsElement.Tab(Icon.called("archive") + " Plan Caches", createCacheContent());
TabsElement tabs = new TabsElement(info, errors, debugLog, caches);
return preContent + tabs.toHtmlFull();
}
private String createCacheContent() {
StringBuilder content = new StringBuilder();
appendResourceCache(content);
appendSessionCache(content);
return content.toString();
}
private void appendResourceCache(StringBuilder content) {
try {
content.append("<pre>### Cached Resources (from File or Jar):<br><br>");
List<String> cacheKeys = ResourceCache.getCachedResourceNames();
if (cacheKeys.isEmpty()) {
content.append("Empty");
}
for (String cacheKey : cacheKeys) {
content.append("- ").append(cacheKey).append("<br>");
}
content.append("</pre>");
} catch (Exception e) {
errorLogger.log(L.WARN, e, ErrorContext.builder().related("/debug page access, resource cache").build());
}
}
private void appendSessionCache(StringBuilder content) {
try {
content.append("<pre>### Session Cache:<br><br>");
content.append("Name | Session Started <br>")
.append("-- | -- <br>");
Set<Map.Entry<UUID, Session>> sessions = SessionCache.getActiveSessions().entrySet();
if (sessions.isEmpty()) {
content.append("Empty");
}
for (Map.Entry<UUID, Session> entry : sessions) {
Session session = entry.getValue();
String name = session.getValue(SessionKeys.NAME).orElse(entry.getKey().toString());
String start = session.getValue(SessionKeys.START).map(yearFormatter).orElse("Unknown");
content.append(name).append(" | ").append(start).append("<br>");
}
content.append("</pre>");
} catch (Exception e) {
errorLogger.log(L.WARN, e, ErrorContext.builder().related("/debug page access, Session cache").build());
}
}
private String createDebugLogContent() {
StringBuilder content = new StringBuilder();
appendDebugLog(content);
return content.toString();
}
private String createErrorContent() {
StringBuilder content = new StringBuilder();
appendLoggedErrors(content);
return content.toString();
}
private String createServerInfoContent() {
StringBuilder content = new StringBuilder();
appendServerInformation(content);
appendBenchmarks(content);
return content.toString();
}
private void appendServerInformation(StringBuilder content) {
ServerProperties serverProperties = serverInfo.getServerProperties();
content.append("<pre>### Server Information<br>")
.append("**Plan Version:** ")
.append(versionChecker.getCurrentVersion())
.append("<br>");
content.append("**Server:** ");
content.append(serverProperties.getName())
.append(" ").append(serverProperties.getImplVersion())
.append(" (").append(serverProperties.getVersion());
content.append(")<br>");
content.append("**Database:** ").append(database.getType().getName());
content.append("<br><br>");
Properties properties = System.getProperties();
String osName = properties.getProperty("os.name");
String osVersion = properties.getProperty("os.version");
String osArch = properties.getProperty("os.arch");
String javaVendor = properties.getProperty("java.vendor");
String javaVersion = properties.getProperty("java.version");
String javaVMVendor = properties.getProperty("java.vm.vendor");
String javaVMName = properties.getProperty("java.vm.name");
String javaVMVersion = properties.getProperty("java.vm.version");
content.append("**Operating SubSystem:** ").append(osName).append(" (").append(osArch)
.append(") version ").append(osVersion).append("<br>");
content.append("**Java Version:** ").append(javaVersion).append(", ").append(javaVendor).append("<br>");
content.append("**Java VM Version:** ").append(javaVMName).append(" version ").append(javaVMVersion)
.append(", ").append(javaVMVendor).append("<br>");
content.append("</pre>");
}
private void appendBenchmarks(StringBuilder content) {
content.append("<pre>### Benchmarks<br>&#96;&#96;&#96;<br>");
try {
for (Benchmark result : timings.getAverageResults()) {
content.append(result.toString()).append("<br>");
}
} catch (Exception e) {
content.append("Exception on Timings#getAverageResults");
}
content.append("&#96;&#96;&#96;</pre>");
}
private void appendLoggedErrors(StringBuilder content) {
content.append("<pre>### Logged Errors<br>");
content.append("Using incompatible ErrorHandler");
content.append("</pre>");
}
private void appendDebugLog(StringBuilder content) {
Optional<MemoryDebugLogger> memoryDebugLogger = this.debugLogger.getDebugLogger(MemoryDebugLogger.class);
Map<String, List<String>> channels = memoryDebugLogger.map(MemoryDebugLogger::getChannels).orElse(new HashMap<>());
if (channels.isEmpty()) {
content.append("Incompatible Debug Logger in use (No MemoryDebugLogger)");
return;
}
TabsElement.Tab[] tabs = channels.entrySet().stream()
.sorted((one, two) -> String.CASE_INSENSITIVE_ORDER.compare(one.getKey(), two.getKey()))
.map(channel -> {
String name = channel.getKey().isEmpty() ? "Default" : channel.getKey();
return new TabsElement.Tab(name, debugChannelContent(name, channel.getValue()));
})
.toArray(TabsElement.Tab[]::new);
content.append(new TabsElement(tabs).toHtmlFull());
}
private String debugChannelContent(String channelName, List<String> lines) {
StringBuilder content = new StringBuilder();
content.append("<pre>### Debug (").append(channelName).append(")<br>&#96;&#96;&#96;<br>");
for (String line : lines) {
content.append(line).append("<br>");
}
content.append("&#96;&#96;&#96;</pre>");
return content.toString();
}
}

View File

@ -21,7 +21,6 @@ import com.djrapitops.plan.identification.ServerInfo;
import com.djrapitops.plan.settings.locale.Locale;
import com.djrapitops.plan.settings.theme.Theme;
import com.djrapitops.plan.utilities.java.UnaryChain;
import com.djrapitops.plugin.api.Check;
/**
* Html String generator for /login and /register page.
@ -59,9 +58,7 @@ public class LoginPage implements Page {
}
private String getCommand() {
if (serverInfo.getServer().isNotProxy()) return "plan";
if (Check.isBungeeAvailable()) return "planbungee";
if (Check.isVelocityAvailable()) return "planvelocity";
if (serverInfo.getServer().isProxy()) return "planproxy";
return "plan";
}
}

View File

@ -34,10 +34,7 @@ import com.djrapitops.plan.storage.database.Database;
import com.djrapitops.plan.storage.database.queries.containers.ContainerFetchQueries;
import com.djrapitops.plan.storage.database.queries.objects.ServerQueries;
import com.djrapitops.plan.storage.file.PlanFiles;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plan.version.VersionChecker;
import com.djrapitops.plugin.benchmarking.Timings;
import com.djrapitops.plugin.logging.debug.DebugLogger;
import dagger.Lazy;
import javax.inject.Inject;
@ -63,9 +60,6 @@ public class PageFactory {
private final Lazy<ServerInfo> serverInfo;
private final Lazy<JSONStorage> jsonStorage;
private final Lazy<Formatters> formatters;
private final Lazy<DebugLogger> debugLogger;
private final Lazy<Timings> timings;
private final Lazy<ErrorLogger> errorLogger;
@Inject
public PageFactory(
@ -77,10 +71,7 @@ public class PageFactory {
Lazy<DBSystem> dbSystem,
Lazy<ServerInfo> serverInfo,
Lazy<JSONStorage> jsonStorage,
Lazy<Formatters> formatters,
Lazy<DebugLogger> debugLogger,
Lazy<Timings> timings,
Lazy<ErrorLogger> errorLogger
Lazy<Formatters> formatters
) {
this.versionChecker = versionChecker;
this.files = files;
@ -91,17 +82,6 @@ public class PageFactory {
this.serverInfo = serverInfo;
this.jsonStorage = jsonStorage;
this.formatters = formatters;
this.debugLogger = debugLogger;
this.timings = timings;
this.errorLogger = errorLogger;
}
public DebugPage debugPage() throws IOException {
return new DebugPage(
getResource("error.html"),
dbSystem.get().getDatabase(), serverInfo.get(), formatters.get(), versionChecker.get(),
debugLogger.get(), timings.get(), errorLogger.get()
);
}
public PlayersPage playersPage() throws IOException {

View File

@ -156,7 +156,7 @@ public class PlayerPluginTab implements Comparable<PlayerPluginTab> {
private String buildContentHtml(ExtensionTabData tabData) {
TabInformation tabInformation = tabData.getTabInformation();
ElementOrder[] order = tabInformation.getTabElementOrder().orElse(ElementOrder.values());
List<ElementOrder> order = tabInformation.getTabElementOrder();
String values = buildValuesHtml(tabData);
String valuesHtml = values.isEmpty() ? "" : "<div class=\"card-body\">" + values + "</div>";
String tablesHtml = buildTablesHtml(tabData);

View File

@ -181,7 +181,7 @@ public class ServerPluginTabs {
private String buildContentHtml(ExtensionTabData tabData) {
TabInformation tabInformation = tabData.getTabInformation();
ElementOrder[] order = tabInformation.getTabElementOrder().orElse(ElementOrder.values());
List<ElementOrder> order = tabInformation.getTabElementOrder();
String values = buildValuesHtml(tabData);
String valuesHtml = values.isEmpty() ? "" : "<div class=\"card-body\">" + values + "</div>";
String tablesHtml = buildTablesHtml(tabData);

View File

@ -25,8 +25,7 @@ import com.djrapitops.plan.storage.file.PlanFiles;
import com.djrapitops.plan.storage.file.Resource;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.logging.L;
import com.djrapitops.plugin.logging.console.PluginLogger;
import net.playeranalytics.plugin.server.PluginLogger;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.text.TextStringBuilder;
@ -146,7 +145,7 @@ public class ResourceSvc implements ResourceService {
return getOrWriteCustomized(fileName, source);
}
} catch (IOException e) {
errorLogger.log(L.WARN, e, ErrorContext.builder()
errorLogger.warn(e, ErrorContext.builder()
.whatToDo("Report this or provide " + fileName + " in " + files.getCustomizationDirectory())
.related("Fetching resource", "Of: " + pluginName, fileName).build());
}

View File

@ -21,8 +21,7 @@ import com.djrapitops.plan.settings.config.paths.PluginSettings;
import com.djrapitops.plan.settings.config.paths.WebserverSettings;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.logging.L;
import com.djrapitops.plugin.logging.console.PluginLogger;
import net.playeranalytics.plugin.server.PluginLogger;
import java.io.IOException;
@ -75,7 +74,7 @@ public class NonProxyWebserverDisableChecker implements Runnable {
config.save();
logger.warn("Note: Set '" + WebserverSettings.DISABLED.getPath() + "' to true");
} catch (IOException e) {
errorLogger.log(L.WARN, e, ErrorContext.builder()
errorLogger.warn(e, ErrorContext.builder()
.whatToDo("Set '" + WebserverSettings.DISABLED.getPath() + "' to true manually.")
.related("Disabling webserver in config setting", WebserverSettings.DISABLED.getPath()).build());
}

View File

@ -35,12 +35,10 @@ import com.djrapitops.plan.settings.locale.lang.PluginLang;
import com.djrapitops.plan.storage.database.DBSystem;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.logging.L;
import com.djrapitops.plugin.logging.console.PluginLogger;
import com.djrapitops.plugin.utilities.Verify;
import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import net.playeranalytics.plugin.server.PluginLogger;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.text.TextStringBuilder;
@ -107,7 +105,7 @@ public class RequestHandler implements HttpHandler {
} catch (Exception e) {
if (config.isTrue(PluginSettings.DEV_MODE)) {
logger.warn("THIS ERROR IS ONLY LOGGED IN DEV MODE:");
errorLogger.log(L.WARN, e, ErrorContext.builder()
errorLogger.warn(e, ErrorContext.builder()
.whatToDo("THIS ERROR IS ONLY LOGGED IN DEV MODE")
.related(exchange.getRequestMethod(), exchange.getRemoteAddress(), exchange.getRequestHeaders(), exchange.getResponseHeaders(), exchange.getRequestURI())
.build());
@ -177,10 +175,9 @@ public class RequestHandler implements HttpHandler {
private void warnAboutXForwardedForSecurityIssue() {
if (!warnedAboutXForwardedSecurityIssue.get()) {
logger.warn("Security Vulnerability due to misconfiguration: X-Forwarded-For header was not present in a request & '" +
WebserverSettings.IP_WHITELIST_X_FORWARDED.getPath() + "' is 'true'!",
"This could mean non-reverse-proxy access is not blocked & someone can use IP Spoofing to bypass security!",
"Make sure you can only access Plan panel from your reverse-proxy or disable this setting."
);
WebserverSettings.IP_WHITELIST_X_FORWARDED.getPath() + "' is 'true'!");
logger.warn("This could mean non-reverse-proxy access is not blocked & someone can use IP Spoofing to bypass security!");
logger.warn("Make sure you can only access Plan panel from your reverse-proxy or disable this setting.");
}
warnedAboutXForwardedSecurityIssue.set(true);
}
@ -228,7 +225,7 @@ public class RequestHandler implements HttpHandler {
}
List<String> authorization = requestHeaders.get("Authorization");
if (Verify.isEmpty(authorization)) return Optional.empty();
if (authorization == null || authorization.isEmpty()) return Optional.empty();
String authLine = authorization.get(0);
if (StringUtils.contains(authLine, "Basic ")) {

View File

@ -81,14 +81,6 @@ public class ResponseFactory {
() -> files.getResourceFromJar("web/" + resourceName).asWebResource());
}
public Response debugPageResponse() {
try {
return forPage(pageFactory.debugPage());
} catch (IOException e) {
return forInternalError(e, "Failed to generate debug page");
}
}
private Response forPage(Page page) {
return Response.builder()
.setMimeType(MimeType.HTML)

View File

@ -33,7 +33,6 @@ import com.djrapitops.plan.exceptions.WebUserAuthException;
import com.djrapitops.plan.exceptions.connection.ForbiddenException;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.logging.L;
import dagger.Lazy;
import javax.inject.Inject;
@ -53,7 +52,6 @@ import java.util.regex.Pattern;
@Singleton
public class ResponseResolver {
private final DebugPageResolver debugPageResolver;
private final QueryPageResolver queryPageResolver;
private final PlayersPageResolver playersPageResolver;
private final PlayerPageResolver playerPageResolver;
@ -78,7 +76,6 @@ public class ResponseResolver {
ResponseFactory responseFactory,
Lazy<WebServer> webServer,
DebugPageResolver debugPageResolver,
QueryPageResolver queryPageResolver,
PlayersPageResolver playersPageResolver,
PlayerPageResolver playerPageResolver,
@ -98,7 +95,6 @@ public class ResponseResolver {
this.resolverService = resolverService;
this.responseFactory = responseFactory;
this.webServer = webServer;
this.debugPageResolver = debugPageResolver;
this.queryPageResolver = queryPageResolver;
this.playersPageResolver = playersPageResolver;
this.playerPageResolver = playerPageResolver;
@ -117,7 +113,6 @@ public class ResponseResolver {
public void registerPages() {
String plugin = "Plan";
resolverService.registerResolver(plugin, "/robots.txt", (NoAuthResolver) request -> Optional.of(responseFactory.robotsResponse()));
resolverService.registerResolver(plugin, "/debug", debugPageResolver);
resolverService.registerResolver(plugin, "/query", queryPageResolver);
resolverService.registerResolver(plugin, "/players", playersPageResolver);
resolverService.registerResolver(plugin, "/player", playerPageResolver);
@ -149,7 +144,7 @@ public class ResponseResolver {
} catch (WebUserAuthException e) {
throw e; // Pass along
} catch (Exception e) {
errorLogger.log(L.ERROR, e, ErrorContext.builder().related(request).build());
errorLogger.error(e, ErrorContext.builder().related(request).build());
return responseFactory.internalErrorResponse(e, "Failed to get a response");
}
}

View File

@ -25,12 +25,11 @@ import com.djrapitops.plan.settings.locale.lang.PluginLang;
import com.djrapitops.plan.storage.file.PlanFiles;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.logging.L;
import com.djrapitops.plugin.logging.console.PluginLogger;
import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.HttpsConfigurator;
import com.sun.net.httpserver.HttpsParameters;
import com.sun.net.httpserver.HttpsServer;
import net.playeranalytics.plugin.server.PluginLogger;
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import javax.inject.Inject;
@ -129,13 +128,11 @@ public class WebServer implements SubSystem {
try {
usingHttps = startHttpsServer();
logger.debug(usingHttps ? "Https Start Successful." : "Https Start Failed.");
if (!usingHttps) {
logger.log(L.INFO_COLOR, "§e" + locale.getString(PluginLang.WEB_SERVER_NOTIFY_HTTP_USER_AUTH));
logger.info("§e" + locale.getString(PluginLang.WEB_SERVER_NOTIFY_HTTP_USER_AUTH));
server = HttpServer.create(new InetSocketAddress(config.get(WebserverSettings.INTERNAL_IP), port), 10);
} else if (server == null) {
logger.log(L.INFO_COLOR, "§e" + locale.getString(PluginLang.WEB_SERVER_NOTIFY_USING_PROXY_MODE));
logger.info("§e" + locale.getString(PluginLang.WEB_SERVER_NOTIFY_USING_PROXY_MODE));
server = HttpServer.create(new InetSocketAddress(config.get(WebserverSettings.INTERNAL_IP), port), 10);
} else if (config.isTrue(WebserverSettings.DISABLED_AUTHENTICATION)) {
logger.info(locale.getString(PluginLang.WEB_SERVER_NOTIFY_HTTPS_USER_AUTH));
@ -148,7 +145,7 @@ public class WebServer implements SubSystem {
.namingPattern("Plan WebServer Thread-%d")
.uncaughtExceptionHandler((thread, throwable) -> {
if (config.isTrue(PluginSettings.DEV_MODE)) {
errorLogger.log(L.WARN, throwable, ErrorContext.builder()
errorLogger.warn(throwable, ErrorContext.builder()
.whatToDo("THIS ERROR IS ONLY LOGGED IN DEV MODE")
.build());
}
@ -164,13 +161,13 @@ public class WebServer implements SubSystem {
boolean usingAlternativeIP = config.isTrue(WebserverSettings.SHOW_ALTERNATIVE_IP);
if (!usingAlternativeIP && !addresses.getAccessAddress().isPresent()) {
logger.log(L.INFO_COLOR, "§e" + locale.getString(PluginLang.ENABLE_NOTIFY_EMPTY_IP));
logger.info("§e" + locale.getString(PluginLang.ENABLE_NOTIFY_EMPTY_IP));
}
} catch (BindException failedToBind) {
logger.error("Webserver failed to bind port: " + failedToBind.toString());
enabled = false;
} catch (IllegalArgumentException | IllegalStateException | IOException e) {
errorLogger.log(L.ERROR, e, ErrorContext.builder().related("Trying to enable webserver", config.get(WebserverSettings.INTERNAL_IP) + ":" + port).build());
errorLogger.error(e, ErrorContext.builder().related("Trying to enable webserver", config.get(WebserverSettings.INTERNAL_IP) + ":" + port).build());
enabled = false;
}
}
@ -188,7 +185,7 @@ public class WebServer implements SubSystem {
}
} catch (InvalidPathException e) {
logger.error("WebServer: Could not find Keystore: " + e.getMessage());
errorLogger.log(L.ERROR, e, ErrorContext.builder()
errorLogger.error(e, ErrorContext.builder()
.whatToDo(e.getMessage() + ", Fix this path to point to a valid keystore file: " + keyStorePath)
.related(keyStorePath).build());
}
@ -239,7 +236,7 @@ public class WebServer implements SubSystem {
logger.error(e.getMessage());
} catch (KeyManagementException | NoSuchAlgorithmException e) {
logger.error(locale.getString(PluginLang.WEB_SERVER_FAIL_SSL_CONTEXT));
errorLogger.log(L.ERROR, e, ErrorContext.builder().related(keyStoreKind).build());
errorLogger.error(e, ErrorContext.builder().related(keyStoreKind).build());
} catch (EOFException e) {
logger.error(locale.getString(PluginLang.WEB_SERVER_FAIL_EMPTY_FILE));
} catch (FileNotFoundException e) {
@ -248,10 +245,10 @@ public class WebServer implements SubSystem {
} catch (BindException e) {
throw e; // Pass to above error handler
} catch (IOException e) {
errorLogger.log(L.ERROR, e, ErrorContext.builder().related(config.get(WebserverSettings.INTERNAL_IP) + ":" + port).build());
errorLogger.error(e, ErrorContext.builder().related(config.get(WebserverSettings.INTERNAL_IP) + ":" + port).build());
} catch (KeyStoreException | CertificateException | UnrecoverableKeyException e) {
logger.error(locale.getString(PluginLang.WEB_SERVER_FAIL_STORE_LOAD));
errorLogger.log(L.ERROR, e, ErrorContext.builder()
errorLogger.error(e, ErrorContext.builder()
.whatToDo("Make sure the Certificate settings are correct / You can try remaking the keystore without -passin or -passout parameters.")
.related(keyStorePath).build());
}

View File

@ -16,17 +16,15 @@
*/
package com.djrapitops.plan.delivery.webserver.cache;
import com.djrapitops.plan.DebugChannels;
import com.djrapitops.plan.TaskSystem;
import com.djrapitops.plan.delivery.formatting.Formatter;
import com.djrapitops.plan.delivery.formatting.Formatters;
import com.djrapitops.plan.settings.config.PlanConfig;
import com.djrapitops.plan.settings.config.paths.WebserverSettings;
import com.djrapitops.plan.storage.file.PlanFiles;
import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.logging.console.PluginLogger;
import com.djrapitops.plugin.logging.debug.DebugLogger;
import com.djrapitops.plugin.task.RunnableFactory;
import net.playeranalytics.plugin.scheduling.RunnableFactory;
import net.playeranalytics.plugin.scheduling.TimeAmount;
import net.playeranalytics.plugin.server.PluginLogger;
import org.apache.commons.lang3.StringUtils;
import javax.inject.Inject;
@ -61,7 +59,6 @@ public class JSONFileStorage implements JSONStorage {
private final Pattern timestampRegex = Pattern.compile(".*-([0-9]*).json");
private static final String JSON_FILE_EXTENSION = ".json";
private final DebugLogger debugLogger;
private final Formatter<Long> dateFormatter;
@ -72,7 +69,6 @@ public class JSONFileStorage implements JSONStorage {
PluginLogger logger
) {
this.logger = logger;
debugLogger = logger.getDebugLogger();
dateFormatter = formatters.yearLong();
@ -84,7 +80,6 @@ public class JSONFileStorage implements JSONStorage {
PlanFiles files, Formatter<Long> dateFormatter, PluginLogger logger
) {
this.logger = logger;
debugLogger = logger.getDebugLogger();
this.dateFormatter = dateFormatter;
@ -256,7 +251,6 @@ public class JSONFileStorage implements JSONStorage {
private void deleteFiles(List<File> toDelete) {
for (File fileToDelete : toDelete) {
try {
debugLogger.logOn(DebugChannels.JSON_CACHE, "Deleting " + fileToDelete.getAbsolutePath());
Files.delete(fileToDelete.toPath());
} catch (IOException e) {
// Failed to delete, set for deletion on next server shutdown.
@ -269,24 +263,21 @@ public class JSONFileStorage implements JSONStorage {
public static class CleanTask extends TaskSystem.Task {
private final PlanConfig config;
private final JSONFileStorage jsonFileStorage;
private final DebugLogger debugLogger;
@Inject
public CleanTask(
PlanConfig config,
JSONFileStorage jsonFileStorage,
DebugLogger debugLogger
JSONFileStorage jsonFileStorage
) {
this.config = config;
this.jsonFileStorage = jsonFileStorage;
this.debugLogger = debugLogger;
}
@Override
public void register(RunnableFactory runnableFactory) {
long delay = TimeAmount.toTicks(ThreadLocalRandom.current().nextInt(60), TimeUnit.SECONDS);
long period = TimeAmount.toTicks(1, TimeUnit.HOURS);
runnableFactory.create(null, this).runTaskTimerAsynchronously(delay, period);
runnableFactory.create(this).runTaskTimerAsynchronously(delay, period);
}
@Override
@ -294,14 +285,9 @@ public class JSONFileStorage implements JSONStorage {
long now = System.currentTimeMillis();
long invalidateDiskCacheAfterMs = config.get(WebserverSettings.INVALIDATE_DISK_CACHE);
long invalidateQueriesAfterMs = config.get(WebserverSettings.INVALIDATE_QUERY_RESULTS);
debugLogger.logOn(DebugChannels.JSON_CACHE, "Running clean task..");
jsonFileStorage.invalidateOlder("query", now - invalidateQueriesAfterMs);
jsonFileStorage.invalidateOlderButIgnore(now - invalidateDiskCacheAfterMs, "query");
}
public DebugLogger getDebugLogger() {
return debugLogger;
}
}
}

View File

@ -1,52 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.plan.delivery.webserver.resolver;
import com.djrapitops.plan.delivery.web.resolver.Resolver;
import com.djrapitops.plan.delivery.web.resolver.Response;
import com.djrapitops.plan.delivery.web.resolver.request.Request;
import com.djrapitops.plan.delivery.webserver.ResponseFactory;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.Optional;
/**
* Resolves /debug URL.
*
* @author AuroraLS3
*/
@Singleton
public class DebugPageResolver implements Resolver {
private final ResponseFactory responseFactory;
@Inject
public DebugPageResolver(ResponseFactory responseFactory) {
this.responseFactory = responseFactory;
}
@Override
public boolean canAccess(Request request) {
return request.getUser().map(user -> user.hasPermission("page.debug")).orElse(false);
}
@Override
public Optional<Response> resolve(Request request) {
return Optional.of(responseFactory.debugPageResponse());
}
}

View File

@ -31,8 +31,8 @@ import java.util.Optional;
@Singleton
public class RegisterPageResolver implements NoAuthResolver {
private ResponseFactory responseFactory;
private Lazy<WebServer> webServer;
private final ResponseFactory responseFactory;
private final Lazy<WebServer> webServer;
@Inject
public RegisterPageResolver(

View File

@ -44,8 +44,8 @@ import com.djrapitops.plan.storage.database.queries.objects.GeoInfoQueries;
import com.djrapitops.plan.storage.database.queries.objects.SessionQueries;
import com.djrapitops.plan.storage.database.queries.objects.playertable.QueryTablePlayersQuery;
import com.djrapitops.plan.utilities.java.Maps;
import com.djrapitops.plugin.api.TimeAmount;
import com.google.gson.Gson;
import net.playeranalytics.plugin.scheduling.TimeAmount;
import javax.inject.Inject;
import javax.inject.Singleton;

View File

@ -19,8 +19,8 @@ package com.djrapitops.plan.extension;
import com.djrapitops.plan.TaskSystem;
import com.djrapitops.plan.settings.config.PlanConfig;
import com.djrapitops.plan.settings.config.paths.TimeSettings;
import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.task.RunnableFactory;
import net.playeranalytics.plugin.scheduling.RunnableFactory;
import net.playeranalytics.plugin.scheduling.TimeAmount;
import javax.inject.Inject;
import javax.inject.Singleton;
@ -55,6 +55,6 @@ public class ExtensionServerDataUpdater extends TaskSystem.Task {
public void register(RunnableFactory runnableFactory) {
long period = TimeAmount.toTicks(config.get(TimeSettings.EXTENSION_DATA_REFRESH_PERIOD), TimeUnit.MILLISECONDS);
long delay = TimeAmount.toTicks(30, TimeUnit.SECONDS);
runnableFactory.create(null, this).runTaskTimerAsynchronously(delay, period);
runnableFactory.create(this).runTaskTimerAsynchronously(delay, period);
}
}

View File

@ -16,7 +16,6 @@
*/
package com.djrapitops.plan.extension;
import com.djrapitops.plan.DebugChannels;
import com.djrapitops.plan.exceptions.DataExtensionMethodCallException;
import com.djrapitops.plan.extension.implementation.CallerImplementation;
import com.djrapitops.plan.extension.implementation.ExtensionRegister;
@ -30,8 +29,7 @@ import com.djrapitops.plan.settings.config.PlanConfig;
import com.djrapitops.plan.storage.database.DBSystem;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.logging.L;
import com.djrapitops.plugin.logging.console.PluginLogger;
import net.playeranalytics.plugin.server.PluginLogger;
import javax.inject.Inject;
import javax.inject.Singleton;
@ -95,7 +93,7 @@ public class ExtensionSvc implements ExtensionService {
}
logger.warn("One or more extensions failed to register (They can be disabled in Plan config).");
errorLogger.log(L.WARN, failedToRegisterOne, context.build());
errorLogger.warn(failedToRegisterOne, context.build());
}
}
@ -124,9 +122,7 @@ public class ExtensionSvc implements ExtensionService {
public void unregister(DataExtension extension) {
ExtensionWrapper extractor = new ExtensionWrapper(extension);
String pluginName = extractor.getPluginName();
if (extensionGatherers.remove(pluginName) != null) {
logger.getDebugLogger().logOn(DebugChannels.DATA_EXTENSIONS, pluginName + " extension unregistered.");
}
extensionGatherers.remove(pluginName);
}
private boolean shouldNotAllowRegistration(String pluginName) {
@ -136,7 +132,7 @@ public class ExtensionSvc implements ExtensionService {
try {
pluginsConfig.createSection(pluginName);
} catch (IOException e) {
errorLogger.log(L.WARN, e, ErrorContext.builder()
errorLogger.warn(e, ErrorContext.builder()
.whatToDo("Create 'Plugins." + pluginName + ".Enabled: true' setting manually.")
.related("Section: " + pluginName).build());
logger.warn("Could not register DataExtension for " + pluginName + " due to " + e.toString());
@ -144,11 +140,8 @@ public class ExtensionSvc implements ExtensionService {
}
}
if (!pluginsConfig.isEnabled(pluginName)) {
logger.getDebugLogger().logOn(DebugChannels.DATA_EXTENSIONS, pluginName + " extension disabled in the config.");
return true;
}
return false; // Should register.
// Should the extension not be registered?
return !pluginsConfig.isEnabled(pluginName);
}
public void updatePlayerValues(UUID playerUUID, String playerName, CallEvents event) {
@ -162,11 +155,7 @@ public class ExtensionSvc implements ExtensionService {
if (playerUUID == null && playerName == null) return;
try {
logger.getDebugLogger().logOn(DebugChannels.DATA_EXTENSIONS, "Gathering values for: " + playerName);
gatherer.updateValues(playerUUID, playerName);
logger.getDebugLogger().logOn(DebugChannels.DATA_EXTENSIONS, "Gathering completed: " + playerName);
} catch (DataExtensionMethodCallException methodCallFailed) {
logFailure(playerName, methodCallFailed);
methodCallFailed.getMethod().ifPresent(gatherer::disableMethodFromUse);
@ -176,7 +165,7 @@ public class ExtensionSvc implements ExtensionService {
.related(gatherer.getPluginName())
.related(event)
.related("Player: " + playerName + " " + playerUUID);
errorLogger.log(L.WARN, unexpectedError, context.build());
errorLogger.warn(unexpectedError, context.build());
}
}
@ -187,7 +176,7 @@ public class ExtensionSvc implements ExtensionService {
.related(methodCallFailed.getPluginName())
.related("Method:" + methodCallFailed.getMethod().map(MethodWrapper::getMethodName).orElse("-"))
.related("Player: " + playerName);
errorLogger.log(L.WARN, cause, context.build());
errorLogger.warn(cause, context.build());
}
public void updateServerValues(CallEvents event) {
@ -200,11 +189,7 @@ public class ExtensionSvc implements ExtensionService {
if (gatherer.shouldSkipEvent(event)) return;
try {
logger.getDebugLogger().logOn(DebugChannels.DATA_EXTENSIONS, "Gathering values for server");
gatherer.updateValues();
logger.getDebugLogger().logOn(DebugChannels.DATA_EXTENSIONS, "Gathering completed for server");
} catch (DataExtensionMethodCallException methodCallFailed) {
logFailure("server", methodCallFailed);
methodCallFailed.getMethod().ifPresent(gatherer::disableMethodFromUse);
@ -214,7 +199,7 @@ public class ExtensionSvc implements ExtensionService {
.related(gatherer.getPluginName())
.related(event)
.related("Gathering for server");
errorLogger.log(L.WARN, unexpectedError, context.build());
errorLogger.warn(unexpectedError, context.build());
}
}
}

View File

@ -20,11 +20,12 @@ import com.djrapitops.plan.extension.ElementOrder;
import com.djrapitops.plan.extension.icon.Color;
import com.djrapitops.plan.extension.icon.Family;
import com.djrapitops.plan.extension.icon.Icon;
import com.djrapitops.plugin.utilities.ArrayUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.text.TextStringBuilder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Optional;
import java.util.List;
/**
* Represents a tab of {@link com.djrapitops.plan.extension.DataExtension} defined by {@link com.djrapitops.plan.extension.annotation.Tab} and
@ -36,10 +37,19 @@ public class TabInformation {
private final String tabName;
private final Icon icon; // can be null
private ElementOrder[] elementOrder; // can be null / miss values
private final List<ElementOrder> elementOrder; // can be null / miss values
private final int tabPriority;
public TabInformation(String tabName, Icon icon, ElementOrder[] elementOrder, int tabPriority) {
this(
tabName,
icon,
elementOrder == null ? new ArrayList<>() : Arrays.asList(elementOrder),
tabPriority
);
}
public TabInformation(String tabName, Icon icon, List<ElementOrder> elementOrder, int tabPriority) {
this.tabName = tabName;
this.icon = icon;
this.elementOrder = elementOrder;
@ -62,23 +72,23 @@ public class TabInformation {
return tabPriority;
}
public Optional<ElementOrder[]> getTabElementOrder() {
if (elementOrder == null) {
return Optional.empty();
public List<ElementOrder> getTabElementOrder() {
if (elementOrder.isEmpty()) {
return ElementOrder.valuesAsList();
}
ElementOrder[] possibleValues = ElementOrder.values();
if (elementOrder.length < possibleValues.length) {
if (elementOrder.size() < possibleValues.length) {
addMissingElements(possibleValues);
}
return Optional.of(elementOrder);
return elementOrder;
}
private void addMissingElements(ElementOrder[] possibleValues) {
for (ElementOrder possibleValue : possibleValues) {
if (Arrays.binarySearch(elementOrder, possibleValue) < 0) {
elementOrder = ArrayUtil.merge(elementOrder, new ElementOrder[]{possibleValue});
if (!elementOrder.contains(possibleValue)) {
elementOrder.add(possibleValue);
}
}
}
@ -88,8 +98,12 @@ public class TabInformation {
return "TabInformation{" +
"tabName='" + tabName + '\'' +
", icon=" + icon +
", elementOrder=" + Arrays.toString(elementOrder) +
", elementOrder=" + elementOrder +
", tabPriority=" + tabPriority +
'}';
}
public String getSerializedTabElementOrder() {
return new TextStringBuilder().appendWithSeparators(getTabElementOrder(), ",").build();
}
}

View File

@ -16,7 +16,6 @@
*/
package com.djrapitops.plan.extension.implementation.storage.transactions;
import com.djrapitops.plan.extension.ElementOrder;
import com.djrapitops.plan.extension.implementation.TabInformation;
import com.djrapitops.plan.storage.database.sql.tables.ExtensionIconTable;
import com.djrapitops.plan.storage.database.sql.tables.ExtensionPluginTable;
@ -75,7 +74,7 @@ public class StoreTabInformationTransaction extends ThrowawayTransaction {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
statement.setInt(1, tabInformation.getTabPriority());
statement.setString(2, ElementOrder.serialize(tabInformation.getTabElementOrder().orElse(ElementOrder.values())));
statement.setString(2, tabInformation.getSerializedTabElementOrder());
ExtensionIconTable.set3IconValuesToStatement(statement, 3, tabInformation.getTabIcon());
ExtensionPluginTable.set2PluginValuesToStatement(statement, 6, pluginName, serverUUID);
statement.setString(8, tabInformation.getTabName());
@ -95,7 +94,7 @@ public class StoreTabInformationTransaction extends ThrowawayTransaction {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, tabInformation.getTabName());
statement.setString(2, ElementOrder.serialize(tabInformation.getTabElementOrder().orElse(ElementOrder.values())));
statement.setString(2, tabInformation.getSerializedTabElementOrder());
statement.setInt(3, tabInformation.getTabPriority());
ExtensionIconTable.set3IconValuesToStatement(statement, 4, tabInformation.getTabIcon());
ExtensionPluginTable.set2PluginValuesToStatement(statement, 7, pluginName, serverUUID);

View File

@ -27,8 +27,7 @@ import com.djrapitops.plan.storage.database.Database;
import com.djrapitops.plan.storage.database.transactions.events.ServerShutdownTransaction;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.logging.L;
import com.djrapitops.plugin.logging.console.PluginLogger;
import net.playeranalytics.plugin.server.PluginLogger;
import java.util.Map;
import java.util.Optional;
@ -91,7 +90,7 @@ public abstract class ServerShutdownSave {
prepareSessionsForStorage(activeSessions, System.currentTimeMillis());
return Optional.of(saveActiveSessions(activeSessions));
} catch (DBInitException e) {
errorLogger.log(L.ERROR, e, ErrorContext.builder()
errorLogger.error(e, ErrorContext.builder()
.whatToDo("Find the sessions in the error file and save them manually or ignore. Report & delete the error file after.")
.related("Shutdown save failed to init database.")
.related(activeSessions)

View File

@ -17,7 +17,7 @@
package com.djrapitops.plan.gathering;
import com.djrapitops.plan.TaskSystem;
import com.djrapitops.plugin.task.RunnableFactory;
import net.playeranalytics.plugin.scheduling.RunnableFactory;
import javax.inject.Inject;
import javax.inject.Singleton;
@ -96,7 +96,7 @@ public class ShutdownHook extends Thread {
@Override
public void register(RunnableFactory runnableFactory) {
runnableFactory.create(null, this).runTaskAsynchronously();
runnableFactory.create(this).runTaskAsynchronously();
}
}
}

View File

@ -23,7 +23,6 @@ import com.djrapitops.plan.identification.ServerInfo;
import com.djrapitops.plan.storage.database.DBSystem;
import com.djrapitops.plan.storage.database.queries.objects.NicknameQueries;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.logging.L;
import javax.inject.Inject;
import javax.inject.Singleton;
@ -99,7 +98,7 @@ public class NicknameCache implements SubSystem {
NicknameQueries.fetchLastSeenNicknameOfPlayer(uuid, serverInfo.getServerUUID())
).map(Nickname::getName);
} catch (DBOpException e) {
errorLogger.log(L.ERROR, e);
errorLogger.error(e);
}
return Optional.empty();
}

View File

@ -16,8 +16,6 @@
*/
package com.djrapitops.plan.gathering.domain;
import com.djrapitops.plugin.utilities.Verify;
import java.util.Objects;
import java.util.UUID;
@ -36,8 +34,8 @@ public class BaseUser {
private final int timesKicked;
public BaseUser(UUID uuid, String name, long registered, int timesKicked) {
Verify.nullCheck(uuid, () -> new IllegalArgumentException("'uuid' can not be null"));
Verify.nullCheck(name, () -> new IllegalArgumentException("'name' can not be null"));
if (uuid == null) throw new IllegalArgumentException("'uuid' can not be null");
if (name == null) throw new IllegalArgumentException("'name' can not be null");
this.uuid = uuid;
this.name = name;

View File

@ -16,8 +16,6 @@
*/
package com.djrapitops.plan.gathering.domain;
import com.djrapitops.plugin.utilities.Verify;
import java.util.Map;
import java.util.Optional;
@ -92,7 +90,7 @@ public class GMTimes extends TimeKeeper {
* @throws IllegalArgumentException If any parameter is null.
*/
public void setAllGMTimes(long... times) {
Verify.nullCheck(times);
if (times == null) throw new IllegalArgumentException("'times' should not be null!");
String[] gms = getGMKeyArray();
int size = times.length;
for (int i = 0; i < 4; i++) {

View File

@ -16,8 +16,6 @@
*/
package com.djrapitops.plan.gathering.domain;
import com.djrapitops.plugin.utilities.Verify;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
@ -63,11 +61,14 @@ public class TimeKeeper {
* @throws IllegalArgumentException If given state is null
*/
public void setTime(String state, long time) {
times.put(Verify.nullCheck(state), time);
if (state == null) throw new IllegalArgumentException("'state' should not be null");
times.put(state, time);
}
public void renameState(String state, String renameTo) {
Verify.nullCheck(state, renameTo);
if (state == null) throw new IllegalArgumentException("'state' should not be null");
if (renameTo == null) throw new IllegalArgumentException("'renameTo' should not be null");
Long time = times.get(state);
if (time != null) {
times.put(renameTo, time);
@ -82,11 +83,12 @@ public class TimeKeeper {
* Adds time to the last state while updating the status of other parameters.
*
* @param newState New State seen in.
* @param ms Epoch ms the change occurred.
* @param ms Epoch ms the change occurred.
* @throws IllegalArgumentException If newState is null.
*/
public void changeState(String newState, long ms) {
Verify.nullCheck(newState);
if (newState == null) throw new IllegalArgumentException("'newState' should not be null");
if (state == null) {
state = newState;
}
@ -98,12 +100,14 @@ public class TimeKeeper {
}
protected void resetState(String state) {
times.remove(Verify.nullCheck(state));
if (state == null) throw new IllegalArgumentException("'state' should not be null");
times.remove(state);
}
protected void resetState(String state, long time) {
if (state == null) throw new IllegalArgumentException("'state' should not be null");
if (time > 0) {
times.put(Verify.nullCheck(state), time);
times.put(state, time);
lastStateChange = time;
this.state = state;
} else {

View File

@ -22,11 +22,10 @@ import com.djrapitops.plan.settings.config.PlanConfig;
import com.djrapitops.plan.settings.config.paths.DataGatheringSettings;
import com.djrapitops.plan.settings.locale.Locale;
import com.djrapitops.plan.settings.locale.lang.PluginLang;
import com.djrapitops.plugin.logging.console.PluginLogger;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import net.playeranalytics.plugin.scheduling.RunnableFactory;
import net.playeranalytics.plugin.server.PluginLogger;
import javax.inject.Inject;
import javax.inject.Singleton;
@ -77,12 +76,9 @@ public class GeolocationCache implements SubSystem {
@Override
public void enable() {
if (config.isTrue(DataGatheringSettings.GEOLOCATIONS)) {
runnableFactory.create("Geolocator init", new AbsRunnable() {
@Override
public void run() {
if (inUseGeolocator == null) tryToPrepareGeoLite2();
if (inUseGeolocator == null) logger.error("Failed to enable geolocation.");
}
runnableFactory.create(() -> {
if (inUseGeolocator == null) tryToPrepareGeoLite2();
if (inUseGeolocator == null) logger.error("Failed to enable geolocation.");
}).runTaskAsynchronously();
} else {
logger.info(locale.getString(PluginLang.ENABLE_NOTIFY_GEOLOCATIONS_DISABLED));

View File

@ -18,7 +18,6 @@ package com.djrapitops.plan.gathering.importing;
import com.djrapitops.plan.SubSystem;
import com.djrapitops.plan.gathering.importing.importers.Importer;
import com.djrapitops.plugin.utilities.Verify;
import javax.inject.Inject;
import javax.inject.Singleton;
@ -49,7 +48,7 @@ public class ImportSystem implements SubSystem {
}
public void registerImporter(Importer importer) {
Verify.nullCheck(importer, () -> new IllegalArgumentException("Importer cannot be null"));
if (importer == null) throw new IllegalArgumentException("Importer cannot be null");
importers.put(importer.getName(), importer);
}

View File

@ -25,7 +25,7 @@ import com.djrapitops.plan.utilities.analysis.Average;
import com.djrapitops.plan.utilities.analysis.Maximum;
import com.djrapitops.plan.utilities.analysis.TimerAverage;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.logging.console.PluginLogger;
import net.playeranalytics.plugin.server.PluginLogger;
import javax.inject.Inject;
import javax.inject.Singleton;

View File

@ -25,7 +25,7 @@ import com.djrapitops.plan.utilities.analysis.Average;
import com.djrapitops.plan.utilities.analysis.Maximum;
import com.djrapitops.plan.utilities.analysis.TimerAverage;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.logging.console.PluginLogger;
import net.playeranalytics.plugin.server.PluginLogger;
import javax.inject.Inject;
import javax.inject.Singleton;

View File

@ -22,10 +22,9 @@ import com.djrapitops.plan.settings.config.PlanConfig;
import com.djrapitops.plan.settings.config.paths.DataGatheringSettings;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.logging.L;
import com.djrapitops.plugin.logging.console.PluginLogger;
import com.djrapitops.plugin.task.RunnableFactory;
import net.playeranalytics.plugin.scheduling.RunnableFactory;
import net.playeranalytics.plugin.scheduling.TimeAmount;
import net.playeranalytics.plugin.server.PluginLogger;
import javax.inject.Inject;
import javax.inject.Singleton;
@ -92,7 +91,7 @@ public class SystemUsageBuffer {
public void register(RunnableFactory runnableFactory) {
long delay = TimeAmount.toTicks(1, TimeUnit.MINUTES) - TimeAmount.toTicks(500, TimeUnit.MILLISECONDS);
long period = TimeAmount.toTicks(1, TimeUnit.SECONDS);
runnableFactory.create(null, this).runTaskTimerAsynchronously(delay, period);
runnableFactory.create(this).runTaskTimerAsynchronously(delay, period);
}
}
@ -122,7 +121,7 @@ public class SystemUsageBuffer {
buffer.freeDiskSpace = SystemUsage.getFreeDiskSpace();
} catch (SecurityException noPermission) {
if (!diskErrored) {
errorLogger.log(L.WARN, noPermission, ErrorContext.builder()
errorLogger.warn(noPermission, ErrorContext.builder()
.whatToDo("Resolve " + noPermission.getMessage() + " via OS or JVM permissions").build());
}
diskErrored = true;
@ -136,7 +135,7 @@ public class SystemUsageBuffer {
public void register(RunnableFactory runnableFactory) {
long delay = TimeAmount.toTicks(50, TimeUnit.SECONDS);
long period = TimeAmount.toTicks(1, TimeUnit.SECONDS);
runnableFactory.create(null, this).runTaskTimerAsynchronously(delay, period);
runnableFactory.create(this).runTaskTimerAsynchronously(delay, period);
}
}

View File

@ -19,10 +19,9 @@ package com.djrapitops.plan.gathering.timed;
import com.djrapitops.plan.TaskSystem;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.logging.L;
import com.djrapitops.plugin.logging.console.PluginLogger;
import com.djrapitops.plugin.task.RunnableFactory;
import net.playeranalytics.plugin.scheduling.RunnableFactory;
import net.playeranalytics.plugin.scheduling.TimeAmount;
import net.playeranalytics.plugin.server.PluginLogger;
import java.util.concurrent.TimeUnit;
@ -50,7 +49,7 @@ public abstract class TPSCounter extends TaskSystem.Task {
pulse();
} catch (Exception | NoClassDefFoundError | NoSuchMethodError | NoSuchFieldError e) {
logger.error("TPS Count Task Disabled due to error, reload Plan to re-enable.");
errorLogger.log(L.ERROR, e, ErrorContext.builder().whatToDo("See if a restart fixes this or Report this").build());
errorLogger.error(e, ErrorContext.builder().whatToDo("See if a restart fixes this or Report this").build());
cancel();
}
}
@ -58,7 +57,7 @@ public abstract class TPSCounter extends TaskSystem.Task {
public void register(RunnableFactory runnableFactory) {
long delay = TimeAmount.toTicks(1L, TimeUnit.MINUTES);
long period = TimeAmount.toTicks(1L, TimeUnit.SECONDS);
runnableFactory.create(null, this).runTaskTimer(delay, period);
runnableFactory.create(this).runTaskTimer(delay, period);
}
public abstract void pulse();

View File

@ -20,8 +20,7 @@ import com.djrapitops.plan.exceptions.database.DBOpException;
import com.djrapitops.plan.storage.database.DBSystem;
import com.djrapitops.plan.storage.database.queries.objects.UserIdentifierQueries;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.api.utility.UUIDFetcher;
import com.djrapitops.plugin.logging.L;
import net.playeranalytics.plugin.player.UUIDFetcher;
import javax.inject.Inject;
import javax.inject.Singleton;
@ -93,7 +92,7 @@ public class UUIDUtility {
try {
return dbSystem.getDatabase().query(UserIdentifierQueries.fetchPlayerUUIDOf(playerName));
} catch (DBOpException e) {
errorLogger.log(L.ERROR, e);
errorLogger.error(e);
return Optional.empty();
}
}

View File

@ -1,90 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.plan.modules;
import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.IPlugin;
import com.djrapitops.plugin.benchmarking.Timings;
import com.djrapitops.plugin.command.ColorScheme;
import com.djrapitops.plugin.logging.console.PluginLogger;
import com.djrapitops.plugin.logging.debug.DebugLogger;
import com.djrapitops.plugin.logging.error.ErrorHandler;
import com.djrapitops.plugin.task.RunnableFactory;
import dagger.Module;
import dagger.Provides;
import javax.inject.Named;
import javax.inject.Singleton;
/**
* Dagger module for defining Abstract Plugin Framework utilities.
*
* @author AuroraLS3
*/
@Module
public class APFModule {
@Provides
@Singleton
IPlugin provideIPlugin(PlanPlugin plugin) {
return plugin;
}
@Provides
@Named("currentVersion")
@Singleton
String provideCurrentVersion(IPlugin plugin) {
return plugin.getVersion().replace("%buildNumber%", "?");
}
@Provides
@Singleton
ColorScheme provideColorScheme(PlanPlugin plugin) {
return plugin.getColorScheme();
}
@Provides
@Singleton
DebugLogger provideDebugLogger(IPlugin plugin) {
return plugin.getDebugLogger();
}
@Provides
@Singleton
PluginLogger providePluginLogger(IPlugin plugin) {
return plugin.getPluginLogger();
}
@Provides
@Singleton
ErrorHandler provideErrorHandler(ErrorLogger errorLogger) {
return errorLogger;
}
@Provides
@Singleton
Timings provideTimings(IPlugin plugin) {
return plugin.getTimings();
}
@Provides
@Singleton
RunnableFactory provideRunnableFactory(IPlugin plugin) {
return plugin.getRunnableFactory();
}
}

View File

@ -0,0 +1,83 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.plan.modules;
import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.commands.use.ColorScheme;
import dagger.Module;
import dagger.Provides;
import net.playeranalytics.plugin.PlatformAbstractionLayer;
import net.playeranalytics.plugin.PluginInformation;
import net.playeranalytics.plugin.dependencies.DependencyLoader;
import net.playeranalytics.plugin.scheduling.RunnableFactory;
import net.playeranalytics.plugin.server.Listeners;
import net.playeranalytics.plugin.server.PluginLogger;
import javax.inject.Named;
import javax.inject.Singleton;
/**
* Dagger module for defining Platform Abstraction Layer utilities.
*
* @author AuroraLS3
*/
@Module
public class PlatformAbstractionLayerModule {
@Provides
@Named("currentVersion")
@Singleton
String provideCurrentVersion(PluginInformation pluginInformation) {
return pluginInformation.getVersion();
}
@Provides
@Singleton
ColorScheme provideColorScheme(PlanPlugin plugin) {
return plugin.getColorScheme();
}
@Provides
@Singleton
PluginLogger providePluginLogger(PlatformAbstractionLayer abstractionLayer) {
return abstractionLayer.getPluginLogger();
}
@Provides
@Singleton
RunnableFactory provideRunnableFactory(PlatformAbstractionLayer abstractionLayer) {
return abstractionLayer.getRunnableFactory();
}
@Provides
@Singleton
DependencyLoader provideDependencyLoader(PlatformAbstractionLayer abstractionLayer) {
return abstractionLayer.getDependencyLoader();
}
@Provides
@Singleton
Listeners provideListeners(PlatformAbstractionLayer abstractionLayer) {
return abstractionLayer.getListeners();
}
@Provides
@Singleton
PluginInformation providePluginInformation(PlatformAbstractionLayer abstractionLayer) {
return abstractionLayer.getPluginInformation();
}
}

View File

@ -18,7 +18,6 @@ package com.djrapitops.plan.modules;
import com.djrapitops.plan.DataService;
import com.djrapitops.plan.DataSvc;
import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.delivery.webserver.cache.JSONFileStorage;
import com.djrapitops.plan.delivery.webserver.cache.JSONMemoryStorageShim;
import com.djrapitops.plan.delivery.webserver.cache.JSONStorage;
@ -33,6 +32,7 @@ import com.djrapitops.plan.utilities.logging.PluginErrorLogger;
import dagger.Module;
import dagger.Provides;
import dagger.multibindings.ElementsIntoSet;
import net.playeranalytics.plugin.PluginInformation;
import javax.inject.Named;
import javax.inject.Singleton;
@ -76,15 +76,15 @@ public class SystemObjectProvidingModule {
@Provides
@Singleton
JarResource.StreamFunction provideJarStreamFunction(PlanPlugin plugin) {
return plugin::getResource;
JarResource.StreamFunction provideJarStreamFunction(PluginInformation pluginInformation) {
return pluginInformation::getResourceFromJar;
}
@Provides
@Singleton
@Named("dataFolder")
File provideDataFolder(PlanPlugin plugin) {
return plugin.getDataFolder();
File provideDataFolder(PluginInformation pluginInformation) {
return pluginInformation.getDataFolder();
}
@Provides

View File

@ -21,9 +21,8 @@ import com.djrapitops.plan.settings.locale.Locale;
import com.djrapitops.plan.settings.locale.lang.PluginLang;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.logging.L;
import com.djrapitops.plugin.logging.console.PluginLogger;
import dagger.Lazy;
import net.playeranalytics.plugin.server.PluginLogger;
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import javax.inject.Inject;
@ -59,7 +58,7 @@ public class Processing implements SubSystem {
new BasicThreadFactory.Builder()
.namingPattern(s)
.uncaughtExceptionHandler((thread, throwable) ->
errorLogger.log(L.WARN, throwable, ErrorContext.builder().build())
errorLogger.warn(throwable, ErrorContext.builder().build())
).build());
}
@ -111,14 +110,14 @@ public class Processing implements SubSystem {
private <T> T exceptionHandlerNonCritical(T t, Throwable throwable) {
if (throwable != null) {
errorLogger.log(L.WARN, throwable.getCause(), ErrorContext.builder().build());
errorLogger.warn(throwable.getCause(), ErrorContext.builder().build());
}
return t;
}
private <T> T exceptionHandlerCritical(T t, Throwable throwable) {
if (throwable != null) {
errorLogger.log(L.ERROR, throwable.getCause(), ErrorContext.builder().build());
errorLogger.error(throwable.getCause(), ErrorContext.builder().build());
}
return t;
}
@ -164,7 +163,7 @@ public class Processing implements SubSystem {
try {
runnable.run();
} catch (Exception | NoClassDefFoundError | NoSuchMethodError | NoSuchFieldError e) {
errorLogger.log(L.WARN, e, ErrorContext.builder().build());
errorLogger.warn(e, ErrorContext.builder().build());
}
}
}

View File

@ -26,7 +26,6 @@ import com.djrapitops.plan.storage.database.queries.QueryAPIQuery;
import com.djrapitops.plan.storage.database.transactions.Transaction;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.logging.L;
import javax.inject.Inject;
import javax.inject.Singleton;
@ -108,7 +107,7 @@ public class QuerySvc implements QueryService {
try {
subscriber.accept(playerUUID);
} catch (DBOpException e) {
errorLogger.log(L.WARN, e, ErrorContext.builder()
errorLogger.warn(e, ErrorContext.builder()
.whatToDo("Report to this Query API user " + subscriber.getClass().getName())
.related("Subscriber: " + subscriber.getClass().getName()).build());
}
@ -120,7 +119,7 @@ public class QuerySvc implements QueryService {
try {
function.apply();
} catch (DBOpException e) {
errorLogger.log(L.WARN, e, ErrorContext.builder()
errorLogger.warn(e, ErrorContext.builder()
.whatToDo("Report to this Query API user " + function.getClass().getName())
.related("Subscriber: " + function.getClass().getName()).build());
}

Some files were not shown because too many files have changed in this diff Show More