diff --git a/pom.xml b/pom.xml
index 745c281..0572b5f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
org.me.pyke
JoinMessages
- 1.0-SNAPSHOT
+ 1.0.1-SNAPSHOT
jar
JoinMessages
@@ -23,8 +23,8 @@
maven-compiler-plugin
3.8.1
- ${java.version}
- ${java.version}
+ 16
+ 16
diff --git a/src/main/java/org/me/pyke/joinmessages/JoinMessages.java b/src/main/java/org/me/pyke/joinmessages/JoinMessages.java
index 598a2ac..24bf582 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,185 @@
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;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
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<>();
+
+ 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);
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 = colorize(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;
+
+ 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, enabled);
+ 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.enabled()) continue;
+
+ // 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 colorize(msg);
}
- return false;
}
+ return null;
}
- public class PlayerQuitListener implements Listener {
- @EventHandler
- public void onPlayerQuit(PlayerQuitEvent event){
- if(disableVanillamessages) {
- event.setQuitMessage(null);
- }
- Player player = event.getPlayer();
- LuckPerms luckPerms = LuckPermsProvider.get();
+ private String colorize(String input) {
+ if (input == null) return null;
- 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);
+ 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();
+ if (lp == null) return message;
+ User user = lp.getUserManager().getUser(player.getUniqueId());
+ if (user == null) return message;
+
+ CachedMetaData meta = user.getCachedData().getMetaData();
+ String prefix = meta.getPrefix() != null ? meta.getPrefix() : "";
+ String suffix = meta.getSuffix() != null ? meta.getSuffix() : "";
+
+ return message.replace("%prefix%", prefix).replace("%suffix%", suffix);
+ } catch (IllegalStateException ignored) {
+ return message;
+ }
+ }
+
+ // --- Listeners ---
+
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
+ // --- /joinmessages reload ---
+
+ 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, boolean enabled) {}
}
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index d227cd0..d12fb3c 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,38 @@
# 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:
+ 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."
-options:
- disable-vanilla-message: true # the default yellow messages such as "mareleepyke joined the game"
+ 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."
-# priority for checking permissions will be staff > donator > default
+ 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."
-messages:
- reloaded: "Plugin reloaded."
\ No newline at end of file
+ default:
+ enable: true
+ permission: joinmessages.default
+ priority: 0
+ join-message: "&e%user% &7joined the server."
+ leave-message: "&e%user% &7left the server."