From 7331568886883d5227b64d2397587070a1d91488 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Tue, 29 Jan 2019 21:39:14 +0100 Subject: [PATCH] Command, restart, command improvements Fixed default command handler not being overridable in some cases Schrestart now takes seconds as param, not ticks Allowing to change the current timer value in the restart event HelpText support added Automatically generating usage text (ButtonProcessor) --- ...s_ButtonCore_Towny_master_248b0d8d0a_1.xml | 13 - ..._milkbowl_VaultAPI_master_431c5273c2_1.xml | 13 - BuildConfigUpdater/BuildConfigUpdater.iml | 1 + BuildConfigUpdater/src/main/java/BCUMain.java | 2 +- .../buttondevteam/core/ComponentCommand.java | 14 +- .../java/buttondevteam/core/MainPlugin.java | 18 +- .../java/buttondevteam/core/TestPrepare.java | 4 +- .../{ => core}/component/channel/Channel.java | 2 +- .../component/channel/ChannelComponent.java | 2 +- .../channel/ChatChannelRegisterEvent.java | 2 +- .../component/channel/ChatRoom.java | 2 +- .../component/members/MemberCommand.java | 2 +- .../component/members/MemberComponent.java | 2 +- .../component/randomtp/RandomTP.java | 2 +- .../component/randomtp/RandomTPComponent.java | 2 +- .../restart/PrimeRestartCommand.java | 2 +- .../component/restart/RestartComponent.java | 2 +- .../restart/ScheduledRestartCommand.java | 42 +- .../component/towny/TownyComponent.java | 2 +- .../component/updater/PluginUpdater.java | 2 +- .../updater/PluginUpdaterComponent.java | 2 +- .../updater/UpdatePluginCommand.java | 2 +- .../lib/ScheduledServerRestartEvent.java | 16 +- .../java/buttondevteam/lib/TBMCChatEvent.java | 2 +- .../buttondevteam/lib/TBMCChatEventBase.java | 2 +- .../lib/TBMCChatPreprocessEvent.java | 2 +- .../java/buttondevteam/lib/TBMCCoreAPI.java | 374 +++++++++--------- .../lib/TBMCSystemChatEvent.java | 2 +- .../java/buttondevteam/lib/ThorpeUtils.java | 38 ++ .../java/buttondevteam/lib/chat/Command2.java | 70 +++- .../buttondevteam/lib/chat/CommandClass.java | 2 +- .../buttondevteam/lib/chat/TBMCChatAPI.java | 4 +- .../lib/player/ChannelPlayerData.java | 2 +- .../lib/player/ChromaGamerBase.java | 2 +- .../lib/player/TBMCPlayerBase.java | 2 +- ButtonProcessor/ButtonProcessor.iml | 7 + ButtonProcessor/pom.xml | 94 +++-- .../buttonproc/ButtonProcessor.java | 74 +++- 38 files changed, 487 insertions(+), 341 deletions(-) delete mode 100644 .idea/libraries/Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_248b0d8d0a_1.xml delete mode 100644 .idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_431c5273c2_1.xml rename ButtonCore/src/main/java/buttondevteam/{ => core}/component/channel/Channel.java (99%) rename ButtonCore/src/main/java/buttondevteam/{ => core}/component/channel/ChannelComponent.java (89%) rename ButtonCore/src/main/java/buttondevteam/{ => core}/component/channel/ChatChannelRegisterEvent.java (91%) rename ButtonCore/src/main/java/buttondevteam/{ => core}/component/channel/ChatRoom.java (95%) rename ButtonCore/src/main/java/buttondevteam/{ => core}/component/members/MemberCommand.java (97%) rename ButtonCore/src/main/java/buttondevteam/{ => core}/component/members/MemberComponent.java (96%) rename ButtonCore/src/main/java/buttondevteam/{ => core}/component/randomtp/RandomTP.java (99%) rename ButtonCore/src/main/java/buttondevteam/{ => core}/component/randomtp/RandomTPComponent.java (84%) rename ButtonCore/src/main/java/buttondevteam/{ => core}/component/restart/PrimeRestartCommand.java (96%) rename ButtonCore/src/main/java/buttondevteam/{ => core}/component/restart/RestartComponent.java (96%) rename ButtonCore/src/main/java/buttondevteam/{ => core}/component/restart/ScheduledRestartCommand.java (66%) rename ButtonCore/src/main/java/buttondevteam/{ => core}/component/towny/TownyComponent.java (97%) rename ButtonCore/src/main/java/buttondevteam/{ => core}/component/updater/PluginUpdater.java (99%) rename ButtonCore/src/main/java/buttondevteam/{ => core}/component/updater/PluginUpdaterComponent.java (87%) rename ButtonCore/src/main/java/buttondevteam/{ => core}/component/updater/UpdatePluginCommand.java (96%) create mode 100644 ButtonCore/src/main/java/buttondevteam/lib/ThorpeUtils.java diff --git a/.idea/libraries/Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_248b0d8d0a_1.xml b/.idea/libraries/Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_248b0d8d0a_1.xml deleted file mode 100644 index 0d3e00e..0000000 --- a/.idea/libraries/Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_248b0d8d0a_1.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_431c5273c2_1.xml b/.idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_431c5273c2_1.xml deleted file mode 100644 index 19b24a3..0000000 --- a/.idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_431c5273c2_1.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/BuildConfigUpdater/BuildConfigUpdater.iml b/BuildConfigUpdater/BuildConfigUpdater.iml index 73696cd..4902d56 100644 --- a/BuildConfigUpdater/BuildConfigUpdater.iml +++ b/BuildConfigUpdater/BuildConfigUpdater.iml @@ -12,6 +12,7 @@ + diff --git a/BuildConfigUpdater/src/main/java/BCUMain.java b/BuildConfigUpdater/src/main/java/BCUMain.java index 07666d3..a5e2007 100644 --- a/BuildConfigUpdater/src/main/java/BCUMain.java +++ b/BuildConfigUpdater/src/main/java/BCUMain.java @@ -1,4 +1,4 @@ -import buttondevteam.component.updater.PluginUpdater; +import buttondevteam.core.component.updater.PluginUpdater; import java.util.List; import java.util.stream.Collectors; diff --git a/ButtonCore/src/main/java/buttondevteam/core/ComponentCommand.java b/ButtonCore/src/main/java/buttondevteam/core/ComponentCommand.java index 4b090fc..655192c 100644 --- a/ButtonCore/src/main/java/buttondevteam/core/ComponentCommand.java +++ b/ButtonCore/src/main/java/buttondevteam/core/ComponentCommand.java @@ -11,7 +11,10 @@ import org.bukkit.plugin.Plugin; import java.util.Optional; -@CommandClass(modOnly = true) +@CommandClass(modOnly = true, helpText = { + "§6---- Component command ----", + "Can be used to enable/disable/list components" +}) public class ComponentCommand extends Command2 { public ComponentCommand() { addParamConverter(Plugin.class, arg -> Bukkit.getPluginManager().getPlugin(arg)); @@ -58,13 +61,6 @@ public class ComponentCommand extends Command2 { .filter(c -> c.getClass().getSimpleName().equalsIgnoreCase(arg)).findAny(); if (!oc.isPresent()) sender.sendMessage("§cComponent not found!"); //^ Much simpler to solve in the new command system - return oc; //TODO: Offer overload options with clickable link (with all the plugins it found) + return oc; } //TODO: Tabcompletion for the new command system - - public String[] GetHelpText(String alias) { //TODO - return new String[]{ - "§6---- Component command ----", - "Enable or disable or list components" - }; - } } diff --git a/ButtonCore/src/main/java/buttondevteam/core/MainPlugin.java b/ButtonCore/src/main/java/buttondevteam/core/MainPlugin.java index c92a3c9..65966d8 100755 --- a/ButtonCore/src/main/java/buttondevteam/core/MainPlugin.java +++ b/ButtonCore/src/main/java/buttondevteam/core/MainPlugin.java @@ -1,14 +1,14 @@ package buttondevteam.core; -import buttondevteam.component.channel.Channel; -import buttondevteam.component.channel.ChannelComponent; -import buttondevteam.component.channel.ChatRoom; -import buttondevteam.component.members.MemberComponent; -import buttondevteam.component.randomtp.RandomTPComponent; -import buttondevteam.component.restart.RestartComponent; -import buttondevteam.component.towny.TownyComponent; -import buttondevteam.component.updater.PluginUpdater; -import buttondevteam.component.updater.PluginUpdaterComponent; +import buttondevteam.core.component.channel.Channel; +import buttondevteam.core.component.channel.ChannelComponent; +import buttondevteam.core.component.channel.ChatRoom; +import buttondevteam.core.component.members.MemberComponent; +import buttondevteam.core.component.randomtp.RandomTPComponent; +import buttondevteam.core.component.restart.RestartComponent; +import buttondevteam.core.component.towny.TownyComponent; +import buttondevteam.core.component.updater.PluginUpdater; +import buttondevteam.core.component.updater.PluginUpdaterComponent; import buttondevteam.lib.TBMCCoreAPI; import buttondevteam.lib.architecture.ButtonPlugin; import buttondevteam.lib.architecture.Component; diff --git a/ButtonCore/src/main/java/buttondevteam/core/TestPrepare.java b/ButtonCore/src/main/java/buttondevteam/core/TestPrepare.java index 179e9cf..b0b9610 100755 --- a/ButtonCore/src/main/java/buttondevteam/core/TestPrepare.java +++ b/ButtonCore/src/main/java/buttondevteam/core/TestPrepare.java @@ -1,7 +1,7 @@ package buttondevteam.core; -import buttondevteam.component.channel.Channel; -import buttondevteam.component.channel.ChannelComponent; +import buttondevteam.core.component.channel.Channel; +import buttondevteam.core.component.channel.ChannelComponent; import buttondevteam.lib.architecture.Component; import buttondevteam.lib.chat.Color; import buttondevteam.lib.chat.TBMCChatAPI; diff --git a/ButtonCore/src/main/java/buttondevteam/component/channel/Channel.java b/ButtonCore/src/main/java/buttondevteam/core/component/channel/Channel.java similarity index 99% rename from ButtonCore/src/main/java/buttondevteam/component/channel/Channel.java rename to ButtonCore/src/main/java/buttondevteam/core/component/channel/Channel.java index 38b53c0..c643880 100755 --- a/ButtonCore/src/main/java/buttondevteam/component/channel/Channel.java +++ b/ButtonCore/src/main/java/buttondevteam/core/component/channel/Channel.java @@ -1,4 +1,4 @@ -package buttondevteam.component.channel; +package buttondevteam.core.component.channel; import buttondevteam.core.ComponentManager; import buttondevteam.core.MainPlugin; diff --git a/ButtonCore/src/main/java/buttondevteam/component/channel/ChannelComponent.java b/ButtonCore/src/main/java/buttondevteam/core/component/channel/ChannelComponent.java similarity index 89% rename from ButtonCore/src/main/java/buttondevteam/component/channel/ChannelComponent.java rename to ButtonCore/src/main/java/buttondevteam/core/component/channel/ChannelComponent.java index a49ea1e..083633d 100644 --- a/ButtonCore/src/main/java/buttondevteam/component/channel/ChannelComponent.java +++ b/ButtonCore/src/main/java/buttondevteam/core/component/channel/ChannelComponent.java @@ -1,4 +1,4 @@ -package buttondevteam.component.channel; +package buttondevteam.core.component.channel; import buttondevteam.lib.architecture.Component; import org.bukkit.plugin.java.JavaPlugin; diff --git a/ButtonCore/src/main/java/buttondevteam/component/channel/ChatChannelRegisterEvent.java b/ButtonCore/src/main/java/buttondevteam/core/component/channel/ChatChannelRegisterEvent.java similarity index 91% rename from ButtonCore/src/main/java/buttondevteam/component/channel/ChatChannelRegisterEvent.java rename to ButtonCore/src/main/java/buttondevteam/core/component/channel/ChatChannelRegisterEvent.java index 896a64d..4797b3e 100755 --- a/ButtonCore/src/main/java/buttondevteam/component/channel/ChatChannelRegisterEvent.java +++ b/ButtonCore/src/main/java/buttondevteam/core/component/channel/ChatChannelRegisterEvent.java @@ -1,4 +1,4 @@ -package buttondevteam.component.channel; +package buttondevteam.core.component.channel; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; diff --git a/ButtonCore/src/main/java/buttondevteam/component/channel/ChatRoom.java b/ButtonCore/src/main/java/buttondevteam/core/component/channel/ChatRoom.java similarity index 95% rename from ButtonCore/src/main/java/buttondevteam/component/channel/ChatRoom.java rename to ButtonCore/src/main/java/buttondevteam/core/component/channel/ChatRoom.java index ea01ed6..a086a42 100755 --- a/ButtonCore/src/main/java/buttondevteam/component/channel/ChatRoom.java +++ b/ButtonCore/src/main/java/buttondevteam/core/component/channel/ChatRoom.java @@ -1,4 +1,4 @@ -package buttondevteam.component.channel; +package buttondevteam.core.component.channel; import buttondevteam.lib.chat.Color; import buttondevteam.lib.chat.TBMCChatAPI; diff --git a/ButtonCore/src/main/java/buttondevteam/component/members/MemberCommand.java b/ButtonCore/src/main/java/buttondevteam/core/component/members/MemberCommand.java similarity index 97% rename from ButtonCore/src/main/java/buttondevteam/component/members/MemberCommand.java rename to ButtonCore/src/main/java/buttondevteam/core/component/members/MemberCommand.java index d5334a1..d395d99 100644 --- a/ButtonCore/src/main/java/buttondevteam/component/members/MemberCommand.java +++ b/ButtonCore/src/main/java/buttondevteam/core/component/members/MemberCommand.java @@ -1,4 +1,4 @@ -package buttondevteam.component.members; +package buttondevteam.core.component.members; import buttondevteam.core.MainPlugin; import buttondevteam.lib.chat.CommandClass; diff --git a/ButtonCore/src/main/java/buttondevteam/component/members/MemberComponent.java b/ButtonCore/src/main/java/buttondevteam/core/component/members/MemberComponent.java similarity index 96% rename from ButtonCore/src/main/java/buttondevteam/component/members/MemberComponent.java rename to ButtonCore/src/main/java/buttondevteam/core/component/members/MemberComponent.java index 453f535..0caeca7 100644 --- a/ButtonCore/src/main/java/buttondevteam/component/members/MemberComponent.java +++ b/ButtonCore/src/main/java/buttondevteam/core/component/members/MemberComponent.java @@ -1,4 +1,4 @@ -package buttondevteam.component.members; +package buttondevteam.core.component.members; import buttondevteam.core.MainPlugin; import buttondevteam.lib.architecture.Component; diff --git a/ButtonCore/src/main/java/buttondevteam/component/randomtp/RandomTP.java b/ButtonCore/src/main/java/buttondevteam/core/component/randomtp/RandomTP.java similarity index 99% rename from ButtonCore/src/main/java/buttondevteam/component/randomtp/RandomTP.java rename to ButtonCore/src/main/java/buttondevteam/core/component/randomtp/RandomTP.java index 1f0f396..a0612db 100644 --- a/ButtonCore/src/main/java/buttondevteam/component/randomtp/RandomTP.java +++ b/ButtonCore/src/main/java/buttondevteam/core/component/randomtp/RandomTP.java @@ -1,4 +1,4 @@ -package buttondevteam.component.randomtp; +package buttondevteam.core.component.randomtp; import buttondevteam.lib.architecture.Component; import buttondevteam.lib.chat.CommandClass; diff --git a/ButtonCore/src/main/java/buttondevteam/component/randomtp/RandomTPComponent.java b/ButtonCore/src/main/java/buttondevteam/core/component/randomtp/RandomTPComponent.java similarity index 84% rename from ButtonCore/src/main/java/buttondevteam/component/randomtp/RandomTPComponent.java rename to ButtonCore/src/main/java/buttondevteam/core/component/randomtp/RandomTPComponent.java index 0261c59..e324b3a 100644 --- a/ButtonCore/src/main/java/buttondevteam/component/randomtp/RandomTPComponent.java +++ b/ButtonCore/src/main/java/buttondevteam/core/component/randomtp/RandomTPComponent.java @@ -1,4 +1,4 @@ -package buttondevteam.component.randomtp; +package buttondevteam.core.component.randomtp; import buttondevteam.lib.architecture.Component; diff --git a/ButtonCore/src/main/java/buttondevteam/component/restart/PrimeRestartCommand.java b/ButtonCore/src/main/java/buttondevteam/core/component/restart/PrimeRestartCommand.java similarity index 96% rename from ButtonCore/src/main/java/buttondevteam/component/restart/PrimeRestartCommand.java rename to ButtonCore/src/main/java/buttondevteam/core/component/restart/PrimeRestartCommand.java index 51ee9b2..32773ab 100644 --- a/ButtonCore/src/main/java/buttondevteam/component/restart/PrimeRestartCommand.java +++ b/ButtonCore/src/main/java/buttondevteam/core/component/restart/PrimeRestartCommand.java @@ -1,4 +1,4 @@ -package buttondevteam.component.restart; +package buttondevteam.core.component.restart; import buttondevteam.lib.chat.CommandClass; import buttondevteam.lib.chat.TBMCCommandBase; diff --git a/ButtonCore/src/main/java/buttondevteam/component/restart/RestartComponent.java b/ButtonCore/src/main/java/buttondevteam/core/component/restart/RestartComponent.java similarity index 96% rename from ButtonCore/src/main/java/buttondevteam/component/restart/RestartComponent.java rename to ButtonCore/src/main/java/buttondevteam/core/component/restart/RestartComponent.java index e2f98b2..e49e3b2 100644 --- a/ButtonCore/src/main/java/buttondevteam/component/restart/RestartComponent.java +++ b/ButtonCore/src/main/java/buttondevteam/core/component/restart/RestartComponent.java @@ -1,4 +1,4 @@ -package buttondevteam.component.restart; +package buttondevteam.core.component.restart; import buttondevteam.lib.architecture.Component; import buttondevteam.lib.chat.IFakePlayer; diff --git a/ButtonCore/src/main/java/buttondevteam/component/restart/ScheduledRestartCommand.java b/ButtonCore/src/main/java/buttondevteam/core/component/restart/ScheduledRestartCommand.java similarity index 66% rename from ButtonCore/src/main/java/buttondevteam/component/restart/ScheduledRestartCommand.java rename to ButtonCore/src/main/java/buttondevteam/core/component/restart/ScheduledRestartCommand.java index ecc44ad..fea469e 100755 --- a/ButtonCore/src/main/java/buttondevteam/component/restart/ScheduledRestartCommand.java +++ b/ButtonCore/src/main/java/buttondevteam/core/component/restart/ScheduledRestartCommand.java @@ -1,9 +1,11 @@ -package buttondevteam.component.restart; +package buttondevteam.core.component.restart; import buttondevteam.core.MainPlugin; import buttondevteam.lib.ScheduledServerRestartEvent; import buttondevteam.lib.chat.CommandClass; import buttondevteam.lib.chat.TBMCCommandBase; +import lombok.Getter; +import lombok.Setter; import org.bukkit.Bukkit; import org.bukkit.boss.BarColor; import org.bukkit.boss.BarFlag; @@ -14,43 +16,45 @@ import org.bukkit.scheduler.BukkitTask; @CommandClass(modOnly = true, path = "schrestart") public class ScheduledRestartCommand extends TBMCCommandBase { - private static volatile int restartcounter; - private static volatile BukkitTask restarttask; - private static volatile BossBar restartbar; + @Getter + @Setter + private int restartCounter; + private BukkitTask restarttask; + private volatile BossBar restartbar; @Override public boolean OnCommand(CommandSender sender, String alias, String[] args) { - int ticks = 20 * 60; + int secs = 60; try { if (args.length > 0) - ticks = Integer.parseInt(args[0]); + secs = Integer.parseInt(args[0]); } catch (NumberFormatException e) { - sender.sendMessage("§cError: Ticks must be a number."); + sender.sendMessage("§cError: Seconds must be a number."); return false; } - if (ticks < 20) { - sender.sendMessage("§cError: Ticks must be more than 20."); + if (secs < 10) { + sender.sendMessage("§cError: Seconds must be at least 10."); return false; } - final int restarttime = restartcounter = ticks; - restartbar = Bukkit.createBossBar("Server restart in " + ticks / 20f + "s", BarColor.RED, BarStyle.SOLID, + final int restarttime = restartCounter = secs * 20; + restartbar = Bukkit.createBossBar("Server restart in " + secs + "s", BarColor.RED, BarStyle.SOLID, BarFlag.DARKEN_SKY); restartbar.setProgress(1); Bukkit.getOnlinePlayers().forEach(p -> restartbar.addPlayer(p)); - sender.sendMessage("Scheduled restart in " + ticks / 20f); - ScheduledServerRestartEvent e = new ScheduledServerRestartEvent(ticks); + sender.sendMessage("Scheduled restart in " + secs); + ScheduledServerRestartEvent e = new ScheduledServerRestartEvent(restarttime, this); Bukkit.getPluginManager().callEvent(e); restarttask = Bukkit.getScheduler().runTaskTimer(MainPlugin.Instance, () -> { - if (restartcounter < 0) { + if (restartCounter < 0) { restarttask.cancel(); restartbar.getPlayers().forEach(p -> restartbar.removePlayer(p)); Bukkit.spigot().restart(); } - if (restartcounter % 200 == 0) - Bukkit.broadcastMessage("§c-- The server is restarting in " + restartcounter / 20 + " seconds!"); - restartbar.setProgress(restartcounter / (double) restarttime); - restartbar.setTitle(String.format("Server restart in %.2f", restartcounter / 20f)); - restartcounter--; + if (restartCounter % 200 == 0) + Bukkit.broadcastMessage("§c-- The server is restarting in " + restartCounter / 20 + " seconds! (/press)"); + restartbar.setProgress(restartCounter / (double) restarttime); + restartbar.setTitle(String.format("Server restart in %.2f", restartCounter / 20f)); + restartCounter--; }, 1, 1); return true; } diff --git a/ButtonCore/src/main/java/buttondevteam/component/towny/TownyComponent.java b/ButtonCore/src/main/java/buttondevteam/core/component/towny/TownyComponent.java similarity index 97% rename from ButtonCore/src/main/java/buttondevteam/component/towny/TownyComponent.java rename to ButtonCore/src/main/java/buttondevteam/core/component/towny/TownyComponent.java index 61a9c5a..1b2bf9d 100644 --- a/ButtonCore/src/main/java/buttondevteam/component/towny/TownyComponent.java +++ b/ButtonCore/src/main/java/buttondevteam/core/component/towny/TownyComponent.java @@ -1,4 +1,4 @@ -package buttondevteam.component.towny; +package buttondevteam.core.component.towny; import buttondevteam.core.ComponentManager; import buttondevteam.lib.TBMCCoreAPI; diff --git a/ButtonCore/src/main/java/buttondevteam/component/updater/PluginUpdater.java b/ButtonCore/src/main/java/buttondevteam/core/component/updater/PluginUpdater.java similarity index 99% rename from ButtonCore/src/main/java/buttondevteam/component/updater/PluginUpdater.java rename to ButtonCore/src/main/java/buttondevteam/core/component/updater/PluginUpdater.java index ce2e993..64401fd 100755 --- a/ButtonCore/src/main/java/buttondevteam/component/updater/PluginUpdater.java +++ b/ButtonCore/src/main/java/buttondevteam/core/component/updater/PluginUpdater.java @@ -1,4 +1,4 @@ -package buttondevteam.component.updater; +package buttondevteam.core.component.updater; import buttondevteam.lib.TBMCCoreAPI; import com.google.gson.JsonArray; diff --git a/ButtonCore/src/main/java/buttondevteam/component/updater/PluginUpdaterComponent.java b/ButtonCore/src/main/java/buttondevteam/core/component/updater/PluginUpdaterComponent.java similarity index 87% rename from ButtonCore/src/main/java/buttondevteam/component/updater/PluginUpdaterComponent.java rename to ButtonCore/src/main/java/buttondevteam/core/component/updater/PluginUpdaterComponent.java index bd64c05..2ead741 100644 --- a/ButtonCore/src/main/java/buttondevteam/component/updater/PluginUpdaterComponent.java +++ b/ButtonCore/src/main/java/buttondevteam/core/component/updater/PluginUpdaterComponent.java @@ -1,4 +1,4 @@ -package buttondevteam.component.updater; +package buttondevteam.core.component.updater; import buttondevteam.lib.architecture.Component; import buttondevteam.lib.chat.TBMCChatAPI; diff --git a/ButtonCore/src/main/java/buttondevteam/component/updater/UpdatePluginCommand.java b/ButtonCore/src/main/java/buttondevteam/core/component/updater/UpdatePluginCommand.java similarity index 96% rename from ButtonCore/src/main/java/buttondevteam/component/updater/UpdatePluginCommand.java rename to ButtonCore/src/main/java/buttondevteam/core/component/updater/UpdatePluginCommand.java index ee006c4..0569e89 100755 --- a/ButtonCore/src/main/java/buttondevteam/component/updater/UpdatePluginCommand.java +++ b/ButtonCore/src/main/java/buttondevteam/core/component/updater/UpdatePluginCommand.java @@ -1,4 +1,4 @@ -package buttondevteam.component.updater; +package buttondevteam.core.component.updater; import buttondevteam.core.MainPlugin; import buttondevteam.lib.TBMCCoreAPI; diff --git a/ButtonCore/src/main/java/buttondevteam/lib/ScheduledServerRestartEvent.java b/ButtonCore/src/main/java/buttondevteam/lib/ScheduledServerRestartEvent.java index 749578f..4531ad9 100755 --- a/ButtonCore/src/main/java/buttondevteam/lib/ScheduledServerRestartEvent.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/ScheduledServerRestartEvent.java @@ -1,20 +1,18 @@ package buttondevteam.lib; +import buttondevteam.core.component.restart.ScheduledRestartCommand; +import lombok.Getter; +import lombok.RequiredArgsConstructor; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; +@Getter +@RequiredArgsConstructor public class ScheduledServerRestartEvent extends Event { private static final HandlerList handlers = new HandlerList(); - private final int restartticks; - - public ScheduledServerRestartEvent(int restartticks) { - this.restartticks = restartticks; - } - - public int getRestartTicks() { - return restartticks; - } + private final int restartTicks; + private final ScheduledRestartCommand command; @Override public HandlerList getHandlers() { diff --git a/ButtonCore/src/main/java/buttondevteam/lib/TBMCChatEvent.java b/ButtonCore/src/main/java/buttondevteam/lib/TBMCChatEvent.java index cae2c39..ee37c30 100755 --- a/ButtonCore/src/main/java/buttondevteam/lib/TBMCChatEvent.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/TBMCChatEvent.java @@ -1,6 +1,6 @@ package buttondevteam.lib; -import buttondevteam.component.channel.Channel; +import buttondevteam.core.component.channel.Channel; import buttondevteam.lib.chat.ChatMessage; import lombok.Getter; import lombok.experimental.Delegate; diff --git a/ButtonCore/src/main/java/buttondevteam/lib/TBMCChatEventBase.java b/ButtonCore/src/main/java/buttondevteam/lib/TBMCChatEventBase.java index bed34a6..d30e12e 100755 --- a/ButtonCore/src/main/java/buttondevteam/lib/TBMCChatEventBase.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/TBMCChatEventBase.java @@ -1,6 +1,6 @@ package buttondevteam.lib; -import buttondevteam.component.channel.Channel; +import buttondevteam.core.component.channel.Channel; import lombok.Getter; import lombok.NonNull; import lombok.RequiredArgsConstructor; diff --git a/ButtonCore/src/main/java/buttondevteam/lib/TBMCChatPreprocessEvent.java b/ButtonCore/src/main/java/buttondevteam/lib/TBMCChatPreprocessEvent.java index 28bd27e..6ff3bda 100755 --- a/ButtonCore/src/main/java/buttondevteam/lib/TBMCChatPreprocessEvent.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/TBMCChatPreprocessEvent.java @@ -1,6 +1,6 @@ package buttondevteam.lib; -import buttondevteam.component.channel.Channel; +import buttondevteam.core.component.channel.Channel; import lombok.Getter; import lombok.Setter; import org.bukkit.command.CommandSender; diff --git a/ButtonCore/src/main/java/buttondevteam/lib/TBMCCoreAPI.java b/ButtonCore/src/main/java/buttondevteam/lib/TBMCCoreAPI.java index e114196..d4d06cf 100755 --- a/ButtonCore/src/main/java/buttondevteam/lib/TBMCCoreAPI.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/TBMCCoreAPI.java @@ -1,188 +1,188 @@ -package buttondevteam.lib; - -import buttondevteam.component.updater.PluginUpdater; -import buttondevteam.core.MainPlugin; -import buttondevteam.lib.player.ChromaGamerBase; -import buttondevteam.lib.potato.DebugPotato; -import org.apache.commons.io.IOUtils; -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.event.Listener; -import org.bukkit.plugin.Plugin; - -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.net.URLConnection; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map.Entry; - -public class TBMCCoreAPI { - static final List coders = new ArrayList() { - private static final long serialVersionUID = -4462159250738367334L; - { - add("Alisolarflare"); - add("NorbiPeti"); - add("iie"); - add("thewindmillman"); - add("mayskam1995"); - } - }; - - /** - * Updates or installs the specified plugin. The plugin must use Maven. - * - * @param name - * The plugin's repository name. - * @param sender - * The command sender (if not console, messages will be printed to console as well). - */ - public static void UpdatePlugin(String name, CommandSender sender) { - UpdatePlugin(name, sender, "master"); - } - - /** - * Updates or installs the specified plugin from the specified branch. The plugin must use Maven. - * - * @param name - * The plugin's repository name. - * @param sender - * The command sender (if not console, messages will be printed to console as well). - * @param branch - * The branch to download the plugin from. - * @return Success or not - */ - public static boolean UpdatePlugin(String name, CommandSender sender, String branch) { - return PluginUpdater.UpdatePlugin(name, sender, branch); - } - - public static String DownloadString(String urlstr) throws IOException { - URL url = new URL(urlstr); - URLConnection con = url.openConnection(); - con.setRequestProperty("User-Agent", "TBMCPlugins"); - InputStream in = con.getInputStream(); - String encoding = con.getContentEncoding(); - encoding = encoding == null ? "UTF-8" : encoding; - String body = IOUtils.toString(in, encoding); - in.close(); - return body; - } - - private static final HashMap exceptionsToSend = new HashMap<>(); - private static final List debugMessagesToSend = new ArrayList<>(); - - /** - * Send exception to the {@link TBMCExceptionEvent}. - * - * @param sourcemsg - * A message that is shown at the top of the exception (before the exception's message) - * @param e - * The exception to send - */ - public static void SendException(String sourcemsg, Throwable e) { - SendException(sourcemsg, e, false); - } - - public static void SendException(String sourcemsg, Throwable e, boolean debugPotato) { - SendUnsentExceptions(); - TBMCExceptionEvent event = new TBMCExceptionEvent(sourcemsg, e); - Bukkit.getPluginManager().callEvent(event); - synchronized (exceptionsToSend) { - if (!event.isHandled()) - exceptionsToSend.put(sourcemsg, e); - } - Bukkit.getLogger().warning(sourcemsg); - e.printStackTrace(); - if (debugPotato) { - List devsOnline = new ArrayList(); - for (Player player : Bukkit.getOnlinePlayers()) { - if (coders.contains(player.getName())) { - devsOnline.add(player); - } - } - if (!devsOnline.isEmpty()) { - DebugPotato potato = new DebugPotato() - .setMessage(new String[] { // - "§b§o" + e.getClass().getSimpleName(), // - "§c§o" + sourcemsg, // - "§a§oFind a dev to fix this issue" }) - .setType(e instanceof IOException ? "Throwable Potato" - : e instanceof ClassCastException ? "Squished Potato" - : e instanceof NullPointerException ? "Plain Potato" - : e instanceof StackOverflowError ? "Chips" : "Error Potato"); - for (Player dev : devsOnline) { - potato.Send(dev); - } - } - } - } - - public static void sendDebugMessage(String debugMessage) { - SendUnsentDebugMessages(); - TBMCDebugMessageEvent event = new TBMCDebugMessageEvent(debugMessage); - Bukkit.getPluginManager().callEvent(event); - synchronized (debugMessagesToSend) { - if (!event.isSent()) - debugMessagesToSend.add(debugMessage); - } - } - - /** - * Registers Bukkit events, handling the exceptions occurring in those events - * - * @param listener - * The class that handles the events - * @param plugin - * The plugin which the listener belongs to - */ - public static void RegisterEventsForExceptions(Listener listener, Plugin plugin) { - EventExceptionHandler.registerEvents(listener, plugin, new EventExceptionCoreHandler()); - } - - public static void RegisterUserClass(Class userclass) { - ChromaGamerBase.RegisterPluginUserClass(userclass); - } - - /** - * Send exceptions that haven't been sent (their events didn't get handled). This method is used by the DiscordPlugin's ready event - */ - public static void SendUnsentExceptions() { - synchronized (exceptionsToSend) { - if (exceptionsToSend.size() > 20) { - exceptionsToSend.clear(); // Don't call more and more events if all the handler plugins are unloaded - Bukkit.getLogger().warning("Unhandled exception list is over 20! Clearing!"); - } - for (Iterator> iterator = exceptionsToSend.entrySet().iterator(); iterator.hasNext(); ) { - Entry entry = iterator.next(); - TBMCExceptionEvent event = new TBMCExceptionEvent(entry.getKey(), entry.getValue()); - Bukkit.getPluginManager().callEvent(event); - if (event.isHandled()) - iterator.remove(); - } - } - } - - public static void SendUnsentDebugMessages() { - synchronized (debugMessagesToSend) { - if (debugMessagesToSend.size() > 20) { - debugMessagesToSend.clear(); // Don't call more and more DebugMessages if all the handler plugins are unloaded - Bukkit.getLogger().warning("Unhandled Debug Message list is over 20! Clearing!"); - } - for (Iterator iterator = debugMessagesToSend.iterator(); iterator.hasNext(); ) { - String message = iterator.next(); - TBMCDebugMessageEvent event = new TBMCDebugMessageEvent(message); - Bukkit.getPluginManager().callEvent(event); - if (event.isSent()) - iterator.remove(); - } - } - } - - public static boolean IsTestServer() { - return MainPlugin.Test; - } +package buttondevteam.lib; + +import buttondevteam.core.MainPlugin; +import buttondevteam.core.component.updater.PluginUpdater; +import buttondevteam.lib.player.ChromaGamerBase; +import buttondevteam.lib.potato.DebugPotato; +import org.apache.commons.io.IOUtils; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.bukkit.plugin.Plugin; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map.Entry; + +public class TBMCCoreAPI { + static final List coders = new ArrayList() { + private static final long serialVersionUID = -4462159250738367334L; + { + add("Alisolarflare"); + add("NorbiPeti"); + add("iie"); + add("thewindmillman"); + add("mayskam1995"); + } + }; + + /** + * Updates or installs the specified plugin. The plugin must use Maven. + * + * @param name + * The plugin's repository name. + * @param sender + * The command sender (if not console, messages will be printed to console as well). + */ + public static void UpdatePlugin(String name, CommandSender sender) { + UpdatePlugin(name, sender, "master"); + } + + /** + * Updates or installs the specified plugin from the specified branch. The plugin must use Maven. + * + * @param name + * The plugin's repository name. + * @param sender + * The command sender (if not console, messages will be printed to console as well). + * @param branch + * The branch to download the plugin from. + * @return Success or not + */ + public static boolean UpdatePlugin(String name, CommandSender sender, String branch) { + return PluginUpdater.UpdatePlugin(name, sender, branch); + } + + public static String DownloadString(String urlstr) throws IOException { + URL url = new URL(urlstr); + URLConnection con = url.openConnection(); + con.setRequestProperty("User-Agent", "TBMCPlugins"); + InputStream in = con.getInputStream(); + String encoding = con.getContentEncoding(); + encoding = encoding == null ? "UTF-8" : encoding; + String body = IOUtils.toString(in, encoding); + in.close(); + return body; + } + + private static final HashMap exceptionsToSend = new HashMap<>(); + private static final List debugMessagesToSend = new ArrayList<>(); + + /** + * Send exception to the {@link TBMCExceptionEvent}. + * + * @param sourcemsg + * A message that is shown at the top of the exception (before the exception's message) + * @param e + * The exception to send + */ + public static void SendException(String sourcemsg, Throwable e) { + SendException(sourcemsg, e, false); + } + + public static void SendException(String sourcemsg, Throwable e, boolean debugPotato) { + SendUnsentExceptions(); + TBMCExceptionEvent event = new TBMCExceptionEvent(sourcemsg, e); + Bukkit.getPluginManager().callEvent(event); + synchronized (exceptionsToSend) { + if (!event.isHandled()) + exceptionsToSend.put(sourcemsg, e); + } + Bukkit.getLogger().warning(sourcemsg); + e.printStackTrace(); + if (debugPotato) { + List devsOnline = new ArrayList(); + for (Player player : Bukkit.getOnlinePlayers()) { + if (coders.contains(player.getName())) { + devsOnline.add(player); + } + } + if (!devsOnline.isEmpty()) { + DebugPotato potato = new DebugPotato() + .setMessage(new String[] { // + "§b§o" + e.getClass().getSimpleName(), // + "§c§o" + sourcemsg, // + "§a§oFind a dev to fix this issue" }) + .setType(e instanceof IOException ? "Throwable Potato" + : e instanceof ClassCastException ? "Squished Potato" + : e instanceof NullPointerException ? "Plain Potato" + : e instanceof StackOverflowError ? "Chips" : "Error Potato"); + for (Player dev : devsOnline) { + potato.Send(dev); + } + } + } + } + + public static void sendDebugMessage(String debugMessage) { + SendUnsentDebugMessages(); + TBMCDebugMessageEvent event = new TBMCDebugMessageEvent(debugMessage); + Bukkit.getPluginManager().callEvent(event); + synchronized (debugMessagesToSend) { + if (!event.isSent()) + debugMessagesToSend.add(debugMessage); + } + } + + /** + * Registers Bukkit events, handling the exceptions occurring in those events + * + * @param listener + * The class that handles the events + * @param plugin + * The plugin which the listener belongs to + */ + public static void RegisterEventsForExceptions(Listener listener, Plugin plugin) { + EventExceptionHandler.registerEvents(listener, plugin, new EventExceptionCoreHandler()); + } + + public static void RegisterUserClass(Class userclass) { + ChromaGamerBase.RegisterPluginUserClass(userclass); + } + + /** + * Send exceptions that haven't been sent (their events didn't get handled). This method is used by the DiscordPlugin's ready event + */ + public static void SendUnsentExceptions() { + synchronized (exceptionsToSend) { + if (exceptionsToSend.size() > 20) { + exceptionsToSend.clear(); // Don't call more and more events if all the handler plugins are unloaded + Bukkit.getLogger().warning("Unhandled exception list is over 20! Clearing!"); + } + for (Iterator> iterator = exceptionsToSend.entrySet().iterator(); iterator.hasNext(); ) { + Entry entry = iterator.next(); + TBMCExceptionEvent event = new TBMCExceptionEvent(entry.getKey(), entry.getValue()); + Bukkit.getPluginManager().callEvent(event); + if (event.isHandled()) + iterator.remove(); + } + } + } + + public static void SendUnsentDebugMessages() { + synchronized (debugMessagesToSend) { + if (debugMessagesToSend.size() > 20) { + debugMessagesToSend.clear(); // Don't call more and more DebugMessages if all the handler plugins are unloaded + Bukkit.getLogger().warning("Unhandled Debug Message list is over 20! Clearing!"); + } + for (Iterator iterator = debugMessagesToSend.iterator(); iterator.hasNext(); ) { + String message = iterator.next(); + TBMCDebugMessageEvent event = new TBMCDebugMessageEvent(message); + Bukkit.getPluginManager().callEvent(event); + if (event.isSent()) + iterator.remove(); + } + } + } + + public static boolean IsTestServer() { + return MainPlugin.Test; + } } \ No newline at end of file diff --git a/ButtonCore/src/main/java/buttondevteam/lib/TBMCSystemChatEvent.java b/ButtonCore/src/main/java/buttondevteam/lib/TBMCSystemChatEvent.java index f4ded2a..80cd634 100755 --- a/ButtonCore/src/main/java/buttondevteam/lib/TBMCSystemChatEvent.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/TBMCSystemChatEvent.java @@ -1,6 +1,6 @@ package buttondevteam.lib; -import buttondevteam.component.channel.Channel; +import buttondevteam.core.component.channel.Channel; import lombok.Getter; import org.bukkit.command.CommandSender; import org.bukkit.event.HandlerList; diff --git a/ButtonCore/src/main/java/buttondevteam/lib/ThorpeUtils.java b/ButtonCore/src/main/java/buttondevteam/lib/ThorpeUtils.java new file mode 100644 index 0000000..4f8560c --- /dev/null +++ b/ButtonCore/src/main/java/buttondevteam/lib/ThorpeUtils.java @@ -0,0 +1,38 @@ +package buttondevteam.lib; + +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public final class ThorpeUtils { + private ThorpeUtils() {} + + public static String getDisplayName(CommandSender sender) { + if (sender instanceof IHaveFancyName) + return ((IHaveFancyName) sender).getFancyName(); + if (sender instanceof Player) + return ((Player) sender).getDisplayName(); + return sender.getName(); + } + + public static String getFullDisplayName(CommandSender sender) { + if (sender instanceof IHaveFancyName) + return ((IHaveFancyName) sender).getFancyFullName(); + return getDisplayName(sender); + } + + public interface IHaveFancyName { + /** + * May not be null. + * + * @return The name to be displayed in most places. + */ + String getFancyName(); + + /** + * May return null. + * + * @return The full name that can be used to uniquely indentify the user. + */ + String getFancyFullName(); + } +} diff --git a/ButtonCore/src/main/java/buttondevteam/lib/chat/Command2.java b/ButtonCore/src/main/java/buttondevteam/lib/chat/Command2.java index 014b512..87a1a18 100644 --- a/ButtonCore/src/main/java/buttondevteam/lib/chat/Command2.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/chat/Command2.java @@ -1,18 +1,24 @@ package buttondevteam.lib.chat; +import buttondevteam.lib.TBMCCoreAPI; import buttondevteam.lib.player.ChromaGamerBase; import lombok.RequiredArgsConstructor; +import lombok.experimental.var; import lombok.val; import org.bukkit.command.CommandSender; +import org.bukkit.configuration.file.YamlConfiguration; +import java.io.InputStreamReader; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.function.Function; +import java.util.stream.Collectors; /** * The method name is the subcommand, use underlines (_) to add further subcommands. @@ -26,7 +32,6 @@ public abstract class Command2 { * @param args All of the arguments passed as is * @return The success of the command */ - @Subcommand public boolean def(CommandSender sender, @TextArg String args) { return false; } @@ -58,12 +63,17 @@ public abstract class Command2 { @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Subcommand { + /** + * Help text to show players. A usage message will be also shown below it. + */ + String[] helpText() default {}; } @RequiredArgsConstructor private static class SubcommandData { public final Method method; public final Command2 command; + public final String[] helpText; } private static HashMap subcommands = new HashMap<>(); @@ -133,8 +143,8 @@ public abstract class Command2 { //System.out.println("Our params: "+params); val ret = sd.method.invoke(sd.command, params.toArray()); //I FORGOT TO TURN IT INTO AN ARRAY (for a long time) if (ret instanceof Boolean) { - if (!(boolean) ret) - sender.sendMessage("Wrong usage."); //TODO: Show help text + if (!(boolean) ret) //Show usage + sender.sendMessage(sd.helpText); } else if (ret != null) throw new Exception("Wrong return type! Must return a boolean or void. Return value: "+ret); return true; //We found a method @@ -143,11 +153,55 @@ public abstract class Command2 { } //TODO: Add to the help public static void registerCommand(Command2 command) { - for (val method : command.getClass().getMethods()) - if (method.isAnnotationPresent(Subcommand.class)) - subcommands.put("/" + command.path + //Add command path (class name by default) - (method.getName().equals("def") ? "" : " " + method.getName().replace('_', ' ').toLowerCase()), //Add method name, unless it's 'def' - new SubcommandData(method, command)); //Result of the above (def) is that it will show the help text + try { //Register the default handler first so it can be reliably overwritten + val method = command.getClass().getMethod("def", CommandSender.class, String.class); + val cc = command.getClass().getAnnotation(CommandClass.class); + var ht = cc == null ? new String[0] : cc.helpText(); + String[] both = Arrays.copyOf(ht, ht.length + 1); + both[ht.length] = "Usage: /" + command.path; //TODO: Print subcommands + ht = both; + subcommands.put("/" + command.path, new SubcommandData(method, command, ht)); //TODO: Disable components when the plugin is disabled + } catch (Exception e) { + TBMCCoreAPI.SendException("Could not register default handler for command /" + command.path, e); + } //Continue on + for (val method : command.getClass().getMethods()) { + val ann = method.getAnnotation(Subcommand.class); + if (ann != null) { + val cc = command.getClass().getAnnotation(CommandClass.class); + var ht = ann.helpText().length != 0 || cc == null ? ann.helpText() : cc.helpText(); //If cc is null then it's empty array + val subcommand = "/" + command.path + //Add command path (class name by default) + (method.getName().equals("def") ? "" : " " + method.getName().replace('_', ' ').toLowerCase()); //Add method name, unless it's 'def' + ht = getHelpText(method, ht, subcommand); + subcommands.put(subcommand, new SubcommandData(method, command, ht)); //Result of the above (def) is that it will show the help text + } + } + } + + private static String[] getHelpText(Method method, String[] ht, String subcommand) { //TODO: helpText[0]="§6---- "+helpText[0]+" ----"; + val str = Command2.class.getResourceAsStream("/commands.yml"); + if (str == null) + TBMCCoreAPI.SendException("Error while getting command data!", new Exception("Resource not found!")); + else { + YamlConfiguration yc = YamlConfiguration.loadConfiguration(new InputStreamReader(str)); //Generated by ButtonProcessor + val ccs = yc.getConfigurationSection(method.getDeclaringClass().getName()); + if (ccs != null) { + val cs = ccs.getConfigurationSection(method.getName()); + if (cs != null) { + val mname = cs.getString("method"); + val params = cs.getString("params"); + val goodname = method.getName() + "(" + Arrays.stream(method.getParameterTypes()).map(cl -> cl.getCanonicalName()).collect(Collectors.joining(",")) + ")"; + if (goodname.equals(mname) && params != null) { + String[] both = Arrays.copyOf(ht, ht.length + 1); + both[ht.length] = "Usage: " + subcommand + " " + params; + ht = both; + } else + TBMCCoreAPI.SendException("Error while getting command data!", new Exception("Method '" + method.toString() + "' != " + mname + " or params is " + params)); + } else + TBMCCoreAPI.SendException("Error while getting command data!", new Exception("cs is " + cs)); + } else + TBMCCoreAPI.SendException("Error while getting command data!", new Exception("ccs is " + ccs)); + } + return ht; } private final String path; diff --git a/ButtonCore/src/main/java/buttondevteam/lib/chat/CommandClass.java b/ButtonCore/src/main/java/buttondevteam/lib/chat/CommandClass.java index 55fcfec..ddfff22 100755 --- a/ButtonCore/src/main/java/buttondevteam/lib/chat/CommandClass.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/chat/CommandClass.java @@ -38,7 +38,7 @@ public @interface CommandClass { boolean excludeFromPath() default false; /** - * The help text to show for the players. + * The help text to show for the players. A usage message will be also shown below it. * * @return The help text */ diff --git a/ButtonCore/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java b/ButtonCore/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java index 66eac93..d143d8b 100755 --- a/ButtonCore/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java @@ -1,9 +1,9 @@ package buttondevteam.lib.chat; -import buttondevteam.component.channel.Channel; -import buttondevteam.component.channel.Channel.RecipientTestResult; import buttondevteam.core.CommandCaller; import buttondevteam.core.MainPlugin; +import buttondevteam.core.component.channel.Channel; +import buttondevteam.core.component.channel.Channel.RecipientTestResult; import buttondevteam.lib.TBMCChatEvent; import buttondevteam.lib.TBMCChatPreprocessEvent; import buttondevteam.lib.TBMCCoreAPI; diff --git a/ButtonCore/src/main/java/buttondevteam/lib/player/ChannelPlayerData.java b/ButtonCore/src/main/java/buttondevteam/lib/player/ChannelPlayerData.java index 6cebce8..5f12ca9 100644 --- a/ButtonCore/src/main/java/buttondevteam/lib/player/ChannelPlayerData.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/player/ChannelPlayerData.java @@ -1,6 +1,6 @@ package buttondevteam.lib.player; -import buttondevteam.component.channel.Channel; +import buttondevteam.core.component.channel.Channel; import org.bukkit.configuration.file.YamlConfiguration; public class ChannelPlayerData { //I just want this to work diff --git a/ButtonCore/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java b/ButtonCore/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java index 902a00a..6c6ea0b 100755 --- a/ButtonCore/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java @@ -1,6 +1,6 @@ package buttondevteam.lib.player; -import buttondevteam.component.channel.Channel; +import buttondevteam.core.component.channel.Channel; import buttondevteam.lib.TBMCCoreAPI; import com.google.common.collect.HashBiMap; import lombok.val; diff --git a/ButtonCore/src/main/java/buttondevteam/lib/player/TBMCPlayerBase.java b/ButtonCore/src/main/java/buttondevteam/lib/player/TBMCPlayerBase.java index ba15bb4..0093c4e 100755 --- a/ButtonCore/src/main/java/buttondevteam/lib/player/TBMCPlayerBase.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/player/TBMCPlayerBase.java @@ -1,6 +1,6 @@ package buttondevteam.lib.player; -import buttondevteam.component.towny.TownyComponent; +import buttondevteam.core.component.towny.TownyComponent; import buttondevteam.lib.TBMCCoreAPI; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; diff --git a/ButtonProcessor/ButtonProcessor.iml b/ButtonProcessor/ButtonProcessor.iml index cc79963..35bfd14 100755 --- a/ButtonProcessor/ButtonProcessor.iml +++ b/ButtonProcessor/ButtonProcessor.iml @@ -12,6 +12,13 @@ + + + + + + + \ No newline at end of file diff --git a/ButtonProcessor/pom.xml b/ButtonProcessor/pom.xml index 54981ad..ccc6888 100755 --- a/ButtonProcessor/pom.xml +++ b/ButtonProcessor/pom.xml @@ -1,40 +1,54 @@ - - 4.0.0 - - com.github.TBMCPlugins - ButtonCore - master-SNAPSHOT - - com.github.TBMCPlugins.ButtonCore - ButtonProcessor - jar - - ButtonProcessor - http://maven.apache.org - - - - - maven-compiler-plugin - - 1.8 - 1.8 - -proc:none - - - - org.apache.maven.plugins - maven-surefire-plugin - - false - - - - - - - - UTF-8 - - + + 4.0.0 + + + org.yaml + snakeyaml + 1.21 + compile + + + org.spigotmc + spigot-api + 1.12.2-R0.1-SNAPSHOT + compile + + + + com.github.TBMCPlugins + ButtonCore + master-SNAPSHOT + + com.github.TBMCPlugins.ButtonCore + ButtonProcessor + jar + + ButtonProcessor + http://maven.apache.org + + + + + maven-compiler-plugin + + 1.8 + 1.8 + -proc:none + + + + org.apache.maven.plugins + maven-surefire-plugin + + false + + + + + + + + UTF-8 + + diff --git a/ButtonProcessor/src/main/java/buttondevteam/buttonproc/ButtonProcessor.java b/ButtonProcessor/src/main/java/buttondevteam/buttonproc/ButtonProcessor.java index e9e36ba..f7bb7fe 100755 --- a/ButtonProcessor/src/main/java/buttondevteam/buttonproc/ButtonProcessor.java +++ b/ButtonProcessor/src/main/java/buttondevteam/buttonproc/ButtonProcessor.java @@ -1,17 +1,25 @@ package buttondevteam.buttonproc; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.YamlConfiguration; + import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.RoundEnvironment; import javax.annotation.processing.SupportedAnnotationTypes; import javax.lang.model.SourceVersion; -import javax.lang.model.element.AnnotationMirror; -import javax.lang.model.element.Element; -import javax.lang.model.element.Modifier; -import javax.lang.model.element.TypeElement; +import javax.lang.model.element.*; +import javax.tools.Diagnostic; import javax.tools.Diagnostic.Kind; +import javax.tools.FileObject; +import javax.tools.JavaFileObject; +import javax.tools.StandardLocation; +import java.io.File; +import java.io.IOException; +import java.io.Writer; import java.util.List; import java.util.Set; import java.util.function.Function; +import java.util.stream.Collectors; @SupportedAnnotationTypes("buttondevteam.*") public class ButtonProcessor extends AbstractProcessor { @@ -23,7 +31,7 @@ public class ButtonProcessor extends AbstractProcessor { System.out.println("Processing " + targetcl); List annotationMirrors = processingEnv.getElementUtils() .getAllAnnotationMirrors(targetcl); - System.out.println("Annotations: " + annotationMirrors); + //System.out.println("Annotations: " + annotationMirrors); Function hasAnnotation = ann -> annotationMirrors.stream() .anyMatch(am -> am.getAnnotationType().toString().contains(ann)); if (hasAnnotation.apply("ChromaGamerEnforcer") && !hasAnnotation.apply("UserClass") @@ -36,15 +44,67 @@ public class ButtonProcessor extends AbstractProcessor { "No PlayerClass annotation found for " + targetcl.getSimpleName(), targetcl); for (AnnotationMirror annotation : annotationMirrors) { String type = annotation.getAnnotationType().toString(); - System.out.println("Type: " + type); + //System.out.println("Type: " + type); } + processSubcommands(targetcl, annotationMirrors); } } + try { + if (found) { + FileObject fo = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", "commands.yml"); + yc.save(new File(fo.toUri())); + found = false; + } + } catch (IOException e) { + e.printStackTrace(); + } return true; // claim the annotations } - @Override + private YamlConfiguration yc = new YamlConfiguration(); + private boolean found = false; + + private void processSubcommands(Element targetcl, List annotationMirrors) { + if (!(targetcl instanceof ExecutableElement)) + return; + //System.out.println("Annotations: "+annotationMirrors); + if (annotationMirrors.stream().noneMatch(an -> an.getAnnotationType().toString().endsWith("Subcommand"))) + return; + //System.out.print("Processing method: " + targetcl.getEnclosingElement()+" "+targetcl); + ConfigurationSection cs = yc.createSection(targetcl.getEnclosingElement().toString() + + "." + targetcl.getSimpleName().toString()); //Need to do the 2 config sections at once so it doesn't overwrite the class section + System.out.println(targetcl); + cs.set("method", targetcl.toString()); + cs.set("params", ((ExecutableElement) targetcl).getParameters().stream().skip(1).map(p -> { + //String tn=p.asType().toString(); + //return tn.substring(tn.lastIndexOf('.')+1)+" "+p.getSimpleName(); + boolean optional = p.getAnnotationMirrors().stream().anyMatch(am -> am.getAnnotationType().toString().endsWith("Optional")); + if (optional) + return "[" + p.getSimpleName() + "]"; + return "<" + p.getSimpleName() + ">"; + }).collect(Collectors.joining(" "))); + //System.out.println(); + found = true; + } + + @Override public SourceVersion getSupportedSourceVersion() { return SourceVersion.latestSupported(); } + + private String fetchSourcePath() { + try { + JavaFileObject generationForPath = processingEnv.getFiler().createSourceFile("PathFor" + getClass().getSimpleName()); + Writer writer = generationForPath.openWriter(); + String sourcePath = generationForPath.toUri().getPath(); + writer.close(); + generationForPath.delete(); + + return sourcePath; + } catch (IOException e) { + processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING, "Unable to determine source file path!"); + } + + return ""; + } }