diff --git a/src/main/java/buttondevteam/discordplugin/ChannelconBroadcast.java b/src/main/java/buttondevteam/discordplugin/ChannelconBroadcast.java index aa06d43..e5187e2 100644 --- a/src/main/java/buttondevteam/discordplugin/ChannelconBroadcast.java +++ b/src/main/java/buttondevteam/discordplugin/ChannelconBroadcast.java @@ -3,5 +3,13 @@ package buttondevteam.discordplugin; public enum ChannelconBroadcast { JOINLEAVE, AFK, - RESTART + RESTART, //TODO + DEATH, + BROADCAST; + + public final int flag; + + ChannelconBroadcast() { + this.flag = 1 << this.ordinal(); + } } diff --git a/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java b/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java index 783651c..daf8e5b 100644 --- a/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java @@ -53,6 +53,17 @@ public class ChannelconCommand extends DiscordCommandBase { return true; } //TODO: Toggle that toggle + val cc = MCChatListener.getCustomChat(message.getChannel()); + //A B | F + //------- A: original - B: mask - F: new + //0 0 | 0 + //0 1 | 1 + //1 0 | 1 + //1 1 | 0 + // XOR + cc.toggles ^= b.get().flag; + message.reply("'" + b.get().toString().toLowerCase() + "' " + ((cc.toggles & b.get().flag) == 0 ? "disabled" : "enabled")); + return true; } message.reply("this channel is already connected to a Minecraft channel. Use `@ChromaBot channelcon remove` to remove it."); return true; diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index d1838be..d94b32a 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -33,6 +33,7 @@ import sx.blah.discord.util.DiscordException; import sx.blah.discord.util.EmbedBuilder; import sx.blah.discord.util.MissingPermissionsException; +import javax.annotation.Nullable; import java.awt.*; import java.time.Instant; import java.util.*; @@ -173,6 +174,7 @@ public class MCChatListener implements Listener, IListener public final String groupID; public final Channel mcchannel; public final DiscordConnectedPlayer dcp; + public int toggles; public CustomLMD(@NonNull IChannel channel, @NonNull IUser user, @NonNull DiscordPlayer dp, @NonNull String groupid, @NonNull Channel mcchannel, @NonNull DiscordConnectedPlayer dcp) { @@ -367,9 +369,20 @@ public class MCChatListener implements Listener, IListener lastmsgCustom.forEach(cc -> action.accept(cc.channel)); } - public static void forAllowedCustomMCChat(Consumer action, CommandSender sender) { + /** + * Do the {@code action} for each custom chat the {@code sender} have access to and has that broadcast type enabled. + * + * @param action The action to do + * @param sender The sender to check perms of or null to send to all that has it toggled + * @param toggle The toggle to check or null to send to all allowed + */ + public static void forAllowedCustomMCChat(Consumer action, @Nullable CommandSender sender, @Nullable ChannelconBroadcast toggle) { lastmsgCustom.stream().filter(clmd -> { //new TBMCChannelConnectFakeEvent(sender, clmd.mcchannel).shouldSendTo(clmd.dcp) - Thought it was this simple hehe - Wait, it *should* be this simple + if (toggle != null && (clmd.toggles & toggle.flag) == 0) + return false; //If null then allow + if (sender == null) + return true; val e = new TBMCChannelConnectFakeEvent(sender, clmd.mcchannel); return clmd.groupID.equals(e.getGroupID(sender)); }).forEach(cc -> action.accept(cc.channel)); //TODO: Use getScore and getGroupID in fake event constructor - This should also send error messages on channel connect diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java index d6e64e3..9d5cdb0 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java @@ -65,7 +65,7 @@ public class MCListener implements Listener { final String message = e.GetPlayer().PlayerName().get() + " joined the game"; if (!DiscordPlugin.hooked) MCChatListener.sendSystemMessageToChat(message); - MCChatListener.forAllowedCustomMCChat(ch -> DiscordPlugin.sendMessageToChannel(ch, message), e.getPlayer()); + MCChatListener.forAllowedCustomMCChat(ch -> DiscordPlugin.sendMessageToChannel(ch, message), e.getPlayer(), ChannelconBroadcast.JOINLEAVE); //System.out.println("Does this appear more than once?"); //No MCChatListener.ListC = 0; ChromaBot.getInstance().updatePlayerList(); @@ -87,7 +87,7 @@ public class MCListener implements Listener { final String message = e.GetPlayer().PlayerName().get() + " left the game"; if (!DiscordPlugin.hooked) MCChatListener.sendSystemMessageToChat(message); //TODO: Probably double sends if kicked and unhooked - MCChatListener.forAllowedCustomMCChat(ch -> DiscordPlugin.sendMessageToChannel(ch, message), e.getPlayer()); + MCChatListener.forAllowedCustomMCChat(ch -> DiscordPlugin.sendMessageToChannel(ch, message), e.getPlayer(), ChannelconBroadcast.JOINLEAVE); } @EventHandler(priority = EventPriority.HIGHEST) @@ -115,14 +115,18 @@ public class MCListener implements Listener { public void onPlayerDeath(PlayerDeathEvent e) { if (!DiscordPlugin.hooked) MCChatListener.sendSystemMessageToChat(e.getDeathMessage()); + MCChatListener.forAllowedCustomMCChat(ch -> DiscordPlugin.sendMessageToChannel(ch, e.getDeathMessage()), e.getEntity(), ChannelconBroadcast.DEATH); } @EventHandler public void onPlayerAFK(AfkStatusChangeEvent e) { //TODO: Add AFK to custom chats? - if (e.isCancelled() || !e.getAffected().getBase().isOnline()) + final Player base = e.getAffected().getBase(); + if (e.isCancelled() || !base.isOnline()) return; - MCChatListener.sendSystemMessageToChat(e.getAffected().getBase().getDisplayName() - + " is " + (e.getValue() ? "now" : "no longer") + " AFK."); + final String msg = base.getDisplayName() + + " is " + (e.getValue() ? "now" : "no longer") + " AFK."; + MCChatListener.sendSystemMessageToChat(msg); + MCChatListener.forAllowedCustomMCChat(ch -> DiscordPlugin.sendMessageToChannel(ch, msg), base, ChannelconBroadcast.AFK); } @EventHandler @@ -155,11 +159,13 @@ public class MCListener implements Listener { @EventHandler public void onChatSystemMessage(TBMCSystemChatEvent event) { MCChatListener.sendSystemMessageToChat(event); + MCChatListener.forAllowedCustomMCChat(ch -> DiscordPlugin.sendMessageToChannel(ch, event.getMessage()), null, ChannelconBroadcast.BROADCAST); //TODO: Method to send message } @EventHandler public void onBroadcastMessage(BroadcastMessageEvent event) { MCChatListener.sendSystemMessageToChat(event.getMessage()); + MCChatListener.forAllowedCustomMCChat(ch -> DiscordPlugin.sendMessageToChannel(ch, event.getMessage()), null, ChannelconBroadcast.BROADCAST); } /*@EventHandler