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 ""; + } }