From 5a9986de4fa6bba673ae69ab59d5fca192dfd0a0 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sat, 16 Feb 2019 00:39:48 +0100 Subject: [PATCH] Command stuff fixed Replies sanitized, userinfo converted Manually removing spaces Tested --- .../discordplugin/DiscordPlugin.java | 2 + .../discordplugin/commands/Command2DC.java | 2 +- .../commands/Command2DCSender.java | 5 +- .../commands/DiscordCommandBase.java | 1 - .../discordplugin/commands/ICommand2DC.java | 2 +- .../commands/UserinfoCommand.java | 190 +++++++++--------- .../commands/VersionCommand.java | 2 + .../listeners/CommandListener.java | 26 +-- 8 files changed, 114 insertions(+), 116 deletions(-) diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java index eab7e6e..d62b773 100755 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java @@ -3,6 +3,7 @@ package buttondevteam.discordplugin; import buttondevteam.discordplugin.broadcaster.GeneralEventBroadcasterModule; import buttondevteam.discordplugin.commands.Command2DC; import buttondevteam.discordplugin.commands.DiscordCommandBase; +import buttondevteam.discordplugin.commands.UserinfoCommand; import buttondevteam.discordplugin.commands.VersionCommand; import buttondevteam.discordplugin.exceptions.ExceptionListenerModule; import buttondevteam.discordplugin.fun.FunModule; @@ -126,6 +127,7 @@ public class DiscordPlugin extends ButtonPlugin implements IListener DiscordCommandBase.registerCommands(); getManager().registerCommand(new VersionCommand()); + getManager().registerCommand(new UserinfoCommand()); if (ResetMCCommand.resetting) //These will only execute if the chat is enabled ChromaBot.getInstance().sendMessageCustomAsWell("", new EmbedBuilder().withColor(Color.CYAN) .withTitle("Discord plugin restarted - chat connected.").build(), ChannelconBroadcast.RESTART); //Really important to note the chat, hmm diff --git a/src/main/java/buttondevteam/discordplugin/commands/Command2DC.java b/src/main/java/buttondevteam/discordplugin/commands/Command2DC.java index 22565d9..e61d43f 100644 --- a/src/main/java/buttondevteam/discordplugin/commands/Command2DC.java +++ b/src/main/java/buttondevteam/discordplugin/commands/Command2DC.java @@ -22,7 +22,7 @@ public class Command2DC extends Command2 { @Override public void registerCommand(ICommand2DC command) { - registerCommand(command, subcommands, DiscordPlugin.getPrefix()); + registerCommand(command, subcommands, DiscordPlugin.getPrefix()); //Needs to be configurable for the helps } @Override diff --git a/src/main/java/buttondevteam/discordplugin/commands/Command2DCSender.java b/src/main/java/buttondevteam/discordplugin/commands/Command2DCSender.java index 5a04166..a2281f9 100644 --- a/src/main/java/buttondevteam/discordplugin/commands/Command2DCSender.java +++ b/src/main/java/buttondevteam/discordplugin/commands/Command2DCSender.java @@ -1,5 +1,6 @@ package buttondevteam.discordplugin.commands; +import buttondevteam.discordplugin.DPUtils; import buttondevteam.lib.chat.Command2Sender; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -11,11 +12,11 @@ public class Command2DCSender implements Command2Sender { @Override public void sendMessage(String message) { - this.message.reply(message); + this.message.reply(DPUtils.sanitizeString(message)); } @Override public void sendMessage(String[] message) { - this.message.reply(String.join("\n", message)); + this.message.reply(DPUtils.sanitizeString(String.join("\n", message))); } } diff --git a/src/main/java/buttondevteam/discordplugin/commands/DiscordCommandBase.java b/src/main/java/buttondevteam/discordplugin/commands/DiscordCommandBase.java index d05964f..7f38d45 100755 --- a/src/main/java/buttondevteam/discordplugin/commands/DiscordCommandBase.java +++ b/src/main/java/buttondevteam/discordplugin/commands/DiscordCommandBase.java @@ -22,7 +22,6 @@ public abstract class DiscordCommandBase { public static void registerCommands() { commands.put("connect", new ConnectCommand()); // TODO: API for adding commands? - commands.put("userinfo", new UserinfoCommand()); commands.put("help", new HelpCommand()); commands.put("mcchat", new MCChatCommand()); commands.put("channelcon", new ChannelconCommand()); diff --git a/src/main/java/buttondevteam/discordplugin/commands/ICommand2DC.java b/src/main/java/buttondevteam/discordplugin/commands/ICommand2DC.java index c602c68..6aae802 100644 --- a/src/main/java/buttondevteam/discordplugin/commands/ICommand2DC.java +++ b/src/main/java/buttondevteam/discordplugin/commands/ICommand2DC.java @@ -6,7 +6,7 @@ import buttondevteam.lib.chat.ICommand2; import lombok.Getter; import lombok.val; -public abstract class ICommand2DC extends ICommand2 { +public abstract class ICommand2DC extends ICommand2 { public ICommand2DC() { super(DiscordPlugin.plugin.getManager()); val ann = getClass().getAnnotation(CommandClass.class); diff --git a/src/main/java/buttondevteam/discordplugin/commands/UserinfoCommand.java b/src/main/java/buttondevteam/discordplugin/commands/UserinfoCommand.java index b1dbf8b..7954002 100755 --- a/src/main/java/buttondevteam/discordplugin/commands/UserinfoCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/UserinfoCommand.java @@ -1,99 +1,91 @@ -package buttondevteam.discordplugin.commands; - -import buttondevteam.discordplugin.DiscordPlayer; -import buttondevteam.discordplugin.DiscordPlugin; -import buttondevteam.lib.TBMCCoreAPI; -import buttondevteam.lib.player.ChromaGamerBase; -import buttondevteam.lib.player.ChromaGamerBase.InfoTarget; -import sx.blah.discord.handle.obj.IMessage; -import sx.blah.discord.handle.obj.IUser; - -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -public class UserinfoCommand extends DiscordCommandBase { - - @Override - public String getCommandName() { - return "userinfo"; - } - - @Override - public boolean run(IMessage message, String args) { - IUser target = null; - if (args.length() == 0) - target = message.getAuthor(); - else { - final Optional firstmention = message.getMentions().stream() - .filter(m -> !m.getStringID().equals(DiscordPlugin.dc.getOurUser().getStringID())).findFirst(); - if (firstmention.isPresent()) - target = firstmention.get(); - else if (args.contains("#")) { - String[] targettag = args.split("#"); - final List targets = getUsers(message, targettag[0]); - if (targets.size() == 0) { - DiscordPlugin.sendMessageToChannel(message.getChannel(), - "The user cannot be found (by name): " + args); - return true; - } - for (IUser ptarget : targets) { - if (ptarget.getDiscriminator().equalsIgnoreCase(targettag[1])) { - target = ptarget; - break; - } - } - if (target == null) { - DiscordPlugin.sendMessageToChannel(message.getChannel(), - "The user cannot be found (by discriminator): " + args + "(Found " + targets.size() - + " users with the name.)"); - return true; - } - } else { - final List targets = getUsers(message, args); - if (targets.size() == 0) { - DiscordPlugin.sendMessageToChannel(message.getChannel(), - "The user cannot be found on Discord: " + args); - return true; - } - if (targets.size() > 1) { - DiscordPlugin.sendMessageToChannel(message.getChannel(), - "Multiple users found with that (nick)name. Please specify the whole tag, like ChromaBot#6338 or use a ping."); - return true; - } - target = targets.get(0); - } - } - try (DiscordPlayer dp = ChromaGamerBase.getUser(target.getStringID(), DiscordPlayer.class)) { - StringBuilder uinfo = new StringBuilder("User info for ").append(target.getName()).append(":\n"); - uinfo.append(dp.getInfo(InfoTarget.Discord)); - DiscordPlugin.sendMessageToChannel(message.getChannel(), uinfo.toString()); - } catch (Exception e) { - DiscordPlugin.sendMessageToChannel(message.getChannel(), "An error occured while getting the user!"); - TBMCCoreAPI.SendException("Error while getting info about " + target.getName() + "!", e); - } - return true; - } - - private List getUsers(IMessage message, String args) { - final List targets; - if (message.getChannel().isPrivate()) - targets = DiscordPlugin.dc.getUsers().stream().filter(u -> u.getName().equalsIgnoreCase(args)) - .collect(Collectors.toList()); - else - targets = message.getGuild().getUsersByName(args, true); - return targets; - } - - @Override - public String[] getHelpText() { - return new String[] { // - "---- User information ----", // - "Shows some information about users, from Discord, from Minecraft or from Reddit if they have these accounts connected.", // - "If used without args, shows your info.", // - "Usage: " + DiscordPlugin.getPrefix() + "userinfo [username/nickname[#tag]/ping]", // - "Examples:\n" + DiscordPlugin.getPrefix() + "userinfo ChromaBot\n" + DiscordPlugin.getPrefix() + "userinfo ChromaBot#6338\n" + DiscordPlugin.getPrefix() + "userinfo @ChromaBot#6338" // - }; - } - -} +package buttondevteam.discordplugin.commands; + +import buttondevteam.discordplugin.DiscordPlayer; +import buttondevteam.discordplugin.DiscordPlugin; +import buttondevteam.lib.TBMCCoreAPI; +import buttondevteam.lib.chat.Command2; +import buttondevteam.lib.chat.CommandClass; +import buttondevteam.lib.player.ChromaGamerBase; +import buttondevteam.lib.player.ChromaGamerBase.InfoTarget; +import lombok.val; +import sx.blah.discord.handle.obj.IMessage; +import sx.blah.discord.handle.obj.IUser; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@CommandClass(helpText = { + "User information", // + "Shows some information about users, from Discord, from Minecraft or from Reddit if they have these accounts connected.", // + "If used without args, shows your info.", // +}) +public class UserinfoCommand extends ICommand2DC { + @Command2.Subcommand + public boolean def(Command2DCSender sender, @Command2.OptionalArg String args) { + val message = sender.getMessage(); + IUser target = null; + if (args == null || args.length() == 0) + target = message.getAuthor(); + else { + final Optional firstmention = message.getMentions().stream() + .filter(m -> !m.getStringID().equals(DiscordPlugin.dc.getOurUser().getStringID())).findFirst(); + if (firstmention.isPresent()) + target = firstmention.get(); + else if (args.contains("#")) { + String[] targettag = args.split("#"); + final List targets = getUsers(message, targettag[0]); + if (targets.size() == 0) { + DiscordPlugin.sendMessageToChannel(message.getChannel(), + "The user cannot be found (by name): " + args); + return true; + } + for (IUser ptarget : targets) { + if (ptarget.getDiscriminator().equalsIgnoreCase(targettag[1])) { + target = ptarget; + break; + } + } + if (target == null) { + DiscordPlugin.sendMessageToChannel(message.getChannel(), + "The user cannot be found (by discriminator): " + args + "(Found " + targets.size() + + " users with the name.)"); + return true; + } + } else { + final List targets = getUsers(message, args); + if (targets.size() == 0) { + DiscordPlugin.sendMessageToChannel(message.getChannel(), + "The user cannot be found on Discord: " + args); + return true; + } + if (targets.size() > 1) { + DiscordPlugin.sendMessageToChannel(message.getChannel(), + "Multiple users found with that (nick)name. Please specify the whole tag, like ChromaBot#6338 or use a ping."); + return true; + } + target = targets.get(0); + } + } + try (DiscordPlayer dp = ChromaGamerBase.getUser(target.getStringID(), DiscordPlayer.class)) { + StringBuilder uinfo = new StringBuilder("User info for ").append(target.getName()).append(":\n"); + uinfo.append(dp.getInfo(InfoTarget.Discord)); + DiscordPlugin.sendMessageToChannel(message.getChannel(), uinfo.toString()); + } catch (Exception e) { + DiscordPlugin.sendMessageToChannel(message.getChannel(), "An error occured while getting the user!"); + TBMCCoreAPI.SendException("Error while getting info about " + target.getName() + "!", e); + } + return true; + } + + private List getUsers(IMessage message, String args) { + final List targets; + if (message.getChannel().isPrivate()) + targets = DiscordPlugin.dc.getUsers().stream().filter(u -> u.getName().equalsIgnoreCase(args)) + .collect(Collectors.toList()); + else + targets = message.getGuild().getUsersByName(args, true); + return targets; + } + +} diff --git a/src/main/java/buttondevteam/discordplugin/commands/VersionCommand.java b/src/main/java/buttondevteam/discordplugin/commands/VersionCommand.java index cf0ee8c..ac83243 100644 --- a/src/main/java/buttondevteam/discordplugin/commands/VersionCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/VersionCommand.java @@ -1,6 +1,7 @@ package buttondevteam.discordplugin.commands; import buttondevteam.discordplugin.DiscordPlugin; +import buttondevteam.lib.chat.Command2; import buttondevteam.lib.chat.CommandClass; import lombok.val; @@ -9,6 +10,7 @@ import lombok.val; "Returns the plugin's version" }) public class VersionCommand extends ICommand2DC { + @Command2.Subcommand public boolean def(Command2DCSender sender) { sender.sendMessage(getVersion()); return true; diff --git a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java index a9eae80..4093b07 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java @@ -21,7 +21,7 @@ public class CommandListener { final IChannel channel = message.getChannel(); if (!mentionedonly) { //mentionedonly conditions are in CommonListeners if (!message.getChannel().isPrivate() - && !(message.getContent().charAt(0) == DiscordPlugin.getPrefix() + && !(message.getContent().charAt(0) == DiscordPlugin.getPrefix() && channel.getStringID().equals(DiscordPlugin.plugin.CommandChannel().get().getStringID()))) // return false; message.getChannel().setTypingStatus(true); // Fun @@ -38,9 +38,10 @@ public class CommandListener { return false; } message.getChannel().setTypingStatus(true); - String cmdwithargsString = cmdwithargs.toString().trim(); //Remove spaces between mention and command + String cmdwithargsString = cmdwithargs.toString(); try { - DiscordPlugin.plugin.getManager().handleCommand(new Command2DCSender(message), cmdwithargsString); + if (!DiscordPlugin.plugin.getManager().handleCommand(new Command2DCSender(message), cmdwithargsString)) + message.reply("Unknown command. Do " + DiscordPlugin.getPrefix() + "help for help.\n" + cmdwithargsString); } catch (Exception e) { TBMCCoreAPI.SendException("Failed to process Discord command: " + cmdwithargsString, e); } @@ -61,18 +62,19 @@ public class CommandListener { private static boolean checkanddeletemention(StringBuilder cmdwithargs, String mention, IMessage message) { if (message.getContent().startsWith(mention)) // TODO: Resolve mentions: Compound arguments, either a mention or text - if (cmdwithargs.length() > mention.length() + 1) - cmdwithargs.delete(0, - cmdwithargs.charAt(mention.length()) == ' ' ? mention.length() + 1 : mention.length()); - else - cmdwithargs.replace(0, cmdwithargs.length(), "help"); + if (cmdwithargs.length() > mention.length() + 1) { + int x = mention.length(), px = x; + while ((x = cmdwithargs.indexOf(" ", px + 1)) != -1) //Removes any space before the command + px = x; + cmdwithargs.delete(0, px + 1); + cmdwithargs.insert(0, DiscordPlugin.getPrefix()); //Always use the prefix for processing + } else + cmdwithargs.replace(0, cmdwithargs.length(), DiscordPlugin.getPrefix() + "help"); else { - if (cmdwithargs.length() > 0 && cmdwithargs.charAt(0) == '/') - cmdwithargs.deleteCharAt(0); //Don't treat / as mention, mentions can be used in public mcchat - return false; + return false; //Don't treat / as mention, mentions can be used in public mcchat } if (cmdwithargs.length() == 0) - cmdwithargs.replace(0, cmdwithargs.length(), "help"); + cmdwithargs.replace(0, cmdwithargs.length(), DiscordPlugin.getPrefix() + "help"); return true; } }