From c523ff7a5b1d1ec7c739dac59db488a4dfcc836c Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Mon, 13 Aug 2018 13:33:18 +0200 Subject: [PATCH 01/11] Added components with deps Copied from ButtonPresents and extended @alisolarflare #48 --- .../lib/architecture/Component.java | 118 ++++++++++++++++++ .../lib/architecture/ComponentMetadata.java | 12 ++ 2 files changed, 130 insertions(+) create mode 100644 ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java create mode 100644 ButtonCore/src/main/java/buttondevteam/lib/architecture/ComponentMetadata.java diff --git a/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java b/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java new file mode 100644 index 0000000..5c2824b --- /dev/null +++ b/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java @@ -0,0 +1,118 @@ +package buttondevteam.lib.architecture; + +import buttondevteam.lib.TBMCCoreAPI; +import buttondevteam.lib.chat.TBMCChatAPI; +import buttondevteam.lib.chat.TBMCCommandBase; +import lombok.val; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.event.Listener; +import org.bukkit.plugin.java.JavaPlugin; + +import java.util.HashMap; + +public abstract class Component { + private static HashMap, Component> components; + + /** + * Registers a component checking it's dependencies and calling {@link #register(JavaPlugin)}.
+ * Make sure to register the dependencies first. + * + * @param component The component to register + */ + public static void registerComponent(JavaPlugin plugin, Component component) { + val metaAnn = component.getClass().getAnnotation(ComponentMetadata.class); + if (metaAnn != null) { + Class[] dependencies = metaAnn.depends(); + for (val dep : dependencies) { + if (!components.containsKey(dep)) { + plugin.getLogger().warning("Failed to register component " + component.getClassName() + " as a required dependency is missing/disabled: " + dep.getSimpleName()); + return; + } + } + } + component.register(plugin); + components.put(component.getClass(), component); + } + + /** + * Unregisters a component by calling {@link #unregister(JavaPlugin)}.
+ * Make sure to unregister the dependencies last. + * + * @param componentClass The component class to unregister + */ + public static void unregisterComponent(JavaPlugin plugin, Class componentClass) { + val component = components.get(componentClass); + if (component == null) + return; //Failed to load + val metaAnn = componentClass.getAnnotation(ComponentMetadata.class); + if (metaAnn != null) { + Class[] dependencies = metaAnn.depends(); + for (val dep : dependencies) { + if (!components.containsKey(dep)) { + plugin.getLogger().warning("Failed to unregister component " + component.getClassName() + " as a required dependency is missing/disabled: " + dep.getSimpleName()); + return; + } + } + } + component.unregister(plugin); + components.remove(componentClass); + } + + /** + * This is used to send a warning if there are registered components on shutdown.
+ * + * @return If there are any registered components + */ + public static boolean haveRegisteredComponents() { + return components.size() > 0; + } + + /** + * Registers the module, when called by the JavaPlugin class. Call + * registerCommand() and registerListener() within this method. + * + * @param plugin Plugin class called to register commands and listeners + */ + public abstract void register(JavaPlugin plugin); + + /** + * Registers a TBMCCommand to the plugin. Make sure to add it to plugin.yml and use {@link buttondevteam.lib.chat.CommandClass}. + * + * @param plugin Main plugin responsible for stuff + * @param commandBase Custom coded command class + */ + protected void registerCommand(JavaPlugin plugin, TBMCCommandBase commandBase) { + TBMCChatAPI.AddCommand(plugin, commandBase); + } + + /** + * Registers a Listener to this plugin + * + * @param plugin Main plugin responsible for stuff + * @param listener The event listener to register + * @return The provided listener + */ + protected Listener registerListener(JavaPlugin plugin, Listener listener) { + TBMCCoreAPI.RegisterEventsForExceptions(listener, plugin); + return listener; + } + + public void saveData(FileConfiguration config, String pathToData, Object data) { + config.set("moduledata." + this.getClassName() + "." + pathToData, data); + } + + public Object getData(FileConfiguration config, String pathToData, Object data) { + return config.get("moduledata." + this.getClassName() + "." + pathToData, data); + } + + private String getClassName() { + Class enclosingClass = getClass().getEnclosingClass(); + String className; + if (enclosingClass != null) { + className = (enclosingClass.getName()); + } else { + className = (getClass().getName()); + } + return className; + } +} diff --git a/ButtonCore/src/main/java/buttondevteam/lib/architecture/ComponentMetadata.java b/ButtonCore/src/main/java/buttondevteam/lib/architecture/ComponentMetadata.java new file mode 100644 index 0000000..6519fca --- /dev/null +++ b/ButtonCore/src/main/java/buttondevteam/lib/architecture/ComponentMetadata.java @@ -0,0 +1,12 @@ +package buttondevteam.lib.architecture; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface ComponentMetadata { + Class[] depends(); +} From ae849940250bb5320940f990ab4a6f2f3478ad66 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Fri, 5 Oct 2018 22:19:29 +0200 Subject: [PATCH 02/11] Continued refactoring --- ...tonCore_Towny_master_v1_0_g8d3b6b6_296.xml | 13 ++ ...milkbowl_VaultAPI_master_c8cb88f27a_1.xml} | 8 +- ..._javax_persistence_persistence_api_1_0.xml | 13 -- .../Maven__org_avaje_ebean_2_8_1.xml | 13 -- ...org_bukkit_bukkit_1_13_1_R0_1_SNAPSHOT.xml | 13 ++ ...n__org_bukkit_bukkit_1_9_R0_1_SNAPSHOT.xml | 13 -- .idea/markdown-navigator.xml | 82 ++++++++++++ .../markdown-navigator/profiles_settings.xml | 3 + .idea/uiDesigner.xml | 124 ++++++++++++++++++ BuildConfigUpdater/BuildConfigUpdater.iml | 1 - BuildConfigUpdater/src/main/java/BCUMain.java | 2 +- .../component/commands/CommandComponent.java | 16 +++ .../component/restart/RestartComponent.java | 21 +++ .../updater}/PluginUpdater.java | 5 +- .../updater/PluginUpdaterComponent.java | 17 +++ .../updater}/UpdatePluginCommand.java | 4 +- .../java/buttondevteam/core/MainPlugin.java | 5 +- .../buttondevteam/core/PlayerListener.java | 4 +- .../java/buttondevteam/lib/TBMCCoreAPI.java | 1 + .../lib/architecture/Component.java | 8 ++ .../buttondevteam/lib/chat/ChatMessage.java | 67 +++++----- .../{IDiscordSender.java => IFakePlayer.java} | 2 +- .../buttondevteam/lib/chat/TBMCChatAPI.java | 4 +- 23 files changed, 349 insertions(+), 90 deletions(-) create mode 100644 .idea/libraries/Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_v1_0_g8d3b6b6_296.xml rename .idea/libraries/{Maven__com_github_milkbowl_VaultAPI_master_8dc0859cba_1.xml => Maven__com_github_milkbowl_VaultAPI_master_c8cb88f27a_1.xml} (55%) mode change 100755 => 100644 delete mode 100755 .idea/libraries/Maven__javax_persistence_persistence_api_1_0.xml delete mode 100755 .idea/libraries/Maven__org_avaje_ebean_2_8_1.xml create mode 100644 .idea/libraries/Maven__org_bukkit_bukkit_1_13_1_R0_1_SNAPSHOT.xml delete mode 100755 .idea/libraries/Maven__org_bukkit_bukkit_1_9_R0_1_SNAPSHOT.xml create mode 100644 .idea/markdown-navigator.xml create mode 100644 .idea/markdown-navigator/profiles_settings.xml create mode 100644 .idea/uiDesigner.xml create mode 100644 ButtonCore/src/main/java/buttondevteam/component/commands/CommandComponent.java create mode 100644 ButtonCore/src/main/java/buttondevteam/component/restart/RestartComponent.java rename ButtonCore/src/main/java/buttondevteam/{lib => component/updater}/PluginUpdater.java (97%) create mode 100644 ButtonCore/src/main/java/buttondevteam/component/updater/PluginUpdaterComponent.java rename ButtonCore/src/main/java/buttondevteam/{core => component/updater}/UpdatePluginCommand.java (94%) rename ButtonCore/src/main/java/buttondevteam/lib/chat/{IDiscordSender.java => IFakePlayer.java} (71%) diff --git a/.idea/libraries/Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_v1_0_g8d3b6b6_296.xml b/.idea/libraries/Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_v1_0_g8d3b6b6_296.xml new file mode 100644 index 0000000..8991a67 --- /dev/null +++ b/.idea/libraries/Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_v1_0_g8d3b6b6_296.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_8dc0859cba_1.xml b/.idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_c8cb88f27a_1.xml old mode 100755 new mode 100644 similarity index 55% rename from .idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_8dc0859cba_1.xml rename to .idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_c8cb88f27a_1.xml index 2f453df..b5aaa43 --- a/.idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_8dc0859cba_1.xml +++ b/.idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_c8cb88f27a_1.xml @@ -1,13 +1,13 @@ - + - + - + - + \ No newline at end of file diff --git a/.idea/libraries/Maven__javax_persistence_persistence_api_1_0.xml b/.idea/libraries/Maven__javax_persistence_persistence_api_1_0.xml deleted file mode 100755 index e60370e..0000000 --- a/.idea/libraries/Maven__javax_persistence_persistence_api_1_0.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_avaje_ebean_2_8_1.xml b/.idea/libraries/Maven__org_avaje_ebean_2_8_1.xml deleted file mode 100755 index 91f161a..0000000 --- a/.idea/libraries/Maven__org_avaje_ebean_2_8_1.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_bukkit_bukkit_1_13_1_R0_1_SNAPSHOT.xml b/.idea/libraries/Maven__org_bukkit_bukkit_1_13_1_R0_1_SNAPSHOT.xml new file mode 100644 index 0000000..4f2c5e4 --- /dev/null +++ b/.idea/libraries/Maven__org_bukkit_bukkit_1_13_1_R0_1_SNAPSHOT.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_bukkit_bukkit_1_9_R0_1_SNAPSHOT.xml b/.idea/libraries/Maven__org_bukkit_bukkit_1_9_R0_1_SNAPSHOT.xml deleted file mode 100755 index 2fb4911..0000000 --- a/.idea/libraries/Maven__org_bukkit_bukkit_1_9_R0_1_SNAPSHOT.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/markdown-navigator.xml b/.idea/markdown-navigator.xml new file mode 100644 index 0000000..3e62462 --- /dev/null +++ b/.idea/markdown-navigator.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/markdown-navigator/profiles_settings.xml b/.idea/markdown-navigator/profiles_settings.xml new file mode 100644 index 0000000..57927c5 --- /dev/null +++ b/.idea/markdown-navigator/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BuildConfigUpdater/BuildConfigUpdater.iml b/BuildConfigUpdater/BuildConfigUpdater.iml index 4902d56..73696cd 100644 --- a/BuildConfigUpdater/BuildConfigUpdater.iml +++ b/BuildConfigUpdater/BuildConfigUpdater.iml @@ -12,7 +12,6 @@ - diff --git a/BuildConfigUpdater/src/main/java/BCUMain.java b/BuildConfigUpdater/src/main/java/BCUMain.java index bca7209..07666d3 100644 --- a/BuildConfigUpdater/src/main/java/BCUMain.java +++ b/BuildConfigUpdater/src/main/java/BCUMain.java @@ -1,4 +1,4 @@ -import buttondevteam.lib.PluginUpdater; +import buttondevteam.component.updater.PluginUpdater; import java.util.List; import java.util.stream.Collectors; diff --git a/ButtonCore/src/main/java/buttondevteam/component/commands/CommandComponent.java b/ButtonCore/src/main/java/buttondevteam/component/commands/CommandComponent.java new file mode 100644 index 0000000..b3f1059 --- /dev/null +++ b/ButtonCore/src/main/java/buttondevteam/component/commands/CommandComponent.java @@ -0,0 +1,16 @@ +package buttondevteam.component.commands; + +import buttondevteam.lib.architecture.Component; +import org.bukkit.plugin.java.JavaPlugin; + +public class CommandComponent extends Component { //TODO: Do we just move everything here? + @Override + public void register(JavaPlugin plugin) { + + } + + @Override + public void unregister(JavaPlugin plugin) { + + } +} diff --git a/ButtonCore/src/main/java/buttondevteam/component/restart/RestartComponent.java b/ButtonCore/src/main/java/buttondevteam/component/restart/RestartComponent.java new file mode 100644 index 0000000..3061824 --- /dev/null +++ b/ButtonCore/src/main/java/buttondevteam/component/restart/RestartComponent.java @@ -0,0 +1,21 @@ +package buttondevteam.component.restart; + +import buttondevteam.core.PrimeRestartCommand; +import buttondevteam.core.ScheduledRestartCommand; +import buttondevteam.lib.architecture.Component; +import buttondevteam.lib.chat.TBMCChatAPI; +import org.bukkit.plugin.java.JavaPlugin; + +public class RestartComponent extends Component { + @Override + public void register(JavaPlugin plugin) { + //TODO: Separately (dis)allow commands + TBMCChatAPI.AddCommand(plugin, ScheduledRestartCommand.class); + TBMCChatAPI.AddCommand(plugin, PrimeRestartCommand.class); + } + + @Override + public void unregister(JavaPlugin plugin) { + + } +} diff --git a/ButtonCore/src/main/java/buttondevteam/lib/PluginUpdater.java b/ButtonCore/src/main/java/buttondevteam/component/updater/PluginUpdater.java similarity index 97% rename from ButtonCore/src/main/java/buttondevteam/lib/PluginUpdater.java rename to ButtonCore/src/main/java/buttondevteam/component/updater/PluginUpdater.java index ca758f8..ce2e993 100755 --- a/ButtonCore/src/main/java/buttondevteam/lib/PluginUpdater.java +++ b/ButtonCore/src/main/java/buttondevteam/component/updater/PluginUpdater.java @@ -1,5 +1,6 @@ -package buttondevteam.lib; +package buttondevteam.component.updater; +import buttondevteam.lib.TBMCCoreAPI; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -136,7 +137,7 @@ public class PluginUpdater { public static List GetPluginNames() { List ret = new ArrayList<>(); try { - String resp = TBMCCoreAPI.DownloadString("https://api.github.com/orgs/TBMCPlugins/repos"); + String resp = TBMCCoreAPI.DownloadString("https://api.github.com/orgs/" + "TBMCPlugins" + "/repos"); //TODO: PluginUpdater JsonArray arr = new JsonParser().parse(resp).getAsJsonArray(); for (JsonElement obj : arr) { JsonObject jobj = obj.getAsJsonObject(); diff --git a/ButtonCore/src/main/java/buttondevteam/component/updater/PluginUpdaterComponent.java b/ButtonCore/src/main/java/buttondevteam/component/updater/PluginUpdaterComponent.java new file mode 100644 index 0000000..1427927 --- /dev/null +++ b/ButtonCore/src/main/java/buttondevteam/component/updater/PluginUpdaterComponent.java @@ -0,0 +1,17 @@ +package buttondevteam.component.updater; + +import buttondevteam.lib.architecture.Component; +import buttondevteam.lib.chat.TBMCChatAPI; +import org.bukkit.plugin.java.JavaPlugin; + +public class PluginUpdaterComponent extends Component { + @Override + public void register(JavaPlugin plugin) { + TBMCChatAPI.AddCommand(plugin, UpdatePluginCommand.class); + } + + @Override + public void unregister(JavaPlugin plugin) { + + } +} diff --git a/ButtonCore/src/main/java/buttondevteam/core/UpdatePluginCommand.java b/ButtonCore/src/main/java/buttondevteam/component/updater/UpdatePluginCommand.java similarity index 94% rename from ButtonCore/src/main/java/buttondevteam/core/UpdatePluginCommand.java rename to ButtonCore/src/main/java/buttondevteam/component/updater/UpdatePluginCommand.java index ba5b309..ee006c4 100755 --- a/ButtonCore/src/main/java/buttondevteam/core/UpdatePluginCommand.java +++ b/ButtonCore/src/main/java/buttondevteam/component/updater/UpdatePluginCommand.java @@ -1,6 +1,6 @@ -package buttondevteam.core; +package buttondevteam.component.updater; -import buttondevteam.lib.PluginUpdater; +import buttondevteam.core.MainPlugin; import buttondevteam.lib.TBMCCoreAPI; import buttondevteam.lib.chat.CommandClass; import buttondevteam.lib.chat.TBMCCommandBase; diff --git a/ButtonCore/src/main/java/buttondevteam/core/MainPlugin.java b/ButtonCore/src/main/java/buttondevteam/core/MainPlugin.java index beb7651..b25ed1f 100755 --- a/ButtonCore/src/main/java/buttondevteam/core/MainPlugin.java +++ b/ButtonCore/src/main/java/buttondevteam/core/MainPlugin.java @@ -1,6 +1,6 @@ package buttondevteam.core; -import buttondevteam.lib.PluginUpdater; +import buttondevteam.component.updater.PluginUpdater; import buttondevteam.lib.TBMCCoreAPI; import buttondevteam.lib.chat.Channel; import buttondevteam.lib.chat.ChatRoom; @@ -40,9 +40,6 @@ public class MainPlugin extends JavaPlugin { setupPermissions(); Test = getConfig().getBoolean("test", true); saveConfig(); - TBMCChatAPI.AddCommand(this, UpdatePluginCommand.class); - TBMCChatAPI.AddCommand(this, ScheduledRestartCommand.class); - TBMCChatAPI.AddCommand(this, PrimeRestartCommand.class); TBMCCoreAPI.RegisterEventsForExceptions(new PlayerListener(), this); TBMCCoreAPI.RegisterUserClass(TBMCPlayerBase.class); TBMCChatAPI.RegisterChatChannel(Channel.GlobalChat = new Channel("§fOOC§f", Color.White, "ooc", null)); diff --git a/ButtonCore/src/main/java/buttondevteam/core/PlayerListener.java b/ButtonCore/src/main/java/buttondevteam/core/PlayerListener.java index af8220e..be7c10b 100755 --- a/ButtonCore/src/main/java/buttondevteam/core/PlayerListener.java +++ b/ButtonCore/src/main/java/buttondevteam/core/PlayerListener.java @@ -1,7 +1,7 @@ package buttondevteam.core; import buttondevteam.lib.TBMCSystemChatEvent; -import buttondevteam.lib.chat.IDiscordSender; +import buttondevteam.lib.chat.IFakePlayer; import buttondevteam.lib.player.TBMCPlayerBase; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -43,7 +43,7 @@ public class PlayerListener implements Listener { if (PrimeRestartCommand.isLoud()) Bukkit.broadcastMessage("§cNobody is online anymore. Restarting."); Bukkit.spigot().restart(); - } else if (!(event.getPlayer() instanceof IDiscordSender) && System.nanoTime() - 10 * 1000000000L - lasttime > 0) { //Ten seconds passed since last reminder + } else if (!(event.getPlayer() instanceof IFakePlayer) && System.nanoTime() - 10 * 1000000000L - lasttime > 0) { //Ten seconds passed since last reminder lasttime = System.nanoTime(); if (PrimeRestartCommand.isLoud()) Bukkit.broadcastMessage(ChatColor.DARK_RED + "The server will restart as soon as nobody is online."); diff --git a/ButtonCore/src/main/java/buttondevteam/lib/TBMCCoreAPI.java b/ButtonCore/src/main/java/buttondevteam/lib/TBMCCoreAPI.java index 76498d5..e114196 100755 --- a/ButtonCore/src/main/java/buttondevteam/lib/TBMCCoreAPI.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/TBMCCoreAPI.java @@ -1,5 +1,6 @@ package buttondevteam.lib; +import buttondevteam.component.updater.PluginUpdater; import buttondevteam.core.MainPlugin; import buttondevteam.lib.player.ChromaGamerBase; import buttondevteam.lib.potato.DebugPotato; diff --git a/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java b/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java index 5c2824b..33c6788 100644 --- a/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java @@ -75,6 +75,14 @@ public abstract class Component { */ public abstract void register(JavaPlugin plugin); + /** + * Unregisters the module, when called by the JavaPlugin class. Do + * any cleanups needed within this method. + * + * @param plugin Plugin class called to register commands and listeners + */ + public abstract void unregister(JavaPlugin plugin); + /** * Registers a TBMCCommand to the plugin. Make sure to add it to plugin.yml and use {@link buttondevteam.lib.chat.CommandClass}. * diff --git a/ButtonCore/src/main/java/buttondevteam/lib/chat/ChatMessage.java b/ButtonCore/src/main/java/buttondevteam/lib/chat/ChatMessage.java index a6fc3f1..056674a 100644 --- a/ButtonCore/src/main/java/buttondevteam/lib/chat/ChatMessage.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/chat/ChatMessage.java @@ -9,38 +9,41 @@ import org.bukkit.command.CommandSender; @Builder @Getter public class ChatMessage { - /** - * The MC channel to send the message to. - */ - private final Channel channel; - /** - * The sender which sends the message. - */ - private final CommandSender sender; - /** - * The Chroma user which sends the message. - */ - private final ChromaGamerBase user; - /** - * The message to send as the user. - */ - private final String message; - /** - * Indicates whether the message comes from running a command (like /tableflip). Implemented to be used from Discord. - */ - private boolean fromCommand; - /** - * The sender which we should check for permissions. Same as {@link #sender} by default. - */ - private CommandSender permCheck; + /** + * The MC channel to send the message to. + */ + private final Channel channel; + /** + * The sender which sends the message. + */ + private final CommandSender sender; + /** + * The Chroma user which sends the message. + */ + private final ChromaGamerBase user; + /** + * The message to send as the user. + */ + private final String message; + /** + * Indicates whether the message comes from running a command (like /tableflip). Implemented to be used from Discord. + */ + private boolean fromCommand; + /** + * The sender which we should check for permissions. Same as {@link #sender} by default. + */ + private CommandSender permCheck; + /** + * The origin of the message, "minecraft" or "discord" for example. + */ + private final String origin; - private static ChatMessageBuilder builder() { - return new ChatMessageBuilder(); - } - - @NonNull - public static ChatMessageBuilder builder(Channel channel, CommandSender sender, ChromaGamerBase user, String message) { - return builder().channel(channel).sender(sender).user(user).message(message); - } + private static ChatMessageBuilder builder() { + return new ChatMessageBuilder(); + } + @NonNull + public static ChatMessageBuilder builder(Channel channel, CommandSender sender, ChromaGamerBase user, String message) { + return builder().channel(channel).sender(sender).user(user).message(message); + } } diff --git a/ButtonCore/src/main/java/buttondevteam/lib/chat/IDiscordSender.java b/ButtonCore/src/main/java/buttondevteam/lib/chat/IFakePlayer.java similarity index 71% rename from ButtonCore/src/main/java/buttondevteam/lib/chat/IDiscordSender.java rename to ButtonCore/src/main/java/buttondevteam/lib/chat/IFakePlayer.java index fd41c90..4f9318c 100755 --- a/ButtonCore/src/main/java/buttondevteam/lib/chat/IDiscordSender.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/chat/IFakePlayer.java @@ -7,6 +7,6 @@ import org.bukkit.command.CommandSender; * @author Norbi * */ -public interface IDiscordSender extends CommandSender { +public interface IFakePlayer extends CommandSender { } diff --git a/ButtonCore/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java b/ButtonCore/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java index f1fcd98..18b0487 100755 --- a/ButtonCore/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java @@ -35,7 +35,7 @@ public class TBMCChatAPI { /** * Returns messages formatted for Minecraft chat listing the subcommands of the command. - * + * * @param command * The command which we want the subcommands of * @param sender @@ -49,7 +49,7 @@ public class TBMCChatAPI { /** * Returns messages formatted for Minecraft chat listing the subcommands of the command.
* Returns a header if subcommands were found, otherwise returns an empty array. - * + * * @param command * The command which we want the subcommands of * @param sender From 5ef5bf47a20d20feafa0cb0033a4c78c870e4bd3 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sun, 11 Nov 2018 00:58:18 +0100 Subject: [PATCH 03/11] Component data improvements & enable Separated enabling the component from registering it - a component will be always registerd, even if it's disabled Component data implemented similarily to player data, just kind of better Bunch of changes, less code repetition --- ..._ButtonCore_Towny_master_248b0d8d0a_1.xml} | 8 +- ...milkbowl_VaultAPI_master_431c5273c2_1.xml} | 8 +- ...org_bukkit_bukkit_1_13_1_R0_1_SNAPSHOT.xml | 6 +- ...igotmc_spigot_api_1_12_2_R0_1_SNAPSHOT.xml | 6 +- BuildConfigUpdater/BuildConfigUpdater.iml | 1 + .../buttondevteam/core/ComponentCommand.java | 30 ++++ .../buttondevteam/core/ComponentManager.java | 33 +++++ .../java/buttondevteam/core/MainPlugin.java | 2 + .../lib/architecture/Component.java | 136 +++++++++++++++--- .../lib/architecture/ConfigData.java | 43 ++++++ .../UnregisteredComponentException.java | 10 ++ 11 files changed, 246 insertions(+), 37 deletions(-) rename .idea/libraries/{Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_v1_0_g8d3b6b6_296.xml => Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_248b0d8d0a_1.xml} (55%) rename .idea/libraries/{Maven__com_github_milkbowl_VaultAPI_master_c8cb88f27a_1.xml => Maven__com_github_milkbowl_VaultAPI_master_431c5273c2_1.xml} (55%) create mode 100644 ButtonCore/src/main/java/buttondevteam/core/ComponentCommand.java create mode 100644 ButtonCore/src/main/java/buttondevteam/core/ComponentManager.java create mode 100644 ButtonCore/src/main/java/buttondevteam/lib/architecture/ConfigData.java create mode 100644 ButtonCore/src/main/java/buttondevteam/lib/architecture/exceptions/UnregisteredComponentException.java diff --git a/.idea/libraries/Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_v1_0_g8d3b6b6_296.xml b/.idea/libraries/Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_248b0d8d0a_1.xml similarity index 55% rename from .idea/libraries/Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_v1_0_g8d3b6b6_296.xml rename to .idea/libraries/Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_248b0d8d0a_1.xml index 8991a67..0d3e00e 100644 --- a/.idea/libraries/Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_v1_0_g8d3b6b6_296.xml +++ b/.idea/libraries/Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_248b0d8d0a_1.xml @@ -1,13 +1,13 @@ - + - + - + - + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_c8cb88f27a_1.xml b/.idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_431c5273c2_1.xml similarity index 55% rename from .idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_c8cb88f27a_1.xml rename to .idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_431c5273c2_1.xml index b5aaa43..19b24a3 100644 --- a/.idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_c8cb88f27a_1.xml +++ b/.idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_431c5273c2_1.xml @@ -1,13 +1,13 @@ - + - + - + - + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_bukkit_bukkit_1_13_1_R0_1_SNAPSHOT.xml b/.idea/libraries/Maven__org_bukkit_bukkit_1_13_1_R0_1_SNAPSHOT.xml index 4f2c5e4..63108e8 100644 --- a/.idea/libraries/Maven__org_bukkit_bukkit_1_13_1_R0_1_SNAPSHOT.xml +++ b/.idea/libraries/Maven__org_bukkit_bukkit_1_13_1_R0_1_SNAPSHOT.xml @@ -1,13 +1,13 @@ - + - + - + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_spigotmc_spigot_api_1_12_2_R0_1_SNAPSHOT.xml b/.idea/libraries/Maven__org_spigotmc_spigot_api_1_12_2_R0_1_SNAPSHOT.xml index 42f0d6f..b6f88ae 100644 --- a/.idea/libraries/Maven__org_spigotmc_spigot_api_1_12_2_R0_1_SNAPSHOT.xml +++ b/.idea/libraries/Maven__org_spigotmc_spigot_api_1_12_2_R0_1_SNAPSHOT.xml @@ -1,13 +1,13 @@ - + - + - + \ 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/ButtonCore/src/main/java/buttondevteam/core/ComponentCommand.java b/ButtonCore/src/main/java/buttondevteam/core/ComponentCommand.java new file mode 100644 index 0000000..a83037b --- /dev/null +++ b/ButtonCore/src/main/java/buttondevteam/core/ComponentCommand.java @@ -0,0 +1,30 @@ +package buttondevteam.core; + +import buttondevteam.lib.chat.CommandClass; +import buttondevteam.lib.chat.TBMCCommandBase; +import org.bukkit.command.CommandSender; + +@CommandClass(modOnly = true) +public class ComponentCommand extends TBMCCommandBase { + @Override + public boolean OnCommand(CommandSender sender, String alias, String[] args) { + if (args.length < 2) + return false; + switch (args[0]) { + case "enable": + break; + case "disable": + break; + case "list": + break; + default: + return false; + } + return true; + } + + @Override + public String[] GetHelpText(String alias) { + return new String[0]; + } +} diff --git a/ButtonCore/src/main/java/buttondevteam/core/ComponentManager.java b/ButtonCore/src/main/java/buttondevteam/core/ComponentManager.java new file mode 100644 index 0000000..023dee4 --- /dev/null +++ b/ButtonCore/src/main/java/buttondevteam/core/ComponentManager.java @@ -0,0 +1,33 @@ +package buttondevteam.core; + +import buttondevteam.lib.architecture.Component; +import buttondevteam.lib.architecture.exceptions.UnregisteredComponentException; + +public final class ComponentManager { + private ComponentManager() {} + + /** + * Enables components based on a configuration + */ + public static void enableComponents() { + //Component.getComponents().values().stream().filter(c->cs.getConfigurationSection(c.getClass().getSimpleName()).getBoolean("enabled")).forEach(c-> { + Component.getComponents().values().stream().filter(c -> c.shouldBeEnabled().get()).forEach(c -> { + try { + Component.setComponentEnabled(c, true); + } catch (UnregisteredComponentException ignored) { //This *should* never happen + } + }); + } + + /** + * Disables all components that are enabled + */ + public static void disableComponents() { + Component.getComponents().values().stream().filter(Component::isEnabled).forEach(c -> { + try { + Component.setComponentEnabled(c, false); + } catch (UnregisteredComponentException ignored) { //This *should* never happen + } + }); + } +} diff --git a/ButtonCore/src/main/java/buttondevteam/core/MainPlugin.java b/ButtonCore/src/main/java/buttondevteam/core/MainPlugin.java index b25ed1f..ec130f1 100755 --- a/ButtonCore/src/main/java/buttondevteam/core/MainPlugin.java +++ b/ButtonCore/src/main/java/buttondevteam/core/MainPlugin.java @@ -40,6 +40,7 @@ public class MainPlugin extends JavaPlugin { setupPermissions(); Test = getConfig().getBoolean("test", true); saveConfig(); + ComponentManager.enableComponents(); TBMCCoreAPI.RegisterEventsForExceptions(new PlayerListener(), this); TBMCCoreAPI.RegisterUserClass(TBMCPlayerBase.class); TBMCChatAPI.RegisterChatChannel(Channel.GlobalChat = new Channel("§fOOC§f", Color.White, "ooc", null)); @@ -67,6 +68,7 @@ public class MainPlugin extends JavaPlugin { @Override public void onDisable() { + ComponentManager.disableComponents(); logger.info("Saving player data..."); TBMCPlayerBase.savePlayers(); logger.info("Player data saved."); diff --git a/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java b/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java index 33c6788..d59cbd9 100644 --- a/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java @@ -1,17 +1,75 @@ package buttondevteam.lib.architecture; import buttondevteam.lib.TBMCCoreAPI; +import buttondevteam.lib.architecture.exceptions.UnregisteredComponentException; import buttondevteam.lib.chat.TBMCChatAPI; import buttondevteam.lib.chat.TBMCCommandBase; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NonNull; +import lombok.experimental.var; import lombok.val; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.event.Listener; import org.bukkit.plugin.java.JavaPlugin; +import java.util.Collections; import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; +/** + * Configuration is based on class name + */ public abstract class Component { - private static HashMap, Component> components; + private static HashMap, Component> components = new HashMap<>(); + + @Getter + private boolean enabled = false; + @Getter(value = AccessLevel.PROTECTED) + @NonNull + private JavaPlugin plugin; + @NonNull + private ConfigurationSection config; + + public ConfigData shouldBeEnabled() { + return getData("enabled", true); + } + + private HashMap> datamap = new HashMap<>(); + + /** + * This method overload should only be used with primitves or String. + * + * @param path The path in config to use + * @param def The value to use by default + * @param The type of this variable (only use primitives or String) + * @return The data object that can be used to get or set the value + */ + @SuppressWarnings("unchecked") + protected ConfigData getData(String path, T def) { + ConfigData data = datamap.get(path); + if (data == null) datamap.put(path, data = new ConfigData<>(config, path, def)); + return (ConfigData) data; + } + + /** + * This method overload may be used with any class. + * + * @param path The path in config to use + * @param def The value to use by default + * @param getter A function that converts a primitive representation to the correct value + * @param setter A function that converts a value to a primitive representation + * @param The type of this variable (can be any class) + * @return The data object that can be used to get or set the value + */ + @SuppressWarnings("unchecked") + protected ConfigData getData(String path, T def, Function getter, Function setter) { + ConfigData data = datamap.get(path); + if (data == null) datamap.put(path, data = new ConfigData<>(config, path, def, getter, setter)); + return (ConfigData) data; + } /** * Registers a component checking it's dependencies and calling {@link #register(JavaPlugin)}.
@@ -20,18 +78,7 @@ public abstract class Component { * @param component The component to register */ public static void registerComponent(JavaPlugin plugin, Component component) { - val metaAnn = component.getClass().getAnnotation(ComponentMetadata.class); - if (metaAnn != null) { - Class[] dependencies = metaAnn.depends(); - for (val dep : dependencies) { - if (!components.containsKey(dep)) { - plugin.getLogger().warning("Failed to register component " + component.getClassName() + " as a required dependency is missing/disabled: " + dep.getSimpleName()); - return; - } - } - } - component.register(plugin); - components.put(component.getClass(), component); + registerUnregisterComponent(plugin, component, true); } /** @@ -44,27 +91,56 @@ public abstract class Component { val component = components.get(componentClass); if (component == null) return; //Failed to load - val metaAnn = componentClass.getAnnotation(ComponentMetadata.class); + registerUnregisterComponent(plugin, component, false); + } + + public static void registerUnregisterComponent(JavaPlugin plugin, Component component, boolean register) { + val metaAnn = component.getClass().getAnnotation(ComponentMetadata.class); if (metaAnn != null) { Class[] dependencies = metaAnn.depends(); for (val dep : dependencies) { if (!components.containsKey(dep)) { - plugin.getLogger().warning("Failed to unregister component " + component.getClassName() + " as a required dependency is missing/disabled: " + dep.getSimpleName()); + plugin.getLogger().warning("Failed to " + (register ? "" : "un") + "register component " + component.getClassName() + " as a required dependency is missing/disabled: " + dep.getSimpleName()); return; } } } - component.unregister(plugin); - components.remove(componentClass); + if (register) { + component.plugin = plugin; + var compconf = plugin.getConfig().getConfigurationSection("components"); + if (compconf == null) compconf = plugin.getConfig().createSection("components"); + component.config = compconf.getConfigurationSection(component.getClassName()); + if (component.config == null) component.config = compconf.createSection(component.getClassName()); + component.register(plugin); + components.put(component.getClass(), component); + } else { + component.unregister(plugin); + components.remove(component.getClass()); + } } /** - * This is used to send a warning if there are registered components on shutdown.
+ * Registers a component checking it's dependencies and calling {@link #register(JavaPlugin)}.
+ * Make sure to register the dependencies first. * - * @return If there are any registered components + * @param component The component to register */ - public static boolean haveRegisteredComponents() { - return components.size() > 0; + public static void setComponentEnabled(Component component, boolean enabled) throws UnregisteredComponentException { + if (!components.containsKey(component.getClass())) + throw new UnregisteredComponentException(component); + if (component.enabled = enabled) + component.enable(); + else + component.disable(); + } + + /** + * Returns the currently registered components
+ * + * @return The currently registered components + */ + public static Map, Component> getComponents() { + return Collections.unmodifiableMap(components); } /** @@ -73,7 +149,7 @@ public abstract class Component { * * @param plugin Plugin class called to register commands and listeners */ - public abstract void register(JavaPlugin plugin); + protected abstract void register(JavaPlugin plugin); /** * Unregisters the module, when called by the JavaPlugin class. Do @@ -81,7 +157,21 @@ public abstract class Component { * * @param plugin Plugin class called to register commands and listeners */ - public abstract void unregister(JavaPlugin plugin); + protected abstract void unregister(JavaPlugin plugin); + + /** + * Enables the module, when called by the JavaPlugin class. Call + * registerCommand() and registerListener() within this method.
+ * To access the plugin, use {@link #getPlugin()}. + */ + protected abstract void enable(); + + /** + * Disables the module, when called by the JavaPlugin class. Do + * any cleanups needed within this method. + * To access the plugin, use {@link #getPlugin()}. + */ + protected abstract void disable(); /** * Registers a TBMCCommand to the plugin. Make sure to add it to plugin.yml and use {@link buttondevteam.lib.chat.CommandClass}. diff --git a/ButtonCore/src/main/java/buttondevteam/lib/architecture/ConfigData.java b/ButtonCore/src/main/java/buttondevteam/lib/architecture/ConfigData.java new file mode 100644 index 0000000..829ea2b --- /dev/null +++ b/ButtonCore/src/main/java/buttondevteam/lib/architecture/ConfigData.java @@ -0,0 +1,43 @@ +package buttondevteam.lib.architecture; + +import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.util.function.Function; + +/** + * Use the getter/setter constructor if {@link T} isn't a primitive type or String. + */ +@RequiredArgsConstructor +@AllArgsConstructor +public class ConfigData { //TODO: Save after a while + private final ConfigurationSection config; + private final String path; + private final T def; + /** + * The parameter is of a primitive type as returned by {@link YamlConfiguration#get(String)} + */ + private Function getter; + /** + * The result should be a primitive type or string that can be retrieved correctly later + */ + private Function setter; + + @SuppressWarnings("unchecked") + public T get() { + Object val = config.get(path, def); + if (getter != null) + return getter.apply(val); + return (T) val; + } + + public void set(T value) { + Object val; + if (setter != null) + val = setter.apply(value); + else val = value; + config.set(path, val); + } +} diff --git a/ButtonCore/src/main/java/buttondevteam/lib/architecture/exceptions/UnregisteredComponentException.java b/ButtonCore/src/main/java/buttondevteam/lib/architecture/exceptions/UnregisteredComponentException.java new file mode 100644 index 0000000..e86c302 --- /dev/null +++ b/ButtonCore/src/main/java/buttondevteam/lib/architecture/exceptions/UnregisteredComponentException.java @@ -0,0 +1,10 @@ +package buttondevteam.lib.architecture.exceptions; + +import buttondevteam.lib.architecture.Component; + +public class UnregisteredComponentException extends Throwable { + + public UnregisteredComponentException(Component component) { + super("The component '" + component.getClass().getSimpleName() + "' isn't registered!"); + } +} From 81cb364ddcaaf256479236ecfaa2dad47cf2316c Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sun, 18 Nov 2018 02:58:26 +0100 Subject: [PATCH 04/11] Fixes, should be ready to merge --- ButtonCore/lombok.config | 1 + ButtonCore/pom.xml | 8 ++++++++ .../component/commands/CommandComponent.java | 5 ++--- .../component/restart/RestartComponent.java | 11 +++++------ .../updater/PluginUpdaterComponent.java | 7 +++---- .../java/buttondevteam/core/MainPlugin.java | 5 +++++ .../lib/architecture/Component.java | 19 +++++++++++-------- ButtonProcessor/pom.xml | 8 ++++++++ 8 files changed, 43 insertions(+), 21 deletions(-) create mode 100644 ButtonCore/lombok.config diff --git a/ButtonCore/lombok.config b/ButtonCore/lombok.config new file mode 100644 index 0000000..d959b09 --- /dev/null +++ b/ButtonCore/lombok.config @@ -0,0 +1 @@ +lombok.var.flagUsage = ALLOW diff --git a/ButtonCore/pom.xml b/ButtonCore/pom.xml index 3750f03..2ae8ac3 100755 --- a/ButtonCore/pom.xml +++ b/ButtonCore/pom.xml @@ -72,6 +72,14 @@ + + org.apache.maven.plugins + maven-surefire-plugin + + false + + + diff --git a/ButtonCore/src/main/java/buttondevteam/component/commands/CommandComponent.java b/ButtonCore/src/main/java/buttondevteam/component/commands/CommandComponent.java index b3f1059..b85ad34 100644 --- a/ButtonCore/src/main/java/buttondevteam/component/commands/CommandComponent.java +++ b/ButtonCore/src/main/java/buttondevteam/component/commands/CommandComponent.java @@ -1,16 +1,15 @@ package buttondevteam.component.commands; import buttondevteam.lib.architecture.Component; -import org.bukkit.plugin.java.JavaPlugin; public class CommandComponent extends Component { //TODO: Do we just move everything here? @Override - public void register(JavaPlugin plugin) { + public void enable() { } @Override - public void unregister(JavaPlugin plugin) { + public void disable() { } } diff --git a/ButtonCore/src/main/java/buttondevteam/component/restart/RestartComponent.java b/ButtonCore/src/main/java/buttondevteam/component/restart/RestartComponent.java index 3061824..8184b8a 100644 --- a/ButtonCore/src/main/java/buttondevteam/component/restart/RestartComponent.java +++ b/ButtonCore/src/main/java/buttondevteam/component/restart/RestartComponent.java @@ -4,18 +4,17 @@ import buttondevteam.core.PrimeRestartCommand; import buttondevteam.core.ScheduledRestartCommand; import buttondevteam.lib.architecture.Component; import buttondevteam.lib.chat.TBMCChatAPI; -import org.bukkit.plugin.java.JavaPlugin; public class RestartComponent extends Component { @Override - public void register(JavaPlugin plugin) { - //TODO: Separately (dis)allow commands - TBMCChatAPI.AddCommand(plugin, ScheduledRestartCommand.class); - TBMCChatAPI.AddCommand(plugin, PrimeRestartCommand.class); + public void enable() { + //TODO: Permissions for the commands + TBMCChatAPI.AddCommand(getPlugin(), ScheduledRestartCommand.class); + TBMCChatAPI.AddCommand(getPlugin(), PrimeRestartCommand.class); } @Override - public void unregister(JavaPlugin plugin) { + public void disable() { } } diff --git a/ButtonCore/src/main/java/buttondevteam/component/updater/PluginUpdaterComponent.java b/ButtonCore/src/main/java/buttondevteam/component/updater/PluginUpdaterComponent.java index 1427927..2425631 100644 --- a/ButtonCore/src/main/java/buttondevteam/component/updater/PluginUpdaterComponent.java +++ b/ButtonCore/src/main/java/buttondevteam/component/updater/PluginUpdaterComponent.java @@ -2,16 +2,15 @@ package buttondevteam.component.updater; import buttondevteam.lib.architecture.Component; import buttondevteam.lib.chat.TBMCChatAPI; -import org.bukkit.plugin.java.JavaPlugin; public class PluginUpdaterComponent extends Component { @Override - public void register(JavaPlugin plugin) { - TBMCChatAPI.AddCommand(plugin, UpdatePluginCommand.class); + public void enable() { + TBMCChatAPI.AddCommand(getPlugin(), UpdatePluginCommand.class); } @Override - public void unregister(JavaPlugin plugin) { + public void disable() { //TODO: Unregister commands and such } } diff --git a/ButtonCore/src/main/java/buttondevteam/core/MainPlugin.java b/ButtonCore/src/main/java/buttondevteam/core/MainPlugin.java index ec130f1..9de7993 100755 --- a/ButtonCore/src/main/java/buttondevteam/core/MainPlugin.java +++ b/ButtonCore/src/main/java/buttondevteam/core/MainPlugin.java @@ -1,7 +1,10 @@ package buttondevteam.core; +import buttondevteam.component.restart.RestartComponent; import buttondevteam.component.updater.PluginUpdater; +import buttondevteam.component.updater.PluginUpdaterComponent; import buttondevteam.lib.TBMCCoreAPI; +import buttondevteam.lib.architecture.Component; import buttondevteam.lib.chat.Channel; import buttondevteam.lib.chat.ChatRoom; import buttondevteam.lib.chat.Color; @@ -40,6 +43,8 @@ public class MainPlugin extends JavaPlugin { setupPermissions(); Test = getConfig().getBoolean("test", true); saveConfig(); + Component.registerComponent(this, new PluginUpdaterComponent()); + Component.registerComponent(this, new RestartComponent()); ComponentManager.enableComponents(); TBMCCoreAPI.RegisterEventsForExceptions(new PlayerListener(), this); TBMCCoreAPI.RegisterUserClass(TBMCPlayerBase.class); diff --git a/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java b/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java index d59cbd9..faeb6a8 100644 --- a/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java @@ -144,20 +144,23 @@ public abstract class Component { } /** - * Registers the module, when called by the JavaPlugin class. Call - * registerCommand() and registerListener() within this method. + * Registers the module, when called by the JavaPlugin class. + * This gets fired when the plugin is enabled. Use {@link #enable()} to register commands and such. * - * @param plugin Plugin class called to register commands and listeners + * @param plugin Plugin object */ - protected abstract void register(JavaPlugin plugin); + protected void register(JavaPlugin plugin) { + } /** - * Unregisters the module, when called by the JavaPlugin class. Do - * any cleanups needed within this method. + * Unregisters the module, when called by the JavaPlugin class. + * This gets fired when the plugin is disabled. + * Do any cleanups needed within this method. * - * @param plugin Plugin class called to register commands and listeners + * @param plugin Plugin object */ - protected abstract void unregister(JavaPlugin plugin); + protected void unregister(JavaPlugin plugin) { + } /** * Enables the module, when called by the JavaPlugin class. Call diff --git a/ButtonProcessor/pom.xml b/ButtonProcessor/pom.xml index 6a14248..a4ce7fa 100755 --- a/ButtonProcessor/pom.xml +++ b/ButtonProcessor/pom.xml @@ -23,6 +23,14 @@ -proc:none + + org.apache.maven.plugins + maven-surefire-plugin + + false + + + From f8a850df761c615550ee6e6625c94203487e493f Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Thu, 22 Nov 2018 00:46:52 +0100 Subject: [PATCH 05/11] Fixes: Origins --- ...s_ButtonCore_Towny_master_v1_0_g8d3b6b6_296.xml | 13 ------------- ...ithub_milkbowl_VaultAPI_master_c8cb88f27a_1.xml | 13 ------------- .../main/java/buttondevteam/lib/TBMCChatEvent.java | 14 ++++---------- .../java/buttondevteam/lib/chat/ChatMessage.java | 7 ++++--- .../java/buttondevteam/lib/chat/TBMCChatAPI.java | 2 +- .../java/buttondevteam/lib/player/UserClass.java | 2 +- 6 files changed, 10 insertions(+), 41 deletions(-) delete mode 100644 .idea/libraries/Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_v1_0_g8d3b6b6_296.xml delete mode 100644 .idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_c8cb88f27a_1.xml diff --git a/.idea/libraries/Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_v1_0_g8d3b6b6_296.xml b/.idea/libraries/Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_v1_0_g8d3b6b6_296.xml deleted file mode 100644 index 8991a67..0000000 --- a/.idea/libraries/Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_v1_0_g8d3b6b6_296.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_c8cb88f27a_1.xml b/.idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_c8cb88f27a_1.xml deleted file mode 100644 index b5aaa43..0000000 --- a/.idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_c8cb88f27a_1.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/ButtonCore/src/main/java/buttondevteam/lib/TBMCChatEvent.java b/ButtonCore/src/main/java/buttondevteam/lib/TBMCChatEvent.java index 3c44345..2b2ecbf 100755 --- a/ButtonCore/src/main/java/buttondevteam/lib/TBMCChatEvent.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/TBMCChatEvent.java @@ -16,20 +16,13 @@ import javax.annotation.Nullable; */ @Getter public class TBMCChatEvent extends TBMCChatEventBase { - public TBMCChatEvent(CommandSender sender, ChromaGamerBase user, Channel channel, String message, int score, boolean fromcmd, String groupid) { - super(channel, message, score, groupid); - this.sender = sender; - this.fromcmd = fromcmd; - this.ignoreSenderPermissions = false; - this.user = user; - } - - public TBMCChatEvent(CommandSender sender, ChromaGamerBase user, Channel channel, String message, int score, boolean fromcmd, String groupid, boolean ignoreSenderPermissions) { + public TBMCChatEvent(CommandSender sender, ChromaGamerBase user, Channel channel, String message, int score, boolean fromcmd, String groupid, boolean ignoreSenderPermissions, String origin) { super(channel, message, score, groupid); this.sender = sender; this.user = user; this.fromcmd = fromcmd; this.ignoreSenderPermissions = ignoreSenderPermissions; + this.origin = origin; } private static final HandlerList handlers = new HandlerList(); @@ -37,7 +30,8 @@ public class TBMCChatEvent extends TBMCChatEventBase { private final CommandSender sender; private final boolean fromcmd; private final boolean ignoreSenderPermissions; - private final ChromaGamerBase user; + private final ChromaGamerBase user; + private final String origin; // TODO: Message object with data? /** diff --git a/ButtonCore/src/main/java/buttondevteam/lib/chat/ChatMessage.java b/ButtonCore/src/main/java/buttondevteam/lib/chat/ChatMessage.java index ff5528b..4ce179a 100644 --- a/ButtonCore/src/main/java/buttondevteam/lib/chat/ChatMessage.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/chat/ChatMessage.java @@ -30,7 +30,8 @@ public class ChatMessage { */ private CommandSender permCheck; /** - * The origin of the message, "minecraft" or "discord" for example. + * The origin of the message, "Minecraft" or "Discord" for example. May be displayed to the user.
+ * This is the user class capitalized folder name. */ private final String origin; @@ -39,7 +40,7 @@ public class ChatMessage { } @NonNull - public static ChatMessageBuilder builder(Channel channel, CommandSender sender, ChromaGamerBase user, String message) { - return builder().sender(sender).user(user).message(message); + public static ChatMessageBuilder builder(CommandSender sender, ChromaGamerBase user, String message) { + return builder().sender(sender).user(user).message(message).origin(user.getFolder().substring(0, 1).toUpperCase() + user.getFolder().substring(1)); } } diff --git a/ButtonCore/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java b/ButtonCore/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java index 995d48e..4cb7894 100755 --- a/ButtonCore/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java @@ -238,7 +238,7 @@ public class TBMCChatAPI { if (eventPre.isCancelled()) return true; TBMCChatEvent event; - event = new TBMCChatEvent(cm.getSender(), cm.getUser(), channel, eventPre.getMessage(), score, cm.isFromCommand(), rtr.groupID, permcheck != cm.getSender()); + event = new TBMCChatEvent(cm.getSender(), cm.getUser(), channel, eventPre.getMessage(), score, cm.isFromCommand(), rtr.groupID, permcheck != cm.getSender(), cm.getOrigin()); Bukkit.getPluginManager().callEvent(event); return event.isCancelled(); } diff --git a/ButtonCore/src/main/java/buttondevteam/lib/player/UserClass.java b/ButtonCore/src/main/java/buttondevteam/lib/player/UserClass.java index 9abfce6..0e375aa 100755 --- a/ButtonCore/src/main/java/buttondevteam/lib/player/UserClass.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/player/UserClass.java @@ -13,7 +13,7 @@ import java.lang.annotation.*; @Inherited public @interface UserClass { /** - * Indicates which folder should the player files be saved in. + * Indicates which folder should the player files be saved in. Must be lowercase. */ String foldername(); } From 9b097b7858c20f5917a2b27eadb6acfc498cf36f Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Fri, 14 Dec 2018 23:48:46 +0100 Subject: [PATCH 06/11] IsEnabled && enabling late components Also finally added the source plugin --- ButtonCore/pom.xml | 12 ++++++++++ .../buttondevteam/core/ComponentManager.java | 24 ++++++++++++++++++- .../lib/architecture/Component.java | 14 ++++++++++- 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/ButtonCore/pom.xml b/ButtonCore/pom.xml index 2ae8ac3..2bbce2d 100755 --- a/ButtonCore/pom.xml +++ b/ButtonCore/pom.xml @@ -80,6 +80,18 @@ + + org.apache.maven.plugins + maven-source-plugin + + + attach-sources + + jar + + + + diff --git a/ButtonCore/src/main/java/buttondevteam/core/ComponentManager.java b/ButtonCore/src/main/java/buttondevteam/core/ComponentManager.java index 023dee4..4e7b37d 100644 --- a/ButtonCore/src/main/java/buttondevteam/core/ComponentManager.java +++ b/ButtonCore/src/main/java/buttondevteam/core/ComponentManager.java @@ -2,12 +2,21 @@ package buttondevteam.core; import buttondevteam.lib.architecture.Component; import buttondevteam.lib.architecture.exceptions.UnregisteredComponentException; +import lombok.val; public final class ComponentManager { private ComponentManager() {} + private static boolean componentsEnabled = false; + /** - * Enables components based on a configuration + * This flag is used to enable components registered after the others were enabled. + * @return Whether already registered components have been enabled + */ + public static boolean areComponentsEnabled() { return componentsEnabled; } + + /** + * Enables components based on a configuration - any component registered afterwards will be also enabled */ public static void enableComponents() { //Component.getComponents().values().stream().filter(c->cs.getConfigurationSection(c.getClass().getSimpleName()).getBoolean("enabled")).forEach(c-> { @@ -17,6 +26,7 @@ public final class ComponentManager { } catch (UnregisteredComponentException ignored) { //This *should* never happen } }); + componentsEnabled = true; } /** @@ -29,5 +39,17 @@ public final class ComponentManager { } catch (UnregisteredComponentException ignored) { //This *should* never happen } }); + componentsEnabled = false; + } + + /** + * Will also return false if the component is not registered. + * + * @param cl The component class + * @return Whether the component is registered and enabled + */ + public static boolean isEnabled(Class cl) { + val c = Component.getComponents().get(cl); + return c != null && c.isEnabled(); } } diff --git a/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java b/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java index faeb6a8..4b9219c 100644 --- a/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java @@ -1,5 +1,6 @@ package buttondevteam.lib.architecture; +import buttondevteam.core.ComponentManager; import buttondevteam.lib.TBMCCoreAPI; import buttondevteam.lib.architecture.exceptions.UnregisteredComponentException; import buttondevteam.lib.chat.TBMCChatAPI; @@ -73,7 +74,8 @@ public abstract class Component { /** * Registers a component checking it's dependencies and calling {@link #register(JavaPlugin)}.
- * Make sure to register the dependencies first. + * Make sure to register the dependencies first.
+ * The component will be enabled automatically, regardless of when it was registered. * * @param component The component to register */ @@ -113,7 +115,17 @@ public abstract class Component { if (component.config == null) component.config = compconf.createSection(component.getClassName()); component.register(plugin); components.put(component.getClass(), component); + if (ComponentManager.areComponentsEnabled() && component.shouldBeEnabled().get()) { + try { //Enable components registered after the previous ones getting enabled + setComponentEnabled(component, true); + } catch (UnregisteredComponentException ignored) { + } + } } else { + if (component.enabled) { + component.disable(); + component.enabled = false; + } component.unregister(plugin); components.remove(component.getClass()); } From a417d0ea3fb32e9fbca235918867abb9be5508ea Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Tue, 18 Dec 2018 00:47:00 +0100 Subject: [PATCH 07/11] Plugin configs, ButtonPlugin Using the same thing for config as components --- .../lib/architecture/ButtonPlugin.java | 52 +++++++++++++++++++ .../lib/architecture/Component.java | 35 ++----------- .../lib/architecture/ConfigData.java | 8 +-- .../lib/architecture/IHaveConfig.java | 45 ++++++++++++++++ .../java/buttondevteam/lib/chat/Channel.java | 27 ++++++---- .../java/buttondevteam/lib/chat/ChatRoom.java | 4 +- .../buttondevteam/lib/chat/TBMCChatAPI.java | 22 ++++---- 7 files changed, 133 insertions(+), 60 deletions(-) create mode 100644 ButtonCore/src/main/java/buttondevteam/lib/architecture/ButtonPlugin.java create mode 100644 ButtonCore/src/main/java/buttondevteam/lib/architecture/IHaveConfig.java diff --git a/ButtonCore/src/main/java/buttondevteam/lib/architecture/ButtonPlugin.java b/ButtonCore/src/main/java/buttondevteam/lib/architecture/ButtonPlugin.java new file mode 100644 index 0000000..ff777d3 --- /dev/null +++ b/ButtonCore/src/main/java/buttondevteam/lib/architecture/ButtonPlugin.java @@ -0,0 +1,52 @@ +package buttondevteam.lib.architecture; + +import buttondevteam.lib.TBMCCoreAPI; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.plugin.java.JavaPlugin; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +public abstract class ButtonPlugin extends JavaPlugin { + private HashMap> datamap = new HashMap<>(); + private ConfigurationSection section; + + protected abstract void pluginEnable(); + + protected abstract void pluginDisable(); + + @Override + public void onEnable() { + section = getConfig().getConfigurationSection("global"); + if (section == null) getConfig().createSection("global"); + try { + pluginEnable(); + } catch (Exception e) { + TBMCCoreAPI.SendException("Error while enabling plugin " + getName() + "!", e); + } + } + + @Override + public void onDisable() { + try { + pluginDisable(); + } catch (Exception e) { + TBMCCoreAPI.SendException("Error while disabling plugin " + getName() + "!", e); + } + } + + /** + * @see IHaveConfig#getData(Map, ConfigurationSection, String, Object) + */ + protected ConfigData getData(String path, T def) { + return IHaveConfig.getData(datamap, section, path, def); + } + + /** + * @see IHaveConfig#getData(Map, ConfigurationSection, String, Object, Function, Function) + */ + protected ConfigData getData(String path, T def, Function getter, Function setter) { + return IHaveConfig.getData(datamap, section, path, def, getter, setter); + } +} diff --git a/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java b/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java index 4b9219c..57a98d5 100644 --- a/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java @@ -11,7 +11,6 @@ import lombok.NonNull; import lombok.experimental.var; import lombok.val; import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.event.Listener; import org.bukkit.plugin.java.JavaPlugin; @@ -41,35 +40,17 @@ public abstract class Component { private HashMap> datamap = new HashMap<>(); /** - * This method overload should only be used with primitves or String. - * - * @param path The path in config to use - * @param def The value to use by default - * @param The type of this variable (only use primitives or String) - * @return The data object that can be used to get or set the value + * @see IHaveConfig#getData(Map, ConfigurationSection, String, Object) */ - @SuppressWarnings("unchecked") protected ConfigData getData(String path, T def) { - ConfigData data = datamap.get(path); - if (data == null) datamap.put(path, data = new ConfigData<>(config, path, def)); - return (ConfigData) data; + return IHaveConfig.getData(datamap, config, path, def); } /** - * This method overload may be used with any class. - * - * @param path The path in config to use - * @param def The value to use by default - * @param getter A function that converts a primitive representation to the correct value - * @param setter A function that converts a value to a primitive representation - * @param The type of this variable (can be any class) - * @return The data object that can be used to get or set the value + * @see IHaveConfig#getData(Map, ConfigurationSection, String, Object, Function, Function) */ - @SuppressWarnings("unchecked") protected ConfigData getData(String path, T def, Function getter, Function setter) { - ConfigData data = datamap.get(path); - if (data == null) datamap.put(path, data = new ConfigData<>(config, path, def, getter, setter)); - return (ConfigData) data; + return IHaveConfig.getData(datamap, config, path, def, getter, setter); } /** @@ -210,14 +191,6 @@ public abstract class Component { return listener; } - public void saveData(FileConfiguration config, String pathToData, Object data) { - config.set("moduledata." + this.getClassName() + "." + pathToData, data); - } - - public Object getData(FileConfiguration config, String pathToData, Object data) { - return config.get("moduledata." + this.getClassName() + "." + pathToData, data); - } - private String getClassName() { Class enclosingClass = getClass().getEnclosingClass(); String className; diff --git a/ButtonCore/src/main/java/buttondevteam/lib/architecture/ConfigData.java b/ButtonCore/src/main/java/buttondevteam/lib/architecture/ConfigData.java index 829ea2b..1d833f4 100644 --- a/ButtonCore/src/main/java/buttondevteam/lib/architecture/ConfigData.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/architecture/ConfigData.java @@ -1,5 +1,6 @@ package buttondevteam.lib.architecture; +import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.RequiredArgsConstructor; import org.bukkit.configuration.ConfigurationSection; @@ -8,10 +9,11 @@ import org.bukkit.configuration.file.YamlConfiguration; import java.util.function.Function; /** - * Use the getter/setter constructor if {@link T} isn't a primitive type or String. + * Use the getter/setter constructor if {@link T} isn't a primitive type or String.
+ * Use {@link Component#getData(String, Object)} or {@link ButtonPlugin#getData(String, Object)} to get an instance. */ -@RequiredArgsConstructor -@AllArgsConstructor +@RequiredArgsConstructor(access = AccessLevel.PACKAGE) +@AllArgsConstructor(access = AccessLevel.PACKAGE) public class ConfigData { //TODO: Save after a while private final ConfigurationSection config; private final String path; diff --git a/ButtonCore/src/main/java/buttondevteam/lib/architecture/IHaveConfig.java b/ButtonCore/src/main/java/buttondevteam/lib/architecture/IHaveConfig.java new file mode 100644 index 0000000..77ad752 --- /dev/null +++ b/ButtonCore/src/main/java/buttondevteam/lib/architecture/IHaveConfig.java @@ -0,0 +1,45 @@ +package buttondevteam.lib.architecture; + +import org.bukkit.configuration.ConfigurationSection; + +import java.util.Map; +import java.util.function.Function; + +/** + * Members of this interface should be protected (access level) + */ +final class IHaveConfig { + private IHaveConfig() {} + + /** + * This method overload should only be used with primitves or String. + * + * @param path The path in config to use + * @param def The value to use by default + * @param The type of this variable (only use primitives or String) + * @return The data object that can be used to get or set the value + */ + @SuppressWarnings("unchecked") + protected static ConfigData getData(Map> datamap, ConfigurationSection config, String path, T def) { + ConfigData data = datamap.get(path); + if (data == null) datamap.put(path, data = new ConfigData<>(config, path, def)); + return (ConfigData) data; + } + + /** + * This method overload may be used with any class. + * + * @param path The path in config to use + * @param def The value to use by default + * @param getter A function that converts a primitive representation to the correct value + * @param setter A function that converts a value to a primitive representation + * @param The type of this variable (can be any class) + * @return The data object that can be used to get or set the value + */ + @SuppressWarnings("unchecked") + protected static ConfigData getData(Map> datamap, ConfigurationSection config, String path, T def, Function getter, Function setter) { + ConfigData data = datamap.get(path); + if (data == null) datamap.put(path, data = new ConfigData<>(config, path, def, getter, setter)); + return (ConfigData) data; + } +} diff --git a/ButtonCore/src/main/java/buttondevteam/lib/chat/Channel.java b/ButtonCore/src/main/java/buttondevteam/lib/chat/Channel.java index c18c557..bddc0f3 100755 --- a/ButtonCore/src/main/java/buttondevteam/lib/chat/Channel.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/chat/Channel.java @@ -34,7 +34,7 @@ public class Channel { /** * Filters both the sender and the targets */ - public final Function filteranderrormsg; + private final Function filteranderrormsg; private static final List channels = new ArrayList<>(); @@ -87,10 +87,7 @@ public class Channel { * Note: Errors are sent to the sender automatically */ public int getMCScore(CommandSender sender) { - if (filteranderrormsg == null) - return SCORE_SEND_OK; - RecipientTestResult result = filteranderrormsg.apply(sender); - return result.errormessage == null ? result.score : SCORE_SEND_NOPE; + return getRTR(sender).score; //No need to check if there was an error } /** @@ -100,10 +97,13 @@ public class Channel { */ @Nullable public String getGroupID(CommandSender sender) { + return getRTR(sender).groupID; //No need to check if there was an error + } + + public RecipientTestResult getRTR(CommandSender sender) { if (filteranderrormsg == null) - return GROUP_EVERYONE; - RecipientTestResult result = filteranderrormsg.apply(sender); - return result.errormessage == null ? result.groupID : null; + return new RecipientTestResult(SCORE_SEND_OK, GROUP_EVERYONE); + return filteranderrormsg.apply(sender); } public static List getChannels() { @@ -143,9 +143,10 @@ public class Channel { } public static class RecipientTestResult { - public String errormessage = null; - public int score = SCORE_SEND_NOPE; // Anything below 0 is "never send" - public String groupID = null; + public final String errormessage; + public final int score; // Anything below 0 is "never send" + public final String groupID; + public static final RecipientTestResult ALL = new RecipientTestResult(SCORE_SEND_OK, GROUP_EVERYONE); /** * Creates a result that indicates an error @@ -154,6 +155,8 @@ public class Channel { */ public RecipientTestResult(String errormessage) { this.errormessage = errormessage; + this.score = SCORE_SEND_NOPE; + this.groupID = null; } /** @@ -163,8 +166,10 @@ public class Channel { * @param groupID The ID of the target group. */ public RecipientTestResult(int score, String groupID) { + if (score < 0) throw new IllegalArgumentException("Score must be non-negative!"); this.score = score; this.groupID = groupID; + this.errormessage = null; } } } diff --git a/ButtonCore/src/main/java/buttondevteam/lib/chat/ChatRoom.java b/ButtonCore/src/main/java/buttondevteam/lib/chat/ChatRoom.java index 8a1e75d..9819d7c 100755 --- a/ButtonCore/src/main/java/buttondevteam/lib/chat/ChatRoom.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/chat/ChatRoom.java @@ -15,11 +15,11 @@ public class ChatRoom extends Channel { public void joinRoom(CommandSender sender) { usersInRoom.add(sender); - TBMCChatAPI.SendSystemMessage(this, 0, "everyone", sender.getName() + " joined the room"); + TBMCChatAPI.SendSystemMessage(this, RecipientTestResult.ALL, sender.getName() + " joined the room"); } public void leaveRoom(CommandSender sender) { usersInRoom.remove(sender); - TBMCChatAPI.SendSystemMessage(this, 0, "everyone", sender.getName() + " left the room"); + TBMCChatAPI.SendSystemMessage(this, RecipientTestResult.ALL, sender.getName() + " left the room"); } } diff --git a/ButtonCore/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java b/ButtonCore/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java index 4cb7894..d5cddef 100755 --- a/ButtonCore/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java @@ -231,7 +231,7 @@ public class TBMCChatAPI { val permcheck = cm.getPermCheck() == null ? cm.getSender() : cm.getPermCheck(); RecipientTestResult rtr = getScoreOrSendError(channel, permcheck); int score = rtr.score; - if (score == -1 || rtr.groupID == null) + if (score == Channel.SCORE_SEND_NOPE || rtr.groupID == null) return true; TBMCChatPreprocessEvent eventPre = new TBMCChatPreprocessEvent(cm.getSender(), channel, cm.getMessage()); Bukkit.getPluginManager().callEvent(eventPre); @@ -248,29 +248,25 @@ public class TBMCChatAPI { * * @param channel * The channel to send to - * @param score - * The score to use to find the group - use 0 if the channel doesn't have scores + * @param rtr + * The score&group to use to find the group - use {@link RecipientTestResult#ALL} if the channel doesn't have scores * @param message * The message to send * @return The event cancelled state */ - public static boolean SendSystemMessage(Channel channel, int score, String groupid, String message) { + public static boolean SendSystemMessage(Channel channel, RecipientTestResult rtr, String message) { if (!Channel.getChannels().contains(channel)) throw new RuntimeException("Channel " + channel.DisplayName + " not registered!"); - TBMCSystemChatEvent event = new TBMCSystemChatEvent(channel, message, score, groupid); + TBMCSystemChatEvent event = new TBMCSystemChatEvent(channel, message, rtr.score, rtr.groupID); Bukkit.getPluginManager().callEvent(event); return event.isCancelled(); } private static RecipientTestResult getScoreOrSendError(Channel channel, CommandSender sender) { - if (channel.filteranderrormsg == null) - return new RecipientTestResult(0, "everyone"); - else { - RecipientTestResult result = channel.filteranderrormsg.apply(sender); - if (result.errormessage != null) - sender.sendMessage("§c" + result.errormessage); - return result; - } + RecipientTestResult result = channel.getRTR(sender); + if (result.errormessage != null) + sender.sendMessage("§c" + result.errormessage); + return result; } /** From dbce36cd4ea82bee65fcc13f5f250ce3b9657e5c Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sun, 23 Dec 2018 03:22:21 +0100 Subject: [PATCH 08/11] PlayerData ann + ConfigData def add --- BuildConfigUpdater/BuildConfigUpdater.iml | 1 - .../java/buttondevteam/lib/architecture/ConfigData.java | 7 +++++-- .../java/buttondevteam/lib/player/ChromaGamerBase.java | 2 ++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/BuildConfigUpdater/BuildConfigUpdater.iml b/BuildConfigUpdater/BuildConfigUpdater.iml index 4902d56..73696cd 100644 --- a/BuildConfigUpdater/BuildConfigUpdater.iml +++ b/BuildConfigUpdater/BuildConfigUpdater.iml @@ -12,7 +12,6 @@ - diff --git a/ButtonCore/src/main/java/buttondevteam/lib/architecture/ConfigData.java b/ButtonCore/src/main/java/buttondevteam/lib/architecture/ConfigData.java index 1d833f4..b023664 100644 --- a/ButtonCore/src/main/java/buttondevteam/lib/architecture/ConfigData.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/architecture/ConfigData.java @@ -30,8 +30,11 @@ public class ConfigData { //TODO: Save after a while @SuppressWarnings("unchecked") public T get() { Object val = config.get(path, def); - if (getter != null) - return getter.apply(val); + if (getter != null) { + T hmm = getter.apply(val); + if (hmm == null) hmm = def; //Set if the getter returned null + return hmm; + } return (T) val; } diff --git a/ButtonCore/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java b/ButtonCore/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java index 3ab07b6..9d0a3a4 100755 --- a/ButtonCore/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java @@ -8,6 +8,7 @@ import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; +import javax.annotation.Nullable; import java.io.File; import java.util.ArrayList; import java.util.HashMap; @@ -203,6 +204,7 @@ public abstract class ChromaGamerBase implements AutoCloseable { * @return The player as a {@link T} object or null if not having an account there */ @SuppressWarnings("unchecked") + @Nullable public T getAs(Class cl) { // TODO: Provide a way to use TBMCPlayerBase's loaded players if (cl.getSimpleName().equals(getClass().getSimpleName())) return (T) this; From df5befe1d91019864978fc2fdca9d0305acad0e2 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Mon, 24 Dec 2018 00:08:32 +0100 Subject: [PATCH 09/11] Fixed plugin config error --- .idea/modules.xml | 1 + .../java/buttondevteam/lib/architecture/ButtonPlugin.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.idea/modules.xml b/.idea/modules.xml index 0b24af5..fc07820 100755 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -4,6 +4,7 @@ + diff --git a/ButtonCore/src/main/java/buttondevteam/lib/architecture/ButtonPlugin.java b/ButtonCore/src/main/java/buttondevteam/lib/architecture/ButtonPlugin.java index ff777d3..c37a529 100644 --- a/ButtonCore/src/main/java/buttondevteam/lib/architecture/ButtonPlugin.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/architecture/ButtonPlugin.java @@ -9,7 +9,7 @@ import java.util.Map; import java.util.function.Function; public abstract class ButtonPlugin extends JavaPlugin { - private HashMap> datamap = new HashMap<>(); + private final HashMap> datamap = new HashMap<>(); private ConfigurationSection section; protected abstract void pluginEnable(); @@ -19,7 +19,7 @@ public abstract class ButtonPlugin extends JavaPlugin { @Override public void onEnable() { section = getConfig().getConfigurationSection("global"); - if (section == null) getConfig().createSection("global"); + if (section == null) section = getConfig().createSection("global"); try { pluginEnable(); } catch (Exception e) { From ff246b8c8b6ac63a5c507568710fbdf04514cfe7 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Thu, 27 Dec 2018 01:16:09 +0100 Subject: [PATCH 10/11] Using the ChatMessage for the event too Forgot to commit this lol --- .../java/buttondevteam/lib/TBMCChatEvent.java | 30 +++++++++---------- .../buttondevteam/lib/chat/ChatMessage.java | 13 +++++++- .../buttondevteam/lib/chat/TBMCChatAPI.java | 5 ++-- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/ButtonCore/src/main/java/buttondevteam/lib/TBMCChatEvent.java b/ButtonCore/src/main/java/buttondevteam/lib/TBMCChatEvent.java index 2b2ecbf..f304cde 100755 --- a/ButtonCore/src/main/java/buttondevteam/lib/TBMCChatEvent.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/TBMCChatEvent.java @@ -1,8 +1,9 @@ package buttondevteam.lib; import buttondevteam.lib.chat.Channel; -import buttondevteam.lib.player.ChromaGamerBase; +import buttondevteam.lib.chat.ChatMessage; import lombok.Getter; +import lombok.experimental.Delegate; import org.bukkit.command.CommandSender; import org.bukkit.event.HandlerList; @@ -16,22 +17,19 @@ import javax.annotation.Nullable; */ @Getter public class TBMCChatEvent extends TBMCChatEventBase { - public TBMCChatEvent(CommandSender sender, ChromaGamerBase user, Channel channel, String message, int score, boolean fromcmd, String groupid, boolean ignoreSenderPermissions, String origin) { - super(channel, message, score, groupid); - this.sender = sender; - this.user = user; - this.fromcmd = fromcmd; - this.ignoreSenderPermissions = ignoreSenderPermissions; - this.origin = origin; + public TBMCChatEvent(Channel channel, ChatMessage cm, Channel.RecipientTestResult rtr) { + super(channel, cm.getMessage(), rtr.score, rtr.groupID); + this.cm = cm; } private static final HandlerList handlers = new HandlerList(); - private final CommandSender sender; - private final boolean fromcmd; - private final boolean ignoreSenderPermissions; - private final ChromaGamerBase user; - private final String origin; + @Delegate //<-- Backwards compatibility + private ChatMessage cm; + + private boolean isIgnoreSenderPermissions() { + return cm.getPermCheck() != cm.getSender(); + } // TODO: Message object with data? /** @@ -39,7 +37,7 @@ public class TBMCChatEvent extends TBMCChatEventBase { */ @Override public boolean shouldSendTo(CommandSender sender) { - if (isIgnoreSenderPermissions() && sender.equals(this.sender)) + if (isIgnoreSenderPermissions() && sender.equals(this.cm.getSender())) return true; //Allow sending the message no matter what return super.shouldSendTo(sender); } @@ -49,7 +47,7 @@ public class TBMCChatEvent extends TBMCChatEventBase { */ @Override public int getMCScore(CommandSender sender) { - if (isIgnoreSenderPermissions() && sender.equals(this.sender)) + if (isIgnoreSenderPermissions() && sender.equals(this.cm.getSender())) return getScore(); //Send in the correct group no matter what return super.getMCScore(sender); } @@ -60,7 +58,7 @@ public class TBMCChatEvent extends TBMCChatEventBase { @Nullable @Override public String getGroupID(CommandSender sender) { - if (isIgnoreSenderPermissions() && sender.equals(this.sender)) + if (isIgnoreSenderPermissions() && sender.equals(this.cm.getSender())) return getGroupID(); //Send in the correct group no matter what return super.getGroupID(sender); } diff --git a/ButtonCore/src/main/java/buttondevteam/lib/chat/ChatMessage.java b/ButtonCore/src/main/java/buttondevteam/lib/chat/ChatMessage.java index 4ce179a..8496cbc 100644 --- a/ButtonCore/src/main/java/buttondevteam/lib/chat/ChatMessage.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/chat/ChatMessage.java @@ -4,6 +4,7 @@ import buttondevteam.lib.player.ChromaGamerBase; import lombok.Builder; import lombok.Getter; import lombok.NonNull; +import lombok.Setter; import org.bukkit.command.CommandSender; @Builder @@ -20,7 +21,8 @@ public class ChatMessage { /** * The message to send as the user. */ - private final String message; + @Setter + private String message; /** * Indicates whether the message comes from running a command (like /tableflip). Implemented to be used from Discord. */ @@ -35,6 +37,15 @@ public class ChatMessage { */ private final String origin; + /** + * The sender which we should check for permissions. Same as {@link #sender} by default. + * + * @return The perm check or the sender + */ + public CommandSender getPermCheck() { + return permCheck == null ? sender : permCheck; + } + private static ChatMessageBuilder builder() { return new ChatMessageBuilder(); } diff --git a/ButtonCore/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java b/ButtonCore/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java index d5cddef..86d1f10 100755 --- a/ButtonCore/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java @@ -228,7 +228,7 @@ public class TBMCChatAPI { public static boolean SendChatMessage(ChatMessage cm, Channel channel) { if (!Channel.getChannels().contains(channel)) throw new RuntimeException("Channel " + channel.DisplayName + " not registered!"); - val permcheck = cm.getPermCheck() == null ? cm.getSender() : cm.getPermCheck(); + val permcheck = cm.getPermCheck(); RecipientTestResult rtr = getScoreOrSendError(channel, permcheck); int score = rtr.score; if (score == Channel.SCORE_SEND_NOPE || rtr.groupID == null) @@ -237,8 +237,9 @@ public class TBMCChatAPI { Bukkit.getPluginManager().callEvent(eventPre); if (eventPre.isCancelled()) return true; + cm.setMessage(eventPre.getMessage()); TBMCChatEvent event; - event = new TBMCChatEvent(cm.getSender(), cm.getUser(), channel, eventPre.getMessage(), score, cm.isFromCommand(), rtr.groupID, permcheck != cm.getSender(), cm.getOrigin()); + event = new TBMCChatEvent(channel, cm, rtr); Bukkit.getPluginManager().callEvent(event); return event.isCancelled(); } From 7f385df3b16d584cab0c0f9dbd14f1c94b806623 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Tue, 1 Jan 2019 03:26:43 +0100 Subject: [PATCH 11/11] Handle errors for the components --- .../buttondevteam/core/ComponentManager.java | 8 +- .../lib/architecture/Component.java | 83 +++++++++++-------- .../UnregisteredComponentException.java | 2 +- 3 files changed, 56 insertions(+), 37 deletions(-) diff --git a/ButtonCore/src/main/java/buttondevteam/core/ComponentManager.java b/ButtonCore/src/main/java/buttondevteam/core/ComponentManager.java index 4e7b37d..0c3c51b 100644 --- a/ButtonCore/src/main/java/buttondevteam/core/ComponentManager.java +++ b/ButtonCore/src/main/java/buttondevteam/core/ComponentManager.java @@ -1,7 +1,7 @@ package buttondevteam.core; +import buttondevteam.lib.TBMCCoreAPI; import buttondevteam.lib.architecture.Component; -import buttondevteam.lib.architecture.exceptions.UnregisteredComponentException; import lombok.val; public final class ComponentManager { @@ -23,7 +23,8 @@ public final class ComponentManager { Component.getComponents().values().stream().filter(c -> c.shouldBeEnabled().get()).forEach(c -> { try { Component.setComponentEnabled(c, true); - } catch (UnregisteredComponentException ignored) { //This *should* never happen + } catch (Exception e) { + TBMCCoreAPI.SendException("Failed to enable one of the components: " + c.getClass().getSimpleName(), e); } }); componentsEnabled = true; @@ -36,7 +37,8 @@ public final class ComponentManager { Component.getComponents().values().stream().filter(Component::isEnabled).forEach(c -> { try { Component.setComponentEnabled(c, false); - } catch (UnregisteredComponentException ignored) { //This *should* never happen + } catch (Exception e) { + TBMCCoreAPI.SendException("Failed to disable one of the components: " + c.getClass().getSimpleName(), e); } }); componentsEnabled = false; diff --git a/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java b/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java index 57a98d5..4380812 100644 --- a/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java @@ -59,9 +59,10 @@ public abstract class Component { * The component will be enabled automatically, regardless of when it was registered. * * @param component The component to register + * @return Whether the component is registered successfully (it may have failed to enable) */ - public static void registerComponent(JavaPlugin plugin, Component component) { - registerUnregisterComponent(plugin, component, true); + public static boolean registerComponent(JavaPlugin plugin, Component component) { + return registerUnregisterComponent(plugin, component, true); } /** @@ -69,46 +70,62 @@ public abstract class Component { * Make sure to unregister the dependencies last. * * @param componentClass The component class to unregister + * @return Whether the component is unregistered successfully (it also got disabled) */ - public static void unregisterComponent(JavaPlugin plugin, Class componentClass) { + public static boolean unregisterComponent(JavaPlugin plugin, Class componentClass) { val component = components.get(componentClass); if (component == null) - return; //Failed to load - registerUnregisterComponent(plugin, component, false); + return false; //Failed to load + return registerUnregisterComponent(plugin, component, false); } - public static void registerUnregisterComponent(JavaPlugin plugin, Component component, boolean register) { - val metaAnn = component.getClass().getAnnotation(ComponentMetadata.class); - if (metaAnn != null) { - Class[] dependencies = metaAnn.depends(); - for (val dep : dependencies) { - if (!components.containsKey(dep)) { - plugin.getLogger().warning("Failed to " + (register ? "" : "un") + "register component " + component.getClassName() + " as a required dependency is missing/disabled: " + dep.getSimpleName()); - return; + public static boolean registerUnregisterComponent(JavaPlugin plugin, Component component, boolean register) { + try { + val metaAnn = component.getClass().getAnnotation(ComponentMetadata.class); + if (metaAnn != null) { + Class[] dependencies = metaAnn.depends(); + for (val dep : dependencies) { + if (!components.containsKey(dep)) { + plugin.getLogger().warning("Failed to " + (register ? "" : "un") + "register component " + component.getClassName() + " as a required dependency is missing/disabled: " + dep.getSimpleName()); + return false; + } } } - } - if (register) { - component.plugin = plugin; - var compconf = plugin.getConfig().getConfigurationSection("components"); - if (compconf == null) compconf = plugin.getConfig().createSection("components"); - component.config = compconf.getConfigurationSection(component.getClassName()); - if (component.config == null) component.config = compconf.createSection(component.getClassName()); - component.register(plugin); - components.put(component.getClass(), component); - if (ComponentManager.areComponentsEnabled() && component.shouldBeEnabled().get()) { - try { //Enable components registered after the previous ones getting enabled - setComponentEnabled(component, true); - } catch (UnregisteredComponentException ignored) { + if (register) { + component.plugin = plugin; + var compconf = plugin.getConfig().getConfigurationSection("components"); + if (compconf == null) compconf = plugin.getConfig().createSection("components"); + component.config = compconf.getConfigurationSection(component.getClassName()); + if (component.config == null) component.config = compconf.createSection(component.getClassName()); + component.register(plugin); + components.put(component.getClass(), component); + if (ComponentManager.areComponentsEnabled() && component.shouldBeEnabled().get()) { + try { //Enable components registered after the previous ones getting enabled + setComponentEnabled(component, true); + return true; + } catch (Exception | NoClassDefFoundError e) { + TBMCCoreAPI.SendException("Failed to enable component " + component.getClassName() + "!", e); + return true; + } } + return true; + } else { + if (component.enabled) { + try { + component.disable(); + component.enabled = false; + } catch (Exception | NoClassDefFoundError e) { + TBMCCoreAPI.SendException("Failed to disable component " + component.getClassName() + "!", e); + return false; //If failed to disable, won't unregister either + } + } + component.unregister(plugin); + components.remove(component.getClass()); + return true; } - } else { - if (component.enabled) { - component.disable(); - component.enabled = false; - } - component.unregister(plugin); - components.remove(component.getClass()); + } catch (Exception e) { + TBMCCoreAPI.SendException("Failed to " + (register ? "" : "un") + "register component " + component.getClassName() + "!", e); + return false; } } diff --git a/ButtonCore/src/main/java/buttondevteam/lib/architecture/exceptions/UnregisteredComponentException.java b/ButtonCore/src/main/java/buttondevteam/lib/architecture/exceptions/UnregisteredComponentException.java index e86c302..b230fad 100644 --- a/ButtonCore/src/main/java/buttondevteam/lib/architecture/exceptions/UnregisteredComponentException.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/architecture/exceptions/UnregisteredComponentException.java @@ -2,7 +2,7 @@ package buttondevteam.lib.architecture.exceptions; import buttondevteam.lib.architecture.Component; -public class UnregisteredComponentException extends Throwable { +public class UnregisteredComponentException extends Exception { public UnregisteredComponentException(Component component) { super("The component '" + component.getClass().getSimpleName() + "' isn't registered!");