diff --git a/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java b/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java index a018a1e..c89baab 100644 --- a/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java @@ -3,6 +3,7 @@ package buttondevteam.discordplugin.commands; import buttondevteam.discordplugin.ChannelconBroadcast; import buttondevteam.discordplugin.DiscordConnectedPlayer; import buttondevteam.discordplugin.DiscordPlayer; +import buttondevteam.discordplugin.DiscordPlugin; import buttondevteam.discordplugin.mcchat.MCChatCustom; import buttondevteam.lib.chat.Channel; import buttondevteam.lib.player.TBMCPlayer; @@ -99,10 +100,12 @@ public class ChannelconCommand extends DiscordCommandBase { "---- Channel connect ---", // "This command allows you to connect a Minecraft channel to a Discord channel (just like how the global chat is connected to #minecraft-chat).", // "You need to have access to the MC channel and have manage permissions on the Discord channel.", // - "You also need to have your Minecraft account connected. In #bot use /connect .", // - "Call this command from the channel you want to use. Usage: @ChromaBot channelcon ", // + "You also need to have your Minecraft account connected. In #bot use " + DiscordPlugin.getPrefix() + "connect .", // + "Call this command from the channel you want to use.", // + "Usage: @" + DiscordPlugin.dc.getOurUser().getName() + " channelcon ", // + "Use the ID (command) of the channel, for example `g` for the global chat.", // "To remove a connection use @ChromaBot channelcon remove in the channel.", // - "Mentioning the bot is needed in this case because the / prefix only works in #bot.", // + "Mentioning the bot is needed in this case because the " + DiscordPlugin.getPrefix() + " prefix only works in #bot.", // "Invite link: " // }; } diff --git a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java index d1d9386..85f0fd4 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java @@ -15,17 +15,13 @@ public class CommandListener { */ public static boolean runCommand(IMessage message, boolean mentionedonly) { final IChannel channel = message.getChannel(); - if (mentionedonly) { - if (!channel.getStringID().equals(DiscordPlugin.botchannel.getStringID()) - && !message.getContent().contains("channelcon")) //Allow channelcon in other servers - return false; //Private chat is handled without mentions - } else { + if (!mentionedonly) { //mentionedonly conditions are in CommonListeners if (!message.getChannel().isPrivate() - && !(message.getContent().startsWith("/") + && !(message.getContent().charAt(0) == DiscordPlugin.getPrefix() && channel.getStringID().equals(DiscordPlugin.botchannel.getStringID()))) // return false; + message.getChannel().setTypingStatus(true); // Fun } - message.getChannel().setTypingStatus(true); // Fun final StringBuilder cmdwithargs = new StringBuilder(message.getContent()); final String mention = DiscordPlugin.dc.getOurUser().mention(false); final String mentionNick = DiscordPlugin.dc.getOurUser().mention(true); diff --git a/src/main/java/buttondevteam/discordplugin/listeners/CommonListeners.java b/src/main/java/buttondevteam/discordplugin/listeners/CommonListeners.java index 92cf74b..7cc3dcc 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/CommonListeners.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/CommonListeners.java @@ -7,7 +7,6 @@ import buttondevteam.lib.architecture.Component; import lombok.val; import org.bukkit.Bukkit; import sx.blah.discord.api.events.IListener; -import sx.blah.discord.handle.impl.events.guild.channel.message.MentionEvent; import sx.blah.discord.handle.impl.events.guild.channel.message.MessageReceivedEvent; import sx.blah.discord.handle.impl.events.guild.role.RoleCreateEvent; import sx.blah.discord.handle.impl.events.guild.role.RoleDeleteEvent; @@ -41,23 +40,15 @@ public class CommonListeners { /* MentionEvent: - - CommandListener (starts with mention, in #bot unless 'channelcon') + - CommandListener (starts with mention, only 'channelcon' and not in #bot) MessageReceivedEvent: + - v CommandListener (starts with mention, in #bot or a connected chat) - Minecraft chat (is enabled in the channel and message isn't [/]mcchat) - CommandListener (with the correct prefix in #bot, or in private) */ public static IListener[] getListeners() { - return new IListener[]{new IListener() { - @Override - public void handle(MentionEvent event) { - if (DiscordPlugin.SafeMode) - return; - if (event.getMessage().getAuthor().isBot()) - return; - CommandListener.runCommand(event.getMessage(), true); - } - }, new IListener() { + return new IListener[]{new IListener() { @Override public void handle(MessageReceivedEvent event) { if (DiscordPlugin.SafeMode) @@ -65,9 +56,13 @@ public class CommonListeners { if (event.getMessage().getAuthor().isBot()) return; boolean handled = false; + if (event.getChannel().getLongID() == DiscordPlugin.botchannel.getLongID() //If mentioned, that's higher than chat + || event.getMessage().getContent().contains("channelcon")) //Only 'channelcon' is allowed in other channels + handled = CommandListener.runCommand(event.getMessage(), true); //#bot is handled here + if (handled) return; val mcchat = Component.getComponents().get(MinecraftChatModule.class); - if (mcchat != null && mcchat.isEnabled()) - handled = ((MinecraftChatModule) mcchat).getListener().handleDiscord(event); + if (mcchat != null && mcchat.isEnabled()) //ComponentManager.isEnabled() searches the component again + handled = ((MinecraftChatModule) mcchat).getListener().handleDiscord(event); //Also runs Discord commands in chat channels if (!handled) handled = CommandListener.runCommand(event.getMessage(), false); } diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java index a01e727..b36414d 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java @@ -1,34 +1,19 @@ package buttondevteam.discordplugin.listeners; -import buttondevteam.discordplugin.ChannelconBroadcast; -import buttondevteam.discordplugin.DPUtils; import buttondevteam.discordplugin.DiscordPlayer; import buttondevteam.discordplugin.DiscordPlugin; -import buttondevteam.discordplugin.mcchat.MCChatUtils; -import buttondevteam.lib.TBMCCoreAPI; -import buttondevteam.lib.TBMCSystemChatEvent; -import buttondevteam.lib.player.TBMCPlayer; -import buttondevteam.lib.player.TBMCPlayerBase; import buttondevteam.lib.player.TBMCPlayerGetInfoEvent; -import buttondevteam.lib.player.TBMCYEEHAWEvent; -import com.earth2me.essentials.CommandSource; import lombok.val; -import net.ess3.api.events.MuteStatusChangeEvent; import org.bukkit.Bukkit; -import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.EventHandler; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; -import org.bukkit.event.server.BroadcastMessageEvent; import org.bukkit.event.server.ServerCommandEvent; import org.bukkit.plugin.AuthorNagException; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.RegisteredListener; -import sx.blah.discord.handle.obj.IRole; import sx.blah.discord.handle.obj.IUser; -import sx.blah.discord.util.DiscordException; -import sx.blah.discord.util.MissingPermissionsException; import java.util.Arrays; import java.util.logging.Level; @@ -53,49 +38,6 @@ public class MCListener implements Listener { DiscordPlugin.Restart = !e.getCommand().equalsIgnoreCase("stop"); // The variable is always true except if stopped } - @EventHandler - public void onPlayerMute(MuteStatusChangeEvent e) { - try { - DPUtils.performNoWait(() -> { - final IRole role = DiscordPlugin.dc.getRoleByID(164090010461667328L); - final CommandSource source = e.getAffected().getSource(); - if (!source.isPlayer()) - return; - final DiscordPlayer p = TBMCPlayerBase.getPlayer(source.getPlayer().getUniqueId(), TBMCPlayer.class) - .getAs(DiscordPlayer.class); - if (p == null) return; - final IUser user = DiscordPlugin.dc.getUserByID( - Long.parseLong(p.getDiscordID())); - if (e.getValue()) - user.addRole(role); - else - user.removeRole(role); - DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, (e.getValue() ? "M" : "Unm") + "uted user: " + user.getName()); - }); - } catch (DiscordException | MissingPermissionsException ex) { - TBMCCoreAPI.SendException("Failed to give/take Muted role to player " + e.getAffected().getName() + "!", - ex); - } - } - - @EventHandler - public void onChatSystemMessage(TBMCSystemChatEvent event) { - MCChatUtils.forAllowedMCChat(MCChatUtils.send(event.getMessage()), event); - } - - @EventHandler - public void onBroadcastMessage(BroadcastMessageEvent event) { - MCChatUtils.forCustomAndAllMCChat(MCChatUtils.send(event.getMessage()), ChannelconBroadcast.BROADCAST, false); - } - - @EventHandler - public void onYEEHAW(TBMCYEEHAWEvent event) { //TODO: Inherit from the chat event base to have channel support - String name = event.getSender() instanceof Player ? ((Player) event.getSender()).getDisplayName() - : event.getSender().getName(); - //Channel channel = ChromaGamerBase.getFromSender(event.getSender()).channel().get(); - TODO - MCChatUtils.forAllMCChat(MCChatUtils.send(name + " <:YEEHAW:" + DiscordPlugin.mainServer.getEmojiByName("YEEHAW").getStringID() + ">s")); - } - private static final String[] EXCLUDED_PLUGINS = {"ProtocolLib", "LibsDisguises"}; public static void callEventExcludingSome(Event event) { diff --git a/src/main/java/buttondevteam/discordplugin/mcchat/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/mcchat/MCChatListener.java index 67c7b0a..98eb523 100755 --- a/src/main/java/buttondevteam/discordplugin/mcchat/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/mcchat/MCChatListener.java @@ -5,6 +5,7 @@ import buttondevteam.discordplugin.DPUtils; import buttondevteam.discordplugin.DiscordPlugin; import buttondevteam.discordplugin.DiscordSender; import buttondevteam.discordplugin.DiscordSenderBase; +import buttondevteam.discordplugin.listeners.CommandListener; import buttondevteam.discordplugin.playerfaker.VanillaCommandListener; import buttondevteam.lib.TBMCChatEvent; import buttondevteam.lib.TBMCChatPreprocessEvent; @@ -243,6 +244,8 @@ public class MCChatListener implements Listener { && ev.getMessage().getContent().replace("/", "") .equalsIgnoreCase("mcchat")) //Either mcchat or /mcchat return false; //Allow disabling the chat if needed + if (CommandListener.runCommand(ev.getMessage(), true)) + return true; //Allow running commands in chat channels MCChatUtils.resetLastMessage(ev.getChannel()); lastlist++; recevents.add(ev); diff --git a/src/main/java/buttondevteam/discordplugin/mcchat/MCChatPrivate.java b/src/main/java/buttondevteam/discordplugin/mcchat/MCChatPrivate.java index 5edcfa0..8356b44 100644 --- a/src/main/java/buttondevteam/discordplugin/mcchat/MCChatPrivate.java +++ b/src/main/java/buttondevteam/discordplugin/mcchat/MCChatPrivate.java @@ -13,6 +13,8 @@ import sx.blah.discord.handle.obj.IUser; import java.util.ArrayList; +import static buttondevteam.discordplugin.listeners.MCListener.callEventExcludingSome; + public class MCChatPrivate { /** @@ -29,11 +31,11 @@ public class MCChatPrivate { val sender = new DiscordConnectedPlayer(user, channel, mcp.getUUID(), op.getName()); MCChatUtils.addSender(MCChatUtils.ConnectedSenders, user, sender); if (p == null)// Player is offline - If the player is online, that takes precedence - MCListener.callEventExcludingSome(new PlayerJoinEvent(sender, "")); + callEventExcludingSome(new PlayerJoinEvent(sender, "")); } else { val sender = MCChatUtils.removeSender(MCChatUtils.ConnectedSenders, channel, user); if (p == null)// Player is offline - If the player is online, that takes precedence - MCListener.callEventExcludingSome(new PlayerQuitEvent(sender, "")); + callEventExcludingSome(new PlayerQuitEvent(sender, "")); } } if (!start) @@ -55,7 +57,7 @@ public class MCChatPrivate { public static void logoutAll() { for (val entry : MCChatUtils.ConnectedSenders.entrySet()) for (val valueEntry : entry.getValue().entrySet()) - MCListener.callEventExcludingSome(new PlayerQuitEvent(valueEntry.getValue(), "")); + callEventExcludingSome(new PlayerQuitEvent(valueEntry.getValue(), "")); MCChatUtils.ConnectedSenders.clear(); } } diff --git a/src/main/java/buttondevteam/discordplugin/mcchat/MCChatUtils.java b/src/main/java/buttondevteam/discordplugin/mcchat/MCChatUtils.java index cb476a2..6826f6e 100644 --- a/src/main/java/buttondevteam/discordplugin/mcchat/MCChatUtils.java +++ b/src/main/java/buttondevteam/discordplugin/mcchat/MCChatUtils.java @@ -50,7 +50,7 @@ public class MCChatUtils { private static void updatePL(LastMsgData lmd) { String topic = lmd.channel.getTopic(); - if (topic.length() == 0) + if (topic == null || topic.length() == 0) topic = ".\n----\nMinecraft chat\n----\n."; String[] s = topic.split("\\n----\\n"); if (s.length < 3) diff --git a/src/main/java/buttondevteam/discordplugin/mcchat/MCListener.java b/src/main/java/buttondevteam/discordplugin/mcchat/MCListener.java index 9b419e9..2e2d089 100644 --- a/src/main/java/buttondevteam/discordplugin/mcchat/MCListener.java +++ b/src/main/java/buttondevteam/discordplugin/mcchat/MCListener.java @@ -2,12 +2,13 @@ package buttondevteam.discordplugin.mcchat; import buttondevteam.discordplugin.*; import buttondevteam.discordplugin.commands.ConnectCommand; +import buttondevteam.lib.TBMCCoreAPI; import buttondevteam.lib.TBMCSystemChatEvent; -import buttondevteam.lib.player.TBMCPlayerJoinEvent; -import buttondevteam.lib.player.TBMCPlayerQuitEvent; -import buttondevteam.lib.player.TBMCYEEHAWEvent; +import buttondevteam.lib.player.*; +import com.earth2me.essentials.CommandSource; import lombok.val; import net.ess3.api.events.AfkStatusChangeEvent; +import net.ess3.api.events.MuteStatusChangeEvent; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -20,7 +21,10 @@ import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerLoginEvent.Result; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.server.BroadcastMessageEvent; +import sx.blah.discord.handle.obj.IRole; import sx.blah.discord.handle.obj.IUser; +import sx.blah.discord.util.DiscordException; +import sx.blah.discord.util.MissingPermissionsException; class MCListener implements Listener { @EventHandler(priority = EventPriority.HIGHEST) @@ -98,6 +102,31 @@ class MCListener implements Listener { MCChatUtils.forAllowedCustomAndAllMCChat(MCChatUtils.send(msg), base, ChannelconBroadcast.AFK, false); } + @EventHandler + public void onPlayerMute(MuteStatusChangeEvent e) { + try { + DPUtils.performNoWait(() -> { + final IRole role = DiscordPlugin.dc.getRoleByID(164090010461667328L); + final CommandSource source = e.getAffected().getSource(); + if (!source.isPlayer()) + return; + final DiscordPlayer p = TBMCPlayerBase.getPlayer(source.getPlayer().getUniqueId(), TBMCPlayer.class) + .getAs(DiscordPlayer.class); + if (p == null) return; + final IUser user = DiscordPlugin.dc.getUserByID( + Long.parseLong(p.getDiscordID())); + if (e.getValue()) + user.addRole(role); + else + user.removeRole(role); + DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, (e.getValue() ? "M" : "Unm") + "uted user: " + user.getName()); + }); + } catch (DiscordException | MissingPermissionsException ex) { + TBMCCoreAPI.SendException("Failed to give/take Muted role to player " + e.getAffected().getName() + "!", + ex); + } + } + @EventHandler public void onChatSystemMessage(TBMCSystemChatEvent event) { MCChatUtils.forAllowedMCChat(MCChatUtils.send(event.getMessage()), event);