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