diff --git a/src/core/lua/Plugin.java b/src/core/lua/Plugin.java index 24add7a..3c89e4a 100644 --- a/src/core/lua/Plugin.java +++ b/src/core/lua/Plugin.java @@ -4,10 +4,13 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; +import java.util.List; +import java.util.Vector; import java.util.stream.Stream; import org.luaj.vm2.Globals; import org.luaj.vm2.LuaValue; +import org.luaj.vm2.Varargs; import org.luaj.vm2.lib.jse.JsePlatform; // To promote flexibility, plugins are lua file with predefined callbacks. @@ -45,14 +48,38 @@ public class Plugin } } - public String Run(String args, PluginUser user) + public List Run(String args, PluginUser user) { + List outputs = new Vector(); + try { LuaValue res = func_plugin.call(LuaValue.valueOf(args), user.AsLua()); if(!res.isnil()) - return res.toString(); + { + if(res.istable()) + { + while(true) + { + LuaValue key = LuaValue.NIL; + while (true) + { + Varargs n = res.next(key); + key = n.arg1(); + if (key.isnil()) + break; + + LuaValue value = n.arg(2); + outputs.add(value.toString()); + } + } + } + else + { + outputs.add(res.toString()); + } + } } catch(Exception e) { diff --git a/src/core/lua/PluginManager.java b/src/core/lua/PluginManager.java index a0e98a2..d53d96d 100644 --- a/src/core/lua/PluginManager.java +++ b/src/core/lua/PluginManager.java @@ -4,6 +4,7 @@ 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; @@ -37,14 +38,17 @@ public class PluginManager } } - // Runs all plugins, returning when it gets a non-nill result. + // Runs all plugins, returning when it gets a non-nill result. If there + // are mutliple strings returned in the list, it is because the plugin + // that was run returned multiple strings. Since plugins don't stack, it + // will never indicate that multiple // Otherwise, returns null. - public String RunAll(String input, KittyUser user) + public List RunAll(String input, KittyUser user) { for(int i = 0; i < plugins.size(); ++i) { Plugin plugin = plugins.get(i); - String out = plugin.Run(input, new PluginUser(user)); + List out = plugin.Run(input, new PluginUser(user)); if(out != null) { diff --git a/src/main/Main.java b/src/main/Main.java index 6ef60c9..962a07a 100644 --- a/src/main/Main.java +++ b/src/main/Main.java @@ -18,6 +18,7 @@ import net.dv8tion.jda.core.hooks.ListenerAdapter; import offline.*; import utils.GlobalLog; import net.dv8tion.jda.core.*; +import java.util.*; // http://www.slf4j.org/ - this JDA logging tool has been disabled by specifying NOP implementation. // This is the application entry point, and bot startup location! @@ -86,10 +87,10 @@ public class Main extends ListenerAdapter // Run plugins right before invoking the commands but after all other setup. if(commandManager.InvokeOnNewThread(guild, channel, user, input, response) == false) { - String pluginOutput = pluginManager.RunAll(input.message, user); + List pluginOutput = pluginManager.RunAll(input.message, user); - if(pluginOutput != null) - response.Call(pluginOutput); + if(pluginOutput != null && pluginOutput.size() > 0) + response.Call(pluginOutput.get(0)); } // Run any upkeep in post we need to