From b396ec47b4292eee3b8a27026eb484d6bbf338eb Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sat, 11 May 2019 00:15:50 +0200 Subject: [PATCH] Some fixes, some debugging #93 --- pom.xml | 1 + .../listeners/CommandListener.java | 71 +++++++++---------- .../listeners/CommonListeners.java | 48 ++++++------- .../discordplugin/mcchat/MCChatListener.java | 67 +++++++++-------- 4 files changed, 87 insertions(+), 100 deletions(-) diff --git a/pom.xml b/pom.xml index 9e2d7cf..1d5288e 100755 --- a/pom.xml +++ b/pom.xml @@ -68,6 +68,7 @@ net.ess3:Essentials + true diff --git a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java index 744e189..40b6efd 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java @@ -9,6 +9,9 @@ import discord4j.core.object.entity.MessageChannel; import discord4j.core.object.entity.PrivateChannel; import discord4j.core.object.entity.Role; import lombok.val; +import reactor.core.publisher.Mono; + +import java.util.concurrent.atomic.AtomicBoolean; public class CommandListener { /** @@ -16,54 +19,44 @@ public class CommandListener { * * @param message The Discord message * @param mentionedonly Only run the command if ChromaBot is mentioned at the start of the message - * @return Whether it ran the command + * @return Whether it did not run the command */ - public static boolean runCommand(Message message, boolean mentionedonly) { + public static Mono runCommand(Message message, MessageChannel channel, boolean mentionedonly) { + Mono ret = Mono.just(true); if (!message.getContent().isPresent()) - return false; //Pin messages and such, let the mcchat listener deal with it - System.out.println("1"); - final MessageChannel channel = message.getChannel().block(); - System.out.println("2"); + return ret; //Pin messages and such, let the mcchat listener deal with it val content = message.getContent().get(); - if (channel == null) return false; + Mono tmp = ret; if (!mentionedonly) { //mentionedonly conditions are in CommonListeners if (!(channel instanceof PrivateChannel) && !(content.charAt(0) == DiscordPlugin.getPrefix() && channel.getId().asString().equals(DiscordPlugin.plugin.CommandChannel().get().asString()))) // - return false; - channel.type().subscribe(); // Fun + return ret; + tmp = ret.then(channel.type()); // Fun } - System.out.println("3"); final StringBuilder cmdwithargs = new StringBuilder(content); - val self = DiscordPlugin.dc.getSelf().block(); - System.out.println("4"); - if (self == null) return false; - val member = self.asMember(DiscordPlugin.mainServer.getId()).block(); - System.out.println("5"); - if (member == null) return false; - final String mention = self.getMention(); - final String mentionNick = member.getNicknameMention(); - System.out.println("6"); - boolean gotmention = checkanddeletemention(cmdwithargs, mention, message); - gotmention = checkanddeletemention(cmdwithargs, mentionNick, message) || gotmention; - System.out.println("7"); - val mentions = message.getRoleMentions(); - for (String mentionRole : member.getRoles().filter(r -> mentions.any(rr -> rr.getName().equals(r.getName())).blockOptional().orElse(false)).map(Role::getMention).toIterable()) - gotmention = checkanddeletemention(cmdwithargs, mentionRole, message) || gotmention; // Delete all mentions - if (mentionedonly && !gotmention) - return false; - System.out.println("8"); - channel.type().subscribe(); - String cmdwithargsString = cmdwithargs.toString(); - System.out.println("9"); - try { - if (!DiscordPlugin.plugin.getManager().handleCommand(new Command2DCSender(message), cmdwithargsString)) - DPUtils.reply(message, channel, "Unknown command. Do " + DiscordPlugin.getPrefix() + "help for help.\n" + cmdwithargsString).subscribe(); - } catch (Exception e) { - TBMCCoreAPI.SendException("Failed to process Discord command: " + cmdwithargsString, e); - } - System.out.println("10"); - return true; + val gotmention = new AtomicBoolean(); + return tmp.flatMapMany(x -> + DiscordPlugin.dc.getSelf().flatMap(self -> self.asMember(DiscordPlugin.mainServer.getId())) + .flatMapMany(self -> { + gotmention.set(checkanddeletemention(cmdwithargs, self.getMention(), message)); + gotmention.set(checkanddeletemention(cmdwithargs, self.getNicknameMention(), message) || gotmention.get()); + val mentions = message.getRoleMentions(); + return self.getRoles().filterWhen(r -> mentions.any(rr -> rr.getName().equals(r.getName()))) + .map(Role::getMention); + }).map(mentionRole -> { + gotmention.set(checkanddeletemention(cmdwithargs, mentionRole, message) || gotmention.get()); // Delete all mentions + return !mentionedonly || gotmention.get(); //Stops here if false + })).filter(b -> b).last(false).flatMap(b -> channel.type()).flatMap(v -> { + String cmdwithargsString = cmdwithargs.toString(); + try { + if (!DiscordPlugin.plugin.getManager().handleCommand(new Command2DCSender(message), cmdwithargsString)) + return DPUtils.reply(message, channel, "Unknown command. Do " + DiscordPlugin.getPrefix() + "help for help.\n" + cmdwithargsString); + } catch (Exception e) { + TBMCCoreAPI.SendException("Failed to process Discord command: " + cmdwithargsString, e); + } + return Mono.empty(); + }).map(m -> false).defaultIfEmpty(true); } private static boolean checkanddeletemention(StringBuilder cmdwithargs, String mention, Message message) { diff --git a/src/main/java/buttondevteam/discordplugin/listeners/CommonListeners.java b/src/main/java/buttondevteam/discordplugin/listeners/CommonListeners.java index 2d1c546..886d7c7 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/CommonListeners.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/CommonListeners.java @@ -14,6 +14,7 @@ import discord4j.core.event.domain.role.RoleCreateEvent; import discord4j.core.event.domain.role.RoleDeleteEvent; import discord4j.core.event.domain.role.RoleUpdateEvent; import lombok.val; +import reactor.core.publisher.Mono; public class CommonListeners { @@ -27,39 +28,31 @@ public class CommonListeners { - CommandListener (with the correct prefix in #bot, or in private) */ public static void register(EventDispatcher dispatcher) { - dispatcher.on(MessageCreateEvent.class).subscribe(event -> { + dispatcher.on(MessageCreateEvent.class).flatMap(event -> { + val def = Mono.empty(); if (DiscordPlugin.SafeMode) - return; + return def; val author = event.getMessage().getAuthor(); if (!author.isPresent() || author.get().isBot()) - return; + return def; //System.out.println("Author: "+author.get()); //System.out.println("Bot: "+author.get().isBot()); - System.out.println("A"); if (FunModule.executeMemes(event.getMessage())) - return; - System.out.println("B"); - try { - boolean handled = false; - val commandChannel = DiscordPlugin.plugin.CommandChannel().get(); - System.out.println("C"); - if ((commandChannel != null && event.getMessage().getChannelId().asLong() == commandChannel.asLong()) //If mentioned, that's higher than chat - || event.getMessage().getContent().orElse("").contains("channelcon")) //Only 'channelcon' is allowed in other channels - handled = CommandListener.runCommand(event.getMessage(), true); //#bot is handled here - System.out.println("D"); - if (handled) return; - //System.out.println("Message handling"); - val mcchat = Component.getComponents().get(MinecraftChatModule.class); - if (mcchat != null && mcchat.isEnabled()) //ComponentManager.isEnabled() searches the component again - handled = ((MinecraftChatModule) mcchat).getListener().handleDiscord(event); //Also runs Discord commands in chat channels - System.out.println("E"); - if (!handled) - handled = CommandListener.runCommand(event.getMessage(), false); - System.out.println("F"); - } catch (Exception e) { - TBMCCoreAPI.SendException("An error occured while handling a message!", e); - } - }); + return def; + val commandChannel = DiscordPlugin.plugin.CommandChannel().get(); + val commandCh = DPUtils.getMessageChannel(DiscordPlugin.plugin.CommandChannel()); + return commandCh.filter(ch -> (commandChannel != null && event.getMessage().getChannelId().asLong() == commandChannel.asLong()) //If mentioned, that's higher than chat + || event.getMessage().getContent().orElse("").contains("channelcon")) //Only 'channelcon' is allowed in other channels + .filterWhen(ch -> { //Only continue if this doesn't handle the event + return CommandListener.runCommand(event.getMessage(), ch, true); //#bot is handled here + }).filterWhen(ch -> { + val mcchat = Component.getComponents().get(MinecraftChatModule.class); + if (mcchat != null && mcchat.isEnabled()) //ComponentManager.isEnabled() searches the component again + return ((MinecraftChatModule) mcchat).getListener().handleDiscord(event); //Also runs Discord commands in chat channels + return Mono.empty(); //Wasn't handled, continue + }).filterWhen(ch -> CommandListener.runCommand(event.getMessage(), ch, false)); + }).onErrorContinue((err, obj) -> TBMCCoreAPI.SendException("An error occured while handling a message!", err)) + .subscribe(); /*dispatcher.on(MessageCreateEvent.class).doOnNext(x -> System.out.println("Got message")) .flatMap(MessageCreateEvent::getGuild) .flatMap(guild -> DiscordPlugin.dc.getSelf()) @@ -73,6 +66,7 @@ public class CommonListeners { dispatcher.on(RoleCreateEvent.class).subscribe(GameRoleModule::handleRoleEvent); dispatcher.on(RoleDeleteEvent.class).subscribe(GameRoleModule::handleRoleEvent); dispatcher.on(RoleUpdateEvent.class).subscribe(GameRoleModule::handleRoleEvent); + } private static boolean debug = false; diff --git a/src/main/java/buttondevteam/discordplugin/mcchat/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/mcchat/MCChatListener.java index 71a1b9e..ccb41b8 100755 --- a/src/main/java/buttondevteam/discordplugin/mcchat/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/mcchat/MCChatListener.java @@ -25,6 +25,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.scheduler.BukkitTask; +import reactor.core.publisher.Mono; import java.awt.*; import java.time.Instant; @@ -217,44 +218,42 @@ public class MCChatListener implements Listener { private static Thread recthread; // Discord - public boolean handleDiscord(MessageCreateEvent ev) { + public Mono handleDiscord(MessageCreateEvent ev) { + val ret = Mono.just(true); if (!ComponentManager.isEnabled(MinecraftChatModule.class)) - return false; + return ret; System.out.println("Chat event"); val author = ev.getMessage().getAuthor(); final boolean hasCustomChat = MCChatCustom.hasCustomChat(ev.getMessage().getChannelId()); - System.out.println("C1"); - val channel = ev.getMessage().getChannel().block(); - System.out.println("C2"); - if (ev.getMessage().getChannelId().asLong() != module.chatChannel().get().asLong() - && !(channel instanceof PrivateChannel - && author.map(u -> MCChatPrivate.isMinecraftChatEnabled(u.getId().asString())).orElse(false) - && !hasCustomChat)) - return false; //Chat isn't enabled on this channel - System.out.println("C3"); - if (channel instanceof PrivateChannel //Only in private chat - && ev.getMessage().getContent().isPresent() - && ev.getMessage().getContent().get().length() < "/mcchat<>".length() - && ev.getMessage().getContent().get().replace("/", "") - .equalsIgnoreCase("mcchat")) //Either mcchat or /mcchat - return false; //Allow disabling the chat if needed - System.out.println("C4"); - if (CommandListener.runCommand(ev.getMessage(), true)) - return true; //Allow running commands in chat channels - System.out.println("C5"); - MCChatUtils.resetLastMessage(channel); - //System.out.println("Message: "+ev.getMessage().getAuthor().toString()); - recevents.add(ev); - if (rectask != null) - return true; - recrun = () -> { //Don't return in a while loop next time - recthread = Thread.currentThread(); - processDiscordToMC(); - if (DiscordPlugin.plugin.isEnabled()) //Don't run again if shutting down - rectask = Bukkit.getScheduler().runTaskAsynchronously(DiscordPlugin.plugin, recrun); //Continue message processing - }; - rectask = Bukkit.getScheduler().runTaskAsynchronously(DiscordPlugin.plugin, recrun); //Start message processing - return true; + return ev.getMessage().getChannel().filter(channel -> { + return !(ev.getMessage().getChannelId().asLong() != module.chatChannel().get().asLong() + && !(channel instanceof PrivateChannel + && author.map(u -> MCChatPrivate.isMinecraftChatEnabled(u.getId().asString())).orElse(false) + && !hasCustomChat)); //Chat isn't enabled on this channel + }).filter(channel -> { + return !(channel instanceof PrivateChannel //Only in private chat + && ev.getMessage().getContent().isPresent() + && ev.getMessage().getContent().get().length() < "/mcchat<>".length() + && ev.getMessage().getContent().get().replace("/", "") + .equalsIgnoreCase("mcchat")); //Either mcchat or /mcchat + //Allow disabling the chat if needed + }).filterWhen(channel -> CommandListener.runCommand(ev.getMessage(), channel, true)) + //Allow running commands in chat channels + .filter(channel -> { + MCChatUtils.resetLastMessage(channel); + recevents.add(ev); + System.out.println("Message event added"); + if (rectask != null) + return true; + recrun = () -> { //Don't return in a while loop next time + recthread = Thread.currentThread(); + processDiscordToMC(); + if (DiscordPlugin.plugin.isEnabled()) //Don't run again if shutting down + rectask = Bukkit.getScheduler().runTaskAsynchronously(DiscordPlugin.plugin, recrun); //Continue message processing + }; + rectask = Bukkit.getScheduler().runTaskAsynchronously(DiscordPlugin.plugin, recrun); //Start message processing + return true; + }).map(b -> false).defaultIfEmpty(true); } private void processDiscordToMC() {