From e6eac6fa5de2b21bf0c704c4bd39ea3b2c467632 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Wed, 11 Apr 2018 17:36:16 +0300 Subject: [PATCH] Sponge TaskSystem, fix to DeathListener --- .../listeners/sponge/SpongeDeathListener.java | 9 +- .../plan/system/tasks/BukkitTaskSystem.java | 62 +---------- .../plan/system/tasks/BungeeTaskSystem.java | 2 +- .../plan/system/tasks/ServerTaskSystem.java | 69 ++++++++++++ .../plan/system/tasks/SpongeTaskSystem.java | 19 +++- .../{bukkit => server}/BootAnalysisTask.java | 2 +- .../BukkitTPSCountTimer.java | 2 +- .../NetworkPageRefreshTask.java | 2 +- .../PaperTPSCountTimer.java | 2 +- .../PeriodicAnalysisTask.java | 2 +- .../tasks/server/SpongeTPSCountTimer.java | 103 ++++++++++++++++++ .../djrapitops/plan/utilities/MiscUtils.java | 10 +- 12 files changed, 208 insertions(+), 76 deletions(-) create mode 100644 Plan/src/main/java/com/djrapitops/plan/system/tasks/ServerTaskSystem.java rename Plan/src/main/java/com/djrapitops/plan/system/tasks/{bukkit => server}/BootAnalysisTask.java (96%) rename Plan/src/main/java/com/djrapitops/plan/system/tasks/{bukkit => server}/BukkitTPSCountTimer.java (98%) rename Plan/src/main/java/com/djrapitops/plan/system/tasks/{bukkit => server}/NetworkPageRefreshTask.java (90%) rename Plan/src/main/java/com/djrapitops/plan/system/tasks/{bukkit => server}/PaperTPSCountTimer.java (96%) rename Plan/src/main/java/com/djrapitops/plan/system/tasks/{bukkit => server}/PeriodicAnalysisTask.java (96%) create mode 100644 Plan/src/main/java/com/djrapitops/plan/system/tasks/server/SpongeTPSCountTimer.java diff --git a/Plan/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongeDeathListener.java b/Plan/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongeDeathListener.java index 93b5cc42a..88d0118df 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongeDeathListener.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongeDeathListener.java @@ -7,6 +7,7 @@ import com.djrapitops.plan.system.processing.processors.player.SpongeKillProcess import com.djrapitops.plan.utilities.MiscUtils; import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.utilities.Format; +import org.spongepowered.api.data.key.Keys; import org.spongepowered.api.data.type.HandTypes; import org.spongepowered.api.entity.Entity; import org.spongepowered.api.entity.living.Living; @@ -77,9 +78,13 @@ public class SpongeDeathListener { } private SpongeKillProcessor handleWolfKill(long time, Living dead, Wolf wolf) { - Optional creator = wolf.getCreator(); + Optional> owner = wolf.get(Keys.TAMED_OWNER); - return creator.map( + if (!owner.isPresent()) { + return null; + } + + return owner.get().map( uuid -> new SpongeKillProcessor(uuid, time, dead, "Wolf") ).orElse(null); } diff --git a/Plan/src/main/java/com/djrapitops/plan/system/tasks/BukkitTaskSystem.java b/Plan/src/main/java/com/djrapitops/plan/system/tasks/BukkitTaskSystem.java index 087ad6744..b9f18a62e 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/tasks/BukkitTaskSystem.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/tasks/BukkitTaskSystem.java @@ -5,17 +5,9 @@ package com.djrapitops.plan.system.tasks; import com.djrapitops.plan.Plan; -import com.djrapitops.plan.system.settings.Settings; -import com.djrapitops.plan.system.settings.locale.Locale; -import com.djrapitops.plan.system.settings.locale.Msg; -import com.djrapitops.plan.system.tasks.bukkit.*; -import com.djrapitops.plan.utilities.file.export.HtmlExport; -import com.djrapitops.plugin.api.Benchmark; +import com.djrapitops.plan.system.tasks.server.BukkitTPSCountTimer; +import com.djrapitops.plan.system.tasks.server.PaperTPSCountTimer; import com.djrapitops.plugin.api.Check; -import com.djrapitops.plugin.api.TimeAmount; -import com.djrapitops.plugin.api.utility.log.Log; -import com.djrapitops.plugin.task.ITask; -import com.djrapitops.plugin.task.RunnableFactory; import org.bukkit.Bukkit; /** @@ -23,62 +15,18 @@ import org.bukkit.Bukkit; * * @author Rsl1122 */ -public class BukkitTaskSystem extends TaskSystem { - - private ITask bootAnalysisTask; - - private final Plan plugin; +public class BukkitTaskSystem extends ServerTaskSystem { public BukkitTaskSystem(Plan plugin) { + super(plugin); tpsCountTimer = Check.isPaperAvailable() ? new PaperTPSCountTimer(plugin) : new BukkitTPSCountTimer(plugin); - - this.plugin = plugin; - } - - @Override - public void enable() { - registerTasks(); } @Override public void disable() { super.disable(); - Bukkit.getScheduler().cancelTasks(plugin); - } - - private void registerTasks() { - Benchmark.start("Task Registration"); - - // Analysis refresh settings - int analysisRefreshMinutes = Settings.ANALYSIS_AUTO_REFRESH.getNumber(); - boolean analysisRefreshTaskIsEnabled = analysisRefreshMinutes > 0; - long analysisPeriod = analysisRefreshMinutes * TimeAmount.MINUTE.ticks(); - - Log.info(Locale.get(Msg.ENABLE_BOOT_ANALYSIS_INFO).toString()); - - registerTask(tpsCountTimer).runTaskTimer(1000, TimeAmount.SECOND.ticks()); - registerTask(new NetworkPageRefreshTask()).runTaskTimerAsynchronously(20L, 5L * TimeAmount.MINUTE.ticks()); - bootAnalysisTask = registerTask(new BootAnalysisTask()).runTaskLaterAsynchronously(30L * TimeAmount.SECOND.ticks()); - - if (analysisRefreshTaskIsEnabled) { - registerTask(new PeriodicAnalysisTask()).runTaskTimerAsynchronously(analysisPeriod, analysisPeriod); - } - if (Settings.ANALYSIS_EXPORT.isTrue()) { - RunnableFactory.createNew(new HtmlExport(plugin)).runTaskAsynchronously(); - } - Benchmark.stop("Enable", "Task Registration"); - } - - public void cancelBootAnalysis() { - try { - if (bootAnalysisTask != null) { - bootAnalysisTask.cancel(); - bootAnalysisTask = null; - } - } catch (Exception ignored) { - /* Ignored */ - } + Bukkit.getScheduler().cancelTasks((Plan) plugin); } } \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/system/tasks/BungeeTaskSystem.java b/Plan/src/main/java/com/djrapitops/plan/system/tasks/BungeeTaskSystem.java index bd71063fd..49719b024 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/tasks/BungeeTaskSystem.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/tasks/BungeeTaskSystem.java @@ -6,9 +6,9 @@ package com.djrapitops.plan.system.tasks; import com.djrapitops.plan.PlanBungee; import com.djrapitops.plan.system.settings.Settings; -import com.djrapitops.plan.system.tasks.bukkit.NetworkPageRefreshTask; import com.djrapitops.plan.system.tasks.bungee.BungeeTPSCountTimer; import com.djrapitops.plan.system.tasks.bungee.EnableConnectionTask; +import com.djrapitops.plan.system.tasks.server.NetworkPageRefreshTask; import com.djrapitops.plan.utilities.file.export.HtmlExport; import com.djrapitops.plugin.api.TimeAmount; diff --git a/Plan/src/main/java/com/djrapitops/plan/system/tasks/ServerTaskSystem.java b/Plan/src/main/java/com/djrapitops/plan/system/tasks/ServerTaskSystem.java new file mode 100644 index 000000000..643205841 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/system/tasks/ServerTaskSystem.java @@ -0,0 +1,69 @@ +package com.djrapitops.plan.system.tasks; + +import com.djrapitops.plan.PlanPlugin; +import com.djrapitops.plan.system.settings.Settings; +import com.djrapitops.plan.system.settings.locale.Locale; +import com.djrapitops.plan.system.settings.locale.Msg; +import com.djrapitops.plan.system.tasks.server.BootAnalysisTask; +import com.djrapitops.plan.system.tasks.server.NetworkPageRefreshTask; +import com.djrapitops.plan.system.tasks.server.PeriodicAnalysisTask; +import com.djrapitops.plan.utilities.file.export.HtmlExport; +import com.djrapitops.plugin.api.Benchmark; +import com.djrapitops.plugin.api.TimeAmount; +import com.djrapitops.plugin.api.utility.log.Log; +import com.djrapitops.plugin.task.ITask; +import com.djrapitops.plugin.task.RunnableFactory; + +/** + * Abstracted TaskSystem implementation for both Bukkit and Sponge. + * + * @author Rsl1122 + */ +public class ServerTaskSystem extends TaskSystem { + + protected final PlanPlugin plugin; + protected ITask bootAnalysisTask; + + public ServerTaskSystem(PlanPlugin plugin) { + this.plugin = plugin; + } + + @Override + public void enable() { + registerTasks(); + } + + private void registerTasks() { + Benchmark.start("Task Registration"); + + // Analysis refresh settings + int analysisRefreshMinutes = Settings.ANALYSIS_AUTO_REFRESH.getNumber(); + boolean analysisRefreshTaskIsEnabled = analysisRefreshMinutes > 0; + long analysisPeriod = analysisRefreshMinutes * TimeAmount.MINUTE.ticks(); + + Log.info(Locale.get(Msg.ENABLE_BOOT_ANALYSIS_INFO).toString()); + + registerTask(tpsCountTimer).runTaskTimer(1000, TimeAmount.SECOND.ticks()); + registerTask(new NetworkPageRefreshTask()).runTaskTimerAsynchronously(20L, 5L * TimeAmount.MINUTE.ticks()); + bootAnalysisTask = registerTask(new BootAnalysisTask()).runTaskLaterAsynchronously(30L * TimeAmount.SECOND.ticks()); + + if (analysisRefreshTaskIsEnabled) { + registerTask(new PeriodicAnalysisTask()).runTaskTimerAsynchronously(analysisPeriod, analysisPeriod); + } + if (Settings.ANALYSIS_EXPORT.isTrue()) { + RunnableFactory.createNew(new HtmlExport(plugin)).runTaskAsynchronously(); + } + Benchmark.stop("Enable", "Task Registration"); + } + + public void cancelBootAnalysis() { + try { + if (bootAnalysisTask != null) { + bootAnalysisTask.cancel(); + bootAnalysisTask = null; + } + } catch (Exception ignored) { + /* Ignored */ + } + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/system/tasks/SpongeTaskSystem.java b/Plan/src/main/java/com/djrapitops/plan/system/tasks/SpongeTaskSystem.java index f6f9832f1..e9e8f4c6f 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/tasks/SpongeTaskSystem.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/tasks/SpongeTaskSystem.java @@ -1,9 +1,22 @@ package com.djrapitops.plan.system.tasks; -public class SpongeTaskSystem extends TaskSystem { +import com.djrapitops.plan.PlanSponge; +import com.djrapitops.plan.system.tasks.server.SpongeTPSCountTimer; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.scheduler.Task; + +public class SpongeTaskSystem extends ServerTaskSystem { + + public SpongeTaskSystem(PlanSponge plugin) { + super(plugin); + tpsCountTimer = new SpongeTPSCountTimer(plugin); + } @Override - public void enable() { - + public void disable() { + super.disable(); + for (Task task : Sponge.getScheduler().getScheduledTasks(plugin)) { + task.cancel(); + } } } diff --git a/Plan/src/main/java/com/djrapitops/plan/system/tasks/bukkit/BootAnalysisTask.java b/Plan/src/main/java/com/djrapitops/plan/system/tasks/server/BootAnalysisTask.java similarity index 96% rename from Plan/src/main/java/com/djrapitops/plan/system/tasks/bukkit/BootAnalysisTask.java rename to Plan/src/main/java/com/djrapitops/plan/system/tasks/server/BootAnalysisTask.java index 90cd49488..baa8c53ff 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/tasks/bukkit/BootAnalysisTask.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/tasks/server/BootAnalysisTask.java @@ -1,4 +1,4 @@ -package com.djrapitops.plan.system.tasks.bukkit; +package com.djrapitops.plan.system.tasks.server; import com.djrapitops.plan.PlanPlugin; import com.djrapitops.plan.system.info.InfoSystem; diff --git a/Plan/src/main/java/com/djrapitops/plan/system/tasks/bukkit/BukkitTPSCountTimer.java b/Plan/src/main/java/com/djrapitops/plan/system/tasks/server/BukkitTPSCountTimer.java similarity index 98% rename from Plan/src/main/java/com/djrapitops/plan/system/tasks/bukkit/BukkitTPSCountTimer.java rename to Plan/src/main/java/com/djrapitops/plan/system/tasks/server/BukkitTPSCountTimer.java index 027294e98..0bc8a0b74 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/tasks/bukkit/BukkitTPSCountTimer.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/tasks/server/BukkitTPSCountTimer.java @@ -1,4 +1,4 @@ -package com.djrapitops.plan.system.tasks.bukkit; +package com.djrapitops.plan.system.tasks.server; import com.djrapitops.plan.Plan; import com.djrapitops.plan.data.container.TPS; diff --git a/Plan/src/main/java/com/djrapitops/plan/system/tasks/bukkit/NetworkPageRefreshTask.java b/Plan/src/main/java/com/djrapitops/plan/system/tasks/server/NetworkPageRefreshTask.java similarity index 90% rename from Plan/src/main/java/com/djrapitops/plan/system/tasks/bukkit/NetworkPageRefreshTask.java rename to Plan/src/main/java/com/djrapitops/plan/system/tasks/server/NetworkPageRefreshTask.java index 6589bf4c1..0b598e1dd 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/tasks/bukkit/NetworkPageRefreshTask.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/tasks/server/NetworkPageRefreshTask.java @@ -1,4 +1,4 @@ -package com.djrapitops.plan.system.tasks.bukkit; +package com.djrapitops.plan.system.tasks.server; import com.djrapitops.plan.system.info.InfoSystem; import com.djrapitops.plan.system.info.connection.WebExceptionLogger; diff --git a/Plan/src/main/java/com/djrapitops/plan/system/tasks/bukkit/PaperTPSCountTimer.java b/Plan/src/main/java/com/djrapitops/plan/system/tasks/server/PaperTPSCountTimer.java similarity index 96% rename from Plan/src/main/java/com/djrapitops/plan/system/tasks/bukkit/PaperTPSCountTimer.java rename to Plan/src/main/java/com/djrapitops/plan/system/tasks/server/PaperTPSCountTimer.java index 845a22a9d..00b5fd9ce 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/tasks/bukkit/PaperTPSCountTimer.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/tasks/server/PaperTPSCountTimer.java @@ -1,4 +1,4 @@ -package com.djrapitops.plan.system.tasks.bukkit; +package com.djrapitops.plan.system.tasks.server; import com.djrapitops.plan.Plan; import com.djrapitops.plan.data.container.TPS; diff --git a/Plan/src/main/java/com/djrapitops/plan/system/tasks/bukkit/PeriodicAnalysisTask.java b/Plan/src/main/java/com/djrapitops/plan/system/tasks/server/PeriodicAnalysisTask.java similarity index 96% rename from Plan/src/main/java/com/djrapitops/plan/system/tasks/bukkit/PeriodicAnalysisTask.java rename to Plan/src/main/java/com/djrapitops/plan/system/tasks/server/PeriodicAnalysisTask.java index e3a11f3d1..32436b109 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/tasks/bukkit/PeriodicAnalysisTask.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/tasks/server/PeriodicAnalysisTask.java @@ -1,4 +1,4 @@ -package com.djrapitops.plan.system.tasks.bukkit; +package com.djrapitops.plan.system.tasks.server; import com.djrapitops.plan.PlanPlugin; import com.djrapitops.plan.system.info.InfoSystem; diff --git a/Plan/src/main/java/com/djrapitops/plan/system/tasks/server/SpongeTPSCountTimer.java b/Plan/src/main/java/com/djrapitops/plan/system/tasks/server/SpongeTPSCountTimer.java new file mode 100644 index 000000000..b813d1639 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/system/tasks/server/SpongeTPSCountTimer.java @@ -0,0 +1,103 @@ +package com.djrapitops.plan.system.tasks.server; + +import com.djrapitops.plan.PlanSponge; +import com.djrapitops.plan.data.container.TPS; +import com.djrapitops.plan.data.container.builders.TPSBuilder; +import com.djrapitops.plan.system.info.server.ServerInfo; +import com.djrapitops.plan.system.tasks.TPSCountTimer; +import com.djrapitops.plan.utilities.analysis.MathUtils; +import com.djrapitops.plugin.api.utility.log.Log; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.world.Chunk; +import org.spongepowered.api.world.World; + +import java.lang.management.ManagementFactory; +import java.lang.management.OperatingSystemMXBean; +import java.util.Iterator; + +public class SpongeTPSCountTimer extends TPSCountTimer { + + private long lastCheckNano; + + public SpongeTPSCountTimer(PlanSponge plugin) { + super(plugin); + lastCheckNano = -1; + } + + @Override + public void addNewTPSEntry(long nanoTime, long now) { + long diff = nanoTime - lastCheckNano; + + lastCheckNano = nanoTime; + + if (diff > nanoTime) { // First run's diff = nanoTime + 1, no calc possible. + Log.debug("First run of TPSCountTimer Task."); + return; + } + + history.add(calculateTPS(diff, now)); + } + + /** + * Calculates the TPS + * + * @param diff The time difference between the last run and the new run + * @param now The time right now + * @return the TPS + */ + private TPS calculateTPS(long diff, long now) { + OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean(); + int availableProcessors = operatingSystemMXBean.getAvailableProcessors(); + double averageCPUUsage = MathUtils.round(operatingSystemMXBean.getSystemLoadAverage() / availableProcessors * 100.0); + + if (averageCPUUsage < 0) { // If unavailable, getSystemLoadAverage() returns -1 + averageCPUUsage = -1; + } + + Runtime runtime = Runtime.getRuntime(); + + long totalMemory = runtime.totalMemory(); + long usedMemory = (totalMemory - runtime.freeMemory()) / 1000000; + + double tps = Sponge.getGame().getServer().getTicksPerSecond(); + int playersOnline = ServerInfo.getServerProperties().getOnlinePlayers(); + latestPlayersOnline = playersOnline; + int loadedChunks = getLoadedChunks(); + int entityCount = getEntityCount(); + + return TPSBuilder.get() + .date(now) + .tps(tps) + .playersOnline(playersOnline) + .usedCPU(averageCPUUsage) + .usedMemory(usedMemory) + .entities(entityCount) + .chunksLoaded(loadedChunks) + .toTPS(); + } + + /** + * Gets the amount of loaded chunks + * + * @return amount of loaded chunks + */ + private int getLoadedChunks() { + int loaded = 0; + for (World world : Sponge.getGame().getServer().getWorlds()) { + Iterator iterator = world.getLoadedChunks().iterator(); + while (iterator.hasNext()) { + loaded++; + } + } + return loaded; + } + + /** + * Gets the amount of entities on the server + * + * @return amount of entities + */ + protected int getEntityCount() { + return Sponge.getGame().getServer().getWorlds().stream().mapToInt(world -> world.getEntities().size()).sum(); + } +} diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/MiscUtils.java b/Plan/src/main/java/com/djrapitops/plan/utilities/MiscUtils.java index 722d24b52..18a740eeb 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/MiscUtils.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/MiscUtils.java @@ -1,14 +1,12 @@ package com.djrapitops.plan.utilities; -import com.djrapitops.plan.Plan; -import com.djrapitops.plan.PlanBungee; +import com.djrapitops.plan.PlanPlugin; import com.djrapitops.plan.api.exceptions.database.DBException; import com.djrapitops.plan.system.database.databases.Database; import com.djrapitops.plan.system.settings.Permissions; import com.djrapitops.plan.system.settings.Settings; import com.djrapitops.plan.system.settings.locale.Locale; import com.djrapitops.plan.system.settings.locale.Msg; -import com.djrapitops.plugin.api.Check; import com.djrapitops.plugin.api.TimeAmount; import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.command.CommandUtils; @@ -142,10 +140,6 @@ public class MiscUtils { } public static String getPlanVersion() { - if (Check.isBukkitAvailable()) { - return Plan.getInstance().getDescription().getVersion(); - } else { - return PlanBungee.getInstance().getDescription().getVersion(); - } + return PlanPlugin.getInstance().getVersion(); } }