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
new file mode 100644
index 0000000..0d3e00e
--- /dev/null
+++ b/.idea/libraries/Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_248b0d8d0a_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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
new file mode 100644
index 0000000..19b24a3
--- /dev/null
+++ b/.idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_431c5273c2_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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/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/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
new file mode 100644
index 0000000..b85ad34
--- /dev/null
+++ b/ButtonCore/src/main/java/buttondevteam/component/commands/CommandComponent.java
@@ -0,0 +1,15 @@
+package buttondevteam.component.commands;
+
+import buttondevteam.lib.architecture.Component;
+
+public class CommandComponent extends Component { //TODO: Do we just move everything here?
+ @Override
+ public void enable() {
+
+ }
+
+ @Override
+ 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
new file mode 100644
index 0000000..8184b8a
--- /dev/null
+++ b/ButtonCore/src/main/java/buttondevteam/component/restart/RestartComponent.java
@@ -0,0 +1,20 @@
+package buttondevteam.component.restart;
+
+import buttondevteam.core.PrimeRestartCommand;
+import buttondevteam.core.ScheduledRestartCommand;
+import buttondevteam.lib.architecture.Component;
+import buttondevteam.lib.chat.TBMCChatAPI;
+
+public class RestartComponent extends Component {
+ @Override
+ public void enable() {
+ //TODO: Permissions for the commands
+ TBMCChatAPI.AddCommand(getPlugin(), ScheduledRestartCommand.class);
+ TBMCChatAPI.AddCommand(getPlugin(), PrimeRestartCommand.class);
+ }
+
+ @Override
+ public void disable() {
+
+ }
+}
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..2425631
--- /dev/null
+++ b/ButtonCore/src/main/java/buttondevteam/component/updater/PluginUpdaterComponent.java
@@ -0,0 +1,16 @@
+package buttondevteam.component.updater;
+
+import buttondevteam.lib.architecture.Component;
+import buttondevteam.lib.chat.TBMCChatAPI;
+
+public class PluginUpdaterComponent extends Component {
+ @Override
+ public void enable() {
+ TBMCChatAPI.AddCommand(getPlugin(), UpdatePluginCommand.class);
+ }
+
+ @Override
+ public void disable() { //TODO: Unregister commands and such
+
+ }
+}
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/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 ef0768f..b3a4aaa 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.lib.PluginUpdater;
+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;
@@ -47,9 +50,9 @@ 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);
+ Component.registerComponent(this, new PluginUpdaterComponent());
+ Component.registerComponent(this, new RestartComponent());
+ ComponentManager.enableComponents();
TBMCChatAPI.AddCommand(this, MemberCommand.class);
TBMCCoreAPI.RegisterEventsForExceptions(new PlayerListener(), this);
ChromaGamerBase.addConverter(commandSender -> Optional.ofNullable(commandSender instanceof ConsoleCommandSender || commandSender instanceof BlockCommandSender
@@ -82,6 +85,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/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
new file mode 100644
index 0000000..faeb6a8
--- /dev/null
+++ b/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java
@@ -0,0 +1,219 @@
+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 = 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