From 2a03b547c7714a130b2bc1407b12a8abd58a9069 Mon Sep 17 00:00:00 2001 From: Luck Date: Sat, 3 Aug 2019 22:04:20 +0100 Subject: Some more reorganising --- .../me/lucko/spark/bukkit/BukkitSparkPlugin.java | 124 ++++++++++++++++ .../java/me/lucko/spark/bukkit/CommandMapUtil.java | 9 +- .../me/lucko/spark/bukkit/SparkBukkitPlugin.java | 124 ---------------- spark-bukkit/src/main/resources/plugin.yml | 2 +- .../spark/bungeecord/BungeeCordSparkPlugin.java | 95 ++++++++++++ .../spark/bungeecord/SparkBungeeCordPlugin.java | 107 -------------- spark-bungeecord/src/main/resources/bungee.yml | 2 +- .../java/me/lucko/spark/common/SparkPlatform.java | 8 +- .../java/me/lucko/spark/common/SparkPlugin.java | 56 ++++++- .../common/command/modules/ActivityLogModule.java | 2 +- .../spark/common/command/modules/HealthModule.java | 2 +- .../spark/common/command/modules/MemoryModule.java | 8 +- .../common/command/modules/SamplerModule.java | 4 +- .../spark/common/monitor/tick/TickMonitor.java | 6 +- .../me/lucko/spark/common/util/RollingAverage.java | 3 +- spark-forge/build.gradle | 2 +- .../lucko/spark/forge/ForgeClientSparkPlugin.java | 6 +- .../lucko/spark/forge/ForgeServerSparkPlugin.java | 4 +- .../java/me/lucko/spark/forge/ForgeSparkMod.java | 66 +++++++++ .../me/lucko/spark/forge/ForgeSparkPlugin.java | 16 +- .../java/me/lucko/spark/forge/SparkForgeMod.java | 66 --------- spark-sponge/build.gradle | 2 +- .../me/lucko/spark/sponge/SparkSpongePlugin.java | 164 --------------------- .../me/lucko/spark/sponge/SpongeSparkPlugin.java | 164 +++++++++++++++++++++ .../me/lucko/spark/sponge/SpongeTickCounter.java | 4 +- spark-velocity/build.gradle | 2 +- .../lucko/spark/velocity/SparkVelocityPlugin.java | 123 ---------------- .../lucko/spark/velocity/VelocitySparkPlugin.java | 111 ++++++++++++++ 28 files changed, 654 insertions(+), 628 deletions(-) create mode 100644 spark-bukkit/src/main/java/me/lucko/spark/bukkit/BukkitSparkPlugin.java delete mode 100644 spark-bukkit/src/main/java/me/lucko/spark/bukkit/SparkBukkitPlugin.java create mode 100644 spark-bungeecord/src/main/java/me/lucko/spark/bungeecord/BungeeCordSparkPlugin.java delete mode 100644 spark-bungeecord/src/main/java/me/lucko/spark/bungeecord/SparkBungeeCordPlugin.java create mode 100644 spark-forge/src/main/java/me/lucko/spark/forge/ForgeSparkMod.java delete mode 100644 spark-forge/src/main/java/me/lucko/spark/forge/SparkForgeMod.java delete mode 100644 spark-sponge/src/main/java/me/lucko/spark/sponge/SparkSpongePlugin.java create mode 100644 spark-sponge/src/main/java/me/lucko/spark/sponge/SpongeSparkPlugin.java delete mode 100644 spark-velocity/src/main/java/me/lucko/spark/velocity/SparkVelocityPlugin.java create mode 100644 spark-velocity/src/main/java/me/lucko/spark/velocity/VelocitySparkPlugin.java diff --git a/spark-bukkit/src/main/java/me/lucko/spark/bukkit/BukkitSparkPlugin.java b/spark-bukkit/src/main/java/me/lucko/spark/bukkit/BukkitSparkPlugin.java new file mode 100644 index 0000000..5920bd5 --- /dev/null +++ b/spark-bukkit/src/main/java/me/lucko/spark/bukkit/BukkitSparkPlugin.java @@ -0,0 +1,124 @@ +/* + * This file is part of spark. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.lucko.spark.bukkit; + +import me.lucko.spark.common.SparkPlatform; +import me.lucko.spark.common.SparkPlugin; +import me.lucko.spark.common.sampler.ThreadDumper; +import me.lucko.spark.common.sampler.TickCounter; +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.java.JavaPlugin; + +import java.nio.file.Path; +import java.util.List; +import java.util.stream.Stream; + +public class BukkitSparkPlugin extends JavaPlugin implements SparkPlugin { + + private CommandExecutor tpsCommand = null; + private SparkPlatform platform; + + @Override + public void onEnable() { + this.platform = new SparkPlatform(this); + this.platform.enable(); + + // override Spigot's TPS command with our own. + if (getConfig().getBoolean("override-tps-command", true)) { + this.tpsCommand = (sender, command, label, args) -> { + if (!sender.hasPermission("spark") && !sender.hasPermission("spark.tps") && !sender.hasPermission("bukkit.command.tps")) { + sender.sendMessage(ChatColor.RED + "You do not have permission to use this command."); + return true; + } + + BukkitCommandSender s = new BukkitCommandSender(sender) { + @Override + public boolean hasPermission(String permission) { + return true; + } + }; + this.platform.executeCommand(s, new String[]{"tps"}); + return true; + }; + CommandMapUtil.registerCommand(this, this.tpsCommand, "tps"); + } + } + + @Override + public void onDisable() { + this.platform.disable(); + if (this.tpsCommand != null) { + CommandMapUtil.unregisterCommand(this.tpsCommand); + } + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + this.platform.executeCommand(new BukkitCommandSender(sender), args); + return true; + } + + @Override + public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { + return this.platform.tabCompleteCommand(new BukkitCommandSender(sender), args); + } + + @Override + public String getVersion() { + return getDescription().getVersion(); + } + + @Override + public Path getPluginDirectory() { + return getDataFolder().toPath(); + } + + @Override + public String getCommandName() { + return "spark"; + } + + @Override + public Stream getSendersWithPermission(String permission) { + return Stream.concat( + getServer().getOnlinePlayers().stream().filter(player -> player.hasPermission(permission)), + Stream.of(getServer().getConsoleSender()) + ).map(BukkitCommandSender::new); + } + + @Override + public void executeAsync(Runnable task) { + getServer().getScheduler().runTaskAsynchronously(BukkitSparkPlugin.this, task); + } + + @Override + public ThreadDumper getDefaultThreadDumper() { + return new ThreadDumper.Specific(new long[]{Thread.currentThread().getId()}); + } + + @Override + public TickCounter createTickCounter() { + return new BukkitTickCounter(this); + } +} diff --git a/spark-bukkit/src/main/java/me/lucko/spark/bukkit/CommandMapUtil.java b/spark-bukkit/src/main/java/me/lucko/spark/bukkit/CommandMapUtil.java index 66a1568..c65bc23 100644 --- a/spark-bukkit/src/main/java/me/lucko/spark/bukkit/CommandMapUtil.java +++ b/spark-bukkit/src/main/java/me/lucko/spark/bukkit/CommandMapUtil.java @@ -44,7 +44,7 @@ import java.util.Map; /** * Utility for interacting with the server's {@link CommandMap} instance. */ -public final class CommandMapUtil { +final class CommandMapUtil { private static final Constructor COMMAND_CONSTRUCTOR; private static final Field COMMAND_MAP_FIELD; @@ -96,8 +96,11 @@ public final class CommandMapUtil { PluginCommand cmd = COMMAND_CONSTRUCTOR.newInstance(alias, plugin); getCommandMap().register(plugin.getDescription().getName(), cmd); - getKnownCommandMap().put(plugin.getDescription().getName().toLowerCase() + ":" + alias.toLowerCase(), cmd); - getKnownCommandMap().put(alias.toLowerCase(), cmd); + + Map knownCommandMap = getKnownCommandMap(); + knownCommandMap.put(plugin.getDescription().getName().toLowerCase() + ":" + alias.toLowerCase(), cmd); + knownCommandMap.put(alias.toLowerCase(), cmd); + cmd.setLabel(alias.toLowerCase()); cmd.setExecutor(command); diff --git a/spark-bukkit/src/main/java/me/lucko/spark/bukkit/SparkBukkitPlugin.java b/spark-bukkit/src/main/java/me/lucko/spark/bukkit/SparkBukkitPlugin.java deleted file mode 100644 index ebcc3e8..0000000 --- a/spark-bukkit/src/main/java/me/lucko/spark/bukkit/SparkBukkitPlugin.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * This file is part of spark. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package me.lucko.spark.bukkit; - -import me.lucko.spark.common.SparkPlatform; -import me.lucko.spark.common.SparkPlugin; -import me.lucko.spark.common.sampler.ThreadDumper; -import me.lucko.spark.common.sampler.TickCounter; -import org.bukkit.ChatColor; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.java.JavaPlugin; - -import java.nio.file.Path; -import java.util.List; -import java.util.stream.Stream; - -public class SparkBukkitPlugin extends JavaPlugin implements SparkPlugin { - - private CommandExecutor tpsCommand = null; - private SparkPlatform platform; - - @Override - public void onEnable() { - this.platform = new SparkPlatform(this); - this.platform.enable(); - - // override Spigot's TPS command with our own. - if (getConfig().getBoolean("override-tps-command", true)) { - this.tpsCommand = (sender, command, label, args) -> { - if (!sender.hasPermission("spark") && !sender.hasPermission("spark.tps") && !sender.hasPermission("bukkit.command.tps")) { - sender.sendMessage(ChatColor.RED + "You do not have permission to use this command."); - return true; - } - - BukkitCommandSender s = new BukkitCommandSender(sender) { - @Override - public boolean hasPermission(String permission) { - return true; - } - }; - this.platform.executeCommand(s, new String[]{"tps"}); - return true; - }; - CommandMapUtil.registerCommand(this, this.tpsCommand, "tps"); - } - } - - @Override - public void onDisable() { - this.platform.disable(); - if (this.tpsCommand != null) { - CommandMapUtil.unregisterCommand(this.tpsCommand); - } - } - - @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - this.platform.executeCommand(new BukkitCommandSender(sender), args); - return true; - } - - @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { - return this.platform.tabCompleteCommand(new BukkitCommandSender(sender), args); - } - - @Override - public String getVersion() { - return getDescription().getVersion(); - } - - @Override - public Path getPluginFolder() { - return getDataFolder().toPath(); - } - - @Override - public String getLabel() { - return "spark"; - } - - @Override - public Stream getSendersWithPermission(String permission) { - return Stream.concat( - getServer().getOnlinePlayers().stream().filter(player -> player.hasPermission(permission)), - Stream.of(getServer().getConsoleSender()) - ).map(BukkitCommandSender::new); - } - - @Override - public void runAsync(Runnable r) { - getServer().getScheduler().runTaskAsynchronously(SparkBukkitPlugin.this, r); - } - - @Override - public ThreadDumper getDefaultThreadDumper() { - return new ThreadDumper.Specific(new long[]{Thread.currentThread().getId()}); - } - - @Override - public TickCounter createTickCounter() { - return new BukkitTickCounter(this); - } -} diff --git a/spark-bukkit/src/main/resources/plugin.yml b/spark-bukkit/src/main/resources/plugin.yml index d46c54a..c940592 100644 --- a/spark-bukkit/src/main/resources/plugin.yml +++ b/spark-bukkit/src/main/resources/plugin.yml @@ -2,7 +2,7 @@ name: spark version: ${pluginVersion} description: ${pluginDescription} authors: [Luck, sk89q] -main: me.lucko.spark.bukkit.SparkBukkitPlugin +main: me.lucko.spark.bukkit.BukkitSparkPlugin # Mark the plugin as 1.13 compatible to avoid CB having to perform quite as much unnecessary # remapping when the plugin is loaded. Note that despite what this setting might otherwise imply, diff --git a/spark-bungeecord/src/main/java/me/lucko/spark/bungeecord/BungeeCordSparkPlugin.java b/spark-bungeecord/src/main/java/me/lucko/spark/bungeecord/BungeeCordSparkPlugin.java new file mode 100644 index 0000000..0fc85b7 --- /dev/null +++ b/spark-bungeecord/src/main/java/me/lucko/spark/bungeecord/BungeeCordSparkPlugin.java @@ -0,0 +1,95 @@ +/* + * This file is part of spark. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.lucko.spark.bungeecord; + +import me.lucko.spark.common.SparkPlatform; +import me.lucko.spark.common.SparkPlugin; +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.plugin.Command; +import net.md_5.bungee.api.plugin.Plugin; +import net.md_5.bungee.api.plugin.TabExecutor; + +import java.nio.file.Path; +import java.util.stream.Stream; + +public class BungeeCordSparkPlugin extends Plugin implements SparkPlugin { + + private SparkPlatform platform; + + @Override + public void onEnable() { + this.platform = new SparkPlatform(this); + this.platform.enable(); + getProxy().getPluginManager().registerCommand(this, new SparkCommand(this)); + } + + @Override + public void onDisable() { + this.platform.disable(); + } + + @Override + public String getVersion() { + return getDescription().getVersion(); + } + + @Override + public Path getPluginDirectory() { + return getDataFolder().toPath(); + } + + @Override + public String getCommandName() { + return "sparkb"; + } + + @Override + public Stream getSendersWithPermission(String permission) { + return Stream.concat( + getProxy().getPlayers().stream().filter(player -> player.hasPermission(permission)), + Stream.of(getProxy().getConsole()) + ).map(BungeeCordCommandSender::new); + } + + @Override + public void executeAsync(Runnable task) { + getProxy().getScheduler().runAsync(BungeeCordSparkPlugin.this, task); + } + + private static final class SparkCommand extends Command implements TabExecutor { + private final BungeeCordSparkPlugin plugin; + + SparkCommand(BungeeCordSparkPlugin plugin) { + super("sparkb", null, "sparkbungee"); + this.plugin = plugin; + } + + @Override + public void execute(CommandSender sender, String[] args) { + this.plugin.platform.executeCommand(new BungeeCordCommandSender(sender), args); + } + + @Override + public Iterable onTabComplete(CommandSender sender, String[] args) { + return this.plugin.platform.tabCompleteCommand(new BungeeCordCommandSender(sender), args); + } + } +} diff --git a/spark-bungeecord/src/main/java/me/lucko/spark/bungeecord/SparkBungeeCordPlugin.java b/spark-bungeecord/src/main/java/me/lucko/spark/bungeecord/SparkBungeeCordPlugin.java deleted file mode 100644 index 630035b..0000000 --- a/spark-bungeecord/src/main/java/me/lucko/spark/bungeecord/SparkBungeeCordPlugin.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * This file is part of spark. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package me.lucko.spark.bungeecord; - -import me.lucko.spark.common.SparkPlatform; -import me.lucko.spark.common.SparkPlugin; -import me.lucko.spark.common.sampler.ThreadDumper; -import me.lucko.spark.common.sampler.TickCounter; -import net.md_5.bungee.api.CommandSender; -import net.md_5.bungee.api.plugin.Command; -import net.md_5.bungee.api.plugin.Plugin; -import net.md_5.bungee.api.plugin.TabExecutor; - -import java.nio.file.Path; -import java.util.stream.Stream; - -public class SparkBungeeCordPlugin extends Plugin implements SparkPlugin { - - private SparkPlatform platform; - - @Override - public void onEnable() { - this.platform = new SparkPlatform(this); - this.platform.enable(); - getProxy().getPluginManager().registerCommand(this, new SparkCommand(this)); - } - - @Override - public void onDisable() { - this.platform.disable(); - } - - @Override - public String getVersion() { - return getDescription().getVersion(); - } - - @Override - public Path getPluginFolder() { - return getDataFolder().toPath(); - } - - @Override - public String getLabel() { - return "sparkb"; - } - - @Override - public Stream getSendersWithPermission(String permission) { - return Stream.concat( - getProxy().getPlayers().stream().filter(player -> player.hasPermission(permission)), - Stream.of(getProxy().getConsole()) - ).map(BungeeCordCommandSender::new); - } - - @Override - public void runAsync(Runnable r) { - getProxy().getScheduler().runAsync(SparkBungeeCordPlugin.this, r); - } - - @Override - public ThreadDumper getDefaultThreadDumper() { - return ThreadDumper.ALL; - } - - @Override - public TickCounter createTickCounter() { - return null; - } - - private static final class SparkCommand extends Command implements TabExecutor { - private final SparkBungeeCordPlugin plugin; - - SparkCommand(SparkBungeeCordPlugin plugin) { - super("sparkb", null, "sparkbungee"); - this.plugin = plugin; - } - - @Override - public void execute(CommandSender sender, String[] args) { - this.plugin.platform.executeCommand(new BungeeCordCommandSender(sender), args); - } - - @Override - public Iterable onTabComplete(CommandSender sender, String[] args) { - return this.plugin.platform.tabCompleteCommand(new BungeeCordCommandSender(sender), args); - } - } -} diff --git a/spark-bungeecord/src/main/resources/bungee.yml b/spark-bungeecord/src/main/resources/bungee.yml index 4485e11..ccf512e 100644 --- a/spark-bungeecord/src/main/resources/bungee.yml +++ b/spark-bungeecord/src/main/resources/bungee.yml @@ -2,4 +2,4 @@ name: spark version: ${pluginVersion} description: ${pluginDescription} author: Luck, sk89q -main: me.lucko.spark.bungeecord.SparkBungeeCordPlugin +main: me.lucko.spark.bungeecord.BungeeCordSparkPlugin diff --git a/spark-common/src/main/java/me/lucko/spark/common/SparkPlatform.java b/spark-common/src/main/java/me/lucko/spark/common/SparkPlatform.java index e99cb05..db5cb84 100644 --- a/spark-common/src/main/java/me/lucko/spark/common/SparkPlatform.java +++ b/spark-common/src/main/java/me/lucko/spark/common/SparkPlatform.java @@ -84,7 +84,7 @@ public class SparkPlatform { } this.commands = commandsBuilder.build(); - this.activityLog = new ActivityLog(plugin.getPluginFolder().resolve("activity.json")); + this.activityLog = new ActivityLog(plugin.getPluginDirectory().resolve("activity.json")); this.activityLog.load(); this.tickCounter = plugin.createTickCounter(); @@ -142,10 +142,10 @@ public class SparkPlatform { ); resp.replyPrefixed(TextComponent.builder("").color(TextColor.GRAY) .append(TextComponent.of("Use ")) - .append(TextComponent.builder("/" + getPlugin().getLabel() + " help") + .append(TextComponent.builder("/" + getPlugin().getCommandName() + " help") .color(TextColor.WHITE) .decoration(TextDecoration.UNDERLINED, true) - .clickEvent(ClickEvent.runCommand("/" + getPlugin().getLabel() + " help")) + .clickEvent(ClickEvent.runCommand("/" + getPlugin().getCommandName() + " help")) .build() ) .append(TextComponent.of(" to view usage information.")) @@ -204,7 +204,7 @@ public class SparkPlatform { .build() ); for (Command command : this.commands) { - String usage = "/" + getPlugin().getLabel() + " " + command.aliases().get(0); + String usage = "/" + getPlugin().getCommandName() + " " + command.aliases().get(0); ClickEvent clickEvent = ClickEvent.suggestCommand(usage); sender.reply(TextComponent.builder("") .append(TextComponent.builder(">").color(TextColor.GOLD).decoration(TextDecoration.BOLD, true).build()) diff --git a/spark-common/src/main/java/me/lucko/spark/common/SparkPlugin.java b/spark-common/src/main/java/me/lucko/spark/common/SparkPlugin.java index 72bbfbc..7ccffab 100644 --- a/spark-common/src/main/java/me/lucko/spark/common/SparkPlugin.java +++ b/spark-common/src/main/java/me/lucko/spark/common/SparkPlugin.java @@ -26,20 +26,66 @@ import me.lucko.spark.common.sampler.TickCounter; import java.nio.file.Path; import java.util.stream.Stream; +/** + * Spark plugin interface + */ public interface SparkPlugin { + /** + * Gets the version of the plugin. + * + * @return the version + */ String getVersion(); - Path getPluginFolder(); + /** + * Gets the plugins storage/configuration directory. + * + * @return the plugin directory + */ + Path getPluginDirectory(); - String getLabel(); + /** + * Gets the name used for the plugin command. + * + * @return the plugin command name + */ + String getCommandName(); + /** + * Gets a {@link Stream} of the {@link CommandSender}s on the platform with the given + * permission. + * + * @param permission the permission + * @return the stream of command senders + */ Stream getSendersWithPermission(String permission); - void runAsync(Runnable r); + /** + * Executes the given {@link Runnable} asynchronously using the plugins scheduler. + * + * @param task the task + */ + void executeAsync(Runnable task); - ThreadDumper getDefaultThreadDumper(); + /** + * Gets the default {@link ThreadDumper} to be used by the plugin. + * + * @return the default thread dumper + */ + default ThreadDumper getDefaultThreadDumper() { + return ThreadDumper.ALL; + } - TickCounter createTickCounter(); + /** + * Creates a tick counter for the platform, if supported. + * + *

Returns {@code null} if the platform does not have "ticks"

+ * + * @return a new tick counter + */ + default TickCounter createTickCounter() { + return null; + } } diff --git a/spark-common/src/main/java/me/lucko/spark/common/command/modules/ActivityLogModule.java b/spark-common/src/main/java/me/lucko/spark/common/command/modules/ActivityLogModule.java index 9c81f28..e09dc9d 100644 --- a/spark-common/src/main/java/me/lucko/spark/common/command/modules/ActivityLogModule.java +++ b/spark-common/src/main/java/me/lucko/spark/common/command/modules/ActivityLogModule.java @@ -108,7 +108,7 @@ public class ActivityLogModule implements CommandModule, RowRenderer { Pagination activityPagination = this.pagination.build( TextComponent.of("Recent spark activity", TextColor.GOLD), this, - value -> "/" + platform.getPlugin().getLabel() + " activity --page " + value + value -> "/" + platform.getPlugin().getCommandName() + " activity --page " + value ); activityPagination.render(log, page).forEach(resp::reply); }) diff --git a/spark-common/src/main/java/me/lucko/spark/common/command/modules/HealthModule.java b/spark-common/src/main/java/me/lucko/spark/common/command/modules/HealthModule.java index 963ffcd..86ab047 100644 --- a/spark-common/src/main/java/me/lucko/spark/common/command/modules/HealthModule.java +++ b/spark-common/src/main/java/me/lucko/spark/common/command/modules/HealthModule.java @@ -91,7 +91,7 @@ public class HealthModule implements CommandModule { .argumentUsage("memory", null) .executor((platform, sender, resp, arguments) -> { resp.replyPrefixed(TextComponent.of("Generating server health report...")); - platform.getPlugin().runAsync(() -> { + platform.getPlugin().executeAsync(() -> { List report = new LinkedList<>(); report.add(TextComponent.empty()); diff --git a/spark-common/src/main/java/me/lucko/spark/common/command/modules/MemoryModule.java b/spark-common/src/main/java/me/lucko/spark/common/command/modules/MemoryModule.java index 0033716..dcfb0c4 100644 --- a/spark-common/src/main/java/me/lucko/spark/common/command/modules/MemoryModule.java +++ b/spark-common/src/main/java/me/lucko/spark/common/command/modules/MemoryModule.java @@ -62,7 +62,7 @@ public class MemoryModule implements CommandModule { .aliases("heapsummary") .argumentUsage("run-gc-before", null) .executor((platform, sender, resp, arguments) -> { - platform.getPlugin().runAsync(() -> { + platform.getPlugin().executeAsync(() -> { if (arguments.boolFlag("run-gc-before")) { resp.broadcastPrefixed(TextComponent.of("Running garbage collector...")); System.gc(); @@ -110,8 +110,8 @@ public class MemoryModule implements CommandModule { .argumentUsage("run-gc-before", null) .argumentUsage("include-non-live", null) .executor((platform, sender, resp, arguments) -> { - platform.getPlugin().runAsync(() -> { - Path pluginFolder = platform.getPlugin().getPluginFolder(); + platform.getPlugin().executeAsync(() -> { + Path pluginFolder = platform.getPlugin().getPluginDirectory(); try { Files.createDirectories(pluginFolder); } catch (IOException e) { @@ -153,7 +153,7 @@ public class MemoryModule implements CommandModule { if (timeSinceLastReport > TimeUnit.SECONDS.toMillis(5)) { lastReport.set(System.currentTimeMillis()); - platform.getPlugin().runAsync(() -> { + platform.getPlugin().executeAsync(() -> { resp.broadcastPrefixed(TextComponent.builder("").color(TextColor.GRAY) .append(TextComponent.of("Compressed ")) .append(TextComponent.of(FormatUtil.formatBytes(progress), TextColor.GOLD)) diff --git a/spark-common/src/main/java/me/lucko/spark/common/command/modules/SamplerModule.java b/spark-common/src/main/java/me/lucko/spark/common/command/modules/SamplerModule.java index fe7ffe0..9f14e6e 100644 --- a/spark-common/src/main/java/me/lucko/spark/common/command/modules/SamplerModule.java +++ b/spark-common/src/main/java/me/lucko/spark/common/command/modules/SamplerModule.java @@ -196,7 +196,7 @@ public class SamplerModule implements CommandModule { resp.broadcastPrefixed(TextComponent.of("Profiler now active!", TextColor.GOLD)); if (timeoutSeconds == -1) { - resp.broadcastPrefixed(TextComponent.of("Use '/" + platform.getPlugin().getLabel() + " sampler --stop' to stop profiling and upload the results.")); + resp.broadcastPrefixed(TextComponent.of("Use '/" + platform.getPlugin().getCommandName() + " sampler --stop' to stop profiling and upload the results.")); } else { resp.broadcastPrefixed(TextComponent.of("The results will be automatically returned after the profiler has been running for " + timeoutSeconds + " seconds.")); } @@ -246,7 +246,7 @@ public class SamplerModule implements CommandModule { } private void handleUpload(SparkPlatform platform, CommandResponseHandler resp, Sampler sampler) { - platform.getPlugin().runAsync(() -> { + platform.getPlugin().executeAsync(() -> { byte[] output = sampler.formCompressedDataPayload(resp.sender()); try { String key = SparkPlatform.BYTEBIN_CLIENT.postContent(output, SPARK_SAMPLER_MEDIA_TYPE, false).key(); diff --git a/spark-common/src/main/java/me/lucko/spark/common/monitor/tick/TickMonitor.java b/spark-common/src/main/java/me/lucko/spark/common/monitor/tick/TickMonitor.java index c20ce94..fa4b83c 100644 --- a/spark-common/src/main/java/me/lucko/spark/common/monitor/tick/TickMonitor.java +++ b/spark-common/src/main/java/me/lucko/spark/common/monitor/tick/TickMonitor.java @@ -102,7 +102,7 @@ public abstract class TickMonitor implements TickCounter.TickTask, GarbageCollec // move onto the next state if (this.averageTickTime.getCount() >= 120) { - this.platform.getPlugin().runAsync(() -> { + this.platform.getPlugin().executeAsync(() -> { sendMessage(TextComponent.of("Analysis is now complete.", TextColor.GOLD)); sendMessage(TextComponent.builder("").color(TextColor.GRAY) .append(TextComponent.of(">", TextColor.WHITE)) @@ -145,7 +145,7 @@ public abstract class TickMonitor implements TickCounter.TickTask, GarbageCollec double percentageChange = (increase * 100d) / this.avg; if (percentageChange > this.percentageChangeThreshold) { - this.platform.getPlugin().runAsync(() -> { + this.platform.getPlugin().executeAsync(() -> { sendMessage(TextComponent.builder("").color(TextColor.GRAY) .append(TextComponent.of("Tick ")) .append(TextComponent.of("#" + getCurrentTick(), TextColor.DARK_GRAY)) @@ -179,7 +179,7 @@ public abstract class TickMonitor implements TickCounter.TickTask, GarbageCollec gcType = data.getGcAction(); } - this.platform.getPlugin().runAsync(() -> { + this.platform.getPlugin().executeAsync(() -> { sendMessage(TextComponent.builder("").color(TextColor.GRAY) .append(TextComponent.of("Tick ")) .append(TextComponent.of("#" + getCurrentTick(), TextColor.DARK_GRAY)) diff --git a/spark-common/src/main/java/me/lucko/spark/common/util/RollingAverage.java b/spark-common/src/main/java/me/lucko/spark/common/util/RollingAverage.java index 5b1fd21..514876d 100644 --- a/spark-common/src/main/java/me/lucko/spark/common/util/RollingAverage.java +++ b/spark-common/src/main/java/me/lucko/spark/common/util/RollingAverage.java @@ -27,12 +27,13 @@ import java.util.Queue; public class RollingAverage { - private final Queue samples = new ArrayDeque<>(); + private final Queue samples; private final int size; private BigDecimal total = BigDecimal.ZERO; public RollingAverage(int size) { this.size = size; + this.samples = new ArrayDeque<>(this.size); } public void add(BigDecimal num) { diff --git a/spark-forge/build.gradle b/spark-forge/build.gradle index eb4306c..4334b87 100644 --- a/spark-forge/build.gradle +++ b/spark-forge/build.gradle @@ -18,7 +18,7 @@ minecraft { runDir = 'run' mappings = 'snapshot_20171003' - replaceIn 'me/lucko/spark/forge/SparkForgeMod.java' + replaceIn 'me/lucko/spark/forge/ForgeSparkMod.java' replace '@version@', project.pluginVersion } diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeClientSparkPlugin.java b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeClientSparkPlugin.java index 5dd2ded..e4212ab 100644 --- a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeClientSparkPlugin.java +++ b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeClientSparkPlugin.java @@ -32,11 +32,11 @@ import java.util.stream.Stream; public class ForgeClientSparkPlugin extends ForgeSparkPlugin { - public static void register(SparkForgeMod mod) { + public static void register(ForgeSparkMod mod) { ClientCommandHandler.instance.registerCommand(new ForgeClientSparkPlugin(mod)); } - public ForgeClientSparkPlugin(SparkForgeMod mod) { + public ForgeClientSparkPlugin(ForgeSparkMod mod) { super(mod); } @@ -56,7 +56,7 @@ public class ForgeClientSparkPlugin extends ForgeSparkPlugin { } @Override - public String getLabel() { + public String getCommandName() { return "sparkc"; } diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeServerSparkPlugin.java b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeServerSparkPlugin.java index 3c686ae..22b6adc 100644 --- a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeServerSparkPlugin.java +++ b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeServerSparkPlugin.java @@ -31,7 +31,7 @@ import java.util.List; import java.util.stream.Stream; public class ForgeServerSparkPlugin extends ForgeSparkPlugin { - public ForgeServerSparkPlugin(SparkForgeMod mod) { + public ForgeServerSparkPlugin(ForgeSparkMod mod) { super(mod); } @@ -55,7 +55,7 @@ public class ForgeServerSparkPlugin extends ForgeSparkPlugin { } @Override - public String getLabel() { + public String getCommandName() { return "spark"; } diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeSparkMod.java b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeSparkMod.java new file mode 100644 index 0000000..1659d6d --- /dev/null +++ b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeSparkMod.java @@ -0,0 +1,66 @@ +/* + * This file is part of spark. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.lucko.spark.forge; + +import net.minecraftforge.fml.common.FMLCommonHandler; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.Mod.EventHandler; +import net.minecraftforge.fml.common.event.FMLInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; +import net.minecraftforge.fml.common.event.FMLServerStartingEvent; +import net.minecraftforge.fml.relauncher.Side; + +import java.nio.file.Path; + +@Mod( + modid = "spark", + name = "spark", + version = "@version@", + acceptableRemoteVersions = "*" +) +public class ForgeSparkMod { + + private Path configDirectory = null; + + @EventHandler + public void preInit(FMLPreInitializationEvent e) { + this.configDirectory = e.getModConfigurationDirectory().toPath(); + } + + @EventHandler + public void init(FMLInitializationEvent e) { + if (FMLCommonHandler.instance().getSide() == Side.CLIENT) { + ForgeClientSparkPlugin.register(this); + } + } + + @EventHandler + public void serverInit(FMLServerStartingEvent e) { + e.registerServerCommand(new ForgeServerSparkPlugin(this)); + } + + public Path getConfigDirectory() { + if (this.configDirectory == null) { + throw new IllegalStateException("Config directory not set"); + } + return this.configDirectory; + } +} diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeSparkPlugin.java b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeSparkPlugin.java index 039a7de..b2f2332 100644 --- a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeSparkPlugin.java +++ b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeSparkPlugin.java @@ -39,11 +39,11 @@ import java.util.concurrent.ScheduledExecutorService; @SuppressWarnings("NullableProblems") public abstract class ForgeSparkPlugin implements SparkPlugin, ICommand { - private final SparkForgeMod mod; + private final ForgeSparkMod mod; private final ScheduledExecutorService scheduler; private final SparkPlatform platform; - protected ForgeSparkPlugin(SparkForgeMod mod) { + protected ForgeSparkPlugin(ForgeSparkMod mod) { this.mod = mod; this.scheduler = Executors.newSingleThreadScheduledExecutor( new ThreadFactoryBuilder().setNameFormat("spark-forge-async-worker").build() @@ -56,17 +56,17 @@ public abstract class ForgeSparkPlugin implements SparkPlugin, ICommand { @Override public String getVersion() { - return SparkForgeMod.class.getAnnotation(Mod.class).version(); + return ForgeSparkMod.class.getAnnotation(Mod.class).version(); } @Override - public Path getPluginFolder() { + public Path getPluginDirectory() { return this.mod.getConfigDirectory(); } @Override - public void runAsync(Runnable r) { - this.scheduler.execute(r); + public void executeAsync(Runnable task) { + this.scheduler.execute(task); } @Override @@ -78,7 +78,7 @@ public abstract class ForgeSparkPlugin implements SparkPlugin, ICommand { @Override public String getUsage(ICommandSender iCommandSender) { - return "/" + getLabel(); + return "/" + getCommandName(); } @Override @@ -103,6 +103,6 @@ public abstract class ForgeSparkPlugin implements SparkPlugin, ICommand { @Override public int compareTo(ICommand o) { - return getLabel().compareTo(o.getName()); + return getCommandName().compareTo(o.getName()); } } diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/SparkForgeMod.java b/spark-forge/src/main/java/me/lucko/spark/forge/SparkForgeMod.java deleted file mode 100644 index 32dfd77..0000000 --- a/spark-forge/src/main/java/me/lucko/spark/forge/SparkForgeMod.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * This file is part of spark. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package me.lucko.spark.forge; - -import net.minecraftforge.fml.common.FMLCommonHandler; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.Mod.EventHandler; -import net.minecraftforge.fml.common.event.FMLInitializationEvent; -import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; -import net.minecraftforge.fml.common.event.FMLServerStartingEvent; -import net.minecraftforge.fml.relauncher.Side; - -import java.nio.file.Path; - -@Mod( - modid = "spark", - name = "spark", - version = "@version@", - acceptableRemoteVersions = "*" -) -public class SparkForgeMod { - - private Path configDirectory = null; - - @EventHandler - public void preInit(FMLPreInitializationEvent e) { - this.configDirectory = e.getModConfigurationDirectory().toPath(); - } - - @EventHandler - public void init(FMLInitializationEvent e) { - if (FMLCommonHandler.instance().getSide() == Side.CLIENT) { - ForgeClientSparkPlugin.register(this); - } - } - - @EventHandler - public void serverInit(FMLServerStartingEvent e) { - e.registerServerCommand(new ForgeServerSparkPlugin(this)); - } - - public Path getConfigDirectory() { - if (this.configDirectory == null) { - throw new IllegalStateException("Config directory not set"); - } - return this.configDirectory; - } -} diff --git a/spark-sponge/build.gradle b/spark-sponge/build.gradle index 55578b5..7a7f679 100644 --- a/spark-sponge/build.gradle +++ b/spark-sponge/build.gradle @@ -13,7 +13,7 @@ dependencies { } blossom { - replaceTokenIn('src/main/java/me/lucko/spark/sponge/SparkSpongePlugin.java') + replaceTokenIn('src/main/java/me/lucko/spark/sponge/SpongeSparkPlugin.java') replaceToken '@version@', project.pluginVersion replaceToken '@desc@', project.pluginDescription } diff --git a/spark-sponge/src/main/java/me/lucko/spark/sponge/SparkSpongePlugin.java b/spark-sponge/src/main/java/me/lucko/spark/sponge/SparkSpongePlugin.java deleted file mode 100644 index ae312a0..0000000 --- a/spark-sponge/src/main/java/me/lucko/spark/sponge/SparkSpongePlugin.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * This file is part of spark. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package me.lucko.spark.sponge; - -import com.google.inject.Inject; -import me.lucko.spark.common.SparkPlatform; -import me.lucko.spark.common.SparkPlugin; -import me.lucko.spark.common.sampler.ThreadDumper; -import me.lucko.spark.common.sampler.TickCounter; -import org.spongepowered.api.Game; -import org.spongepowered.api.command.CommandCallable; -import org.spongepowered.api.command.CommandResult; -import org.spongepowered.api.command.CommandSource; -import org.spongepowered.api.config.ConfigDir; -import org.spongepowered.api.event.Listener; -import org.spongepowered.api.event.game.state.GameStartedServerEvent; -import org.spongepowered.api.event.game.state.GameStoppingServerEvent; -import org.spongepowered.api.plugin.Dependency; -import org.spongepowered.api.plugin.Plugin; -import org.spongepowered.api.scheduler.AsynchronousExecutor; -import org.spongepowered.api.scheduler.SpongeExecutorService; -import org.spongepowered.api.text.Text; -import org.spongepowered.api.world.Location; -import org.spongepowered.api.world.World; - -import javax.annotation.Nullable; -import java.nio.file.Path; -import java.util.List; -import java.util.Optional; -import java.util.stream.Stream; - -@Plugin( - id = "spark", - name = "spark", - version = "@version@", - description = "@desc@", - authors = {"Luck", "sk89q"}, - dependencies = { - // explicit dependency on spongeapi with no defined API version - @Dependency(id = "spongeapi") - } -) -public class SparkSpongePlugin implements SparkPlugin { - - private final Game game; - private final Path configDirectory; - private final SpongeExecutorService asyncExecutor; - - private SparkPlatform platform; - - @Inject - public SparkSpongePlugin(Game game, @ConfigDir(sharedRoot = false) Path configDirectory, @AsynchronousExecutor SpongeExecutorService asyncExecutor) { - this.game = game; - this.configDirectory = configDirectory; - this.asyncExecutor = asyncExecutor; - } - - @Listener - public void onEnable(GameStartedServerEvent event) { - this.platform = new SparkPlatform(this); - this.platform.enable(); - this.game.getCommandManager().register(this, new SparkCommand(this), "spark"); - } - - @Listener - public void onDisable(GameStoppingServerEvent event) { - this.platform.disable(); - } - - @Override - public String getVersion() { - return SparkSpongePlugin.class.getAnnotation(Plugin.class).version(); - } - - @Override - public Path getPluginFolder() { - return this.configDirectory; - } - - @Override - public String getLabel() { - return "spark"; - } - - @Override - public Stream getSendersWithPermission(String permission) { - return Stream.concat( - this.game.getServer().getOnlinePlayers().stream().filter(player -> player.hasPermission(permission)), - Stream.of(this.game.getServer().getConsole()) - ).map(SpongeCommandSender::new); - } - - @Override - public void runAsync(Runnable r) { - this.asyncExecutor.execute(r); - } - - @Override - public ThreadDumper getDefaultThreadDumper() { - return new ThreadDumper.Specific(new long[]{Thread.currentThread().getId()}); - } - - @Override - public TickCounter createTickCounter() { - return new SpongeTickCounter(this); - } - - private static final class SparkCommand implements CommandCallable { - private final SparkSpongePlugin plugin; - - private SparkCommand(SparkSpongePlugin plugin) { - this.plugin = plugin; - } - - @Override - public CommandResult process(CommandSource source, String arguments) { - this.plugin.platform.executeCommand(new SpongeCommandSender(source), arguments.split(" ")); - return CommandResult.empty(); - } - - @Override - public List getSuggestions(CommandSource source, String arguments, @Nullable Location targetPosition) { - return this.plugin.platform.tabCompleteCommand(new SpongeCommandSender(source), arguments.split(" ")); - } - - @Override - public boolean testPermission(CommandSource source) { - return source.hasPermission("spark"); - } - - @Override - public Optional getShortDescription(CommandSource source) { - return Optional.of(Text.of("Main spark plugin command")); - } - - @Override - public Optional getHelp(CommandSource source) { - return Optional.of(Text.of("Run '/spark' to view usage.")); - } - - @Override - public Text getUsage(CommandSource source) { - return Text.of("Run '/spark' to view usage."); - } - } -} diff --git a/spark-sponge/src/main/java/me/lucko/spark/sponge/SpongeSparkPlugin.java b/spark-sponge/src/main/java/me/lucko/spark/sponge/SpongeSparkPlugin.java new file mode 100644 index 0000000..d221f04 --- /dev/null +++ b/spark-sponge/src/main/java/me/lucko/spark/sponge/SpongeSparkPlugin.java @@ -0,0 +1,164 @@ +/* + * This file is part of spark. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.lucko.spark.sponge; + +import com.google.inject.Inject; +import me.lucko.spark.common.SparkPlatform; +import me.lucko.spark.common.SparkPlugin; +import me.lucko.spark.common.sampler.ThreadDumper; +import me.lucko.spark.common.sampler.TickCounter; +import org.spongepowered.api.Game; +import org.spongepowered.api.command.CommandCallable; +import org.spongepowered.api.command.CommandResult; +import org.spongepowered.api.command.CommandSource; +import org.spongepowered.api.config.ConfigDir; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.game.state.GameStartedServerEvent; +import org.spongepowered.api.event.game.state.GameStoppingServerEvent; +import org.spongepowered.api.plugin.Dependency; +import org.spongepowered.api.plugin.Plugin; +import org.spongepowered.api.scheduler.AsynchronousExecutor; +import org.spongepowered.api.scheduler.SpongeExecutorService; +import org.spongepowered.api.text.Text; +import org.spongepowered.api.world.Location; +import org.spongepowered.api.world.World; + +import javax.annotation.Nullable; +import java.nio.file.Path; +import java.util.List; +import java.util.Optional; +import java.util.stream.Stream; + +@Plugin( + id = "spark", + name = "spark", + version = "@version@", + description = "@desc@", + authors = {"Luck", "sk89q"}, + dependencies = { + // explicit dependency on spongeapi with no defined API version + @Dependency(id = "spongeapi") + } +) +public class SpongeSparkPlugin implements SparkPlugin { + + private final Game game; + private final Path configDirectory; + private final SpongeExecutorService asyncExecutor; + + private SparkPlatform platform; + + @Inject + public SpongeSparkPlugin(Game game, @ConfigDir(sharedRoot = false) Path configDirectory, @AsynchronousExecutor SpongeExecutorService asyncExecutor) { + this.game = game; + this.configDirectory = configDirectory; + this.asyncExecutor = asyncExecutor; + } + + @Listener + public void onEnable(GameStartedServerEvent event) { + this.platform = new SparkPlatform(this); + this.platform.enable(); + this.game.getCommandManager().register(this, new SparkCommand(this), "spark"); + } + + @Listener + public void onDisable(GameStoppingServerEvent event) { + this.platform.disable(); + } + + @Override + public String getVersion() { + return SpongeSparkPlugin.class.getAnnotation(Plugin.class).version(); + } + + @Override + public Path getPluginDirectory() { + return this.configDirectory; + } + + @Override + public String getCommandName() { + return "spark"; + } + + @Override + public Stream getSendersWithPermission(String permission) { + return Stream.concat( + this.game.getServer().getOnlinePlayers().stream().filter(player -> player.hasPermission(permission)), + Stream.of(this.game.getServer().getConsole()) + ).map(SpongeCommandSender::new); + } + + @Override + public void executeAsync(Runnable task) { + this.asyncExecutor.execute(task); + } + + @Override + public ThreadDumper getDefaultThreadDumper() { + return new ThreadDumper.Specific(new long[]{Thread.currentThread().getId()}); + } + + @Override + public TickCounter createTickCounter() { + return new SpongeTickCounter(this); + } + + private static final class SparkCommand implements CommandCallable { + private final SpongeSparkPlugin plugin; + + private SparkCommand(SpongeSparkPlugin plugin) { + this.plugin = plugin; + } + + @Override + public CommandResult process(CommandSource source, String arguments) { + this.plugin.platform.executeCommand(new SpongeCommandSender(source), arguments.split(" ")); + return CommandResult.empty(); + } + + @Override + public List getSuggestions(CommandSource source, String arguments, @Nullable Location targetPosition) { + return this.plugin.platform.tabCompleteCommand(new SpongeCommandSender(source), arguments.split(" ")); + } + + @Override + public boolean testPermission(CommandSource source) { + return source.hasPermission("spark"); + } + + @Override + public Optional getShortDescription(CommandSource source) { + return Optional.of(Text.of("Main spark plugin command")); + } + + @Override + public Optional getHelp(CommandSource source) { + return Optional.of(Text.of("Run '/spark' to view usage.")); + } + + @Override + public Text getUsage(CommandSource source) { + return Text.of("Run '/spark' to view usage."); + } + } +} diff --git a/spark-sponge/src/main/java/me/lucko/spark/sponge/SpongeTickCounter.java b/spark-sponge/src/main/java/me/lucko/spark/sponge/SpongeTickCounter.java index 187f301..3c5db06 100644 --- a/spark-sponge/src/main/java/me/lucko/spark/sponge/SpongeTickCounter.java +++ b/spark-sponge/src/main/java/me/lucko/spark/sponge/SpongeTickCounter.java @@ -26,13 +26,13 @@ import java.util.HashSet; import java.util.Set; public class SpongeTickCounter implements TickCounter, Runnable { - private final SparkSpongePlugin plugin; + private final SpongeSparkPlugin plugin; private org.spongepowered.api.scheduler.Task task; private final Set tasks = new HashSet<>(); private int tick = 0; - public SpongeTickCounter(SparkSpongePlugin plugin) { + public SpongeTickCounter(SpongeSparkPlugin plugin) { this.plugin = plugin; } diff --git a/spark-velocity/build.gradle b/spark-velocity/build.gradle index 01f1faa..a1586d7 100644 --- a/spark-velocity/build.gradle +++ b/spark-velocity/build.gradle @@ -9,7 +9,7 @@ dependencies { } blossom { - replaceTokenIn('src/main/java/me/lucko/spark/velocity/SparkVelocityPlugin.java') + replaceTokenIn('src/main/java/me/lucko/spark/velocity/VelocitySparkPlugin.java') replaceToken '@version@', project.pluginVersion replaceToken '@desc@', project.pluginDescription } \ No newline at end of file diff --git a/spark-velocity/src/main/java/me/lucko/spark/velocity/SparkVelocityPlugin.java b/spark-velocity/src/main/java/me/lucko/spark/velocity/SparkVelocityPlugin.java deleted file mode 100644 index 69217a9..0000000 --- a/spark-velocity/src/main/java/me/lucko/spark/velocity/SparkVelocityPlugin.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * This file is part of spark. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package me.lucko.spark.velocity; - -import com.google.inject.Inject; -import com.velocitypowered.api.command.Command; -import com.velocitypowered.api.command.CommandSource; -import com.velocitypowered.api.event.PostOrder; -import com.velocitypowered.api.event.Subscribe; -import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; -import com.velocitypowered.api.event.proxy.ProxyShutdownEvent; -import com.velocitypowered.api.plugin.Plugin; -import com.velocitypowered.api.plugin.annotation.DataDirectory; -import com.velocitypowered.api.proxy.ProxyServer; -import me.lucko.spark.common.SparkPlatform; -import me.lucko.spark.common.SparkPlugin; -import me.lucko.spark.common.sampler.ThreadDumper; -import me.lucko.spark.common.sampler.TickCounter; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.optional.qual.MaybePresent; - -import java.nio.file.Path; -import java.util.List; -import java.util.stream.Stream; - -@Plugin( - id = "spark", - name = "spark", - version = "@version@", - description = "@desc@", - authors = {"Luck", "sk89q"} -) -public class SparkVelocityPlugin implements SparkPlugin, Command { - - private final ProxyServer proxy; - private final Path configDirectory; - - private SparkPlatform platform; - - @Inject - public SparkVelocityPlugin(ProxyServer proxy, @DataDirectory Path configDirectory) { - this.proxy = proxy; - this.configDirectory = configDirectory; - } - - @Subscribe(order = PostOrder.FIRST) - public void onEnable(ProxyInitializeEvent e) { - this.platform = new SparkPlatform(this); - this.platform.enable(); - this.proxy.getCommandManager().register(this, "sparkv", "sparkvelocity"); - } - - @Subscribe(order = PostOrder.LAST) - public void onDisable(ProxyShutdownEvent e) { - this.platform.disable(); - } - - @Override - public void execute(@MaybePresent CommandSource sender, @NonNull @MaybePresent String[] args) { - this.platform.executeCommand(new VelocityCommandSender(sender), args); - } - - @Override - public @MaybePresent List suggest(@MaybePresent CommandSource sender, @NonNull @MaybePresent String[] currentArgs) { - return this.platform.tabCompleteCommand(new VelocityCommandSender(sender), currentArgs); - } - - @Override - public String getVersion() { - return SparkVelocityPlugin.class.getAnnotation(Plugin.class).version(); - } - - @Override - public Path getPluginFolder() { - return this.configDirectory; - } - - @Override - public String getLabel() { - return "sparkv"; - } - - @Override - public Stream getSendersWithPermission(String permission) { - return Stream.concat( - this.proxy.getAllPlayers().stream().filter(player -> player.hasPermission(permission)), - Stream.of(this.proxy.getConsoleCommandSource()) - ).map(VelocityCommandSender::new); - } - - @Override - public void runAsync(Runnable r) { - this.proxy.getScheduler().buildTask(this, r).schedule(); - } - - @Override - public ThreadDumper getDefaultThreadDumper() { - return ThreadDumper.ALL; - } - - @Override - public TickCounter createTickCounter() { - return null; - } -} diff --git a/spark-velocity/src/main/java/me/lucko/spark/velocity/VelocitySparkPlugin.java b/spark-velocity/src/main/java/me/lucko/spark/velocity/VelocitySparkPlugin.java new file mode 100644 index 0000000..7e98679 --- /dev/null +++ b/spark-velocity/src/main/java/me/lucko/spark/velocity/VelocitySparkPlugin.java @@ -0,0 +1,111 @@ +/* + * This file is part of spark. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.lucko.spark.velocity; + +import com.google.inject.Inject; +import com.velocitypowered.api.command.Command; +import com.velocitypowered.api.command.CommandSource; +import com.velocitypowered.api.event.PostOrder; +import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; +import com.velocitypowered.api.event.proxy.ProxyShutdownEvent; +import com.velocitypowered.api.plugin.Plugin; +import com.velocitypowered.api.plugin.annotation.DataDirectory; +import com.velocitypowered.api.proxy.ProxyServer; +import me.lucko.spark.common.SparkPlatform; +import me.lucko.spark.common.SparkPlugin; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.optional.qual.MaybePresent; + +import java.nio.file.Path; +import java.util.List; +import java.util.stream.Stream; + +@Plugin( + id = "spark", + name = "spark", + version = "@version@", + description = "@desc@", + authors = {"Luck", "sk89q"} +) +public class VelocitySparkPlugin implements SparkPlugin, Command { + + private final ProxyServer proxy; + private final Path configDirectory; + + private SparkPlatform platform; + + @Inject + public VelocitySparkPlugin(ProxyServer proxy, @DataDirectory Path configDirectory) { + this.proxy = proxy; + this.configDirectory = configDirectory; + } + + @Subscribe(order = PostOrder.FIRST) + public void onEnable(ProxyInitializeEvent e) { + this.platform = new SparkPlatform(this); + this.platform.enable(); + this.proxy.getCommandManager().register(this, "sparkv", "sparkvelocity"); + } + + @Subscribe(order = PostOrder.LAST) + public void onDisable(ProxyShutdownEvent e) { + this.platform.disable(); + } + + @Override + public void execute(@MaybePresent CommandSource sender, @NonNull @MaybePresent String[] args) { + this.platform.executeCommand(new VelocityCommandSender(sender), args); + } + + @Override + public @MaybePresent List suggest(@MaybePresent CommandSource sender, @NonNull @MaybePresent String[] currentArgs) { + return this.platform.tabCompleteCommand(new VelocityCommandSender(sender), currentArgs); + } + + @Override + public String getVersion() { + return VelocitySparkPlugin.class.getAnnotation(Plugin.class).version(); + } + + @Override + public Path getPluginDirectory() { + return this.configDirectory; + } + + @Override + public String getCommandName() { + return "sparkv"; + } + + @Override + public Stream getSendersWithPermission(String permission) { + return Stream.concat( + this.proxy.getAllPlayers().stream().filter(player -> player.hasPermission(permission)), + Stream.of(this.proxy.getConsoleCommandSource()) + ).map(VelocityCommandSender::new); + } + + @Override + public void executeAsync(Runnable task) { + this.proxy.getScheduler().buildTask(this, task).schedule(); + } +} -- cgit