diff --git a/.classpath b/.classpath index b116255..7c63137 100644 --- a/.classpath +++ b/.classpath @@ -13,5 +13,6 @@ + diff --git a/commands.config b/commands.config index 56f8bd9..257a7e9 100644 --- a/commands.config +++ b/commands.config @@ -35,3 +35,7 @@ invite=1 shutdown=1 addguildrole=1 allowedguildrole=1 +guildroleremove=1 +guildroleadd=1 +guildroleallowed=1 +fetch=1 diff --git a/lib/luaj-jse-3.0.1.jar b/lib/luaj-jse-3.0.1.jar new file mode 100644 index 0000000..e125860 Binary files /dev/null and b/lib/luaj-jse-3.0.1.jar differ diff --git a/locCommands.config b/locCommands.config index dbb7feb..93af80c 100644 --- a/locCommands.config +++ b/locCommands.config @@ -4,6 +4,7 @@ boop= tony, stark, dontfeelgood, dontfeelsogood= yeet= role= +guildroleremove= ping= rating= roll= @@ -12,13 +13,12 @@ choose= poll= rpstart= bet= -addguildrole= perish, thenperish= teey= stats= -allowedguildrole= beans= eightball, 8ball= +guildroleadd= vote= results= wolfram= @@ -32,8 +32,10 @@ rpend= rpg= tweet= java, jdoodle= +guildroleallowed= help= buildHelp= +fetch= invite= shutdown= diff --git a/locStrings.config b/locStrings.config index cc2fd23..b6e48f9 100644 --- a/locStrings.config +++ b/locStrings.config @@ -13,6 +13,11 @@ HelpDisplay=You can get help with a specific command by typing `!help command`!\ RollError=Didn't work ;3; RollInfo=Based on input of xdy where x is number of dice and y is faces kitty will roll that amount of dice, display the individual rolls and total +[CommandGuildRoleAllowed] +GuildRoleAllowedInfo= +GuildRoleAllowedSuccess=Added %s to the allowed roles! +GuildRoleAllowedDuplicate=Can't add the same role twice! + [CommandStats] StatsInfo=Displays the actively running KittyBot application information @@ -20,6 +25,12 @@ StatsInfo=Displays the actively running KittyBot application information TweetInfo=Kitty will tweet to her personal twitter account TweetError=Tweet command failed! +[CommandGuildRoleAdd] +GuildRoleAddSuccess=Added %s to %s +GuildRoleAddFailure=Failed to add %s to %s +GuildRoleAddNotAllowed=You are not allowed to add %s! +GuildRoleAddInfo=Add a role to yourself! + [CommandRole] RoleInfo=Will show the current role you have, Admins can change others roles with input of 'role x @y' with x being blacklist, general, mod, or admin. Blacklist will not allow the user to interact with kitty anymore, general mod and admin will give the user access to those commands. RoleStandardResponse=Your role is @@ -49,11 +60,6 @@ StarkInfo=Snaps your icon or the icon of a friend you mentioned [CommandYeet] YeetInfo=Yeet yourself or yeet a friend with @! -[CommandAllowedGuildRole] -AllowedGuildRoleInfo= -AllowedGuildRoleDuplicate=Can't add the same role twice! -AllowedGuildRoleSuccess=Added %s to the allowed roles! - [CommandPollVote] PollVoteNotValidNumber=That's not a vaild number! PollVoteInfo=Vote in a poll with the choice number, won't work if no poll is running, you can't change your vote once you have cast it! Be careful! @@ -126,6 +132,16 @@ BoopInfo=Kitty will react with a counter BoopStandard=Woah! %s booped me! That's %s total! BoopMultiple=%s booped several others - %s! +[CommandFetch] +FetchError=That no picture! +FetchEat=Me eat now *monch %s* +FetchInfo=Throw a custom emote and me bring it back! +FetchCatchRun=*Catches and runs away with %s* +FetchRunAway=*Runs away and doesn't return for a long time* +FetchBringBack=Me gots it! %s +FetchBringBackWrong=Me gots it! %s +FetchStare=*Stares at %s* + [CommandInfo] InfoResponse=I'm made by `Rin#8904` and `Reverie Wisp#3703`!\nYou can find more info about me along with a Patreon link to support us and GitHub link for filing bugs https://www.rinsnowmew.com/bot/ InfoInfo=Provides author info and a link to Kitty's website @@ -166,17 +182,17 @@ EightBallYes10=Signs point to yes. [CommandInvite] InviteInfo=Provides a direct invite link for KittyBot +[CommandGuildRoleRemove] +GuildRoleRemoveNotAllowed=You're not allowed to add %s +GuildRoleRemoveFailure=Couldn't remove %s from %s +GuildRoleRemoveSuccess=Removed %s from %s! +GuildRoleRemoveInfo= + [CommandWolfram] WolframError=Something went wrong! WolframInfo=Will query wolframalpha with your question and give a full image output of the answer WolframNoArgs=You need to provide some arguments! -[CommandAddGuildRole] -AddGuildRoleInfo=Add a role to yourself! -AddGuildRoleNotAllowed=You are not allowed to add %s! -AddGuildRoleSuccess=Added %s to %s -AddGuildRoleFailure=Failed to add %s to %s - [CommandMap] MapInfo=Generates a map! You can pass additional information if you want with the flags `-s-w-h`. If one of the fields isn't provided, its default will be used. Note that adjusting the width and height impacts the map outcomes.\n\nDefault seed: Random,\nDefault Width: 35(max %s),\nDefault Height: 25(max %s) MapSeed=Seed diff --git a/plugins/example.lua b/plugins/example.lua new file mode 100644 index 0000000..5415fdf --- /dev/null +++ b/plugins/example.lua @@ -0,0 +1,6 @@ +-- Example plugin stub. This function is called and passed the input message. +-- If nil is returned, the plugin is considered to have not run, but if any +-- other value is returned, it's interpreted as a string and sent back to the user. +function plugin(message) + return nil; +end diff --git a/src/commands/CommandFetch.java b/src/commands/CommandFetch.java new file mode 100644 index 0000000..569c3c4 --- /dev/null +++ b/src/commands/CommandFetch.java @@ -0,0 +1,57 @@ +package commands; + +import core.Command; +import core.LocStrings; +import dataStructures.KittyChannel; +import dataStructures.KittyGuild; +import dataStructures.KittyRating; +import dataStructures.KittyRole; +import dataStructures.KittyUser; +import dataStructures.Response; +import dataStructures.UserInput; + +public class CommandFetch extends Command +{ + public CommandFetch(KittyRole level, KittyRating rating) { super(level, rating); } + + @Override + public String HelpText() { return LocStrings.Stub("FetchInfo"); } + + @Override + public void OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res) + { + String emote = input.args.split(" ")[0]; + if(emote.startsWith("<") && emote.endsWith(">")) + { + int num = (int)(Math.random() * 6) + 1; + switch(num) + { + case 1: + res.Call(String.format(LocStrings.Stub("FetchBringBack"), emote)); + break; + case 2: + res.Call(String.format(LocStrings.Stub("FetchRunAway"))); + break; + case 3: + res.Call(String.format(LocStrings.Stub("FetchBringBackWrong"), guild.emoji.get((int)(Math.random() * guild.emoji.size()) + 1))); + break; + case 4: + res.Call(String.format(LocStrings.Stub("FetchEat"), emote)); + break; + case 5: + res.Call(String.format(LocStrings.Stub("FetchCatchRun"), emote)); + break; + case 6: + res.Call(String.format(LocStrings.Stub("FetchStare"), user.name)); + break; + default: + res.Call("" + num); + } + } + else + { + res.Call(String.format(LocStrings.Stub("FetchError"))); + System.out.println(emote); + } + } +} \ No newline at end of file diff --git a/src/commands/CommandAddGuildRole.java b/src/commands/CommandGuildRoleAdd.java similarity index 63% rename from src/commands/CommandAddGuildRole.java rename to src/commands/CommandGuildRoleAdd.java index 3c20873..a459094 100644 --- a/src/commands/CommandAddGuildRole.java +++ b/src/commands/CommandGuildRoleAdd.java @@ -10,12 +10,12 @@ import dataStructures.KittyUser; import dataStructures.Response; import dataStructures.UserInput; -public class CommandAddGuildRole extends Command +public class CommandGuildRoleAdd extends Command { - public CommandAddGuildRole(KittyRole level, KittyRating rating) { super(level, rating); } + public CommandGuildRoleAdd(KittyRole level, KittyRating rating) { super(level, rating); } @Override - public String HelpText() { return LocStrings.Stub("AddGuildRoleInfo"); }; + public String HelpText() { return LocStrings.Stub("GuildRoleAddInfo"); }; @Override public void OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res) @@ -25,16 +25,16 @@ public class CommandAddGuildRole extends Command { if(guild.control.addRole(user.discordID, role)) { - res.Call(String.format(LocStrings.Stub("AddGuildRoleSuccess"), role, user.name)); + res.Call(String.format(LocStrings.Stub("GuildRoleAddSuccess"), role, user.name)); } else { - res.Call(String.format(LocStrings.Stub("AddGuildRoleFailure"), role, user.name)); + res.Call(String.format(LocStrings.Stub("GuildRoleAddFailure"), role, user.name)); } } else { - res.Call(String.format(LocStrings.Stub("AddGuildRoleNotAllowed"), role)); + res.Call(String.format(LocStrings.Stub("GuildRoleAddNotAllowed"), role)); } } } \ No newline at end of file diff --git a/src/commands/CommandAllowedGuildRole.java b/src/commands/CommandGuildRoleAllowed.java similarity index 66% rename from src/commands/CommandAllowedGuildRole.java rename to src/commands/CommandGuildRoleAllowed.java index f71697e..3fbacb5 100644 --- a/src/commands/CommandAllowedGuildRole.java +++ b/src/commands/CommandGuildRoleAllowed.java @@ -10,12 +10,12 @@ import dataStructures.KittyUser; import dataStructures.Response; import dataStructures.UserInput; -public class CommandAllowedGuildRole extends Command +public class CommandGuildRoleAllowed extends Command { - public CommandAllowedGuildRole(KittyRole level, KittyRating rating) { super(level, rating); } + public CommandGuildRoleAllowed(KittyRole level, KittyRating rating) { super(level, rating); } @Override - public String HelpText() { return LocStrings.Stub("AllowedGuildRoleInfo"); } + public String HelpText() { return LocStrings.Stub("GuildRoleAllowedInfo"); } @Override public void OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res) @@ -27,12 +27,12 @@ public class CommandAllowedGuildRole extends Command role = roles[i].trim(); if(guild.allowedRole.contains(role)) { - res.Call(LocStrings.Stub("AllowedGuildRoleDuplicate")); + res.Call(LocStrings.Stub("GuildRoleAllowedDuplicate")); } else { guild.allowedRole.add(role); - res.Call(String.format(LocStrings.Stub("AllowedGuildRoleSuccess"), role)); + res.Call(String.format(LocStrings.Stub("GuildRoleAllowedSuccess"), role)); } } } diff --git a/src/commands/CommandGuildRoleRemove.java b/src/commands/CommandGuildRoleRemove.java new file mode 100644 index 0000000..5535538 --- /dev/null +++ b/src/commands/CommandGuildRoleRemove.java @@ -0,0 +1,40 @@ +package commands; + +import core.Command; +import core.LocStrings; +import dataStructures.KittyChannel; +import dataStructures.KittyGuild; +import dataStructures.KittyRating; +import dataStructures.KittyRole; +import dataStructures.KittyUser; +import dataStructures.Response; +import dataStructures.UserInput; + +public class CommandGuildRoleRemove extends Command +{ + public CommandGuildRoleRemove(KittyRole level, KittyRating rating) { super(level, rating); } + + @Override + public String HelpText() { return LocStrings.Stub("GuildRoleRemoveInfo"); }; + + @Override + public void OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res) + { + String role = input.args.split(" ")[0]; + if(guild.allowedRole.contains(role)) + { + if(guild.control.removeRole(user.discordID, role)) + { + res.Call(String.format(LocStrings.Stub("GuildRoleRemoveSuccess"), role, user.name)); + } + else + { + res.Call(String.format(LocStrings.Stub("GuildRoleRemoveFailure"), role, user.name)); + } + } + else + { + res.Call(String.format(LocStrings.Stub("GuildRoleRemoveNotAllowed"), role)); + } + } +} \ No newline at end of file diff --git a/src/core/ObjectBuilderFactory.java b/src/core/ObjectBuilderFactory.java index a186f28..ada6602 100644 --- a/src/core/ObjectBuilderFactory.java +++ b/src/core/ObjectBuilderFactory.java @@ -1,50 +1,14 @@ package core; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.concurrent.Semaphore; -import commands.CommandAddGuildRole; -import commands.CommandAllowedGuildRole; -import commands.CommandBeansShow; -import commands.CommandBetBeans; -import commands.CommandBlurry; -import commands.CommandBoop; -import commands.CommandChangeIndicator; -import commands.CommandChoose; -import commands.CommandColiru; -import commands.CommandDoWork; -import commands.CommandEightBall; -import commands.CommandGiveBeans; -import commands.CommandHelp; -import commands.CommandHelpBuilder; -import commands.CommandInfo; -import commands.CommandInvite; -import commands.CommandJDoodle; -import commands.CommandMap; -import commands.CommandPerish; -import commands.CommandPing; -import commands.CommandPollManage; -import commands.CommandPollResults; -import commands.CommandPollShow; -import commands.CommandPollVote; -import commands.CommandRPEnd; -import commands.CommandRPG; -import commands.CommandRPStart; -import commands.CommandRating; -import commands.CommandRole; -import commands.CommandRoll; -import commands.CommandShutdown; -import commands.CommandStark; -import commands.CommandStats; -import commands.CommandTeey; -import commands.CommandTweet; -import commands.CommandWolfram; -import commands.CommandYeet; -import dataStructures.KittyChannel; -import dataStructures.KittyGuild; -import dataStructures.KittyRating; -import dataStructures.KittyRole; -import dataStructures.KittyUser; +import commands.*; +import core.lua.PluginManager; +import dataStructures.*; +import net.dv8tion.jda.core.entities.Emote; import net.dv8tion.jda.core.entities.Member; import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent; import utils.AdminControl; @@ -75,6 +39,9 @@ public class ObjectBuilderFactory // RPManger for tracking RP system private static RPManager rpManager; + // Plugin manager + private static PluginManager pluginManager; + // Localization classes - these are singletons, but should be initialized before almost all other // things so their inclusion in the factory is to ensure they're started at the correct time. @SuppressWarnings("unused") private static LocStrings locStrings; @@ -136,6 +103,17 @@ public class ObjectBuilderFactory // look up the guild. String uid = event.getGuild().getId(); + List emotes = event.getGuild().getEmotes(); + ArrayList emotesString = new ArrayList(); + String emote; + String emoteFix; + for(int i = 0; i < emotes.size(); i++) + { + emote = emotes.get(i).toString(); + emoteFix = "<:" + emote.substring(2, emote.indexOf("(")); + emoteFix += ":" + emote.substring(emote.indexOf("(")+1, emote.length()-1) + ">"; + emotesString.add(emoteFix); + } // once we're lazily initialized, we can synchronize w/ the // guildCache object now instead of having to use a mutex. KittyGuild guild = null; @@ -149,7 +127,7 @@ public class ObjectBuilderFactory else { // Construct a new guild with defaults - guild = new KittyGuild(uid, new AdminControl(event.getGuild())); + guild = new KittyGuild(uid, new AdminControl(event.getGuild()), emotesString); DatabaseManager.instance.Register(guild); guildCache.put(uid, guild); } @@ -363,13 +341,15 @@ public class ObjectBuilderFactory manager.Register(LocCommands.Stub("rating"), new CommandRating(KittyRole.Admin, KittyRating.Safe)); manager.Register(LocCommands.Stub("indicator"), new CommandChangeIndicator(KittyRole.Admin, KittyRating.Safe)); - manager.Register(LocCommands.Stub("allowedguildrole"), new CommandAllowedGuildRole(KittyRole.Admin, KittyRating.Safe)); + manager.Register(LocCommands.Stub("guildroleallowed"), new CommandGuildRoleAllowed(KittyRole.Admin, KittyRating.Safe)); manager.Register(LocCommands.Stub("poll"), new CommandPollManage(KittyRole.Mod, KittyRating.Safe)); manager.Register(LocCommands.Stub("givebeans"), new CommandGiveBeans(KittyRole.Mod, KittyRating.Safe)); manager.Register(LocCommands.Stub("rpg"), new CommandRPG(KittyRole.Mod, KittyRating.Safe)); - manager.Register(LocCommands.Stub("addguildrole"), new CommandAddGuildRole(KittyRole.General, KittyRating.Safe)); + manager.Register(LocCommands.Stub("fetch"), new CommandFetch(KittyRole.General, KittyRating.Safe)); + manager.Register(LocCommands.Stub("guildroleadd"), new CommandGuildRoleAdd(KittyRole.General, KittyRating.Safe)); + manager.Register(LocCommands.Stub("guildroleremove"), new CommandGuildRoleRemove(KittyRole.General, KittyRating.Safe)); manager.Register(LocCommands.Stub("teey"), new CommandTeey(KittyRole.General, KittyRating.Safe)); manager.Register(LocCommands.Stub("perish, thenperish"), new CommandPerish(KittyRole.General, KittyRating.Safe)); manager.Register(LocCommands.Stub("yeet"), new CommandYeet(KittyRole.General, KittyRating.Safe)); @@ -432,6 +412,16 @@ public class ObjectBuilderFactory return rpManager; } + public static PluginManager ConstructPluginManager() + { + LazyInit(); + + if(pluginManager == null) + pluginManager = new PluginManager("./plugins/"); + + return pluginManager; + } + public static Integer GetGuildCount() { synchronized(guildCache) { diff --git a/src/core/lua/Plugin.java b/src/core/lua/Plugin.java new file mode 100644 index 0000000..9053ef6 --- /dev/null +++ b/src/core/lua/Plugin.java @@ -0,0 +1,34 @@ +package core.lua; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.stream.Stream; + +//To promote flexibility, plugins are lua file with predefined callbacks. +//They are executed between the initial built-in preprocessing and the command parsing. +public class Plugin +{ + public Path filepath; + public String contents; + + public Plugin(Path filepath) + { + this.filepath = filepath; + + StringBuilder contentBuilder = new StringBuilder(); + + try + { + Stream stream = Files.lines(filepath, StandardCharsets.UTF_8); + stream.forEach(str -> contentBuilder.append(str).append("\n")); + stream.close(); + contents = contentBuilder.toString(); + } + catch (IOException e) + { + PluginLog.Error(e.getMessage()); + } + } +} diff --git a/src/core/lua/PluginLoader.java b/src/core/lua/PluginLoader.java new file mode 100644 index 0000000..35db1a0 --- /dev/null +++ b/src/core/lua/PluginLoader.java @@ -0,0 +1,42 @@ +package core.lua; + +import org.luaj.vm2.Globals; +import org.luaj.vm2.LuaValue; +import org.luaj.vm2.lib.jse.JsePlatform; + +// This class wraps the lua layer - provides all the processing and function +// calls to the lua binding. +public class PluginLoader +{ + private Globals globals; + + public PluginLoader() + { + globals = JsePlatform.standardGlobals(); + PluginLog.Log("Created new PluginLoader lua environment"); + } + + public String Process(Plugin toProcess, String args) + { + globals.load(toProcess.contents).call(); + LuaValue pluginFunc = globals.get("plugin"); + + String output = null; + + try + { + LuaValue res = pluginFunc.call(LuaValue.valueOf(args)); + + if(res.isnil()) + output = null; + else + output = res.toString(); + } + catch(Exception e) + { + output = null; + } + + return output; + } +} diff --git a/src/core/lua/PluginLog.java b/src/core/lua/PluginLog.java new file mode 100644 index 0000000..8b084c7 --- /dev/null +++ b/src/core/lua/PluginLog.java @@ -0,0 +1,11 @@ +package core.lua; + +import utils.GlobalLog; +import utils.LogFilter; + +public class PluginLog +{ + public static void Log(String s) { GlobalLog.Log(LogFilter.Plugin, s); } + public static void Warn(String s) { GlobalLog.Warn(LogFilter.Plugin, s); } + public static void Error(String s) { GlobalLog.Error(LogFilter.Plugin, s); } +} diff --git a/src/core/lua/PluginManager.java b/src/core/lua/PluginManager.java new file mode 100644 index 0000000..c4e1fa9 --- /dev/null +++ b/src/core/lua/PluginManager.java @@ -0,0 +1,62 @@ +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.stream.Stream; + +// Reads in, handles, and manipulates plugins. Plugins are loaded in the order they appear in the folder. +public class PluginManager +{ + public PluginLoader pluginLoader; + public final String pluginFolder; + public ArrayList plugins; + + public void AddPlugin(Path path) + { + plugins.add(new Plugin(path)); + } + + public PluginManager(String folder) + { + this.pluginFolder = folder; + plugins = new ArrayList(); + this.pluginLoader = new PluginLoader(); + + try + { + try (Stream paths = Files.walk(Paths.get(this.pluginFolder))) + { + paths.filter(Files::isRegularFile).forEach((path)->{ AddPlugin(path); }); + } + } + catch(Exception e) + { + PluginLog.Error(e.getMessage()); + } + } + + public String CallAll(String input) + { + for(int i = 0; i < plugins.size(); ++i) + { + Plugin script = plugins.get(i); + String out = pluginLoader.Process(script, input); + + if(out != null) + { + PluginLog.Log("Executed plugin at " + script.filepath); + return out; + } + } + + return null; + } + + public void PrintAll() + { + for(int i = 0; i < plugins.size(); ++i) + PluginLog.Log(plugins.get(i).contents.toString()); + } +} diff --git a/src/dataStructures/KittyGuild.java b/src/dataStructures/KittyGuild.java index 4a9ad22..92b7770 100644 --- a/src/dataStructures/KittyGuild.java +++ b/src/dataStructures/KittyGuild.java @@ -14,19 +14,21 @@ public class KittyGuild extends DatabaseTrackedObject public String poll; public ArrayList hasVoted = new ArrayList(); public ArrayList allowedRole = new ArrayList(); + public ArrayList emoji = new ArrayList(); public ArrayList choices = new ArrayList(); public AdminControl control; private String commandIndicator; // Default content for a guild - public KittyGuild(String uniqueID, AdminControl adminControl) + public KittyGuild(String uniqueID, AdminControl adminControl, ArrayList emoji) { super(uniqueID); control = adminControl; this.uniqueID = uniqueID; this.contentRating = KittyRating.Safe; this.polling = false; + this.emoji = emoji; SetCommandIndicator("!"); } diff --git a/src/main/Main.java b/src/main/Main.java index 1ca3707..5d79ca8 100644 --- a/src/main/Main.java +++ b/src/main/Main.java @@ -2,6 +2,7 @@ package main; import javax.security.auth.login.LoginException; import core.*; +import core.lua.PluginManager; import dataStructures.KittyChannel; import dataStructures.KittyGuild; import dataStructures.KittyRole; @@ -22,14 +23,15 @@ import net.dv8tion.jda.core.*; @SuppressWarnings("unused") public class Main extends ListenerAdapter { - // Variables and stuff + // Variables and bot specific objects private static JDA kitty; - private static CommandManager commandManager; - private static CommandEnabler commandEnabler; private static DatabaseManager databaseManager; + private static CommandEnabler commandEnabler; + private static CommandManager commandManager; private static Stats stats; private static RPManager rpManager; - + private static PluginManager pluginManager; + // Main test location public static void main(String[] args) throws InterruptedException, LoginException, Exception { @@ -37,8 +39,9 @@ public class Main extends ListenerAdapter databaseManager = ObjectBuilderFactory.ConstructDatabaseManager(); commandEnabler = ObjectBuilderFactory.ConstructCommandEnabler(); commandManager = ObjectBuilderFactory.ConstructCommandManager(commandEnabler); - rpManager = ObjectBuilderFactory.ConstructRPManager(); stats = ObjectBuilderFactory.ConstructStats(commandManager); + rpManager = ObjectBuilderFactory.ConstructRPManager(); + pluginManager = ObjectBuilderFactory.ConstructPluginManager(); // Bot startup kitty = new JDABuilder(AccountType.BOT).setToken(Ref.TestToken).buildBlocking(); @@ -61,19 +64,25 @@ public class Main extends ListenerAdapter // Specialized uncached objects Response response = new Response(event, kitty); UserInput input = new UserInput(event, guild); - + // Tweak object construction as necessary if(!PostProcessSetup(event, user, guild, channel, response, input)) return; - + // Track beans! - user.ChangeBeans(1); + user.ChangeBeans(1); // RP logging system RPManager.instance.addLine(channel, user, input); - // Issue the command - commandManager.InvokeOnNewThread(guild, channel, user, input, response); + // Run plugins right before invoking the commands but after all other setup + String output = pluginManager.CallAll(input.message); + + // Spin up the command if no plugins ran. Otherwise, send a response. + if(output == null) + commandManager.InvokeOnNewThread(guild, channel, user, input, response); + else + response.Call(output); // Run any upkeep we need to PerCommandUpkeep(); diff --git a/src/utils/AdminControl.java b/src/utils/AdminControl.java index 7124f75..bc919d2 100644 --- a/src/utils/AdminControl.java +++ b/src/utils/AdminControl.java @@ -26,4 +26,17 @@ public class AdminControl } return true; } + + public boolean removeRole(String memberID, String roleName) + { + try + { + guildCon.removeRolesFromMember(guild.getMemberById(memberID), guild.getRolesByName(roleName, true)).complete(); + } + catch(Exception e) + { + return false; + } + return true; + } } diff --git a/src/utils/LogFilter.java b/src/utils/LogFilter.java index 22742fe..c0ad6e3 100644 --- a/src/utils/LogFilter.java +++ b/src/utils/LogFilter.java @@ -3,7 +3,7 @@ package utils; public enum LogFilter { // Assign numbers as flags, so we can | ('or') them together as necessary - Debug(0), Command(1), Core(2), Util(4), Database(8), Response(16), Network(32), Strings(64); + Debug(0), Command(1), Core(2), Util(4), Database(8), Response(16), Network(32), Strings(64), Plugin(128); private final int value; private LogFilter(int value)