diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/config/ConfigurationEntry.java b/src/main/java/me/StevenLawson/TotalFreedomMod/config/ConfigurationEntry.java index ae687ff..79683b5 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/config/ConfigurationEntry.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/config/ConfigurationEntry.java @@ -92,8 +92,10 @@ public enum ConfigurationEntry DISCORD_IS_ENABLED(Boolean.class, "discord.is_enabled"), DISCORD_TOKEN(String.class, "discord.token"), DISCORD_CHANNEL(String.class, "discord.channel"), + DISCORD_ADMIN_CHANNEL(String.class, "discord.admin_channel"), DISCORD_PREFIX(String.class, "discord.prefix"), DISCORD_FORMAT(String.class, "discord.format"), + DISCORD_ADMIN_FORMAT(String.class, "discord.admin_format"), // CHAT_FORMAT(String.class, "chat.format"); diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java b/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java index d036d54..65f2bb2 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java @@ -1,9 +1,11 @@ package me.StevenLawson.TotalFreedomMod.discord.bridge; import me.StevenLawson.TotalFreedomMod.Log; +import me.StevenLawson.TotalFreedomMod.admin.AdminList; import me.StevenLawson.TotalFreedomMod.config.ConfigurationEntry; import me.StevenLawson.TotalFreedomMod.config.MainConfig; import me.StevenLawson.TotalFreedomMod.discord.command.DiscordCommandManager; +import me.StevenLawson.TotalFreedomMod.player.PlayerRank; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.ClickEvent; import net.md_5.bungee.api.chat.HoverEvent; @@ -17,6 +19,8 @@ import org.javacord.api.entity.message.MessageAttachment; import org.javacord.api.entity.message.MessageAuthor; import org.javacord.api.entity.server.Server; import org.javacord.api.entity.user.User; +import org.javacord.api.event.message.MessageCreateEvent; +import org.javacord.api.event.message.MessageEvent; import java.util.Optional; import java.util.regex.Pattern; @@ -24,8 +28,94 @@ import java.util.regex.Pattern; public class DiscordBridge { private static DiscordApi DISCORD_API; private static TextChannel CHANNEL; + private static TextChannel ADMIN_CHANNEL; public static DiscordCommandManager COMMAND_MANAGER; + private static void onMessageCreateEvent(MessageCreateEvent message) { + boolean isAdmin = false; + + try { + isAdmin = message.getChannel().getIdAsString().equalsIgnoreCase(ADMIN_CHANNEL.getIdAsString()); + } catch (Exception ignored) {} + + String content = message.getMessageContent(); + String prefix = MainConfig.getString(ConfigurationEntry.DISCORD_PREFIX); + MessageAuthor author = message.getMessage().getAuthor(); + + if (author.isBotUser() || !message.isServerMessage()) return; + Optional server = message.getServer(); + Optional user = author.asUser(); + + if(prefix == null) { + Log.severe("Bot prefix does not exist. Stopping bot..."); + stop(); + return; + } + + if(!server.isPresent()) { + Log.warning("Discord server wasn't present in message, this may be a sign you've not properly configured the intents for your bot."); + return; + } + + if(!user.isPresent()) { + Log.warning("Unable to get user of message author. This may be a sign you've not properly configured the intents for your bot."); + return; + } + + if (content.toLowerCase().startsWith(prefix)) { + COMMAND_MANAGER.parse(content, user.get(), server.get(), message.getChannel(), prefix); + } else { + String format = MainConfig.getString((isAdmin) ? ConfigurationEntry.DISCORD_ADMIN_FORMAT : ConfigurationEntry.DISCORD_FORMAT); + format = format.replace("{TAG}", author.getDiscriminatedName()); + format = format.replace("{USERNAME}", author.getName()); + BaseComponent[] components = TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', String.format(format, content))); + TextComponent component = new TextComponent(""); + + for (BaseComponent baseComponent : components) { + component.addExtra(baseComponent); + } + + if(message.getMessageAttachments().size() > 0) { + int i = 0; + for (MessageAttachment messageAttachment : message.getMessageAttachments()) { + String url = messageAttachment.getProxyUrl().toString(); + ClickEvent clickEvent = new ClickEvent(ClickEvent.Action.OPEN_URL, url); + TextComponent warningComponent = new TextComponent("WARNING: By clicking on this text, your client will open:\n\n"); + warningComponent.setColor(net.md_5.bungee.api.ChatColor.RED); + warningComponent.setBold(true); + TextComponent urlComponent = new TextComponent(url); + urlComponent.setColor(net.md_5.bungee.api.ChatColor.DARK_AQUA); + urlComponent.setUnderlined(true); + urlComponent.setBold(false); + warningComponent.addExtra(urlComponent); + HoverEvent hoverEvent = new HoverEvent(HoverEvent.Action.SHOW_TEXT, new BaseComponent[]{warningComponent}); + TextComponent mediaComponent = new TextComponent((i == 0 && content.isEmpty()) ? "[Media]" : " [Media]"); + mediaComponent.setColor(net.md_5.bungee.api.ChatColor.YELLOW); + mediaComponent.setClickEvent(clickEvent); + mediaComponent.setHoverEvent(hoverEvent); + component.addExtra(mediaComponent); + i++; + } + } + + if(isAdmin) { + String name = author.getDiscriminatedName(); + Log.info("[ADMIN] " + name + ": " + message); + + for (org.bukkit.entity.Player player : Bukkit.getOnlinePlayers()) + { + if (AdminList.isSuperAdmin(player)) + { + player.spigot().sendMessage(component); + } + } + } else { + Bukkit.spigot().broadcast(component); + } + Log.info(component.toPlainText()); + } + } + public static void load() { if (Boolean.FALSE.equals(MainConfig.getBoolean(ConfigurationEntry.DISCORD_IS_ENABLED))) { @@ -39,6 +129,7 @@ public class DiscordBridge { .join(); Optional channelFuture = DISCORD_API.getTextChannelById(MainConfig.getString(ConfigurationEntry.DISCORD_CHANNEL)); + Optional adminChannelFuture = DISCORD_API.getTextChannelById(MainConfig.getString(ConfigurationEntry.DISCORD_ADMIN_CHANNEL)); if (!channelFuture.isPresent()) { Log.warning("TFM 4.3 Reloaded could not find your channel, stopping!"); @@ -47,74 +138,14 @@ public class DiscordBridge { } CHANNEL = channelFuture.get(); + adminChannelFuture.ifPresent(textChannel -> ADMIN_CHANNEL = textChannel); COMMAND_MANAGER = new DiscordCommandManager(); COMMAND_MANAGER.init(); - CHANNEL.addMessageCreateListener((message) -> { - String content = message.getMessageContent(); - String prefix = MainConfig.getString(ConfigurationEntry.DISCORD_PREFIX); - MessageAuthor author = message.getMessage().getAuthor(); - - if (author.isBotUser() || !message.isServerMessage()) return; - Optional server = message.getServer(); - Optional user = author.asUser(); - - if(prefix == null) { - Log.severe("Bot prefix does not exist. Stopping bot..."); - stop(); - return; - } - - if(!server.isPresent()) { - Log.warning("Discord server wasn't present in message, this may be a sign you've not properly configured the intents for your bot."); - return; - } - - if(!user.isPresent()) { - Log.warning("Unable to get user of message author. This may be a sign you've not properly configured the intents for your bot."); - return; - } - - if (content.toLowerCase().startsWith(prefix)) { - COMMAND_MANAGER.parse(content, user.get(), server.get(), message.getChannel(), prefix); - } else { - String format = MainConfig.getString(ConfigurationEntry.DISCORD_FORMAT); - format = format.replace("{TAG}", author.getDiscriminatedName()); - format = format.replace("{USERNAME}", author.getName()); - BaseComponent[] components = TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', String.format(format, content))); - TextComponent component = new TextComponent(""); - - for (BaseComponent baseComponent : components) { - component.addExtra(baseComponent); - } - - if(message.getMessageAttachments().size() > 0) { - int i = 0; - for (MessageAttachment messageAttachment : message.getMessageAttachments()) { - String url = messageAttachment.getProxyUrl().toString(); - ClickEvent clickEvent = new ClickEvent(ClickEvent.Action.OPEN_URL, url); - TextComponent warningComponent = new TextComponent("WARNING: By clicking on this text, your client will open:\n\n"); - warningComponent.setColor(net.md_5.bungee.api.ChatColor.RED); - warningComponent.setBold(true); - TextComponent urlComponent = new TextComponent(url); - urlComponent.setColor(net.md_5.bungee.api.ChatColor.DARK_AQUA); - urlComponent.setUnderlined(true); - urlComponent.setBold(false); - warningComponent.addExtra(urlComponent); - HoverEvent hoverEvent = new HoverEvent(HoverEvent.Action.SHOW_TEXT, new BaseComponent[]{warningComponent}); - TextComponent mediaComponent = new TextComponent((i == 0 && content.isEmpty()) ? "[Media]" : " [Media]"); - mediaComponent.setColor(net.md_5.bungee.api.ChatColor.YELLOW); - mediaComponent.setClickEvent(clickEvent); - mediaComponent.setHoverEvent(hoverEvent); - component.addExtra(mediaComponent); - i++; - } - } - - Bukkit.spigot().broadcast(component); - Log.info(component.toPlainText()); - } - }); + CHANNEL.addMessageCreateListener(DiscordBridge::onMessageCreateEvent); + if (adminChannelFuture.isPresent()) { + ADMIN_CHANNEL.addMessageCreateListener(DiscordBridge::onMessageCreateEvent); + } } catch (Exception e) { Log.warning("Uh oh! It looks like TFM 4.3 Reloaded Discord couldn't start! Please check you have defined the bot's token & channel and also given it the correct permissions! (Read Messages and Send Messages)"); Log.warning("If you've already set that up however, you may to read the exception below."); @@ -156,6 +187,23 @@ public class DiscordBridge { } } + public static void transmitAdminMessage(String message) { + transmitAdminMessage(message, false); + } + + public static void transmitAdminMessage(String message, boolean disconnectAfterwards) { + if (ADMIN_CHANNEL == null) return; + if (!disconnectAfterwards) { + ADMIN_CHANNEL.sendMessage(sanitizeMessage(message)); + } else { + try { + ADMIN_CHANNEL.sendMessage(sanitizeMessage(message)).get(); + } catch (Exception ignored) { + } + DISCORD_API.disconnect(); + } + } + public static void stop() { if (Boolean.FALSE.equals(MainConfig.getBoolean(ConfigurationEntry.DISCORD_IS_ENABLED))) { diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/util/Utilities.java b/src/main/java/me/StevenLawson/TotalFreedomMod/util/Utilities.java index 8667ed1..43bf363 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/util/Utilities.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/util/Utilities.java @@ -898,14 +898,17 @@ public class Utilities { String name = sender.getName() + " " + PlayerRank.fromSender(sender).getPrefix() + ChatColor.WHITE; Log.info("[ADMIN] " + name + ": " + message); + String adminChatMessage = "[" + ChatColor.AQUA + "ADMIN" + ChatColor.WHITE + "] " + ChatColor.DARK_RED + name + ": " + ChatColor.AQUA + message; for (org.bukkit.entity.Player player : Bukkit.getOnlinePlayers()) { if (AdminList.isSuperAdmin(player)) { - player.sendMessage("[" + ChatColor.AQUA + "ADMIN" + ChatColor.WHITE + "] " + ChatColor.DARK_RED + name + ": " + ChatColor.AQUA + message); + player.sendMessage(adminChatMessage); } } + + DiscordBridge.transmitAdminMessage(adminChatMessage.replaceAll("([`_~*])", "\\\\$1")); } //getField: Borrowed from WorldEdit diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index aa34982..2b8fe1c 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -329,12 +329,14 @@ discord: is_enabled: false token: '' channel: '' + admin_channel: '' prefix: 'tf!' # Format: # {TAG} == Their full discord tag: e.g. Allink#9308 # {USERNAME} == Their discord username: e.g. Allink # %1$s == User's message format: '[Discord] <{TAG}> %1$s' + admin_format: '&f[&bADMIN&f] &4{TAG}&f:&b %1$s' # Configure chat format chat: