Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>org.me.pyke</groupId>
<artifactId>JoinMessages</artifactId>
<version>1.0-SNAPSHOT</version>
<version>1.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>JoinMessages</name>
Expand All @@ -23,8 +23,8 @@
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<source>16</source>
<target>16</target>
</configuration>
</plugin>
<plugin>
Expand Down
215 changes: 138 additions & 77 deletions src/main/java/org/me/pyke/joinmessages/JoinMessages.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<MessageGroup> groups = new ArrayList<>();

private static final Pattern AMP_HEX_PATTERN = Pattern.compile("(?i)&#([0-9A-F]{6})");

@Override
public void onEnable() {
RegisteredServiceProvider<LuckPerms> 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) {}
}
49 changes: 31 additions & 18 deletions src/main/resources/config.yml
Original file line number Diff line number Diff line change
@@ -1,31 +1,44 @@
# ****************************
# 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
# special ranks, such as donors and staff members, to have special messages, don't give players
# 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."
default:
enable: true
permission: joinmessages.default
priority: 0
join-message: "&e%user% &7joined the server."
leave-message: "&e%user% &7left the server."