From db10678095e7b82d5be106e2b04c1d1d1ded4b64 Mon Sep 17 00:00:00 2001 From: diademiemi Date: Sat, 24 Dec 2022 15:59:00 +0100 Subject: [PATCH] Add first join message type for Discord (#5160) Co-authored-by: Josh Roy <10731363+JRoy@users.noreply.github.com> Add a new message type for when a player has joined for the first time. --- .../api/v2/services/discord/MessageType.java | 3 +- .../essentialsx/discord/DiscordSettings.java | 12 ++++++ .../discord/listeners/BukkitListener.java | 38 ++++++++++++++----- .../src/main/resources/config.yml | 11 ++++++ 4 files changed, 54 insertions(+), 10 deletions(-) diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/MessageType.java b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/MessageType.java index a702101e6..329f40bce 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/MessageType.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/MessageType.java @@ -54,6 +54,7 @@ public final class MessageType { */ public static final class DefaultTypes { public final static MessageType JOIN = new MessageType("join", true); + public final static MessageType FIRST_JOIN = new MessageType("first-join", true); public final static MessageType LEAVE = new MessageType("leave", true); public final static MessageType CHAT = new MessageType("chat", true); public final static MessageType DEATH = new MessageType("death", true); @@ -64,7 +65,7 @@ public final class MessageType { public final static MessageType SERVER_STOP = new MessageType("server-stop", false); public final static MessageType KICK = new MessageType("kick", false); public final static MessageType MUTE = new MessageType("mute", false); - private final static MessageType[] VALUES = new MessageType[]{JOIN, LEAVE, CHAT, DEATH, AFK, ADVANCEMENT, ACTION, SERVER_START, SERVER_STOP, KICK, MUTE}; + private final static MessageType[] VALUES = new MessageType[]{JOIN, FIRST_JOIN, LEAVE, CHAT, DEATH, AFK, ADVANCEMENT, ACTION, SERVER_START, SERVER_STOP, KICK, MUTE}; /** * Gets an array of all the default {@link MessageType MessageTypes}. diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java index 81a91907d..05ca3533a 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java @@ -255,6 +255,18 @@ public class DiscordSettings implements IConf { "username", "displayname", "joinmessage", "online", "unique"); } + public MessageFormat getFirstJoinFormat(Player player) { + final String format = getFormatString("first-join"); + final String filled; + if (plugin.isPAPI() && format != null) { + filled = me.clip.placeholderapi.PlaceholderAPI.setPlaceholders(player, format); + } else { + filled = format; + } + return generateMessageFormat(filled, ":arrow_right: :first_place: {displayname} has joined the server for the first time!", false, + "username", "displayname", "joinmessage", "online", "unique"); + } + public MessageFormat getQuitFormat(Player player) { final String format = getFormatString("quit"); final String filled; diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/BukkitListener.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/BukkitListener.java index 3a5cf72f7..79d3130ea 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/BukkitListener.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/BukkitListener.java @@ -99,14 +99,19 @@ public class BukkitListener implements Listener { public void onJoin(AsyncUserDataLoadEvent event) { // Delay join to let nickname load if (!isSilentJoinQuit(event.getUser(), "join") && !isVanishHide(event.getUser())) { - sendJoinQuitMessage(event.getUser().getBase(), event.getJoinMessage(), true); + // Check if this is the first time the player has joined + if (!event.getUser().getBase().hasPlayedBefore()) { + sendJoinQuitMessage(event.getUser().getBase(), event.getJoinMessage(), MessageType.DefaultTypes.FIRST_JOIN); + } else { + sendJoinQuitMessage(event.getUser().getBase(), event.getJoinMessage(), MessageType.DefaultTypes.JOIN); + } } } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onQuit(PlayerQuitEvent event) { if (!isSilentJoinQuit(event.getPlayer(), "quit") && !isVanishHide(event.getPlayer())) { - sendJoinQuitMessage(event.getPlayer(), event.getQuitMessage(), false); + sendJoinQuitMessage(event.getPlayer(), event.getQuitMessage(), MessageType.DefaultTypes.LEAVE); } } @@ -124,20 +129,35 @@ public class BukkitListener implements Listener { return; } if (event.getValue()) { - sendJoinQuitMessage(event.getAffected().getBase(), ChatColor.YELLOW + event.getAffected().getName() + " left the game", false); + sendJoinQuitMessage(event.getAffected().getBase(), ChatColor.YELLOW + event.getAffected().getName() + " left the game", MessageType.DefaultTypes.LEAVE); return; } - sendJoinQuitMessage(event.getAffected().getBase(), ChatColor.YELLOW + event.getAffected().getName() + " joined the game", true); + sendJoinQuitMessage(event.getAffected().getBase(), ChatColor.YELLOW + event.getAffected().getName() + " joined the game", MessageType.DefaultTypes.JOIN); } - public void sendJoinQuitMessage(final Player player, final String message, boolean join) { - sendDiscordMessage(join ? MessageType.DefaultTypes.JOIN : MessageType.DefaultTypes.LEAVE, - MessageUtil.formatMessage(join ? jda.getSettings().getJoinFormat(player) : jda.getSettings().getQuitFormat(player), + public void sendJoinQuitMessage(final Player player, final String message, MessageType type) { + int userCount = jda.getPlugin().getEss().getUsers().getUserCount(); + final MessageFormat format; + switch (type.getKey()) { + case "join": + format = jda.getSettings().getJoinFormat(player); + break; + case "first-join": + format = jda.getSettings().getFirstJoinFormat(player); + break; + default: // So that it will always be initialised. Other options shouldn't be possible. + format = jda.getSettings().getQuitFormat(player); + userCount = userCount - 1; + break; + + } + sendDiscordMessage(type, + MessageUtil.formatMessage(format, MessageUtil.sanitizeDiscordMarkdown(player.getName()), MessageUtil.sanitizeDiscordMarkdown(player.getDisplayName()), MessageUtil.sanitizeDiscordMarkdown(message), - jda.getPlugin().getEss().getOnlinePlayers().size() - (join ? 0 : 1), - jda.getPlugin().getEss().getUsers().getUserCount()), + jda.getPlugin().getEss().getOnlinePlayers().size(), + userCount), player); } diff --git a/EssentialsDiscord/src/main/resources/config.yml b/EssentialsDiscord/src/main/resources/config.yml index 1c3072b87..e87149d0e 100644 --- a/EssentialsDiscord/src/main/resources/config.yml +++ b/EssentialsDiscord/src/main/resources/config.yml @@ -116,6 +116,8 @@ console: message-types: # Join messages sent when a player joins the Minecraft server. join: primary + # Join messages sent when a player joins the Minecraft server for the first time. This type is sent instead of the join type. + first-join: primary # Leave messages sent when a player leaves the Minecraft server. leave: primary # Chat messages sent when a player chats on the Minecraft server. @@ -307,6 +309,15 @@ messages: # - {unique}: The amount of unique players to ever join the server # ... PlaceholderAPI placeholders are also supported here too! join: ":arrow_right: {displayname} has joined!" + # This is the message sent to Discord when a player joins the minecraft server for the first time. + # The following placeholders can be used here: + # - {username}: The name of the user joining + # - {displayname}: The display name of the user joining + # - {joinmessage}: The full default join message used in game + # - {online}: The amount of players online + # - {unique}: The amount of unique players to ever join the server + # ... PlaceholderAPI placeholders are also supported here too! + first-join: ":arrow_right: :first_place: {displayname} has joined the server for the first time!" # This is the message sent to Discord when a player leaves the minecraft server. # The following placeholders can be used here: # - {username}: The name of the user leaving