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."