From 20b9d6947b64dcb0e3697043894775dcf455b65c Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sun, 6 May 2018 00:57:41 +0200 Subject: [PATCH 01/11] Channel cmds, game role detection - Add channel handling - Add autodetect of game roles -- Announces adding/removing/changing them --- TODO --- .../discordplugin/DiscordPlugin.java | 8 ++-- .../discordplugin/commands/RoleCommand.java | 29 +-------------- .../listeners/CommandListener.java | 24 ++++++++++-- .../listeners/MCChatListener.java | 37 +++++++++++++++++++ 4 files changed, 64 insertions(+), 34 deletions(-) diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java index 5e1d8dc..c2972fa 100644 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java @@ -30,7 +30,6 @@ import sx.blah.discord.util.RequestBuffer; import java.awt.*; import java.io.File; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -60,7 +59,6 @@ public class DiscordPlugin extends JavaPlugin implements IListener { plugin = this; lastannouncementtime = getConfig().getLong("lastannouncementtime"); lastseentime = getConfig().getLong("lastseentime"); - GameRoles = (List) getConfig().getList("gameroles", new ArrayList()); ClientBuilder cb = new ClientBuilder(); cb.withToken(Files.readFirstLine(new File("TBMC", "Token.txt"), StandardCharsets.UTF_8)); dc = cb.login(); @@ -77,6 +75,7 @@ public class DiscordPlugin extends JavaPlugin implements IListener { public static IChannel genchannel; public static IChannel chatchannel; public static IChannel botroomchannel; + public static IChannel modlogchannel; /** * Don't send messages, just receive, the same channel is used when testing */ @@ -109,6 +108,7 @@ public class DiscordPlugin extends JavaPlugin implements IListener { officechannel = devServer.getChannelByID(219626707458457603L); // developers-office updatechannel = devServer.getChannelByID(233724163519414272L); // server-updates devofficechannel = officechannel; // developers-office + modlogchannel = mainServer.getChannelByID(283840717275791360L); // modlog dc.changePresence(StatusType.ONLINE, ActivityType.PLAYING, "Chromacraft"); } else { botchannel = devServer.getChannelByID(239519012529111040L); // bot-room @@ -119,6 +119,7 @@ public class DiscordPlugin extends JavaPlugin implements IListener { officechannel = devServer.getChannelByID(219626707458457603L); // developers-office updatechannel = botchannel; devofficechannel = botchannel;// bot-room + modlogchannel = botchannel; // bot-room dc.changePresence(StatusType.ONLINE, ActivityType.PLAYING, "testing"); } if (botchannel == null || annchannel == null || genchannel == null || botroomchannel == null @@ -129,6 +130,8 @@ public class DiscordPlugin extends JavaPlugin implements IListener { task.cancel(); if (!sent) { new ChromaBot(this).updatePlayerList(); + //Get all roles with the default color + GameRoles = mainServer.getRoles().stream().filter(r -> r.getColor().getAlpha() == 0).map(IRole::getName).collect(Collectors.toList()); if (getConfig().getBoolean("serverup", false)) { ChromaBot.getInstance().sendMessage("", new EmbedBuilder().withColor(Color.YELLOW) .withTitle("Server recovered from a crash - chat connected.").build()); @@ -211,7 +214,6 @@ public class DiscordPlugin extends JavaPlugin implements IListener { MCListener.callEventExcludingSome(new PlayerQuitEvent(entry.getValue(), "")); getConfig().set("lastannouncementtime", lastannouncementtime); getConfig().set("lastseentime", lastseentime); - getConfig().set("gameroles", GameRoles); getConfig().set("serverup", false); saveConfig(); MCChatListener.forAllMCChat(ch -> DiscordPlugin.sendMessageToChannelWait(ch, "", diff --git a/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java b/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java index f1cf584..f6e229c 100644 --- a/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java @@ -6,7 +6,6 @@ import buttondevteam.lib.TBMCCoreAPI; import sx.blah.discord.handle.obj.IMessage; import sx.blah.discord.handle.obj.IRole; -import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -50,33 +49,7 @@ public class RoleCommand extends DiscordCommandBase { } else if (argsa[0].equalsIgnoreCase("list")) { DiscordPlugin.sendMessageToChannel(message.getChannel(), "List of game roles:\n" + DiscordPlugin.GameRoles.stream().collect(Collectors.joining("\n"))); - } else if (argsa[0].equalsIgnoreCase("admin") && argsa.length > 1 && argsa[1].equalsIgnoreCase("addrole")) { - if (message.getAuthor().getRolesForGuild(DiscordPlugin.mainServer).stream() - .noneMatch(r -> r.getLongID() == 126030201472811008L)) { - DiscordPlugin.sendMessageToChannel(message.getChannel(), - "You need to be a moderator to use this command."); - return; - } - if (argsa.length < 3) { - DiscordPlugin.sendMessageToChannel(message.getChannel(), - "Add a role to the game role list.\nUsage: " + argsa[0] + " "); - return; - } - String rolename = Arrays.stream(argsa).skip(2).collect(Collectors.joining(" ")); - final List roles = (TBMCCoreAPI.IsTestServer() ? DiscordPlugin.devServer : DiscordPlugin.mainServer) - .getRolesByName(rolename); - if (roles.size() == 0) { - DiscordPlugin.sendMessageToChannel(message.getChannel(), "That role cannot be found on Discord."); - return; - } - if (roles.size() > 1) { - DiscordPlugin.sendMessageToChannel(message.getChannel(), - "There are more roles with this name. Why are there more roles with this name?"); - return; - } - DiscordPlugin.GameRoles.add(roles.get(0).getName()); - DiscordPlugin.sendMessageToChannel(message.getChannel(), "Game role added."); - } + } else DiscordPlugin.sendMessageToChannel(message.getChannel(), usagemsg); } private IRole checkAndGetRole(IMessage message, String[] argsa, String usage) { diff --git a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java index c4c9e33..5609fa9 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java @@ -5,9 +5,13 @@ import buttondevteam.discordplugin.DiscordPlugin; import buttondevteam.discordplugin.commands.DiscordCommandBase; import buttondevteam.lib.TBMCCoreAPI; 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; +import sx.blah.discord.handle.impl.events.guild.role.RoleUpdateEvent; import sx.blah.discord.handle.impl.events.user.PresenceUpdateEvent; import sx.blah.discord.handle.obj.IChannel; import sx.blah.discord.handle.obj.IMessage; @@ -108,9 +112,9 @@ public class CommandListener { if (event.getOldPresence().getStatus().equals(StatusType.OFFLINE) && !event.getNewPresence().getStatus().equals(StatusType.OFFLINE) && event.getUser().getRolesForGuild(DiscordPlugin.devServer).stream() - .anyMatch(r -> r.getLongID() == devrole.getLongID()) + .anyMatch(r -> r.getLongID() == devrole.getLongID()) && DiscordPlugin.devServer.getUsersByRole(devrole).stream() - .noneMatch(u -> u.getPresence().getStatus().equals(StatusType.OFFLINE)) + .noneMatch(u -> u.getPresence().getStatus().equals(StatusType.OFFLINE)) && lasttime + 10 < TimeUnit.NANOSECONDS.toHours(System.nanoTime()) && Calendar.getInstance().get(Calendar.DAY_OF_MONTH) % 5 == 0) { DiscordPlugin.sendMessageToChannel(DiscordPlugin.devofficechannel, "Full house!", @@ -121,7 +125,21 @@ public class CommandListener { lasttime = TimeUnit.NANOSECONDS.toHours(System.nanoTime()); } } - } }; + }, (IListener) event -> { + Bukkit.getScheduler().runTaskLaterAsynchronously(DiscordPlugin.plugin, () -> { + if (event.getRole().isDeleted() || event.getRole().getColor().getAlpha() != 0) + return; //Deleted or not a game role + DiscordPlugin.GameRoles.add(event.getRole().getName()); + DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Added " + event.getRole().getName() + " as game role. If you don't want this, change the role's color from the default."); + }, 100); + }, (IListener) event -> { + if (DiscordPlugin.GameRoles.remove(event.getRole().getName())) + DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Removed " + event.getRole().getName() + " as a game role."); + }, (IListener) event -> { + if (event.getNewRole().getColor().getAlpha() != 0 && DiscordPlugin.GameRoles.remove(event.getOldRole().getName())) + DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Removed " + event.getOldRole().getName() + " as a game role because it's color changed."); + //else if() - TODO + }}; } /** diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index df1bf12..1aca8e6 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -336,6 +336,7 @@ public class MCChatListener implements Listener, IListener if (!event.getMessage().isDeleted() && !event.getChannel().isPrivate()) event.getMessage().delete(); }); + preprocessChat(dsender, dmessage); final String cmd = dmessage.substring(1).toLowerCase(); if (dsender instanceof DiscordSender && Arrays.stream(UnconnectedCmds) .noneMatch(s -> cmd.equals(s) || cmd.startsWith(s + " "))) { @@ -426,6 +427,42 @@ public class MCChatListener implements Listener, IListener } } + private boolean preprocessChat(DiscordSenderBase dsender, String dmessage) { + if (dmessage.length() < 2) + return false; + int index = dmessage.indexOf(" "); + String cmd; + if (index == -1) { // Only the command is run + cmd = dmessage; + for (Channel channel : Channel.getChannels()) { + if (cmd.equalsIgnoreCase(channel.ID) || (channel.IDs != null && Arrays.stream(channel.IDs).anyMatch(cmd::equalsIgnoreCase))) { + Channel oldch = dsender.getMcchannel(); + if (oldch instanceof ChatRoom) + ((ChatRoom) oldch).leaveRoom(dsender); + if (oldch.equals(channel)) + dsender.setMcchannel(Channel.GlobalChat); + else { + dsender.setMcchannel(channel); + if (channel instanceof ChatRoom) + ((ChatRoom) channel).joinRoom(dsender); + } + dsender.sendMessage("You are now talking in: " + dsender.getMcchannel().DisplayName); + return true; + } + } + } else { // We have arguments + cmd = dmessage.substring(0, index); + for (Channel channel : Channel.getChannels()) { + if (cmd.equalsIgnoreCase(channel.ID) || (channel.IDs != null && Arrays.stream(channel.IDs).anyMatch(cmd::equalsIgnoreCase))) { + TBMCChatAPI.SendChatMessage(channel, dsender, dmessage.substring(index + 1)); + return true; + } + } + // TODO: Target selectors + } + return false; + } + /** * This method will find the best sender to use: if the player is online, use that, if not but connected then use that etc. */ From b60bf36864070bcff0e4a5391dfa3e771e56c76d Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Mon, 7 May 2018 01:11:08 +0200 Subject: [PATCH 02/11] Finished game roles Still needs testing Couldn't set GPG signing up - yet --- .gitignore | 0 .travis.yml | 0 License.md | 0 README.md | 0 deploy.sh | 0 pom.xml | 0 .../discordplugin/ChromaBot.java | 15 ++++--- .../buttondevteam/discordplugin/DPUtils.java | 0 .../discordplugin/DiscordConnectedPlayer.java | 4 +- .../discordplugin/DiscordPlayer.java | 0 .../discordplugin/DiscordPlayerSender.java | 20 ++++----- .../discordplugin/DiscordPlugin.java | 0 .../discordplugin/DiscordRunnable.java | 0 .../discordplugin/DiscordSender.java | 9 ++-- .../discordplugin/DiscordSenderBase.java | 11 +++-- .../discordplugin/DiscordSupplier.java | 0 .../discordplugin/IMCPlayer.java | 3 +- .../discordplugin/PlayerListWatcher.java | 41 ++++--------------- .../commands/ConnectCommand.java | 10 ++--- .../commands/DiscordCommandBase.java | 4 +- .../discordplugin/commands/HelpCommand.java | 6 +-- .../discordplugin/commands/MCChatCommand.java | 0 .../discordplugin/commands/RoleCommand.java | 2 +- .../commands/UserinfoCommand.java | 7 ++-- .../listeners/AutoUpdaterListener.java | 5 +-- .../listeners/CommandListener.java | 14 +++++-- .../listeners/DebugMessageListener.java | 4 +- .../listeners/ExceptionListener.java | 0 .../listeners/MCChatListener.java | 0 .../discordplugin/listeners/MCListener.java | 0 .../mccommands/AcceptMCCommand.java | 3 +- .../mccommands/DeclineMCCommand.java | 3 +- .../mccommands/DiscordMCCommandBase.java | 0 .../playerfaker/DiscordEntity.java | 11 +++-- .../playerfaker/DiscordFakePlayer.java | 16 ++++---- .../playerfaker/DiscordHumanEntity.java | 5 +-- .../playerfaker/DiscordInventory.java | 14 +++---- .../playerfaker/DiscordLivingEntity.java | 14 ++----- .../playerfaker/DiscordPlayerInventory.java | 0 .../playerfaker/VanillaCommandListener.java | 19 +++------ src/main/resources/plugin.yml | 0 .../buttondevteam/DiscordPlugin/AppTest.java | 0 42 files changed, 102 insertions(+), 138 deletions(-) mode change 100644 => 100755 .gitignore mode change 100644 => 100755 .travis.yml mode change 100644 => 100755 License.md mode change 100644 => 100755 README.md mode change 100644 => 100755 deploy.sh mode change 100644 => 100755 pom.xml mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/ChromaBot.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/DPUtils.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/DiscordConnectedPlayer.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/DiscordPlayer.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/DiscordPlayerSender.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/DiscordPlugin.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/DiscordRunnable.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/DiscordSender.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/DiscordSenderBase.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/DiscordSupplier.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/IMCPlayer.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/PlayerListWatcher.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/commands/ConnectCommand.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/commands/DiscordCommandBase.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/commands/HelpCommand.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/commands/UserinfoCommand.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/listeners/AutoUpdaterListener.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/listeners/DebugMessageListener.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/listeners/ExceptionListener.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/listeners/MCListener.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/mccommands/AcceptMCCommand.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/mccommands/DeclineMCCommand.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/mccommands/DiscordMCCommandBase.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/playerfaker/DiscordEntity.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/playerfaker/DiscordHumanEntity.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/playerfaker/DiscordInventory.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/playerfaker/DiscordLivingEntity.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/playerfaker/DiscordPlayerInventory.java mode change 100644 => 100755 src/main/java/buttondevteam/discordplugin/playerfaker/VanillaCommandListener.java mode change 100644 => 100755 src/main/resources/plugin.yml mode change 100644 => 100755 src/test/java/buttondevteam/DiscordPlugin/AppTest.java diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/.travis.yml b/.travis.yml old mode 100644 new mode 100755 diff --git a/License.md b/License.md old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/deploy.sh b/deploy.sh old mode 100644 new mode 100755 diff --git a/pom.xml b/pom.xml old mode 100644 new mode 100755 diff --git a/src/main/java/buttondevteam/discordplugin/ChromaBot.java b/src/main/java/buttondevteam/discordplugin/ChromaBot.java old mode 100644 new mode 100755 index 0a4507a..e67b431 --- a/src/main/java/buttondevteam/discordplugin/ChromaBot.java +++ b/src/main/java/buttondevteam/discordplugin/ChromaBot.java @@ -1,19 +1,18 @@ package buttondevteam.discordplugin; -import java.awt.Color; -import java.util.Arrays; -import java.util.stream.Collectors; - -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitScheduler; - import buttondevteam.discordplugin.listeners.MCChatListener; import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitScheduler; import sx.blah.discord.api.internal.json.objects.EmbedObject; import sx.blah.discord.handle.obj.IChannel; import sx.blah.discord.util.EmbedBuilder; +import java.awt.*; +import java.util.Arrays; +import java.util.stream.Collectors; + public class ChromaBot { /** * May be null if it's not initialized. Initialization happens after the server is done loading (using {@link BukkitScheduler#runTaskAsynchronously(org.bukkit.plugin.Plugin, Runnable)}) diff --git a/src/main/java/buttondevteam/discordplugin/DPUtils.java b/src/main/java/buttondevteam/discordplugin/DPUtils.java old mode 100644 new mode 100755 diff --git a/src/main/java/buttondevteam/discordplugin/DiscordConnectedPlayer.java b/src/main/java/buttondevteam/discordplugin/DiscordConnectedPlayer.java old mode 100644 new mode 100755 index ef91b16..f5b779f --- a/src/main/java/buttondevteam/discordplugin/DiscordConnectedPlayer.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordConnectedPlayer.java @@ -1,13 +1,13 @@ package buttondevteam.discordplugin; -import java.util.UUID; - import buttondevteam.discordplugin.playerfaker.DiscordFakePlayer; import buttondevteam.discordplugin.playerfaker.VanillaCommandListener; import lombok.Getter; import sx.blah.discord.handle.obj.IChannel; import sx.blah.discord.handle.obj.IUser; +import java.util.UUID; + public class DiscordConnectedPlayer extends DiscordFakePlayer implements IMCPlayer { private static int nextEntityId = 10000; private @Getter VanillaCommandListener vanillaCmdListener; diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlayer.java b/src/main/java/buttondevteam/discordplugin/DiscordPlayer.java old mode 100644 new mode 100755 diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlayerSender.java b/src/main/java/buttondevteam/discordplugin/DiscordPlayerSender.java old mode 100644 new mode 100755 index 97c3aef..2c10314 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlayerSender.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlayerSender.java @@ -1,13 +1,7 @@ package buttondevteam.discordplugin; -import java.net.InetSocketAddress; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; - +import buttondevteam.discordplugin.playerfaker.VanillaCommandListener; +import lombok.Getter; import org.bukkit.*; import org.bukkit.advancement.Advancement; import org.bukkit.advancement.AdvancementProgress; @@ -24,18 +18,20 @@ import org.bukkit.inventory.*; import org.bukkit.inventory.InventoryView.Property; import org.bukkit.map.MapView; import org.bukkit.metadata.MetadataValue; -import org.bukkit.permissions.*; +import org.bukkit.permissions.Permission; +import org.bukkit.permissions.PermissionAttachment; +import org.bukkit.permissions.PermissionAttachmentInfo; import org.bukkit.plugin.Plugin; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.scoreboard.Scoreboard; import org.bukkit.util.Vector; - -import buttondevteam.discordplugin.playerfaker.VanillaCommandListener; -import lombok.Getter; import sx.blah.discord.handle.obj.IChannel; import sx.blah.discord.handle.obj.IUser; +import java.net.InetSocketAddress; +import java.util.*; + @SuppressWarnings("deprecation") public class DiscordPlayerSender extends DiscordSenderBase implements IMCPlayer { diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java old mode 100644 new mode 100755 diff --git a/src/main/java/buttondevteam/discordplugin/DiscordRunnable.java b/src/main/java/buttondevteam/discordplugin/DiscordRunnable.java old mode 100644 new mode 100755 diff --git a/src/main/java/buttondevteam/discordplugin/DiscordSender.java b/src/main/java/buttondevteam/discordplugin/DiscordSender.java old mode 100644 new mode 100755 index 81a414b..f2f829b --- a/src/main/java/buttondevteam/discordplugin/DiscordSender.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordSender.java @@ -1,15 +1,18 @@ package buttondevteam.discordplugin; -import java.util.Set; import org.bukkit.Bukkit; import org.bukkit.Server; import org.bukkit.command.CommandSender; -import org.bukkit.permissions.*; +import org.bukkit.permissions.PermissibleBase; +import org.bukkit.permissions.Permission; +import org.bukkit.permissions.PermissionAttachment; +import org.bukkit.permissions.PermissionAttachmentInfo; import org.bukkit.plugin.Plugin; - import sx.blah.discord.handle.obj.IChannel; import sx.blah.discord.handle.obj.IUser; +import java.util.Set; + public class DiscordSender extends DiscordSenderBase implements CommandSender { private PermissibleBase perm = new PermissibleBase(this); diff --git a/src/main/java/buttondevteam/discordplugin/DiscordSenderBase.java b/src/main/java/buttondevteam/discordplugin/DiscordSenderBase.java old mode 100644 new mode 100755 index 6da2ff4..0a6e392 --- a/src/main/java/buttondevteam/discordplugin/DiscordSenderBase.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordSenderBase.java @@ -1,20 +1,19 @@ package buttondevteam.discordplugin; -import java.util.Arrays; -import java.util.stream.Collectors; - -import org.bukkit.Bukkit; -import org.bukkit.scheduler.BukkitTask; - import buttondevteam.lib.TBMCCoreAPI; import buttondevteam.lib.chat.Channel; import buttondevteam.lib.chat.IDiscordSender; import lombok.Getter; import lombok.NonNull; import lombok.Setter; +import org.bukkit.Bukkit; +import org.bukkit.scheduler.BukkitTask; import sx.blah.discord.handle.obj.IChannel; import sx.blah.discord.handle.obj.IUser; +import java.util.Arrays; +import java.util.stream.Collectors; + public abstract class DiscordSenderBase implements IDiscordSender { /** * May be null. diff --git a/src/main/java/buttondevteam/discordplugin/DiscordSupplier.java b/src/main/java/buttondevteam/discordplugin/DiscordSupplier.java old mode 100644 new mode 100755 diff --git a/src/main/java/buttondevteam/discordplugin/IMCPlayer.java b/src/main/java/buttondevteam/discordplugin/IMCPlayer.java old mode 100644 new mode 100755 index e52539d..854db2b --- a/src/main/java/buttondevteam/discordplugin/IMCPlayer.java +++ b/src/main/java/buttondevteam/discordplugin/IMCPlayer.java @@ -1,8 +1,7 @@ package buttondevteam.discordplugin; -import org.bukkit.entity.Player; - import buttondevteam.discordplugin.playerfaker.VanillaCommandListener; +import org.bukkit.entity.Player; public interface IMCPlayer> extends Player { VanillaCommandListener getVanillaCmdListener(); diff --git a/src/main/java/buttondevteam/discordplugin/PlayerListWatcher.java b/src/main/java/buttondevteam/discordplugin/PlayerListWatcher.java old mode 100644 new mode 100755 index 365e1be..e056737 --- a/src/main/java/buttondevteam/discordplugin/PlayerListWatcher.java +++ b/src/main/java/buttondevteam/discordplugin/PlayerListWatcher.java @@ -1,10 +1,10 @@ package buttondevteam.discordplugin; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.util.List; -import java.util.UUID; - +import buttondevteam.discordplugin.listeners.MCChatListener; +import buttondevteam.lib.TBMCCoreAPI; +import com.mojang.authlib.GameProfile; +import lombok.val; +import net.minecraft.server.v1_12_R1.*; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.craftbukkit.v1_12_R1.CraftServer; @@ -12,33 +12,10 @@ import org.bukkit.craftbukkit.v1_12_R1.util.CraftChatMessage; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; import org.objenesis.ObjenesisStd; -import com.mojang.authlib.GameProfile; - -import buttondevteam.discordplugin.listeners.MCChatListener; -import buttondevteam.lib.TBMCCoreAPI; -import lombok.val; -import net.minecraft.server.v1_12_R1.AdvancementDataPlayer; -import net.minecraft.server.v1_12_R1.ChatMessageType; -import net.minecraft.server.v1_12_R1.DedicatedPlayerList; -import net.minecraft.server.v1_12_R1.DedicatedServer; -import net.minecraft.server.v1_12_R1.Entity; -import net.minecraft.server.v1_12_R1.EntityHuman; -import net.minecraft.server.v1_12_R1.EntityPlayer; -import net.minecraft.server.v1_12_R1.GameProfileBanList; -import net.minecraft.server.v1_12_R1.IChatBaseComponent; -import net.minecraft.server.v1_12_R1.IpBanList; -import net.minecraft.server.v1_12_R1.LoginListener; -import net.minecraft.server.v1_12_R1.MinecraftServer; -import net.minecraft.server.v1_12_R1.NBTTagCompound; -import net.minecraft.server.v1_12_R1.NetworkManager; -import net.minecraft.server.v1_12_R1.OpList; -import net.minecraft.server.v1_12_R1.Packet; -import net.minecraft.server.v1_12_R1.PacketPlayOutChat; -import net.minecraft.server.v1_12_R1.ScoreboardServer; -import net.minecraft.server.v1_12_R1.ServerStatisticManager; -import net.minecraft.server.v1_12_R1.WhiteList; -import net.minecraft.server.v1_12_R1.World; -import net.minecraft.server.v1_12_R1.WorldServer; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.List; +import java.util.UUID; public class PlayerListWatcher extends DedicatedPlayerList { private DedicatedPlayerList plist; diff --git a/src/main/java/buttondevteam/discordplugin/commands/ConnectCommand.java b/src/main/java/buttondevteam/discordplugin/commands/ConnectCommand.java old mode 100644 new mode 100755 index 0eb837e..5a6f0f7 --- a/src/main/java/buttondevteam/discordplugin/commands/ConnectCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/ConnectCommand.java @@ -1,16 +1,14 @@ package buttondevteam.discordplugin.commands; -import org.bukkit.Bukkit; -import org.bukkit.OfflinePlayer; -import org.bukkit.entity.Player; - -import com.google.common.collect.HashBiMap; - import buttondevteam.discordplugin.DiscordPlayer; import buttondevteam.discordplugin.DiscordPlugin; import buttondevteam.lib.TBMCCoreAPI; import buttondevteam.lib.player.TBMCPlayer; import buttondevteam.lib.player.TBMCPlayerBase; +import com.google.common.collect.HashBiMap; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; import sx.blah.discord.handle.obj.IMessage; public class ConnectCommand extends DiscordCommandBase { diff --git a/src/main/java/buttondevteam/discordplugin/commands/DiscordCommandBase.java b/src/main/java/buttondevteam/discordplugin/commands/DiscordCommandBase.java old mode 100644 new mode 100755 index 2cfe732..f403b49 --- a/src/main/java/buttondevteam/discordplugin/commands/DiscordCommandBase.java +++ b/src/main/java/buttondevteam/discordplugin/commands/DiscordCommandBase.java @@ -1,11 +1,11 @@ package buttondevteam.discordplugin.commands; -import java.util.HashMap; - import buttondevteam.discordplugin.DiscordPlugin; import buttondevteam.lib.TBMCCoreAPI; import sx.blah.discord.handle.obj.IMessage; +import java.util.HashMap; + public abstract class DiscordCommandBase { public abstract String getCommandName(); diff --git a/src/main/java/buttondevteam/discordplugin/commands/HelpCommand.java b/src/main/java/buttondevteam/discordplugin/commands/HelpCommand.java old mode 100644 new mode 100755 index f4b1cb5..c7f468e --- a/src/main/java/buttondevteam/discordplugin/commands/HelpCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/HelpCommand.java @@ -1,11 +1,11 @@ package buttondevteam.discordplugin.commands; -import java.util.Arrays; -import java.util.stream.Collectors; - import buttondevteam.discordplugin.DiscordPlugin; import sx.blah.discord.handle.obj.IMessage; +import java.util.Arrays; +import java.util.stream.Collectors; + public class HelpCommand extends DiscordCommandBase { @Override diff --git a/src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java b/src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java old mode 100644 new mode 100755 diff --git a/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java b/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java old mode 100644 new mode 100755 index f6e229c..cf3d0c6 --- a/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java @@ -48,7 +48,7 @@ public class RoleCommand extends DiscordCommandBase { } } else if (argsa[0].equalsIgnoreCase("list")) { DiscordPlugin.sendMessageToChannel(message.getChannel(), - "List of game roles:\n" + DiscordPlugin.GameRoles.stream().collect(Collectors.joining("\n"))); + "List of game roles:\n" + DiscordPlugin.GameRoles.stream().sorted().collect(Collectors.joining("\n"))); } else DiscordPlugin.sendMessageToChannel(message.getChannel(), usagemsg); } diff --git a/src/main/java/buttondevteam/discordplugin/commands/UserinfoCommand.java b/src/main/java/buttondevteam/discordplugin/commands/UserinfoCommand.java old mode 100644 new mode 100755 index b5a7ad2..ee613e7 --- a/src/main/java/buttondevteam/discordplugin/commands/UserinfoCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/UserinfoCommand.java @@ -1,8 +1,5 @@ package buttondevteam.discordplugin.commands; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; import buttondevteam.discordplugin.DiscordPlayer; import buttondevteam.discordplugin.DiscordPlugin; import buttondevteam.lib.TBMCCoreAPI; @@ -11,6 +8,10 @@ import buttondevteam.lib.player.ChromaGamerBase.InfoTarget; import sx.blah.discord.handle.obj.IMessage; import sx.blah.discord.handle.obj.IUser; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + public class UserinfoCommand extends DiscordCommandBase { @Override diff --git a/src/main/java/buttondevteam/discordplugin/listeners/AutoUpdaterListener.java b/src/main/java/buttondevteam/discordplugin/listeners/AutoUpdaterListener.java old mode 100644 new mode 100755 index cc8593a..a6d0150 --- a/src/main/java/buttondevteam/discordplugin/listeners/AutoUpdaterListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/AutoUpdaterListener.java @@ -1,12 +1,11 @@ package buttondevteam.discordplugin.listeners; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; - import buttondevteam.discordplugin.DPUtils; import buttondevteam.discordplugin.DiscordPlugin; import buttondevteam.lib.PluginUpdater; import buttondevteam.lib.TBMCCoreAPI; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; public class AutoUpdaterListener implements Listener { @EventHandler diff --git a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java old mode 100644 new mode 100755 index 5609fa9..6fdd9b1 --- a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java @@ -135,10 +135,18 @@ public class CommandListener { }, (IListener) event -> { if (DiscordPlugin.GameRoles.remove(event.getRole().getName())) DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Removed " + event.getRole().getName() + " as a game role."); - }, (IListener) event -> { - if (event.getNewRole().getColor().getAlpha() != 0 && DiscordPlugin.GameRoles.remove(event.getOldRole().getName())) + }, (IListener) event -> { //Role update event + if (event.getNewRole().getColor().getAlpha() != 0) + if (DiscordPlugin.GameRoles.remove(event.getOldRole().getName())) DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Removed " + event.getOldRole().getName() + " as a game role because it's color changed."); - //else if() - TODO + else { + boolean removed = DiscordPlugin.GameRoles.remove(event.getOldRole().getName()); //Regardless of whether it was a game role + DiscordPlugin.GameRoles.add(event.getNewRole().getName()); //Add it because it has no color + if (removed) + DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Changed game role from " + event.getOldRole().getName() + " to " + event.getNewRole().getName() + "."); + else + DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Added " + event.getNewRole().getName() + " as game role because it has no color."); + } }}; } diff --git a/src/main/java/buttondevteam/discordplugin/listeners/DebugMessageListener.java b/src/main/java/buttondevteam/discordplugin/listeners/DebugMessageListener.java old mode 100644 new mode 100755 index 220ff45..1e163c4 --- a/src/main/java/buttondevteam/discordplugin/listeners/DebugMessageListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/DebugMessageListener.java @@ -1,9 +1,9 @@ package buttondevteam.discordplugin.listeners; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; import buttondevteam.discordplugin.DiscordPlugin; import buttondevteam.lib.TBMCDebugMessageEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; public class DebugMessageListener implements Listener{ @EventHandler diff --git a/src/main/java/buttondevteam/discordplugin/listeners/ExceptionListener.java b/src/main/java/buttondevteam/discordplugin/listeners/ExceptionListener.java old mode 100644 new mode 100755 diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java old mode 100644 new mode 100755 diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java old mode 100644 new mode 100755 diff --git a/src/main/java/buttondevteam/discordplugin/mccommands/AcceptMCCommand.java b/src/main/java/buttondevteam/discordplugin/mccommands/AcceptMCCommand.java old mode 100644 new mode 100755 index abe8723..dfe3d25 --- a/src/main/java/buttondevteam/discordplugin/mccommands/AcceptMCCommand.java +++ b/src/main/java/buttondevteam/discordplugin/mccommands/AcceptMCCommand.java @@ -1,7 +1,5 @@ package buttondevteam.discordplugin.mccommands; -import org.bukkit.entity.Player; - import buttondevteam.discordplugin.DiscordPlayer; import buttondevteam.discordplugin.commands.ConnectCommand; import buttondevteam.discordplugin.listeners.MCChatListener; @@ -9,6 +7,7 @@ import buttondevteam.lib.chat.CommandClass; import buttondevteam.lib.player.ChromaGamerBase; import buttondevteam.lib.player.TBMCPlayer; import buttondevteam.lib.player.TBMCPlayerBase; +import org.bukkit.entity.Player; @CommandClass(modOnly = false, path = "accept") public class AcceptMCCommand extends DiscordMCCommandBase { diff --git a/src/main/java/buttondevteam/discordplugin/mccommands/DeclineMCCommand.java b/src/main/java/buttondevteam/discordplugin/mccommands/DeclineMCCommand.java old mode 100644 new mode 100755 index 813cc3a..f3d0fc7 --- a/src/main/java/buttondevteam/discordplugin/mccommands/DeclineMCCommand.java +++ b/src/main/java/buttondevteam/discordplugin/mccommands/DeclineMCCommand.java @@ -1,9 +1,8 @@ package buttondevteam.discordplugin.mccommands; -import org.bukkit.entity.Player; - import buttondevteam.discordplugin.commands.ConnectCommand; import buttondevteam.lib.chat.CommandClass; +import org.bukkit.entity.Player; @CommandClass(modOnly = false, path = "decline") public class DeclineMCCommand extends DiscordMCCommandBase { diff --git a/src/main/java/buttondevteam/discordplugin/mccommands/DiscordMCCommandBase.java b/src/main/java/buttondevteam/discordplugin/mccommands/DiscordMCCommandBase.java old mode 100644 new mode 100755 diff --git a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordEntity.java b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordEntity.java old mode 100644 new mode 100755 index 7bdda8e..6ce85f8 --- a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordEntity.java +++ b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordEntity.java @@ -1,7 +1,8 @@ package buttondevteam.discordplugin.playerfaker; -import java.util.*; - +import buttondevteam.discordplugin.DiscordSenderBase; +import lombok.Getter; +import lombok.Setter; import org.bukkit.*; import org.bukkit.block.PistonMoveReaction; import org.bukkit.entity.Entity; @@ -10,13 +11,11 @@ import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; import org.bukkit.metadata.MetadataValue; import org.bukkit.plugin.Plugin; import org.bukkit.util.Vector; - -import buttondevteam.discordplugin.DiscordSenderBase; -import lombok.Getter; -import lombok.Setter; import sx.blah.discord.handle.obj.IChannel; import sx.blah.discord.handle.obj.IUser; +import java.util.*; + @Getter @Setter @SuppressWarnings("deprecated") diff --git a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java old mode 100644 new mode 100755 index 8943970..c5b2c5c --- a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java +++ b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java @@ -1,25 +1,27 @@ package buttondevteam.discordplugin.playerfaker; -import java.net.InetSocketAddress; -import java.util.*; +import buttondevteam.discordplugin.DiscordPlugin; +import lombok.Getter; +import lombok.experimental.Delegate; import org.bukkit.*; import org.bukkit.advancement.Advancement; import org.bukkit.advancement.AdvancementProgress; import org.bukkit.conversations.Conversation; import org.bukkit.conversations.ConversationAbandonedEvent; -import org.bukkit.entity.*; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.map.MapView; import org.bukkit.permissions.PermissibleBase; import org.bukkit.plugin.Plugin; 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; +import java.net.InetSocketAddress; +import java.util.*; + public class DiscordFakePlayer extends DiscordHumanEntity implements Player { protected DiscordFakePlayer(IUser user, IChannel channel, int entityId, UUID uuid, String mcname) { super(user, channel, entityId, uuid); diff --git a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordHumanEntity.java b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordHumanEntity.java old mode 100644 new mode 100755 index 26d220f..c1522f1 --- a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordHumanEntity.java +++ b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordHumanEntity.java @@ -1,7 +1,5 @@ package buttondevteam.discordplugin.playerfaker; -import java.util.UUID; - import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; @@ -10,10 +8,11 @@ import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Villager; import org.bukkit.inventory.*; import org.bukkit.inventory.InventoryView.Property; - import sx.blah.discord.handle.obj.IChannel; import sx.blah.discord.handle.obj.IUser; +import java.util.UUID; + public abstract class DiscordHumanEntity extends DiscordLivingEntity implements HumanEntity { protected DiscordHumanEntity(IUser user, IChannel channel, int entityId, UUID uuid) { super(user, channel, entityId, uuid); diff --git a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordInventory.java b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordInventory.java old mode 100644 new mode 100755 index f8f9886..a97f715 --- a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordInventory.java +++ b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordInventory.java @@ -1,12 +1,5 @@ package buttondevteam.discordplugin.playerfaker; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.ListIterator; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.HumanEntity; @@ -14,6 +7,13 @@ import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.ListIterator; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + public class DiscordInventory implements Inventory { public DiscordInventory(DiscordHumanEntity holder) { this.holder = holder; diff --git a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordLivingEntity.java b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordLivingEntity.java old mode 100644 new mode 100755 index d4e78c1..f261de4 --- a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordLivingEntity.java +++ b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordLivingEntity.java @@ -1,12 +1,7 @@ package buttondevteam.discordplugin.playerfaker; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.UUID; - +import lombok.Getter; +import lombok.Setter; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.attribute.Attribute; @@ -21,12 +16,11 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.util.Vector; - -import lombok.Getter; -import lombok.Setter; import sx.blah.discord.handle.obj.IChannel; import sx.blah.discord.handle.obj.IUser; +import java.util.*; + public abstract class DiscordLivingEntity extends DiscordEntity implements LivingEntity { protected DiscordLivingEntity(IUser user, IChannel channel, int entityId, UUID uuid) { diff --git a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordPlayerInventory.java b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordPlayerInventory.java old mode 100644 new mode 100755 diff --git a/src/main/java/buttondevteam/discordplugin/playerfaker/VanillaCommandListener.java b/src/main/java/buttondevteam/discordplugin/playerfaker/VanillaCommandListener.java old mode 100644 new mode 100755 index 3355478..29f3a13 --- a/src/main/java/buttondevteam/discordplugin/playerfaker/VanillaCommandListener.java +++ b/src/main/java/buttondevteam/discordplugin/playerfaker/VanillaCommandListener.java @@ -1,7 +1,10 @@ package buttondevteam.discordplugin.playerfaker; -import java.util.Arrays; - +import buttondevteam.discordplugin.DiscordSenderBase; +import buttondevteam.discordplugin.IMCPlayer; +import lombok.Getter; +import lombok.val; +import net.minecraft.server.v1_12_R1.*; import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v1_12_R1.CraftServer; import org.bukkit.craftbukkit.v1_12_R1.CraftWorld; @@ -9,17 +12,7 @@ import org.bukkit.craftbukkit.v1_12_R1.command.VanillaCommandWrapper; import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer; import org.bukkit.entity.Player; -import buttondevteam.discordplugin.DiscordSenderBase; -import buttondevteam.discordplugin.IMCPlayer; -import lombok.Getter; -import lombok.val; -import net.minecraft.server.v1_12_R1.ChatMessage; -import net.minecraft.server.v1_12_R1.CommandException; -import net.minecraft.server.v1_12_R1.EnumChatFormat; -import net.minecraft.server.v1_12_R1.IChatBaseComponent; -import net.minecraft.server.v1_12_R1.ICommandListener; -import net.minecraft.server.v1_12_R1.MinecraftServer; -import net.minecraft.server.v1_12_R1.World; +import java.util.Arrays; public class VanillaCommandListener> implements ICommandListener { private @Getter T player; diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml old mode 100644 new mode 100755 diff --git a/src/test/java/buttondevteam/DiscordPlugin/AppTest.java b/src/test/java/buttondevteam/DiscordPlugin/AppTest.java old mode 100644 new mode 100755 From fba5c5b49a34c8012b7ed97b1976db836eab2f53 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Tue, 22 May 2018 01:42:52 +0200 Subject: [PATCH 03/11] Fixes, channel con work Connecting channels is WIP --- .../commands/ConnectCommand.java | 4 +- .../discordplugin/commands/HereCommand.java | 25 ++++++++ .../listeners/MCChatListener.java | 10 ++++ .../discordplugin/listeners/MCListener.java | 2 +- .../mccommands/ChannelconMCCommand.java | 58 +++++++++++++++++++ 5 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 src/main/java/buttondevteam/discordplugin/commands/HereCommand.java create mode 100644 src/main/java/buttondevteam/discordplugin/mccommands/ChannelconMCCommand.java diff --git a/src/main/java/buttondevteam/discordplugin/commands/ConnectCommand.java b/src/main/java/buttondevteam/discordplugin/commands/ConnectCommand.java index 5a6f0f7..65ebda2 100755 --- a/src/main/java/buttondevteam/discordplugin/commands/ConnectCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/ConnectCommand.java @@ -58,8 +58,8 @@ public class ConnectCommand extends DiscordCommandBase { } WaitingToConnect.put(p.getName(), message.getAuthor().getStringID()); DiscordPlugin.sendMessageToChannel(message.getChannel(), - "Pending connection - accept connection in Minecraft from the account " + args - + " before the server gets restarted. You can also adjust the Minecraft name you want to connect to with the same command."); + "Alright! Now accept the connection in Minecraft from the account " + args + + " before the next server restart. You can also adjust the Minecraft name you want to connect to with the same command."); if (p.isOnline()) ((Player) p).sendMessage("§bTo connect with the Discord account " + message.getAuthor().getName() + "#" + message.getAuthor().getDiscriminator() + " do /discord accept"); diff --git a/src/main/java/buttondevteam/discordplugin/commands/HereCommand.java b/src/main/java/buttondevteam/discordplugin/commands/HereCommand.java new file mode 100644 index 0000000..f2717d7 --- /dev/null +++ b/src/main/java/buttondevteam/discordplugin/commands/HereCommand.java @@ -0,0 +1,25 @@ +package buttondevteam.discordplugin.commands; + +import buttondevteam.discordplugin.mccommands.ChannelconMCCommand; +import lombok.val; +import sx.blah.discord.handle.obj.IMessage; + +public class HereCommand extends DiscordCommandBase { + @Override + public String getCommandName() { + return "here"; + } + + @Override + public void run(IMessage message, String args) { + val chgroup = ChannelconMCCommand.PendingConnections.get(message.getAuthor().getStringID()); + if (chgroup == null) { + message.reply("no pending connection found! "); //TODO + } + } + + @Override + public String[] getHelpText() { + return new String[0]; + } +} diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index 1aca8e6..7aa12ff 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -46,6 +46,12 @@ public class MCChatListener implements Listener, IListener private LinkedBlockingQueue> sendevents = new LinkedBlockingQueue<>(); private Runnable sendrunnable; + public static void addCustomChat(IChannel channel, String groupid, Channel mcchannel) { + val lmd = new LastMsgData(channel, null, null); + lmd.mcchannel = mcchannel; + lastmsgCustom.put(groupid, lmd); + } + @EventHandler // Minecraft public void onMCChat(TBMCChatEvent ev) { if (ev.isCancelled()) @@ -177,6 +183,10 @@ public class MCChatListener implements Listener, IListener * Used for messages in PMs (mcchat). */ private static ArrayList lastmsgPerUser = new ArrayList(); + /** + * Used for town or nation chats or anything else + */ + private static HashMap lastmsgCustom = new HashMap<>(); public static boolean privateMCChat(IChannel channel, boolean start, IUser user, DiscordPlayer dp) { TBMCPlayer mcp = dp.getAs(TBMCPlayer.class); diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java index 42e85a0..67a0cce 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java @@ -93,7 +93,7 @@ public class MCListener implements Listener { if (DiscordPlugin.SafeMode) return; DiscordPlayer dp = e.getPlayer().getAs(DiscordPlayer.class); - if (dp == null || dp.getDiscordID() == null || dp.getDiscordID() == "") + if (dp == null || dp.getDiscordID() == null || dp.getDiscordID().equals("")) return; IUser user = DiscordPlugin.dc.getUserByID(Long.parseLong(dp.getDiscordID())); e.addInfo("Discord tag: " + user.getName() + "#" + user.getDiscriminator()); diff --git a/src/main/java/buttondevteam/discordplugin/mccommands/ChannelconMCCommand.java b/src/main/java/buttondevteam/discordplugin/mccommands/ChannelconMCCommand.java new file mode 100644 index 0000000..10f871d --- /dev/null +++ b/src/main/java/buttondevteam/discordplugin/mccommands/ChannelconMCCommand.java @@ -0,0 +1,58 @@ +package buttondevteam.discordplugin.mccommands; + +import buttondevteam.discordplugin.DiscordPlayer; +import buttondevteam.lib.TBMCChannelConnectEvent; +import buttondevteam.lib.chat.Channel; +import buttondevteam.lib.chat.CommandClass; +import buttondevteam.lib.player.TBMCPlayer; +import lombok.val; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.util.AbstractMap; +import java.util.Arrays; +import java.util.HashMap; + +@CommandClass(modOnly = false, path = "channelcon") +public class ChannelconMCCommand extends DiscordMCCommandBase { + @Override //TODO: Since we require connecting the accounts, it can be done entirely on Discord. + public boolean OnCommand(Player player, String alias, String[] args) { + if (args.length < 1) + return false; + val chan = Channel.getChannels().stream().filter(ch -> ch.ID.equalsIgnoreCase(args[0]) || (ch.IDs != null && Arrays.stream(ch.IDs).anyMatch(cid -> cid.equalsIgnoreCase(args[0])))).findAny(); + if (!chan.isPresent()) { + player.sendMessage("§cChannel with ID '" + args[0] + "' not found! The ID is the command for it without the /."); + return true; + } + val dp = TBMCPlayer.getPlayer(player.getUniqueId(), TBMCPlayer.class).getAs(DiscordPlayer.class); + if (dp == null) { + player.sendMessage("§cYou need to connect your Discord account. In #bot do @ChromaBot connect " + player.getName()); + return true; + } + val ev = new TBMCChannelConnectEvent(player, chan.get()); + Bukkit.getPluginManager().callEvent(ev); + if (ev.isCancelled() || ev.getGroupid() == null) { + player.sendMessage("§cSorry, that didn't work. You cannot use that channel."); + return true; + } + //MCChatListener.addCustomChat() - TODO: Call in Discord cmd + PendingConnections.put(dp.getDiscordID(), new AbstractMap.SimpleEntry<>(ev.getChannel(), ev.getGroupid())); + player.sendMessage("§bAlright! Now invite me to your server then show me the channel to use (@ChromaBot here)."); + return true; + } + + @Override + public String[] GetHelpText(String s) { + return new String[]{// + "§6---- Channel connect ---", // + "This command allows you to connect a Minecraft channel to a Discord channel.", // + "You need to have access to the MC channel and have manage permissions on the Discord channel." // + }; + } + + /** + * Key: Discord ID + * Value of value. Channel Group ID + */ + public static HashMap> PendingConnections = new HashMap<>(); +} From aabdd3a914c9c0609e4239915efd10cb265fd9e1 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Tue, 22 May 2018 22:43:36 +0200 Subject: [PATCH 04/11] Channel connect, fixes - To do or not to do - Fixed args handling regarding whitespace - Showing the help text for cmds when needed - Fixed userinfo cmd not accepting spaces while Discord does - Moved command registration to start, not the initializer -- Prevents possible deadlocks according to IntelliJ - Other fixes --- .gitignore | 2 +- pom.xml | 3 +- .../discordplugin/DiscordPlugin.java | 2 + .../commands/ChannelconCommand.java | 68 +++++++++++++++++++ .../commands/ConnectCommand.java | 15 ++-- .../commands/DiscordCommandBase.java | 14 +++- .../discordplugin/commands/HelpCommand.java | 3 +- .../discordplugin/commands/HereCommand.java | 25 ------- .../discordplugin/commands/MCChatCommand.java | 5 +- .../discordplugin/commands/RoleCommand.java | 20 +++--- .../commands/UserinfoCommand.java | 19 +++--- .../listeners/CommandListener.java | 2 +- .../listeners/MCChatListener.java | 22 ++++-- .../mccommands/ChannelconMCCommand.java | 58 ---------------- 14 files changed, 129 insertions(+), 129 deletions(-) create mode 100644 src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java delete mode 100644 src/main/java/buttondevteam/discordplugin/commands/HereCommand.java delete mode 100644 src/main/java/buttondevteam/discordplugin/mccommands/ChannelconMCCommand.java diff --git a/.gitignore b/.gitignore index 9ec5deb..1d227f7 100755 --- a/.gitignore +++ b/.gitignore @@ -131,7 +131,7 @@ publish/ *.publishproj # NuGet Packages Directory -## TODO: If you have NuGet Package Restore enabled, uncomment the next line +## TO!DO: If you have NuGet Package Restore enabled, uncomment the next line #packages/ # Windows Azure Build Output diff --git a/pom.xml b/pom.xml index 43ce4d1..8a8fac4 100755 --- a/pom.xml +++ b/pom.xml @@ -58,7 +58,7 @@ org.spigotmc:spigot-api com.github.TBMCPlugins.ButtonCore:ButtonCore net.ess3:Essentials - + @@ -180,6 +180,7 @@ net.ess3 Essentials 2.13.1 + provided com.github.xaanit diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java index c2972fa..cca07b1 100755 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java @@ -1,5 +1,6 @@ package buttondevteam.discordplugin; +import buttondevteam.discordplugin.commands.DiscordCommandBase; import buttondevteam.discordplugin.listeners.*; import buttondevteam.discordplugin.mccommands.DiscordMCCommandBase; import buttondevteam.lib.TBMCCoreAPI; @@ -132,6 +133,7 @@ public class DiscordPlugin extends JavaPlugin implements IListener { new ChromaBot(this).updatePlayerList(); //Get all roles with the default color GameRoles = mainServer.getRoles().stream().filter(r -> r.getColor().getAlpha() == 0).map(IRole::getName).collect(Collectors.toList()); + DiscordCommandBase.registerCommands(); if (getConfig().getBoolean("serverup", false)) { ChromaBot.getInstance().sendMessage("", new EmbedBuilder().withColor(Color.YELLOW) .withTitle("Server recovered from a crash - chat connected.").build()); diff --git a/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java b/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java new file mode 100644 index 0000000..51b1846 --- /dev/null +++ b/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java @@ -0,0 +1,68 @@ +package buttondevteam.discordplugin.commands; + +import buttondevteam.discordplugin.DiscordConnectedPlayer; +import buttondevteam.discordplugin.DiscordPlayer; +import buttondevteam.discordplugin.listeners.MCChatListener; +import buttondevteam.lib.TBMCChannelConnectEvent; +import buttondevteam.lib.chat.Channel; +import buttondevteam.lib.player.TBMCPlayer; +import lombok.val; +import org.bukkit.Bukkit; +import sx.blah.discord.handle.obj.IMessage; +import sx.blah.discord.handle.obj.Permissions; +import sx.blah.discord.util.PermissionUtils; + +import java.util.Arrays; + +public class ChannelconCommand extends DiscordCommandBase { + @Override + public String getCommandName() { + return "here"; + } + + @Override + public boolean run(IMessage message, String args) { + if (args.length() == 0) + return false; + if (!PermissionUtils.hasPermissions(message.getChannel(), message.getAuthor(), Permissions.MANAGE_CHANNEL)) { + message.reply("you need to have manage permissions for this channel!"); + return true; + } + //TODO: What if they no longer have permission to view the channel + if (MCChatListener.hasCustomChat(message.getChannel())) { //TODO: Remove command + message.reply("this channel is already connected to a Minecraft channel."); + return true; + } + val chan = Channel.getChannels().stream().filter(ch -> ch.ID.equalsIgnoreCase(args) || (ch.IDs != null && Arrays.stream(ch.IDs).anyMatch(cid -> cid.equalsIgnoreCase(args)))).findAny(); + if (!chan.isPresent()) { //TODO: Red embed that disappears over time (kinda like the highlight messages in OW) + message.reply("MC channel with ID '" + args + "' not found! The ID is the command for it without the /."); + return true; + } + val chp = DiscordPlayer.getUser(message.getAuthor().getStringID(), DiscordPlayer.class).getAs(TBMCPlayer.class); + if (chp == null) { + message.reply("you need to connect your Minecraft account. In #bot do @ChromaBot connect "); + return true; + } + val ev = new TBMCChannelConnectEvent(new DiscordConnectedPlayer(message.getAuthor(), message.getChannel(), chp.getUUID(), Bukkit.getOfflinePlayer(chp.getUUID()).getName()), chan.get()); + Bukkit.getPluginManager().callEvent(ev); //Using a fake player with no login/logout, should be fine for this event + if (ev.isCancelled() || ev.getGroupid() == null) { + message.reply("sorry, that didn't work. You cannot use that Minecraft channel."); + return true; + } + MCChatListener.addCustomChat(message.getChannel(), args, ev.getChannel()); + message.reply("alright, connection made!"); + return true; + } + + @Override + public String[] getHelpText() { + return new String[]{ // + "§6---- 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 @ChromaBot connect .", // + "Call this command from the channel you want to use. Usage: @ChromaBot channelcon ", // + "Invite link: https://discordapp.com/oauth2/authorize?client_id=226443037893591041&scope=bot" // + }; + } +} diff --git a/src/main/java/buttondevteam/discordplugin/commands/ConnectCommand.java b/src/main/java/buttondevteam/discordplugin/commands/ConnectCommand.java index 65ebda2..670b522 100755 --- a/src/main/java/buttondevteam/discordplugin/commands/ConnectCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/ConnectCommand.java @@ -25,15 +25,13 @@ public class ConnectCommand extends DiscordCommandBase { public static HashBiMap WaitingToConnect = HashBiMap.create(); @Override - public void run(IMessage message, String args) { - if (args.length() == 0) { - DiscordPlugin.sendMessageToChannel(message.getChannel(), "Usage: connect "); - return; - } + public boolean run(IMessage message, String args) { + if (args.length() == 0) + return true; if (args.contains(" ")) { DiscordPlugin.sendMessageToChannel(message.getChannel(), "Too many arguments.\nUsage: connect "); - return; + return true; } if (WaitingToConnect.inverse().containsKey(message.getAuthor().getStringID())) { DiscordPlugin.sendMessageToChannel(message.getChannel(), @@ -44,13 +42,13 @@ public class ConnectCommand extends DiscordCommandBase { OfflinePlayer p = Bukkit.getOfflinePlayer(args); if (p == null) { DiscordPlugin.sendMessageToChannel(message.getChannel(), "The specified Minecraft player cannot be found"); - return; + return true; } try (TBMCPlayer pl = TBMCPlayerBase.getPlayer(p.getUniqueId(), TBMCPlayer.class)) { DiscordPlayer dp = pl.getAs(DiscordPlayer.class); if (dp != null && message.getAuthor().getStringID().equals(dp.getDiscordID())) { DiscordPlugin.sendMessageToChannel(message.getChannel(), "You already have this account connected."); - return; + return true; } } catch (Exception e) { TBMCCoreAPI.SendException("An error occured while connecting a Discord account!", e); @@ -63,6 +61,7 @@ public class ConnectCommand extends DiscordCommandBase { if (p.isOnline()) ((Player) p).sendMessage("§bTo connect with the Discord account " + message.getAuthor().getName() + "#" + message.getAuthor().getDiscriminator() + " do /discord accept"); + return true; } @Override diff --git a/src/main/java/buttondevteam/discordplugin/commands/DiscordCommandBase.java b/src/main/java/buttondevteam/discordplugin/commands/DiscordCommandBase.java index f403b49..8791c8f 100755 --- a/src/main/java/buttondevteam/discordplugin/commands/DiscordCommandBase.java +++ b/src/main/java/buttondevteam/discordplugin/commands/DiscordCommandBase.java @@ -4,23 +4,26 @@ import buttondevteam.discordplugin.DiscordPlugin; import buttondevteam.lib.TBMCCoreAPI; import sx.blah.discord.handle.obj.IMessage; +import java.util.Arrays; import java.util.HashMap; +import java.util.stream.Collectors; public abstract class DiscordCommandBase { public abstract String getCommandName(); - public abstract void run(IMessage message, String args); + public abstract boolean run(IMessage message, String args); public abstract String[] getHelpText(); static final HashMap commands = new HashMap(); - static { + public static void registerCommands() { commands.put("connect", new ConnectCommand()); // TODO: API for adding commands? commands.put("userinfo", new UserinfoCommand()); commands.put("help", new HelpCommand()); commands.put("role", new RoleCommand()); commands.put("mcchat", new MCChatCommand()); + commands.put("channelcon", new ChannelconCommand()); } public static void runCommand(String cmd, String args, IMessage message) { @@ -33,11 +36,16 @@ public abstract class DiscordCommandBase { return; } try { - command.run(message, args); + if (!command.run(message, args)) + DiscordPlugin.sendMessageToChannel(message.getChannel(), Arrays.stream(command.getHelpText()).collect(Collectors.joining("\n"))); } catch (Exception e) { TBMCCoreAPI.SendException("An error occured while executing command " + cmd + "!", e); DiscordPlugin.sendMessageToChannel(message.getChannel(), "An internal error occured while executing this command. For more technical details see the server-issues channel on the dev Discord."); } } + + protected String[] splitargs(String args) { + return args.split("\\s+"); + } } diff --git a/src/main/java/buttondevteam/discordplugin/commands/HelpCommand.java b/src/main/java/buttondevteam/discordplugin/commands/HelpCommand.java index c7f468e..29aff28 100755 --- a/src/main/java/buttondevteam/discordplugin/commands/HelpCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/HelpCommand.java @@ -14,7 +14,7 @@ public class HelpCommand extends DiscordCommandBase { } @Override - public void run(IMessage message, String args) { + public boolean run(IMessage message, String args) { DiscordCommandBase argdc; if (args.length() == 0) DiscordPlugin.sendMessageToChannel(message.getChannel(), @@ -24,6 +24,7 @@ public class HelpCommand extends DiscordCommandBase { DiscordPlugin.sendMessageToChannel(message.getChannel(), (argdc = DiscordCommandBase.commands.get(args)) == null ? "Command not found: " + args : Arrays.stream(argdc.getHelpText()).collect(Collectors.joining("\n"))); + return true; } @Override diff --git a/src/main/java/buttondevteam/discordplugin/commands/HereCommand.java b/src/main/java/buttondevteam/discordplugin/commands/HereCommand.java deleted file mode 100644 index f2717d7..0000000 --- a/src/main/java/buttondevteam/discordplugin/commands/HereCommand.java +++ /dev/null @@ -1,25 +0,0 @@ -package buttondevteam.discordplugin.commands; - -import buttondevteam.discordplugin.mccommands.ChannelconMCCommand; -import lombok.val; -import sx.blah.discord.handle.obj.IMessage; - -public class HereCommand extends DiscordCommandBase { - @Override - public String getCommandName() { - return "here"; - } - - @Override - public void run(IMessage message, String args) { - val chgroup = ChannelconMCCommand.PendingConnections.get(message.getAuthor().getStringID()); - if (chgroup == null) { - message.reply("no pending connection found! "); //TODO - } - } - - @Override - public String[] getHelpText() { - return new String[0]; - } -} diff --git a/src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java b/src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java index a629eda..05c66c0 100755 --- a/src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java @@ -14,11 +14,11 @@ public class MCChatCommand extends DiscordCommandBase { } @Override - public void run(IMessage message, String args) { + public boolean run(IMessage message, String args) { if (!message.getChannel().isPrivate()) { DiscordPlugin.sendMessageToChannel(message.getChannel(), "This command can only be issued in a direct message with the bot."); - return; + return true; } try (final DiscordPlayer user = DiscordPlayer.getUser(message.getAuthor().getStringID(), DiscordPlayer.class)) { boolean mcchat = !user.isMinecraftChatEnabled(); @@ -31,6 +31,7 @@ public class MCChatCommand extends DiscordCommandBase { } catch (Exception e) { TBMCCoreAPI.SendException("Error while setting mcchat for user" + message.getAuthor().getName(), e); } + return true; } @Override diff --git a/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java b/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java index cf3d0c6..ed1ddaf 100755 --- a/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java @@ -17,17 +17,14 @@ public class RoleCommand extends DiscordCommandBase { } @Override - public void run(IMessage message, String args) { - final String usagemsg = "Subcommands: add, remove, list"; - if (args.length() == 0) { - DiscordPlugin.sendMessageToChannel(message.getChannel(), usagemsg); - return; - } - String[] argsa = args.split(" "); + public boolean run(IMessage message, String args) { + if (args.length() == 0) + return false; + String[] argsa = splitargs(args); if (argsa[0].equalsIgnoreCase("add")) { final IRole role = checkAndGetRole(message, argsa, "This command adds a game role to your account."); if (role == null) - return; + return true; try { DPUtils.perform(() -> message.getAuthor().addRole(role)); DiscordPlugin.sendMessageToChannel(message.getChannel(), "Added game role."); @@ -38,7 +35,7 @@ public class RoleCommand extends DiscordCommandBase { } else if (argsa[0].equalsIgnoreCase("remove")) { final IRole role = checkAndGetRole(message, argsa, "This command removes a game role from your account."); if (role == null) - return; + return true; try { DPUtils.perform(() -> message.getAuthor().removeRole(role)); DiscordPlugin.sendMessageToChannel(message.getChannel(), "Removed game role."); @@ -49,7 +46,8 @@ public class RoleCommand extends DiscordCommandBase { } else if (argsa[0].equalsIgnoreCase("list")) { DiscordPlugin.sendMessageToChannel(message.getChannel(), "List of game roles:\n" + DiscordPlugin.GameRoles.stream().sorted().collect(Collectors.joining("\n"))); - } else DiscordPlugin.sendMessageToChannel(message.getChannel(), usagemsg); + } else return false; + return true; } private IRole checkAndGetRole(IMessage message, String[] argsa, String usage) { @@ -87,7 +85,7 @@ public class RoleCommand extends DiscordCommandBase { return new String[] { // "Add or remove game roles from yourself.", // "Usage: role add|remove or role list", // - "Mods can use role addrole to add a role as a game role" }; + }; } } diff --git a/src/main/java/buttondevteam/discordplugin/commands/UserinfoCommand.java b/src/main/java/buttondevteam/discordplugin/commands/UserinfoCommand.java index ee613e7..b0608ed 100755 --- a/src/main/java/buttondevteam/discordplugin/commands/UserinfoCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/UserinfoCommand.java @@ -20,12 +20,7 @@ public class UserinfoCommand extends DiscordCommandBase { } @Override - public void run(IMessage message, String args) { - if (args.contains(" ")) { - DiscordPlugin.sendMessageToChannel(message.getChannel(), - "Too many arguments.\nUsage: userinfo [username/nickname[#tag]/ping]\nExamples:\nuserinfo ChromaBot\nuserinfo ChromaBot#6338\nuserinfo @ChromaBot#6338"); - return; - } + public boolean run(IMessage message, String args) { IUser target = null; if (args.length() == 0) target = message.getAuthor(); @@ -40,7 +35,7 @@ public class UserinfoCommand extends DiscordCommandBase { if (targets.size() == 0) { DiscordPlugin.sendMessageToChannel(message.getChannel(), "The user cannot be found (by name): " + args); - return; + return true; } for (IUser ptarget : targets) { if (ptarget.getDiscriminator().equalsIgnoreCase(targettag[1])) { @@ -52,19 +47,19 @@ public class UserinfoCommand extends DiscordCommandBase { DiscordPlugin.sendMessageToChannel(message.getChannel(), "The user cannot be found (by discriminator): " + args + "(Found " + targets.size() + " users with the name.)"); - return; + return true; } } else { final List targets = getUsers(message, args); if (targets.size() == 0) { DiscordPlugin.sendMessageToChannel(message.getChannel(), "The user cannot be found on Discord: " + args); - return; + return true; } if (targets.size() > 1) { DiscordPlugin.sendMessageToChannel(message.getChannel(), "Multiple users found with that (nick)name. Please specify the whole tag, like ChromaBot#6338 or use a ping."); - return; + return true; } target = targets.get(0); } @@ -77,6 +72,7 @@ public class UserinfoCommand extends DiscordCommandBase { DiscordPlugin.sendMessageToChannel(message.getChannel(), "An error occured while getting the user!"); TBMCCoreAPI.SendException("Error while getting info about " + target.getName() + "!", e); } + return true; } private List getUsers(IMessage message, String args) { @@ -94,7 +90,8 @@ public class UserinfoCommand extends DiscordCommandBase { return new String[] { // "---- User information ----", // "Shows some information about users, from Discord, from Minecraft or from Reddit if they have these accounts connected.", // - "Usage: userinfo " // + "If used without args, shows your info.", // + "Usage: userinfo [username/nickname[#tag]/ping]\nExamples:\nuserinfo ChromaBot\nuserinfo ChromaBot#6338\nuserinfo @ChromaBot#6338" // }; } diff --git a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java index 6fdd9b1..0103ebd 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java @@ -182,7 +182,7 @@ public class CommandListener { args = ""; } else { cmd = cmdwithargs.substring(0, index); - args = cmdwithargs.substring(index + 1); + args = cmdwithargs.substring(index + 1).trim(); //In case there are multiple spaces } DiscordCommandBase.runCommand(cmd.toLowerCase(), args, message); message.getChannel().setTypingStatus(false); diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index 7aa12ff..6384b12 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -46,12 +46,6 @@ public class MCChatListener implements Listener, IListener private LinkedBlockingQueue> sendevents = new LinkedBlockingQueue<>(); private Runnable sendrunnable; - public static void addCustomChat(IChannel channel, String groupid, Channel mcchannel) { - val lmd = new LastMsgData(channel, null, null); - lmd.mcchannel = mcchannel; - lastmsgCustom.put(groupid, lmd); - } - @EventHandler // Minecraft public void onMCChat(TBMCChatEvent ev) { if (ev.isCancelled()) @@ -186,7 +180,7 @@ public class MCChatListener implements Listener, IListener /** * Used for town or nation chats or anything else */ - private static HashMap lastmsgCustom = new HashMap<>(); + private static HashMap lastmsgCustom = new HashMap<>(); public static boolean privateMCChat(IChannel channel, boolean start, IUser user, DiscordPlayer dp) { TBMCPlayer mcp = dp.getAs(TBMCPlayer.class); @@ -230,6 +224,20 @@ public class MCChatListener implements Listener, IListener .anyMatch(lmd -> ((IPrivateChannel) lmd.channel).getRecipient().getStringID().equals(did)); } + public static void addCustomChat(IChannel channel, String groupid, Channel mcchannel) { + val lmd = new LastMsgData(channel, null, null); + lmd.mcchannel = mcchannel; + lastmsgCustom.put(lmd, groupid); + } + + public static boolean hasCustomChat(IChannel channel) { + return lastmsgCustom.entrySet().stream().anyMatch(lmd -> lmd.getKey().channel.getLongID() == channel.getLongID()); + } + + public static boolean removeCustomChat(IChannel channel) { + return lastmsgCustom.entrySet().removeIf(lmd -> lmd.getKey().channel.getLongID() == channel.getLongID()); + } + /** * May contain P<DiscordID> as key for public chat */ diff --git a/src/main/java/buttondevteam/discordplugin/mccommands/ChannelconMCCommand.java b/src/main/java/buttondevteam/discordplugin/mccommands/ChannelconMCCommand.java deleted file mode 100644 index 10f871d..0000000 --- a/src/main/java/buttondevteam/discordplugin/mccommands/ChannelconMCCommand.java +++ /dev/null @@ -1,58 +0,0 @@ -package buttondevteam.discordplugin.mccommands; - -import buttondevteam.discordplugin.DiscordPlayer; -import buttondevteam.lib.TBMCChannelConnectEvent; -import buttondevteam.lib.chat.Channel; -import buttondevteam.lib.chat.CommandClass; -import buttondevteam.lib.player.TBMCPlayer; -import lombok.val; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; - -import java.util.AbstractMap; -import java.util.Arrays; -import java.util.HashMap; - -@CommandClass(modOnly = false, path = "channelcon") -public class ChannelconMCCommand extends DiscordMCCommandBase { - @Override //TODO: Since we require connecting the accounts, it can be done entirely on Discord. - public boolean OnCommand(Player player, String alias, String[] args) { - if (args.length < 1) - return false; - val chan = Channel.getChannels().stream().filter(ch -> ch.ID.equalsIgnoreCase(args[0]) || (ch.IDs != null && Arrays.stream(ch.IDs).anyMatch(cid -> cid.equalsIgnoreCase(args[0])))).findAny(); - if (!chan.isPresent()) { - player.sendMessage("§cChannel with ID '" + args[0] + "' not found! The ID is the command for it without the /."); - return true; - } - val dp = TBMCPlayer.getPlayer(player.getUniqueId(), TBMCPlayer.class).getAs(DiscordPlayer.class); - if (dp == null) { - player.sendMessage("§cYou need to connect your Discord account. In #bot do @ChromaBot connect " + player.getName()); - return true; - } - val ev = new TBMCChannelConnectEvent(player, chan.get()); - Bukkit.getPluginManager().callEvent(ev); - if (ev.isCancelled() || ev.getGroupid() == null) { - player.sendMessage("§cSorry, that didn't work. You cannot use that channel."); - return true; - } - //MCChatListener.addCustomChat() - TODO: Call in Discord cmd - PendingConnections.put(dp.getDiscordID(), new AbstractMap.SimpleEntry<>(ev.getChannel(), ev.getGroupid())); - player.sendMessage("§bAlright! Now invite me to your server then show me the channel to use (@ChromaBot here)."); - return true; - } - - @Override - public String[] GetHelpText(String s) { - return new String[]{// - "§6---- Channel connect ---", // - "This command allows you to connect a Minecraft channel to a Discord channel.", // - "You need to have access to the MC channel and have manage permissions on the Discord channel." // - }; - } - - /** - * Key: Discord ID - * Value of value. Channel Group ID - */ - public static HashMap> PendingConnections = new HashMap<>(); -} From b350be608a9751343472348c3ff34050b5329b99 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sun, 3 Jun 2018 02:44:32 +0200 Subject: [PATCH 05/11] Fixes & fromcmd - Exception handling got extra parenthesis - Async player join event handling - Added fromcmd check (shows /tableflip and similar) --- .../listeners/ExceptionListener.java | 4 +- .../listeners/MCChatListener.java | 2 +- .../discordplugin/listeners/MCListener.java | 42 ++++++++++--------- 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/main/java/buttondevteam/discordplugin/listeners/ExceptionListener.java b/src/main/java/buttondevteam/discordplugin/listeners/ExceptionListener.java index 1712e0d..549bb97 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/ExceptionListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/ExceptionListener.java @@ -23,8 +23,8 @@ public class ExceptionListener implements Listener { return; if (lastthrown.stream() .anyMatch(ex -> Arrays.equals(e.getException().getStackTrace(), ex.getStackTrace()) - && e.getException().getMessage() == null ? ex.getMessage() == null - : e.getException().getMessage().equals(ex.getMessage())) // e.Exception.Message==ex.Message + && (e.getException().getMessage() == null ? ex.getMessage() == null + : e.getException().getMessage().equals(ex.getMessage()))) // e.Exception.Message==ex.Message && lastsourcemsg.contains(e.getSourceMessage())) return; SendException(e.getException(), e.getSourceMessage()); diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index 6384b12..eb051f1 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -121,7 +121,7 @@ public class MCChatListener implements Listener, IListener || ((DiscordSenderBase) e.getSender()).getChannel().getLongID() != ch.getLongID(); if ((e.getChannel() == Channel.GlobalChat || e.getChannel().ID.equals("rp")) - && isdifferentchannel.test(DiscordPlugin.chatchannel)) + && (!e.isFromcmd() || isdifferentchannel.test(DiscordPlugin.chatchannel))) doit.accept(lastmsgdata == null ? lastmsgdata = new LastMsgData(DiscordPlugin.chatchannel, null, null) : lastmsgdata); diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java index 67a0cce..74ee6a2 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java @@ -45,26 +45,28 @@ public class MCListener implements Listener { public void onPlayerJoin(TBMCPlayerJoinEvent e) { if (e.getPlayer() instanceof DiscordConnectedPlayer) return; // Don't show the joined message for the fake player - final Player p = e.getPlayer(); - DiscordPlayer dp = e.GetPlayer().getAs(DiscordPlayer.class); - if (dp != null) { - val user = DiscordPlugin.dc.getUserByID(Long.parseLong(dp.getDiscordID())); - MCChatListener.OnlineSenders.put(dp.getDiscordID(), - new DiscordPlayerSender(user, user.getOrCreatePMChannel(), p)); - MCChatListener.OnlineSenders.put("P" + dp.getDiscordID(), - new DiscordPlayerSender(user, DiscordPlugin.chatchannel, p)); - } - if (ConnectCommand.WaitingToConnect.containsKey(e.GetPlayer().PlayerName().get())) { - IUser user = DiscordPlugin.dc - .getUserByID(Long.parseLong(ConnectCommand.WaitingToConnect.get(e.GetPlayer().PlayerName().get()))); - p.sendMessage("§bTo connect with the Discord account @" + user.getName() + "#" + user.getDiscriminator() - + " do /discord accept"); - p.sendMessage("§bIf it wasn't you, do /discord decline"); - } - if (!DiscordPlugin.hooked) - MCChatListener.sendSystemMessageToChat(e.GetPlayer().PlayerName().get() + " joined the game"); - MCChatListener.ListC = 0; - ChromaBot.getInstance().updatePlayerList(); + Bukkit.getScheduler().runTaskAsynchronously(DiscordPlugin.plugin, () -> { + final Player p = e.getPlayer(); + DiscordPlayer dp = e.GetPlayer().getAs(DiscordPlayer.class); + if (dp != null) { + val user = DiscordPlugin.dc.getUserByID(Long.parseLong(dp.getDiscordID())); + MCChatListener.OnlineSenders.put(dp.getDiscordID(), + new DiscordPlayerSender(user, user.getOrCreatePMChannel(), p)); + MCChatListener.OnlineSenders.put("P" + dp.getDiscordID(), + new DiscordPlayerSender(user, DiscordPlugin.chatchannel, p)); + } + if (ConnectCommand.WaitingToConnect.containsKey(e.GetPlayer().PlayerName().get())) { + IUser user = DiscordPlugin.dc + .getUserByID(Long.parseLong(ConnectCommand.WaitingToConnect.get(e.GetPlayer().PlayerName().get()))); + p.sendMessage("§bTo connect with the Discord account @" + user.getName() + "#" + user.getDiscriminator() + + " do /discord accept"); + p.sendMessage("§bIf it wasn't you, do /discord decline"); + } + if (!DiscordPlugin.hooked) + MCChatListener.sendSystemMessageToChat(e.GetPlayer().PlayerName().get() + " joined the game"); + MCChatListener.ListC = 0; + ChromaBot.getInstance().updatePlayerList(); + }); } @EventHandler(priority = EventPriority.HIGHEST) From 0497d6c8ac736e3e8d269d48c2a1b38952ae630f Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Wed, 6 Jun 2018 00:12:55 +0200 Subject: [PATCH 06/11] Fixes & debug & /lenny Fixed cmd handling for real Added debug command (not the best for debugging commands) Stop send/receive threads on shutdown Allow /lenny for the unconnected --- .../discordplugin/DiscordPlugin.java | 1 + .../discordplugin/commands/DebugCommand.java | 26 ++++++++++++++++++ .../commands/DiscordCommandBase.java | 6 +++++ .../listeners/CommandListener.java | 27 +++++++++++++++---- .../listeners/MCChatListener.java | 15 ++++++++--- 5 files changed, 67 insertions(+), 8 deletions(-) create mode 100644 src/main/java/buttondevteam/discordplugin/commands/DebugCommand.java diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java index cca07b1..fa46cad 100755 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java @@ -233,6 +233,7 @@ public class DiscordPlugin extends JavaPlugin implements IListener { ChromaBot.getInstance().updatePlayerList(); try { SafeMode = true; // Stop interacting with Discord + MCChatListener.stop(); ChromaBot.delete(); dc.changePresence(StatusType.IDLE, ActivityType.PLAYING, "Chromacraft"); //No longer using the same account for testing dc.logout(); diff --git a/src/main/java/buttondevteam/discordplugin/commands/DebugCommand.java b/src/main/java/buttondevteam/discordplugin/commands/DebugCommand.java new file mode 100644 index 0000000..1b6a605 --- /dev/null +++ b/src/main/java/buttondevteam/discordplugin/commands/DebugCommand.java @@ -0,0 +1,26 @@ +package buttondevteam.discordplugin.commands; + +import buttondevteam.discordplugin.DiscordPlugin; +import buttondevteam.discordplugin.listeners.CommandListener; +import sx.blah.discord.handle.obj.IMessage; + +public class DebugCommand extends DiscordCommandBase { + @Override + public String getCommandName() { + return "debug"; + } + + @Override + public boolean run(IMessage message, String args) { + if (message.getAuthor().hasRole(DiscordPlugin.mainServer.getRoleByID(126030201472811008L))) + message.reply("Debug " + (CommandListener.debug() ? "enabled" : "disabled")); + else + message.reply("You need to be a moderator to use this command."); + return true; + } + + @Override + public String[] getHelpText() { + return new String[]{"Switches debug mode."}; + } +} diff --git a/src/main/java/buttondevteam/discordplugin/commands/DiscordCommandBase.java b/src/main/java/buttondevteam/discordplugin/commands/DiscordCommandBase.java index 8791c8f..8fd3145 100755 --- a/src/main/java/buttondevteam/discordplugin/commands/DiscordCommandBase.java +++ b/src/main/java/buttondevteam/discordplugin/commands/DiscordCommandBase.java @@ -8,6 +8,8 @@ import java.util.Arrays; import java.util.HashMap; import java.util.stream.Collectors; +import static buttondevteam.discordplugin.listeners.CommandListener.debug; + public abstract class DiscordCommandBase { public abstract String getCommandName(); @@ -24,9 +26,11 @@ public abstract class DiscordCommandBase { commands.put("role", new RoleCommand()); commands.put("mcchat", new MCChatCommand()); commands.put("channelcon", new ChannelconCommand()); + commands.put("debug", new DebugCommand()); } public static void runCommand(String cmd, String args, IMessage message) { + debug("F"); //Not sure if needed DiscordCommandBase command = commands.get(cmd); if (command == null) { DiscordPlugin.sendMessageToChannel(message.getChannel(), @@ -35,6 +39,7 @@ public abstract class DiscordCommandBase { + "help' for help"); return; } + debug("G"); try { if (!command.run(message, args)) DiscordPlugin.sendMessageToChannel(message.getChannel(), Arrays.stream(command.getHelpText()).collect(Collectors.joining("\n"))); @@ -43,6 +48,7 @@ public abstract class DiscordCommandBase { DiscordPlugin.sendMessageToChannel(message.getChannel(), "An internal error occured while executing this command. For more technical details see the server-issues channel on the dev Discord."); } + debug("H"); } protected String[] splitargs(String args) { diff --git a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java index 0103ebd..12abef4 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java @@ -160,8 +160,10 @@ public class CommandListener { * @return Whether it ran the command (always true if mentionedonly is false) */ public static boolean runCommand(IMessage message, boolean mentionedonly) { + debug("A"); if (DiscordPlugin.SafeMode) return true; + debug("B"); final StringBuilder cmdwithargs = new StringBuilder(message.getContent()); final String mention = DiscordPlugin.dc.getOurUser().mention(false); final String mentionNick = DiscordPlugin.dc.getOurUser().mention(true); @@ -169,26 +171,41 @@ public class CommandListener { gotmention = checkanddeletemention(cmdwithargs, mentionNick, message) || gotmention; for (String mentionRole : (Iterable) message.getRoleMentions().stream().filter(r -> DiscordPlugin.dc.getOurUser().hasRole(r)).map(r -> r.mention())::iterator) gotmention = checkanddeletemention(cmdwithargs, mentionRole, message) || gotmention; // Delete all mentions + debug("C"); if (mentionedonly && !gotmention) { message.getChannel().setTypingStatus(false); return false; } + debug("D"); message.getChannel().setTypingStatus(true); - int index = cmdwithargs.indexOf(" "); + String cmdwithargsString = cmdwithargs.toString().trim(); //Remove spaces between mention and command + int index = cmdwithargsString.indexOf(" "); String cmd; String args; if (index == -1) { - cmd = cmdwithargs.toString(); + cmd = cmdwithargsString; args = ""; } else { - cmd = cmdwithargs.substring(0, index); - args = cmdwithargs.substring(index + 1).trim(); //In case there are multiple spaces - } + cmd = cmdwithargsString.substring(0, index); + args = cmdwithargsString.substring(index + 1).trim(); //In case there are multiple spaces + } + debug("E"); DiscordCommandBase.runCommand(cmd.toLowerCase(), args, message); message.getChannel().setTypingStatus(false); return true; } + private static boolean debug = false; + + public static void debug(String debug) { + if (CommandListener.debug) //Debug + System.out.println(debug); + } + + public static boolean debug() { + return debug = !debug; + } + private static boolean checkanddeletemention(StringBuilder cmdwithargs, String mention, IMessage message) { if (message.getContent().startsWith(mention)) // TODO: Resolve mentions: Compound arguments, either a mention or text if (cmdwithargs.length() > mention.length() + 1) diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index eb051f1..0ecf3ab 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -45,6 +45,7 @@ public class MCChatListener implements Listener, IListener private BukkitTask sendtask; private LinkedBlockingQueue> sendevents = new LinkedBlockingQueue<>(); private Runnable sendrunnable; + private static Thread sendthread; @EventHandler // Minecraft public void onMCChat(TBMCChatEvent ev) { @@ -54,6 +55,7 @@ public class MCChatListener implements Listener, IListener if (sendtask != null) return; sendrunnable = () -> { + sendthread = Thread.currentThread(); processMCToDiscord(); sendtask = Bukkit.getScheduler().runTaskAsynchronously(DiscordPlugin.plugin, sendrunnable); }; @@ -121,13 +123,13 @@ public class MCChatListener implements Listener, IListener || ((DiscordSenderBase) e.getSender()).getChannel().getLongID() != ch.getLongID(); if ((e.getChannel() == Channel.GlobalChat || e.getChannel().ID.equals("rp")) - && (!e.isFromcmd() || isdifferentchannel.test(DiscordPlugin.chatchannel))) + && (e.isFromcmd() || isdifferentchannel.test(DiscordPlugin.chatchannel))) doit.accept(lastmsgdata == null ? lastmsgdata = new LastMsgData(DiscordPlugin.chatchannel, null, null) : lastmsgdata); for (LastMsgData data : lastmsgPerUser) { - if (data.dp.isMinecraftChatEnabled() && isdifferentchannel.test(data.channel) + if (data.dp.isMinecraftChatEnabled() && (e.isFromcmd() || isdifferentchannel.test(data.channel)) && e.shouldSendTo(getSender(data.channel, data.user, data.dp))) doit.accept(data); } @@ -168,7 +170,7 @@ public class MCChatListener implements Listener, IListener } private static final String[] UnconnectedCmds = new String[]{"list", "u", "shrug", "tableflip", "unflip", "mwiki", - "yeehaw"}; + "yeehaw", "lenny"}; private static LastMsgData lastmsgdata; private static short lastlist = 0; @@ -286,10 +288,16 @@ public class MCChatListener implements Listener, IListener action.accept(data.channel); } + public static void stop() { + if (sendthread != null) sendthread.interrupt(); + if (recthread != null) recthread.interrupt(); + } + private BukkitTask rectask; private LinkedBlockingQueue recevents = new LinkedBlockingQueue<>(); private IMessage lastmsgfromd; // Last message sent by a Discord user, used for clearing checkmarks private Runnable recrun; + private static Thread recthread; @Override // Discord public void handle(MessageReceivedEvent ev) { @@ -314,6 +322,7 @@ public class MCChatListener implements Listener, IListener if (rectask != null) return; recrun = () -> { //Don't return in a while loop next time + recthread = Thread.currentThread(); processDiscordToMC(); rectask = Bukkit.getScheduler().runTaskAsynchronously(DiscordPlugin.plugin, recrun); //Continue message processing }; From b60c4f50909e1900a506465cf36001e2c3913642 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Wed, 6 Jun 2018 23:22:16 +0200 Subject: [PATCH 07/11] Many fixes and debug messages Mainly game roles Mostly debug messages --- .../buttondevteam/discordplugin/DPUtils.java | 6 +- .../discordplugin/DiscordPlugin.java | 26 +++- .../discordplugin/commands/RoleCommand.java | 130 +++++++++--------- .../listeners/CommandListener.java | 8 +- .../listeners/MCChatListener.java | 10 +- 5 files changed, 107 insertions(+), 73 deletions(-) diff --git a/src/main/java/buttondevteam/discordplugin/DPUtils.java b/src/main/java/buttondevteam/discordplugin/DPUtils.java index 9cae322..d5a704f 100755 --- a/src/main/java/buttondevteam/discordplugin/DPUtils.java +++ b/src/main/java/buttondevteam/discordplugin/DPUtils.java @@ -1,5 +1,6 @@ package buttondevteam.discordplugin; +import org.bukkit.Bukkit; import sx.blah.discord.util.EmbedBuilder; import sx.blah.discord.util.RequestBuffer; import sx.blah.discord.util.RequestBuffer.IRequest; @@ -34,10 +35,13 @@ public final class DPUtils { * Performs Discord actions, retrying when ratelimited. May return null if action fails too many times or in safe mode. */ public static T perform(IRequest action) { + System.out.println("performA"); if (DiscordPlugin.SafeMode) return null; - // if (Thread.currentThread() == DiscordPlugin.mainThread) - TODO: Ignore shutdown message <-- + System.out.println("performB"); + if (Thread.currentThread() == DiscordPlugin.mainThread) // TODO: Ignore shutdown message <-- // throw new RuntimeException("Tried to wait for a Discord request on the main thread. This could cause lag."); + Bukkit.getLogger().warning("Waiting for a Discord request on the main thread!"); return RequestBuffer.request(action).get(); // Let the pros handle this } diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java index fa46cad..2de677b 100755 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java @@ -132,7 +132,11 @@ public class DiscordPlugin extends JavaPlugin implements IListener { if (!sent) { new ChromaBot(this).updatePlayerList(); //Get all roles with the default color - GameRoles = mainServer.getRoles().stream().filter(r -> r.getColor().getAlpha() == 0).map(IRole::getName).collect(Collectors.toList()); + /*GameRoles = mainServer.getRoles().stream().filter(r -> { + System.out.println(r.getName()+" - "+r.getColor().toString()+" "+r.getColor().getAlpha()); + return r.getColor().getAlpha() == 0; + }).map(IRole::getName).collect(Collectors.toList()); //r=149,g=165,b=166*/ + GameRoles = mainServer.getRoles().stream().filter(this::isGameRole).map(IRole::getName).collect(Collectors.toList()); DiscordCommandBase.registerCommands(); if (getConfig().getBoolean("serverup", false)) { ChromaBot.getInstance().sendMessage("", new EmbedBuilder().withColor(Color.YELLOW) @@ -204,6 +208,12 @@ public class DiscordPlugin extends JavaPlugin implements IListener { } } + public boolean isGameRole(IRole r) { + val rc = new Color(149, 165, 166, 0); + return r.getColor().equals(rc) + && r.getPosition() < mainServer.getRoleByID(234343495735836672L).getPosition(); //Below the ChromaBot role + } + /** * Always true, except when running "stop" from console */ @@ -212,12 +222,16 @@ public class DiscordPlugin extends JavaPlugin implements IListener { @Override public void onDisable() { stop = true; + System.out.println("X"); for (val entry : MCChatListener.ConnectedSenders.entrySet()) MCListener.callEventExcludingSome(new PlayerQuitEvent(entry.getValue(), "")); + System.out.println("Y"); getConfig().set("lastannouncementtime", lastannouncementtime); getConfig().set("lastseentime", lastseentime); getConfig().set("serverup", false); + System.out.println("Z"); saveConfig(); + System.out.println("XX"); MCChatListener.forAllMCChat(ch -> DiscordPlugin.sendMessageToChannelWait(ch, "", new EmbedBuilder().withColor(Restart ? Color.ORANGE : Color.RED) .withTitle(Restart ? "Server restarting" : "Server stopping") @@ -230,13 +244,19 @@ public class DiscordPlugin extends JavaPlugin implements IListener { + "asked *politely* to leave the server for a bit.") : "") .build())); + System.out.println("XY"); ChromaBot.getInstance().updatePlayerList(); try { + System.out.println("XZ"); SafeMode = true; // Stop interacting with Discord MCChatListener.stop(); + System.out.println("YX"); ChromaBot.delete(); + System.out.println("YY"); dc.changePresence(StatusType.IDLE, ActivityType.PLAYING, "Chromacraft"); //No longer using the same account for testing + System.out.println("YZ"); dc.logout(); + System.out.println("ZX"); } catch (Exception e) { TBMCCoreAPI.SendException("An error occured while disabling DiscordPlugin!", e); } @@ -325,6 +345,7 @@ public class DiscordPlugin extends JavaPlugin implements IListener { } public static IMessage sendMessageToChannelWait(IChannel channel, String message, EmbedObject embed) { + System.out.println("lol"); return sendMessageToChannel(channel, message, embed, true); } @@ -335,13 +356,16 @@ public class DiscordPlugin extends JavaPlugin implements IListener { .warning("Message was too long to send to discord and got truncated. In " + channel.getName()); } try { + System.out.println("sendA"); if (channel == chatchannel) MCChatListener.resetLastMessage(); // If this is a chat message, it'll be set again else if (channel.isPrivate()) MCChatListener.resetLastMessage(channel); + System.out.println("sendB"); final String content = message; RequestBuffer.IRequest r = () -> embed == null ? channel.sendMessage(content) : channel.sendMessage(content, embed, false); + System.out.println("sendC"); if (wait) return DPUtils.perform(r); else { diff --git a/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java b/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java index ed1ddaf..dbe8988 100755 --- a/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java @@ -11,81 +11,83 @@ import java.util.stream.Collectors; public class RoleCommand extends DiscordCommandBase { - @Override - public String getCommandName() { - return "role"; - } + @Override + public String getCommandName() { + return "role"; + } - @Override + @Override public boolean run(IMessage message, String args) { if (args.length() == 0) return false; String[] argsa = splitargs(args); - if (argsa[0].equalsIgnoreCase("add")) { - final IRole role = checkAndGetRole(message, argsa, "This command adds a game role to your account."); - if (role == null) + if (argsa[0].equalsIgnoreCase("add")) { + final IRole role = checkAndGetRole(message, argsa, "This command adds a game role to your account."); + if (role == null) return true; - try { - DPUtils.perform(() -> message.getAuthor().addRole(role)); - DiscordPlugin.sendMessageToChannel(message.getChannel(), "Added game role."); - } catch (Exception e) { - TBMCCoreAPI.SendException("Error while adding role!", e); - DiscordPlugin.sendMessageToChannel(message.getChannel(), "An error occured while adding the role."); - } - } else if (argsa[0].equalsIgnoreCase("remove")) { - final IRole role = checkAndGetRole(message, argsa, "This command removes a game role from your account."); - if (role == null) + try { + DPUtils.perform(() -> message.getAuthor().addRole(role)); + DiscordPlugin.sendMessageToChannel(message.getChannel(), "Added game role."); + } catch (Exception e) { + TBMCCoreAPI.SendException("Error while adding role!", e); + DiscordPlugin.sendMessageToChannel(message.getChannel(), "An error occured while adding the role."); + } + } else if (argsa[0].equalsIgnoreCase("remove")) { + final IRole role = checkAndGetRole(message, argsa, "This command removes a game role from your account."); + if (role == null) return true; - try { - DPUtils.perform(() -> message.getAuthor().removeRole(role)); - DiscordPlugin.sendMessageToChannel(message.getChannel(), "Removed game role."); - } catch (Exception e) { - TBMCCoreAPI.SendException("Error while removing role!", e); - DiscordPlugin.sendMessageToChannel(message.getChannel(), "An error occured while removing the role."); - } - } else if (argsa[0].equalsIgnoreCase("list")) { - DiscordPlugin.sendMessageToChannel(message.getChannel(), - "List of game roles:\n" + DiscordPlugin.GameRoles.stream().sorted().collect(Collectors.joining("\n"))); + try { + DPUtils.perform(() -> message.getAuthor().removeRole(role)); + DiscordPlugin.sendMessageToChannel(message.getChannel(), "Removed game role."); + } catch (Exception e) { + TBMCCoreAPI.SendException("Error while removing role!", e); + DiscordPlugin.sendMessageToChannel(message.getChannel(), "An error occured while removing the role."); + } + } else if (argsa[0].equalsIgnoreCase("list")) { + listRoles(message); } else return false; return true; - } + } - private IRole checkAndGetRole(IMessage message, String[] argsa, String usage) { - if (argsa.length < 2) { - DiscordPlugin.sendMessageToChannel(message.getChannel(), usage + "\nUsage: " + argsa[0] + " "); - return null; - } - String rolename = argsa[1]; - for (int i = 2; i < argsa.length; i++) - rolename += " " + argsa[i]; - if (!DiscordPlugin.GameRoles.contains(rolename)) { - DiscordPlugin.sendMessageToChannel(message.getChannel(), - "That game role cannot be found.\nList of game roles:\n" - + DiscordPlugin.GameRoles.stream().collect(Collectors.joining("\n"))); - return null; - } - final List roles = (TBMCCoreAPI.IsTestServer() ? DiscordPlugin.devServer : DiscordPlugin.mainServer) - .getRolesByName(rolename); - if (roles.size() == 0) { - DiscordPlugin.sendMessageToChannel(message.getChannel(), - "The specified role cannot be found on Discord! Removing from the list."); - DiscordPlugin.GameRoles.remove(rolename); - return null; - } - if (roles.size() > 1) { - DiscordPlugin.sendMessageToChannel(message.getChannel(), - "There are more roles with this name. Why are there more roles with this name?"); - return null; - } - return roles.get(0); - } + private void listRoles(IMessage message) { + DiscordPlugin.sendMessageToChannel(message.getChannel(), + "List of game roles:\n" + DiscordPlugin.GameRoles.stream().sorted().collect(Collectors.joining("\n"))); + } - @Override - public String[] getHelpText() { - return new String[] { // - "Add or remove game roles from yourself.", // - "Usage: role add|remove or role list", // + private IRole checkAndGetRole(IMessage message, String[] argsa, String usage) { + if (argsa.length < 2) { + DiscordPlugin.sendMessageToChannel(message.getChannel(), usage + "\nUsage: " + argsa[0] + " "); + return null; + } + String rolename = argsa[1]; + for (int i = 2; i < argsa.length; i++) + rolename += " " + argsa[i]; + if (!DiscordPlugin.GameRoles.contains(rolename)) { + DiscordPlugin.sendMessageToChannel(message.getChannel(), "That game role cannot be found."); + listRoles(message); + return null; + } + final List roles = DiscordPlugin.mainServer.getRolesByName(rolename); + if (roles.size() == 0) { + DiscordPlugin.sendMessageToChannel(message.getChannel(), + "The specified role cannot be found on Discord! Removing from the list."); + DiscordPlugin.GameRoles.remove(rolename); + return null; + } + if (roles.size() > 1) { + DiscordPlugin.sendMessageToChannel(message.getChannel(), + "There are more roles with this name. Why are there more roles with this name?"); + return null; + } + return roles.get(0); + } + + @Override + public String[] getHelpText() { + return new String[]{ // + "Add or remove game roles from yourself.", // + "Usage: role add|remove or role list", // }; - } + } } diff --git a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java index 12abef4..0b0055b 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java @@ -127,7 +127,7 @@ public class CommandListener { } }, (IListener) event -> { Bukkit.getScheduler().runTaskLaterAsynchronously(DiscordPlugin.plugin, () -> { - if (event.getRole().isDeleted() || event.getRole().getColor().getAlpha() != 0) + if (event.getRole().isDeleted() || DiscordPlugin.plugin.isGameRole(event.getRole())) return; //Deleted or not a game role DiscordPlugin.GameRoles.add(event.getRole().getName()); DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Added " + event.getRole().getName() + " as game role. If you don't want this, change the role's color from the default."); @@ -136,10 +136,10 @@ public class CommandListener { if (DiscordPlugin.GameRoles.remove(event.getRole().getName())) DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Removed " + event.getRole().getName() + " as a game role."); }, (IListener) event -> { //Role update event - if (event.getNewRole().getColor().getAlpha() != 0) + if (!DiscordPlugin.plugin.isGameRole(event.getNewRole())) { if (DiscordPlugin.GameRoles.remove(event.getOldRole().getName())) - DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Removed " + event.getOldRole().getName() + " as a game role because it's color changed."); - else { + DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Removed " + event.getOldRole().getName() + " as a game role because it's color changed."); + } else { boolean removed = DiscordPlugin.GameRoles.remove(event.getOldRole().getName()); //Regardless of whether it was a game role DiscordPlugin.GameRoles.add(event.getNewRole().getName()); //Add it because it has no color if (removed) diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index 0ecf3ab..fc9c3e7 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -275,9 +275,12 @@ public class MCChatListener implements Listener, IListener } public static void forAllMCChat(Consumer action) { + System.out.println("XA"); action.accept(DiscordPlugin.chatchannel); + System.out.println("XB"); for (LastMsgData data : lastmsgPerUser) action.accept(data.channel); + System.out.println("XC"); } private static void forAllowedMCChat(Consumer action, TBMCSystemChatEvent event) { @@ -390,14 +393,15 @@ public class MCChatListener implements Listener, IListener int spi = cmd.indexOf(' '); final String topcmd = spi == -1 ? cmd : cmd.substring(0, spi); Optional ch = Channel.getChannels().stream() - .filter(c -> c.ID.equalsIgnoreCase(topcmd)).findAny(); + .filter(c -> c.ID.equalsIgnoreCase(topcmd) + || (c.IDs != null && c.IDs.length > 0 + && Arrays.stream(c.IDs).noneMatch(id -> id.equalsIgnoreCase(topcmd)))).findAny(); if (!ch.isPresent()) Bukkit.getScheduler().runTask(DiscordPlugin.plugin, () -> VanillaCommandListener.runBukkitOrVanillaCommand(dsender, cmd)); else { Channel chc = ch.get(); - if (!chc.ID.equals(Channel.GlobalChat.ID) - && !event.getMessage().getChannel().isPrivate()) + if (!chc.ID.equals(Channel.GlobalChat.ID) && !event.getMessage().getChannel().isPrivate()) dsender.sendMessage( "You can only talk in global in the public chat. DM `mcchat` to enable private chat to talk in the other channels."); else { From b8814030e2be7d002daff13700df6fb920d67724 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Fri, 8 Jun 2018 01:48:07 +0200 Subject: [PATCH 08/11] Fixes, channelcon, emoji Limited timeout for shutdown message Added some unconnected commands Fixed mcchat tasks on shutdown Added /rp as an allowed channel Changed help texts to use /command syntax Added channelcon remove Added emoji parsing --- pom.xml | 15 ++++---- .../buttondevteam/discordplugin/DPUtils.java | 35 +++++++++++++++---- .../discordplugin/DiscordPlugin.java | 30 +++++++++++++--- .../commands/ChannelconCommand.java | 20 +++++++---- .../discordplugin/commands/MCChatCommand.java | 3 +- .../listeners/CommandListener.java | 2 +- .../listeners/MCChatListener.java | 23 +++++++----- .../mccommands/AcceptMCCommand.java | 2 +- .../mccommands/DeclineMCCommand.java | 2 +- 9 files changed, 95 insertions(+), 37 deletions(-) diff --git a/pom.xml b/pom.xml index 8a8fac4..a6e0b14 100755 --- a/pom.xml +++ b/pom.xml @@ -151,12 +151,11 @@ 1.12.2-R0.1-SNAPSHOT provided + - com.github.austinv11 - Discord4j - master-SNAPSHOT - + com.discord4j + Discord4J + 2.10.1 @@ -213,6 +212,10 @@ 2.6 test - + + com.vdurmont + emoji-java + 4.0.0 + diff --git a/src/main/java/buttondevteam/discordplugin/DPUtils.java b/src/main/java/buttondevteam/discordplugin/DPUtils.java index d5a704f..d7c3bcb 100755 --- a/src/main/java/buttondevteam/discordplugin/DPUtils.java +++ b/src/main/java/buttondevteam/discordplugin/DPUtils.java @@ -1,11 +1,15 @@ package buttondevteam.discordplugin; +import buttondevteam.lib.TBMCCoreAPI; import org.bukkit.Bukkit; import sx.blah.discord.util.EmbedBuilder; import sx.blah.discord.util.RequestBuffer; import sx.blah.discord.util.RequestBuffer.IRequest; import sx.blah.discord.util.RequestBuffer.IVoidRequest; +import javax.annotation.Nullable; +import java.util.concurrent.TimeUnit; + public final class DPUtils { public static EmbedBuilder embedWithHead(EmbedBuilder builder, String playername) { @@ -34,16 +38,35 @@ public final class DPUtils { /** * Performs Discord actions, retrying when ratelimited. May return null if action fails too many times or in safe mode. */ - public static T perform(IRequest action) { + @Nullable + public static T perform(IRequest action, long timeout, TimeUnit unit) { + if (DiscordPlugin.SafeMode) + return null; + if (Thread.currentThread() == DiscordPlugin.mainThread) // TODO: Ignore shutdown message <-- + // throw new RuntimeException("Tried to wait for a Discord request on the main thread. This could cause lag."); + Bukkit.getLogger().warning("Waiting for a Discord request on the main thread!"); + try { + return RequestBuffer.request(action).get(timeout, unit); // Let the pros handle this + } catch (Exception e) { + TBMCCoreAPI.SendException("Couldn't perform Discord action!", e); + return null; + } + } + + /** + * Performs Discord actions, retrying when ratelimited. May return null if action fails too many times or in safe mode. + */ + @Nullable + public static T perform(IRequest action) { System.out.println("performA"); - if (DiscordPlugin.SafeMode) - return null; + if (DiscordPlugin.SafeMode) + return null; System.out.println("performB"); if (Thread.currentThread() == DiscordPlugin.mainThread) // TODO: Ignore shutdown message <-- - // throw new RuntimeException("Tried to wait for a Discord request on the main thread. This could cause lag."); + // throw new RuntimeException("Tried to wait for a Discord request on the main thread. This could cause lag."); Bukkit.getLogger().warning("Waiting for a Discord request on the main thread!"); - return RequestBuffer.request(action).get(); // Let the pros handle this - } + return RequestBuffer.request(action).get(); // Let the pros handle this + } /** * Performs Discord actions, retrying when ratelimited. diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java index 2de677b..2bbfa93 100755 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java @@ -32,6 +32,7 @@ import java.awt.*; import java.io.File; import java.nio.charset.StandardCharsets; import java.util.List; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; public class DiscordPlugin extends JavaPlugin implements IListener { @@ -243,7 +244,7 @@ public class DiscordPlugin extends JavaPlugin implements IListener { + (Bukkit.getOnlinePlayers().size() == 1 ? " was " : " were ") + "asked *politely* to leave the server for a bit.") : "") - .build())); + .build(), 5, TimeUnit.SECONDS)); System.out.println("XY"); ChromaBot.getInstance().updatePlayerList(); try { @@ -349,12 +350,25 @@ public class DiscordPlugin extends JavaPlugin implements IListener { return sendMessageToChannel(channel, message, embed, true); } + public static IMessage sendMessageToChannelWait(IChannel channel, String message, EmbedObject embed, long timeout, TimeUnit unit) { + System.out.println("lol!"); + return sendMessageToChannel(channel, message, embed, true, timeout, unit); + } + private static IMessage sendMessageToChannel(IChannel channel, String message, EmbedObject embed, boolean wait) { + return sendMessageToChannel(channel, message, embed, wait, -1, null); + } + + private static IMessage sendMessageToChannel(IChannel channel, String message, EmbedObject embed, boolean wait, long timeout, TimeUnit unit) { + System.out.println("lolwut"); if (message.length() > 1980) { + System.out.println("wut"); message = message.substring(0, 1980); Bukkit.getLogger() .warning("Message was too long to send to discord and got truncated. In " + channel.getName()); + System.out.println("wat"); } + System.out.println("wot"); try { System.out.println("sendA"); if (channel == chatchannel) @@ -366,10 +380,16 @@ public class DiscordPlugin extends JavaPlugin implements IListener { RequestBuffer.IRequest r = () -> embed == null ? channel.sendMessage(content) : channel.sendMessage(content, embed, false); System.out.println("sendC"); - if (wait) - return DPUtils.perform(r); - else { - DPUtils.performNoWait(r); + if (wait) { + if (unit != null) + return DPUtils.perform(r, timeout, unit); + else + return DPUtils.perform(r); + } else { + if (unit != null) + plugin.getLogger().warning("Tried to set timeout for non-waiting call."); + else + DPUtils.performNoWait(r); return null; } } catch (Exception e) { diff --git a/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java b/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java index 51b1846..1b336c1 100644 --- a/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java @@ -28,9 +28,14 @@ public class ChannelconCommand extends DiscordCommandBase { message.reply("you need to have manage permissions for this channel!"); return true; } - //TODO: What if they no longer have permission to view the channel - if (MCChatListener.hasCustomChat(message.getChannel())) { //TODO: Remove command - message.reply("this channel is already connected to a Minecraft channel."); + //TODO: What if they no longer have permission to view the channel - check on some message events and startup - if somebody who can view the channel (on both platforms) has their accounts connected, keep it + if (MCChatListener.hasCustomChat(message.getChannel())) { + if (args.equalsIgnoreCase("remove")) { + MCChatListener.removeCustomChat(message.getChannel()); + message.reply("channel connection removed."); + return true; + } + message.reply("this channel is already connected to a Minecraft channel. Use `/channelcon remove` to remove it."); return true; } val chan = Channel.getChannels().stream().filter(ch -> ch.ID.equalsIgnoreCase(args) || (ch.IDs != null && Arrays.stream(ch.IDs).anyMatch(cid -> cid.equalsIgnoreCase(args)))).findAny(); @@ -40,7 +45,7 @@ public class ChannelconCommand extends DiscordCommandBase { } val chp = DiscordPlayer.getUser(message.getAuthor().getStringID(), DiscordPlayer.class).getAs(TBMCPlayer.class); if (chp == null) { - message.reply("you need to connect your Minecraft account. In #bot do @ChromaBot connect "); + message.reply("you need to connect your Minecraft account. In this channel or on our server in #bot do /connect "); return true; } val ev = new TBMCChannelConnectEvent(new DiscordConnectedPlayer(message.getAuthor(), message.getChannel(), chp.getUUID(), Bukkit.getOfflinePlayer(chp.getUUID()).getName()), chan.get()); @@ -57,11 +62,12 @@ public class ChannelconCommand extends DiscordCommandBase { @Override public String[] getHelpText() { return new String[]{ // - "§6---- Channel connect ---", // + "---- 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 @ChromaBot 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 /connect .", // + "Call this command from the channel you want to use. Usage: /channelcon ", // + "To remove a connection use /channelcon remove in the channel.", // "Invite link: https://discordapp.com/oauth2/authorize?client_id=226443037893591041&scope=bot" // }; } diff --git a/src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java b/src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java index 05c66c0..0a59667 100755 --- a/src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java @@ -25,8 +25,7 @@ public class MCChatCommand extends DiscordCommandBase { MCChatListener.privateMCChat(message.getChannel(), mcchat, message.getAuthor(), user); DiscordPlugin.sendMessageToChannel(message.getChannel(), "Minecraft chat " + (mcchat // - ? "enabled. Use '" + message.getClient().getOurUser().mention() - + " mcchat' (with the mention) to disable." // + ? "enabled. Use '/mcchat' to disable." // : "disabled.")); } catch (Exception e) { TBMCCoreAPI.SendException("Error while setting mcchat for user" + message.getAuthor().getName(), e); diff --git a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java index 0b0055b..e42de00 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java @@ -145,7 +145,7 @@ public class CommandListener { if (removed) DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Changed game role from " + event.getOldRole().getName() + " to " + event.getNewRole().getName() + "."); else - DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Added " + event.getNewRole().getName() + " as game role because it has no color."); + DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Added " + event.getNewRole().getName() + " as game role because it has the default color."); } }}; } diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index fc9c3e7..6ec910e 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -10,6 +10,7 @@ import buttondevteam.lib.chat.Channel; import buttondevteam.lib.chat.ChatRoom; import buttondevteam.lib.chat.TBMCChatAPI; import buttondevteam.lib.player.TBMCPlayer; +import com.vdurmont.emoji.EmojiParser; import lombok.RequiredArgsConstructor; import lombok.val; import org.bukkit.Bukkit; @@ -57,7 +58,8 @@ public class MCChatListener implements Listener, IListener sendrunnable = () -> { sendthread = Thread.currentThread(); processMCToDiscord(); - sendtask = Bukkit.getScheduler().runTaskAsynchronously(DiscordPlugin.plugin, sendrunnable); + if (DiscordPlugin.plugin.isEnabled()) //Don't run again if shutting down + sendtask = Bukkit.getScheduler().runTaskAsynchronously(DiscordPlugin.plugin, sendrunnable); }; sendtask = Bukkit.getScheduler().runTaskAsynchronously(DiscordPlugin.plugin, sendrunnable); } @@ -170,7 +172,7 @@ public class MCChatListener implements Listener, IListener } private static final String[] UnconnectedCmds = new String[]{"list", "u", "shrug", "tableflip", "unflip", "mwiki", - "yeehaw", "lenny"}; + "yeehaw", "lenny", "rp", "plugins"}; private static LastMsgData lastmsgdata; private static short lastlist = 0; @@ -327,7 +329,8 @@ public class MCChatListener implements Listener, IListener recrun = () -> { //Don't return in a while loop next time recthread = Thread.currentThread(); processDiscordToMC(); - rectask = Bukkit.getScheduler().runTaskAsynchronously(DiscordPlugin.plugin, recrun); //Continue message processing + 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 } @@ -353,6 +356,9 @@ public class MCChatListener implements Listener, IListener dmessage = dmessage.replace(u.mention(true), "@" + (nick != null ? nick : u.getName())); } + dmessage = EmojiParser.parseToAliases(dmessage, EmojiParser.FitzpatrickAction.PARSE); //Converts emoji to text- TODO: Add option to disable (resource pack?) + dmessage = dmessage.replaceAll(":(\\S+)\\|type_(?:(\\d)|(1)_2):", ":$1::skin-tone-$2:"); //Convert to Discord's format so it still shows up + BiConsumer sendChatMessage = (channel, msg) -> // TBMCChatAPI.SendChatMessage(channel, dsender, msg + (event.getMessage().getAttachments().size() > 0 ? "\n" + event.getMessage() @@ -375,10 +381,11 @@ public class MCChatListener implements Listener, IListener + Arrays.stream(UnconnectedCmds).map(uc -> "/" + uc) .collect(Collectors.joining(", ")) + (user.getConnectedID(TBMCPlayer.class) == null - ? "\nTo access your commands, first please connect your accounts, using @ChromaBot connect in " + ? "\nTo access your commands, first please connect your accounts, using /connect in " + DiscordPlugin.botchannel.mention() - + "\nThen you can access all of your regular commands (even offline) in private chat: DM me `mcchat`!" - : "\nYou can access all of your regular commands (even offline) in private chat: DM me `mcchat`!")); + + "\nThen y" + : "\nY") + + "ou can access all of your regular commands (even offline) in private chat: DM me `mcchat`!"); return; } if (lastlist > 5) { @@ -395,13 +402,13 @@ public class MCChatListener implements Listener, IListener Optional ch = Channel.getChannels().stream() .filter(c -> c.ID.equalsIgnoreCase(topcmd) || (c.IDs != null && c.IDs.length > 0 - && Arrays.stream(c.IDs).noneMatch(id -> id.equalsIgnoreCase(topcmd)))).findAny(); + && Arrays.stream(c.IDs).anyMatch(id -> id.equalsIgnoreCase(topcmd)))).findAny(); if (!ch.isPresent()) Bukkit.getScheduler().runTask(DiscordPlugin.plugin, () -> VanillaCommandListener.runBukkitOrVanillaCommand(dsender, cmd)); else { Channel chc = ch.get(); - if (!chc.ID.equals(Channel.GlobalChat.ID) && !event.getMessage().getChannel().isPrivate()) + if (!chc.ID.equals(Channel.GlobalChat.ID) && !chc.ID.equals("rp") && !event.getMessage().getChannel().isPrivate()) dsender.sendMessage( "You can only talk in global in the public chat. DM `mcchat` to enable private chat to talk in the other channels."); else { diff --git a/src/main/java/buttondevteam/discordplugin/mccommands/AcceptMCCommand.java b/src/main/java/buttondevteam/discordplugin/mccommands/AcceptMCCommand.java index dfe3d25..13b3095 100755 --- a/src/main/java/buttondevteam/discordplugin/mccommands/AcceptMCCommand.java +++ b/src/main/java/buttondevteam/discordplugin/mccommands/AcceptMCCommand.java @@ -17,7 +17,7 @@ public class AcceptMCCommand extends DiscordMCCommandBase { return new String[] { // "§6---- Accept Discord connection ----", // "Accept a pending connection between your Discord and Minecraft account.", // - "To start the connection process, do §b@ChromaBot connect §r in the #bot channel on Discord", // + "To start the connection process, do §b/connect §r in the #bot channel on Discord", // "Usage: /" + alias + " accept" // }; } diff --git a/src/main/java/buttondevteam/discordplugin/mccommands/DeclineMCCommand.java b/src/main/java/buttondevteam/discordplugin/mccommands/DeclineMCCommand.java index f3d0fc7..831ad89 100755 --- a/src/main/java/buttondevteam/discordplugin/mccommands/DeclineMCCommand.java +++ b/src/main/java/buttondevteam/discordplugin/mccommands/DeclineMCCommand.java @@ -12,7 +12,7 @@ public class DeclineMCCommand extends DiscordMCCommandBase { return new String[] { // "§6---- Decline Discord connection ----", // "Decline a pending connection between your Discord and Minecraft account.", // - "To start the connection process, do §b@ChromaBot connect §r in the #bot channel on Discord", // + "To start the connection process, do §b/connect §r in the #bot channel on Discord", // "Usage: /" + alias + " decline" // }; } From 1b85eb027aa5b7037b18a060c92b2ef2e6fe8418 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Fri, 8 Jun 2018 23:45:10 +0200 Subject: [PATCH 09/11] Channelcon works, chat not yet Sending/receiving or saving connections doesn't work yet Command logging for Discord / prefix works from #bot Plugin update update (#37) #52 --- deploy.sh | 2 +- .../commands/ChannelconCommand.java | 26 +- .../discordplugin/commands/MCChatCommand.java | 2 +- .../listeners/CommandListener.java | 297 +++++++++--------- .../listeners/MCChatListener.java | 19 +- 5 files changed, 179 insertions(+), 167 deletions(-) diff --git a/deploy.sh b/deploy.sh index 606423b..a40b486 100755 --- a/deploy.sh +++ b/deploy.sh @@ -6,5 +6,5 @@ if [ $1 = 'production' ]; then echo Production mode echo $UPLOAD_KEY > upload_key chmod 400 upload_key -yes | scp -B -i upload_key -o StrictHostKeyChecking=no $FILENAME travis@server.figytuna.com:/minecraft/main/plugins +yes | scp -B -i upload_key -o StrictHostKeyChecking=no $FILENAME travis@server.figytuna.com:/minecraft/main/pluginupdates fi diff --git a/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java b/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java index 1b336c1..c7f4d13 100644 --- a/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java @@ -3,7 +3,7 @@ package buttondevteam.discordplugin.commands; import buttondevteam.discordplugin.DiscordConnectedPlayer; import buttondevteam.discordplugin.DiscordPlayer; import buttondevteam.discordplugin.listeners.MCChatListener; -import buttondevteam.lib.TBMCChannelConnectEvent; +import buttondevteam.lib.TBMCChannelConnectFakeEvent; import buttondevteam.lib.chat.Channel; import buttondevteam.lib.player.TBMCPlayer; import lombok.val; @@ -17,7 +17,7 @@ import java.util.Arrays; public class ChannelconCommand extends DiscordCommandBase { @Override public String getCommandName() { - return "here"; + return "channelcon"; } @Override @@ -31,8 +31,10 @@ public class ChannelconCommand extends DiscordCommandBase { //TODO: What if they no longer have permission to view the channel - check on some message events and startup - if somebody who can view the channel (on both platforms) has their accounts connected, keep it if (MCChatListener.hasCustomChat(message.getChannel())) { if (args.equalsIgnoreCase("remove")) { - MCChatListener.removeCustomChat(message.getChannel()); - message.reply("channel connection removed."); + if (MCChatListener.removeCustomChat(message.getChannel())) + message.reply("channel connection removed."); + else + message.reply("wait what, couldn't remove channel connection."); return true; } message.reply("this channel is already connected to a Minecraft channel. Use `/channelcon remove` to remove it."); @@ -48,14 +50,15 @@ public class ChannelconCommand extends DiscordCommandBase { message.reply("you need to connect your Minecraft account. In this channel or on our server in #bot do /connect "); return true; } - val ev = new TBMCChannelConnectEvent(new DiscordConnectedPlayer(message.getAuthor(), message.getChannel(), chp.getUUID(), Bukkit.getOfflinePlayer(chp.getUUID()).getName()), chan.get()); - Bukkit.getPluginManager().callEvent(ev); //Using a fake player with no login/logout, should be fine for this event - if (ev.isCancelled() || ev.getGroupid() == null) { + val ev = new TBMCChannelConnectFakeEvent(new DiscordConnectedPlayer(message.getAuthor(), message.getChannel(), chp.getUUID(), Bukkit.getOfflinePlayer(chp.getUUID()).getName()), chan.get()); + //Using a fake player with no login/logout, should be fine for this event + String groupid = ev.getGroupID(ev.getSender()); //We're not trying to send in a specific group, we want to know which group the user belongs to (so not getGroupID()) + if (groupid == null) { message.reply("sorry, that didn't work. You cannot use that Minecraft channel."); return true; } MCChatListener.addCustomChat(message.getChannel(), args, ev.getChannel()); - message.reply("alright, connection made!"); + message.reply("alright, connection made to group `" + groupid + "`!"); return true; } @@ -66,9 +69,10 @@ public class ChannelconCommand extends DiscordCommandBase { "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: /channelcon ", // - "To remove a connection use /channelcon remove in the channel.", // - "Invite link: https://discordapp.com/oauth2/authorize?client_id=226443037893591041&scope=bot" // + "Call this command from the channel you want to use. Usage: @ChromaBot channelcon ", // + "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.", // + "Invite link: " // }; } } diff --git a/src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java b/src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java index 0a59667..e2ca2ca 100755 --- a/src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java @@ -25,7 +25,7 @@ public class MCChatCommand extends DiscordCommandBase { MCChatListener.privateMCChat(message.getChannel(), mcchat, message.getAuthor(), user); DiscordPlugin.sendMessageToChannel(message.getChannel(), "Minecraft chat " + (mcchat // - ? "enabled. Use '/mcchat' to disable." // + ? "enabled. Use '/mcchat' again to turn it off." // : "disabled.")); } catch (Exception e) { TBMCCoreAPI.SendException("Error while setting mcchat for user" + message.getAuthor().getName(), e); diff --git a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java index e42de00..eaf0927 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java @@ -26,105 +26,109 @@ import java.util.concurrent.TimeUnit; public class CommandListener { - private static final String[] serverReadyStrings = new String[] { "In one week from now", // Ali - "Between now and the heat-death of the universe.", // Ghostise - "Soon™", "Ask again this time next month", // Ghostise - "In about 3 seconds", // Nicolai - "After we finish 8 plugins", // Ali - "Tomorrow.", // Ali - "After one tiiiny feature", // Ali - "Next commit", // Ali - "After we finish strangling Towny", // Ali - "When we kill every *fucking* bug", // Ali - "Once the server stops screaming.", // Ali - "After HL3 comes out", // Ali - "Next time you ask", // Ali - "When will *you* be open?" // Ali - }; + private static final String[] serverReadyStrings = new String[]{"In one week from now", // Ali + "Between now and the heat-death of the universe.", // Ghostise + "Soon™", "Ask again this time next month", // Ghostise + "In about 3 seconds", // Nicolai + "After we finish 8 plugins", // Ali + "Tomorrow.", // Ali + "After one tiiiny feature", // Ali + "Next commit", // Ali + "After we finish strangling Towny", // Ali + "When we kill every *fucking* bug", // Ali + "Once the server stops screaming.", // Ali + "After HL3 comes out", // Ali + "Next time you ask", // Ali + "When will *you* be open?" // Ali + }; - private static final String[] serverReadyQuestions = new String[] { "when will the server be open", - "when will the server be ready", "when will the server be done", "when will the server be complete", - "when will the server be finished", "when's the server ready", "when's the server open", - "Vhen vill ze server be open?" }; + private static final String[] serverReadyQuestions = new String[]{"when will the server be open", + "when will the server be ready", "when will the server be done", "when will the server be complete", + "when will the server be finished", "when's the server ready", "when's the server open", + "Vhen vill ze server be open?"}; - private static final Random serverReadyRandom = new Random(); - private static final ArrayList usableServerReadyStrings = new ArrayList(serverReadyStrings.length) { - private static final long serialVersionUID = 2213771460909848770L; - { - createUsableServerReadyStrings(this); - } - }; + private static final Random serverReadyRandom = new Random(); + private static final ArrayList usableServerReadyStrings = new ArrayList(serverReadyStrings.length) { + private static final long serialVersionUID = 2213771460909848770L; - private static void createUsableServerReadyStrings(ArrayList list) { - for (short i = 0; i < serverReadyStrings.length; i++) - list.add(i); - } + { + createUsableServerReadyStrings(this); + } + }; - private static long lasttime = 0; + private static void createUsableServerReadyStrings(ArrayList list) { + for (short i = 0; i < serverReadyStrings.length; i++) + list.add(i); + } - 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; - final IChannel channel = event.getMessage().getChannel(); - if (!channel.getStringID().equals(DiscordPlugin.botchannel.getStringID())) - return; - if (channel.getStringID().equals(DiscordPlugin.chatchannel.getStringID())) - return; // The chat code already handles this - Right now while testing botchannel is the same as chatchannel - event.getMessage().getChannel().setTypingStatus(true); // Fun - runCommand(event.getMessage(), true); - } - }, new IListener() { - @Override - public void handle(MessageReceivedEvent event) { - if (DiscordPlugin.SafeMode) - return; - final String msglowercase = event.getMessage().getContent().toLowerCase(); - if (!TBMCCoreAPI.IsTestServer() - && Arrays.stream(serverReadyQuestions).anyMatch(s -> msglowercase.contains(s))) { - int next; - if (usableServerReadyStrings.size() == 0) - createUsableServerReadyStrings(usableServerReadyStrings); - next = usableServerReadyStrings.remove(serverReadyRandom.nextInt(usableServerReadyStrings.size())); - DiscordPlugin.sendMessageToChannel(event.getMessage().getChannel(), serverReadyStrings[next]); - return; - } - if (!event.getMessage().getChannel().isPrivate()) // - return; - if (DiscordPlayer.getUser(event.getAuthor().getStringID(), DiscordPlayer.class) - .isMinecraftChatEnabled()) - if (!event.getMessage().getContent().equalsIgnoreCase("mcchat")) - return; - if (event.getMessage().getAuthor().isBot()) - return; - runCommand(event.getMessage(), false); - } - }, new IListener() { - @Override - public void handle(PresenceUpdateEvent event) { - if (DiscordPlugin.SafeMode) - return; - val devrole = DiscordPlugin.devServer.getRolesByName("Developer").get(0); - if (event.getOldPresence().getStatus().equals(StatusType.OFFLINE) - && !event.getNewPresence().getStatus().equals(StatusType.OFFLINE) - && event.getUser().getRolesForGuild(DiscordPlugin.devServer).stream() + private static long lasttime = 0; + + 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; + final IChannel channel = event.getMessage().getChannel(); + if (!channel.getStringID().equals(DiscordPlugin.botchannel.getStringID()) + && !event.getMessage().getContent().contains("channelcon")) + return; + if (channel.getStringID().equals(DiscordPlugin.chatchannel.getStringID())) + return; // The chat code already handles this - Right now while testing botchannel is the same as chatchannel + event.getMessage().getChannel().setTypingStatus(true); // Fun + runCommand(event.getMessage(), true); + } + }, new IListener() { + @Override + public void handle(MessageReceivedEvent event) { + if (DiscordPlugin.SafeMode) + return; + final String msglowercase = event.getMessage().getContent().toLowerCase(); + if (!TBMCCoreAPI.IsTestServer() + && Arrays.stream(serverReadyQuestions).anyMatch(s -> msglowercase.contains(s))) { + int next; + if (usableServerReadyStrings.size() == 0) + createUsableServerReadyStrings(usableServerReadyStrings); + next = usableServerReadyStrings.remove(serverReadyRandom.nextInt(usableServerReadyStrings.size())); + DiscordPlugin.sendMessageToChannel(event.getMessage().getChannel(), serverReadyStrings[next]); + return; + } + if (!event.getMessage().getChannel().isPrivate() + && !(event.getMessage().getContent().startsWith("/") + && event.getChannel().getStringID().equals(DiscordPlugin.botchannel.getStringID()))) // + return; + if (DiscordPlayer.getUser(event.getAuthor().getStringID(), DiscordPlayer.class) + .isMinecraftChatEnabled()) + if (!event.getMessage().getContent().equalsIgnoreCase("mcchat")) + return; + if (event.getMessage().getAuthor().isBot()) + return; + runCommand(event.getMessage(), false); + } + }, new IListener() { + @Override + public void handle(PresenceUpdateEvent event) { + if (DiscordPlugin.SafeMode) + return; + val devrole = DiscordPlugin.devServer.getRolesByName("Developer").get(0); + if (event.getOldPresence().getStatus().equals(StatusType.OFFLINE) + && !event.getNewPresence().getStatus().equals(StatusType.OFFLINE) + && event.getUser().getRolesForGuild(DiscordPlugin.devServer).stream() .anyMatch(r -> r.getLongID() == devrole.getLongID()) - && DiscordPlugin.devServer.getUsersByRole(devrole).stream() + && DiscordPlugin.devServer.getUsersByRole(devrole).stream() .noneMatch(u -> u.getPresence().getStatus().equals(StatusType.OFFLINE)) - && lasttime + 10 < TimeUnit.NANOSECONDS.toHours(System.nanoTime()) - && Calendar.getInstance().get(Calendar.DAY_OF_MONTH) % 5 == 0) { - DiscordPlugin.sendMessageToChannel(DiscordPlugin.devofficechannel, "Full house!", - new EmbedBuilder() - .withImage( - "https://cdn.discordapp.com/attachments/249295547263877121/249687682618359808/poker-hand-full-house-aces-kings-playing-cards-15553791.png") - .build()); - lasttime = TimeUnit.NANOSECONDS.toHours(System.nanoTime()); - } - } + && lasttime + 10 < TimeUnit.NANOSECONDS.toHours(System.nanoTime()) + && Calendar.getInstance().get(Calendar.DAY_OF_MONTH) % 5 == 0) { + DiscordPlugin.sendMessageToChannel(DiscordPlugin.devofficechannel, "Full house!", + new EmbedBuilder() + .withImage( + "https://cdn.discordapp.com/attachments/249295547263877121/249687682618359808/poker-hand-full-house-aces-kings-playing-cards-15553791.png") + .build()); + lasttime = TimeUnit.NANOSECONDS.toHours(System.nanoTime()); + } + } }, (IListener) event -> { Bukkit.getScheduler().runTaskLaterAsynchronously(DiscordPlugin.plugin, () -> { if (event.getRole().isDeleted() || DiscordPlugin.plugin.isGameRole(event.getRole())) @@ -135,65 +139,63 @@ public class CommandListener { }, (IListener) event -> { if (DiscordPlugin.GameRoles.remove(event.getRole().getName())) DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Removed " + event.getRole().getName() + " as a game role."); - }, (IListener) event -> { //Role update event + }, (IListener) event -> { //Role update event if (!DiscordPlugin.plugin.isGameRole(event.getNewRole())) { - if (DiscordPlugin.GameRoles.remove(event.getOldRole().getName())) + if (DiscordPlugin.GameRoles.remove(event.getOldRole().getName())) DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Removed " + event.getOldRole().getName() + " as a game role because it's color changed."); } else { - boolean removed = DiscordPlugin.GameRoles.remove(event.getOldRole().getName()); //Regardless of whether it was a game role - DiscordPlugin.GameRoles.add(event.getNewRole().getName()); //Add it because it has no color - if (removed) - DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Changed game role from " + event.getOldRole().getName() + " to " + event.getNewRole().getName() + "."); - else - DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Added " + event.getNewRole().getName() + " as game role because it has the default color."); - } + boolean removed = DiscordPlugin.GameRoles.remove(event.getOldRole().getName()); //Regardless of whether it was a game role + DiscordPlugin.GameRoles.add(event.getNewRole().getName()); //Add it because it has no color + if (removed) + DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Changed game role from " + event.getOldRole().getName() + " to " + event.getNewRole().getName() + "."); + else + DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Added " + event.getNewRole().getName() + " as game role because it has the default color."); + } }}; - } + } - /** - * Runs a ChromaBot command. + /** + * Runs a ChromaBot command. * - * @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 (always true if mentionedonly is false) - */ - public static boolean runCommand(IMessage message, boolean mentionedonly) { + * @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 (always true if mentionedonly is false) + */ + public static boolean runCommand(IMessage message, boolean mentionedonly) { debug("A"); - if (DiscordPlugin.SafeMode) - return true; + if (DiscordPlugin.SafeMode) + return true; debug("B"); - final StringBuilder cmdwithargs = new StringBuilder(message.getContent()); - final String mention = DiscordPlugin.dc.getOurUser().mention(false); - final String mentionNick = DiscordPlugin.dc.getOurUser().mention(true); - boolean gotmention = checkanddeletemention(cmdwithargs, mention, message); - gotmention = checkanddeletemention(cmdwithargs, mentionNick, message) || gotmention; + final StringBuilder cmdwithargs = new StringBuilder(message.getContent()); + final String mention = DiscordPlugin.dc.getOurUser().mention(false); + final String mentionNick = DiscordPlugin.dc.getOurUser().mention(true); + boolean gotmention = checkanddeletemention(cmdwithargs, mention, message); + gotmention = checkanddeletemention(cmdwithargs, mentionNick, message) || gotmention; for (String mentionRole : (Iterable) message.getRoleMentions().stream().filter(r -> DiscordPlugin.dc.getOurUser().hasRole(r)).map(r -> r.mention())::iterator) - gotmention = checkanddeletemention(cmdwithargs, mentionRole, message) || gotmention; // Delete all mentions + gotmention = checkanddeletemention(cmdwithargs, mentionRole, message) || gotmention; // Delete all mentions debug("C"); - if (mentionedonly && !gotmention) { - message.getChannel().setTypingStatus(false); - return false; - } + if (mentionedonly && !gotmention) { + message.getChannel().setTypingStatus(false); + return false; + } debug("D"); - message.getChannel().setTypingStatus(true); + message.getChannel().setTypingStatus(true); String cmdwithargsString = cmdwithargs.toString().trim(); //Remove spaces between mention and command int index = cmdwithargsString.indexOf(" "); - String cmd; - String args; - if (index == -1) { + String cmd; + String args; + if (index == -1) { cmd = cmdwithargsString; - args = ""; - } else { + args = ""; + } else { cmd = cmdwithargsString.substring(0, index); args = cmdwithargsString.substring(index + 1).trim(); //In case there are multiple spaces } debug("E"); - DiscordCommandBase.runCommand(cmd.toLowerCase(), args, message); - message.getChannel().setTypingStatus(false); - return true; - } + DiscordCommandBase.runCommand(cmd.toLowerCase(), args, message); + message.getChannel().setTypingStatus(false); + return true; + } private static boolean debug = false; @@ -206,17 +208,20 @@ public class CommandListener { return debug = !debug; } - private static boolean checkanddeletemention(StringBuilder cmdwithargs, String mention, IMessage message) { - if (message.getContent().startsWith(mention)) // TODO: Resolve mentions: Compound arguments, either a mention or text - if (cmdwithargs.length() > mention.length() + 1) - cmdwithargs = cmdwithargs.delete(0, - cmdwithargs.charAt(mention.length()) == ' ' ? mention.length() + 1 : mention.length()); - else - cmdwithargs.replace(0, cmdwithargs.length(), "help"); - else - return false; - if (cmdwithargs.length() == 0) - cmdwithargs.replace(0, cmdwithargs.length(), "help"); - return true; - } + private static boolean checkanddeletemention(StringBuilder cmdwithargs, String mention, IMessage message) { + if (message.getContent().startsWith(mention)) // TODO: Resolve mentions: Compound arguments, either a mention or text + if (cmdwithargs.length() > mention.length() + 1) + cmdwithargs = cmdwithargs.delete(0, + cmdwithargs.charAt(mention.length()) == ' ' ? mention.length() + 1 : mention.length()); + else + cmdwithargs.replace(0, cmdwithargs.length(), "help"); + else { + if (cmdwithargs.charAt(0) == '/') + cmdwithargs.deleteCharAt(0); //Don't treat / as mention, mentions can be used in public mcchat + return false; + } + if (cmdwithargs.length() == 0) + cmdwithargs.replace(0, cmdwithargs.length(), "help"); + return true; + } } diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index 6ec910e..5d2f67e 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -373,9 +373,9 @@ public class MCChatListener implements Listener, IListener event.getMessage().delete(); }); preprocessChat(dsender, dmessage); - final String cmd = dmessage.substring(1).toLowerCase(); + final String cmdlowercased = dmessage.substring(1).toLowerCase(); if (dsender instanceof DiscordSender && Arrays.stream(UnconnectedCmds) - .noneMatch(s -> cmd.equals(s) || cmd.startsWith(s + " "))) { + .noneMatch(s -> cmdlowercased.equals(s) || cmdlowercased.startsWith(s + " "))) { // Command not whitelisted dsender.sendMessage("Sorry, you can only access these commands:\n" + Arrays.stream(UnconnectedCmds).map(uc -> "/" + uc) @@ -392,20 +392,23 @@ public class MCChatListener implements Listener, IListener ListC = 0; lastlist = 0; } - if (cmd.equals("list") && Bukkit.getOnlinePlayers().size() == lastlistp && ListC++ > 2) // Lowered already + if (cmdlowercased.equals("list") && Bukkit.getOnlinePlayers().size() == lastlistp && ListC++ > 2) // Lowered already { dsender.sendMessage("Stop it. You know the answer."); lastlist = 0; } else { - int spi = cmd.indexOf(' '); - final String topcmd = spi == -1 ? cmd : cmd.substring(0, spi); + int spi = cmdlowercased.indexOf(' '); + final String topcmd = spi == -1 ? cmdlowercased : cmdlowercased.substring(0, spi); Optional ch = Channel.getChannels().stream() .filter(c -> c.ID.equalsIgnoreCase(topcmd) || (c.IDs != null && c.IDs.length > 0 && Arrays.stream(c.IDs).anyMatch(id -> id.equalsIgnoreCase(topcmd)))).findAny(); if (!ch.isPresent()) Bukkit.getScheduler().runTask(DiscordPlugin.plugin, - () -> VanillaCommandListener.runBukkitOrVanillaCommand(dsender, cmd)); + () -> { + VanillaCommandListener.runBukkitOrVanillaCommand(dsender, cmdlowercased); + Bukkit.getLogger().info(dsender.getName() + " issued command from Discord: /" + cmdlowercased); + }); else { Channel chc = ch.get(); if (!chc.ID.equals(Channel.GlobalChat.ID) && !chc.ID.equals("rp") && !event.getMessage().getChannel().isPrivate()) @@ -426,7 +429,7 @@ public class MCChatListener implements Listener, IListener dsender.sendMessage("You're now talking in: " + DPUtils.sanitizeString(dsender.getMcchannel().DisplayName)); } else { // Send single message - sendChatMessage.accept(chc, cmd.substring(spi + 1)); + sendChatMessage.accept(chc, event.getMessage().getContent().substring(spi + 2)); react = true; } } @@ -436,7 +439,7 @@ public class MCChatListener implements Listener, IListener } else {// Not a command if (dmessage.length() == 0 && event.getMessage().getAttachments().size() == 0 && !event.getChannel().isPrivate()) - TBMCChatAPI.SendSystemMessage(Channel.GlobalChat, 0, + TBMCChatAPI.SendSystemMessage(Channel.GlobalChat, 0, "everyone", (dsender instanceof Player ? ((Player) dsender).getDisplayName() : dsender.getName()) + " pinned a message on Discord."); else { From 29683d4c0c7ada0190b865af301c5801e875d030 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Wed, 13 Jun 2018 01:30:17 +0200 Subject: [PATCH 10/11] Channelcon chat almost works #52 --- .../commands/ChannelconCommand.java | 11 +-- .../listeners/CommandListener.java | 2 +- .../listeners/MCChatListener.java | 74 +++++++++++++++---- 3 files changed, 65 insertions(+), 22 deletions(-) diff --git a/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java b/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java index c7f4d13..44c88a7 100644 --- a/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java @@ -37,7 +37,7 @@ public class ChannelconCommand extends DiscordCommandBase { message.reply("wait what, couldn't remove channel connection."); return true; } - message.reply("this channel is already connected to a Minecraft channel. Use `/channelcon remove` to remove it."); + message.reply("this channel is already connected to a Minecraft channel. Use `@ChromaBot channelcon remove` to remove it."); return true; } val chan = Channel.getChannels().stream().filter(ch -> ch.ID.equalsIgnoreCase(args) || (ch.IDs != null && Arrays.stream(ch.IDs).anyMatch(cid -> cid.equalsIgnoreCase(args)))).findAny(); @@ -45,9 +45,10 @@ public class ChannelconCommand extends DiscordCommandBase { message.reply("MC channel with ID '" + args + "' not found! The ID is the command for it without the /."); return true; } - val chp = DiscordPlayer.getUser(message.getAuthor().getStringID(), DiscordPlayer.class).getAs(TBMCPlayer.class); + val dp = DiscordPlayer.getUser(message.getAuthor().getStringID(), DiscordPlayer.class); + val chp = dp.getAs(TBMCPlayer.class); if (chp == null) { - message.reply("you need to connect your Minecraft account. In this channel or on our server in #bot do /connect "); + message.reply("you need to connect your Minecraft account. On our server in #bot do /connect "); return true; } val ev = new TBMCChannelConnectFakeEvent(new DiscordConnectedPlayer(message.getAuthor(), message.getChannel(), chp.getUUID(), Bukkit.getOfflinePlayer(chp.getUUID()).getName()), chan.get()); @@ -57,7 +58,7 @@ public class ChannelconCommand extends DiscordCommandBase { message.reply("sorry, that didn't work. You cannot use that Minecraft channel."); return true; } - MCChatListener.addCustomChat(message.getChannel(), args, ev.getChannel()); + MCChatListener.addCustomChat(message.getChannel(), args, ev.getChannel(), dp, message.getAuthor()); //TODO: SAVE message.reply("alright, connection made to group `" + groupid + "`!"); return true; } @@ -72,7 +73,7 @@ public class ChannelconCommand extends DiscordCommandBase { "Call this command from the channel you want to use. Usage: @ChromaBot channelcon ", // "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.", // - "Invite link: " // + "Invite link: " // }; } } diff --git a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java index eaf0927..12fbdbd 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java @@ -73,7 +73,7 @@ public class CommandListener { return; final IChannel channel = event.getMessage().getChannel(); if (!channel.getStringID().equals(DiscordPlugin.botchannel.getStringID()) - && !event.getMessage().getContent().contains("channelcon")) + && (!event.getMessage().getContent().contains("channelcon") || MCChatListener.hasCustomChat(channel))) //Allow channelcon in other servers but avoid double handling when it's enabled return; if (channel.getStringID().equals(DiscordPlugin.chatchannel.getStringID())) return; // The chat code already handles this - Right now while testing botchannel is the same as chatchannel diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index 5d2f67e..2754e63 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -121,6 +121,7 @@ public class MCChatListener implements Listener, IListener } }; // Checks if the given channel is different than where the message was sent from + // Or if it was from MC Predicate isdifferentchannel = ch -> !(e.getSender() instanceof DiscordSenderBase) || ((DiscordSenderBase) e.getSender()).getChannel().getLongID() != ch.getLongID(); @@ -132,9 +133,22 @@ public class MCChatListener implements Listener, IListener for (LastMsgData data : lastmsgPerUser) { if (data.dp.isMinecraftChatEnabled() && (e.isFromcmd() || isdifferentchannel.test(data.channel)) - && e.shouldSendTo(getSender(data.channel, data.user, data.dp))) + && e.shouldSendTo(getSender(data.channel, data.user))) doit.accept(data); } + + val iterator = lastmsgCustom.iterator(); + while (iterator.hasNext()) { //TODO: Add cmd to fix mcchat + val lmd = iterator.next(); + if ((e.isFromcmd() || isdifferentchannel.test(lmd.channel)) //Test if msg is from Discord + && e.getChannel().ID.equals(lmd.mcchannel.ID)) //If it's from a command, the command msg has been deleted, so we need to send it + if (e.shouldSendTo(getSender(lmd.channel, lmd.user)) && e.getGroupID().equals(lmd.groupID)) + doit.accept(lmd); //TODO: Store dcp and check that both ways, add option to not check sender perms on msg + else { + iterator.remove(); //If the user no longer has permission, remove the connection + DiscordPlugin.sendMessageToChannel(lmd.channel, "The user no longer has permission to view the channel, connection removed."); + } + } } catch (Exception ex) { TBMCCoreAPI.SendException("Error while sending message to Discord!", ex); } @@ -151,6 +165,18 @@ public class MCChatListener implements Listener, IListener public final DiscordPlayer dp; } + private static class CustomLMD extends LastMsgData { + public final String groupID; + public final Channel mcchannel; + + public CustomLMD(IChannel channel, IUser user, DiscordPlayer dp, String groupid, Channel mcchannel) { + super(channel, user, dp); + groupID = groupid; + this.mcchannel = mcchannel; + + } + } + @EventHandler public void onChatPreprocess(TBMCChatPreprocessEvent event) { int start = -1; @@ -184,7 +210,7 @@ public class MCChatListener implements Listener, IListener /** * Used for town or nation chats or anything else */ - private static HashMap lastmsgCustom = new HashMap<>(); + private static ArrayList lastmsgCustom = new ArrayList<>(); public static boolean privateMCChat(IChannel channel, boolean start, IUser user, DiscordPlayer dp) { TBMCPlayer mcp = dp.getAs(TBMCPlayer.class); @@ -228,18 +254,21 @@ public class MCChatListener implements Listener, IListener .anyMatch(lmd -> ((IPrivateChannel) lmd.channel).getRecipient().getStringID().equals(did)); } - public static void addCustomChat(IChannel channel, String groupid, Channel mcchannel) { - val lmd = new LastMsgData(channel, null, null); - lmd.mcchannel = mcchannel; - lastmsgCustom.put(lmd, groupid); + public static void addCustomChat(IChannel channel, String groupid, Channel mcchannel, DiscordPlayer dp, IUser user) { + val lmd = new CustomLMD(channel, user, dp, groupid, mcchannel); + lastmsgCustom.add(lmd); } public static boolean hasCustomChat(IChannel channel) { - return lastmsgCustom.entrySet().stream().anyMatch(lmd -> lmd.getKey().channel.getLongID() == channel.getLongID()); + return lastmsgCustom.stream().anyMatch(lmd -> lmd.channel.getLongID() == channel.getLongID()); + } + + public static CustomLMD getCustomChat(IChannel channel) { + return lastmsgCustom.stream().filter(lmd -> lmd.channel.getLongID() == channel.getLongID()).findAny().orElse(null); } public static boolean removeCustomChat(IChannel channel) { - return lastmsgCustom.entrySet().removeIf(lmd -> lmd.getKey().channel.getLongID() == channel.getLongID()); + return lastmsgCustom.removeIf(lmd -> lmd.channel.getLongID() == channel.getLongID()); } /** @@ -264,6 +293,12 @@ public class MCChatListener implements Listener, IListener data.message = null; // Since only private channels are stored, only those will work anyways } + public static void resetLastMessageCustom(IChannel channel) { + for (LastMsgData data : lastmsgCustom) + if (data.channel.getLongID() == channel.getLongID()) + data.message = null; + } + /** * This overload sends it to the global chat. */ @@ -289,7 +324,7 @@ public class MCChatListener implements Listener, IListener if (Channel.GlobalChat.ID.equals(event.getChannel().ID)) action.accept(DiscordPlugin.chatchannel); for (LastMsgData data : lastmsgPerUser) - if (event.shouldSendTo(getSender(data.channel, data.user, data.dp))) + if (event.shouldSendTo(getSender(data.channel, data.user))) action.accept(data.channel); } @@ -309,17 +344,21 @@ public class MCChatListener implements Listener, IListener if (DiscordPlugin.SafeMode) return; val author = ev.getMessage().getAuthor(); - if (!ev.getMessage().getChannel().getStringID().equals(DiscordPlugin.chatchannel.getStringID()) - && !(ev.getMessage().getChannel().isPrivate() && isMinecraftChatEnabled(author.getStringID()))) - return; if (author.isBot()) return; + final boolean hasCustomChat = hasCustomChat(ev.getChannel()); + if (!ev.getMessage().getChannel().getStringID().equals(DiscordPlugin.chatchannel.getStringID()) + && !(ev.getMessage().getChannel().isPrivate() && isMinecraftChatEnabled(author.getStringID())) + && !hasCustomChat) + return; if (ev.getMessage().getContent().equalsIgnoreCase("mcchat")) return; // Race condition: If it gets here after it enabled mcchat it says it - I might as well allow disabling with this (CommandListener) if (CommandListener.runCommand(ev.getMessage(), true)) return; if (!ev.getMessage().getChannel().isPrivate()) resetLastMessage(); + else if (hasCustomChat) + resetLastMessageCustom(ev.getChannel()); else resetLastMessage(ev.getMessage().getChannel()); lastlist++; @@ -348,7 +387,7 @@ public class MCChatListener implements Listener, IListener val user = DiscordPlayer.getUser(sender.getStringID(), DiscordPlayer.class); String dmessage = event.getMessage().getContent(); try { - final DiscordSenderBase dsender = getSender(event.getMessage().getChannel(), sender, user); + final DiscordSenderBase dsender = getSender(event.getMessage().getChannel(), sender); for (IUser u : event.getMessage().getMentions()) { dmessage = dmessage.replace(u.mention(false), "@" + u.getName()); // TODO: IG Formatting @@ -438,11 +477,14 @@ public class MCChatListener implements Listener, IListener lastlistp = (short) Bukkit.getOnlinePlayers().size(); } else {// Not a command if (dmessage.length() == 0 && event.getMessage().getAttachments().size() == 0 - && !event.getChannel().isPrivate()) + && !event.getChannel().isPrivate() && event.getMessage().isSystemMessage()) TBMCChatAPI.SendSystemMessage(Channel.GlobalChat, 0, "everyone", (dsender instanceof Player ? ((Player) dsender).getDisplayName() : dsender.getName()) + " pinned a message on Discord."); - else { + else if (hasCustomChat(event.getChannel())) { + val cc = getCustomChat(event.getChannel()); + sendChatMessage.accept(cc.mcchannel, dmessage); + } else { sendChatMessage.accept(dsender.getMcchannel(), dmessage); react = true; } @@ -507,7 +549,7 @@ public class MCChatListener implements Listener, IListener /** * This method will find the best sender to use: if the player is online, use that, if not but connected then use that etc. */ - private static DiscordSenderBase getSender(IChannel channel, final IUser author, DiscordPlayer dp) { + private static DiscordSenderBase getSender(IChannel channel, final IUser author) { val key = (channel.isPrivate() ? "" : "P") + author.getStringID(); return Stream.>>of( // https://stackoverflow.com/a/28833677/2703239 () -> Optional.ofNullable(OnlineSenders.get(key)), // Find first non-null From e47f8abb05c26209670f81cfd9df7bfee67d3cf6 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Wed, 13 Jun 2018 23:54:27 +0200 Subject: [PATCH 11/11] Channelcon chat works! groupid, not args... that took a while to track down... Various fixes regarding channelcon Saving channel connections works Fromcmd fix for channel cmds Only allow game roles from the main server Game role fix Only allowing one connection per group for now --- .../discordplugin/ChromaBot.java | 10 +-- .../buttondevteam/discordplugin/DPUtils.java | 2 - .../discordplugin/DiscordPlugin.java | 60 +++++++++++------- .../commands/ChannelconCommand.java | 10 ++- .../listeners/CommandListener.java | 4 +- .../listeners/MCChatListener.java | 63 +++++++++++-------- 6 files changed, 86 insertions(+), 63 deletions(-) diff --git a/src/main/java/buttondevteam/discordplugin/ChromaBot.java b/src/main/java/buttondevteam/discordplugin/ChromaBot.java index e67b431..e597095 100755 --- a/src/main/java/buttondevteam/discordplugin/ChromaBot.java +++ b/src/main/java/buttondevteam/discordplugin/ChromaBot.java @@ -46,7 +46,7 @@ public class ChromaBot { } /** - * Send a message to the chat channel and private chats. + * Send a message to the chat channels and private chats. * * @param message * The message to send, duh @@ -72,7 +72,7 @@ public class ChromaBot { } /** - * Send a fancy message to the chat channel. This will show a bold text with a colored line. + * Send a fancy message to the chat channels. This will show a bold text with a colored line. * * @param message * The message to send, duh @@ -85,7 +85,7 @@ public class ChromaBot { } /** - * Send a fancy message to the chat channel. This will show a bold text with a colored line. + * Send a fancy message to the chat channels. This will show a bold text with a colored line. * * @param message * The message to send, duh @@ -100,7 +100,7 @@ public class ChromaBot { } /** - * Send a fancy message to the chat channel. This will show a bold text with a colored line. + * Send a fancy message to the chat channels. This will show a bold text with a colored line. * * @param message * The message to send, duh @@ -117,7 +117,7 @@ public class ChromaBot { } /** - * Send a message to the chat channel. This will show a bold text with a colored line. + * Send a message to the chat channels. This will show a bold text with a colored line. * * @param message * The message to send, duh diff --git a/src/main/java/buttondevteam/discordplugin/DPUtils.java b/src/main/java/buttondevteam/discordplugin/DPUtils.java index d7c3bcb..abc1f8f 100755 --- a/src/main/java/buttondevteam/discordplugin/DPUtils.java +++ b/src/main/java/buttondevteam/discordplugin/DPUtils.java @@ -58,10 +58,8 @@ public final class DPUtils { */ @Nullable public static T perform(IRequest action) { - System.out.println("performA"); if (DiscordPlugin.SafeMode) return null; - System.out.println("performB"); if (Thread.currentThread() == DiscordPlugin.mainThread) // TODO: Ignore shutdown message <-- // throw new RuntimeException("Tried to wait for a Discord request on the main thread. This could cause lag."); Bukkit.getLogger().warning("Waiting for a Discord request on the main thread!"); diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java index 2bbfa93..170c789 100755 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java @@ -4,6 +4,7 @@ import buttondevteam.discordplugin.commands.DiscordCommandBase; import buttondevteam.discordplugin.listeners.*; import buttondevteam.discordplugin.mccommands.DiscordMCCommandBase; import buttondevteam.lib.TBMCCoreAPI; +import buttondevteam.lib.chat.Channel; import buttondevteam.lib.chat.TBMCChatAPI; import buttondevteam.lib.player.ChromaGamerBase; import com.google.common.io.Files; @@ -32,6 +33,7 @@ import java.awt.*; import java.io.File; import java.nio.charset.StandardCharsets; import java.util.List; +import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -132,12 +134,26 @@ public class DiscordPlugin extends JavaPlugin implements IListener { task.cancel(); if (!sent) { new ChromaBot(this).updatePlayerList(); - //Get all roles with the default color - /*GameRoles = mainServer.getRoles().stream().filter(r -> { - System.out.println(r.getName()+" - "+r.getColor().toString()+" "+r.getColor().getAlpha()); - return r.getColor().getAlpha() == 0; - }).map(IRole::getName).collect(Collectors.toList()); //r=149,g=165,b=166*/ GameRoles = mainServer.getRoles().stream().filter(this::isGameRole).map(IRole::getName).collect(Collectors.toList()); + + val chcons = getConfig().getConfigurationSection("chcons"); + if (chcons != null) { + val chconkeys = chcons.getKeys(false); + for (val chconkey : chconkeys) { + val chcon = chcons.getConfigurationSection(chconkey); + val mcch = Channel.getChannels().stream().filter(ch -> ch.ID.equals(chcon.getString("mcchid"))).findAny(); + val ch = dc.getChannelByID(chcon.getLong("chid")); + val did = chcon.getLong("did"); + val dp = DiscordPlayer.getUser(Long.toString(did), DiscordPlayer.class); + val user = dc.fetchUser(did); + val dcp = new DiscordConnectedPlayer(user, ch, UUID.fromString(chcon.getString("mcuid")), chcon.getString("mcname")); + val groupid = chcon.getString("groupid"); + if (!mcch.isPresent() || ch == null || user == null || groupid == null) + continue; + MCChatListener.addCustomChat(ch, groupid, mcch.get(), dp, user, dcp); + } + } + DiscordCommandBase.registerCommands(); if (getConfig().getBoolean("serverup", false)) { ChromaBot.getInstance().sendMessage("", new EmbedBuilder().withColor(Color.YELLOW) @@ -210,6 +226,8 @@ public class DiscordPlugin extends JavaPlugin implements IListener { } public boolean isGameRole(IRole r) { + if (r.getGuild().getLongID() != mainServer.getLongID()) + return false; //Only allow on the main server val rc = new Color(149, 165, 166, 0); return r.getColor().equals(rc) && r.getPosition() < mainServer.getRoleByID(234343495735836672L).getPosition(); //Below the ChromaBot role @@ -223,16 +241,25 @@ public class DiscordPlugin extends JavaPlugin implements IListener { @Override public void onDisable() { stop = true; - System.out.println("X"); for (val entry : MCChatListener.ConnectedSenders.entrySet()) MCListener.callEventExcludingSome(new PlayerQuitEvent(entry.getValue(), "")); - System.out.println("Y"); getConfig().set("lastannouncementtime", lastannouncementtime); getConfig().set("lastseentime", lastseentime); getConfig().set("serverup", false); - System.out.println("Z"); + + val chcons = MCChatListener.getCustomChats(); + val chconsc = getConfig().createSection("chcons"); + for (val chcon : chcons) { + val chconc = chconsc.createSection(chcon.channel.getStringID()); + chconc.set("mcchid", chcon.mcchannel.ID); + chconc.set("chid", chcon.channel.getLongID()); + chconc.set("did", chcon.user.getLongID()); + chconc.set("mcuid", chcon.dcp.getUniqueId().toString()); + chconc.set("mcname", chcon.dcp.getName()); + chconc.set("groupid", chcon.groupID); + } + saveConfig(); - System.out.println("XX"); MCChatListener.forAllMCChat(ch -> DiscordPlugin.sendMessageToChannelWait(ch, "", new EmbedBuilder().withColor(Restart ? Color.ORANGE : Color.RED) .withTitle(Restart ? "Server restarting" : "Server stopping") @@ -245,19 +272,13 @@ public class DiscordPlugin extends JavaPlugin implements IListener { + "asked *politely* to leave the server for a bit.") : "") .build(), 5, TimeUnit.SECONDS)); - System.out.println("XY"); ChromaBot.getInstance().updatePlayerList(); try { - System.out.println("XZ"); SafeMode = true; // Stop interacting with Discord MCChatListener.stop(); - System.out.println("YX"); ChromaBot.delete(); - System.out.println("YY"); dc.changePresence(StatusType.IDLE, ActivityType.PLAYING, "Chromacraft"); //No longer using the same account for testing - System.out.println("YZ"); dc.logout(); - System.out.println("ZX"); } catch (Exception e) { TBMCCoreAPI.SendException("An error occured while disabling DiscordPlugin!", e); } @@ -346,12 +367,10 @@ public class DiscordPlugin extends JavaPlugin implements IListener { } public static IMessage sendMessageToChannelWait(IChannel channel, String message, EmbedObject embed) { - System.out.println("lol"); return sendMessageToChannel(channel, message, embed, true); } public static IMessage sendMessageToChannelWait(IChannel channel, String message, EmbedObject embed, long timeout, TimeUnit unit) { - System.out.println("lol!"); return sendMessageToChannel(channel, message, embed, true, timeout, unit); } @@ -360,26 +379,19 @@ public class DiscordPlugin extends JavaPlugin implements IListener { } private static IMessage sendMessageToChannel(IChannel channel, String message, EmbedObject embed, boolean wait, long timeout, TimeUnit unit) { - System.out.println("lolwut"); if (message.length() > 1980) { - System.out.println("wut"); message = message.substring(0, 1980); Bukkit.getLogger() .warning("Message was too long to send to discord and got truncated. In " + channel.getName()); - System.out.println("wat"); } - System.out.println("wot"); try { - System.out.println("sendA"); if (channel == chatchannel) MCChatListener.resetLastMessage(); // If this is a chat message, it'll be set again else if (channel.isPrivate()) MCChatListener.resetLastMessage(channel); - System.out.println("sendB"); final String content = message; RequestBuffer.IRequest r = () -> embed == null ? channel.sendMessage(content) : channel.sendMessage(content, embed, false); - System.out.println("sendC"); if (wait) { if (unit != null) return DPUtils.perform(r, timeout, unit); diff --git a/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java b/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java index 44c88a7..d9a1c8f 100644 --- a/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java @@ -28,7 +28,6 @@ public class ChannelconCommand extends DiscordCommandBase { message.reply("you need to have manage permissions for this channel!"); return true; } - //TODO: What if they no longer have permission to view the channel - check on some message events and startup - if somebody who can view the channel (on both platforms) has their accounts connected, keep it if (MCChatListener.hasCustomChat(message.getChannel())) { if (args.equalsIgnoreCase("remove")) { if (MCChatListener.removeCustomChat(message.getChannel())) @@ -51,14 +50,19 @@ public class ChannelconCommand extends DiscordCommandBase { message.reply("you need to connect your Minecraft account. On our server in #bot do /connect "); return true; } - val ev = new TBMCChannelConnectFakeEvent(new DiscordConnectedPlayer(message.getAuthor(), message.getChannel(), chp.getUUID(), Bukkit.getOfflinePlayer(chp.getUUID()).getName()), chan.get()); + DiscordConnectedPlayer dcp = new DiscordConnectedPlayer(message.getAuthor(), message.getChannel(), chp.getUUID(), Bukkit.getOfflinePlayer(chp.getUUID()).getName()); + val ev = new TBMCChannelConnectFakeEvent(dcp, chan.get()); //Using a fake player with no login/logout, should be fine for this event String groupid = ev.getGroupID(ev.getSender()); //We're not trying to send in a specific group, we want to know which group the user belongs to (so not getGroupID()) if (groupid == null) { message.reply("sorry, that didn't work. You cannot use that Minecraft channel."); return true; } - MCChatListener.addCustomChat(message.getChannel(), args, ev.getChannel(), dp, message.getAuthor()); //TODO: SAVE + if (MCChatListener.getCustomChats().stream().anyMatch(cc -> cc.groupID.equals(groupid) && cc.mcchannel.ID.equals(chan.get().ID))) { + message.reply("sorry, this MC chat is already connected to a different channel, multiple channels are not supported atm."); + return true; + } + MCChatListener.addCustomChat(message.getChannel(), groupid, ev.getChannel(), dp, message.getAuthor(), dcp); message.reply("alright, connection made to group `" + groupid + "`!"); return true; } diff --git a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java index 12fbdbd..76ae457 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java @@ -131,7 +131,7 @@ public class CommandListener { } }, (IListener) event -> { Bukkit.getScheduler().runTaskLaterAsynchronously(DiscordPlugin.plugin, () -> { - if (event.getRole().isDeleted() || DiscordPlugin.plugin.isGameRole(event.getRole())) + if (event.getRole().isDeleted() || !DiscordPlugin.plugin.isGameRole(event.getRole())) return; //Deleted or not a game role DiscordPlugin.GameRoles.add(event.getRole().getName()); DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Added " + event.getRole().getName() + " as game role. If you don't want this, change the role's color from the default."); @@ -216,7 +216,7 @@ public class CommandListener { else cmdwithargs.replace(0, cmdwithargs.length(), "help"); else { - if (cmdwithargs.charAt(0) == '/') + if (cmdwithargs.length() > 0 && cmdwithargs.charAt(0) == '/') cmdwithargs.deleteCharAt(0); //Don't treat / as mention, mentions can be used in public mcchat return false; } diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index 2754e63..d4a3ce9 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -11,6 +11,7 @@ import buttondevteam.lib.chat.ChatRoom; import buttondevteam.lib.chat.TBMCChatAPI; import buttondevteam.lib.player.TBMCPlayer; import com.vdurmont.emoji.EmojiParser; +import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.val; import org.bukkit.Bukkit; @@ -34,9 +35,10 @@ import sx.blah.discord.util.MissingPermissionsException; import java.awt.*; import java.time.Instant; import java.util.*; +import java.util.List; import java.util.concurrent.LinkedBlockingQueue; -import java.util.function.BiConsumer; import java.util.function.Consumer; +import java.util.function.Function; import java.util.function.Predicate; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -142,8 +144,8 @@ public class MCChatListener implements Listener, IListener val lmd = iterator.next(); if ((e.isFromcmd() || isdifferentchannel.test(lmd.channel)) //Test if msg is from Discord && e.getChannel().ID.equals(lmd.mcchannel.ID)) //If it's from a command, the command msg has been deleted, so we need to send it - if (e.shouldSendTo(getSender(lmd.channel, lmd.user)) && e.getGroupID().equals(lmd.groupID)) - doit.accept(lmd); //TODO: Store dcp and check that both ways, add option to not check sender perms on msg + if (e.shouldSendTo(lmd.dcp) && e.getGroupID().equals(lmd.groupID)) //Check original user's permissions + doit.accept(lmd); else { iterator.remove(); //If the user no longer has permission, remove the connection DiscordPlugin.sendMessageToChannel(lmd.channel, "The user no longer has permission to view the channel, connection removed."); @@ -155,7 +157,7 @@ public class MCChatListener implements Listener, IListener } @RequiredArgsConstructor - private static class LastMsgData { + public static class LastMsgData { public IMessage message; public long time; public String content; @@ -165,15 +167,17 @@ public class MCChatListener implements Listener, IListener public final DiscordPlayer dp; } - private static class CustomLMD extends LastMsgData { + public static class CustomLMD extends LastMsgData { public final String groupID; public final Channel mcchannel; + public final DiscordConnectedPlayer dcp; - public CustomLMD(IChannel channel, IUser user, DiscordPlayer dp, String groupid, Channel mcchannel) { + public CustomLMD(@NonNull IChannel channel, @NonNull IUser user, @NonNull DiscordPlayer dp, + @NonNull String groupid, @NonNull Channel mcchannel, @NonNull DiscordConnectedPlayer dcp) { super(channel, user, dp); groupID = groupid; this.mcchannel = mcchannel; - + this.dcp = dcp; } } @@ -254,8 +258,8 @@ public class MCChatListener implements Listener, IListener .anyMatch(lmd -> ((IPrivateChannel) lmd.channel).getRecipient().getStringID().equals(did)); } - public static void addCustomChat(IChannel channel, String groupid, Channel mcchannel, DiscordPlayer dp, IUser user) { - val lmd = new CustomLMD(channel, user, dp, groupid, mcchannel); + public static void addCustomChat(IChannel channel, String groupid, Channel mcchannel, DiscordPlayer dp, IUser user, DiscordConnectedPlayer dcp) { + val lmd = new CustomLMD(channel, user, dp, groupid, mcchannel, dcp); lastmsgCustom.add(lmd); } @@ -271,6 +275,10 @@ public class MCChatListener implements Listener, IListener return lastmsgCustom.removeIf(lmd -> lmd.channel.getLongID() == channel.getLongID()); } + public static List getCustomChats() { + return Collections.unmodifiableList(lastmsgCustom); + } + /** * May contain P<DiscordID> as key for public chat */ @@ -312,12 +320,10 @@ public class MCChatListener implements Listener, IListener } public static void forAllMCChat(Consumer action) { - System.out.println("XA"); action.accept(DiscordPlugin.chatchannel); - System.out.println("XB"); for (LastMsgData data : lastmsgPerUser) action.accept(data.channel); - System.out.println("XC"); + lastmsgCustom.forEach(cc -> action.accept(cc.channel)); } private static void forAllowedMCChat(Consumer action, TBMCSystemChatEvent event) { @@ -326,6 +332,8 @@ public class MCChatListener implements Listener, IListener for (LastMsgData data : lastmsgPerUser) if (event.shouldSendTo(getSender(data.channel, data.user))) action.accept(data.channel); + lastmsgCustom.stream().filter(data -> event.shouldSendTo(data.dcp)) + .map(data -> data.channel).forEach(action); } public static void stop() { @@ -398,11 +406,12 @@ public class MCChatListener implements Listener, IListener dmessage = EmojiParser.parseToAliases(dmessage, EmojiParser.FitzpatrickAction.PARSE); //Converts emoji to text- TODO: Add option to disable (resource pack?) dmessage = dmessage.replaceAll(":(\\S+)\\|type_(?:(\\d)|(1)_2):", ":$1::skin-tone-$2:"); //Convert to Discord's format so it still shows up - BiConsumer sendChatMessage = (channel, msg) -> // - TBMCChatAPI.SendChatMessage(channel, dsender, - msg + (event.getMessage().getAttachments().size() > 0 ? "\n" + event.getMessage() + Function getChatMessage = msg -> // + msg + (event.getMessage().getAttachments().size() > 0 ? "\n" + event.getMessage() .getAttachments().stream().map(a -> a.getUrl()).collect(Collectors.joining("\n")) - : "")); + : ""); + + CustomLMD clmd = getCustomChat(event.getChannel()); boolean react = false; @@ -411,7 +420,7 @@ public class MCChatListener implements Listener, IListener if (!event.getMessage().isDeleted() && !event.getChannel().isPrivate()) event.getMessage().delete(); }); - preprocessChat(dsender, dmessage); + //preprocessChat(dsender, dmessage); - Same is done below final String cmdlowercased = dmessage.substring(1).toLowerCase(); if (dsender instanceof DiscordSender && Arrays.stream(UnconnectedCmds) .noneMatch(s -> cmdlowercased.equals(s) || cmdlowercased.startsWith(s + " "))) { @@ -468,7 +477,11 @@ public class MCChatListener implements Listener, IListener dsender.sendMessage("You're now talking in: " + DPUtils.sanitizeString(dsender.getMcchannel().DisplayName)); } else { // Send single message - sendChatMessage.accept(chc, event.getMessage().getContent().substring(spi + 2)); + final String msg = event.getMessage().getContent().substring(spi + 2); + if (clmd == null) + TBMCChatAPI.SendChatMessage(chc, dsender, getChatMessage.apply(msg), true); + else + TBMCChatAPI.SendChatMessageDontCheckSender(chc, dsender, getChatMessage.apply(msg), true, clmd.dcp); react = true; } } @@ -481,20 +494,16 @@ public class MCChatListener implements Listener, IListener TBMCChatAPI.SendSystemMessage(Channel.GlobalChat, 0, "everyone", (dsender instanceof Player ? ((Player) dsender).getDisplayName() : dsender.getName()) + " pinned a message on Discord."); - else if (hasCustomChat(event.getChannel())) { - val cc = getCustomChat(event.getChannel()); - sendChatMessage.accept(cc.mcchannel, dmessage); - } else { - sendChatMessage.accept(dsender.getMcchannel(), dmessage); + else { + if (clmd != null) + TBMCChatAPI.SendChatMessageDontCheckSender(clmd.mcchannel, dsender, getChatMessage.apply(dmessage), false, clmd.dcp); + else + TBMCChatAPI.SendChatMessage(dsender.getMcchannel(), dsender, getChatMessage.apply(dmessage)); react = true; } } if (react) { try { - /* - * System.out.println("Got message: " + m.getContent() + " with embeds: " + m.getEmbeds().stream().map(e -> e.getTitle() + " " + e.getDescription()) - * .collect(Collectors.joining("\n"))); - */ if (lastmsgfromd != null) { DPUtils.perform(() -> lastmsgfromd.removeReaction(DiscordPlugin.dc.getOurUser(), DiscordPlugin.DELIVERED_REACTION)); // Remove it no matter what, we know it's there 99.99% of the time