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. */