diff options
Diffstat (limited to 'src/main/java/com/redstoner/coremods/moduleLoader/ModuleLoader.java')
-rw-r--r-- | src/main/java/com/redstoner/coremods/moduleLoader/ModuleLoader.java | 708 |
1 files changed, 290 insertions, 418 deletions
diff --git a/src/main/java/com/redstoner/coremods/moduleLoader/ModuleLoader.java b/src/main/java/com/redstoner/coremods/moduleLoader/ModuleLoader.java index 3886dd1..0397f59 100644 --- a/src/main/java/com/redstoner/coremods/moduleLoader/ModuleLoader.java +++ b/src/main/java/com/redstoner/coremods/moduleLoader/ModuleLoader.java @@ -1,26 +1,5 @@ package com.redstoner.coremods.moduleLoader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; - -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.configuration.InvalidConfigurationException; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.event.HandlerList; -import org.bukkit.event.Listener; -import org.bukkit.plugin.java.JavaPlugin; - import com.nemez.cmdmgr.Command; import com.nemez.cmdmgr.Command.AsyncType; import com.nemez.cmdmgr.CommandManager; @@ -34,243 +13,216 @@ import com.redstoner.misc.VersionHelper; import com.redstoner.modules.CoreModule; import com.redstoner.modules.Module; import com.redstoner.modules.ModuleLogger; - import net.nemez.chatapi.click.Message; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.InvalidConfigurationException; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.plugin.java.JavaPlugin; + +import java.io.*; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +/** + * The module loader, mother of all modules. Responsible for loading and taking care of all modules. + * + * @author Pepich + */ +@Version (major = 5, minor = 2, revision = 0, compatible = 5) +public final class ModuleLoader implements CoreModule { + private static final HashMap<Module, Boolean> modules = new HashMap<>(); + private static ModuleLoader instance; + private static HashMap<Module, ModuleInfo> moduleInfos = new HashMap<>(); + private static HashMap<String, List<Module>> categorizes = new HashMap<>(); + private static URL[] urls; + private static URLClassLoader mainLoader; + private static HashMap<Module, URLClassLoader> loaders = new HashMap<>(); + private static File configFile; + private static FileConfiguration config; + private static boolean debugMode = false; + private static HashMap<Module, ModuleLogger> loggers = new HashMap<>(); -/** The module loader, mother of all modules. Responsible for loading and taking care of all modules. - * - * @author Pepich */ -@Version(major = 5, minor = 2, revision = 0, compatible = 5) -public final class ModuleLoader implements CoreModule -{ - private static ModuleLoader instance; - private static final HashMap<Module, Boolean> modules = new HashMap<>(); - private static HashMap<Module, ModuleInfo> moduleInfos = new HashMap<>(); - private static HashMap<String, List<Module>> categorizes = new HashMap<>(); - private static URL[] urls; - private static URLClassLoader mainLoader; - private static HashMap<Module, URLClassLoader> loaders = new HashMap<>(); - private static File configFile; - private static FileConfiguration config; - private static boolean debugMode = false; - private static HashMap<Module, ModuleLogger> loggers = new HashMap<>(); - - private ModuleLoader() - { - try - { + private ModuleLoader() { + try { config = Main.plugin.getConfig(); configFile = new File(Main.plugin.getDataFolder(), "config.yml"); - urls = new URL[] {(new File(Main.plugin.getDataFolder(), "classes")).toURI().toURL()}; + urls = new URL[] { (new File(Main.plugin.getDataFolder(), "classes")).toURI().toURL() }; mainLoader = new URLClassLoader(urls, this.getClass().getClassLoader()); - } - catch (MalformedURLException e) - { + } catch (MalformedURLException e) { System.out.println("Sumtin is wong with ya filesüstem m8. Fix eeeet or I won't werk!"); Bukkit.getPluginManager().disablePlugin(Main.plugin); } } - - public static void init() - { + + public static void init() { if (instance == null) instance = new ModuleLoader(); ModuleInfo info = new ModuleInfo(ModuleLoader.class.getResourceAsStream("module.info"), instance); moduleInfos.put(instance, info); loggers.put(instance, new ModuleLogger(info.getDisplayName())); CommandManager.registerCommand(ModuleLoader.class.getResourceAsStream("ModuleLoader.cmd"), instance, - Main.plugin); + Main.plugin + ); } - - public static final void loadFromConfig() - { - try - { - if (!configFile.exists()) - { + + public static final void loadFromConfig() { + try { + if (!configFile.exists()) { configFile.getParentFile().mkdirs(); configFile.createNewFile(); } config.load(configFile); - } - catch (FileNotFoundException e) - {} - catch (IOException e) - { + } catch (FileNotFoundException e) { + } catch (IOException e) { e.printStackTrace(); - } - catch (InvalidConfigurationException e) - { + } catch (InvalidConfigurationException e) { configFile.delete(); - try - { + try { configFile.createNewFile(); - } - catch (IOException e1) - { + } catch (IOException e1) { e1.printStackTrace(); } instance.getLogger().error("Invalid config file! Creating new, blank file!"); } List<String> coremods = config.getStringList("coremods"); - if (coremods == null || coremods.isEmpty()) - { - config.set("coremods", new String[] {"# Add the coremodules here!"}); + if (coremods == null || coremods.isEmpty()) { + config.set("coremods", new String[] { "# Add the coremodules here!" }); Main.plugin.saveConfig(); - try - { + try { config.save(configFile); - } - catch (IOException e) - { + } catch (IOException e) { e.printStackTrace(); } } List<String> autoload = config.getStringList("autoload"); - if (autoload == null || autoload.isEmpty()) - { - config.set("autoload", new String[] {"# Add the modules here!"}); + if (autoload == null || autoload.isEmpty()) { + config.set("autoload", new String[] { "# Add the modules here!" }); Main.plugin.saveConfig(); - try - { + try { config.save(configFile); - } - catch (IOException e) - { + } catch (IOException e) { e.printStackTrace(); } } - if (!config.contains("debugMode")) - { + if (!config.contains("debugMode")) { config.set("debugMode", false); - try - { + try { config.save(configFile); - } - catch (IOException e) - { + } catch (IOException e) { e.printStackTrace(); } } debugMode = config.getBoolean("debugMode"); - for (String s : coremods) + for (String s : coremods) { if (!s.startsWith("#")) - if (!ModuleLoader.addDynamicModule(s)) - { + if (!ModuleLoader.addDynamicModule(s)) { instance.getLogger().error("Couldn't autocomplete path for module name: " + s - + "! If you're on a case sensitive filesystem, please take note that case correction does not work. Make sure that the classname has proper capitalisation."); - + + "! If you're on a case sensitive filesystem, please take note that case correction does not work. Make sure that the classname has proper capitalisation."); + } - for (String s : autoload) + } + for (String s : autoload) { if (!s.startsWith("#")) - if (!ModuleLoader.addDynamicModule(s)) - { + if (!ModuleLoader.addDynamicModule(s)) { instance.getLogger().error("Couldn't autocomplete path for module name: " + s - + "! If you're on a case sensitive filesystem, please take note that case correction does not work. Make sure that the classname has proper capitalisation."); - + + "! If you're on a case sensitive filesystem, please take note that case correction does not work. Make sure that the classname has proper capitalisation."); + } + } updateConfig(); } - - /** This method enables a specific module. If no module with that name is known to the loader yet it will be added to the list.</br> + + /** + * This method enables a specific module. If no module with that name is known to the loader yet it will be added to the list.</br> * This method is deprecated, use enableDynamicModule instead. When using this method, dynamic reloading of the module will not be supported. - * + * * @param clazz The class of the module to be enabled. - * @return true, when the module was successfully enabled. */ + * + * @return true, when the module was successfully enabled. + */ @Deprecated - public static final boolean enableModule(Class<? extends Module> clazz) - { - for (Module module : modules.keySet()) - { - if (module.getClass().equals(clazz)) - { - if (modules.get(module)) - { + public static final boolean enableModule(Class<? extends Module> clazz) { + for (Module module : modules.keySet()) { + if (module.getClass().equals(clazz)) { + if (modules.get(module)) { instance.getLogger().info("Module was already enabled! Ignoring module.!"); return true; } - if (module.onEnable()) - { + if (module.onEnable()) { if (module.getClass().isAnnotationPresent(AutoRegisterListener.class) - && (module instanceof Listener)) - { + && (module instanceof Listener)) { Bukkit.getPluginManager().registerEvents((Listener) module, Main.plugin); } instance.getLogger().info("Enabled module " + module.getClass().getName()); instance.getLogger().info("Loaded module " + module.getClass().getName()); modules.put(module, true); return true; - } - else - { + } else { instance.getLogger().error("Failed to enable module " + module.getClass().getName()); return false; } } } - try - { + try { Module m = clazz.newInstance(); modules.put(m, false); - if (m.onEnable()) - { - if (m.getClass().isAnnotationPresent(AutoRegisterListener.class) && (m instanceof Listener)) - { + if (m.onEnable()) { + if (m.getClass().isAnnotationPresent(AutoRegisterListener.class) && (m instanceof Listener)) { Bukkit.getPluginManager().registerEvents((Listener) m, Main.plugin); } instance.getLogger().info("Loaded and enabled module " + m.getClass().getName()); instance.getLogger().info("Loaded module " + m.getClass().getName()); return true; - } - else - { + } else { instance.getLogger().error("Failed to enable module " + m.getClass().getName()); return false; } - } - catch (InstantiationException | IllegalAccessException e) - { + } catch (InstantiationException | IllegalAccessException e) { instance.getLogger() - .error("Could not add " + clazz.getName() + " to the list, constructor not accessible."); + .error("Could not add " + clazz.getName() + " to the list, constructor not accessible."); return false; } } - - private static final void enableLoadedModule(Module module, Version oldVersion) - { - try - { + + private static final void enableLoadedModule(Module module, Version oldVersion) { + try { InputStream infoFile = null; - + if (VersionHelper.isCompatible(VersionHelper.create(5, 0, 0, 5), module.getClass())) { - String basePath = "plugins/ModuleLoader/classes/" + module.getClass().getName().replace(".", "/"); - + String basePath = "plugins/ModuleLoader/classes/" + module.getClass().getName().replace(".", "/"); + try { infoFile = new FileInputStream( - new File(basePath.substring(0, basePath.lastIndexOf('/')+1) + "module.info")); - } - catch(Exception e) { + new File(basePath.substring(0, basePath.lastIndexOf('/') + 1) + "module.info")); + } catch (Exception e) { infoFile = null; } } ModuleInfo info = new ModuleInfo(infoFile, module); - + moduleInfos.put(module, info); - + String category = info.getCategory(); - if (!categorizes.containsKey(category)) + if (!categorizes.containsKey(category)) categorizes.put(category, new ArrayList<>(Arrays.asList(module))); else { List<Module> modsInCat = categorizes.get(category); modsInCat.add(module); categorizes.put(category, modsInCat); } - - loggers.put(module, new ModuleLogger(info.getDisplayName())); - - - if (module.onEnable()) - { + + loggers.put(module, new ModuleLogger(info.getDisplayName())); + + + if (module.onEnable()) { modules.put(module, true); if (VersionHelper.getString(oldVersion).equals("0.0.0.0")) module.firstLoad(); @@ -278,21 +230,18 @@ public final class ModuleLoader implements CoreModule module.migrate(oldVersion); if (VersionHelper.isCompatible(VersionHelper.create(5, 0, 0, 3), module.getClass())) module.postEnable(); - if (VersionHelper.isCompatible(VersionHelper.create(5, 0, 0, 4), module.getClass())) - { + if (VersionHelper.isCompatible(VersionHelper.create(5, 0, 0, 4), module.getClass())) { Commands ann = module.getClass().getAnnotation(Commands.class); - if (ann != null) - { - switch (ann.value()) - { + if (ann != null) { + switch (ann.value()) { case File: File f = new File("plugins/ModuleLoader/classes/" - + module.getClass().getName().replace(".", "/") + ".cmd"); + + module.getClass().getName().replace(".", "/") + ".cmd"); CommandManager.registerCommand(f, module, Main.plugin); break; case Stream: InputStream stream = module.getClass() - .getResourceAsStream(module.getClass().getSimpleName() + ".cmd"); + .getResourceAsStream(module.getClass().getSimpleName() + ".cmd"); CommandManager.registerCommand(stream, module, Main.plugin); case String: CommandManager.registerCommand(module.getCommandString(), module, Main.plugin); @@ -305,189 +254,97 @@ public final class ModuleLoader implements CoreModule instance.getLogger().info("Loaded module " + module.getClass().getName()); if (module.getClass().isAnnotationPresent(AutoRegisterListener.class) && (module instanceof Listener)) Bukkit.getPluginManager().registerEvents((Listener) module, Main.plugin); - } - else + } else instance.getLogger().error("Failed to load module " + module.getClass().getName()); - } - catch (Exception e) - { + } catch (Exception e) { instance.getLogger().error("Failed to load module " + module.getClass().getName()); e.printStackTrace(); } } - - /** This method lists all modules to the specified CommandSender. The modules will be color coded correspondingly to their enabled status. - * - * @param sender The person to send the info to, usually the issuer of the command or the console sender. - * @return true. */ - @Command(hook = "list", async = AsyncType.ALWAYS) - public boolean listModulesCommand(CommandSender sender) - { - boolean hasCategorys = hasCategories(); - Message m = new Message(sender, null); - ModuleInfo ml_info = moduleInfos.get(instance); - - m.appendText("§2--=[ ") - .appendTextHover("§2" + ml_info.getDisplayName(), ml_info.getModuleInfoHover()) - .appendText("§2 ]=--\nModules:\n"); - - for (String cat: categorizes.keySet()) { - if (hasCategorys) - m.appendText("\n&7" + cat + ":\n"); - - int curModule = 1; - List<Module> mods = categorizes.get(cat); - for (Module mod : mods) { - - ModuleInfo info = moduleInfos.get(mod); - m.appendTextHover((modules.get(mod) ? "§a" : "§c") + info.getDisplayName(), info.getModuleInfoHover()); - - if (curModule != mods.size()) - m.appendText("&7, "); - curModule++; - } - m.appendText("\n"); - - } - m.send(); - return true; - } - - public static void disableModules() - { - for (Module module : modules.keySet()) - { + + public static void disableModules() { + for (Module module : modules.keySet()) { disableModule(module); } } - - public static void disableModule(Module module) - { - if (modules.get(module)) - { + + public static void disableModule(Module module) { + if (modules.get(module)) { module.onDisable(); - if (module.getClass().isAnnotationPresent(AutoRegisterListener.class) && (module instanceof Listener)) - { + if (module.getClass().isAnnotationPresent(AutoRegisterListener.class) && (module instanceof Listener)) { HandlerList.unregisterAll((Listener) module); } CommandManager.unregisterAllWithFallback(module.getClass().getSimpleName()); PrivateLogManager.unregister(module); - try - { + try { URLClassLoader loader = loaders.get(module); if (loader != null) loader.close(); - } - catch (IOException e) - {} - finally - { + } catch (IOException e) { + } finally { loaders.remove(module); } } } - - @Command(hook = "load") - public boolean loadModule(CommandSender sender, String name) - { - if (!addDynamicModule(name)) - { - instance.getLogger().message(sender, true, "Couldn't autocomplete path for module name: " + name - + "! If you're on a case sensitive filesystem, please take note that case correction does not work. Make sure that the classname has proper capitalisation."); - - } - updateConfig(); - return true; - } - - @Command(hook = "unload") - public boolean unloadModule(CommandSender sender, String name) - { - if (!removeDynamicModule(name)) - instance.getLogger().error("Couldn't find module! Couldn't disable nonexisting module!"); - return true; - } - - public static final boolean addDynamicModule(String raw_name) - { - String[] raw = raw_name.split(" "); - String name = raw[0]; - Version oldVersion; + + public static final boolean addDynamicModule(String raw_name) { + String[] raw = raw_name.split(" "); + String name = raw[0]; + Version oldVersion; if (raw.length > 1) oldVersion = VersionHelper.getVersion(raw[1]); else oldVersion = VersionHelper.create(0, 0, 0, 0); - for (Module m : modules.keySet()) - { - if (m.getClass().getName().equals(name)) - { + for (Module m : modules.keySet()) { + if (m.getClass().getName().equals(name)) { instance.getLogger().info( "Found existing module, attempting override. WARNING! This operation will halt the main thread until it is completed."); instance.getLogger() - .info("Attempting to load new class definition before disabling and removing the old module"); + .info("Attempting to load new class definition before disabling and removing the old module"); boolean differs = false; instance.getLogger().info("Old class definition: Class@" + m.getClass().hashCode()); - ClassLoader delegateParent = mainLoader.getParent(); - Class<?> newClass = null; - URLClassLoader cl = new URLClassLoader(urls, delegateParent); - try - { + ClassLoader delegateParent = mainLoader.getParent(); + Class<?> newClass = null; + URLClassLoader cl = new URLClassLoader(urls, delegateParent); + try { newClass = cl.loadClass(m.getClass().getName()); instance.getLogger().info("Found new class definition: Class@" + newClass.hashCode()); differs = m.getClass() != newClass; - } - catch (ClassNotFoundException e) - { + } catch (ClassNotFoundException e) { instance.getLogger().error("Could not find a class definition, aborting now!"); e.printStackTrace(); - try - { + try { cl.close(); - } - catch (IOException e1) - { + } catch (IOException e1) { e1.printStackTrace(); } return false; } - if (!differs) - { - if (!debugMode) - { + if (!differs) { + if (!debugMode) { instance.getLogger().warn( "New class definition equals old definition, are you sure you did everything right?"); instance.getLogger().info("Aborting now..."); - try - { + try { cl.close(); - } - catch (IOException e) - { + } catch (IOException e) { e.printStackTrace(); } return false; - } - else + } else instance.getLogger().warn( "New class definition equals old definition, but debugMode is enabled. Loading anyways."); - } - else + } else instance.getLogger().info("Found new class definition, attempting to instantiate:"); Module module = null; - try - { + try { module = (Module) newClass.newInstance(); - } - catch (InstantiationException | IllegalAccessException e) - { + } catch (InstantiationException | IllegalAccessException e) { instance.getLogger().error("Could not instantiate the module, aborting!"); e.printStackTrace(); - try - { + try { cl.close(); - } - catch (IOException e1) - { + } catch (IOException e1) { e1.printStackTrace(); } return false; @@ -497,45 +354,34 @@ public final class ModuleLoader implements CoreModule instance.getLogger().info("Current version: " + VersionHelper.getString(oldVersion)); Version newVersion = module.getClass().getAnnotation(Version.class); instance.getLogger().info("Version of remote class: " + VersionHelper.getString(newVersion)); - if (oldVersion.equals(newVersion)) - { - if (!debugMode) - { + if (oldVersion.equals(newVersion)) { + if (!debugMode) { instance.getLogger().error("Detected equal module versions, " + (debugMode - ? " aborting now... Set debugMode to true in your config if you want to continue!" - : " continueing anyways.")); - if (!debugMode) - { - try - { + ? " aborting now... Set debugMode to true in your config if you want to continue!" + : " continueing anyways.")); + if (!debugMode) { + try { cl.close(); - } - catch (IOException e) - { + } catch (IOException e) { e.printStackTrace(); } return false; } - } - else + } else instance.getLogger() - .warn("New version equals old version, but debugMode is enabled. Loading anyways."); - } - else + .warn("New version equals old version, but debugMode is enabled. Loading anyways."); + } else instance.getLogger().info("Versions differ, disabling old module"); disableModule(m); instance.getLogger().info("Disabled module, overriding the implementation"); modules.remove(m); categorizes.get(moduleInfos.get(m).getCategory()).remove(m); moduleInfos.remove(m); - - try - { + + try { if (loaders.containsKey(m)) loaders.remove(m).close(); - } - catch (IOException e) - { + } catch (IOException e) { e.printStackTrace(); } modules.put(module, false); @@ -545,61 +391,50 @@ public final class ModuleLoader implements CoreModule return true; } } - ClassLoader delegateParent = mainLoader.getParent(); - URLClassLoader cl = new URLClassLoader(urls, delegateParent); - try - { - Class<?> clazz = cl.loadClass(name); - Module module = (Module) clazz.newInstance(); + ClassLoader delegateParent = mainLoader.getParent(); + URLClassLoader cl = new URLClassLoader(urls, delegateParent); + try { + Class<?> clazz = cl.loadClass(name); + Module module = (Module) clazz.newInstance(); modules.put(module, false); loaders.put(module, cl); enableLoadedModule(module, oldVersion); return true; - } - catch (NoClassDefFoundError | ClassNotFoundException | InstantiationException | IllegalAccessException e) - { - try - { + } catch (NoClassDefFoundError | ClassNotFoundException | InstantiationException | IllegalAccessException e) { + try { cl.close(); + } catch (IOException e1) { } - catch (IOException e1) - {} - if (e instanceof NoClassDefFoundError) - { + if (e instanceof NoClassDefFoundError) { NoClassDefFoundError exception = (NoClassDefFoundError) e; - String[] exMessage = exception.getMessage().split(" "); + String[] exMessage = exception.getMessage().split(" "); String moduleName = exMessage[exMessage.length - 1] .substring(0, exMessage[exMessage.length - 1].length() - - (exMessage[exMessage.length - 1].endsWith(")") ? 1 : 0)) + - (exMessage[exMessage.length - 1].endsWith(")") ? 1 : 0)) .replace("/", "."); - if (!moduleName.equalsIgnoreCase(name)) - { + if (!moduleName.equalsIgnoreCase(name)) { instance.getLogger() - .error("Class &e" + moduleName + "&r couldn't be found! Suspecting a missing dependency!"); + .error("Class &e" + moduleName + "&r couldn't be found! Suspecting a missing dependency!"); return false; - } - else + } else instance.getLogger().warn( "Couldn't find class definition, attempting to get proper classname from thrown Exception."); if (addDynamicModule(moduleName)) return true; } - if (name.endsWith(".class")) - { + if (name.endsWith(".class")) { instance.getLogger().warn( "Couldn't find class definition, but path ends with .class -> Attempting again with removed file suffix."); if (addDynamicModule(name.replaceAll(".class$", ""))) return true; } - if (!name.contains(".")) - { + if (!name.contains(".")) { instance.getLogger().warn( "Couldn't find class definition, suspecting incomplete path. Attempting autocompletion of path by adding a package name and trying again."); if (addDynamicModule(name.toLowerCase() + "." + name)) return true; } - if (!name.startsWith("com.redstoner.modules.") && name.contains(".")) - { + if (!name.startsWith("com.redstoner.modules.") && name.contains(".")) { instance.getLogger().warn( "Couldn't find class definition, suspecting incomplete path. Attempting autocompletion of package name and trying again."); if (addDynamicModule("com.redstoner.modules." + name)) @@ -608,13 +443,10 @@ public final class ModuleLoader implements CoreModule } return false; } - - public static final boolean removeDynamicModule(String name) - { - for (Module m : modules.keySet()) - { - if (m.getClass().getName().equals(name)) - { + + public static final boolean removeDynamicModule(String name) { + for (Module m : modules.keySet()) { + if (m.getClass().getName().equals(name)) { instance.getLogger().info( "Found existing module, attempting unload. WARNING! This operation will halt the main thread until it is completed."); instance.getLogger().info("Attempting to disable module properly:"); @@ -626,24 +458,20 @@ public final class ModuleLoader implements CoreModule return true; } } - if (!name.startsWith("com.redstoner.modules.")) - { - if (name.endsWith(".class")) - { + if (!name.startsWith("com.redstoner.modules.")) { + if (name.endsWith(".class")) { instance.getLogger().warn( "Couldn't find class definition, but path ends with .class -> Attempting again with removed file suffix."); if (removeDynamicModule(name.replaceAll(".class$", ""))) return true; } - if (!name.contains(".")) - { + if (!name.contains(".")) { instance.getLogger().warn( "Couldn't find class definition, suspecting incomplete path. Attempting autocompletion of path by adding a package name and trying again."); if (removeDynamicModule(name.toLowerCase() + "." + name)) return true; } - if (!name.startsWith("com.redstoner.modules.")) - { + if (!name.startsWith("com.redstoner.modules.")) { instance.getLogger().warn( "Couldn't find class definition, suspecting incomplete path. Attempting autocompletion of package name and trying again."); if (removeDynamicModule("com.redstoner.modules." + name)) @@ -652,101 +480,145 @@ public final class ModuleLoader implements CoreModule } return false; } - - /** Finds a module by name for other modules to reference it. - * + + /** + * Finds a module by name for other modules to reference it. + * * @param name the name of the module. Use the full path if you are not sure about the module's SimpleClassName being unique. - * @return the instance of the module or @null it none could be found */ - public static Module getModule(String name) - { - for (Module m : modules.keySet()) + * + * @return the instance of the module or @null it none could be found + */ + public static Module getModule(String name) { + for (Module m : modules.keySet()) { if (m.getClass().getSimpleName().equalsIgnoreCase(name) || m.getClass().getName().equalsIgnoreCase(name)) return m; + } return null; } - - /** Finds a module by name for other modules to reference it. - * + + /** + * Finds a module by name for other modules to reference it. + * * @param name the name of the module. Use the full path if you are not sure about the module's SimpleClassName being unique. - * @return the instance of the module or @null it none could be found */ - public static boolean exists(String name) - { - for (Module m : modules.keySet()) + * + * @return the instance of the module or @null it none could be found + */ + public static boolean exists(String name) { + for (Module m : modules.keySet()) { if (m.getClass().getSimpleName().equals(name) || m.getClass().getName().equals(name)) return true; + } return false; } - - public static ModuleLogger getModuleLogger(Module module) - { + + public static ModuleLogger getModuleLogger(Module module) { return loggers.get(module); } - - public static void updateConfig() - { - List<String> coremods = config.getStringList("coremods"); + + public static void updateConfig() { + List<String> coremods = config.getStringList("coremods"); ArrayList<String> new_coremods = new ArrayList<>(); - List<String> autoload = config.getStringList("autoload"); + List<String> autoload = config.getStringList("autoload"); ArrayList<String> new_autoload = new ArrayList<>(); - - for (String s : coremods) - { - if (s.startsWith("#")) - { + + for (String s : coremods) { + if (s.startsWith("#")) { new_coremods.add(s); - } - else - { + } else { s = s.split(" ")[0]; - try - { + try { new_coremods.add(getModule(s).getClass().getName() + " " - + VersionHelper.getVersion(getModule(s).getClass())); - } - catch (Exception e) - { + + VersionHelper.getVersion(getModule(s).getClass())); + } catch (Exception e) { new_coremods.add(s + " " + VersionHelper.getString(VersionHelper.create(0, 0, 0, 0))); } } } - for (String s : autoload) - { - if (s.startsWith("#")) - { + for (String s : autoload) { + if (s.startsWith("#")) { new_autoload.add(s); - } - else - { + } else { s = s.split(" ")[0]; - try - { + try { new_autoload.add(getModule(s).getClass().getName() + " " - + VersionHelper.getVersion(getModule(s).getClass())); - } - catch (Exception e) - { + + VersionHelper.getVersion(getModule(s).getClass())); + } catch (Exception e) { new_autoload.add(s + " " + VersionHelper.getString(VersionHelper.create(0, 0, 0, 0))); } } } - + config.set("coremods", new_coremods); config.set("autoload", new_autoload); - try - { + try { config.save(configFile); - } - catch (IOException e) - { + } catch (IOException e) { e.printStackTrace(); } } - + public static JavaPlugin getPlugin() { return Main.plugin; } - + + /** + * This method lists all modules to the specified CommandSender. The modules will be color coded correspondingly to their enabled status. + * + * @param sender The person to send the info to, usually the issuer of the command or the console sender. + * + * @return true. + */ + @Command (hook = "list", async = AsyncType.ALWAYS) + public boolean listModulesCommand(CommandSender sender) { + boolean hasCategorys = hasCategories(); + Message m = new Message(sender, null); + ModuleInfo ml_info = moduleInfos.get(instance); + + m.appendText("§2--=[ ") + .appendTextHover("§2" + ml_info.getDisplayName(), ml_info.getModuleInfoHover()) + .appendText("§2 ]=--\nModules:\n"); + + for (String cat : categorizes.keySet()) { + if (hasCategorys) + m.appendText("\n&7" + cat + ":\n"); + + int curModule = 1; + List<Module> mods = categorizes.get(cat); + for (Module mod : mods) { + + ModuleInfo info = moduleInfos.get(mod); + m.appendTextHover((modules.get(mod) ? "§a" : "§c") + info.getDisplayName(), info.getModuleInfoHover()); + + if (curModule != mods.size()) + m.appendText("&7, "); + curModule++; + } + m.appendText("\n"); + + } + m.send(); + return true; + } + public static boolean hasCategories() { return !(categorizes.size() == 1 && categorizes.containsKey("Other")); } + + @Command (hook = "load") + public boolean loadModule(CommandSender sender, String name) { + if (!addDynamicModule(name)) { + instance.getLogger().message(sender, true, "Couldn't autocomplete path for module name: " + name + + "! If you're on a case sensitive filesystem, please take note that case correction does not work. Make sure that the classname has proper capitalisation."); + + } + updateConfig(); + return true; + } + + @Command (hook = "unload") + public boolean unloadModule(CommandSender sender, String name) { + if (!removeDynamicModule(name)) + instance.getLogger().error("Couldn't find module! Couldn't disable nonexisting module!"); + return true; + } } |