From e5ff3d36fa2ba8f10497c0ffbf08de171e880c4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Fri, 27 Sep 2024 11:07:33 +0200 Subject: [PATCH] added reflection for appliance loading, extended logging and error handling --- build.gradle | 1 + .../java/eu/mhsl/craftattack/spawn/Main.java | 107 ++++++------------ 2 files changed, 33 insertions(+), 75 deletions(-) diff --git a/build.gradle b/build.gradle index 2e6f0b6..f324caf 100644 --- a/build.gradle +++ b/build.gradle @@ -26,6 +26,7 @@ dependencies { compileOnly 'org.geysermc.floodgate:api:2.2.2-SNAPSHOT' implementation 'org.apache.httpcomponents:httpclient:4.5.14' implementation 'com.sparkjava:spark-core:2.9.4' + implementation 'org.reflections:reflections:0.10.2' } def targetJavaVersion = 21 diff --git a/src/main/java/eu/mhsl/craftattack/spawn/Main.java b/src/main/java/eu/mhsl/craftattack/spawn/Main.java index 833ba41..56d8198 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/Main.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/Main.java @@ -2,47 +2,17 @@ package eu.mhsl.craftattack.spawn; import eu.mhsl.craftattack.spawn.api.HttpServer; import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliances.antiSignEdit.AntiSignEdit; -import eu.mhsl.craftattack.spawn.appliances.adminMarker.AdminMarker; -import eu.mhsl.craftattack.spawn.appliances.autoShulker.AutoShulker; -import eu.mhsl.craftattack.spawn.appliances.chatMention.ChatMention; -import eu.mhsl.craftattack.spawn.appliances.chatMessages.ChatMessages; -import eu.mhsl.craftattack.spawn.appliances.customAdvancements.CustomAdvancements; -import eu.mhsl.craftattack.spawn.appliances.debug.Debug; -import eu.mhsl.craftattack.spawn.appliances.displayName.DisplayName; -import eu.mhsl.craftattack.spawn.appliances.doubeDoor.DoubleDoor; -import eu.mhsl.craftattack.spawn.appliances.event.Event; -import eu.mhsl.craftattack.spawn.appliances.fleischerchest.Fleischerchest; -import eu.mhsl.craftattack.spawn.appliances.glowingBerries.GlowingBerries; -import eu.mhsl.craftattack.spawn.appliances.help.Help; -import eu.mhsl.craftattack.spawn.appliances.hotbarRefill.HotbarRefill; -import eu.mhsl.craftattack.spawn.appliances.kick.Kick; -import eu.mhsl.craftattack.spawn.appliances.knockDoor.KnockDoor; -import eu.mhsl.craftattack.spawn.appliances.maintenance.Maintenance; -import eu.mhsl.craftattack.spawn.appliances.optionLinks.OptionLinks; -import eu.mhsl.craftattack.spawn.appliances.outlawed.Outlawed; -import eu.mhsl.craftattack.spawn.appliances.packSelect.PackSelect; -import eu.mhsl.craftattack.spawn.appliances.panicBan.PanicBan; -import eu.mhsl.craftattack.spawn.appliances.playerlimit.PlayerLimit; -import eu.mhsl.craftattack.spawn.appliances.portableCrafting.PortableCrafting; -import eu.mhsl.craftattack.spawn.appliances.projectStart.ProjectStart; -import eu.mhsl.craftattack.spawn.appliances.report.Report; -import eu.mhsl.craftattack.spawn.appliances.restart.Restart; -import eu.mhsl.craftattack.spawn.appliances.settings.Settings; -import eu.mhsl.craftattack.spawn.appliances.tablist.Tablist; -import eu.mhsl.craftattack.spawn.appliances.titleClear.TitleClear; -import eu.mhsl.craftattack.spawn.appliances.whitelist.Whitelist; -import eu.mhsl.craftattack.spawn.appliances.worldmuseum.WorldMuseum; -import eu.mhsl.craftattack.spawn.appliances.yearRank.YearRank; import eu.mhsl.craftattack.spawn.config.Configuration; import org.bukkit.Bukkit; import org.bukkit.event.HandlerList; import org.bukkit.plugin.java.JavaPlugin; +import org.reflections.Reflections; import java.lang.reflect.ParameterizedType; import java.util.List; +import java.util.Set; +import java.util.logging.Level; import java.util.logging.Logger; -import java.util.stream.Stream; public final class Main extends JavaPlugin { private static Main instance; @@ -56,59 +26,46 @@ public final class Main extends JavaPlugin { instance = this; logger = instance().getLogger(); saveDefaultConfig(); - Configuration.readConfig(); + try { + this.wrappedEnable(); + } catch (Exception e) { + Main.logger().log(Level.SEVERE, "Error while initializing Spawn plugin, shutting down!", e); + Bukkit.shutdown(); + } + } + private void wrappedEnable() { + Configuration.readConfig(); List disabledAppliances = Configuration.pluginConfig.getStringList("disabledAppliances"); - this.appliances = Stream.of( - new AdminMarker(), - new WorldMuseum(), - new TitleClear(), - new ProjectStart(), - new Tablist(), - new ChatMessages(), - new Report(), - new Event(), - new Help(), - new PlayerLimit(), - new Whitelist(), - new Restart(), - new Kick(), - new PanicBan(), - new Outlawed(), - new DisplayName(), - new Debug(), - new Fleischerchest(), - new CustomAdvancements(), - new Settings(), - new PortableCrafting(), - new AutoShulker(), - new AntiSignEdit(), - new HotbarRefill(), - new ChatMention(), - new DoubleDoor(), - new KnockDoor(), - new PackSelect(), - new GlowingBerries(), - new Maintenance(), - new OptionLinks(), - new YearRank() - ) - .filter(appliance -> disabledAppliances.stream() - .noneMatch(s -> s.equalsIgnoreCase(appliance.getClass().getSimpleName()))) - .toList(); Main.logger.info("Loading appliances..."); - appliances.forEach(appliance -> { - Main.logger().info("Enabling " + appliance.getClass().getSimpleName()); + Reflections reflections = new Reflections(this.getClass().getPackageName()); + Set> applianceClasses = reflections.getSubTypesOf(Appliance.class); + + this.appliances = applianceClasses.stream() + .filter(applianceClass -> !disabledAppliances.contains(applianceClass.getSimpleName())) + .map(applianceClass -> { + try { + return (Appliance) applianceClass.getDeclaredConstructor().newInstance(); + } catch (Exception e) { + throw new RuntimeException(String.format("Failed to create instance of '%s'", applianceClass.getName()), e); + } + }) + .toList(); + Main.logger().info(String.format("Loaded %d appliances!", appliances.size())); + + Main.logger().info("Initializing appliances..."); + this.appliances.forEach(appliance -> { appliance.onEnable(); appliance.initialize(this); }); - Main.logger().info("Loaded " + appliances.size() + " appliances!"); + Main.logger().info(String.format("Initialized %d appliances!", appliances.size())); - Main.logger().info("Starting HTTP API"); + Main.logger().info("Starting HTTP API..."); this.httpApi = new HttpServer(); getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord"); + Main.logger().info("Startup complete!"); } @Override