diff --git a/assets/config.csv b/assets/config.csv index 1a3409e..4494448 100644 --- a/assets/config.csv +++ b/assets/config.csv @@ -8,6 +8,7 @@ "Localized Commands","buildHelp","" "Localized Commands","c++, g++, cplus, cpp","" "Localized Commands","catch","" +"Localized Commands","character","" "Localized Commands","charactercreate","" "Localized Commands","charactereditbio","" "Localized Commands","charactereditname","" @@ -263,6 +264,7 @@ "Command Enabler","buildhelp","1" "Command Enabler","c++, g++, cplus, cpp","1" "Command Enabler","catch","1" +"Command Enabler","character","1" "Command Enabler","charactercreate","1" "Command Enabler","charactereditbio","1" "Command Enabler","charactereditname","1" diff --git a/assets/plugins/forbiddenword.lua b/assets/plugins/forbiddenword.lua index d9417c3..b94064b 100644 --- a/assets/plugins/forbiddenword.lua +++ b/assets/plugins/forbiddenword.lua @@ -8,6 +8,7 @@ function plugin(message, user) hours = ((timedif / (60*60)) % 24); mins = ((timedif / (60)) % 60); secs = timedif % 60; + return "*GASP!!!* \n" .. user.name .. " said **THE** word! It's been " .. round(days) .. " days, " .. round(hours) .. " hours, " .. round(mins) .. " minutes, and " .. round(secs) .. " seconds since the last time!"; end diff --git a/src/core/lua/Plugin.java b/src/core/lua/Plugin.java index 640d2eb..5348c30 100644 --- a/src/core/lua/Plugin.java +++ b/src/core/lua/Plugin.java @@ -26,12 +26,14 @@ public class Plugin public Plugin(Path filepath) { this.filepath = filepath; - - - StringBuilder contentBuilder = new StringBuilder(); - + reRead(); + } + + public void reRead() + { try { + StringBuilder contentBuilder = new StringBuilder(); Stream stream = Files.lines(filepath, StandardCharsets.UTF_8); stream.forEach(str -> contentBuilder.append(str).append("\n")); stream.close(); diff --git a/src/core/lua/PluginManager.java b/src/core/lua/PluginManager.java index f77203c..e6e1570 100644 --- a/src/core/lua/PluginManager.java +++ b/src/core/lua/PluginManager.java @@ -1,33 +1,31 @@ package core.lua; -import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; -import java.util.stream.Stream; + import dataStructures.KittyUser; +import utils.GlobalLog; +import utils.LogFilter; +import utils.io.DirectoryMonitor; // Reads in, handles, and manipulates plugins. Plugins are loaded in the order they appear in the folder. public class PluginManager { // Variables - public final String pluginFolder; public ArrayList plugins; + public DirectoryMonitor directoryMonitor; // Constructor public PluginManager(String folder) { - this.pluginFolder = folder; + this.directoryMonitor = new DirectoryMonitor(folder); plugins = new ArrayList(); try { - try (Stream paths = Files.walk(Paths.get(this.pluginFolder))) - { - paths.filter(Files::isRegularFile).forEach((path)->{ addPlugin(path); }); - } + directoryMonitor.getCurrentFiles().forEach((file) -> addPlugin(file.path)); } catch(Exception e) { @@ -35,6 +33,43 @@ public class PluginManager } } + public void update() + { + directoryMonitor.update( + (addedFile) -> + { + addPlugin(addedFile.path); + + GlobalLog.log(LogFilter.Plugin, "Found new plugin at " + addedFile.path); + }, + (updatedFile) -> + { + for(Plugin plugin : plugins) + { + if(plugin.filepath.toString().equalsIgnoreCase(updatedFile.path.toString())) + { + plugin.reRead(); + break; + } + } + + GlobalLog.log(LogFilter.Plugin, "A plugin was updated " + updatedFile.path); + }, + (deletedFile) -> + { + for(int i = plugins.size() - 1; i >= 0; i--) + { + Plugin plugin = plugins.get(i); + + if(plugin.filepath.toString().equalsIgnoreCase(deletedFile.path.toString())) + plugins.remove(i); + } + + GlobalLog.log(LogFilter.Plugin, "Plugin deleted at " + deletedFile.path); + }); + } + + // Registers a plugin based on the path public void addPlugin(Path path) { plugins.add(new Plugin(path)); @@ -66,6 +101,8 @@ public class PluginManager public void printAll() { for(int i = 0; i < plugins.size(); ++i) + { PluginLog.log(plugins.get(i).contents.toString()); + } } } diff --git a/src/main/Main.java b/src/main/Main.java index a69aba9..06b562b 100644 --- a/src/main/Main.java +++ b/src/main/Main.java @@ -86,7 +86,8 @@ public class Main extends ListenerAdapter RPManager.instance.addLine(channel, user, input); // Run any pre-emptive upkeep we need to - Superintendent.perCommandUpkeepPre(); + if(!Superintendent.perCommandUpkeepPre(pluginManager)) + return; // Attempt to spin up a command. If the command doesn't exist. // Run plugins right before invoking the commands but after all other setup. @@ -111,6 +112,7 @@ public class Main extends ListenerAdapter } // Run any upkeep in post we need to - Superintendent.perCommandUpkeepPost(kittyCore, databaseManager); + if(!Superintendent.perCommandUpkeepPost(kittyCore, databaseManager)) + return; } } \ No newline at end of file diff --git a/src/main/Superintendent.java b/src/main/Superintendent.java index 1b49ecf..427b02f 100644 --- a/src/main/Superintendent.java +++ b/src/main/Superintendent.java @@ -6,6 +6,7 @@ import core.Config; import core.DatabaseManager; import core.RPManager; import core.Stats; +import core.lua.PluginManager; import dataStructures.KittyChannel; import dataStructures.KittyCore; import dataStructures.KittyGuild; @@ -71,11 +72,13 @@ public class Superintendent // Only called once per command. Good for lazily updating. // Happens just before the command / plugin runs. - public static boolean perCommandUpkeepPre() + public static boolean perCommandUpkeepPre(PluginManager pluginManager) { // Upkeep the config file monitoring Config.instance.upkeep(); + pluginManager.update(); + // Return if we succeeded or not. At this time, we always succeed. return true; }