From 6e619f659f436719a057d36942829e3bcdb9ed77 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Tue, 15 Aug 2017 03:05:38 +0200 Subject: [PATCH] Bunch of fixes! - Fixed fake user name, some plugins depend on MC name - Players will need to relog into mcchat if their name changed - Fixed join-while-mcchat in ButtonCore - Fixed Discord->MC messages showing up in inccorect places on Discord - Fixed chat channel feedback - Other fixes --- .../discordplugin/DiscordConnectedPlayer.java | 4 +- .../listeners/MCChatListener.java | 47 +++++++++++++------ .../playerfaker/DiscordFakePlayer.java | 9 ++-- 3 files changed, 39 insertions(+), 21 deletions(-) diff --git a/src/main/java/buttondevteam/discordplugin/DiscordConnectedPlayer.java b/src/main/java/buttondevteam/discordplugin/DiscordConnectedPlayer.java index c10f13b..ef91b16 100644 --- a/src/main/java/buttondevteam/discordplugin/DiscordConnectedPlayer.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordConnectedPlayer.java @@ -12,8 +12,8 @@ public class DiscordConnectedPlayer extends DiscordFakePlayer implements IMCPlay private static int nextEntityId = 10000; private @Getter VanillaCommandListener vanillaCmdListener; - public DiscordConnectedPlayer(IUser user, IChannel channel, UUID uuid) { - super(user, channel, nextEntityId++, uuid); + public DiscordConnectedPlayer(IUser user, IChannel channel, UUID uuid, String mcname) { + super(user, channel, nextEntityId++, uuid, mcname); vanillaCmdListener = new VanillaCommandListener<>(this); } diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index 8a95071..0fcd327 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -20,6 +20,7 @@ import buttondevteam.lib.chat.Channel; import buttondevteam.lib.chat.ChatRoom; import buttondevteam.lib.chat.TBMCChatAPI; import buttondevteam.lib.player.TBMCPlayer; +import lombok.RequiredArgsConstructor; import lombok.val; import sx.blah.discord.api.events.IListener; import sx.blah.discord.api.internal.json.objects.EmbedObject; @@ -32,8 +33,6 @@ public class MCChatListener implements Listener, IListener public void onMCChat(TBMCChatEvent e) { if (e.isCancelled()) return; - if (e.getSender() instanceof DiscordSender || e.getSender() instanceof DiscordPlayerSender) - return; Bukkit.getScheduler().runTaskAsynchronously(DiscordPlugin.plugin, () -> { synchronized (this) { final String authorPlayer = DiscordPlugin.sanitizeString(e.getSender() instanceof Player // @@ -46,6 +45,10 @@ public class MCChatListener implements Listener, IListener embed.withAuthorIcon("https://minotar.net/avatar/" + ((Player) e.getSender()).getName() + "/32.png") .withAuthorUrl("https://tbmcplugins.github.io/profile.html?type=minecraft&id=" + ((Player) e.getSender()).getUniqueId()); // TODO: Constant/method to get URLs like this + else if (e.getSender() instanceof DiscordSenderBase) + embed.withAuthorIcon(((DiscordSenderBase) e.getSender()).getUser().getAvatarURL()) + .withAuthorUrl("https://tbmcplugins.github.io/profile.html?type=discord&id=" + + ((DiscordSenderBase) e.getSender()).getUser().getStringID()); // TODO: Constant/method to get URLs like this final long nanoTime = System.nanoTime(); Consumer doit = lastmsgdata -> { final EmbedObject embedObject = embed.build(); @@ -69,30 +72,37 @@ public class MCChatListener implements Listener, IListener TBMCCoreAPI.SendException("An error occured while editing chat message!", e1); } }; - if (e.getChannel().equals(Channel.GlobalChat)) + Predicate isdifferentchannel = ch -> !(e.getSender() instanceof DiscordSenderBase) + || ((DiscordSenderBase) e.getSender()).getChannel().getLongID() != ch.getLongID(); + + if (e.getChannel().equals(Channel.GlobalChat) && isdifferentchannel.test(DiscordPlugin.chatchannel)) doit.accept(lastmsgdata == null ? lastmsgdata = new LastMsgData(DiscordPlugin.chatchannel, null, null) : lastmsgdata); for (LastMsgData data : lastmsgPerUser) { - if (data.dp.isMinecraftChatEnabled() && e.shouldSendTo(getSender(data.channel, data.user, data.dp))) + // System.out.println("Data: " + data); + // System.out.println("Data.channel: " + data.channel); + // System.out.println("Sender: " + e.getSender()); + // System.out.println("Sender channel: " + ((DiscordSenderBase) e.getSender()).getChannel()); // TODO + // System.out.println("Predicate: " + isdifferentchannel); + // System.out.println("DP: " + data.dp); - Didn't update the constructor + if (data.dp.isMinecraftChatEnabled() && isdifferentchannel.test(data.channel) + && e.shouldSendTo(getSender(data.channel, data.user, data.dp))) doit.accept(data); } } }); } + @RequiredArgsConstructor private static class LastMsgData { public IMessage message; public long time; public String content; - public IChannel channel; + public final IChannel channel; public Channel mcchannel; - public IUser user; - public DiscordPlayer dp; - - public LastMsgData(IChannel channel, IUser user, DiscordPlayer dp) { - this.channel = channel; - } + public final IUser user; + public final DiscordPlayer dp; } @EventHandler @@ -131,8 +141,9 @@ public class MCChatListener implements Listener, IListener TBMCPlayer mcp = dp.getAs(TBMCPlayer.class); if (mcp != null) { // If the accounts aren't connected, can't make a connected sender val p = Bukkit.getPlayer(mcp.getUUID()); + val op = Bukkit.getOfflinePlayer(mcp.getUUID()); if (start) { - val sender = new DiscordConnectedPlayer(user, channel, mcp.getUUID()); + val sender = new DiscordConnectedPlayer(user, channel, mcp.getUUID(), op.getName()); ConnectedSenders.put(user.getStringID(), sender); if (p == null)// Player is offline - If the player is online, that takes precedence MCListener.callEventExcluding(new PlayerJoinEvent(sender, ""), "ProtocolLib"); @@ -227,6 +238,8 @@ public class MCChatListener implements Listener, IListener .getAttachments().stream().map(a -> a.getUrl()).collect(Collectors.joining("\n")) : "")); + boolean react = false; + if (dmessage.startsWith("/")) { // Ingame command DiscordPlugin.perform(() -> { if (!event.getMessage().isDeleted() && !event.getChannel().isPrivate()) @@ -276,8 +289,10 @@ public class MCChatListener implements Listener, IListener ((ChatRoom) chc).joinRoom(dsender); dsender.sendMessage("You're now talking in: " + DiscordPlugin.sanitizeString(dsender.getMcchannel().DisplayName)); - } else // Send single message + } else { // Send single message sendChatMessage.accept(chc, cmd.substring(spi + 1)); + react = true; + } } } } @@ -286,8 +301,12 @@ public class MCChatListener implements Listener, IListener if (dmessage.length() == 0 && event.getMessage().getAttachments().size() == 0 && !event.getChannel().isPrivate()) TBMCChatAPI.SendChatMessage(Channel.GlobalChat, dsender, "pinned a message on Discord."); // TODO: Not chat message - else + else { sendChatMessage.accept(dsender.getMcchannel(), dmessage); + react = true; + } + } + if (react) { event.getMessage().getChannel().getMessageHistory().stream().forEach(m -> { try { final IReaction reaction = m.getReactionByUnicode(DiscordPlugin.DELIVERED_REACTION); diff --git a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java index 69e8126..8943970 100644 --- a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java +++ b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java @@ -16,22 +16,21 @@ import org.bukkit.scoreboard.Scoreboard; import buttondevteam.discordplugin.DiscordPlugin; import lombok.experimental.Delegate; +import lombok.Getter; import sx.blah.discord.handle.obj.IChannel; import sx.blah.discord.handle.obj.IUser; public class DiscordFakePlayer extends DiscordHumanEntity implements Player { - protected DiscordFakePlayer(IUser user, IChannel channel, int entityId, UUID uuid) { + protected DiscordFakePlayer(IUser user, IChannel channel, int entityId, UUID uuid, String mcname) { super(user, channel, entityId, uuid); perm = new PermissibleBase(Bukkit.getOfflinePlayer(uuid)); + name = mcname; } @Delegate private PermissibleBase perm; - @Override - public String getName() { - return user.getName(); - } + private @Getter String name; @Override public EntityType getType() {