Merge branch 'feature/plugin_reloading' into develop

This commit is contained in:
Matthew Cech
2019-07-02 23:38:19 -07:00
6 changed files with 63 additions and 16 deletions
+2
View File
@@ -8,6 +8,7 @@
"Localized Commands","buildHelp","" "Localized Commands","buildHelp",""
"Localized Commands","c++, g++, cplus, cpp","" "Localized Commands","c++, g++, cplus, cpp",""
"Localized Commands","catch","" "Localized Commands","catch",""
"Localized Commands","character",""
"Localized Commands","charactercreate","" "Localized Commands","charactercreate",""
"Localized Commands","charactereditbio","" "Localized Commands","charactereditbio",""
"Localized Commands","charactereditname","" "Localized Commands","charactereditname",""
@@ -263,6 +264,7 @@
"Command Enabler","buildhelp","1" "Command Enabler","buildhelp","1"
"Command Enabler","c++, g++, cplus, cpp","1" "Command Enabler","c++, g++, cplus, cpp","1"
"Command Enabler","catch","1" "Command Enabler","catch","1"
"Command Enabler","character","1"
"Command Enabler","charactercreate","1" "Command Enabler","charactercreate","1"
"Command Enabler","charactereditbio","1" "Command Enabler","charactereditbio","1"
"Command Enabler","charactereditname","1" "Command Enabler","charactereditname","1"
1 Type Key Value
8 Localized Commands buildHelp
9 Localized Commands c++, g++, cplus, cpp
10 Localized Commands catch
11 Localized Commands character
12 Localized Commands charactercreate
13 Localized Commands charactereditbio
14 Localized Commands charactereditname
264 Command Enabler buildhelp 1
265 Command Enabler c++, g++, cplus, cpp 1
266 Command Enabler catch 1
267 Command Enabler character 1
268 Command Enabler charactercreate 1
269 Command Enabler charactereditbio 1
270 Command Enabler charactereditname 1
+1
View File
@@ -8,6 +8,7 @@ function plugin(message, user)
hours = ((timedif / (60*60)) % 24); hours = ((timedif / (60*60)) % 24);
mins = ((timedif / (60)) % 60); mins = ((timedif / (60)) % 60);
secs = timedif % 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!"; 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 end
+5 -3
View File
@@ -26,12 +26,14 @@ public class Plugin
public Plugin(Path filepath) public Plugin(Path filepath)
{ {
this.filepath = filepath; this.filepath = filepath;
reRead();
}
public void reRead()
StringBuilder contentBuilder = new StringBuilder(); {
try try
{ {
StringBuilder contentBuilder = new StringBuilder();
Stream<String> stream = Files.lines(filepath, StandardCharsets.UTF_8); Stream<String> stream = Files.lines(filepath, StandardCharsets.UTF_8);
stream.forEach(str -> contentBuilder.append(str).append("\n")); stream.forEach(str -> contentBuilder.append(str).append("\n"));
stream.close(); stream.close();
+46 -9
View File
@@ -1,33 +1,31 @@
package core.lua; package core.lua;
import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Stream;
import dataStructures.KittyUser; 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. // Reads in, handles, and manipulates plugins. Plugins are loaded in the order they appear in the folder.
public class PluginManager public class PluginManager
{ {
// Variables // Variables
public final String pluginFolder;
public ArrayList<Plugin> plugins; public ArrayList<Plugin> plugins;
public DirectoryMonitor directoryMonitor;
// Constructor // Constructor
public PluginManager(String folder) public PluginManager(String folder)
{ {
this.pluginFolder = folder; this.directoryMonitor = new DirectoryMonitor(folder);
plugins = new ArrayList<Plugin>(); plugins = new ArrayList<Plugin>();
try try
{ {
try (Stream<Path> paths = Files.walk(Paths.get(this.pluginFolder))) directoryMonitor.getCurrentFiles().forEach((file) -> addPlugin(file.path));
{
paths.filter(Files::isRegularFile).forEach((path)->{ addPlugin(path); });
}
} }
catch(Exception e) 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) public void addPlugin(Path path)
{ {
plugins.add(new Plugin(path)); plugins.add(new Plugin(path));
@@ -66,6 +101,8 @@ public class PluginManager
public void printAll() public void printAll()
{ {
for(int i = 0; i < plugins.size(); ++i) for(int i = 0; i < plugins.size(); ++i)
{
PluginLog.log(plugins.get(i).contents.toString()); PluginLog.log(plugins.get(i).contents.toString());
}
} }
} }
+4 -2
View File
@@ -86,7 +86,8 @@ public class Main extends ListenerAdapter
RPManager.instance.addLine(channel, user, input); RPManager.instance.addLine(channel, user, input);
// Run any pre-emptive upkeep we need to // 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. // Attempt to spin up a command. If the command doesn't exist.
// Run plugins right before invoking the commands but after all other setup. // 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 // Run any upkeep in post we need to
Superintendent.perCommandUpkeepPost(kittyCore, databaseManager); if(!Superintendent.perCommandUpkeepPost(kittyCore, databaseManager))
return;
} }
} }
+4 -1
View File
@@ -6,6 +6,7 @@ import core.Config;
import core.DatabaseManager; import core.DatabaseManager;
import core.RPManager; import core.RPManager;
import core.Stats; import core.Stats;
import core.lua.PluginManager;
import dataStructures.KittyChannel; import dataStructures.KittyChannel;
import dataStructures.KittyCore; import dataStructures.KittyCore;
import dataStructures.KittyGuild; import dataStructures.KittyGuild;
@@ -71,11 +72,13 @@ public class Superintendent
// Only called once per command. Good for lazily updating. // Only called once per command. Good for lazily updating.
// Happens just before the command / plugin runs. // Happens just before the command / plugin runs.
public static boolean perCommandUpkeepPre() public static boolean perCommandUpkeepPre(PluginManager pluginManager)
{ {
// Upkeep the config file monitoring // Upkeep the config file monitoring
Config.instance.upkeep(); Config.instance.upkeep();
pluginManager.update();
// Return if we succeeded or not. At this time, we always succeed.
return true; return true;
} }