From 2500572e0d688bab4aee8091b199d366ca623ad7 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Wed, 24 Apr 2019 17:50:13 +0200 Subject: [PATCH] Even more refactoring --- .../discordplugin/mcchat/MCChatListener.java | 22 +++---- .../discordplugin/mcchat/MCChatPrivate.java | 1 + .../discordplugin/mcchat/MCChatUtils.java | 37 ++++++------ .../discordplugin/mcchat/MCListener.java | 60 +++++++++---------- 4 files changed, 54 insertions(+), 66 deletions(-) diff --git a/src/main/java/buttondevteam/discordplugin/mcchat/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/mcchat/MCChatListener.java index ee2a6fb..550e9df 100755 --- a/src/main/java/buttondevteam/discordplugin/mcchat/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/mcchat/MCChatListener.java @@ -18,6 +18,7 @@ import discord4j.core.event.domain.message.MessageCreateEvent; import discord4j.core.object.entity.MessageChannel; import discord4j.core.object.entity.PrivateChannel; import discord4j.core.object.entity.TextChannel; +import discord4j.core.object.entity.User; import discord4j.core.spec.EmbedCreateSpec; import lombok.val; import org.bukkit.Bukkit; @@ -25,14 +26,6 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.scheduler.BukkitTask; -import sx.blah.discord.api.internal.json.objects.EmbedObject; -import sx.blah.discord.handle.impl.events.guild.channel.message.MessageReceivedEvent; -import sx.blah.discord.handle.obj.User; -import sx.blah.discord.handle.obj.Message; -import sx.blah.discord.handle.obj.MessageChannel; -import sx.blah.discord.util.DiscordException; -import sx.blah.discord.util.EmbedBuilder; -import sx.blah.discord.util.MissingPermissionsException; import java.awt.*; import java.time.Instant; @@ -265,22 +258,21 @@ public class MCChatListener implements Listener { } private void processDiscordToMC() { - @val - sx.blah.discord.handle.impl.events.guild.channel.message.MessageReceivedEvent event; + MessageCreateEvent event; try { event = recevents.take(); } catch (InterruptedException e1) { rectask.cancel(); return; } - val sender = event.getMessage().getAuthor(); - String dmessage = event.getMessage().getContent(); + val sender = event.getMessage().getAuthor().orElse(null); + String dmessage = event.getMessage().getContent().orElse(""); try { - final DiscordSenderBase dsender = MCChatUtils.getSender(event.getMessage().getChannel(), sender); + final DiscordSenderBase dsender = MCChatUtils.getSender(event.getMessage().getChannelId(), sender); val user = dsender.getChromaUser(); - for (User u : event.getMessage().getMentions()) { - dmessage = dmessage.replace(u.mention(false), "@" + u.getName()); // TODO: IG Formatting + for (User u : event.getMessage().getUserMentions()) { //TODO: Role mentions + dmessage = dmessage.replace(u.me(false), "@" + u.getName()); // TODO: IG Formatting final String nick = u.getNicknameForGuild(DiscordPlugin.mainServer); dmessage = dmessage.replace(u.mention(true), "@" + (nick != null ? nick : u.getName())); } diff --git a/src/main/java/buttondevteam/discordplugin/mcchat/MCChatPrivate.java b/src/main/java/buttondevteam/discordplugin/mcchat/MCChatPrivate.java index 3c6c893..e706a68 100644 --- a/src/main/java/buttondevteam/discordplugin/mcchat/MCChatPrivate.java +++ b/src/main/java/buttondevteam/discordplugin/mcchat/MCChatPrivate.java @@ -4,6 +4,7 @@ import buttondevteam.discordplugin.DiscordConnectedPlayer; import buttondevteam.discordplugin.DiscordPlayer; import buttondevteam.discordplugin.DiscordPlugin; import buttondevteam.lib.player.TBMCPlayer; +import discord4j.core.object.entity.MessageChannel; import lombok.val; import org.bukkit.Bukkit; import org.bukkit.event.Event; diff --git a/src/main/java/buttondevteam/discordplugin/mcchat/MCChatUtils.java b/src/main/java/buttondevteam/discordplugin/mcchat/MCChatUtils.java index 2b08093..6ee9292 100644 --- a/src/main/java/buttondevteam/discordplugin/mcchat/MCChatUtils.java +++ b/src/main/java/buttondevteam/discordplugin/mcchat/MCChatUtils.java @@ -1,14 +1,11 @@ package buttondevteam.discordplugin.mcchat; import buttondevteam.core.ComponentManager; -import buttondevteam.core.component.channel.Channel; import buttondevteam.discordplugin.*; import buttondevteam.discordplugin.broadcaster.GeneralEventBroadcasterModule; import buttondevteam.lib.TBMCSystemChatEvent; -import discord4j.core.object.entity.Message; -import discord4j.core.object.entity.MessageChannel; -import discord4j.core.object.entity.TextChannel; -import discord4j.core.object.entity.User; +import discord4j.core.object.entity.*; +import discord4j.core.object.util.Snowflake; import io.netty.util.collection.LongObjectHashMap; import lombok.RequiredArgsConstructor; import lombok.experimental.var; @@ -35,12 +32,12 @@ public class MCChatUtils { /** * May contain P<DiscordID> as key for public chat */ - public static final HashMap> UnconnectedSenders = new HashMap<>(); - public static final HashMap> ConnectedSenders = new HashMap<>(); + public static final HashMap> UnconnectedSenders = new HashMap<>(); + public static final HashMap> ConnectedSenders = new HashMap<>(); /** * May contain P<DiscordID> as key for public chat */ - public static final HashMap> OnlineSenders = new HashMap<>(); + public static final HashMap> OnlineSenders = new HashMap<>(); static @Nullable LastMsgData lastmsgdata; static LongObjectHashMap lastmsgfromd = new LongObjectHashMap<>(); // Last message sent by a Discord user, used for clearing checkmarks private static MinecraftChatModule module; @@ -76,31 +73,31 @@ public class MCChatUtils { lmd.channel.edit(tce -> tce.setTopic(String.join("\n----\n", s)).setReason("Player list update")).subscribe(); //Don't wait } - public static T addSender(HashMap> senders, + public static T addSender(HashMap> senders, User user, T sender) { return addSender(senders, user.getId().asString(), sender); } - public static T addSender(HashMap> senders, + public static T addSender(HashMap> senders, String did, T sender) { var map = senders.get(did); if (map == null) map = new HashMap<>(); - map.put(sender.getChannel(), sender); + map.put(sender.getChannel().getId(), sender); senders.put(did, map); return sender; } - public static T getSender(HashMap> senders, - MessageChannel channel, User user) { + public static T getSender(HashMap> senders, + Snowflake channel, User user) { var map = senders.get(user.getId().asString()); if (map != null) return map.get(channel); return null; } - public static T removeSender(HashMap> senders, - Channel channel, User user) { + public static T removeSender(HashMap> senders, + Snowflake channel, User user) { var map = senders.get(user.getId().asString()); if (map != null) return map.remove(channel); @@ -176,7 +173,7 @@ public class MCChatUtils { if (event.getChannel().isGlobal()) action.accept(module.chatChannel().get()); for (LastMsgData data : MCChatPrivate.lastmsgPerUser) - if (event.shouldSendTo(getSender(data.channel, data.user))) + if (event.shouldSendTo(getSender(data.channel.getId(), data.user))) action.accept(data.channel); MCChatCustom.lastmsgCustom.stream().filter(clmd -> { if (!clmd.brtoggles.contains(event.getTarget())) @@ -188,14 +185,14 @@ public class MCChatUtils { /** * This method will find the best sender to use: if the player is online, use that, if not but connected then use that etc. */ - static DiscordSenderBase getSender(MessageChannel channel, final User author) { + static DiscordSenderBase getSender(Snowflake channel, final User author) { //noinspection OptionalGetWithoutIsPresent return Stream.>>of( // https://stackoverflow.com/a/28833677/2703239 () -> Optional.ofNullable(getSender(OnlineSenders, channel, author)), // Find first non-null () -> Optional.ofNullable(getSender(ConnectedSenders, channel, author)), // This doesn't support the public chat, but it'll always return null for it () -> Optional.ofNullable(getSender(UnconnectedSenders, channel, author)), // () -> Optional.of(addSender(UnconnectedSenders, author, - new DiscordSender(author, channel)))).map(Supplier::get).filter(Optional::isPresent).map(Optional::get).findFirst().get(); + new DiscordSender(author, (MessageChannel) DiscordPlugin.dc.getChannelById(channel).block())))).map(Supplier::get).filter(Optional::isPresent).map(Optional::get).findFirst().get(); } /** @@ -207,11 +204,11 @@ public class MCChatUtils { public static void resetLastMessage(Channel channel) { if (notEnabled()) return; if (channel.getId().asLong() == module.chatChannel().get().getId().asLong()) { - (lastmsgdata == null ? lastmsgdata = new LastMsgData(module.chatChannel().get(), null) + (lastmsgdata == null ? lastmsgdata = new LastMsgData((TextChannel) module.chatChannel().get(), null) : lastmsgdata).message = null; return; } // Don't set the whole object to null, the player and channel information should be preserved - for (LastMsgData data : channel.isPrivate() ? MCChatPrivate.lastmsgPerUser : MCChatCustom.lastmsgCustom) { + for (LastMsgData data : channel instanceof PrivateChannel ? MCChatPrivate.lastmsgPerUser : MCChatCustom.lastmsgCustom) { if (data.channel.getId().asLong() == channel.getId().asLong()) { data.message = null; return; diff --git a/src/main/java/buttondevteam/discordplugin/mcchat/MCListener.java b/src/main/java/buttondevteam/discordplugin/mcchat/MCListener.java index 3c2cf40..d4b6891 100644 --- a/src/main/java/buttondevteam/discordplugin/mcchat/MCListener.java +++ b/src/main/java/buttondevteam/discordplugin/mcchat/MCListener.java @@ -6,6 +6,9 @@ import buttondevteam.lib.TBMCSystemChatEvent; import buttondevteam.lib.architecture.ConfigData; import buttondevteam.lib.player.*; import com.earth2me.essentials.CommandSource; +import discord4j.core.object.entity.Role; +import discord4j.core.object.entity.User; +import discord4j.core.object.util.Snowflake; import lombok.RequiredArgsConstructor; import lombok.val; import net.ess3.api.events.AfkStatusChangeEvent; @@ -23,10 +26,9 @@ 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.User; -import sx.blah.discord.util.DiscordException; -import sx.blah.discord.util.MissingPermissionsException; +import reactor.core.publisher.Mono; + +import java.util.Objects; @RequiredArgsConstructor class MCListener implements Listener { @@ -49,9 +51,9 @@ class MCListener implements Listener { final Player p = e.getPlayer(); DiscordPlayer dp = e.GetPlayer().getAs(DiscordPlayer.class); if (dp != null) { - val user = DiscordPlugin.dc.getUserByID(Long.parseLong(dp.getDiscordID())); + val user = DiscordPlugin.dc.getUserById(Snowflake.of(dp.getDiscordID())).block(); MCChatUtils.addSender(MCChatUtils.OnlineSenders, dp.getDiscordID(), - new DiscordPlayerSender(user, user.getOrCreatePMChannel(), p)); + new DiscordPlayerSender(user, Objects.requireNonNull(user).getPrivateChannel().block(), p)); MCChatUtils.addSender(MCChatUtils.OnlineSenders, dp.getDiscordID(), new DiscordPlayerSender(user, module.chatChannel().get(), p)); //Stored per-channel } @@ -99,38 +101,34 @@ class MCListener implements Listener { MCChatUtils.forAllowedCustomAndAllMCChat(MCChatUtils.send(msg), base, ChannelconBroadcast.AFK, false); } - private ConfigData muteRole() { + private ConfigData muteRole() { return DPUtils.roleData(module.getConfig(), "muteRole", "Muted"); } @EventHandler public void onPlayerMute(MuteStatusChangeEvent e) { - try { - DPUtils.performNoWait(() -> { - final IRole role = muteRole().get(); - if (role == null) return; - 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 User user = DiscordPlugin.dc.getUserByID( - Long.parseLong(p.getDiscordID())); + final Role role = muteRole().get(); + if (role == null) return; + 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; + DiscordPlugin.dc.getUserById(Snowflake.of(p.getDiscordID())) + .flatMap(user -> user.asMember(DiscordPlugin.mainServer.getId())) + .flatMap(user -> { if (e.getValue()) - user.addRole(role); + user.addRole(role.getId()); else - user.removeRole(role); + user.removeRole(role.getId()); val modlog = module.modlogChannel().get(); - String msg = (e.getValue() ? "M" : "Unm") + "uted user: " + user.getName(); - if (modlog != null) - DiscordPlugin.sendMessageToChannel(modlog, msg); + String msg = (e.getValue() ? "M" : "Unm") + "uted user: " + user.getUsername() + "#" + user.getDiscriminator(); DPUtils.getLogger().info(msg); - }); - } catch (DiscordException | MissingPermissionsException ex) { - TBMCCoreAPI.SendException("Failed to give/take Muted role to player " + e.getAffected().getName() + "!", - ex); - } + if (modlog != null) + return modlog.createMessage(msg); + return Mono.empty(); + }).subscribe(); } @EventHandler @@ -148,8 +146,8 @@ class MCListener implements Listener { String name = event.getSender() instanceof Player ? ((Player) event.getSender()).getDisplayName() : event.getSender().getName(); //Channel channel = ChromaGamerBase.getFromSender(event.getSender()).channel().get(); - TODO - val yeehaw = DiscordPlugin.mainServer.getEmojiByName("YEEHAW"); - MCChatUtils.forAllMCChat(MCChatUtils.send(name + (yeehaw != null ? " <:YEEHAW:" + yeehaw.getId().asString() + ">s" : " YEEHAWs"))); + DiscordPlugin.mainServer.getEmojis().filter(e -> "YEEHAW".equals(e.getName())).subscribe(yeehaw -> + MCChatUtils.forAllMCChat(MCChatUtils.send(name + (yeehaw != null ? " <:YEEHAW:" + yeehaw.getId().asString() + ">s" : " YEEHAWs")))); } @EventHandler