diff --git a/server/src/main/java/dev/plex/command/impl/RemoveLoginMessageCMD.java b/server/src/main/java/dev/plex/command/impl/RemoveLoginMessageCMD.java new file mode 100644 index 0000000..e352282 --- /dev/null +++ b/server/src/main/java/dev/plex/command/impl/RemoveLoginMessageCMD.java @@ -0,0 +1,53 @@ +package dev.plex.command.impl; + +import dev.plex.cache.DataUtils; +import dev.plex.command.PlexCommand; +import dev.plex.command.annotation.CommandParameters; +import dev.plex.command.annotation.CommandPermissions; +import dev.plex.command.source.RequiredCommandSource; +import dev.plex.player.PlexPlayer; +import dev.plex.rank.enums.Rank; +import net.kyori.adventure.text.Component; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +@CommandPermissions(level = Rank.ADMIN, permission = "plex.removeloginmessage", source = RequiredCommandSource.ANY) +@CommandParameters(name = "removeloginmessage", usage = "/ [-o ]", description = "Remove your own (or someone else's) login message", aliases = "rlm,removeloginmsg") +public class RemoveLoginMessageCMD extends PlexCommand +{ + @Override + protected Component execute(@NotNull CommandSender sender, @Nullable Player playerSender, String[] args) + { + if (args.length == 0 && !isConsole(sender)) + { + if (playerSender != null) + { + PlexPlayer plexPlayer = plugin.getPlayerCache().getPlexPlayer(playerSender.getUniqueId()); + plexPlayer.setLoginMessage(""); + return messageComponent("removedOwnLoginMessage"); + } + } + else if (args[0].equalsIgnoreCase("-o")) + { + if (args.length < 2) + { + return messageComponent("specifyPlayer"); + } + + PlexPlayer plexPlayer = DataUtils.getPlayer(args[1]); + if (plexPlayer == null) + { + return messageComponent("playerNotFound"); + } + plexPlayer.setLoginMessage(""); + return messageComponent("removedOtherLoginMessage", plexPlayer.getName()); + } + else + { + return messageComponent("noPermissionConsole"); + } + return null; + } +} \ No newline at end of file diff --git a/server/src/main/java/dev/plex/command/impl/SetLoginMessageCMD.java b/server/src/main/java/dev/plex/command/impl/SetLoginMessageCMD.java new file mode 100644 index 0000000..b765c55 --- /dev/null +++ b/server/src/main/java/dev/plex/command/impl/SetLoginMessageCMD.java @@ -0,0 +1,87 @@ +package dev.plex.command.impl; + +import dev.plex.cache.DataUtils; +import dev.plex.command.PlexCommand; +import dev.plex.command.annotation.CommandParameters; +import dev.plex.command.annotation.CommandPermissions; +import dev.plex.command.exception.CommandFailException; +import dev.plex.command.source.RequiredCommandSource; +import dev.plex.player.PlexPlayer; +import dev.plex.rank.enums.Rank; +import dev.plex.util.PlexLog; +import net.kyori.adventure.text.Component; +import org.apache.commons.lang3.StringUtils; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +@CommandPermissions(level = Rank.ADMIN, permission = "plex.setloginmessage", source = RequiredCommandSource.ANY) +@CommandParameters(name = "setloginmessage", usage = "/ [-o ] ", description = "Sets your (or someone else's) login message", aliases = "slm,setloginmsg") +public class SetLoginMessageCMD extends PlexCommand +{ + private final boolean nameRequired = plugin.getConfig().getBoolean("loginmessages.name"); + private final boolean rankRequired = plugin.getConfig().getBoolean("loginmessages.rank"); + + @Override + protected Component execute(@NotNull CommandSender sender, @Nullable Player playerSender, String[] args) + { + if (args.length == 0) + { + return usage(); + } + if (playerSender != null) + { + if (args[0].equals("-o")) + { + if (args.length < 2) + { + return messageComponent("specifyPlayer"); + } + if (args.length < 3) + { + return messageComponent("specifyLoginMessage"); + } + PlexPlayer plexPlayer = DataUtils.getPlayer(args[1]); + if (plexPlayer == null) + { + return messageComponent("playerNotFound"); + } + String message = StringUtils.join(args, " ", 2, args.length); + message = message.replace(plexPlayer.getName(), "%player%"); + validateMessage(message); + plexPlayer.setLoginMessage(message); + return messageComponent("setOtherPlayersLoginMessage", plexPlayer.getName(), + message.replace("%player%", plexPlayer.getName()) + .replace("%rank%", plexPlayer.getRank())); + } + if (isConsole(sender)) + { + return messageComponent("noPermissionConsole"); + } + PlexPlayer plexPlayer = plugin.getPlayerCache().getPlexPlayer(playerSender.getUniqueId()); + String message = StringUtils.join(args, " ", 0, args.length); + message = message.replace(plexPlayer.getName(), "%player%"); + validateMessage(message); + plexPlayer.setLoginMessage(message); + return messageComponent("setOwnLoginMessage", + message.replace("%player%", plexPlayer.getName()) + .replace("%rank%", plexPlayer.getRank())); + } + return null; + } + + private void validateMessage(String message) + { + if (nameRequired && !message.contains("%player%")) + { + PlexLog.debug("Validating login message has a valid name in it"); + throw new CommandFailException(messageString("nameRequired")); + } + if (plugin.getSystem().equalsIgnoreCase("ranks") && rankRequired && !message.contains("%rank%")) + { + PlexLog.debug("Validating login message has a valid rank in it"); + throw new CommandFailException(messageString("rankRequired")); + } + } +} \ No newline at end of file diff --git a/server/src/main/java/dev/plex/listener/impl/PlayerListener.java b/server/src/main/java/dev/plex/listener/impl/PlayerListener.java index 13a9ba2..60fa827 100644 --- a/server/src/main/java/dev/plex/listener/impl/PlayerListener.java +++ b/server/src/main/java/dev/plex/listener/impl/PlayerListener.java @@ -77,7 +77,7 @@ public class PlayerListener extends PlexListener String loginMessage = plugin.getRankManager().getLoginMessage(plexPlayer); if (!loginMessage.isEmpty()) { - PlexUtils.broadcast(PlexUtils.mmDeserialize("" + player.getName() + " is " + loginMessage)); + PlexUtils.broadcast(loginMessage); } PermissionsUtil.setupPermissions(player); diff --git a/server/src/main/java/dev/plex/rank/RankManager.java b/server/src/main/java/dev/plex/rank/RankManager.java index c711c8e..8caa8d4 100644 --- a/server/src/main/java/dev/plex/rank/RankManager.java +++ b/server/src/main/java/dev/plex/rank/RankManager.java @@ -16,6 +16,7 @@ import java.util.stream.Collectors; import lombok.SneakyThrows; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -133,25 +134,33 @@ public class RankManager public String getLoginMessage(PlexPlayer player) { + String prepend; + // We don't want to prepend the " is" if the login message is custom if (!player.getLoginMessage().isEmpty()) { - return player.getLoginMessage(); + return player.getLoginMessage() + .replace("%player%", player.getName()) + .replace("%rank%", player.getRank()); + } + else + { + prepend = MiniMessage.miniMessage().serialize(Component.text(player.getName() + " is ").color(NamedTextColor.AQUA)); } if (Plex.get().config.contains("titles.owners") && Plex.get().config.getStringList("titles.owners").contains(player.getName())) { - return Title.OWNER.getLoginMessage(); + return prepend + Title.OWNER.getLoginMessage(); } if (PlexUtils.DEVELOPERS.contains(player.getUuid().toString())) // don't remove or we will front door ur mother { - return Title.DEV.getLoginMessage(); + return prepend + Title.DEV.getLoginMessage(); } if (Plex.get().config.contains("titles.masterbuilders") && Plex.get().config.getStringList("titles.masterbuilders").contains(player.getName())) { - return Title.MASTER_BUILDER.getLoginMessage(); + return prepend + Title.MASTER_BUILDER.getLoginMessage(); } if (Plex.get().getSystem().equalsIgnoreCase("ranks") && isAdmin(player)) { - return player.getRankFromString().getLoginMessage(); + return prepend + player.getRankFromString().getLoginMessage(); } return ""; } diff --git a/server/src/main/java/dev/plex/util/PlexUtils.java b/server/src/main/java/dev/plex/util/PlexUtils.java index 2cfdd57..eda29dd 100644 --- a/server/src/main/java/dev/plex/util/PlexUtils.java +++ b/server/src/main/java/dev/plex/util/PlexUtils.java @@ -185,7 +185,7 @@ public class PlexUtils implements PlexBase { try { - return ((TextComponent) component).content(); + return ((TextComponent)component).content(); } catch (Exception e) { diff --git a/server/src/main/resources/config.yml b/server/src/main/resources/config.yml index f4bef18..be2c738 100644 --- a/server/src/main/resources/config.yml +++ b/server/src/main/resources/config.yml @@ -34,6 +34,13 @@ chat: # NOTE: If you are using a proxy such as BungeeCord or Velocity, it is highly recommended to use permissions system: ranks +# Login Messages +loginmessages: + # Should the player be required to put their name in the login message? + name: true + # If ranks are enabled, should the player be required to put their rank in the login message? + rank: true + data: central: storage: sqlite # Use mariadb, mongodb, or sqlite here diff --git a/server/src/main/resources/messages.yml b/server/src/main/resources/messages.yml index eac56a4..9027302 100644 --- a/server/src/main/resources/messages.yml +++ b/server/src/main/resources/messages.yml @@ -18,6 +18,7 @@ banMessage: "You have been banned! You may appeal at {0}.\nReaso # 1 - Appeal URL indefBanMessage: "Your {0} is indefinitely banned! You may appeal at {1}." playerNotFound: "Player not found!" +specifyPlayer: "You must specify a player!" worldNotFound: "World not found!" # 0 - The world you have been teleported to playerWorldTeleport: "You have been teleported to {0}." @@ -183,4 +184,15 @@ noteNotFound: "A note with this ID could not be found." removedNote: "Removed note with ID: {0}" # 0 - The number of notes cleared clearedNotes: "Cleared {0} notes." -invalidToggle: "That is not a valid toggle." \ No newline at end of file +invalidToggle: "That is not a valid toggle." +specifyLoginMessage: "Please specify a login message." +# 0 - The login message +setOwnLoginMessage: "Your login message is now:> {0}" +# 0 - The player +# 1 - The login message +setOtherPlayersLoginMessage: "{0}'s login message is now:> {1}" +removedOwnLoginMessage: "Your login message has been removed." +# 0 - The player +removedOtherLoginMessage: "You removed {0}'s login message." +nameRequired: "Policy requires that you must state your player name in your login message. You can either do this by inserting your name or %player%." +rankRequired: "Policy requires that you must state your rank in your login message. You can do this by using %rank% in your login message."