From 969a80e452218d37a7ea772ba5ffeb44d12c0e01 Mon Sep 17 00:00:00 2001 From: padrewin <97427230+padrewin@users.noreply.github.com> Date: Sat, 23 Aug 2025 22:42:39 +0300 Subject: [PATCH 1/4] add multiple custom messages added the ability to add multiple custom messages and permissions added priority system + priority tie --- pom.xml | 2 +- .../me/pyke/joinmessages/JoinMessages.java | 190 ++++++++++-------- src/main/resources/config.yml | 45 +++-- 3 files changed, 139 insertions(+), 98 deletions(-) diff --git a/pom.xml b/pom.xml index 745c281..3010c95 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.me.pyke JoinMessages - 1.0-SNAPSHOT + 1.0.1-SNAPSHOT jar JoinMessages diff --git a/src/main/java/org/me/pyke/joinmessages/JoinMessages.java b/src/main/java/org/me/pyke/joinmessages/JoinMessages.java index 598a2ac..2d4eb9c 100644 --- a/src/main/java/org/me/pyke/joinmessages/JoinMessages.java +++ b/src/main/java/org/me/pyke/joinmessages/JoinMessages.java @@ -3,13 +3,10 @@ import net.luckperms.api.LuckPerms; import net.luckperms.api.LuckPermsProvider; import net.luckperms.api.cacheddata.CachedMetaData; -import net.luckperms.api.context.ContextManager; import net.luckperms.api.model.user.User; import org.bukkit.Bukkit; import org.bukkit.ChatColor; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -18,121 +15,156 @@ import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + public final class JoinMessages extends JavaPlugin { - private String donatorjoinmessage; - private String donatorleavemessage; - private String donatorpermission; - private String staffjoinmessage; - private String staffleavemessage; - private String staffpermission; - private String defaultjoinmessage; - private String defaultleavemessage; - private String defaultpermission; + private boolean disableVanillaMessages; private String reloadMessage; - private boolean disableVanillamessages; + + private final List groups = new ArrayList<>(); @Override public void onEnable() { RegisteredServiceProvider provider = Bukkit.getServicesManager().getRegistration(LuckPerms.class); if (provider != null) { - LuckPerms api = provider.getProvider(); getLogger().info("LuckPerms found, nice!"); } + saveDefaultConfig(); loadConfigValues(); + getLogger().warning("Plugin JoinMessages enabled."); getServer().getPluginManager().registerEvents(new PlayerQuitListener(), this); getServer().getPluginManager().registerEvents(new PlayerJoinListener(), this); - getCommand("joinmessages").setExecutor(new ReloadCommandExecutor()); + + if (getCommand("joinmessages") != null) { + getCommand("joinmessages").setExecutor(new ReloadCommandExecutor()); + } + } + + @Override + public void onDisable() { + // nothing special } private void loadConfigValues() { + groups.clear(); + FileConfiguration config = getConfig(); - donatorjoinmessage = config.getString("donator.join-message"); - donatorleavemessage = config.getString("donator.leave-message"); - donatorpermission = config.getString("donator.permission"); - // - staffjoinmessage = config.getString("staff.join-message"); - staffleavemessage = config.getString("staff.leave-message"); - staffpermission = config.getString("staff.permission"); - // - defaultjoinmessage = config.getString("default.join-message"); - defaultleavemessage = config.getString("default.leave-message"); - defaultpermission = config.getString("default.permission"); - // - disableVanillamessages = config.getBoolean("options.disable-vanilla-message"); - reloadMessage = config.getString("messages.reloaded"); + disableVanillaMessages = config.getBoolean("options.disable-vanilla-message", true); + reloadMessage = ChatColor.translateAlternateColorCodes('&', + config.getString("messages.reloaded", "&aJoinMessages reloaded.")); + + ConfigurationSection groupsSec = config.getConfigurationSection("groups"); + if (groupsSec == null) { + getLogger().warning("No 'groups' section found in config.yml! No messages will be sent."); + return; + } + + for (String key : groupsSec.getKeys(false)) { + ConfigurationSection g = groupsSec.getConfigurationSection(key); + if (g == null) continue; + + String permission = g.getString("permission", ""); + int priority = g.getInt("priority", 0); + String joinMsg = g.getString("join-message", null); + String leaveMsg = g.getString("leave-message", null); + + MessageGroup group = new MessageGroup(key, permission, priority, joinMsg, leaveMsg); + groups.add(group); + } + + groups.sort( + Comparator.comparingInt(MessageGroup::priority).reversed() + .thenComparing(MessageGroup::name) + ); + + getLogger().info("Loaded " + groups.size() + " message groups."); } - public class ReloadCommandExecutor implements CommandExecutor { - @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - if (command.getName().equalsIgnoreCase("joinmessages")) { - if (args.length > 0 && args[0].equalsIgnoreCase("reload")) { - reloadConfig(); - loadConfigValues(); - String message = ChatColor.translateAlternateColorCodes('&', reloadMessage); - sender.sendMessage(message); - return true; - } + private String resolveMessage(Player player, boolean isJoin) { + for (MessageGroup g : groups) { + if (g.permission().isEmpty() || player.hasPermission(g.permission())) { + String raw = isJoin ? g.joinMessage() : g.leaveMessage(); + if (raw == null || raw.trim().isEmpty()) continue; + + String msg = raw.replace("%user%", player.getName()); + msg = applyLuckPermsPlaceholders(player, msg); + return ChatColor.translateAlternateColorCodes('&', msg); } - return false; } + return null; } + private String applyLuckPermsPlaceholders(Player player, String message) { + try { + LuckPerms lp = LuckPermsProvider.get(); + if (lp == null) return message; + User user = lp.getUserManager().getUser(player.getUniqueId()); + if (user == null) return message; - public class PlayerQuitListener implements Listener { - @EventHandler - public void onPlayerQuit(PlayerQuitEvent event){ - if(disableVanillamessages) { - event.setQuitMessage(null); - } - Player player = event.getPlayer(); - LuckPerms luckPerms = LuckPermsProvider.get(); + CachedMetaData meta = user.getCachedData().getMetaData(); + String prefix = meta.getPrefix() != null ? meta.getPrefix() : ""; + String suffix = meta.getSuffix() != null ? meta.getSuffix() : ""; - if (player.hasPermission(staffpermission)){ - String message = ChatColor.translateAlternateColorCodes('&', staffleavemessage.replace("%user%", player.getName())); - Bukkit.broadcastMessage(message); - } - else if (player.hasPermission(donatorpermission)){ - String message = ChatColor.translateAlternateColorCodes('&', donatorleavemessage.replace("%user%", player.getName())); - Bukkit.broadcastMessage(message); - } - else if (player.hasPermission(defaultpermission)) { - String message = ChatColor.translateAlternateColorCodes('&', defaultleavemessage.replace("%user%", player.getName())); - Bukkit.broadcastMessage(message); - } + return message.replace("%prefix%", prefix).replace("%suffix%", suffix); + } catch (IllegalStateException ignored) { + return message; } - } + public class PlayerJoinListener implements Listener { @EventHandler - public void onPlayerJoin(PlayerJoinEvent event){ - if(disableVanillamessages) { + public void onPlayerJoin(PlayerJoinEvent event) { + if (disableVanillaMessages) { event.setJoinMessage(null); } Player player = event.getPlayer(); - LuckPerms luckPerms = LuckPermsProvider.get(); - User user = luckPerms.getUserManager().getUser(player.getUniqueId()); - if (player.hasPermission(staffpermission)){ - String message = ChatColor.translateAlternateColorCodes('&', staffjoinmessage.replace("%user%", player.getName())); - Bukkit.broadcastMessage(message); + String msg = resolveMessage(player, true); + if (msg != null && !msg.isEmpty()) { + Bukkit.broadcastMessage(msg); } - else if (player.hasPermission(donatorpermission)){ - String message = ChatColor.translateAlternateColorCodes('&', donatorjoinmessage.replace("%user%", player.getName())); - Bukkit.broadcastMessage(message); + } + } + + public class PlayerQuitListener implements Listener { + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + if (disableVanillaMessages) { + event.setQuitMessage(null); } - else if (player.hasPermission(defaultpermission)){ - String message = ChatColor.translateAlternateColorCodes('&', defaultjoinmessage.replace("%user%", player.getName())); - Bukkit.broadcastMessage(message); + Player player = event.getPlayer(); + String msg = resolveMessage(player, false); + if (msg != null && !msg.isEmpty()) { + Bukkit.broadcastMessage(msg); } } } - @Override - public void onDisable() { - // Plugin shutdown logic + + public class ReloadCommandExecutor implements CommandExecutor { + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + if (!command.getName().equalsIgnoreCase("joinmessages")) return false; + if (args.length == 1 && args[0].equalsIgnoreCase("reload")) { + reloadConfig(); + loadConfigValues(); + sender.sendMessage(reloadMessage); + return true; + } + sender.sendMessage(ChatColor.RED + "Usage: /joinmessages reload"); + return true; + } } + + + private record MessageGroup(String name, String permission, int priority, String joinMessage, String leaveMessage) {} } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index d227cd0..727ff0c 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,5 +1,5 @@ # **************************** -# config version 1.0 - 666pyke +# config version 1.0.1 - 666pyke # # You can change the 'permission' parameter to whatever you want and provide the respective # permission to the rank to which you want to associate the respective messages. If you want only @@ -7,25 +7,34 @@ # permission from the 'DEFAULT' category. I hope you won't encounter any issues using my plugin. # # **************************** -donator: - join-message: "%user% joined the server" - leave-message: "%user% left the server" - permission: joinmessages.donator +options: + disable-vanilla-message: true -staff: - join-message: "%user% joined the server" - leave-message: "%user% left the server" - permission: joinmessages.staff +messages: + reloaded: "&aJoinMessages reloaded." -default: - join-message: "%user% joined the server" - leave-message: "%user% left the server" - permission: joinmessages.default +# List of groups. Order does NOT matter; `priority` is used (higher = more important). +groups: + owner: + permission: joinmessages.owner + priority: 1000 + join-message: "&6[OWNER] &e%user% &7joined the server." + leave-message: "&6[OWNER] &e%user% &7left the server." -options: - disable-vanilla-message: true # the default yellow messages such as "mareleepyke joined the game" + staff: + permission: joinmessages.staff + priority: 10 + join-message: "&c[STAFF] &e%user% &7joined the server." + leave-message: "&c[STAFF] &e%user% &7left the server." -# priority for checking permissions will be staff > donator > default + donator: + permission: joinmessages.donator + priority: 5 + join-message: "&d[DONATOR] &e%user% &7joined the server." + leave-message: "&d[DONATOR] &e%user% &7left the server." -messages: - reloaded: "Plugin reloaded." \ No newline at end of file + default: + permission: joinmessages.default + priority: 0 + join-message: "&e%user% &7joined the server." + leave-message: "&e%user% &7left the server." From b5acb0c0e117b44b7f400364d4b55d9dc8712df3 Mon Sep 17 00:00:00 2001 From: padrewin <97427230+padrewin@users.noreply.github.com> Date: Sat, 23 Aug 2025 22:44:01 +0300 Subject: [PATCH 2/4] Update pom.xml --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 3010c95..0572b5f 100644 --- a/pom.xml +++ b/pom.xml @@ -23,8 +23,8 @@ maven-compiler-plugin 3.8.1 - ${java.version} - ${java.version} + 16 + 16 From 86e1da5be8e6fb76555519e5f554579dde1c876d Mon Sep 17 00:00:00 2001 From: padrewin <97427230+padrewin@users.noreply.github.com> Date: Sat, 23 Aug 2025 23:13:56 +0300 Subject: [PATCH 3/4] added hex support --- .../me/pyke/joinmessages/JoinMessages.java | 31 +++++++++++++++++-- src/main/resources/config.yml | 4 +-- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/me/pyke/joinmessages/JoinMessages.java b/src/main/java/org/me/pyke/joinmessages/JoinMessages.java index 2d4eb9c..5755e14 100644 --- a/src/main/java/org/me/pyke/joinmessages/JoinMessages.java +++ b/src/main/java/org/me/pyke/joinmessages/JoinMessages.java @@ -22,6 +22,8 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public final class JoinMessages extends JavaPlugin { @@ -30,6 +32,8 @@ public final class JoinMessages extends JavaPlugin { private final List groups = new ArrayList<>(); + private static final Pattern AMP_HEX_PATTERN = Pattern.compile("(?i)&#([0-9A-F]{6})"); + @Override public void onEnable() { RegisteredServiceProvider provider = Bukkit.getServicesManager().getRegistration(LuckPerms.class); @@ -59,8 +63,7 @@ private void loadConfigValues() { FileConfiguration config = getConfig(); disableVanillaMessages = config.getBoolean("options.disable-vanilla-message", true); - reloadMessage = ChatColor.translateAlternateColorCodes('&', - config.getString("messages.reloaded", "&aJoinMessages reloaded.")); + reloadMessage = colorize(config.getString("messages.reloaded", "&aJoinMessages reloaded.")); ConfigurationSection groupsSec = config.getConfigurationSection("groups"); if (groupsSec == null) { @@ -81,6 +84,7 @@ private void loadConfigValues() { groups.add(group); } + groups.sort( Comparator.comparingInt(MessageGroup::priority).reversed() .thenComparing(MessageGroup::name) @@ -91,18 +95,37 @@ private void loadConfigValues() { private String resolveMessage(Player player, boolean isJoin) { for (MessageGroup g : groups) { + // permission empty => apply to all if (g.permission().isEmpty() || player.hasPermission(g.permission())) { String raw = isJoin ? g.joinMessage() : g.leaveMessage(); if (raw == null || raw.trim().isEmpty()) continue; String msg = raw.replace("%user%", player.getName()); msg = applyLuckPermsPlaceholders(player, msg); - return ChatColor.translateAlternateColorCodes('&', msg); + return colorize(msg); } } return null; } + private String colorize(String input) { + if (input == null) return null; + + Matcher m = AMP_HEX_PATTERN.matcher(input); + StringBuffer sb = new StringBuffer(); + while (m.find()) { + String hex = m.group(1); + StringBuilder repl = new StringBuilder("&x"); + for (char c : hex.toCharArray()) { + repl.append('&').append(c); + } + m.appendReplacement(sb, Matcher.quoteReplacement(repl.toString())); + } + m.appendTail(sb); + + return ChatColor.translateAlternateColorCodes('&', sb.toString()); + } + private String applyLuckPermsPlaceholders(Player player, String message) { try { LuckPerms lp = LuckPermsProvider.get(); @@ -120,6 +143,7 @@ private String applyLuckPermsPlaceholders(Player player, String message) { } } + // --- Listeners --- public class PlayerJoinListener implements Listener { @EventHandler @@ -149,6 +173,7 @@ public void onPlayerQuit(PlayerQuitEvent event) { } } + // --- /joinmessages reload --- public class ReloadCommandExecutor implements CommandExecutor { @Override diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 727ff0c..d0c6d80 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -18,8 +18,8 @@ groups: owner: permission: joinmessages.owner priority: 1000 - join-message: "&6[OWNER] &e%user% &7joined the server." - leave-message: "&6[OWNER] &e%user% &7left the server." + join-message: "&#FF0000[OWNER] &e%user% &7joined the server." + leave-message: "&#FF0000[OWNER] &e%user% &7left the server." staff: permission: joinmessages.staff From 5d80e69e15662e6240b2590d70643ba4a5b9a717 Mon Sep 17 00:00:00 2001 From: padrewin <97427230+padrewin@users.noreply.github.com> Date: Sat, 23 Aug 2025 23:22:34 +0300 Subject: [PATCH 4/4] enable or disable join message --- src/main/java/org/me/pyke/joinmessages/JoinMessages.java | 8 ++++++-- src/main/resources/config.yml | 4 ++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/me/pyke/joinmessages/JoinMessages.java b/src/main/java/org/me/pyke/joinmessages/JoinMessages.java index 5755e14..24bf582 100644 --- a/src/main/java/org/me/pyke/joinmessages/JoinMessages.java +++ b/src/main/java/org/me/pyke/joinmessages/JoinMessages.java @@ -75,12 +75,13 @@ private void loadConfigValues() { ConfigurationSection g = groupsSec.getConfigurationSection(key); if (g == null) continue; + boolean enabled = g.getBoolean("enable", true); String permission = g.getString("permission", ""); int priority = g.getInt("priority", 0); String joinMsg = g.getString("join-message", null); String leaveMsg = g.getString("leave-message", null); - MessageGroup group = new MessageGroup(key, permission, priority, joinMsg, leaveMsg); + MessageGroup group = new MessageGroup(key, permission, priority, joinMsg, leaveMsg, enabled); groups.add(group); } @@ -95,6 +96,8 @@ private void loadConfigValues() { private String resolveMessage(Player player, boolean isJoin) { for (MessageGroup g : groups) { + if (!g.enabled()) continue; + // permission empty => apply to all if (g.permission().isEmpty() || player.hasPermission(g.permission())) { String raw = isJoin ? g.joinMessage() : g.leaveMessage(); @@ -108,6 +111,7 @@ private String resolveMessage(Player player, boolean isJoin) { return null; } + private String colorize(String input) { if (input == null) return null; @@ -191,5 +195,5 @@ public boolean onCommand(CommandSender sender, Command command, String label, St } - private record MessageGroup(String name, String permission, int priority, String joinMessage, String leaveMessage) {} + private record MessageGroup(String name, String permission, int priority, String joinMessage, String leaveMessage, boolean enabled) {} } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index d0c6d80..d12fb3c 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -16,24 +16,28 @@ messages: # List of groups. Order does NOT matter; `priority` is used (higher = more important). groups: owner: + enable: true permission: joinmessages.owner priority: 1000 join-message: "&#FF0000[OWNER] &e%user% &7joined the server." leave-message: "&#FF0000[OWNER] &e%user% &7left the server." staff: + enable: true permission: joinmessages.staff priority: 10 join-message: "&c[STAFF] &e%user% &7joined the server." leave-message: "&c[STAFF] &e%user% &7left the server." donator: + enable: true permission: joinmessages.donator priority: 5 join-message: "&d[DONATOR] &e%user% &7joined the server." leave-message: "&d[DONATOR] &e%user% &7left the server." default: + enable: true permission: joinmessages.default priority: 0 join-message: "&e%user% &7joined the server."