From 0b586a5d25401db567f35e6d4ac23ed919052d60 Mon Sep 17 00:00:00 2001 From: km127pl Date: Sun, 7 Jan 2024 14:47:12 +0100 Subject: [PATCH 01/49] basic nations --- pom.xml | 4 +- .../pro/cloudnode/smp/nations/Nations.java | 14 +- .../smp/nations/commands/NationsCommand.java | 193 +++++++++++++++++- .../cloudnode/smp/nations/util/Nation.java | 75 +++++++ .../smp/nations/util/NationManager.java | 81 ++++++++ src/main/resources/plugin.yml | 2 +- 6 files changed, 364 insertions(+), 5 deletions(-) create mode 100644 src/main/java/pro/cloudnode/smp/nations/util/Nation.java create mode 100644 src/main/java/pro/cloudnode/smp/nations/util/NationManager.java diff --git a/pom.xml b/pom.xml index c4f017d..a2b9a99 100644 --- a/pom.xml +++ b/pom.xml @@ -23,8 +23,8 @@ maven-compiler-plugin 3.8.1 - ${java.version} - ${java.version} + 16 + 16 diff --git a/src/main/java/pro/cloudnode/smp/nations/Nations.java b/src/main/java/pro/cloudnode/smp/nations/Nations.java index 65e1c4a..6a4ee61 100644 --- a/src/main/java/pro/cloudnode/smp/nations/Nations.java +++ b/src/main/java/pro/cloudnode/smp/nations/Nations.java @@ -2,19 +2,31 @@ import org.bukkit.plugin.java.JavaPlugin; import pro.cloudnode.smp.nations.commands.NationsCommand; +import pro.cloudnode.smp.nations.util.NationManager; import java.util.Objects; public final class Nations extends JavaPlugin { + public static NationManager nationManager; + + public static NationManager getNationManager() { + return nationManager; + } + @Override public void onEnable() { + // load nations + nationManager = new NationManager(this); + nationManager.load(); + + // register commands Objects.requireNonNull(this.getCommand("nations")).setExecutor(new NationsCommand(this)); Objects.requireNonNull(this.getCommand("nations")).setTabCompleter(new NationsCommand(this)); } @Override public void onDisable() { - + nationManager.save(); } } diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index af566cc..529a031 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -1,9 +1,16 @@ package pro.cloudnode.smp.nations.commands; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import pro.cloudnode.smp.nations.Nations; import pro.cloudnode.smp.nations.util.BaseCommand; +import pro.cloudnode.smp.nations.util.Nation; + +import java.util.List; +import java.util.stream.Stream; public class NationsCommand extends BaseCommand { public NationsCommand(@NotNull Nations plugin) { @@ -11,12 +18,196 @@ public NationsCommand(@NotNull Nations plugin) { } public void execute(CommandSender sender, String label, String[] args) { + if (!isPlayer()) { + sendMessage("Only players can use this command."); + return; + } + if (args.length == 0) { //@todo: send help message - sendMessage("Usage: /" + label + " [create|invite|kick|list]"); + sendMessage("Usage: /" + label + " [create|invite|kick|list|quit]"); + return; + } + + switch (args[0]) { + case "create": + newNation(sender, label, args); + break; + case "invite": + invite(sender, label, args); + break; + case "kick": + kick(sender, label, args); + break; + case "list": + list(sender, label, args); + break; + case "quit": + quit(sender, label, args); + break; + case "info": + info(sender, label, args); + break; + case "option": + option(sender, label, args); + break; + default: + sendMessage("Usage: /" + label + " [create|invite|kick|list|quit]"); + break; + } + } + + private void option(CommandSender sender, String label, String[] args) { + if (args.length <= 1) { + sendMessage("Usage: /" + label + " option "); + return; + } + + Nation nation = Nations.getNationManager().getPlayerNation(getPlayer().getUniqueId()); + if (nation == null) { + sendMessage("You are not in a nation."); + return; + } + + if (!nation.leader.equals(getPlayer().getUniqueId())) { + sendMessage("You are not the leader of your nation."); return; } + String key = args[1]; + + switch (key) { + case "color": + if (args.length == 2) { + sendMessage("Usage: /" + label + " option color "); + return; + } + String color = args[2]; + if (!color.matches("^[a-zA-Z0-9]*$")) { + sendMessage("Invalid color, only alphanumeric characters are allowed. Example: 'red', '66ff00'"); + return; + } + nation.color = color; + sendMessage("You have changed the color of your nation to " + color + "."); + break; + default: + sendMessage("Usage: /" + label + " option "); + break; + } + + } + + private void info(CommandSender sender, String label, String[] args) { + if (args.length > 1) { + sendMessage("Usage: /" + label + " info"); + return; + } + + Nation nation = Nations.getNationManager().getPlayerNation(getPlayer().getUniqueId()); + if (nation == null) { + sendMessage("You are not in a nation."); + return; + } + + sendMessage("Info for nation <" + nation.color + ">" + nation.name + ":"); + sendMessage("- Leader: " + Bukkit.getPlayer(nation.leader).getName()); + StringBuilder members = new StringBuilder(); + // add members (green if online, red if offline) + nation.members.forEach(member -> { + if (Bukkit.getPlayer(member) != null) { + members.append("").append(Bukkit.getPlayer(member).getName()); + } else { + members.append("").append(Bukkit.getOfflinePlayer(member).getName()); + } + members.append(", "); + }); + sendMessage("- Members: " + members); + sendMessage("- Color: " + nation.color); + } + + private void quit(CommandSender sender, String label, String[] args) { + if (args.length > 1) { + sendMessage("Usage: /" + label + " quit"); + return; + } + Nation nation = Nations.getNationManager().getPlayerNation(getPlayer().getUniqueId()); + if (nation == null) { + sendMessage("You are not in a nation."); + return; + } + + if (nation.members.isEmpty() && nation.leader.equals(getPlayer().getUniqueId())) { + Nations.getNationManager().remove(nation); + sendMessage("You have disbanded the nation " + nation.name + "."); + } + + if (nation.leader.equals(getPlayer().getUniqueId())) { + sendMessage("You cannot quit the nation because you are the leader. Use /nations kick to kick a member."); + return; + } + + sendMessage("You have quit the nation " + nation.name + "."); + nation.removeMember(getPlayer().getUniqueId()); + } + + private void list(CommandSender sender, String label, String[] args) { + sendMessage("Listing all nations:"); + for (Nation nation : Nations.getNationManager().nations.values()) { + sendMessage("- Leader: " + Bukkit.getPlayer(nation.leader).getName() + "\nMembers: " + nation.members.size() + "'>" + nation.name); + } + } + + private void kick(CommandSender sender, String label, String[] args) { + + } + + private void invite(CommandSender sender, String label, String[] args) { + } + + public void newNation(CommandSender sender, String label, String[] args) { + if (args.length <= 1) { + sendMessage("Usage: /" + label + " create "); + return; + } + + String name = args[1]; + + // check if name is valid (ascii) + if (!name.matches("^[a-zA-Z0-9]*$")) { + sendMessage("Invalid name, only alphanumeric characters are allowed."); + return; + } + + // create nation + Nation nation = new Nation(name, getPlayer().getUniqueId()); + + // save nation + Nations.getNationManager().add(nation); + + // send message + sendMessage("You have created a new nation called " + name + "."); + } + + @Override + public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + switch (args.length) { + case 1: + return Stream.of("create", "invite", "kick", "list", "quit", "info", "option").filter(s -> s.startsWith(args[0])).toList(); + case 2: + switch (args[0]) { + case "create": + return List.of(""); + case "invite": + case "kick": + return List.of(""); + case "option": + return List.of("color"); + default: + return null; + } + default: + return null; + } } } diff --git a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java new file mode 100644 index 0000000..af92af6 --- /dev/null +++ b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java @@ -0,0 +1,75 @@ +package pro.cloudnode.smp.nations.util; + +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.Objects; +import java.util.UUID; + +public class Nation { + public @NotNull UUID uuid; + public @NotNull String name; + public @NotNull UUID leader; + public @NotNull List members; + public @NotNull List invited; + public @NotNull String color; + + public Nation(@NotNull UUID uuid, @NotNull String name, @NotNull UUID leader, @NotNull List members, @NotNull List invited, @NotNull String color) { + this.uuid = uuid; + this.name = name; + this.leader = leader; + this.members = members; + this.invited = invited; + this.color = color; + } + + public Nation(@NotNull String name, @NotNull UUID leader) { + this.uuid = UUID.randomUUID(); + this.name = name; + this.leader = leader; + this.members = List.of(new UUID[0]); + this.invited = List.of(new UUID[0]); + this.color = "white"; + } + + public Nation(String key, FileConfiguration config) { + this.uuid = UUID.fromString(key); + this.load((YamlConfiguration) config); + } + + public void save(YamlConfiguration config) { + config.set("nations." + uuid + ".name", name); + config.set("nations." + uuid + ".leader", leader.toString()); + config.set("nations." + uuid + ".members", members); + config.set("nations." + uuid + ".invited", invited); + config.set("nations." + uuid + ".color", color); + } + + public void load(YamlConfiguration config) { + this.name = Objects.requireNonNull(config.getString("nations." + uuid + ".name")); + this.leader = UUID.fromString(Objects.requireNonNull(config.getString("nations." + uuid + ".leader"))); + this.members = (List) Objects.requireNonNull(config.getList("nations." + uuid + ".members")); + this.invited = (List) Objects.requireNonNull(config.getList("nations." + uuid + ".invited")); + this.color = Objects.requireNonNull(config.getString("nations." + uuid + ".color")); + } + + public void addMember(UUID uuid) { + members.add(uuid); + } + + public void removeMember(UUID uuid) { + members.remove(uuid); + } + + public void addInvited(UUID uuid) { + invited.add(uuid); + } + + public void removeInvited(UUID uuid) { + invited.remove(uuid); + } + + +} diff --git a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java new file mode 100644 index 0000000..616117e --- /dev/null +++ b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java @@ -0,0 +1,81 @@ +package pro.cloudnode.smp.nations.util; + +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import pro.cloudnode.smp.nations.Nations; + +import java.io.File; +import java.util.HashMap; +import java.util.UUID; + +public class NationManager { + private final Nations plugin; + public HashMap nations = new HashMap<>(); + + public NationManager(Nations plugin) { + this.plugin = plugin; + } + + public void add(Nation nation) { + nations.put(nation.uuid, nation); + } + + public void remove(Nation nation) { + nations.remove(nation.uuid); + } + + public Nation get(UUID uuid) { + return nations.get(uuid); + } + + public Nation getPlayerNation(UUID uuid) { + for (Nation nation : nations.values()) { + if (nation.leader.equals(uuid)) { + return nation; + } + if (nation.members.contains(uuid)) { + return nation; + } + } + return null; + } + + public Nation get(String name) { + for (Nation nation : nations.values()) { + if (nation.name.equals(name)) { + return nation; + } + } + return null; + } + + public void save() { + if (nations.isEmpty()) return; + // save nations + YamlConfiguration config = new YamlConfiguration(); + nations.forEach((uuid, nation) -> { + nation.save(config); + }); + + // write to plugins/Nations/nations.yml + try { + File file = new File(this.plugin.getDataFolder(), "nations.yml"); + config.save(file); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void load() { + File file = new File(this.plugin.getDataFolder(), "nations.yml"); + if (file.exists()) { + FileConfiguration config = YamlConfiguration.loadConfiguration(file); + if (config.getConfigurationSection("nations") != null) { + config.getConfigurationSection("nations").getKeys(false).forEach(key -> { + add(new Nation(key, config)); + }); + } + } + } + +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 230e246..6a0e56f 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -5,5 +5,5 @@ api-version: '1.20' commands: nations: description: Main command for Nations - aliases: [n, nation] + aliases: [ n, nation ] usage: / \ No newline at end of file From 96444def583f1667017e0c5bf3db7baa16ac3303 Mon Sep 17 00:00:00 2001 From: km127pl Date: Sun, 7 Jan 2024 15:02:46 +0100 Subject: [PATCH 02/49] add invites and accepts --- .../smp/nations/commands/NationsCommand.java | 115 ++++++++++++++---- .../smp/nations/util/BaseCommand.java | 3 + .../cloudnode/smp/nations/util/Nation.java | 35 ++++-- 3 files changed, 116 insertions(+), 37 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index 529a031..7b21adf 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -3,6 +3,7 @@ import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import pro.cloudnode.smp.nations.Nations; @@ -25,7 +26,7 @@ public void execute(CommandSender sender, String label, String[] args) { if (args.length == 0) { //@todo: send help message - sendMessage("Usage: /" + label + " [create|invite|kick|list|quit]"); + sendMessage("Usage: /" + label + " [create|invite|kick|list|quit|accept]"); return; } @@ -51,12 +52,37 @@ public void execute(CommandSender sender, String label, String[] args) { case "option": option(sender, label, args); break; + case "join": + join(sender, label, args); + break; default: - sendMessage("Usage: /" + label + " [create|invite|kick|list|quit]"); + sendMessage("Usage: /" + label + " [create|invite|kick|list|quit|join]"); break; } } + private void join(CommandSender sender, String label, String[] args) { + if (args.length <= 1) { + sendMessage("Usage: /" + label + " join "); + return; + } + + Nation nation = Nations.getNationManager().get(args[1]); + if (nation == null) { + sendMessage("Nation " + args[1] + " not found."); + return; + } + + if (!nation.invited.contains(getPlayer().getUniqueId())) { + sendMessage("You have not been invited to the nation " + nation.name + "."); + return; + } + + nation.addMember(getPlayer().getUniqueId()); + nation.removeInvited(getPlayer().getUniqueId()); + sendMessage("You have joined the nation " + nation.name + "."); + } + private void option(CommandSender sender, String label, String[] args) { if (args.length <= 1) { sendMessage("Usage: /" + label + " option "); @@ -83,12 +109,18 @@ private void option(CommandSender sender, String label, String[] args) { return; } String color = args[2]; - if (!color.matches("^[a-zA-Z0-9]*$")) { - sendMessage("Invalid color, only alphanumeric characters are allowed. Example: 'red', '66ff00'"); - return; + // #hex or color + if (color.matches("^(?:#(?:[0-9a-fA-F]{3}){1,2}\\b|\\b\\w+\\b)")) { + // check if its hex + if (!color.startsWith("#") && color.length() == 6 && color.matches("[0-9a-fA-F]+")) { + color = "#" + color; + } + nation.color = color; + sendMessage("You have set the color of your nation to <" + color +">" + color + "."); + } else { + sendMessage("Invalid color, must be a hex code or a color name."); } - nation.color = color; - sendMessage("You have changed the color of your nation to " + color + "."); + break; default: sendMessage("Usage: /" + label + " option "); @@ -163,6 +195,41 @@ private void kick(CommandSender sender, String label, String[] args) { } private void invite(CommandSender sender, String label, String[] args) { + if (args.length <= 1) { + sendMessage("Usage: /" + label + " invite "); + return; + } + + Nation nation = Nations.getNationManager().getPlayerNation(getPlayer().getUniqueId()); + if (nation == null) { + sendMessage("You are not in a nation."); + return; + } + + if (!nation.leader.equals(getPlayer().getUniqueId())) { + sendMessage("You are not the leader of your nation."); + return; + } + + Player player = Bukkit.getPlayer(args[1]); + if (player == null) { + sendMessage("Player " + args[1] + " not found."); + return; + } + + if (nation.members.contains(player.getUniqueId())) { + sendMessage("Player " + player.getName() + " is already in your nation."); + return; + } + + if (nation.invited.contains(player.getUniqueId())) { + sendMessage("Player " + player.getName() + " is already invited to your nation."); + return; + } + + nation.addInvited(player.getUniqueId()); + sendMessage("You have invited " + player.getName() + " to your nation."); + sendMessage(player, "You have been invited to the nation " + nation.name + ". Use /nations join " + nation.name + " to join."); } public void newNation(CommandSender sender, String label, String[] args) { @@ -191,23 +258,21 @@ public void newNation(CommandSender sender, String label, String[] args) { @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - switch (args.length) { - case 1: - return Stream.of("create", "invite", "kick", "list", "quit", "info", "option").filter(s -> s.startsWith(args[0])).toList(); - case 2: - switch (args[0]) { - case "create": - return List.of(""); - case "invite": - case "kick": - return List.of(""); - case "option": - return List.of("color"); - default: - return null; - } - default: - return null; - } + return switch (args.length) { + case 1 -> + Stream.of("create", "invite", "kick", "list", "quit", "info", "option", "accept").filter(s -> s.startsWith(args[0])).toList(); + case 2 -> switch (args[0]) { + case "create" -> List.of(""); + case "invite", "kick" -> List.of(""); + case "option" -> List.of("color"); + case "join" -> List.of(""); + default -> null; + }; + case 3 -> switch (args[1]) { + case "color" -> List.of(""); + default -> null; + }; + default -> null; + }; } } diff --git a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java index fb424ad..1e775a0 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java @@ -50,6 +50,9 @@ public CommandSender getSender() { public void sendMessage(String message) { this.sender.sendMessage(MiniMessage.miniMessage().deserialize(message)); } + public void sendMessage(Player player, String message) { + player.sendMessage(MiniMessage.miniMessage().deserialize(message)); + } @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { diff --git a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java index af92af6..6da44b8 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java @@ -4,19 +4,18 @@ import org.bukkit.configuration.file.YamlConfiguration; import org.jetbrains.annotations.NotNull; -import java.util.List; -import java.util.Objects; -import java.util.UUID; +import java.lang.reflect.Array; +import java.util.*; public class Nation { public @NotNull UUID uuid; public @NotNull String name; public @NotNull UUID leader; - public @NotNull List members; - public @NotNull List invited; + public @NotNull ArrayList members; + public @NotNull ArrayList invited; public @NotNull String color; - public Nation(@NotNull UUID uuid, @NotNull String name, @NotNull UUID leader, @NotNull List members, @NotNull List invited, @NotNull String color) { + public Nation(@NotNull UUID uuid, @NotNull String name, @NotNull UUID leader, @NotNull ArrayList members, @NotNull ArrayList invited, @NotNull String color) { this.uuid = uuid; this.name = name; this.leader = leader; @@ -29,8 +28,8 @@ public Nation(@NotNull String name, @NotNull UUID leader) { this.uuid = UUID.randomUUID(); this.name = name; this.leader = leader; - this.members = List.of(new UUID[0]); - this.invited = List.of(new UUID[0]); + this.members = new ArrayList<>(); + this.invited = new ArrayList<>(); this.color = "white"; } @@ -42,16 +41,28 @@ public Nation(String key, FileConfiguration config) { public void save(YamlConfiguration config) { config.set("nations." + uuid + ".name", name); config.set("nations." + uuid + ".leader", leader.toString()); - config.set("nations." + uuid + ".members", members); - config.set("nations." + uuid + ".invited", invited); + config.set("nations." + uuid + ".members", Arrays.stream(members.toArray()).map(Object::toString).toArray()); + config.set("nations." + uuid + ".invited", Arrays.stream(invited.toArray()).map(Object::toString).toArray()); config.set("nations." + uuid + ".color", color); } public void load(YamlConfiguration config) { this.name = Objects.requireNonNull(config.getString("nations." + uuid + ".name")); this.leader = UUID.fromString(Objects.requireNonNull(config.getString("nations." + uuid + ".leader"))); - this.members = (List) Objects.requireNonNull(config.getList("nations." + uuid + ".members")); - this.invited = (List) Objects.requireNonNull(config.getList("nations." + uuid + ".invited")); + this.members = new ArrayList<>(); + this.invited = new ArrayList<>(); + + String[] members = config.getStringList("nations." + uuid + ".members").toArray(new String[0]); + String[] invited = config.getStringList("nations." + uuid + ".invited").toArray(new String[0]); + + for (String member : members) { + this.members.add(UUID.fromString(member)); + } + + for (String invite : invited) { + this.invited.add(UUID.fromString(invite)); + } + this.color = Objects.requireNonNull(config.getString("nations." + uuid + ".color")); } From 17a55b343fb3c17b095403ae937d11bcf684bb65 Mon Sep 17 00:00:00 2001 From: km127pl Date: Sun, 7 Jan 2024 15:03:43 +0100 Subject: [PATCH 03/49] add kick --- .../smp/nations/commands/NationsCommand.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index 7b21adf..ab457d9 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -191,7 +191,36 @@ private void list(CommandSender sender, String label, String[] args) { } private void kick(CommandSender sender, String label, String[] args) { + if (args.length <= 1) { + sendMessage("Usage: /" + label + " kick "); + return; + } + + Nation nation = Nations.getNationManager().getPlayerNation(getPlayer().getUniqueId()); + if (nation == null) { + sendMessage("You are not in a nation."); + return; + } + + if (!nation.leader.equals(getPlayer().getUniqueId())) { + sendMessage("You are not the leader of your nation."); + return; + } + + Player player = Bukkit.getPlayer(args[1]); + if (player == null) { + sendMessage("Player " + args[1] + " not found."); + return; + } + + if (!nation.members.contains(player.getUniqueId())) { + sendMessage("Player " + player.getName() + " is not in your nation."); + return; + } + nation.removeMember(player.getUniqueId()); + sendMessage("You have kicked " + player.getName() + " from your nation."); + sendMessage(player, "You have been kicked from the nation " + nation.name + "."); } private void invite(CommandSender sender, String label, String[] args) { From 9952674760ec2bb1bb045de3bd79104afb1dc48f Mon Sep 17 00:00:00 2001 From: km127pl Date: Sun, 7 Jan 2024 15:03:58 +0100 Subject: [PATCH 04/49] chore: reformat --- pom.xml | 4 ++-- .../pro/cloudnode/smp/nations/commands/NationsCommand.java | 6 +++--- .../java/pro/cloudnode/smp/nations/util/BaseCommand.java | 1 + src/main/java/pro/cloudnode/smp/nations/util/Nation.java | 6 ++++-- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index a2b9a99..8b2132f 100644 --- a/pom.xml +++ b/pom.xml @@ -1,6 +1,6 @@ - 4.0.0 diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index ab457d9..75f9957 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -52,8 +52,8 @@ public void execute(CommandSender sender, String label, String[] args) { case "option": option(sender, label, args); break; - case "join": - join(sender, label, args); + case "join": + join(sender, label, args); break; default: sendMessage("Usage: /" + label + " [create|invite|kick|list|quit|join]"); @@ -116,7 +116,7 @@ private void option(CommandSender sender, String label, String[] args) { color = "#" + color; } nation.color = color; - sendMessage("You have set the color of your nation to <" + color +">" + color + "."); + sendMessage("You have set the color of your nation to <" + color + ">" + color + "."); } else { sendMessage("Invalid color, must be a hex code or a color name."); } diff --git a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java index 1e775a0..962054f 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java @@ -50,6 +50,7 @@ public CommandSender getSender() { public void sendMessage(String message) { this.sender.sendMessage(MiniMessage.miniMessage().deserialize(message)); } + public void sendMessage(Player player, String message) { player.sendMessage(MiniMessage.miniMessage().deserialize(message)); } diff --git a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java index 6da44b8..1495cef 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java @@ -4,8 +4,10 @@ import org.bukkit.configuration.file.YamlConfiguration; import org.jetbrains.annotations.NotNull; -import java.lang.reflect.Array; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Objects; +import java.util.UUID; public class Nation { public @NotNull UUID uuid; From 1aaddc399840b5dee9a891406792391c0bec2f51 Mon Sep 17 00:00:00 2001 From: km127pl Date: Sun, 7 Jan 2024 15:06:58 +0100 Subject: [PATCH 05/49] Revert "chore: reformat" This reverts commit 9952674760ec2bb1bb045de3bd79104afb1dc48f. --- pom.xml | 4 ++-- .../pro/cloudnode/smp/nations/commands/NationsCommand.java | 6 +++--- .../java/pro/cloudnode/smp/nations/util/BaseCommand.java | 1 - src/main/java/pro/cloudnode/smp/nations/util/Nation.java | 6 ++---- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 8b2132f..a2b9a99 100644 --- a/pom.xml +++ b/pom.xml @@ -1,6 +1,6 @@ - 4.0.0 diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index 75f9957..ab457d9 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -52,8 +52,8 @@ public void execute(CommandSender sender, String label, String[] args) { case "option": option(sender, label, args); break; - case "join": - join(sender, label, args); + case "join": + join(sender, label, args); break; default: sendMessage("Usage: /" + label + " [create|invite|kick|list|quit|join]"); @@ -116,7 +116,7 @@ private void option(CommandSender sender, String label, String[] args) { color = "#" + color; } nation.color = color; - sendMessage("You have set the color of your nation to <" + color + ">" + color + "."); + sendMessage("You have set the color of your nation to <" + color +">" + color + "."); } else { sendMessage("Invalid color, must be a hex code or a color name."); } diff --git a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java index 962054f..1e775a0 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java @@ -50,7 +50,6 @@ public CommandSender getSender() { public void sendMessage(String message) { this.sender.sendMessage(MiniMessage.miniMessage().deserialize(message)); } - public void sendMessage(Player player, String message) { player.sendMessage(MiniMessage.miniMessage().deserialize(message)); } diff --git a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java index 1495cef..6da44b8 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java @@ -4,10 +4,8 @@ import org.bukkit.configuration.file.YamlConfiguration; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Objects; -import java.util.UUID; +import java.lang.reflect.Array; +import java.util.*; public class Nation { public @NotNull UUID uuid; From 37392e78c8529e7561aa12523fb8028f7fe6bf8a Mon Sep 17 00:00:00 2001 From: km127pl Date: Sun, 7 Jan 2024 15:07:41 +0100 Subject: [PATCH 06/49] resign: chore: reformat This reverts commit 1aaddc399840b5dee9a891406792391c0bec2f51. --- pom.xml | 4 ++-- .../pro/cloudnode/smp/nations/commands/NationsCommand.java | 6 +++--- .../java/pro/cloudnode/smp/nations/util/BaseCommand.java | 1 + src/main/java/pro/cloudnode/smp/nations/util/Nation.java | 6 ++++-- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index a2b9a99..8b2132f 100644 --- a/pom.xml +++ b/pom.xml @@ -1,6 +1,6 @@ - 4.0.0 diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index ab457d9..75f9957 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -52,8 +52,8 @@ public void execute(CommandSender sender, String label, String[] args) { case "option": option(sender, label, args); break; - case "join": - join(sender, label, args); + case "join": + join(sender, label, args); break; default: sendMessage("Usage: /" + label + " [create|invite|kick|list|quit|join]"); @@ -116,7 +116,7 @@ private void option(CommandSender sender, String label, String[] args) { color = "#" + color; } nation.color = color; - sendMessage("You have set the color of your nation to <" + color +">" + color + "."); + sendMessage("You have set the color of your nation to <" + color + ">" + color + "."); } else { sendMessage("Invalid color, must be a hex code or a color name."); } diff --git a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java index 1e775a0..962054f 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java @@ -50,6 +50,7 @@ public CommandSender getSender() { public void sendMessage(String message) { this.sender.sendMessage(MiniMessage.miniMessage().deserialize(message)); } + public void sendMessage(Player player, String message) { player.sendMessage(MiniMessage.miniMessage().deserialize(message)); } diff --git a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java index 6da44b8..1495cef 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java @@ -4,8 +4,10 @@ import org.bukkit.configuration.file.YamlConfiguration; import org.jetbrains.annotations.NotNull; -import java.lang.reflect.Array; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Objects; +import java.util.UUID; public class Nation { public @NotNull UUID uuid; From f6b874b00bd624f0733ad3cee4f4c0d15d94716e Mon Sep 17 00:00:00 2001 From: km127pl Date: Sun, 7 Jan 2024 15:17:15 +0100 Subject: [PATCH 07/49] Add better help --- .../smp/nations/commands/NationsCommand.java | 55 ++++++++++++++++++- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index 75f9957..20cf06e 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -25,8 +25,7 @@ public void execute(CommandSender sender, String label, String[] args) { } if (args.length == 0) { - //@todo: send help message - sendMessage("Usage: /" + label + " [create|invite|kick|list|quit|accept]"); + help(sender, label, args); return; } @@ -55,6 +54,54 @@ public void execute(CommandSender sender, String label, String[] args) { case "join": join(sender, label, args); break; + case "help": + default: + help(sender, label, args); + break; + } + } + + // help for each command + private void help(CommandSender sender, String label, String[] args) { + if (args.length <= 1) { + // list of commands + sendMessage("Commands:"); + sendMessage("- /nations create (create a new nation)"); + sendMessage("- /nations invite (invite a player to your nation)"); + sendMessage("- /nations kick (kick a player from your nation)"); + sendMessage("- /nations list (list all nations)"); + sendMessage("- /nations quit (quit your nation)"); + sendMessage("- /nations info (get info about your nation)"); + sendMessage("- /nations option (set options for your nation)"); + sendMessage("- /nations join (join a nation)"); + return; + } + + switch (args[1]) { + case "create": + sendMessage("Usage: /" + label + " create "); + break; + case "invite": + sendMessage("Usage: /" + label + " invite "); + break; + case "kick": + sendMessage("Usage: /" + label + " kick "); + break; + case "list": + sendMessage("Usage: /" + label + " list"); + break; + case "quit": + sendMessage("Usage: /" + label + " quit"); + break; + case "info": + sendMessage("Usage: /" + label + " info"); + break; + case "option": + sendMessage("Usage: /" + label + " option "); + break; + case "join": + sendMessage("Usage: /" + label + " join "); + break; default: sendMessage("Usage: /" + label + " [create|invite|kick|list|quit|join]"); break; @@ -287,14 +334,16 @@ public void newNation(CommandSender sender, String label, String[] args) { @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + Stream commands = Stream.of("create", "invite", "kick", "list", "quit", "info", "option", "accept", "help"); return switch (args.length) { case 1 -> - Stream.of("create", "invite", "kick", "list", "quit", "info", "option", "accept").filter(s -> s.startsWith(args[0])).toList(); + commands.filter(s -> s.startsWith(args[0])).toList(); case 2 -> switch (args[0]) { case "create" -> List.of(""); case "invite", "kick" -> List.of(""); case "option" -> List.of("color"); case "join" -> List.of(""); + case "help" -> commands.filter(s -> s.startsWith(args[1])).toList(); default -> null; }; case 3 -> switch (args[1]) { From da97c59f752a2dd81188b6543c5c72370980070d Mon Sep 17 00:00:00 2001 From: km127pl Date: Sun, 7 Jan 2024 15:17:36 +0100 Subject: [PATCH 08/49] Switch to aqua colours --- .../smp/nations/commands/NationsCommand.java | 66 +++++++++---------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index 20cf06e..ad48790 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -65,52 +65,52 @@ public void execute(CommandSender sender, String label, String[] args) { private void help(CommandSender sender, String label, String[] args) { if (args.length <= 1) { // list of commands - sendMessage("Commands:"); - sendMessage("- /nations create (create a new nation)"); - sendMessage("- /nations invite (invite a player to your nation)"); - sendMessage("- /nations kick (kick a player from your nation)"); - sendMessage("- /nations list (list all nations)"); - sendMessage("- /nations quit (quit your nation)"); - sendMessage("- /nations info (get info about your nation)"); - sendMessage("- /nations option (set options for your nation)"); - sendMessage("- /nations join (join a nation)"); + sendMessage("Commands:"); + sendMessage("- /nations create (create a new nation)"); + sendMessage("- /nations invite (invite a player to your nation)"); + sendMessage("- /nations kick (kick a player from your nation)"); + sendMessage("- /nations list (list all nations)"); + sendMessage("- /nations quit (quit your nation)"); + sendMessage("- /nations info (get info about your nation)"); + sendMessage("- /nations option (set options for your nation)"); + sendMessage("- /nations join (join a nation)"); return; } switch (args[1]) { case "create": - sendMessage("Usage: /" + label + " create "); + sendMessage("Usage: /" + label + " create "); break; case "invite": - sendMessage("Usage: /" + label + " invite "); + sendMessage("Usage: /" + label + " invite "); break; case "kick": - sendMessage("Usage: /" + label + " kick "); + sendMessage("Usage: /" + label + " kick "); break; case "list": - sendMessage("Usage: /" + label + " list"); + sendMessage("Usage: /" + label + " list"); break; case "quit": - sendMessage("Usage: /" + label + " quit"); + sendMessage("Usage: /" + label + " quit"); break; case "info": - sendMessage("Usage: /" + label + " info"); + sendMessage("Usage: /" + label + " info"); break; case "option": - sendMessage("Usage: /" + label + " option "); + sendMessage("Usage: /" + label + " option "); break; case "join": - sendMessage("Usage: /" + label + " join "); + sendMessage("Usage: /" + label + " join "); break; default: - sendMessage("Usage: /" + label + " [create|invite|kick|list|quit|join]"); + sendMessage("Usage: /" + label + " [create|invite|kick|list|quit|join]"); break; } } private void join(CommandSender sender, String label, String[] args) { if (args.length <= 1) { - sendMessage("Usage: /" + label + " join "); + sendMessage("Usage: /" + label + " join "); return; } @@ -132,7 +132,7 @@ private void join(CommandSender sender, String label, String[] args) { private void option(CommandSender sender, String label, String[] args) { if (args.length <= 1) { - sendMessage("Usage: /" + label + " option "); + sendMessage("Usage: /" + label + " option "); return; } @@ -152,7 +152,7 @@ private void option(CommandSender sender, String label, String[] args) { switch (key) { case "color": if (args.length == 2) { - sendMessage("Usage: /" + label + " option color "); + sendMessage("Usage: /" + label + " option color "); return; } String color = args[2]; @@ -170,7 +170,7 @@ private void option(CommandSender sender, String label, String[] args) { break; default: - sendMessage("Usage: /" + label + " option "); + sendMessage("Usage: /" + label + " option "); break; } @@ -178,7 +178,7 @@ private void option(CommandSender sender, String label, String[] args) { private void info(CommandSender sender, String label, String[] args) { if (args.length > 1) { - sendMessage("Usage: /" + label + " info"); + sendMessage("Usage: /" + label + " info"); return; } @@ -188,8 +188,8 @@ private void info(CommandSender sender, String label, String[] args) { return; } - sendMessage("Info for nation <" + nation.color + ">" + nation.name + ":"); - sendMessage("- Leader: " + Bukkit.getPlayer(nation.leader).getName()); + sendMessage("Info for nation <" + nation.color + ">" + nation.name + ":"); + sendMessage("- Leader: " + Bukkit.getPlayer(nation.leader).getName()); StringBuilder members = new StringBuilder(); // add members (green if online, red if offline) nation.members.forEach(member -> { @@ -200,13 +200,13 @@ private void info(CommandSender sender, String label, String[] args) { } members.append(", "); }); - sendMessage("- Members: " + members); - sendMessage("- Color: " + nation.color); + sendMessage("- Members: " + members); + sendMessage("- Color: " + nation.color); } private void quit(CommandSender sender, String label, String[] args) { if (args.length > 1) { - sendMessage("Usage: /" + label + " quit"); + sendMessage("Usage: /" + label + " quit"); return; } @@ -231,15 +231,15 @@ private void quit(CommandSender sender, String label, String[] args) { } private void list(CommandSender sender, String label, String[] args) { - sendMessage("Listing all nations:"); + sendMessage("Listing all nations:"); for (Nation nation : Nations.getNationManager().nations.values()) { - sendMessage("- Leader: " + Bukkit.getPlayer(nation.leader).getName() + "\nMembers: " + nation.members.size() + "'>" + nation.name); + sendMessage("- Leader: " + Bukkit.getPlayer(nation.leader).getName() + "\nMembers: " + nation.members.size() + "'>" + nation.name); } } private void kick(CommandSender sender, String label, String[] args) { if (args.length <= 1) { - sendMessage("Usage: /" + label + " kick "); + sendMessage("Usage: /" + label + " kick "); return; } @@ -272,7 +272,7 @@ private void kick(CommandSender sender, String label, String[] args) { private void invite(CommandSender sender, String label, String[] args) { if (args.length <= 1) { - sendMessage("Usage: /" + label + " invite "); + sendMessage("Usage: /" + label + " invite "); return; } @@ -310,7 +310,7 @@ private void invite(CommandSender sender, String label, String[] args) { public void newNation(CommandSender sender, String label, String[] args) { if (args.length <= 1) { - sendMessage("Usage: /" + label + " create "); + sendMessage("Usage: /" + label + " create "); return; } From 4c87b9f9c7c1baaebd5e8f286409ca6990de74f5 Mon Sep 17 00:00:00 2001 From: km127pl Date: Sun, 7 Jan 2024 15:18:27 +0100 Subject: [PATCH 09/49] forgot a return after disbanding --- .../java/pro/cloudnode/smp/nations/commands/NationsCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index ad48790..6f8237e 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -219,6 +219,7 @@ private void quit(CommandSender sender, String label, String[] args) { if (nation.members.isEmpty() && nation.leader.equals(getPlayer().getUniqueId())) { Nations.getNationManager().remove(nation); sendMessage("You have disbanded the nation " + nation.name + "."); + return; } if (nation.leader.equals(getPlayer().getUniqueId())) { From 57c350ab3cdb71ac0b58cdaaa2f63d2b67134d9f Mon Sep 17 00:00:00 2001 From: km127pl Date: Sun, 7 Jan 2024 15:20:22 +0100 Subject: [PATCH 10/49] Add a no nations message --- .../pro/cloudnode/smp/nations/commands/NationsCommand.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index 6f8237e..9b0362d 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -233,6 +233,10 @@ private void quit(CommandSender sender, String label, String[] args) { private void list(CommandSender sender, String label, String[] args) { sendMessage("Listing all nations:"); + if (Nations.getNationManager().nations.isEmpty()) { + sendMessage("There are no nations."); + return; + } for (Nation nation : Nations.getNationManager().nations.values()) { sendMessage("- Leader: " + Bukkit.getPlayer(nation.leader).getName() + "\nMembers: " + nation.members.size() + "'>" + nation.name); } From 4b64053a6f2931b36c0715807df2ba686bcbcfaa Mon Sep 17 00:00:00 2001 From: km127pl Date: Sun, 7 Jan 2024 15:34:05 +0100 Subject: [PATCH 11/49] add translations --- .../smp/nations/commands/NationsCommand.java | 5 +- .../smp/nations/locale/Messages.java | 90 +++++++++++++++++++ .../smp/nations/util/BaseCommand.java | 25 ++++++ 3 files changed, 118 insertions(+), 2 deletions(-) create mode 100644 src/main/java/pro/cloudnode/smp/nations/locale/Messages.java diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index 9b0362d..4565ccb 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -7,6 +7,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import pro.cloudnode.smp.nations.Nations; +import pro.cloudnode.smp.nations.locale.Messages; import pro.cloudnode.smp.nations.util.BaseCommand; import pro.cloudnode.smp.nations.util.Nation; @@ -232,9 +233,9 @@ private void quit(CommandSender sender, String label, String[] args) { } private void list(CommandSender sender, String label, String[] args) { - sendMessage("Listing all nations:"); + sendMessage(t(Messages.LIST_HEADER)); if (Nations.getNationManager().nations.isEmpty()) { - sendMessage("There are no nations."); + sendMessage(t(Messages.NO_NATIONS)); return; } for (Nation nation : Nations.getNationManager().nations.values()) { diff --git a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java new file mode 100644 index 0000000..239164d --- /dev/null +++ b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java @@ -0,0 +1,90 @@ +package pro.cloudnode.smp.nations.locale; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.entity.Player; +import pro.cloudnode.smp.nations.Nations; +import pro.cloudnode.smp.nations.util.Nation; + +public enum Messages { + USAGE("usage", "Usage: "), + NO_PERMISSION("no-permission", "You do not have permission to use this command."), + + NATION_NOT_FOUND("nation-not-found", "Nation not found."), + + NOT_INVITED_TO_NATION("not-invited-to-nation", "You are not invited to "), + JOINED_NATION("joined-nation", "You have joined the nation "), + NOT_IN_NATION("not-in-nation", "You are not in a nation."), + NOT_LEADER("not-leader", "You are not the leader of your nation."), + COLOR_SET("color-set", "You have set your nation color to "), + INVALID_COLOR("invalid-color", "Invalid color, must be a hex code or a color name."), + + INFO_HEADER("info-header", "Info for "), + INFO_LEADER("info-leader", "Leader: "), + INFO_MEMBERS("info-members", "Members: "), + INFO_COLOR("info-color", "Color: "), + + LIST_HEADER("list-header", "Nations:"), + LIST_ITEM("list-item", " ()"), + + NATION_DISBANDED("nation-disbanded", "Your nation has been disbanded."), + + CANT_QUIT_AS_LEADER("cant-quit-as-leader", "You cannot quit the nation because you are the leader. Use /nations kick to kick a member."), + + QUIT_NATION("quit-nation", "You have quit the nation "), + + NO_NATIONS("no-nations", "There are no nations."), + YOU_HAVE_KICKED("you-have-kicked", "You have kicked from your nation."), + YOU_HAVE_BEEN_KICKED("you-have-been-kicked", "You have been kicked from "), + PLAYER_NOT_FOUND("player-not-found", "Player not found."), + PLAYER_NOT_IN_NATION("player-not-in-nation", "Player is not in your nation."), + INVALID_NAME("invalid-name", "Invalid name, only alphanumeric characters are allowed."), + NEW_NATION("new-nation", "You have created the nation "); + + public final String key; + + public final String default_value; + + Messages(String key, String default_value) { + this.key = key; + this.default_value = default_value; + } + + public String getKey() { + return key; + } + + public String getDefaultValue() { + return default_value; + } + + public Component replacePlaceholders(Nation nation, Player player) { + return MiniMessage.miniMessage().deserialize(default_value + .replace("", nation.name) + .replace("", player.getName()) + .replace("", String.join(", ", nation.members.toString())) + .replace("", nation.color) + .replace("", player.getName()) + .replace("", nation.color) + ); + } + + public Component replacePlaceholders(Nation nation) { + return MiniMessage.miniMessage().deserialize(default_value + .replace("", nation.name) + .replace("", nation.leader.toString()) + .replace("", String.join(", ", nation.members.toString())) + .replace("", nation.color) + ); + } + + public Component replacePlaceholders() { + return MiniMessage.miniMessage().deserialize(default_value); + } + + public Component replacePlaceholders(Player player) { + return MiniMessage.miniMessage().deserialize(default_value + .replace("", player.getName()) + ); + } +} diff --git a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java index 962054f..dadef17 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java @@ -1,5 +1,6 @@ package pro.cloudnode.smp.nations.util; +import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -9,6 +10,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import pro.cloudnode.smp.nations.Nations; +import pro.cloudnode.smp.nations.locale.Messages; import java.util.List; @@ -50,11 +52,34 @@ public CommandSender getSender() { public void sendMessage(String message) { this.sender.sendMessage(MiniMessage.miniMessage().deserialize(message)); } + public void sendMessage(Component message) { + this.sender.sendMessage(message); + } public void sendMessage(Player player, String message) { player.sendMessage(MiniMessage.miniMessage().deserialize(message)); } + public void sendMessage(Player player, Component message) { + player.sendMessage(message); + } + + public Component t(Messages message, Nation nation, Player player) { + return message.replacePlaceholders(nation, player); + } + + public Component t(Messages message, Nation nation) { + return message.replacePlaceholders(nation); + } + + public Component t(Messages message) { + return message.replacePlaceholders(); + } + + public Component t(Messages message, Player player) { + return message.replacePlaceholders(player); + } + @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { return null; From 7b7b2afa86132b51bb0ccc148549cbc8ba57f053 Mon Sep 17 00:00:00 2001 From: km127pl Date: Sun, 7 Jan 2024 19:51:21 +0100 Subject: [PATCH 12/49] hotfix: nations not saving if there aren't any created --- .../pro/cloudnode/smp/nations/util/NationManager.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java index 616117e..289e159 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java @@ -50,12 +50,13 @@ public Nation get(String name) { } public void save() { - if (nations.isEmpty()) return; // save nations YamlConfiguration config = new YamlConfiguration(); - nations.forEach((uuid, nation) -> { - nation.save(config); - }); + if (!nations.isEmpty()) { + nations.forEach((uuid, nation) -> { + nation.save(config); + }); + } // write to plugins/Nations/nations.yml try { From c92a0b624d9a896e9aa5bd38529fd1bfd1eae7cf Mon Sep 17 00:00:00 2001 From: km127pl Date: Sun, 7 Jan 2024 20:15:33 +0100 Subject: [PATCH 13/49] Finish translation --- .../smp/nations/commands/NationsCommand.java | 136 +++++++++--------- .../smp/nations/locale/Messages.java | 91 ++++++------ .../smp/nations/util/BaseCommand.java | 16 +-- 3 files changed, 114 insertions(+), 129 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index 4565ccb..1516dbd 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -12,6 +12,7 @@ import pro.cloudnode.smp.nations.util.Nation; import java.util.List; +import java.util.Objects; import java.util.stream.Stream; public class NationsCommand extends BaseCommand { @@ -21,7 +22,7 @@ public NationsCommand(@NotNull Nations plugin) { public void execute(CommandSender sender, String label, String[] args) { if (!isPlayer()) { - sendMessage("Only players can use this command."); + sendMessage(t(Messages.ONLY_PLAYERS)); return; } @@ -66,85 +67,86 @@ public void execute(CommandSender sender, String label, String[] args) { private void help(CommandSender sender, String label, String[] args) { if (args.length <= 1) { // list of commands - sendMessage("Commands:"); - sendMessage("- /nations create (create a new nation)"); - sendMessage("- /nations invite (invite a player to your nation)"); - sendMessage("- /nations kick (kick a player from your nation)"); - sendMessage("- /nations list (list all nations)"); - sendMessage("- /nations quit (quit your nation)"); - sendMessage("- /nations info (get info about your nation)"); - sendMessage("- /nations option (set options for your nation)"); - sendMessage("- /nations join (join a nation)"); + sendMessage(t(Messages.COMMANDS_HEADER)); + sendMessage(t(Messages.COMMANDS_ITEM, "create", "", "create a new nation")); + sendMessage(t(Messages.COMMANDS_ITEM, "invite", "", "invite a player to your nation")); + sendMessage(t(Messages.COMMANDS_ITEM, "kick", "", "kick a player from your nation")); + sendMessage(t(Messages.COMMANDS_ITEM, "list", "", "list all nations")); + sendMessage(t(Messages.COMMANDS_ITEM, "quit", "", "quit your nation")); + sendMessage(t(Messages.COMMANDS_ITEM, "info", "", "get info about your nation")); + sendMessage(t(Messages.COMMANDS_ITEM, "option", " ", "set options for your nation")); + sendMessage(t(Messages.COMMANDS_ITEM, "join", "", "join a nation")); + sendMessage(t(Messages.COMMANDS_ITEM, "help", "", "show this help message")); return; } switch (args[1]) { case "create": - sendMessage("Usage: /" + label + " create "); + sendMessage(t(Messages.USAGE, label, "create", "")); break; case "invite": - sendMessage("Usage: /" + label + " invite "); + sendMessage(t(Messages.USAGE, label, "invite", "")); break; case "kick": - sendMessage("Usage: /" + label + " kick "); + sendMessage(t(Messages.USAGE, label, "kick", "")); break; case "list": - sendMessage("Usage: /" + label + " list"); + sendMessage(t(Messages.USAGE, label, "list", "")); break; case "quit": - sendMessage("Usage: /" + label + " quit"); + sendMessage(t(Messages.USAGE, label, "quit", "")); break; case "info": - sendMessage("Usage: /" + label + " info"); + sendMessage(t(Messages.USAGE, label, "info", "")); break; case "option": - sendMessage("Usage: /" + label + " option "); + sendMessage(t(Messages.USAGE, label, "option", " ")); break; case "join": - sendMessage("Usage: /" + label + " join "); + sendMessage(t(Messages.USAGE, label, "join", "")); break; default: - sendMessage("Usage: /" + label + " [create|invite|kick|list|quit|join]"); + help(sender, label, new String[0]); break; } } private void join(CommandSender sender, String label, String[] args) { if (args.length <= 1) { - sendMessage("Usage: /" + label + " join "); + sendMessage(t(Messages.USAGE, label, "join", "")); return; } Nation nation = Nations.getNationManager().get(args[1]); if (nation == null) { - sendMessage("Nation " + args[1] + " not found."); + sendMessage(t(Messages.NATION_NOT_FOUND, args[1])); return; } if (!nation.invited.contains(getPlayer().getUniqueId())) { - sendMessage("You have not been invited to the nation " + nation.name + "."); + sendMessage(t(Messages.NOT_INVITED_TO_NATION, nation)); return; } nation.addMember(getPlayer().getUniqueId()); nation.removeInvited(getPlayer().getUniqueId()); - sendMessage("You have joined the nation " + nation.name + "."); + sendMessage(t(Messages.JOINED_NATION, nation)); } private void option(CommandSender sender, String label, String[] args) { if (args.length <= 1) { - sendMessage("Usage: /" + label + " option "); + sendMessage(t(Messages.USAGE, label, "option", " ")); return; } Nation nation = Nations.getNationManager().getPlayerNation(getPlayer().getUniqueId()); if (nation == null) { - sendMessage("You are not in a nation."); + sendMessage(t(Messages.NOT_IN_NATION)); return; } if (!nation.leader.equals(getPlayer().getUniqueId())) { - sendMessage("You are not the leader of your nation."); + sendMessage(t(Messages.NOT_LEADER)); return; } @@ -153,7 +155,7 @@ private void option(CommandSender sender, String label, String[] args) { switch (key) { case "color": if (args.length == 2) { - sendMessage("Usage: /" + label + " option color "); + sendMessage(t(Messages.USAGE, label, "option", "color ")); return; } String color = args[2]; @@ -164,14 +166,14 @@ private void option(CommandSender sender, String label, String[] args) { color = "#" + color; } nation.color = color; - sendMessage("You have set the color of your nation to <" + color + ">" + color + "."); + sendMessage(t(Messages.COLOR_SET, color)); } else { - sendMessage("Invalid color, must be a hex code or a color name."); + sendMessage(t(Messages.INVALID_COLOR)); } break; default: - sendMessage("Usage: /" + label + " option "); + sendMessage(t(Messages.USAGE, label, "option", " ")); break; } @@ -179,56 +181,45 @@ private void option(CommandSender sender, String label, String[] args) { private void info(CommandSender sender, String label, String[] args) { if (args.length > 1) { - sendMessage("Usage: /" + label + " info"); + sendMessage(t(Messages.USAGE, label, "info", "")); return; } Nation nation = Nations.getNationManager().getPlayerNation(getPlayer().getUniqueId()); if (nation == null) { - sendMessage("You are not in a nation."); + sendMessage(t(Messages.NOT_IN_NATION)); return; } - sendMessage("Info for nation <" + nation.color + ">" + nation.name + ":"); - sendMessage("- Leader: " + Bukkit.getPlayer(nation.leader).getName()); - StringBuilder members = new StringBuilder(); - // add members (green if online, red if offline) - nation.members.forEach(member -> { - if (Bukkit.getPlayer(member) != null) { - members.append("").append(Bukkit.getPlayer(member).getName()); - } else { - members.append("").append(Bukkit.getOfflinePlayer(member).getName()); - } - members.append(", "); - }); - sendMessage("- Members: " + members); - sendMessage("- Color: " + nation.color); + sendMessage(t(Messages.INFO_HEADER, nation)); + sendMessage(t(Messages.INFO_LEADER, Bukkit.getPlayer(nation.leader).getName())); + sendMessage(t(Messages.INFO_MEMBERS, nation.members.stream().map(Bukkit::getPlayer).filter(Objects::nonNull).map(Player::getName).toList().toString())); } private void quit(CommandSender sender, String label, String[] args) { if (args.length > 1) { - sendMessage("Usage: /" + label + " quit"); + sendMessage(t(Messages.USAGE, label, "quit", "")); return; } Nation nation = Nations.getNationManager().getPlayerNation(getPlayer().getUniqueId()); if (nation == null) { - sendMessage("You are not in a nation."); + sendMessage(t(Messages.NOT_IN_NATION)); return; } if (nation.members.isEmpty() && nation.leader.equals(getPlayer().getUniqueId())) { + sendMessage(t(Messages.NATION_DISBANDED, nation)); Nations.getNationManager().remove(nation); - sendMessage("You have disbanded the nation " + nation.name + "."); return; } if (nation.leader.equals(getPlayer().getUniqueId())) { - sendMessage("You cannot quit the nation because you are the leader. Use /nations kick to kick a member."); + sendMessage(t(Messages.CANT_QUIT_AS_LEADER)); return; } - sendMessage("You have quit the nation " + nation.name + "."); + sendMessage(t(Messages.QUIT_NATION, nation)); nation.removeMember(getPlayer().getUniqueId()); } @@ -239,84 +230,85 @@ private void list(CommandSender sender, String label, String[] args) { return; } for (Nation nation : Nations.getNationManager().nations.values()) { - sendMessage("- Leader: " + Bukkit.getPlayer(nation.leader).getName() + "\nMembers: " + nation.members.size() + "'>" + nation.name); + sendMessage(t(Messages.LIST_ITEM, nation)); } } private void kick(CommandSender sender, String label, String[] args) { if (args.length <= 1) { - sendMessage("Usage: /" + label + " kick "); + sendMessage(t(Messages.USAGE, label, "kick", "")); return; } Nation nation = Nations.getNationManager().getPlayerNation(getPlayer().getUniqueId()); if (nation == null) { - sendMessage("You are not in a nation."); + sendMessage(t(Messages.NOT_IN_NATION)); return; } if (!nation.leader.equals(getPlayer().getUniqueId())) { - sendMessage("You are not the leader of your nation."); + sendMessage(t(Messages.NOT_LEADER)); return; } Player player = Bukkit.getPlayer(args[1]); if (player == null) { - sendMessage("Player " + args[1] + " not found."); + sendMessage(t(Messages.PLAYER_NOT_FOUND, args[1])); return; } if (!nation.members.contains(player.getUniqueId())) { - sendMessage("Player " + player.getName() + " is not in your nation."); + sendMessage(t(Messages.PLAYER_NOT_IN_NATION, player)); return; } nation.removeMember(player.getUniqueId()); - sendMessage("You have kicked " + player.getName() + " from your nation."); - sendMessage(player, "You have been kicked from the nation " + nation.name + "."); + sendMessage(t(Messages.YOU_HAVE_KICKED, player)); + sendMessage(player, t(Messages.YOU_HAVE_BEEN_KICKED, nation)); } private void invite(CommandSender sender, String label, String[] args) { if (args.length <= 1) { - sendMessage("Usage: /" + label + " invite "); + sendMessage(t(Messages.USAGE, label, "invite", "")); return; } Nation nation = Nations.getNationManager().getPlayerNation(getPlayer().getUniqueId()); if (nation == null) { - sendMessage("You are not in a nation."); + sendMessage(t(Messages.NOT_IN_NATION)); return; } if (!nation.leader.equals(getPlayer().getUniqueId())) { - sendMessage("You are not the leader of your nation."); + sendMessage(t(Messages.NOT_LEADER)); return; } Player player = Bukkit.getPlayer(args[1]); if (player == null) { - sendMessage("Player " + args[1] + " not found."); + sendMessage(t(Messages.PLAYER_NOT_FOUND, args[1])); return; } + Nation inviteeNation = Nations.getNationManager().getPlayerNation(player.getUniqueId()); - if (nation.members.contains(player.getUniqueId())) { - sendMessage("Player " + player.getName() + " is already in your nation."); + if (inviteeNation != null) { + sendMessage(t(Messages.PLAYER_ALREADY_IN_NATION, player)); return; } if (nation.invited.contains(player.getUniqueId())) { - sendMessage("Player " + player.getName() + " is already invited to your nation."); + sendMessage(t(Messages.PLAYER_ALREADY_INVITED, player)); return; } nation.addInvited(player.getUniqueId()); - sendMessage("You have invited " + player.getName() + " to your nation."); - sendMessage(player, "You have been invited to the nation " + nation.name + ". Use /nations join " + nation.name + " to join."); + sendMessage(t(Messages.INVITED_PLAYER, player)); + sendMessage(player, t(Messages.YOU_HAVE_BEEN_INVITED, nation)); } public void newNation(CommandSender sender, String label, String[] args) { if (args.length <= 1) { - sendMessage("Usage: /" + label + " create "); + sendMessage(t(Messages.USAGE, label, "create", "")); return; } @@ -324,7 +316,7 @@ public void newNation(CommandSender sender, String label, String[] args) { // check if name is valid (ascii) if (!name.matches("^[a-zA-Z0-9]*$")) { - sendMessage("Invalid name, only alphanumeric characters are allowed."); + sendMessage(t(Messages.INVALID_NAME)); return; } @@ -335,12 +327,12 @@ public void newNation(CommandSender sender, String label, String[] args) { Nations.getNationManager().add(nation); // send message - sendMessage("You have created a new nation called " + name + "."); + sendMessage(t(Messages.NEW_NATION, nation)); } @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - Stream commands = Stream.of("create", "invite", "kick", "list", "quit", "info", "option", "accept", "help"); + Stream commands = Stream.of("create", "invite", "kick", "list", "quit", "info", "option", "join", "help"); return switch (args.length) { case 1 -> commands.filter(s -> s.startsWith(args[0])).toList(); diff --git a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java index 239164d..f61d382 100644 --- a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java +++ b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java @@ -2,44 +2,54 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; import pro.cloudnode.smp.nations.Nations; import pro.cloudnode.smp.nations.util.Nation; public enum Messages { - USAGE("usage", "Usage: "), + USAGE("usage", "Usage: /$0 $1 $2"), NO_PERMISSION("no-permission", "You do not have permission to use this command."), - NATION_NOT_FOUND("nation-not-found", "Nation not found."), + NATION_NOT_FOUND("nation-not-found", "Nation $0 not found."), NOT_INVITED_TO_NATION("not-invited-to-nation", "You are not invited to "), - JOINED_NATION("joined-nation", "You have joined the nation "), + JOINED_NATION("joined-nation", "You have joined the nation "), NOT_IN_NATION("not-in-nation", "You are not in a nation."), NOT_LEADER("not-leader", "You are not the leader of your nation."), - COLOR_SET("color-set", "You have set your nation color to "), + COLOR_SET("color-set", "You have set your nation color to <$0>$0"), INVALID_COLOR("invalid-color", "Invalid color, must be a hex code or a color name."), - INFO_HEADER("info-header", "Info for "), - INFO_LEADER("info-leader", "Leader: "), - INFO_MEMBERS("info-members", "Members: "), + INFO_HEADER("info-header", "Info for "), + INFO_LEADER("info-leader", "Leader: $0"), + INFO_MEMBERS("info-members", "Members: $0"), INFO_COLOR("info-color", "Color: "), LIST_HEADER("list-header", "Nations:"), - LIST_ITEM("list-item", " ()"), + //@todo: add hover information later + LIST_ITEM("list-item", " ()"), - NATION_DISBANDED("nation-disbanded", "Your nation has been disbanded."), + NATION_DISBANDED("nation-disbanded", "Your nation () has been disbanded."), - CANT_QUIT_AS_LEADER("cant-quit-as-leader", "You cannot quit the nation because you are the leader. Use /nations kick to kick a member."), + CANT_QUIT_AS_LEADER("cant-quit-as-leader", "You cannot quit the nation because you are the leader. Use /nations kick to kick all members."), - QUIT_NATION("quit-nation", "You have quit the nation "), + QUIT_NATION("quit-nation", "You have quit the nation "), NO_NATIONS("no-nations", "There are no nations."), - YOU_HAVE_KICKED("you-have-kicked", "You have kicked from your nation."), + YOU_HAVE_KICKED("you-have-kicked", "You have kicked from your nation."), YOU_HAVE_BEEN_KICKED("you-have-been-kicked", "You have been kicked from "), - PLAYER_NOT_FOUND("player-not-found", "Player not found."), + PLAYER_NOT_FOUND("player-not-found", "Player $0 not found."), PLAYER_NOT_IN_NATION("player-not-in-nation", "Player is not in your nation."), - INVALID_NAME("invalid-name", "Invalid name, only alphanumeric characters are allowed."), - NEW_NATION("new-nation", "You have created the nation "); + INVALID_NAME("invalid-name", "Invalid name, only alphanumeric characters are allowed."), + NEW_NATION("new-nation", "You have created the nation "), + ONLY_PLAYERS("only-players", "Only players can use this command."), + + COMMANDS_HEADER("commands-header", "Commands:"), + COMMANDS_ITEM("commands-item", "- /nations $0 $1 ($2)"), + PLAYER_ALREADY_IN_NATION("player-already-in-nation", "Player is already in a nation."), + PLAYER_ALREADY_INVITED("player-already-invited", "Player is already invited to your nation."), + INVITED_PLAYER("invited-player", "You have invited to your nation."), + YOU_HAVE_BEEN_INVITED("you-have-been-invited", "You have been invited to . Use /nations join to join."); public final String key; @@ -58,33 +68,28 @@ public String getDefaultValue() { return default_value; } - public Component replacePlaceholders(Nation nation, Player player) { - return MiniMessage.miniMessage().deserialize(default_value - .replace("", nation.name) - .replace("", player.getName()) - .replace("", String.join(", ", nation.members.toString())) - .replace("", nation.color) - .replace("", player.getName()) - .replace("", nation.color) - ); - } - - public Component replacePlaceholders(Nation nation) { - return MiniMessage.miniMessage().deserialize(default_value - .replace("", nation.name) - .replace("", nation.leader.toString()) - .replace("", String.join(", ", nation.members.toString())) - .replace("", nation.color) - ); - } - - public Component replacePlaceholders() { - return MiniMessage.miniMessage().deserialize(default_value); - } - - public Component replacePlaceholders(Player player) { - return MiniMessage.miniMessage().deserialize(default_value - .replace("", player.getName()) - ); + // the objects may be Players or Nation objects + public Component replacePlaceholders(Object ...args) { + String message = this.getDefaultValue(); + for (int i = 0; i < args.length; i++) { + Object arg = args[i]; + if (arg instanceof Player player) { + message = message.replace("", player.getName()) + .replace("", player.getUniqueId().toString()) + .replace("", player.displayName().toString()) + .replace("", player.getName()); + } else if (arg instanceof Nation nation) { + String leaderName = Bukkit.getOfflinePlayer(nation.leader).getName(); + leaderName = leaderName == null ? "Unknown" : leaderName; + message = message.replace("", nation.name) + .replace("", nation.leader.toString()) + .replace("", "<" + nation.color + ">") + .replace("", nation.uuid.toString()) + .replace("", leaderName); + } else if (arg instanceof String str) { + message = message.replace("$" + i, str); + } + } + return MiniMessage.miniMessage().deserialize(message); } } diff --git a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java index dadef17..d36d146 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java @@ -64,20 +64,8 @@ public void sendMessage(Player player, Component message) { player.sendMessage(message); } - public Component t(Messages message, Nation nation, Player player) { - return message.replacePlaceholders(nation, player); - } - - public Component t(Messages message, Nation nation) { - return message.replacePlaceholders(nation); - } - - public Component t(Messages message) { - return message.replacePlaceholders(); - } - - public Component t(Messages message, Player player) { - return message.replacePlaceholders(player); + public Component t(Messages message, Object ...args) { + return message.replacePlaceholders(args); } @Override From 801b749a7d4deaedde993f8c963dd30e254174eb Mon Sep 17 00:00:00 2001 From: km127pl Date: Sun, 7 Jan 2024 20:43:52 +0100 Subject: [PATCH 14/49] try to add IC supprt --- pom.xml | 10 ++++++ .../pro/cloudnode/smp/nations/Nations.java | 32 +++++++++++++++++++ .../smp/nations/commands/NationsCommand.java | 2 ++ .../smp/nations/locale/Messages.java | 3 +- .../smp/nations/util/BaseCommand.java | 4 --- src/main/resources/plugin.yml | 2 ++ 6 files changed, 48 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 8b2132f..9559e15 100644 --- a/pom.xml +++ b/pom.xml @@ -58,6 +58,10 @@ sonatype https://oss.sonatype.org/content/groups/public/ + + loohp-repo + https://repo.loohpjames.com/repository + @@ -67,5 +71,11 @@ 1.20.2-R0.1-SNAPSHOT provided + + com.loohp + InteractiveChat + 4.2.9.0 + provided + diff --git a/src/main/java/pro/cloudnode/smp/nations/Nations.java b/src/main/java/pro/cloudnode/smp/nations/Nations.java index 6a4ee61..8ec82f6 100644 --- a/src/main/java/pro/cloudnode/smp/nations/Nations.java +++ b/src/main/java/pro/cloudnode/smp/nations/Nations.java @@ -1,9 +1,16 @@ package pro.cloudnode.smp.nations; +import com.loohp.interactivechat.api.InteractiveChatAPI; +import net.kyori.adventure.text.Component; +import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; import pro.cloudnode.smp.nations.commands.NationsCommand; +import pro.cloudnode.smp.nations.locale.Messages; +import pro.cloudnode.smp.nations.util.Nation; import pro.cloudnode.smp.nations.util.NationManager; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; public final class Nations extends JavaPlugin { @@ -23,10 +30,35 @@ public void onEnable() { // register commands Objects.requireNonNull(this.getCommand("nations")).setExecutor(new NationsCommand(this)); Objects.requireNonNull(this.getCommand("nations")).setTabCompleter(new NationsCommand(this)); + + // register chat nickname handler + InteractiveChatAPI.registerNicknameProvider(this, uuid -> { + List nicknames = new ArrayList<>(); // why we need a list? no idea, but the docs say so + +// StringBuilder builder = new StringBuilder(); +// Player player = getServer().getPlayer(uuid); +// assert player != null; +// Nation nation = nationManager.getPlayerNation(uuid); +// +// if (nation != null) { +// builder.append(t(Messages.CHAT_FORMAT, nation, player)); +// nicknames.add(builder.toString()); +// } else { +// nicknames.add("asdsadasda"); +// } + + nicknames.add("asdsadasda"); + + return nicknames; + }); } @Override public void onDisable() { nationManager.save(); } + + public static Component t(Messages message, Object ...args) { + return message.replacePlaceholders(args); + } } diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index 1516dbd..c386934 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -15,6 +15,8 @@ import java.util.Objects; import java.util.stream.Stream; +import static pro.cloudnode.smp.nations.Nations.t; + public class NationsCommand extends BaseCommand { public NationsCommand(@NotNull Nations plugin) { super(plugin); diff --git a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java index f61d382..558ca15 100644 --- a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java +++ b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java @@ -49,7 +49,8 @@ public enum Messages { PLAYER_ALREADY_IN_NATION("player-already-in-nation", "Player is already in a nation."), PLAYER_ALREADY_INVITED("player-already-invited", "Player is already invited to your nation."), INVITED_PLAYER("invited-player", "You have invited to your nation."), - YOU_HAVE_BEEN_INVITED("you-have-been-invited", "You have been invited to . Use /nations join to join."); + YOU_HAVE_BEEN_INVITED("you-have-been-invited", "You have been invited to . Use /nations join to join."), + CHAT_FORMAT("chat-format", " : "); public final String key; diff --git a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java index d36d146..5ed909d 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java @@ -64,10 +64,6 @@ public void sendMessage(Player player, Component message) { player.sendMessage(message); } - public Component t(Messages message, Object ...args) { - return message.replacePlaceholders(args); - } - @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { return null; diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 6a0e56f..8b294e5 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -2,6 +2,8 @@ name: Nations version: '${project.version}' main: pro.cloudnode.smp.nations.Nations api-version: '1.20' +depend: + - InteractiveChat commands: nations: description: Main command for Nations From bf1800a9c1d4ec0c1bc20bbfd38387d5091d8842 Mon Sep 17 00:00:00 2001 From: km127pl Date: Sun, 7 Jan 2024 21:52:53 +0100 Subject: [PATCH 15/49] add our own chat handler --- pom.xml | 10 ------- .../pro/cloudnode/smp/nations/Nations.java | 27 ++++++------------ .../smp/nations/commands/NationsCommand.java | 3 +- .../listeners/ChatMessageListener.java | 28 +++++++++++++++++++ .../smp/nations/locale/Messages.java | 6 ++-- src/main/resources/plugin.yml | 2 -- 6 files changed, 41 insertions(+), 35 deletions(-) create mode 100644 src/main/java/pro/cloudnode/smp/nations/listeners/ChatMessageListener.java diff --git a/pom.xml b/pom.xml index 9559e15..8b2132f 100644 --- a/pom.xml +++ b/pom.xml @@ -58,10 +58,6 @@ sonatype https://oss.sonatype.org/content/groups/public/ - - loohp-repo - https://repo.loohpjames.com/repository - @@ -71,11 +67,5 @@ 1.20.2-R0.1-SNAPSHOT provided - - com.loohp - InteractiveChat - 4.2.9.0 - provided - diff --git a/src/main/java/pro/cloudnode/smp/nations/Nations.java b/src/main/java/pro/cloudnode/smp/nations/Nations.java index 8ec82f6..39bcecd 100644 --- a/src/main/java/pro/cloudnode/smp/nations/Nations.java +++ b/src/main/java/pro/cloudnode/smp/nations/Nations.java @@ -2,9 +2,11 @@ import com.loohp.interactivechat.api.InteractiveChatAPI; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; import pro.cloudnode.smp.nations.commands.NationsCommand; +import pro.cloudnode.smp.nations.listeners.ChatMessageListener; import pro.cloudnode.smp.nations.locale.Messages; import pro.cloudnode.smp.nations.util.Nation; import pro.cloudnode.smp.nations.util.NationManager; @@ -31,26 +33,9 @@ public void onEnable() { Objects.requireNonNull(this.getCommand("nations")).setExecutor(new NationsCommand(this)); Objects.requireNonNull(this.getCommand("nations")).setTabCompleter(new NationsCommand(this)); - // register chat nickname handler - InteractiveChatAPI.registerNicknameProvider(this, uuid -> { - List nicknames = new ArrayList<>(); // why we need a list? no idea, but the docs say so + // register chat listener + getServer().getPluginManager().registerEvents(new ChatMessageListener(), this); -// StringBuilder builder = new StringBuilder(); -// Player player = getServer().getPlayer(uuid); -// assert player != null; -// Nation nation = nationManager.getPlayerNation(uuid); -// -// if (nation != null) { -// builder.append(t(Messages.CHAT_FORMAT, nation, player)); -// nicknames.add(builder.toString()); -// } else { -// nicknames.add("asdsadasda"); -// } - - nicknames.add("asdsadasda"); - - return nicknames; - }); } @Override @@ -59,6 +44,10 @@ public void onDisable() { } public static Component t(Messages message, Object ...args) { + return MiniMessage.miniMessage().deserialize(message.replacePlaceholders(args)); + } + + public static String ts(Messages message, Object ...args) { return message.replacePlaceholders(args); } } diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index c386934..c02fcea 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -347,7 +347,8 @@ public void newNation(CommandSender sender, String label, String[] args) { default -> null; }; case 3 -> switch (args[1]) { - case "color" -> List.of(""); + // add some basic minecraft colors as well as a hex to indicate to the user that they can use hex + case "color" -> Stream.of("#66ff00", "white", "red", "blue", "green", "yellow", "purple", "aqua", "pink", "gray", "dark_gray", "dark_red", "dark_blue", "dark_green", "dark_aqua", "dark_purple").filter(s -> s.startsWith(args[2])).toList(); default -> null; }; default -> null; diff --git a/src/main/java/pro/cloudnode/smp/nations/listeners/ChatMessageListener.java b/src/main/java/pro/cloudnode/smp/nations/listeners/ChatMessageListener.java new file mode 100644 index 0000000..2434d8a --- /dev/null +++ b/src/main/java/pro/cloudnode/smp/nations/listeners/ChatMessageListener.java @@ -0,0 +1,28 @@ +package pro.cloudnode.smp.nations.listeners; + +import io.papermc.paper.event.player.AsyncChatEvent; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import pro.cloudnode.smp.nations.Nations; +import pro.cloudnode.smp.nations.locale.Messages; +import pro.cloudnode.smp.nations.util.Nation; + +import static pro.cloudnode.smp.nations.Nations.t; + +public class ChatMessageListener implements Listener { + + @EventHandler + public void onChatMessage(AsyncChatEvent event) { + Player player = event.getPlayer(); + Nation nation = Nations.getNationManager().getPlayerNation(player.getUniqueId()); + if (nation != null) { +// event.message(t(Messages.CHAT_FORMAT, nation, player, event.message())); + Bukkit.broadcast(t(Messages.CHAT_FORMAT, nation, player, MiniMessage.miniMessage().serialize(event.message()))); + event.setCancelled(true); + } + } +} diff --git a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java index 558ca15..5edc98c 100644 --- a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java +++ b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java @@ -50,7 +50,7 @@ public enum Messages { PLAYER_ALREADY_INVITED("player-already-invited", "Player is already invited to your nation."), INVITED_PLAYER("invited-player", "You have invited to your nation."), YOU_HAVE_BEEN_INVITED("you-have-been-invited", "You have been invited to . Use /nations join to join."), - CHAT_FORMAT("chat-format", " : "); + CHAT_FORMAT("chat-format", "() » $2"); public final String key; @@ -70,7 +70,7 @@ public String getDefaultValue() { } // the objects may be Players or Nation objects - public Component replacePlaceholders(Object ...args) { + public String replacePlaceholders(Object ...args) { String message = this.getDefaultValue(); for (int i = 0; i < args.length; i++) { Object arg = args[i]; @@ -91,6 +91,6 @@ public Component replacePlaceholders(Object ...args) { message = message.replace("$" + i, str); } } - return MiniMessage.miniMessage().deserialize(message); + return message; } } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 8b294e5..6a0e56f 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -2,8 +2,6 @@ name: Nations version: '${project.version}' main: pro.cloudnode.smp.nations.Nations api-version: '1.20' -depend: - - InteractiveChat commands: nations: description: Main command for Nations From 8e490439fb5ce5848e34e9c60ad6f7602f58c4d6 Mon Sep 17 00:00:00 2001 From: km127pl Date: Sun, 7 Jan 2024 22:32:49 +0100 Subject: [PATCH 16/49] optimise imports --- src/main/java/pro/cloudnode/smp/nations/Nations.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/Nations.java b/src/main/java/pro/cloudnode/smp/nations/Nations.java index 39bcecd..d147857 100644 --- a/src/main/java/pro/cloudnode/smp/nations/Nations.java +++ b/src/main/java/pro/cloudnode/smp/nations/Nations.java @@ -1,18 +1,13 @@ package pro.cloudnode.smp.nations; -import com.loohp.interactivechat.api.InteractiveChatAPI; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; -import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; import pro.cloudnode.smp.nations.commands.NationsCommand; import pro.cloudnode.smp.nations.listeners.ChatMessageListener; import pro.cloudnode.smp.nations.locale.Messages; -import pro.cloudnode.smp.nations.util.Nation; import pro.cloudnode.smp.nations.util.NationManager; -import java.util.ArrayList; -import java.util.List; import java.util.Objects; public final class Nations extends JavaPlugin { From f79e1db18feb197bd5ce2f90f69e4bde780b09c7 Mon Sep 17 00:00:00 2001 From: km127pl Date: Tue, 9 Jan 2024 19:24:36 +0100 Subject: [PATCH 17/49] Add Javadocs --- .../pro/cloudnode/smp/nations/Nations.java | 12 ++++++ .../smp/nations/locale/Messages.java | 6 ++- .../smp/nations/util/BaseCommand.java | 37 +++++++++++++++++++ .../cloudnode/smp/nations/util/Nation.java | 24 ++++++++++++ .../smp/nations/util/NationManager.java | 37 ++++++++++++++++++- 5 files changed, 113 insertions(+), 3 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/Nations.java b/src/main/java/pro/cloudnode/smp/nations/Nations.java index d147857..1d2ae74 100644 --- a/src/main/java/pro/cloudnode/smp/nations/Nations.java +++ b/src/main/java/pro/cloudnode/smp/nations/Nations.java @@ -38,10 +38,22 @@ public void onDisable() { nationManager.save(); } + /** + * Translate a message to a component and replace placeholders + * @param message the message to translate + * @param args the arguments to replace placeholders with + * @return the translated component + */ public static Component t(Messages message, Object ...args) { return MiniMessage.miniMessage().deserialize(message.replacePlaceholders(args)); } + /** + * Translate a message to a string and replace placeholders + * @param message the message to translate + * @param args the arguments to replace placeholders with + * @return the translated string + */ public static String ts(Messages message, Object ...args) { return message.replacePlaceholders(args); } diff --git a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java index 5edc98c..1cddbbd 100644 --- a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java +++ b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java @@ -69,7 +69,11 @@ public String getDefaultValue() { return default_value; } - // the objects may be Players or Nation objects + /** + * Translate a message to a component and replace placeholders + * @param args the arguments to replace placeholders with + * @return the translated component + */ public String replacePlaceholders(Object ...args) { String message = this.getDefaultValue(); for (int i = 0; i < args.length; i++) { diff --git a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java index 5ed909d..8e210a9 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java @@ -22,6 +22,10 @@ public BaseCommand(@NotNull Nations plugin) { this.plugin = plugin; } + /** + * Get the plugin instance + * @return The plugin instance + */ public @NotNull Nations getPlugin() { return plugin; } @@ -37,29 +41,62 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command return true; } + /** + * Check if the sender is a player + * @return Whether the sender is a player + */ public boolean isPlayer() { return !(this.sender == null) && this.sender instanceof Player; } + /** + * Get the sender a player + * @return The player + * @implNote You should check with {@link #isPlayer()} before using this method + */ public Player getPlayer() { return (Player) sender; } + /** + * Get the command sender + * @return The command sender + */ + public CommandSender getSender() { return sender; } + /** + * Send a message to the sender + * @param message The message to send + */ public void sendMessage(String message) { this.sender.sendMessage(MiniMessage.miniMessage().deserialize(message)); } + + /** + * Send a message to the sender + * @param message The message to send + */ public void sendMessage(Component message) { this.sender.sendMessage(message); } + /** + * Send a message to a player + * @param player The player to send the message to + * @param message The message to send + */ public void sendMessage(Player player, String message) { player.sendMessage(MiniMessage.miniMessage().deserialize(message)); } + /** + * Send a message to a player + * @param player The player to send the message to + * @param message The message to send + */ public void sendMessage(Player player, Component message) { player.sendMessage(message); } diff --git a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java index 1495cef..e1abe8a 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java @@ -40,6 +40,10 @@ public Nation(String key, FileConfiguration config) { this.load((YamlConfiguration) config); } + /** + * Save the nation to a config + * @param config The config to save to + */ public void save(YamlConfiguration config) { config.set("nations." + uuid + ".name", name); config.set("nations." + uuid + ".leader", leader.toString()); @@ -48,6 +52,10 @@ public void save(YamlConfiguration config) { config.set("nations." + uuid + ".color", color); } + /** + * Load a nation from the config + * @param config The config to load from + */ public void load(YamlConfiguration config) { this.name = Objects.requireNonNull(config.getString("nations." + uuid + ".name")); this.leader = UUID.fromString(Objects.requireNonNull(config.getString("nations." + uuid + ".leader"))); @@ -68,18 +76,34 @@ public void load(YamlConfiguration config) { this.color = Objects.requireNonNull(config.getString("nations." + uuid + ".color")); } + /** + * Add a member to the nation + * @param uuid The UUID of the player to add + */ public void addMember(UUID uuid) { members.add(uuid); } + /** + * Remove a member from the nation + * @param uuid The UUID of the player to remove + */ public void removeMember(UUID uuid) { members.remove(uuid); } + /** + * Add an invited player + * @param uuid The UUID of the player to add + */ public void addInvited(UUID uuid) { invited.add(uuid); } + /** + * Remove an invited player + * @param uuid The UUID of the player to remove + */ public void removeInvited(UUID uuid) { invited.remove(uuid); } diff --git a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java index 289e159..c1d84a2 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java @@ -6,6 +6,7 @@ import java.io.File; import java.util.HashMap; +import java.util.Objects; import java.util.UUID; public class NationManager { @@ -16,18 +17,36 @@ public NationManager(Nations plugin) { this.plugin = plugin; } + /** + * Add a nation + * @param nation The nation to add + */ public void add(Nation nation) { nations.put(nation.uuid, nation); } + /** + * Remove a nation + * @param nation The nation to remove + */ public void remove(Nation nation) { nations.remove(nation.uuid); } + /** + * Get a nation by UUID + * @param uuid The UUID of the nation + * @return The nation, or null if not found + */ public Nation get(UUID uuid) { return nations.get(uuid); } + /** + * Get the nation of a player + * @param uuid The UUID of the player + * @return The nation, or null if not found + */ public Nation getPlayerNation(UUID uuid) { for (Nation nation : nations.values()) { if (nation.leader.equals(uuid)) { @@ -40,6 +59,11 @@ public Nation getPlayerNation(UUID uuid) { return null; } + /** + * Get a nation by name + * @param name The name of the nation + * @return The nation, or null if not found + */ public Nation get(String name) { for (Nation nation : nations.values()) { if (nation.name.equals(name)) { @@ -49,6 +73,11 @@ public Nation get(String name) { return null; } + /** + * Save nations to the config + * @implNote This will overwrite the config + * @implNote This saves into `plugins/Nations/nations.yml` + */ public void save() { // save nations YamlConfiguration config = new YamlConfiguration(); @@ -63,16 +92,20 @@ public void save() { File file = new File(this.plugin.getDataFolder(), "nations.yml"); config.save(file); } catch (Exception e) { - e.printStackTrace(); + this.plugin.getLogger().warning("Failed to save nations.yml"); + this.plugin.getLogger().warning(e.getMessage()); } } + /** + * Load nations from the config + */ public void load() { File file = new File(this.plugin.getDataFolder(), "nations.yml"); if (file.exists()) { FileConfiguration config = YamlConfiguration.loadConfiguration(file); if (config.getConfigurationSection("nations") != null) { - config.getConfigurationSection("nations").getKeys(false).forEach(key -> { + Objects.requireNonNull(config.getConfigurationSection("nations")).getKeys(false).forEach(key -> { add(new Nation(key, config)); }); } From 69483d43c52d2572ea37eda5f7e7d4c749705690 Mon Sep 17 00:00:00 2001 From: km127pl Date: Tue, 9 Jan 2024 19:24:53 +0100 Subject: [PATCH 18/49] reformat code --- .../pro/cloudnode/smp/nations/Nations.java | 42 ++++++++++--------- .../smp/nations/commands/NationsCommand.java | 6 +-- .../listeners/ChatMessageListener.java | 1 - .../smp/nations/locale/Messages.java | 6 +-- .../smp/nations/util/BaseCommand.java | 13 ++++-- .../cloudnode/smp/nations/util/Nation.java | 6 +++ .../smp/nations/util/NationManager.java | 6 +++ 7 files changed, 49 insertions(+), 31 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/Nations.java b/src/main/java/pro/cloudnode/smp/nations/Nations.java index 1d2ae74..a5a1dda 100644 --- a/src/main/java/pro/cloudnode/smp/nations/Nations.java +++ b/src/main/java/pro/cloudnode/smp/nations/Nations.java @@ -18,6 +18,28 @@ public static NationManager getNationManager() { return nationManager; } + /** + * Translate a message to a component and replace placeholders + * + * @param message the message to translate + * @param args the arguments to replace placeholders with + * @return the translated component + */ + public static Component t(Messages message, Object... args) { + return MiniMessage.miniMessage().deserialize(message.replacePlaceholders(args)); + } + + /** + * Translate a message to a string and replace placeholders + * + * @param message the message to translate + * @param args the arguments to replace placeholders with + * @return the translated string + */ + public static String ts(Messages message, Object... args) { + return message.replacePlaceholders(args); + } + @Override public void onEnable() { // load nations @@ -37,24 +59,4 @@ public void onEnable() { public void onDisable() { nationManager.save(); } - - /** - * Translate a message to a component and replace placeholders - * @param message the message to translate - * @param args the arguments to replace placeholders with - * @return the translated component - */ - public static Component t(Messages message, Object ...args) { - return MiniMessage.miniMessage().deserialize(message.replacePlaceholders(args)); - } - - /** - * Translate a message to a string and replace placeholders - * @param message the message to translate - * @param args the arguments to replace placeholders with - * @return the translated string - */ - public static String ts(Messages message, Object ...args) { - return message.replacePlaceholders(args); - } } diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index c02fcea..bb4cc92 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -336,8 +336,7 @@ public void newNation(CommandSender sender, String label, String[] args) { public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { Stream commands = Stream.of("create", "invite", "kick", "list", "quit", "info", "option", "join", "help"); return switch (args.length) { - case 1 -> - commands.filter(s -> s.startsWith(args[0])).toList(); + case 1 -> commands.filter(s -> s.startsWith(args[0])).toList(); case 2 -> switch (args[0]) { case "create" -> List.of(""); case "invite", "kick" -> List.of(""); @@ -348,7 +347,8 @@ public void newNation(CommandSender sender, String label, String[] args) { }; case 3 -> switch (args[1]) { // add some basic minecraft colors as well as a hex to indicate to the user that they can use hex - case "color" -> Stream.of("#66ff00", "white", "red", "blue", "green", "yellow", "purple", "aqua", "pink", "gray", "dark_gray", "dark_red", "dark_blue", "dark_green", "dark_aqua", "dark_purple").filter(s -> s.startsWith(args[2])).toList(); + case "color" -> + Stream.of("#66ff00", "white", "red", "blue", "green", "yellow", "purple", "aqua", "pink", "gray", "dark_gray", "dark_red", "dark_blue", "dark_green", "dark_aqua", "dark_purple").filter(s -> s.startsWith(args[2])).toList(); default -> null; }; default -> null; diff --git a/src/main/java/pro/cloudnode/smp/nations/listeners/ChatMessageListener.java b/src/main/java/pro/cloudnode/smp/nations/listeners/ChatMessageListener.java index 2434d8a..8bbdfc6 100644 --- a/src/main/java/pro/cloudnode/smp/nations/listeners/ChatMessageListener.java +++ b/src/main/java/pro/cloudnode/smp/nations/listeners/ChatMessageListener.java @@ -6,7 +6,6 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; import pro.cloudnode.smp.nations.Nations; import pro.cloudnode.smp.nations.locale.Messages; import pro.cloudnode.smp.nations.util.Nation; diff --git a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java index 1cddbbd..8d63b1d 100644 --- a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java +++ b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java @@ -1,10 +1,7 @@ package pro.cloudnode.smp.nations.locale; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; import org.bukkit.entity.Player; -import pro.cloudnode.smp.nations.Nations; import pro.cloudnode.smp.nations.util.Nation; public enum Messages { @@ -71,10 +68,11 @@ public String getDefaultValue() { /** * Translate a message to a component and replace placeholders + * * @param args the arguments to replace placeholders with * @return the translated component */ - public String replacePlaceholders(Object ...args) { + public String replacePlaceholders(Object... args) { String message = this.getDefaultValue(); for (int i = 0; i < args.length; i++) { Object arg = args[i]; diff --git a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java index 8e210a9..f13d9e0 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java @@ -10,7 +10,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import pro.cloudnode.smp.nations.Nations; -import pro.cloudnode.smp.nations.locale.Messages; import java.util.List; @@ -24,6 +23,7 @@ public BaseCommand(@NotNull Nations plugin) { /** * Get the plugin instance + * * @return The plugin instance */ public @NotNull Nations getPlugin() { @@ -43,6 +43,7 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command /** * Check if the sender is a player + * * @return Whether the sender is a player */ public boolean isPlayer() { @@ -51,6 +52,7 @@ public boolean isPlayer() { /** * Get the sender a player + * * @return The player * @implNote You should check with {@link #isPlayer()} before using this method */ @@ -60,6 +62,7 @@ public Player getPlayer() { /** * Get the command sender + * * @return The command sender */ @@ -69,6 +72,7 @@ public CommandSender getSender() { /** * Send a message to the sender + * * @param message The message to send */ public void sendMessage(String message) { @@ -77,6 +81,7 @@ public void sendMessage(String message) { /** * Send a message to the sender + * * @param message The message to send */ public void sendMessage(Component message) { @@ -85,7 +90,8 @@ public void sendMessage(Component message) { /** * Send a message to a player - * @param player The player to send the message to + * + * @param player The player to send the message to * @param message The message to send */ public void sendMessage(Player player, String message) { @@ -94,7 +100,8 @@ public void sendMessage(Player player, String message) { /** * Send a message to a player - * @param player The player to send the message to + * + * @param player The player to send the message to * @param message The message to send */ public void sendMessage(Player player, Component message) { diff --git a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java index e1abe8a..57d7494 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java @@ -42,6 +42,7 @@ public Nation(String key, FileConfiguration config) { /** * Save the nation to a config + * * @param config The config to save to */ public void save(YamlConfiguration config) { @@ -54,6 +55,7 @@ public void save(YamlConfiguration config) { /** * Load a nation from the config + * * @param config The config to load from */ public void load(YamlConfiguration config) { @@ -78,6 +80,7 @@ public void load(YamlConfiguration config) { /** * Add a member to the nation + * * @param uuid The UUID of the player to add */ public void addMember(UUID uuid) { @@ -86,6 +89,7 @@ public void addMember(UUID uuid) { /** * Remove a member from the nation + * * @param uuid The UUID of the player to remove */ public void removeMember(UUID uuid) { @@ -94,6 +98,7 @@ public void removeMember(UUID uuid) { /** * Add an invited player + * * @param uuid The UUID of the player to add */ public void addInvited(UUID uuid) { @@ -102,6 +107,7 @@ public void addInvited(UUID uuid) { /** * Remove an invited player + * * @param uuid The UUID of the player to remove */ public void removeInvited(UUID uuid) { diff --git a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java index c1d84a2..9115b66 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java @@ -19,6 +19,7 @@ public NationManager(Nations plugin) { /** * Add a nation + * * @param nation The nation to add */ public void add(Nation nation) { @@ -27,6 +28,7 @@ public void add(Nation nation) { /** * Remove a nation + * * @param nation The nation to remove */ public void remove(Nation nation) { @@ -35,6 +37,7 @@ public void remove(Nation nation) { /** * Get a nation by UUID + * * @param uuid The UUID of the nation * @return The nation, or null if not found */ @@ -44,6 +47,7 @@ public Nation get(UUID uuid) { /** * Get the nation of a player + * * @param uuid The UUID of the player * @return The nation, or null if not found */ @@ -61,6 +65,7 @@ public Nation getPlayerNation(UUID uuid) { /** * Get a nation by name + * * @param name The name of the nation * @return The nation, or null if not found */ @@ -75,6 +80,7 @@ public Nation get(String name) { /** * Save nations to the config + * * @implNote This will overwrite the config * @implNote This saves into `plugins/Nations/nations.yml` */ From 2f2d7c1a1b8acfe45a93378c8fa10018f0ee3777 Mon Sep 17 00:00:00 2001 From: km127pl Date: Tue, 9 Jan 2024 22:07:34 +0100 Subject: [PATCH 19/49] add cloudnodeMSG support --- .../smp/nations/commands/NationsCommand.java | 3 ++- .../listeners/ChatMessageListener.java | 20 +++++++++++++++---- .../smp/nations/locale/Messages.java | 3 ++- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index bb4cc92..406cb3b 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -161,7 +161,8 @@ private void option(CommandSender sender, String label, String[] args) { return; } String color = args[2]; - // #hex or color + //@todo verify if color is valid, + //can be either hex or a minecraft color from a list if (color.matches("^(?:#(?:[0-9a-fA-F]{3}){1,2}\\b|\\b\\w+\\b)")) { // check if its hex if (!color.startsWith("#") && color.length() == 6 && color.matches("[0-9a-fA-F]+")) { diff --git a/src/main/java/pro/cloudnode/smp/nations/listeners/ChatMessageListener.java b/src/main/java/pro/cloudnode/smp/nations/listeners/ChatMessageListener.java index 8bbdfc6..0165b93 100644 --- a/src/main/java/pro/cloudnode/smp/nations/listeners/ChatMessageListener.java +++ b/src/main/java/pro/cloudnode/smp/nations/listeners/ChatMessageListener.java @@ -1,6 +1,8 @@ package pro.cloudnode.smp.nations.listeners; import io.papermc.paper.event.player.AsyncChatEvent; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -10,6 +12,8 @@ import pro.cloudnode.smp.nations.locale.Messages; import pro.cloudnode.smp.nations.util.Nation; +import java.util.Set; + import static pro.cloudnode.smp.nations.Nations.t; public class ChatMessageListener implements Listener { @@ -18,10 +22,18 @@ public class ChatMessageListener implements Listener { public void onChatMessage(AsyncChatEvent event) { Player player = event.getPlayer(); Nation nation = Nations.getNationManager().getPlayerNation(player.getUniqueId()); - if (nation != null) { -// event.message(t(Messages.CHAT_FORMAT, nation, player, event.message())); - Bukkit.broadcast(t(Messages.CHAT_FORMAT, nation, player, MiniMessage.miniMessage().serialize(event.message()))); - event.setCancelled(true); + Component message; + + if (nation == null) { + message = t(Messages.CHAT_FORMAT, player, MiniMessage.miniMessage().serialize(event.message())); + } else { + message = t(Messages.CHAT_FORMAT_NATION, nation, player, MiniMessage.miniMessage().serialize(event.message())); + } + event.setCancelled(true); + + + for (Audience recipient : event.viewers()) { + recipient.sendMessage(message); } } } diff --git a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java index 8d63b1d..f4fb007 100644 --- a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java +++ b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java @@ -47,7 +47,8 @@ public enum Messages { PLAYER_ALREADY_INVITED("player-already-invited", "Player is already invited to your nation."), INVITED_PLAYER("invited-player", "You have invited to your nation."), YOU_HAVE_BEEN_INVITED("you-have-been-invited", "You have been invited to . Use /nations join to join."), - CHAT_FORMAT("chat-format", "() » $2"); + CHAT_FORMAT_NATION("chat-format", "() » $2"), + CHAT_FORMAT("chat-format", " » $1"); public final String key; From eaa0f8c27c8815d7075b6addb7e92f6a11290c5e Mon Sep 17 00:00:00 2001 From: km127pl Date: Wed, 10 Jan 2024 22:34:48 +0100 Subject: [PATCH 20/49] allow hex and minecraft-colors only --- .../smp/nations/commands/NationsCommand.java | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index 406cb3b..5f5ae83 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -1,5 +1,6 @@ package pro.cloudnode.smp.nations.commands; +import net.kyori.adventure.text.format.TextColor; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -11,6 +12,7 @@ import pro.cloudnode.smp.nations.util.BaseCommand; import pro.cloudnode.smp.nations.util.Nation; +import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.stream.Stream; @@ -22,6 +24,9 @@ public NationsCommand(@NotNull Nations plugin) { super(plugin); } + private final List COLORS = List.of("white", "red", "blue", "green", "yellow", "light_purple", "aqua", "pink", "gray", "dark_gray", "dark_red", "dark_blue", "dark_green", "dark_aqua", "dark_purple"); + private final List EMPTY = new ArrayList<>(); + public void execute(CommandSender sender, String label, String[] args) { if (!isPlayer()) { sendMessage(t(Messages.ONLY_PLAYERS)); @@ -79,6 +84,10 @@ private void help(CommandSender sender, String label, String[] args) { sendMessage(t(Messages.COMMANDS_ITEM, "option", " ", "set options for your nation")); sendMessage(t(Messages.COMMANDS_ITEM, "join", "", "join a nation")); sendMessage(t(Messages.COMMANDS_ITEM, "help", "", "show this help message")); + if (sender.hasPermission("nations.admin")) { + sendMessage(t(Messages.COMMANDS_ITEM, "force-delete", "", "force delete a nation")); + sendMessage(t(Messages.COMMANDS_ITEM, "reload", "", "reload the plugin")); + } return; } @@ -160,19 +169,14 @@ private void option(CommandSender sender, String label, String[] args) { sendMessage(t(Messages.USAGE, label, "option", "color ")); return; } - String color = args[2]; - //@todo verify if color is valid, - //can be either hex or a minecraft color from a list - if (color.matches("^(?:#(?:[0-9a-fA-F]{3}){1,2}\\b|\\b\\w+\\b)")) { - // check if its hex - if (!color.startsWith("#") && color.length() == 6 && color.matches("[0-9a-fA-F]+")) { - color = "#" + color; - } - nation.color = color; - sendMessage(t(Messages.COLOR_SET, color)); - } else { + String color = args[2].toLowerCase(); + boolean isHex = color.startsWith("#") && color.length() == 7 && color.matches("[0-9a-fA-F]+"); + if (!COLORS.contains(color) && !isHex) { sendMessage(t(Messages.INVALID_COLOR)); + return; } + + nation.color = color; break; default: @@ -336,23 +340,23 @@ public void newNation(CommandSender sender, String label, String[] args) { @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { Stream commands = Stream.of("create", "invite", "kick", "list", "quit", "info", "option", "join", "help"); + if (sender.hasPermission("nations.admin")) commands = Stream.concat(commands, Stream.of("force-delete", "reload")); return switch (args.length) { case 1 -> commands.filter(s -> s.startsWith(args[0])).toList(); case 2 -> switch (args[0]) { case "create" -> List.of(""); - case "invite", "kick" -> List.of(""); + case "invite", "kick" -> null; case "option" -> List.of("color"); case "join" -> List.of(""); case "help" -> commands.filter(s -> s.startsWith(args[1])).toList(); - default -> null; + default -> EMPTY; }; case 3 -> switch (args[1]) { - // add some basic minecraft colors as well as a hex to indicate to the user that they can use hex case "color" -> - Stream.of("#66ff00", "white", "red", "blue", "green", "yellow", "purple", "aqua", "pink", "gray", "dark_gray", "dark_red", "dark_blue", "dark_green", "dark_aqua", "dark_purple").filter(s -> s.startsWith(args[2])).toList(); - default -> null; + COLORS.stream().filter(s -> s.startsWith(args[2])).toList(); + default -> EMPTY; }; - default -> null; + default -> EMPTY; }; } } From fd8e408c4acfad7b7458d333598d2ca88ae33b33 Mon Sep 17 00:00:00 2001 From: km127pl Date: Wed, 10 Jan 2024 22:39:58 +0100 Subject: [PATCH 21/49] show nation-based command only if a player is inside a nation --- .../smp/nations/commands/NationsCommand.java | 7 +++- .../smp/nations/util/NationManager.java | 39 +++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index 5f5ae83..14b082b 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -175,7 +175,7 @@ private void option(CommandSender sender, String label, String[] args) { sendMessage(t(Messages.INVALID_COLOR)); return; } - + nation.color = color; break; @@ -339,8 +339,11 @@ public void newNation(CommandSender sender, String label, String[] args) { @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - Stream commands = Stream.of("create", "invite", "kick", "list", "quit", "info", "option", "join", "help"); + Stream commands = Stream.of("create", "list", "join", "help"); + if (Nations.getNationManager().isInNation((Player) sender)) commands = Stream.concat(commands, Stream.of("quit", "kick", "invite", "info", "option")); if (sender.hasPermission("nations.admin")) commands = Stream.concat(commands, Stream.of("force-delete", "reload")); + // sort alphabetically + commands = commands.sorted(); return switch (args.length) { case 1 -> commands.filter(s -> s.startsWith(args[0])).toList(); case 2 -> switch (args[0]) { diff --git a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java index 9115b66..a09393a 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java @@ -2,6 +2,7 @@ import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; import pro.cloudnode.smp.nations.Nations; import java.io.File; @@ -118,4 +119,42 @@ public void load() { } } + /** + * Check if a player is in a nation + * @param uuid The UUID of the player + * @return Whether the player is in a nation + */ + public boolean isInNation(UUID uuid) { + return getPlayerNation(uuid) != null; + } + + /** + * Check if a player is the leader of a nation + * @param uuid The UUID of the player + * @return Whether the player is the leader of a nation + */ + public boolean isLeader(UUID uuid) { + if (!isInNation(uuid)) return false; + return getPlayerNation(uuid).leader.equals(uuid); + } + + /** + * Check if a player is in a nation + * @param player The player + * @return Whether the player is in a nation + */ + public boolean isInNation(Player player) { + return isInNation(player.getUniqueId()); + } + + /** + * Check if a player is the leader of a nation + * @param player The player + * @return Whether the player is the leader of a nation + */ + public boolean isLeader(Player player) { + if (!isInNation(player)) return false; + return isLeader(player.getUniqueId()); + } + } From c98b09608f3df9451af82bad01719473c1527f3b Mon Sep 17 00:00:00 2001 From: km127pl Date: Wed, 10 Jan 2024 22:43:12 +0100 Subject: [PATCH 22/49] add an exclamation point to errors --- .../smp/nations/commands/NationsCommand.java | 1 + .../smp/nations/locale/Messages.java | 32 +++++++++---------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index 14b082b..204c714 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -177,6 +177,7 @@ private void option(CommandSender sender, String label, String[] args) { } nation.color = color; + sendMessage(t(Messages.COLOR_SET, color)); break; default: diff --git a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java index f4fb007..3fc0def 100644 --- a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java +++ b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java @@ -6,16 +6,16 @@ public enum Messages { USAGE("usage", "Usage: /$0 $1 $2"), - NO_PERMISSION("no-permission", "You do not have permission to use this command."), + NO_PERMISSION("no-permission", "(!) You do not have permission to use this command."), - NATION_NOT_FOUND("nation-not-found", "Nation $0 not found."), + NATION_NOT_FOUND("nation-not-found", "(!) Nation $0 not found."), - NOT_INVITED_TO_NATION("not-invited-to-nation", "You are not invited to "), + NOT_INVITED_TO_NATION("not-invited-to-nation", "(!) You are not invited to "), JOINED_NATION("joined-nation", "You have joined the nation "), - NOT_IN_NATION("not-in-nation", "You are not in a nation."), - NOT_LEADER("not-leader", "You are not the leader of your nation."), + NOT_IN_NATION("not-in-nation", "(!) You are not in a nation."), + NOT_LEADER("not-leader", "(!) You are not the leader of your nation."), COLOR_SET("color-set", "You have set your nation color to <$0>$0"), - INVALID_COLOR("invalid-color", "Invalid color, must be a hex code or a color name."), + INVALID_COLOR("invalid-color", "(!) Invalid color, must be a hex code or a color name."), INFO_HEADER("info-header", "Info for "), INFO_LEADER("info-leader", "Leader: $0"), @@ -26,25 +26,25 @@ public enum Messages { //@todo: add hover information later LIST_ITEM("list-item", " ()"), - NATION_DISBANDED("nation-disbanded", "Your nation () has been disbanded."), + NATION_DISBANDED("nation-disbanded", "(!) Your nation () has been disbanded."), - CANT_QUIT_AS_LEADER("cant-quit-as-leader", "You cannot quit the nation because you are the leader. Use /nations kick to kick all members."), + CANT_QUIT_AS_LEADER("cant-quit-as-leader", "(!) You cannot quit the nation because you are the leader. Use /nations kick to kick all members."), QUIT_NATION("quit-nation", "You have quit the nation "), NO_NATIONS("no-nations", "There are no nations."), - YOU_HAVE_KICKED("you-have-kicked", "You have kicked from your nation."), - YOU_HAVE_BEEN_KICKED("you-have-been-kicked", "You have been kicked from "), - PLAYER_NOT_FOUND("player-not-found", "Player $0 not found."), - PLAYER_NOT_IN_NATION("player-not-in-nation", "Player is not in your nation."), - INVALID_NAME("invalid-name", "Invalid name, only alphanumeric characters are allowed."), + YOU_HAVE_KICKED("you-have-kicked", "(!) You have kicked from your nation."), + YOU_HAVE_BEEN_KICKED("you-have-been-kicked", "(!) You have been kicked from "), + PLAYER_NOT_FOUND("player-not-found", "(!) Player $0 Not found."), + PLAYER_NOT_IN_NATION("player-not-in-nation", "(!) Player is not in your nation."), + INVALID_NAME("invalid-name", "(!) Invalid name, only alphanumeric characters are allowed."), NEW_NATION("new-nation", "You have created the nation "), - ONLY_PLAYERS("only-players", "Only players can use this command."), + ONLY_PLAYERS("only-players", "(!) Only players can use this command."), COMMANDS_HEADER("commands-header", "Commands:"), COMMANDS_ITEM("commands-item", "- /nations $0 $1 ($2)"), - PLAYER_ALREADY_IN_NATION("player-already-in-nation", "Player is already in a nation."), - PLAYER_ALREADY_INVITED("player-already-invited", "Player is already invited to your nation."), + PLAYER_ALREADY_IN_NATION("player-already-in-nation", "(!) Player is already in a nation."), + PLAYER_ALREADY_INVITED("player-already-invited", "(!) Player is already invited to your nation."), INVITED_PLAYER("invited-player", "You have invited to your nation."), YOU_HAVE_BEEN_INVITED("you-have-been-invited", "You have been invited to . Use /nations join to join."), CHAT_FORMAT_NATION("chat-format", "() » $2"), From e188e60c734b08fc7035f1b668a89858674f29fe Mon Sep 17 00:00:00 2001 From: km127pl Date: Wed, 10 Jan 2024 22:46:55 +0100 Subject: [PATCH 23/49] don't show create and join if a player is in a nation --- .../pro/cloudnode/smp/nations/commands/NationsCommand.java | 5 +++-- src/main/java/pro/cloudnode/smp/nations/locale/Messages.java | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index 204c714..9dceed6 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -170,7 +170,7 @@ private void option(CommandSender sender, String label, String[] args) { return; } String color = args[2].toLowerCase(); - boolean isHex = color.startsWith("#") && color.length() == 7 && color.matches("[0-9a-fA-F]+"); + boolean isHex = color.startsWith("#") && color.length() == 7 && color.matches("#[0-9a-fA-F]+"); if (!COLORS.contains(color) && !isHex) { sendMessage(t(Messages.INVALID_COLOR)); return; @@ -340,8 +340,9 @@ public void newNation(CommandSender sender, String label, String[] args) { @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - Stream commands = Stream.of("create", "list", "join", "help"); + Stream commands = Stream.of("list", "help"); if (Nations.getNationManager().isInNation((Player) sender)) commands = Stream.concat(commands, Stream.of("quit", "kick", "invite", "info", "option")); + else commands = Stream.concat(commands, Stream.of("join", "create")); if (sender.hasPermission("nations.admin")) commands = Stream.concat(commands, Stream.of("force-delete", "reload")); // sort alphabetically commands = commands.sorted(); diff --git a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java index 3fc0def..df3156e 100644 --- a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java +++ b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java @@ -15,7 +15,7 @@ public enum Messages { NOT_IN_NATION("not-in-nation", "(!) You are not in a nation."), NOT_LEADER("not-leader", "(!) You are not the leader of your nation."), COLOR_SET("color-set", "You have set your nation color to <$0>$0"), - INVALID_COLOR("invalid-color", "(!) Invalid color, must be a hex code or a color name."), + INVALID_COLOR("invalid-color", "(!) Invalid color, must be a hex code (#RRGGBB) or a color name."), INFO_HEADER("info-header", "Info for "), INFO_LEADER("info-leader", "Leader: $0"), From c39aaf54bc0e68c98778c25594c51b8e324dafda Mon Sep 17 00:00:00 2001 From: km127pl Date: Wed, 10 Jan 2024 23:02:57 +0100 Subject: [PATCH 24/49] add force delete, and message reloading --- .../pro/cloudnode/smp/nations/Nations.java | 5 ++ .../smp/nations/commands/NationsCommand.java | 53 ++++++++++++++ .../smp/nations/locale/Messages.java | 71 ++++++++++++++++++- 3 files changed, 127 insertions(+), 2 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/Nations.java b/src/main/java/pro/cloudnode/smp/nations/Nations.java index a5a1dda..1084a62 100644 --- a/src/main/java/pro/cloudnode/smp/nations/Nations.java +++ b/src/main/java/pro/cloudnode/smp/nations/Nations.java @@ -42,6 +42,11 @@ public static String ts(Messages message, Object... args) { @Override public void onEnable() { + // save messages.yml if it doesn't exist + Messages.save(); + Messages.addMissingDefaults(); + Messages.load(); + // load nations nationManager = new NationManager(this); nationManager.load(); diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index 9dceed6..fd82573 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -17,6 +17,7 @@ import java.util.Objects; import java.util.stream.Stream; +import static pro.cloudnode.smp.nations.Nations.nationManager; import static pro.cloudnode.smp.nations.Nations.t; public class NationsCommand extends BaseCommand { @@ -63,6 +64,12 @@ public void execute(CommandSender sender, String label, String[] args) { case "join": join(sender, label, args); break; + case "reload": + reload(sender, label, args); + break; + case "force-delete": + forceDelete(sender, label, args); + break; case "help": default: help(sender, label, args); @@ -128,6 +135,11 @@ private void join(CommandSender sender, String label, String[] args) { return; } + if (nationManager.isInNation((Player) sender)) { + sendMessage(t(Messages.ALREADY_IN_NATION)); + return; + } + Nation nation = Nations.getNationManager().get(args[1]); if (nation == null) { sendMessage(t(Messages.NATION_NOT_FOUND, args[1])); @@ -242,6 +254,42 @@ private void list(CommandSender sender, String label, String[] args) { } } + private void forceDelete(CommandSender sender, String label, String[] args) { + if (!sender.hasPermission("nations.admin") && !sender.isOp() && !sender.hasPermission("nations.forceDelete")) { + sendMessage(t(Messages.NO_PERMISSION)); + return; + } + + if (args.length <= 1) { + sendMessage(t(Messages.USAGE, label, "force-delete", "")); + return; + } + + Nation nation = Nations.getNationManager().get(args[1]); + if (nation == null) { + sendMessage(t(Messages.NATION_NOT_FOUND, args[1])); + return; + } + + Nations.getNationManager().remove(nation); + sendMessage(t(Messages.NATION_DELETED, nation)); + } + + private void reload(CommandSender sender, String label, String[] args) { + if (!sender.hasPermission("nations.admin") && !sender.isOp() && !sender.hasPermission("nations.reload")) { + sendMessage(t(Messages.NO_PERMISSION)); + return; + } + if (args.length > 1) { + sendMessage(t(Messages.USAGE, label, "reload", "")); + return; + } + + Nations.getPlugin(Nations.class).reloadConfig(); + Messages.load(); + sendMessage(t(Messages.RELOADED)); + } + private void kick(CommandSender sender, String label, String[] args) { if (args.length <= 1) { sendMessage(t(Messages.USAGE, label, "kick", "")); @@ -320,6 +368,11 @@ public void newNation(CommandSender sender, String label, String[] args) { return; } + if (nationManager.isInNation((Player) sender)) { + sendMessage(t(Messages.ALREADY_IN_NATION)); + return; + } + String name = args[1]; // check if name is valid (ascii) diff --git a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java index df3156e..2e4e559 100644 --- a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java +++ b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java @@ -1,9 +1,13 @@ package pro.cloudnode.smp.nations.locale; import org.bukkit.Bukkit; +import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; +import pro.cloudnode.smp.nations.Nations; import pro.cloudnode.smp.nations.util.Nation; +import java.io.File; + public enum Messages { USAGE("usage", "Usage: /$0 $1 $2"), NO_PERMISSION("no-permission", "(!) You do not have permission to use this command."), @@ -48,11 +52,14 @@ public enum Messages { INVITED_PLAYER("invited-player", "You have invited to your nation."), YOU_HAVE_BEEN_INVITED("you-have-been-invited", "You have been invited to . Use /nations join to join."), CHAT_FORMAT_NATION("chat-format", "() » $2"), - CHAT_FORMAT("chat-format", " » $1"); + CHAT_FORMAT("chat-format", " » $1"), + NATION_DELETED("nation-deleted", "You have deleted the nation "), + RELOADED("reloaded", "Nations has been reloaded."), + ALREADY_IN_NATION("already-in-nation", "(!) You are already in a nation."); public final String key; - public final String default_value; + public String default_value; Messages(String key, String default_value) { this.key = key; @@ -96,4 +103,64 @@ public String replacePlaceholders(Object... args) { } return message; } + + /** + * Save messages to the config + * + * @implNote This will *not* overwrite the config + * @implNote This saves into `plugins/Nations/messages.yml` + */ + public static void save() { + // check if messages.yml exists + File messagesFile = new File("plugins/Nations/messages.yml"); + if (messagesFile.exists()) return; + + YamlConfiguration config = new YamlConfiguration(); + + for (Messages message : Messages.values()) { + config.set("messages." + message.getKey(), message.getDefaultValue()); + } + + try { + config.save(new File("plugins/Nations/messages.yml")); + Nations.getPlugin(Nations.class).getLogger().info("Saved default messages.yml"); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * Load messages from the config + * + * @implNote This loads from `plugins/Nations/messages.yml` + */ + public static void load() { + YamlConfiguration config = YamlConfiguration.loadConfiguration(new File("plugins/Nations/messages.yml")); + + for (Messages message : Messages.values()) { + message.default_value = config.getString("messages." + message.getKey()); + } + } + + /** + * Adds the default messages to the config if they don't exist + * + * @implNote This saves into `plugins/Nations/messages.yml` + */ + public static void addMissingDefaults() { + YamlConfiguration config = YamlConfiguration.loadConfiguration(new File("plugins/Nations/messages.yml")); + + for (Messages message : Messages.values()) { + if (!config.contains("messages." + message.getKey())) { + config.set("messages." + message.getKey(), message.getDefaultValue()); + } + } + + try { + config.save(new File("plugins/Nations/messages.yml")); + Nations.getPlugin(Nations.class).getLogger().info("Added missing messages to messages.yml"); + } catch (Exception e) { + e.printStackTrace(); + } + } } From c9936641781472d4fd90ffa2b691f4c137f2b90d Mon Sep 17 00:00:00 2001 From: km127pl Date: Wed, 10 Jan 2024 23:06:55 +0100 Subject: [PATCH 25/49] autocomplete /n join & force-delete --- .../cloudnode/smp/nations/commands/NationsCommand.java | 6 ++++-- .../pro/cloudnode/smp/nations/util/NationManager.java | 9 +++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index fd82573..9e6ba41 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -393,8 +393,9 @@ public void newNation(CommandSender sender, String label, String[] args) { @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + Player player = (Player) sender; Stream commands = Stream.of("list", "help"); - if (Nations.getNationManager().isInNation((Player) sender)) commands = Stream.concat(commands, Stream.of("quit", "kick", "invite", "info", "option")); + if (Nations.getNationManager().isInNation(player)) commands = Stream.concat(commands, Stream.of("quit", "kick", "invite", "info", "option")); else commands = Stream.concat(commands, Stream.of("join", "create")); if (sender.hasPermission("nations.admin")) commands = Stream.concat(commands, Stream.of("force-delete", "reload")); // sort alphabetically @@ -405,7 +406,8 @@ public void newNation(CommandSender sender, String label, String[] args) { case "create" -> List.of(""); case "invite", "kick" -> null; case "option" -> List.of("color"); - case "join" -> List.of(""); + case "join" -> Nations.getNationManager().getNationsInviting(player.getUniqueId()); + case "force-delete" -> Nations.getNationManager().getNations(); case "help" -> commands.filter(s -> s.startsWith(args[1])).toList(); default -> EMPTY; }; diff --git a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java index a09393a..219b526 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java @@ -7,6 +7,7 @@ import java.io.File; import java.util.HashMap; +import java.util.List; import java.util.Objects; import java.util.UUID; @@ -104,6 +105,14 @@ public void save() { } } + public List getNations() { + return nations.values().stream().map(nation -> nation.name).toList(); + } + + public List getNationsInviting(UUID uuid) { + return nations.values().stream().filter(nation -> nation.invited.contains(uuid)).map(nation -> nation.name).toList(); + } + /** * Load nations from the config */ From 17c2a4fd5984fdb7535c60b54604896685de359a Mon Sep 17 00:00:00 2001 From: km127pl Date: Wed, 10 Jan 2024 23:13:40 +0100 Subject: [PATCH 26/49] duplicate keys, bruh --- .../java/pro/cloudnode/smp/nations/locale/Messages.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java index 2e4e559..ce9f84c 100644 --- a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java +++ b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java @@ -51,11 +51,13 @@ public enum Messages { PLAYER_ALREADY_INVITED("player-already-invited", "(!) Player is already invited to your nation."), INVITED_PLAYER("invited-player", "You have invited to your nation."), YOU_HAVE_BEEN_INVITED("you-have-been-invited", "You have been invited to . Use /nations join to join."), - CHAT_FORMAT_NATION("chat-format", "() » $2"), + CHAT_FORMAT_NATION("chat-format-nation", "() » $2"), CHAT_FORMAT("chat-format", " » $1"), NATION_DELETED("nation-deleted", "You have deleted the nation "), RELOADED("reloaded", "Nations has been reloaded."), - ALREADY_IN_NATION("already-in-nation", "(!) You are already in a nation."); + ALREADY_IN_NATION("already-in-nation", "(!) You are already in a nation."), + NATION_DISPLAYNAME("nation-displayname", ""), + PLAYER_DISPLAYNAME("player-displayname", ""); public final String key; From 5b2c4a582a32258c2afd97c7c8edc89731ad0795 Mon Sep 17 00:00:00 2001 From: km127pl Date: Wed, 10 Jan 2024 23:19:34 +0100 Subject: [PATCH 27/49] add nations in tablist --- .../pro/cloudnode/smp/nations/Nations.java | 2 ++ .../listeners/ChatMessageListener.java | 3 ++- .../nations/listeners/PlayerJoinListener.java | 16 ++++++++++++ .../smp/nations/locale/Messages.java | 2 +- .../cloudnode/smp/nations/util/Nation.java | 4 +++ .../smp/nations/util/NationManager.java | 26 +++++++++++++++---- 6 files changed, 46 insertions(+), 7 deletions(-) create mode 100644 src/main/java/pro/cloudnode/smp/nations/listeners/PlayerJoinListener.java diff --git a/src/main/java/pro/cloudnode/smp/nations/Nations.java b/src/main/java/pro/cloudnode/smp/nations/Nations.java index 1084a62..3f0a5d0 100644 --- a/src/main/java/pro/cloudnode/smp/nations/Nations.java +++ b/src/main/java/pro/cloudnode/smp/nations/Nations.java @@ -5,6 +5,7 @@ import org.bukkit.plugin.java.JavaPlugin; import pro.cloudnode.smp.nations.commands.NationsCommand; import pro.cloudnode.smp.nations.listeners.ChatMessageListener; +import pro.cloudnode.smp.nations.listeners.PlayerJoinListener; import pro.cloudnode.smp.nations.locale.Messages; import pro.cloudnode.smp.nations.util.NationManager; @@ -57,6 +58,7 @@ public void onEnable() { // register chat listener getServer().getPluginManager().registerEvents(new ChatMessageListener(), this); + getServer().getPluginManager().registerEvents(new PlayerJoinListener(), this); } diff --git a/src/main/java/pro/cloudnode/smp/nations/listeners/ChatMessageListener.java b/src/main/java/pro/cloudnode/smp/nations/listeners/ChatMessageListener.java index 0165b93..1004c18 100644 --- a/src/main/java/pro/cloudnode/smp/nations/listeners/ChatMessageListener.java +++ b/src/main/java/pro/cloudnode/smp/nations/listeners/ChatMessageListener.java @@ -11,6 +11,7 @@ import pro.cloudnode.smp.nations.Nations; import pro.cloudnode.smp.nations.locale.Messages; import pro.cloudnode.smp.nations.util.Nation; +import pro.cloudnode.smp.nations.util.NationManager; import java.util.Set; @@ -21,7 +22,7 @@ public class ChatMessageListener implements Listener { @EventHandler public void onChatMessage(AsyncChatEvent event) { Player player = event.getPlayer(); - Nation nation = Nations.getNationManager().getPlayerNation(player.getUniqueId()); + Nation nation = NationManager.getPlayerNation(player.getUniqueId()); Component message; if (nation == null) { diff --git a/src/main/java/pro/cloudnode/smp/nations/listeners/PlayerJoinListener.java b/src/main/java/pro/cloudnode/smp/nations/listeners/PlayerJoinListener.java new file mode 100644 index 0000000..259e75d --- /dev/null +++ b/src/main/java/pro/cloudnode/smp/nations/listeners/PlayerJoinListener.java @@ -0,0 +1,16 @@ +package pro.cloudnode.smp.nations.listeners; + + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import pro.cloudnode.smp.nations.util.NationManager; + +public class PlayerJoinListener implements Listener { + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + NationManager.updatePlayersDisplayname(player.getUniqueId()); + } +} diff --git a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java index ce9f84c..9a7bd16 100644 --- a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java +++ b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java @@ -56,7 +56,7 @@ public enum Messages { NATION_DELETED("nation-deleted", "You have deleted the nation "), RELOADED("reloaded", "Nations has been reloaded."), ALREADY_IN_NATION("already-in-nation", "(!) You are already in a nation."), - NATION_DISPLAYNAME("nation-displayname", ""), + NATION_DISPLAYNAME("nation-displayname", "() "), PLAYER_DISPLAYNAME("player-displayname", ""); public final String key; diff --git a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java index 57d7494..b617fc7 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java @@ -3,6 +3,7 @@ import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.jetbrains.annotations.NotNull; +import pro.cloudnode.smp.nations.Nations; import java.util.ArrayList; import java.util.Arrays; @@ -85,6 +86,7 @@ public void load(YamlConfiguration config) { */ public void addMember(UUID uuid) { members.add(uuid); + NationManager.updatePlayersDisplayname(uuid); } /** @@ -94,12 +96,14 @@ public void addMember(UUID uuid) { */ public void removeMember(UUID uuid) { members.remove(uuid); + NationManager.updatePlayersDisplayname(uuid); } /** * Add an invited player * * @param uuid The UUID of the player to add + * @implNote This adds a player to a 'invited list', and does not add them to a nation */ public void addInvited(UUID uuid) { invited.add(uuid); diff --git a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java index 219b526..5fdee22 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java @@ -4,6 +4,7 @@ import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import pro.cloudnode.smp.nations.Nations; +import pro.cloudnode.smp.nations.locale.Messages; import java.io.File; import java.util.HashMap; @@ -13,7 +14,7 @@ public class NationManager { private final Nations plugin; - public HashMap nations = new HashMap<>(); + public static HashMap nations = new HashMap<>(); public NationManager(Nations plugin) { this.plugin = plugin; @@ -26,6 +27,7 @@ public NationManager(Nations plugin) { */ public void add(Nation nation) { nations.put(nation.uuid, nation); + updatePlayersDisplayname(nation.leader); } /** @@ -34,7 +36,9 @@ public void add(Nation nation) { * @param nation The nation to remove */ public void remove(Nation nation) { + UUID leader = nation.leader; nations.remove(nation.uuid); + updatePlayersDisplayname(leader); } /** @@ -53,7 +57,7 @@ public Nation get(UUID uuid) { * @param uuid The UUID of the player * @return The nation, or null if not found */ - public Nation getPlayerNation(UUID uuid) { + public static Nation getPlayerNation(UUID uuid) { for (Nation nation : nations.values()) { if (nation.leader.equals(uuid)) { return nation; @@ -133,7 +137,7 @@ public void load() { * @param uuid The UUID of the player * @return Whether the player is in a nation */ - public boolean isInNation(UUID uuid) { + public static boolean isInNation(UUID uuid) { return getPlayerNation(uuid) != null; } @@ -144,7 +148,7 @@ public boolean isInNation(UUID uuid) { */ public boolean isLeader(UUID uuid) { if (!isInNation(uuid)) return false; - return getPlayerNation(uuid).leader.equals(uuid); + return Objects.requireNonNull(getPlayerNation(uuid)).leader.equals(uuid); } /** @@ -152,7 +156,7 @@ public boolean isLeader(UUID uuid) { * @param player The player * @return Whether the player is in a nation */ - public boolean isInNation(Player player) { + public static boolean isInNation(Player player) { return isInNation(player.getUniqueId()); } @@ -166,4 +170,16 @@ public boolean isLeader(Player player) { return isLeader(player.getUniqueId()); } + public static void updatePlayersDisplayname(UUID uuid) { + Player player = Nations.getPlugin(Nations.class).getServer().getPlayer(uuid); + if (player == null) return; + if (isInNation(player)) { + Nation nation = getPlayerNation(player.getUniqueId()); + player.displayName(Nations.t(Messages.NATION_DISPLAYNAME, nation, player)); + } else { + player.displayName(Nations.t(Messages.PLAYER_DISPLAYNAME, player)); + } + player.playerListName(player.displayName()); + } + } From 0e9c7091639a3670a820e22b0392ffec57c52e62 Mon Sep 17 00:00:00 2001 From: km127pl Date: Wed, 10 Jan 2024 23:20:09 +0100 Subject: [PATCH 28/49] make nations 16 chars max --- .../java/pro/cloudnode/smp/nations/commands/NationsCommand.java | 2 +- src/main/java/pro/cloudnode/smp/nations/locale/Messages.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index 9e6ba41..b864156 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -376,7 +376,7 @@ public void newNation(CommandSender sender, String label, String[] args) { String name = args[1]; // check if name is valid (ascii) - if (!name.matches("^[a-zA-Z0-9]*$")) { + if (!name.matches("^[a-zA-Z0-9]*$") || name.length() > 16) { sendMessage(t(Messages.INVALID_NAME)); return; } diff --git a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java index 9a7bd16..467d778 100644 --- a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java +++ b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java @@ -41,7 +41,7 @@ public enum Messages { YOU_HAVE_BEEN_KICKED("you-have-been-kicked", "(!) You have been kicked from "), PLAYER_NOT_FOUND("player-not-found", "(!) Player $0 Not found."), PLAYER_NOT_IN_NATION("player-not-in-nation", "(!) Player is not in your nation."), - INVALID_NAME("invalid-name", "(!) Invalid name, only alphanumeric characters are allowed."), + INVALID_NAME("invalid-name", "(!) Invalid name, only alphanumeric characters are allowed and may not be longer than 16 characters."), NEW_NATION("new-nation", "You have created the nation "), ONLY_PLAYERS("only-players", "(!) Only players can use this command."), From c99a62a0cd15cabb885637c4fb510fd545d2905d Mon Sep 17 00:00:00 2001 From: km127pl Date: Wed, 10 Jan 2024 23:27:49 +0100 Subject: [PATCH 29/49] add missing keys before loading --- .../smp/nations/commands/NationsCommand.java | 2 +- .../pro/cloudnode/smp/nations/locale/Messages.java | 2 ++ .../java/pro/cloudnode/smp/nations/util/Nation.java | 13 +++++++++++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index b864156..fec9572 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -190,13 +190,13 @@ private void option(CommandSender sender, String label, String[] args) { nation.color = color; sendMessage(t(Messages.COLOR_SET, color)); + nation.update(); break; default: sendMessage(t(Messages.USAGE, label, "option", " ")); break; } - } private void info(CommandSender sender, String label, String[] args) { diff --git a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java index 467d778..b7690c9 100644 --- a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java +++ b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java @@ -137,6 +137,8 @@ public static void save() { * @implNote This loads from `plugins/Nations/messages.yml` */ public static void load() { + // add missing first + addMissingDefaults(); YamlConfiguration config = YamlConfiguration.loadConfiguration(new File("plugins/Nations/messages.yml")); for (Messages message : Messages.values()) { diff --git a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java index b617fc7..3c5014b 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java @@ -86,7 +86,7 @@ public void load(YamlConfiguration config) { */ public void addMember(UUID uuid) { members.add(uuid); - NationManager.updatePlayersDisplayname(uuid); + update(); } /** @@ -96,7 +96,7 @@ public void addMember(UUID uuid) { */ public void removeMember(UUID uuid) { members.remove(uuid); - NationManager.updatePlayersDisplayname(uuid); + update(); } /** @@ -119,4 +119,13 @@ public void removeInvited(UUID uuid) { } + public void update() { + // update leader + NationManager.updatePlayersDisplayname(leader); + + // update members + for (UUID member : members) { + NationManager.updatePlayersDisplayname(member); + } + } } From 8c11ca04b3994b66e342a374b72f23dfb0063e13 Mon Sep 17 00:00:00 2001 From: km127pl Date: Wed, 10 Jan 2024 23:29:55 +0100 Subject: [PATCH 30/49] chore: reformat code --- .../smp/nations/commands/NationsCommand.java | 21 ++-- .../listeners/ChatMessageListener.java | 4 - .../smp/nations/locale/Messages.java | 76 ++++++------- .../cloudnode/smp/nations/util/Nation.java | 1 - .../smp/nations/util/NationManager.java | 102 +++++++++--------- 5 files changed, 101 insertions(+), 103 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index fec9572..73233b2 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -1,6 +1,5 @@ package pro.cloudnode.smp.nations.commands; -import net.kyori.adventure.text.format.TextColor; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -21,13 +20,12 @@ import static pro.cloudnode.smp.nations.Nations.t; public class NationsCommand extends BaseCommand { + private final List COLORS = List.of("white", "red", "blue", "green", "yellow", "light_purple", "aqua", "pink", "gray", "dark_gray", "dark_red", "dark_blue", "dark_green", "dark_aqua", "dark_purple"); + private final List EMPTY = new ArrayList<>(); public NationsCommand(@NotNull Nations plugin) { super(plugin); } - private final List COLORS = List.of("white", "red", "blue", "green", "yellow", "light_purple", "aqua", "pink", "gray", "dark_gray", "dark_red", "dark_blue", "dark_green", "dark_aqua", "dark_purple"); - private final List EMPTY = new ArrayList<>(); - public void execute(CommandSender sender, String label, String[] args) { if (!isPlayer()) { sendMessage(t(Messages.ONLY_PLAYERS)); @@ -67,9 +65,9 @@ public void execute(CommandSender sender, String label, String[] args) { case "reload": reload(sender, label, args); break; - case "force-delete": - forceDelete(sender, label, args); - break; + case "force-delete": + forceDelete(sender, label, args); + break; case "help": default: help(sender, label, args); @@ -395,9 +393,11 @@ public void newNation(CommandSender sender, String label, String[] args) { public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { Player player = (Player) sender; Stream commands = Stream.of("list", "help"); - if (Nations.getNationManager().isInNation(player)) commands = Stream.concat(commands, Stream.of("quit", "kick", "invite", "info", "option")); + if (Nations.getNationManager().isInNation(player)) + commands = Stream.concat(commands, Stream.of("quit", "kick", "invite", "info", "option")); else commands = Stream.concat(commands, Stream.of("join", "create")); - if (sender.hasPermission("nations.admin")) commands = Stream.concat(commands, Stream.of("force-delete", "reload")); + if (sender.hasPermission("nations.admin")) + commands = Stream.concat(commands, Stream.of("force-delete", "reload")); // sort alphabetically commands = commands.sorted(); return switch (args.length) { @@ -412,8 +412,7 @@ public void newNation(CommandSender sender, String label, String[] args) { default -> EMPTY; }; case 3 -> switch (args[1]) { - case "color" -> - COLORS.stream().filter(s -> s.startsWith(args[2])).toList(); + case "color" -> COLORS.stream().filter(s -> s.startsWith(args[2])).toList(); default -> EMPTY; }; default -> EMPTY; diff --git a/src/main/java/pro/cloudnode/smp/nations/listeners/ChatMessageListener.java b/src/main/java/pro/cloudnode/smp/nations/listeners/ChatMessageListener.java index 1004c18..8065de3 100644 --- a/src/main/java/pro/cloudnode/smp/nations/listeners/ChatMessageListener.java +++ b/src/main/java/pro/cloudnode/smp/nations/listeners/ChatMessageListener.java @@ -4,17 +4,13 @@ import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; -import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -import pro.cloudnode.smp.nations.Nations; import pro.cloudnode.smp.nations.locale.Messages; import pro.cloudnode.smp.nations.util.Nation; import pro.cloudnode.smp.nations.util.NationManager; -import java.util.Set; - import static pro.cloudnode.smp.nations.Nations.t; public class ChatMessageListener implements Listener { diff --git a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java index b7690c9..dd0c9f5 100644 --- a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java +++ b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java @@ -68,44 +68,6 @@ public enum Messages { this.default_value = default_value; } - public String getKey() { - return key; - } - - public String getDefaultValue() { - return default_value; - } - - /** - * Translate a message to a component and replace placeholders - * - * @param args the arguments to replace placeholders with - * @return the translated component - */ - public String replacePlaceholders(Object... args) { - String message = this.getDefaultValue(); - for (int i = 0; i < args.length; i++) { - Object arg = args[i]; - if (arg instanceof Player player) { - message = message.replace("", player.getName()) - .replace("", player.getUniqueId().toString()) - .replace("", player.displayName().toString()) - .replace("", player.getName()); - } else if (arg instanceof Nation nation) { - String leaderName = Bukkit.getOfflinePlayer(nation.leader).getName(); - leaderName = leaderName == null ? "Unknown" : leaderName; - message = message.replace("", nation.name) - .replace("", nation.leader.toString()) - .replace("", "<" + nation.color + ">") - .replace("", nation.uuid.toString()) - .replace("", leaderName); - } else if (arg instanceof String str) { - message = message.replace("$" + i, str); - } - } - return message; - } - /** * Save messages to the config * @@ -167,4 +129,42 @@ public static void addMissingDefaults() { e.printStackTrace(); } } + + public String getKey() { + return key; + } + + public String getDefaultValue() { + return default_value; + } + + /** + * Translate a message to a component and replace placeholders + * + * @param args the arguments to replace placeholders with + * @return the translated component + */ + public String replacePlaceholders(Object... args) { + String message = this.getDefaultValue(); + for (int i = 0; i < args.length; i++) { + Object arg = args[i]; + if (arg instanceof Player player) { + message = message.replace("", player.getName()) + .replace("", player.getUniqueId().toString()) + .replace("", player.displayName().toString()) + .replace("", player.getName()); + } else if (arg instanceof Nation nation) { + String leaderName = Bukkit.getOfflinePlayer(nation.leader).getName(); + leaderName = leaderName == null ? "Unknown" : leaderName; + message = message.replace("", nation.name) + .replace("", nation.leader.toString()) + .replace("", "<" + nation.color + ">") + .replace("", nation.uuid.toString()) + .replace("", leaderName); + } else if (arg instanceof String str) { + message = message.replace("$" + i, str); + } + } + return message; + } } diff --git a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java index 3c5014b..7fa1246 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java @@ -3,7 +3,6 @@ import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.jetbrains.annotations.NotNull; -import pro.cloudnode.smp.nations.Nations; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java index 5fdee22..809d57f 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java @@ -13,13 +13,63 @@ import java.util.UUID; public class NationManager { - private final Nations plugin; public static HashMap nations = new HashMap<>(); + private final Nations plugin; public NationManager(Nations plugin) { this.plugin = plugin; } + /** + * Get the nation of a player + * + * @param uuid The UUID of the player + * @return The nation, or null if not found + */ + public static Nation getPlayerNation(UUID uuid) { + for (Nation nation : nations.values()) { + if (nation.leader.equals(uuid)) { + return nation; + } + if (nation.members.contains(uuid)) { + return nation; + } + } + return null; + } + + /** + * Check if a player is in a nation + * + * @param uuid The UUID of the player + * @return Whether the player is in a nation + */ + public static boolean isInNation(UUID uuid) { + return getPlayerNation(uuid) != null; + } + + /** + * Check if a player is in a nation + * + * @param player The player + * @return Whether the player is in a nation + */ + public static boolean isInNation(Player player) { + return isInNation(player.getUniqueId()); + } + + public static void updatePlayersDisplayname(UUID uuid) { + Player player = Nations.getPlugin(Nations.class).getServer().getPlayer(uuid); + if (player == null) return; + if (isInNation(player)) { + Nation nation = getPlayerNation(player.getUniqueId()); + player.displayName(Nations.t(Messages.NATION_DISPLAYNAME, nation, player)); + } else { + player.displayName(Nations.t(Messages.PLAYER_DISPLAYNAME, player)); + } + player.playerListName(player.displayName()); + } + /** * Add a nation * @@ -51,24 +101,6 @@ public Nation get(UUID uuid) { return nations.get(uuid); } - /** - * Get the nation of a player - * - * @param uuid The UUID of the player - * @return The nation, or null if not found - */ - public static Nation getPlayerNation(UUID uuid) { - for (Nation nation : nations.values()) { - if (nation.leader.equals(uuid)) { - return nation; - } - if (nation.members.contains(uuid)) { - return nation; - } - } - return null; - } - /** * Get a nation by name * @@ -132,17 +164,9 @@ public void load() { } } - /** - * Check if a player is in a nation - * @param uuid The UUID of the player - * @return Whether the player is in a nation - */ - public static boolean isInNation(UUID uuid) { - return getPlayerNation(uuid) != null; - } - /** * Check if a player is the leader of a nation + * * @param uuid The UUID of the player * @return Whether the player is the leader of a nation */ @@ -151,17 +175,9 @@ public boolean isLeader(UUID uuid) { return Objects.requireNonNull(getPlayerNation(uuid)).leader.equals(uuid); } - /** - * Check if a player is in a nation - * @param player The player - * @return Whether the player is in a nation - */ - public static boolean isInNation(Player player) { - return isInNation(player.getUniqueId()); - } - /** * Check if a player is the leader of a nation + * * @param player The player * @return Whether the player is the leader of a nation */ @@ -170,16 +186,4 @@ public boolean isLeader(Player player) { return isLeader(player.getUniqueId()); } - public static void updatePlayersDisplayname(UUID uuid) { - Player player = Nations.getPlugin(Nations.class).getServer().getPlayer(uuid); - if (player == null) return; - if (isInNation(player)) { - Nation nation = getPlayerNation(player.getUniqueId()); - player.displayName(Nations.t(Messages.NATION_DISPLAYNAME, nation, player)); - } else { - player.displayName(Nations.t(Messages.PLAYER_DISPLAYNAME, player)); - } - player.playerListName(player.displayName()); - } - } From ec88dfb6f385b2c0d893f2cc8df5539b998ed64e Mon Sep 17 00:00:00 2001 From: km127pl Date: Wed, 10 Jan 2024 23:35:25 +0100 Subject: [PATCH 31/49] add join/quit messages --- .../pro/cloudnode/smp/nations/Nations.java | 4 +- .../listeners/PlayerConnectionListener.java | 38 +++++++++++++++++++ .../nations/listeners/PlayerJoinListener.java | 16 -------- .../smp/nations/locale/Messages.java | 4 +- 4 files changed, 43 insertions(+), 19 deletions(-) create mode 100644 src/main/java/pro/cloudnode/smp/nations/listeners/PlayerConnectionListener.java delete mode 100644 src/main/java/pro/cloudnode/smp/nations/listeners/PlayerJoinListener.java diff --git a/src/main/java/pro/cloudnode/smp/nations/Nations.java b/src/main/java/pro/cloudnode/smp/nations/Nations.java index 3f0a5d0..47fa5d2 100644 --- a/src/main/java/pro/cloudnode/smp/nations/Nations.java +++ b/src/main/java/pro/cloudnode/smp/nations/Nations.java @@ -5,7 +5,7 @@ import org.bukkit.plugin.java.JavaPlugin; import pro.cloudnode.smp.nations.commands.NationsCommand; import pro.cloudnode.smp.nations.listeners.ChatMessageListener; -import pro.cloudnode.smp.nations.listeners.PlayerJoinListener; +import pro.cloudnode.smp.nations.listeners.PlayerConnectionListener; import pro.cloudnode.smp.nations.locale.Messages; import pro.cloudnode.smp.nations.util.NationManager; @@ -58,7 +58,7 @@ public void onEnable() { // register chat listener getServer().getPluginManager().registerEvents(new ChatMessageListener(), this); - getServer().getPluginManager().registerEvents(new PlayerJoinListener(), this); + getServer().getPluginManager().registerEvents(new PlayerConnectionListener(), this); } diff --git a/src/main/java/pro/cloudnode/smp/nations/listeners/PlayerConnectionListener.java b/src/main/java/pro/cloudnode/smp/nations/listeners/PlayerConnectionListener.java new file mode 100644 index 0000000..c566779 --- /dev/null +++ b/src/main/java/pro/cloudnode/smp/nations/listeners/PlayerConnectionListener.java @@ -0,0 +1,38 @@ +package pro.cloudnode.smp.nations.listeners; + + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import pro.cloudnode.smp.nations.locale.Messages; +import pro.cloudnode.smp.nations.util.Nation; +import pro.cloudnode.smp.nations.util.NationManager; + +import static pro.cloudnode.smp.nations.Nations.t; + +public class PlayerConnectionListener implements Listener { + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + NationManager.updatePlayersDisplayname(player.getUniqueId()); + + Nation n = NationManager.getPlayerNation(player.getUniqueId()); + // set join message + if (n != null) { + event.joinMessage(t(Messages.PLAYER_JOIN_SERVER, player, n)); + } + } + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + Player player = event.getPlayer(); + + Nation n = NationManager.getPlayerNation(player.getUniqueId()); + // set join message + if (n != null) { + event.quitMessage(t(Messages.PLAYER_LEAVE_SERVER, player, n)); + } + } +} diff --git a/src/main/java/pro/cloudnode/smp/nations/listeners/PlayerJoinListener.java b/src/main/java/pro/cloudnode/smp/nations/listeners/PlayerJoinListener.java deleted file mode 100644 index 259e75d..0000000 --- a/src/main/java/pro/cloudnode/smp/nations/listeners/PlayerJoinListener.java +++ /dev/null @@ -1,16 +0,0 @@ -package pro.cloudnode.smp.nations.listeners; - - -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerJoinEvent; -import pro.cloudnode.smp.nations.util.NationManager; - -public class PlayerJoinListener implements Listener { - @EventHandler - public void onPlayerJoin(PlayerJoinEvent event) { - Player player = event.getPlayer(); - NationManager.updatePlayersDisplayname(player.getUniqueId()); - } -} diff --git a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java index dd0c9f5..327424d 100644 --- a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java +++ b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java @@ -57,7 +57,9 @@ public enum Messages { RELOADED("reloaded", "Nations has been reloaded."), ALREADY_IN_NATION("already-in-nation", "(!) You are already in a nation."), NATION_DISPLAYNAME("nation-displayname", "() "), - PLAYER_DISPLAYNAME("player-displayname", ""); + PLAYER_DISPLAYNAME("player-displayname", ""), + PLAYER_JOIN_SERVER("player-join-server", "[+] () "), + PLAYER_LEAVE_SERVER("player-leave-server", "[-] () "); public final String key; From 0206d7bab23b00dc26ab12f7188a417ba8ad52a3 Mon Sep 17 00:00:00 2001 From: km127pl Date: Wed, 10 Jan 2024 23:52:50 +0100 Subject: [PATCH 32/49] Update NationsCommand.java --- .../java/pro/cloudnode/smp/nations/commands/NationsCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index 73233b2..a6867d6 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -22,6 +22,7 @@ public class NationsCommand extends BaseCommand { private final List COLORS = List.of("white", "red", "blue", "green", "yellow", "light_purple", "aqua", "pink", "gray", "dark_gray", "dark_red", "dark_blue", "dark_green", "dark_aqua", "dark_purple"); private final List EMPTY = new ArrayList<>(); + public NationsCommand(@NotNull Nations plugin) { super(plugin); } From d499a800f1e39ac27ba5791f89ba5e4c85722a38 Mon Sep 17 00:00:00 2001 From: km127pl Date: Wed, 10 Jan 2024 23:58:32 +0100 Subject: [PATCH 33/49] no `implNote` support in javadocs --- .../java/pro/cloudnode/smp/nations/locale/Messages.java | 8 ++++---- .../java/pro/cloudnode/smp/nations/util/BaseCommand.java | 2 +- src/main/java/pro/cloudnode/smp/nations/util/Nation.java | 2 +- .../pro/cloudnode/smp/nations/util/NationManager.java | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java index 327424d..2bcf402 100644 --- a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java +++ b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java @@ -73,8 +73,8 @@ public enum Messages { /** * Save messages to the config * - * @implNote This will *not* overwrite the config - * @implNote This saves into `plugins/Nations/messages.yml` + * This will *not* overwrite the config + * This saves into `plugins/Nations/messages.yml` */ public static void save() { // check if messages.yml exists @@ -98,7 +98,7 @@ public static void save() { /** * Load messages from the config * - * @implNote This loads from `plugins/Nations/messages.yml` + * This loads from `plugins/Nations/messages.yml` */ public static void load() { // add missing first @@ -113,7 +113,7 @@ public static void load() { /** * Adds the default messages to the config if they don't exist * - * @implNote This saves into `plugins/Nations/messages.yml` + * This saves into `plugins/Nations/messages.yml` */ public static void addMissingDefaults() { YamlConfiguration config = YamlConfiguration.loadConfiguration(new File("plugins/Nations/messages.yml")); diff --git a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java index f13d9e0..f19154d 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java @@ -54,7 +54,7 @@ public boolean isPlayer() { * Get the sender a player * * @return The player - * @implNote You should check with {@link #isPlayer()} before using this method + * You should check with {@link #isPlayer()} before using this method */ public Player getPlayer() { return (Player) sender; diff --git a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java index 7fa1246..7667447 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java @@ -102,7 +102,7 @@ public void removeMember(UUID uuid) { * Add an invited player * * @param uuid The UUID of the player to add - * @implNote This adds a player to a 'invited list', and does not add them to a nation + * This adds a player to a 'invited list', and does not add them to a nation */ public void addInvited(UUID uuid) { invited.add(uuid); diff --git a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java index 809d57f..6c93db3 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java @@ -119,8 +119,8 @@ public Nation get(String name) { /** * Save nations to the config * - * @implNote This will overwrite the config - * @implNote This saves into `plugins/Nations/nations.yml` + * This will overwrite the config + * This saves into `plugins/Nations/nations.yml` */ public void save() { // save nations From 8e920ee8df396a894cae56980dafd93db0c7b44e Mon Sep 17 00:00:00 2001 From: km127pl Date: Thu, 11 Jan 2024 11:46:01 +0100 Subject: [PATCH 34/49] Add hover information to /n list --- .../java/pro/cloudnode/smp/nations/locale/Messages.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java index 2bcf402..1029fa3 100644 --- a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java +++ b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java @@ -27,8 +27,8 @@ public enum Messages { INFO_COLOR("info-color", "Color: "), LIST_HEADER("list-header", "Nations:"), - //@todo: add hover information later - LIST_ITEM("list-item", " ()"), + + LIST_ITEM("list-item", "– Leader: Members: '>"), NATION_DISBANDED("nation-disbanded", "(!) Your nation () has been disbanded."), @@ -162,7 +162,8 @@ public String replacePlaceholders(Object... args) { .replace("", nation.leader.toString()) .replace("", "<" + nation.color + ">") .replace("", nation.uuid.toString()) - .replace("", leaderName); + .replace("", leaderName) + .replace("", nation.members.size() + 1 + ""); } else if (arg instanceof String str) { message = message.replace("$" + i, str); } From fc49c38a79819eac53dcfbffd87ab396d4c835c1 Mon Sep 17 00:00:00 2001 From: km127pl Date: Fri, 12 Jan 2024 21:57:32 +0100 Subject: [PATCH 35/49] Annotate with @NotNull --- .../pro/cloudnode/smp/nations/Nations.java | 13 ++- .../smp/nations/commands/NationsCommand.java | 81 +++++++++---------- .../listeners/PlayerConnectionListener.java | 2 +- .../smp/nations/locale/Messages.java | 11 +-- .../smp/nations/util/BaseCommand.java | 2 +- .../cloudnode/smp/nations/util/Nation.java | 20 ++--- .../smp/nations/util/NationManager.java | 20 ++--- 7 files changed, 78 insertions(+), 71 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/Nations.java b/src/main/java/pro/cloudnode/smp/nations/Nations.java index 47fa5d2..7ff829a 100644 --- a/src/main/java/pro/cloudnode/smp/nations/Nations.java +++ b/src/main/java/pro/cloudnode/smp/nations/Nations.java @@ -3,6 +3,7 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; import pro.cloudnode.smp.nations.commands.NationsCommand; import pro.cloudnode.smp.nations.listeners.ChatMessageListener; import pro.cloudnode.smp.nations.listeners.PlayerConnectionListener; @@ -15,7 +16,7 @@ public final class Nations extends JavaPlugin { public static NationManager nationManager; - public static NationManager getNationManager() { + public static @NotNull NationManager getNationManager() { return nationManager; } @@ -26,7 +27,7 @@ public static NationManager getNationManager() { * @param args the arguments to replace placeholders with * @return the translated component */ - public static Component t(Messages message, Object... args) { + public static @NotNull Component t(@NotNull Messages message, @NotNull Object... args) { return MiniMessage.miniMessage().deserialize(message.replacePlaceholders(args)); } @@ -37,7 +38,7 @@ public static Component t(Messages message, Object... args) { * @param args the arguments to replace placeholders with * @return the translated string */ - public static String ts(Messages message, Object... args) { + public static @NotNull String ts(@NotNull Messages message, @NotNull Object... args) { return message.replacePlaceholders(args); } @@ -59,7 +60,13 @@ public void onEnable() { // register chat listener getServer().getPluginManager().registerEvents(new ChatMessageListener(), this); getServer().getPluginManager().registerEvents(new PlayerConnectionListener(), this); + } + /** + * Get the plugin instance + */ + public static @NotNull Nations getPlugin() { + return Nations.getPlugin(Nations.class); } @Override diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index a6867d6..f6703df 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -10,6 +10,7 @@ import pro.cloudnode.smp.nations.locale.Messages; import pro.cloudnode.smp.nations.util.BaseCommand; import pro.cloudnode.smp.nations.util.Nation; +import pro.cloudnode.smp.nations.util.NationManager; import java.util.ArrayList; import java.util.List; @@ -20,14 +21,14 @@ import static pro.cloudnode.smp.nations.Nations.t; public class NationsCommand extends BaseCommand { - private final List COLORS = List.of("white", "red", "blue", "green", "yellow", "light_purple", "aqua", "pink", "gray", "dark_gray", "dark_red", "dark_blue", "dark_green", "dark_aqua", "dark_purple"); - private final List EMPTY = new ArrayList<>(); + private final @NotNull List COLORS = List.of("white", "red", "blue", "green", "yellow", "light_purple", "aqua", "pink", "gray", "dark_gray", "dark_red", "dark_blue", "dark_green", "dark_aqua", "dark_purple"); + private final @NotNull List EMPTY = new ArrayList<>(); public NationsCommand(@NotNull Nations plugin) { super(plugin); } - public void execute(CommandSender sender, String label, String[] args) { + public void execute(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { if (!isPlayer()) { sendMessage(t(Messages.ONLY_PLAYERS)); return; @@ -77,7 +78,7 @@ public void execute(CommandSender sender, String label, String[] args) { } // help for each command - private void help(CommandSender sender, String label, String[] args) { + private void help(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { if (args.length <= 1) { // list of commands sendMessage(t(Messages.COMMANDS_HEADER)); @@ -128,13 +129,13 @@ private void help(CommandSender sender, String label, String[] args) { } } - private void join(CommandSender sender, String label, String[] args) { + private void join(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { if (args.length <= 1) { sendMessage(t(Messages.USAGE, label, "join", "")); return; } - if (nationManager.isInNation((Player) sender)) { + if (NationManager.isInNation((Player) sender)) { sendMessage(t(Messages.ALREADY_IN_NATION)); return; } @@ -155,13 +156,13 @@ private void join(CommandSender sender, String label, String[] args) { sendMessage(t(Messages.JOINED_NATION, nation)); } - private void option(CommandSender sender, String label, String[] args) { + private void option(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { if (args.length <= 1) { sendMessage(t(Messages.USAGE, label, "option", " ")); return; } - Nation nation = Nations.getNationManager().getPlayerNation(getPlayer().getUniqueId()); + Nation nation = NationManager.getPlayerNation(getPlayer().getUniqueId()); if (nation == null) { sendMessage(t(Messages.NOT_IN_NATION)); return; @@ -174,31 +175,27 @@ private void option(CommandSender sender, String label, String[] args) { String key = args[1]; - switch (key) { - case "color": - if (args.length == 2) { - sendMessage(t(Messages.USAGE, label, "option", "color ")); - return; - } - String color = args[2].toLowerCase(); - boolean isHex = color.startsWith("#") && color.length() == 7 && color.matches("#[0-9a-fA-F]+"); - if (!COLORS.contains(color) && !isHex) { - sendMessage(t(Messages.INVALID_COLOR)); - return; - } - - nation.color = color; - sendMessage(t(Messages.COLOR_SET, color)); - nation.update(); + if (key.equals("color")) { + if (args.length == 2) { + sendMessage(t(Messages.USAGE, label, "option", "color ")); + return; + } + String color = args[2].toLowerCase(); + boolean isHex = color.startsWith("#") && color.length() == 7 && color.matches("#[0-9a-fA-F]+"); + if (!COLORS.contains(color) && !isHex) { + sendMessage(t(Messages.INVALID_COLOR)); + return; + } - break; - default: - sendMessage(t(Messages.USAGE, label, "option", " ")); - break; + nation.color = color; + sendMessage(t(Messages.COLOR_SET, color)); + nation.update(); + } else { + sendMessage(t(Messages.USAGE, label, "option", " ")); } } - private void info(CommandSender sender, String label, String[] args) { + private void info(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { if (args.length > 1) { sendMessage(t(Messages.USAGE, label, "info", "")); return; @@ -215,13 +212,13 @@ private void info(CommandSender sender, String label, String[] args) { sendMessage(t(Messages.INFO_MEMBERS, nation.members.stream().map(Bukkit::getPlayer).filter(Objects::nonNull).map(Player::getName).toList().toString())); } - private void quit(CommandSender sender, String label, String[] args) { + private void quit(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { if (args.length > 1) { sendMessage(t(Messages.USAGE, label, "quit", "")); return; } - Nation nation = Nations.getNationManager().getPlayerNation(getPlayer().getUniqueId()); + Nation nation = NationManager.getPlayerNation(getPlayer().getUniqueId()); if (nation == null) { sendMessage(t(Messages.NOT_IN_NATION)); return; @@ -242,7 +239,7 @@ private void quit(CommandSender sender, String label, String[] args) { nation.removeMember(getPlayer().getUniqueId()); } - private void list(CommandSender sender, String label, String[] args) { + private void list(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { sendMessage(t(Messages.LIST_HEADER)); if (Nations.getNationManager().nations.isEmpty()) { sendMessage(t(Messages.NO_NATIONS)); @@ -253,7 +250,7 @@ private void list(CommandSender sender, String label, String[] args) { } } - private void forceDelete(CommandSender sender, String label, String[] args) { + private void forceDelete(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { if (!sender.hasPermission("nations.admin") && !sender.isOp() && !sender.hasPermission("nations.forceDelete")) { sendMessage(t(Messages.NO_PERMISSION)); return; @@ -274,7 +271,7 @@ private void forceDelete(CommandSender sender, String label, String[] args) { sendMessage(t(Messages.NATION_DELETED, nation)); } - private void reload(CommandSender sender, String label, String[] args) { + private void reload(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { if (!sender.hasPermission("nations.admin") && !sender.isOp() && !sender.hasPermission("nations.reload")) { sendMessage(t(Messages.NO_PERMISSION)); return; @@ -289,13 +286,13 @@ private void reload(CommandSender sender, String label, String[] args) { sendMessage(t(Messages.RELOADED)); } - private void kick(CommandSender sender, String label, String[] args) { + private void kick(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { if (args.length <= 1) { sendMessage(t(Messages.USAGE, label, "kick", "")); return; } - Nation nation = Nations.getNationManager().getPlayerNation(getPlayer().getUniqueId()); + Nation nation = NationManager.getPlayerNation(getPlayer().getUniqueId()); if (nation == null) { sendMessage(t(Messages.NOT_IN_NATION)); return; @@ -322,13 +319,13 @@ private void kick(CommandSender sender, String label, String[] args) { sendMessage(player, t(Messages.YOU_HAVE_BEEN_KICKED, nation)); } - private void invite(CommandSender sender, String label, String[] args) { + private void invite(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { if (args.length <= 1) { sendMessage(t(Messages.USAGE, label, "invite", "")); return; } - Nation nation = Nations.getNationManager().getPlayerNation(getPlayer().getUniqueId()); + Nation nation = NationManager.getPlayerNation(getPlayer().getUniqueId()); if (nation == null) { sendMessage(t(Messages.NOT_IN_NATION)); return; @@ -344,7 +341,7 @@ private void invite(CommandSender sender, String label, String[] args) { sendMessage(t(Messages.PLAYER_NOT_FOUND, args[1])); return; } - Nation inviteeNation = Nations.getNationManager().getPlayerNation(player.getUniqueId()); + Nation inviteeNation = NationManager.getPlayerNation(player.getUniqueId()); if (inviteeNation != null) { sendMessage(t(Messages.PLAYER_ALREADY_IN_NATION, player)); @@ -361,13 +358,13 @@ private void invite(CommandSender sender, String label, String[] args) { sendMessage(player, t(Messages.YOU_HAVE_BEEN_INVITED, nation)); } - public void newNation(CommandSender sender, String label, String[] args) { + public void newNation(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { if (args.length <= 1) { sendMessage(t(Messages.USAGE, label, "create", "")); return; } - if (nationManager.isInNation((Player) sender)) { + if (NationManager.isInNation((Player) sender)) { sendMessage(t(Messages.ALREADY_IN_NATION)); return; } @@ -394,7 +391,7 @@ public void newNation(CommandSender sender, String label, String[] args) { public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { Player player = (Player) sender; Stream commands = Stream.of("list", "help"); - if (Nations.getNationManager().isInNation(player)) + if (NationManager.isInNation(player)) commands = Stream.concat(commands, Stream.of("quit", "kick", "invite", "info", "option")); else commands = Stream.concat(commands, Stream.of("join", "create")); if (sender.hasPermission("nations.admin")) diff --git a/src/main/java/pro/cloudnode/smp/nations/listeners/PlayerConnectionListener.java b/src/main/java/pro/cloudnode/smp/nations/listeners/PlayerConnectionListener.java index c566779..e2528a3 100644 --- a/src/main/java/pro/cloudnode/smp/nations/listeners/PlayerConnectionListener.java +++ b/src/main/java/pro/cloudnode/smp/nations/listeners/PlayerConnectionListener.java @@ -16,7 +16,7 @@ public class PlayerConnectionListener implements Listener { @EventHandler public void onPlayerJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); - NationManager.updatePlayersDisplayname(player.getUniqueId()); + NationManager.updatePlayersName(player.getUniqueId()); Nation n = NationManager.getPlayerNation(player.getUniqueId()); // set join message diff --git a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java index 1029fa3..1e8f0c5 100644 --- a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java +++ b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java @@ -3,6 +3,7 @@ import org.bukkit.Bukkit; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; import pro.cloudnode.smp.nations.Nations; import pro.cloudnode.smp.nations.util.Nation; @@ -97,7 +98,7 @@ public static void save() { /** * Load messages from the config - * + *
* This loads from `plugins/Nations/messages.yml` */ public static void load() { @@ -112,7 +113,7 @@ public static void load() { /** * Adds the default messages to the config if they don't exist - * + *
* This saves into `plugins/Nations/messages.yml` */ public static void addMissingDefaults() { @@ -132,11 +133,11 @@ public static void addMissingDefaults() { } } - public String getKey() { + public @NotNull String getKey() { return key; } - public String getDefaultValue() { + public @NotNull String getDefaultValue() { return default_value; } @@ -146,7 +147,7 @@ public String getDefaultValue() { * @param args the arguments to replace placeholders with * @return the translated component */ - public String replacePlaceholders(Object... args) { + public @NotNull String replacePlaceholders(@NotNull Object... args) { String message = this.getDefaultValue(); for (int i = 0; i < args.length; i++) { Object arg = args[i]; diff --git a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java index f19154d..4f0f76f 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java @@ -15,7 +15,7 @@ public class BaseCommand implements CommandExecutor, TabCompleter { private final @NotNull Nations plugin; - private CommandSender sender; + private @Nullable CommandSender sender; public BaseCommand(@NotNull Nations plugin) { this.plugin = plugin; diff --git a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java index 7667447..8978fc1 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java @@ -10,7 +10,7 @@ import java.util.UUID; public class Nation { - public @NotNull UUID uuid; + public final @NotNull UUID uuid; public @NotNull String name; public @NotNull UUID leader; public @NotNull ArrayList members; @@ -35,7 +35,7 @@ public Nation(@NotNull String name, @NotNull UUID leader) { this.color = "white"; } - public Nation(String key, FileConfiguration config) { + public Nation(@NotNull String key, @NotNull FileConfiguration config) { this.uuid = UUID.fromString(key); this.load((YamlConfiguration) config); } @@ -45,7 +45,7 @@ public Nation(String key, FileConfiguration config) { * * @param config The config to save to */ - public void save(YamlConfiguration config) { + public void save(@NotNull YamlConfiguration config) { config.set("nations." + uuid + ".name", name); config.set("nations." + uuid + ".leader", leader.toString()); config.set("nations." + uuid + ".members", Arrays.stream(members.toArray()).map(Object::toString).toArray()); @@ -58,7 +58,7 @@ public void save(YamlConfiguration config) { * * @param config The config to load from */ - public void load(YamlConfiguration config) { + public void load(@NotNull YamlConfiguration config) { this.name = Objects.requireNonNull(config.getString("nations." + uuid + ".name")); this.leader = UUID.fromString(Objects.requireNonNull(config.getString("nations." + uuid + ".leader"))); this.members = new ArrayList<>(); @@ -83,7 +83,7 @@ public void load(YamlConfiguration config) { * * @param uuid The UUID of the player to add */ - public void addMember(UUID uuid) { + public void addMember(@NotNull UUID uuid) { members.add(uuid); update(); } @@ -93,7 +93,7 @@ public void addMember(UUID uuid) { * * @param uuid The UUID of the player to remove */ - public void removeMember(UUID uuid) { + public void removeMember(@NotNull UUID uuid) { members.remove(uuid); update(); } @@ -104,7 +104,7 @@ public void removeMember(UUID uuid) { * @param uuid The UUID of the player to add * This adds a player to a 'invited list', and does not add them to a nation */ - public void addInvited(UUID uuid) { + public void addInvited(@NotNull UUID uuid) { invited.add(uuid); } @@ -113,18 +113,18 @@ public void addInvited(UUID uuid) { * * @param uuid The UUID of the player to remove */ - public void removeInvited(UUID uuid) { + public void removeInvited(@NotNull UUID uuid) { invited.remove(uuid); } public void update() { // update leader - NationManager.updatePlayersDisplayname(leader); + NationManager.updatePlayersName(leader); // update members for (UUID member : members) { - NationManager.updatePlayersDisplayname(member); + NationManager.updatePlayersName(member); } } } diff --git a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java index 6c93db3..50f6c3f 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java @@ -3,6 +3,8 @@ import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import pro.cloudnode.smp.nations.Nations; import pro.cloudnode.smp.nations.locale.Messages; @@ -13,10 +15,10 @@ import java.util.UUID; public class NationManager { - public static HashMap nations = new HashMap<>(); - private final Nations plugin; + public static @NotNull HashMap nations = new HashMap<>(); + private final @NotNull Nations plugin; - public NationManager(Nations plugin) { + public NationManager(@NotNull Nations plugin) { this.plugin = plugin; } @@ -26,7 +28,7 @@ public NationManager(Nations plugin) { * @param uuid The UUID of the player * @return The nation, or null if not found */ - public static Nation getPlayerNation(UUID uuid) { + public static @Nullable Nation getPlayerNation(@NotNull UUID uuid) { for (Nation nation : nations.values()) { if (nation.leader.equals(uuid)) { return nation; @@ -44,7 +46,7 @@ public static Nation getPlayerNation(UUID uuid) { * @param uuid The UUID of the player * @return Whether the player is in a nation */ - public static boolean isInNation(UUID uuid) { + public static boolean isInNation(@NotNull UUID uuid) { return getPlayerNation(uuid) != null; } @@ -54,11 +56,11 @@ public static boolean isInNation(UUID uuid) { * @param player The player * @return Whether the player is in a nation */ - public static boolean isInNation(Player player) { + public static boolean isInNation(@NotNull Player player) { return isInNation(player.getUniqueId()); } - public static void updatePlayersDisplayname(UUID uuid) { + public static void updatePlayersName(@NotNull UUID uuid) { Player player = Nations.getPlugin(Nations.class).getServer().getPlayer(uuid); if (player == null) return; if (isInNation(player)) { @@ -77,7 +79,7 @@ public static void updatePlayersDisplayname(UUID uuid) { */ public void add(Nation nation) { nations.put(nation.uuid, nation); - updatePlayersDisplayname(nation.leader); + updatePlayersName(nation.leader); } /** @@ -88,7 +90,7 @@ public void add(Nation nation) { public void remove(Nation nation) { UUID leader = nation.leader; nations.remove(nation.uuid); - updatePlayersDisplayname(leader); + updatePlayersName(leader); } /** From 2cdc3cc081f936ff09df3655b96f80fef9d00b7f Mon Sep 17 00:00:00 2001 From: km127pl Date: Fri, 12 Jan 2024 22:05:28 +0100 Subject: [PATCH 36/49] reformat code --- .../java/pro/cloudnode/smp/nations/Nations.java | 14 +++++++------- .../smp/nations/commands/NationsCommand.java | 5 ++--- .../pro/cloudnode/smp/nations/locale/Messages.java | 2 +- .../pro/cloudnode/smp/nations/util/Nation.java | 2 +- .../cloudnode/smp/nations/util/NationManager.java | 2 +- 5 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/Nations.java b/src/main/java/pro/cloudnode/smp/nations/Nations.java index 7ff829a..f2eb072 100644 --- a/src/main/java/pro/cloudnode/smp/nations/Nations.java +++ b/src/main/java/pro/cloudnode/smp/nations/Nations.java @@ -42,6 +42,13 @@ public final class Nations extends JavaPlugin { return message.replacePlaceholders(args); } + /** + * Get the plugin instance + */ + public static @NotNull Nations getPlugin() { + return Nations.getPlugin(Nations.class); + } + @Override public void onEnable() { // save messages.yml if it doesn't exist @@ -62,13 +69,6 @@ public void onEnable() { getServer().getPluginManager().registerEvents(new PlayerConnectionListener(), this); } - /** - * Get the plugin instance - */ - public static @NotNull Nations getPlugin() { - return Nations.getPlugin(Nations.class); - } - @Override public void onDisable() { nationManager.save(); diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index f6703df..43ccf89 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -17,7 +17,6 @@ import java.util.Objects; import java.util.stream.Stream; -import static pro.cloudnode.smp.nations.Nations.nationManager; import static pro.cloudnode.smp.nations.Nations.t; public class NationsCommand extends BaseCommand { @@ -241,11 +240,11 @@ private void quit(@NotNull CommandSender sender, @NotNull String label, @NotNull private void list(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { sendMessage(t(Messages.LIST_HEADER)); - if (Nations.getNationManager().nations.isEmpty()) { + if (NationManager.nations.isEmpty()) { sendMessage(t(Messages.NO_NATIONS)); return; } - for (Nation nation : Nations.getNationManager().nations.values()) { + for (Nation nation : NationManager.nations.values()) { sendMessage(t(Messages.LIST_ITEM, nation)); } } diff --git a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java index 1e8f0c5..2e8636a 100644 --- a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java +++ b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java @@ -73,7 +73,7 @@ public enum Messages { /** * Save messages to the config - * + *

* This will *not* overwrite the config * This saves into `plugins/Nations/messages.yml` */ diff --git a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java index 8978fc1..014bdd1 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java @@ -102,7 +102,7 @@ public void removeMember(@NotNull UUID uuid) { * Add an invited player * * @param uuid The UUID of the player to add - * This adds a player to a 'invited list', and does not add them to a nation + * This adds a player to a 'invited list', and does not add them to a nation */ public void addInvited(@NotNull UUID uuid) { invited.add(uuid); diff --git a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java index 50f6c3f..50528b2 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java @@ -120,7 +120,7 @@ public Nation get(String name) { /** * Save nations to the config - * + *

* This will overwrite the config * This saves into `plugins/Nations/nations.yml` */ From 83598b2423f21deac5f4a5892e9c3ab805457c95 Mon Sep 17 00:00:00 2001 From: km127pl Date: Fri, 12 Jan 2024 22:15:36 +0100 Subject: [PATCH 37/49] code cleanup --- src/main/java/pro/cloudnode/smp/nations/Nations.java | 5 +++-- .../pro/cloudnode/smp/nations/util/NationManager.java | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/Nations.java b/src/main/java/pro/cloudnode/smp/nations/Nations.java index f2eb072..5c02bc2 100644 --- a/src/main/java/pro/cloudnode/smp/nations/Nations.java +++ b/src/main/java/pro/cloudnode/smp/nations/Nations.java @@ -61,8 +61,9 @@ public void onEnable() { nationManager.load(); // register commands - Objects.requireNonNull(this.getCommand("nations")).setExecutor(new NationsCommand(this)); - Objects.requireNonNull(this.getCommand("nations")).setTabCompleter(new NationsCommand(this)); + NationsCommand nationsCommand = new NationsCommand(); + Objects.requireNonNull(this.getCommand("nations")).setExecutor(nationsCommand); + Objects.requireNonNull(this.getCommand("nations")).setTabCompleter(nationsCommand); // register chat listener getServer().getPluginManager().registerEvents(new ChatMessageListener(), this); diff --git a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java index 50528b2..3e30fe0 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java @@ -63,11 +63,11 @@ public static boolean isInNation(@NotNull Player player) { public static void updatePlayersName(@NotNull UUID uuid) { Player player = Nations.getPlugin(Nations.class).getServer().getPlayer(uuid); if (player == null) return; - if (isInNation(player)) { - Nation nation = getPlayerNation(player.getUniqueId()); - player.displayName(Nations.t(Messages.NATION_DISPLAYNAME, nation, player)); - } else { + Nation nation = getPlayerNation(player.getUniqueId()); + if (nation == null) { player.displayName(Nations.t(Messages.PLAYER_DISPLAYNAME, player)); + } else { + player.displayName(Nations.t(Messages.NATION_DISPLAYNAME, nation, player)); } player.playerListName(player.displayName()); } From 1a0484bf08393da9db14811f5c4aac54383c3c0e Mon Sep 17 00:00:00 2001 From: km127pl Date: Fri, 12 Jan 2024 22:15:49 +0100 Subject: [PATCH 38/49] construct it only once --- .../smp/nations/commands/NationsCommand.java | 8 +-- .../smp/nations/util/BaseCommand.java | 55 ++----------------- 2 files changed, 8 insertions(+), 55 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index 43ccf89..9f01b02 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -23,10 +23,6 @@ public class NationsCommand extends BaseCommand { private final @NotNull List COLORS = List.of("white", "red", "blue", "green", "yellow", "light_purple", "aqua", "pink", "gray", "dark_gray", "dark_red", "dark_blue", "dark_green", "dark_aqua", "dark_purple"); private final @NotNull List EMPTY = new ArrayList<>(); - public NationsCommand(@NotNull Nations plugin) { - super(plugin); - } - public void execute(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { if (!isPlayer()) { sendMessage(t(Messages.ONLY_PLAYERS)); @@ -200,14 +196,14 @@ private void info(@NotNull CommandSender sender, @NotNull String label, @NotNull return; } - Nation nation = Nations.getNationManager().getPlayerNation(getPlayer().getUniqueId()); + Nation nation = NationManager.getPlayerNation(getPlayer().getUniqueId()); if (nation == null) { sendMessage(t(Messages.NOT_IN_NATION)); return; } sendMessage(t(Messages.INFO_HEADER, nation)); - sendMessage(t(Messages.INFO_LEADER, Bukkit.getPlayer(nation.leader).getName())); + sendMessage(t(Messages.INFO_LEADER, Objects.requireNonNull(Bukkit.getPlayer(nation.leader)).getName())); sendMessage(t(Messages.INFO_MEMBERS, nation.members.stream().map(Bukkit::getPlayer).filter(Objects::nonNull).map(Player::getName).toList().toString())); } diff --git a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java index 4f0f76f..ad85eaa 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java @@ -1,7 +1,6 @@ package pro.cloudnode.smp.nations.util; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -9,28 +8,13 @@ import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import pro.cloudnode.smp.nations.Nations; import java.util.List; public class BaseCommand implements CommandExecutor, TabCompleter { - private final @NotNull Nations plugin; private @Nullable CommandSender sender; - public BaseCommand(@NotNull Nations plugin) { - this.plugin = plugin; - } - - /** - * Get the plugin instance - * - * @return The plugin instance - */ - public @NotNull Nations getPlugin() { - return plugin; - } - - public void execute(CommandSender sender, String label, String[] args) { + public void execute(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { throw new UnsupportedOperationException("Not implemented yet"); } @@ -60,42 +44,15 @@ public Player getPlayer() { return (Player) sender; } - /** - * Get the command sender - * - * @return The command sender - */ - - public CommandSender getSender() { - return sender; - } - - /** - * Send a message to the sender - * - * @param message The message to send - */ - public void sendMessage(String message) { - this.sender.sendMessage(MiniMessage.miniMessage().deserialize(message)); - } - /** * Send a message to the sender * * @param message The message to send */ - public void sendMessage(Component message) { - this.sender.sendMessage(message); - } - - /** - * Send a message to a player - * - * @param player The player to send the message to - * @param message The message to send - */ - public void sendMessage(Player player, String message) { - player.sendMessage(MiniMessage.miniMessage().deserialize(message)); + public void sendMessage(@NotNull Component message) { + if (this.sender != null) { + this.sender.sendMessage(message); + } } /** @@ -104,7 +61,7 @@ public void sendMessage(Player player, String message) { * @param player The player to send the message to * @param message The message to send */ - public void sendMessage(Player player, Component message) { + public void sendMessage(@NotNull Player player, @NotNull Component message) { player.sendMessage(message); } From 30e69a1cf72cdf7465d34513149c79d604bc7175 Mon Sep 17 00:00:00 2001 From: km127pl Date: Fri, 12 Jan 2024 22:25:51 +0100 Subject: [PATCH 39/49] Add invite cancellation --- .../smp/nations/commands/NationsCommand.java | 55 ++++++++++++++++++- .../smp/nations/locale/Messages.java | 4 +- .../smp/nations/util/NationManager.java | 10 ++++ 3 files changed, 65 insertions(+), 4 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index 9f01b02..c95a180 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -65,6 +65,9 @@ public void execute(@NotNull CommandSender sender, @NotNull String label, @NotNu case "force-delete": forceDelete(sender, label, args); break; + case "cancel-invite": + cancelInvite(sender, label, args); + break; case "help": default: help(sender, label, args); @@ -72,6 +75,38 @@ public void execute(@NotNull CommandSender sender, @NotNull String label, @NotNu } } + private void cancelInvite(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { + if (args.length <= 1) { + sendMessage(t(Messages.USAGE, label, "cancel-invite", "")); + return; + } + + Nation nation = NationManager.getPlayerNation(getPlayer().getUniqueId()); + if (nation == null) { + sendMessage(t(Messages.NOT_IN_NATION)); + return; + } + + if (!nation.leader.equals(getPlayer().getUniqueId())) { + sendMessage(t(Messages.NOT_LEADER)); + return; + } + + Player player = Bukkit.getPlayer(args[1]); + if (player == null) { + sendMessage(t(Messages.PLAYER_NOT_FOUND, args[1])); + return; + } + + if (!nation.invited.contains(player.getUniqueId())) { + sendMessage(t(Messages.PLAYER_NOT_INVITED, player)); + return; + } + + nation.removeInvited(player.getUniqueId()); + sendMessage(t(Messages.CANCELED_INVITE, player)); + } + // help for each command private void help(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { if (args.length <= 1) { @@ -86,6 +121,7 @@ private void help(@NotNull CommandSender sender, @NotNull String label, @NotNull sendMessage(t(Messages.COMMANDS_ITEM, "option", " ", "set options for your nation")); sendMessage(t(Messages.COMMANDS_ITEM, "join", "", "join a nation")); sendMessage(t(Messages.COMMANDS_ITEM, "help", "", "show this help message")); + sendMessage(t(Messages.COMMANDS_ITEM, "cancel-invite", "", "cancel an invite to your nation")); if (sender.hasPermission("nations.admin")) { sendMessage(t(Messages.COMMANDS_ITEM, "force-delete", "", "force delete a nation")); sendMessage(t(Messages.COMMANDS_ITEM, "reload", "", "reload the plugin")); @@ -118,6 +154,9 @@ private void help(@NotNull CommandSender sender, @NotNull String label, @NotNull case "join": sendMessage(t(Messages.USAGE, label, "join", "")); break; + case "cancel-invite": + sendMessage(t(Messages.USAGE, label, "cancel-invite", "")); + break; default: help(sender, label, new String[0]); break; @@ -386,11 +425,17 @@ public void newNation(@NotNull CommandSender sender, @NotNull String label, @Not public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { Player player = (Player) sender; Stream commands = Stream.of("list", "help"); - if (NationManager.isInNation(player)) - commands = Stream.concat(commands, Stream.of("quit", "kick", "invite", "info", "option")); - else commands = Stream.concat(commands, Stream.of("join", "create")); + Nation nation = null; + if (NationManager.isNationLeader(player.getUniqueId())) + commands = Stream.concat(commands, Stream.of("kick", "invite", "cancel-invite", "option")); + if (NationManager.isInNation(player.getUniqueId())) { + commands = Stream.concat(commands, Stream.of("quit", "info")); + nation = NationManager.getPlayerNation(player.getUniqueId()); + } else commands = Stream.concat(commands, Stream.of("join", "create")); if (sender.hasPermission("nations.admin")) commands = Stream.concat(commands, Stream.of("force-delete", "reload")); + + // sort alphabetically commands = commands.sorted(); return switch (args.length) { @@ -401,6 +446,10 @@ public void newNation(@NotNull CommandSender sender, @NotNull String label, @Not case "option" -> List.of("color"); case "join" -> Nations.getNationManager().getNationsInviting(player.getUniqueId()); case "force-delete" -> Nations.getNationManager().getNations(); + case "cancel-invite" -> { + if (nation == null) yield EMPTY; + yield NationManager.getNationInvites(nation).stream().map(Player::getName).toList(); + } case "help" -> commands.filter(s -> s.startsWith(args[1])).toList(); default -> EMPTY; }; diff --git a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java index 2e8636a..17931f9 100644 --- a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java +++ b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java @@ -60,7 +60,9 @@ public enum Messages { NATION_DISPLAYNAME("nation-displayname", "() "), PLAYER_DISPLAYNAME("player-displayname", ""), PLAYER_JOIN_SERVER("player-join-server", "[+] () "), - PLAYER_LEAVE_SERVER("player-leave-server", "[-] () "); + PLAYER_LEAVE_SERVER("player-leave-server", "[-] () "), + PLAYER_NOT_INVITED("player-not-invited", "(!) Player is not invited to your nation."), + CANCELED_INVITE("canceled-invite", "You have canceled the invite for "); public final String key; diff --git a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java index 3e30fe0..f1e2520 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java @@ -72,6 +72,12 @@ public static void updatePlayersName(@NotNull UUID uuid) { player.playerListName(player.displayName()); } + public static boolean isNationLeader(@NotNull UUID uuid) { + Nation nation = getPlayerNation(uuid); + if (nation == null) return false; + return nation.leader.equals(uuid); + } + /** * Add a nation * @@ -151,6 +157,10 @@ public List getNationsInviting(UUID uuid) { return nations.values().stream().filter(nation -> nation.invited.contains(uuid)).map(nation -> nation.name).toList(); } + public static List getNationInvites(Nation nation) { + return nation.invited.stream().map(uuid -> Nations.getPlugin(Nations.class).getServer().getPlayer(uuid)).toList(); + } + /** * Load nations from the config */ From 2a5df202e927b785c3b9221b7506168e86cbb315 Mon Sep 17 00:00:00 2001 From: km127pl Date: Fri, 12 Jan 2024 22:26:06 +0100 Subject: [PATCH 40/49] bump to JDK 17 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 8b2132f..646045c 100644 --- a/pom.xml +++ b/pom.xml @@ -23,8 +23,8 @@ maven-compiler-plugin 3.8.1 - 16 - 16 + 17 + 17 From 653eb6abc08e4f07a28a3f09c10ac80cd033d084 Mon Sep 17 00:00:00 2001 From: km127pl Date: Fri, 12 Jan 2024 22:27:41 +0100 Subject: [PATCH 41/49] forgot a crlf --- src/main/resources/plugin.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 6a0e56f..8882996 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -6,4 +6,4 @@ commands: nations: description: Main command for Nations aliases: [ n, nation ] - usage: / \ No newline at end of file + usage: / From a1d8d117c344dd342e62f67179decfafa567500d Mon Sep 17 00:00:00 2001 From: km127pl Date: Fri, 12 Jan 2024 22:29:51 +0100 Subject: [PATCH 42/49] enhanced switch --- .../smp/nations/commands/NationsCommand.java | 40 +++++-------------- 1 file changed, 10 insertions(+), 30 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index c95a180..b065423 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -130,36 +130,16 @@ private void help(@NotNull CommandSender sender, @NotNull String label, @NotNull } switch (args[1]) { - case "create": - sendMessage(t(Messages.USAGE, label, "create", "")); - break; - case "invite": - sendMessage(t(Messages.USAGE, label, "invite", "")); - break; - case "kick": - sendMessage(t(Messages.USAGE, label, "kick", "")); - break; - case "list": - sendMessage(t(Messages.USAGE, label, "list", "")); - break; - case "quit": - sendMessage(t(Messages.USAGE, label, "quit", "")); - break; - case "info": - sendMessage(t(Messages.USAGE, label, "info", "")); - break; - case "option": - sendMessage(t(Messages.USAGE, label, "option", " ")); - break; - case "join": - sendMessage(t(Messages.USAGE, label, "join", "")); - break; - case "cancel-invite": - sendMessage(t(Messages.USAGE, label, "cancel-invite", "")); - break; - default: - help(sender, label, new String[0]); - break; + case "create" -> sendMessage(t(Messages.USAGE, label, "create", "")); + case "invite" -> sendMessage(t(Messages.USAGE, label, "invite", "")); + case "kick" -> sendMessage(t(Messages.USAGE, label, "kick", "")); + case "list" -> sendMessage(t(Messages.USAGE, label, "list", "")); + case "quit" -> sendMessage(t(Messages.USAGE, label, "quit", "")); + case "info" -> sendMessage(t(Messages.USAGE, label, "info", "")); + case "option" -> sendMessage(t(Messages.USAGE, label, "option", " ")); + case "join" -> sendMessage(t(Messages.USAGE, label, "join", "")); + case "cancel-invite" -> sendMessage(t(Messages.USAGE, label, "cancel-invite", "")); + default -> help(sender, label, new String[0]); } } From 856e09f78552b54537fd6012eaa4d3cbaeebef95 Mon Sep 17 00:00:00 2001 From: km127pl Date: Fri, 12 Jan 2024 22:30:47 +0100 Subject: [PATCH 43/49] update hex regex --- .../java/pro/cloudnode/smp/nations/commands/NationsCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index b065423..2fa08c3 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -195,7 +195,7 @@ private void option(@NotNull CommandSender sender, @NotNull String label, @NotNu return; } String color = args[2].toLowerCase(); - boolean isHex = color.startsWith("#") && color.length() == 7 && color.matches("#[0-9a-fA-F]+"); + boolean isHex = color.matches("^#[0-9a-f]{6}$"); if (!COLORS.contains(color) && !isHex) { sendMessage(t(Messages.INVALID_COLOR)); return; From 57ebf652a0173b95a0f9f4f0fb4477451d5cc0ac Mon Sep 17 00:00:00 2001 From: km127pl Date: Fri, 12 Jan 2024 22:31:47 +0100 Subject: [PATCH 44/49] add leave as an alias to quit --- .../smp/nations/commands/NationsCommand.java | 51 +++++-------------- 1 file changed, 13 insertions(+), 38 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index 2fa08c3..7630246 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -35,43 +35,18 @@ public void execute(@NotNull CommandSender sender, @NotNull String label, @NotNu } switch (args[0]) { - case "create": - newNation(sender, label, args); - break; - case "invite": - invite(sender, label, args); - break; - case "kick": - kick(sender, label, args); - break; - case "list": - list(sender, label, args); - break; - case "quit": - quit(sender, label, args); - break; - case "info": - info(sender, label, args); - break; - case "option": - option(sender, label, args); - break; - case "join": - join(sender, label, args); - break; - case "reload": - reload(sender, label, args); - break; - case "force-delete": - forceDelete(sender, label, args); - break; - case "cancel-invite": - cancelInvite(sender, label, args); - break; - case "help": - default: - help(sender, label, args); - break; + case "create" -> newNation(sender, label, args); + case "invite" -> invite(sender, label, args); + case "kick" -> kick(sender, label, args); + case "list" -> list(sender, label, args); + case "quit", "leave" -> quit(sender, label, args); + case "info" -> info(sender, label, args); + case "option" -> option(sender, label, args); + case "join" -> join(sender, label, args); + case "reload" -> reload(sender, label, args); + case "force-delete" -> forceDelete(sender, label, args); + case "cancel-invite" -> cancelInvite(sender, label, args); + default -> help(sender, label, args); } } @@ -134,7 +109,7 @@ private void help(@NotNull CommandSender sender, @NotNull String label, @NotNull case "invite" -> sendMessage(t(Messages.USAGE, label, "invite", "")); case "kick" -> sendMessage(t(Messages.USAGE, label, "kick", "")); case "list" -> sendMessage(t(Messages.USAGE, label, "list", "")); - case "quit" -> sendMessage(t(Messages.USAGE, label, "quit", "")); + case "quit", "leave" -> sendMessage(t(Messages.USAGE, label, "quit", "")); case "info" -> sendMessage(t(Messages.USAGE, label, "info", "")); case "option" -> sendMessage(t(Messages.USAGE, label, "option", " ")); case "join" -> sendMessage(t(Messages.USAGE, label, "join", "")); From ce1f37b9097c674e67a891454a33cd75d43844a8 Mon Sep 17 00:00:00 2001 From: km127pl Date: Fri, 12 Jan 2024 22:37:37 +0100 Subject: [PATCH 45/49] make sendMessage yield true --- .../smp/nations/commands/NationsCommand.java | 178 +++++++----------- .../smp/nations/util/BaseCommand.java | 8 +- .../smp/nations/util/NationManager.java | 8 +- 3 files changed, 81 insertions(+), 113 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index 7630246..491d46f 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -23,18 +23,17 @@ public class NationsCommand extends BaseCommand { private final @NotNull List COLORS = List.of("white", "red", "blue", "green", "yellow", "light_purple", "aqua", "pink", "gray", "dark_gray", "dark_red", "dark_blue", "dark_green", "dark_aqua", "dark_purple"); private final @NotNull List EMPTY = new ArrayList<>(); - public void execute(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { + public boolean execute(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { if (!isPlayer()) { - sendMessage(t(Messages.ONLY_PLAYERS)); - return; + return sendMessage(t(Messages.ONLY_PLAYERS)); } if (args.length == 0) { help(sender, label, args); - return; + return false; } - switch (args[0]) { + return switch (args[0]) { case "create" -> newNation(sender, label, args); case "invite" -> invite(sender, label, args); case "kick" -> kick(sender, label, args); @@ -47,43 +46,38 @@ public void execute(@NotNull CommandSender sender, @NotNull String label, @NotNu case "force-delete" -> forceDelete(sender, label, args); case "cancel-invite" -> cancelInvite(sender, label, args); default -> help(sender, label, args); - } + }; } - private void cancelInvite(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { + private boolean cancelInvite(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { if (args.length <= 1) { - sendMessage(t(Messages.USAGE, label, "cancel-invite", "")); - return; + return sendMessage(t(Messages.USAGE, label, "cancel-invite", "")); } Nation nation = NationManager.getPlayerNation(getPlayer().getUniqueId()); if (nation == null) { - sendMessage(t(Messages.NOT_IN_NATION)); - return; + return sendMessage(t(Messages.NOT_IN_NATION)); } if (!nation.leader.equals(getPlayer().getUniqueId())) { - sendMessage(t(Messages.NOT_LEADER)); - return; + return sendMessage(t(Messages.NOT_LEADER)); } Player player = Bukkit.getPlayer(args[1]); if (player == null) { - sendMessage(t(Messages.PLAYER_NOT_FOUND, args[1])); - return; + return sendMessage(t(Messages.PLAYER_NOT_FOUND, args[1])); } if (!nation.invited.contains(player.getUniqueId())) { - sendMessage(t(Messages.PLAYER_NOT_INVITED, player)); - return; + return sendMessage(t(Messages.PLAYER_NOT_INVITED, player)); } nation.removeInvited(player.getUniqueId()); - sendMessage(t(Messages.CANCELED_INVITE, player)); + return sendMessage(t(Messages.CANCELED_INVITE, player)); } // help for each command - private void help(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { + private boolean help(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { if (args.length <= 1) { // list of commands sendMessage(t(Messages.COMMANDS_HEADER)); @@ -101,7 +95,6 @@ private void help(@NotNull CommandSender sender, @NotNull String label, @NotNull sendMessage(t(Messages.COMMANDS_ITEM, "force-delete", "", "force delete a nation")); sendMessage(t(Messages.COMMANDS_ITEM, "reload", "", "reload the plugin")); } - return; } switch (args[1]) { @@ -116,64 +109,57 @@ private void help(@NotNull CommandSender sender, @NotNull String label, @NotNull case "cancel-invite" -> sendMessage(t(Messages.USAGE, label, "cancel-invite", "")); default -> help(sender, label, new String[0]); } + + return true; } - private void join(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { + private boolean join(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { if (args.length <= 1) { - sendMessage(t(Messages.USAGE, label, "join", "")); - return; + return sendMessage(t(Messages.USAGE, label, "join", "")); } if (NationManager.isInNation((Player) sender)) { - sendMessage(t(Messages.ALREADY_IN_NATION)); - return; + return sendMessage(t(Messages.ALREADY_IN_NATION)); } Nation nation = Nations.getNationManager().get(args[1]); if (nation == null) { - sendMessage(t(Messages.NATION_NOT_FOUND, args[1])); - return; + return sendMessage(t(Messages.NATION_NOT_FOUND, args[1])); } if (!nation.invited.contains(getPlayer().getUniqueId())) { - sendMessage(t(Messages.NOT_INVITED_TO_NATION, nation)); - return; + return sendMessage(t(Messages.NOT_INVITED_TO_NATION, nation)); } nation.addMember(getPlayer().getUniqueId()); nation.removeInvited(getPlayer().getUniqueId()); - sendMessage(t(Messages.JOINED_NATION, nation)); + return sendMessage(t(Messages.JOINED_NATION, nation)); } - private void option(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { + private boolean option(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { if (args.length <= 1) { - sendMessage(t(Messages.USAGE, label, "option", " ")); - return; + return sendMessage(t(Messages.USAGE, label, "option", " ")); } Nation nation = NationManager.getPlayerNation(getPlayer().getUniqueId()); if (nation == null) { - sendMessage(t(Messages.NOT_IN_NATION)); - return; + return sendMessage(t(Messages.NOT_IN_NATION)); } if (!nation.leader.equals(getPlayer().getUniqueId())) { - sendMessage(t(Messages.NOT_LEADER)); - return; + return sendMessage(t(Messages.NOT_LEADER)); } String key = args[1]; if (key.equals("color")) { if (args.length == 2) { - sendMessage(t(Messages.USAGE, label, "option", "color ")); - return; + return sendMessage(t(Messages.USAGE, label, "option", "color ")); } String color = args[2].toLowerCase(); boolean isHex = color.matches("^#[0-9a-f]{6}$"); if (!COLORS.contains(color) && !isHex) { - sendMessage(t(Messages.INVALID_COLOR)); - return; + return sendMessage(t(Messages.INVALID_COLOR)); } nation.color = color; @@ -182,188 +168,168 @@ private void option(@NotNull CommandSender sender, @NotNull String label, @NotNu } else { sendMessage(t(Messages.USAGE, label, "option", " ")); } + + return true; } - private void info(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { + private boolean info(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { if (args.length > 1) { - sendMessage(t(Messages.USAGE, label, "info", "")); - return; + return sendMessage(t(Messages.USAGE, label, "info", "")); } Nation nation = NationManager.getPlayerNation(getPlayer().getUniqueId()); if (nation == null) { - sendMessage(t(Messages.NOT_IN_NATION)); - return; + return sendMessage(t(Messages.NOT_IN_NATION)); } sendMessage(t(Messages.INFO_HEADER, nation)); sendMessage(t(Messages.INFO_LEADER, Objects.requireNonNull(Bukkit.getPlayer(nation.leader)).getName())); - sendMessage(t(Messages.INFO_MEMBERS, nation.members.stream().map(Bukkit::getPlayer).filter(Objects::nonNull).map(Player::getName).toList().toString())); + return sendMessage(t(Messages.INFO_MEMBERS, nation.members.stream().map(Bukkit::getPlayer).filter(Objects::nonNull).map(Player::getName).toList().toString())); } - private void quit(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { + private boolean quit(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { if (args.length > 1) { - sendMessage(t(Messages.USAGE, label, "quit", "")); - return; + return sendMessage(t(Messages.USAGE, label, "quit", "")); } Nation nation = NationManager.getPlayerNation(getPlayer().getUniqueId()); if (nation == null) { - sendMessage(t(Messages.NOT_IN_NATION)); - return; + return sendMessage(t(Messages.NOT_IN_NATION)); } if (nation.members.isEmpty() && nation.leader.equals(getPlayer().getUniqueId())) { sendMessage(t(Messages.NATION_DISBANDED, nation)); Nations.getNationManager().remove(nation); - return; + return true; } if (nation.leader.equals(getPlayer().getUniqueId())) { - sendMessage(t(Messages.CANT_QUIT_AS_LEADER)); - return; + return sendMessage(t(Messages.CANT_QUIT_AS_LEADER)); } sendMessage(t(Messages.QUIT_NATION, nation)); nation.removeMember(getPlayer().getUniqueId()); + + return true; } - private void list(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { + private boolean list(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { sendMessage(t(Messages.LIST_HEADER)); if (NationManager.nations.isEmpty()) { - sendMessage(t(Messages.NO_NATIONS)); - return; + return sendMessage(t(Messages.NO_NATIONS)); } for (Nation nation : NationManager.nations.values()) { sendMessage(t(Messages.LIST_ITEM, nation)); } + return true; } - private void forceDelete(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { + private boolean forceDelete(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { if (!sender.hasPermission("nations.admin") && !sender.isOp() && !sender.hasPermission("nations.forceDelete")) { - sendMessage(t(Messages.NO_PERMISSION)); - return; + return sendMessage(t(Messages.NO_PERMISSION)); } if (args.length <= 1) { - sendMessage(t(Messages.USAGE, label, "force-delete", "")); - return; + return sendMessage(t(Messages.USAGE, label, "force-delete", "")); } Nation nation = Nations.getNationManager().get(args[1]); if (nation == null) { - sendMessage(t(Messages.NATION_NOT_FOUND, args[1])); - return; + return sendMessage(t(Messages.NATION_NOT_FOUND, args[1])); } Nations.getNationManager().remove(nation); - sendMessage(t(Messages.NATION_DELETED, nation)); + return sendMessage(t(Messages.NATION_DELETED, nation)); } - private void reload(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { + private boolean reload(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { if (!sender.hasPermission("nations.admin") && !sender.isOp() && !sender.hasPermission("nations.reload")) { - sendMessage(t(Messages.NO_PERMISSION)); - return; + return sendMessage(t(Messages.NO_PERMISSION)); } if (args.length > 1) { - sendMessage(t(Messages.USAGE, label, "reload", "")); - return; + return sendMessage(t(Messages.USAGE, label, "reload", "")); } Nations.getPlugin(Nations.class).reloadConfig(); Messages.load(); - sendMessage(t(Messages.RELOADED)); + return sendMessage(t(Messages.RELOADED)); } - private void kick(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { + private boolean kick(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { if (args.length <= 1) { - sendMessage(t(Messages.USAGE, label, "kick", "")); - return; + return sendMessage(t(Messages.USAGE, label, "kick", "")); } Nation nation = NationManager.getPlayerNation(getPlayer().getUniqueId()); if (nation == null) { - sendMessage(t(Messages.NOT_IN_NATION)); - return; + return sendMessage(t(Messages.NOT_IN_NATION)); } if (!nation.leader.equals(getPlayer().getUniqueId())) { - sendMessage(t(Messages.NOT_LEADER)); - return; + return sendMessage(t(Messages.NOT_LEADER)); } Player player = Bukkit.getPlayer(args[1]); if (player == null) { - sendMessage(t(Messages.PLAYER_NOT_FOUND, args[1])); - return; + return sendMessage(t(Messages.PLAYER_NOT_FOUND, args[1])); } if (!nation.members.contains(player.getUniqueId())) { - sendMessage(t(Messages.PLAYER_NOT_IN_NATION, player)); - return; + return sendMessage(t(Messages.PLAYER_NOT_IN_NATION, player)); } nation.removeMember(player.getUniqueId()); sendMessage(t(Messages.YOU_HAVE_KICKED, player)); - sendMessage(player, t(Messages.YOU_HAVE_BEEN_KICKED, nation)); + return sendMessage(player, t(Messages.YOU_HAVE_BEEN_KICKED, nation)); } - private void invite(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { + private boolean invite(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { if (args.length <= 1) { - sendMessage(t(Messages.USAGE, label, "invite", "")); - return; + return sendMessage(t(Messages.USAGE, label, "invite", "")); } Nation nation = NationManager.getPlayerNation(getPlayer().getUniqueId()); if (nation == null) { - sendMessage(t(Messages.NOT_IN_NATION)); - return; + return sendMessage(t(Messages.NOT_IN_NATION)); } if (!nation.leader.equals(getPlayer().getUniqueId())) { - sendMessage(t(Messages.NOT_LEADER)); - return; + return sendMessage(t(Messages.NOT_LEADER)); } Player player = Bukkit.getPlayer(args[1]); if (player == null) { - sendMessage(t(Messages.PLAYER_NOT_FOUND, args[1])); - return; + return sendMessage(t(Messages.PLAYER_NOT_FOUND, args[1])); } Nation inviteeNation = NationManager.getPlayerNation(player.getUniqueId()); if (inviteeNation != null) { - sendMessage(t(Messages.PLAYER_ALREADY_IN_NATION, player)); - return; + return sendMessage(t(Messages.PLAYER_ALREADY_IN_NATION, player)); } if (nation.invited.contains(player.getUniqueId())) { - sendMessage(t(Messages.PLAYER_ALREADY_INVITED, player)); - return; + return sendMessage(t(Messages.PLAYER_ALREADY_INVITED, player)); } nation.addInvited(player.getUniqueId()); sendMessage(t(Messages.INVITED_PLAYER, player)); - sendMessage(player, t(Messages.YOU_HAVE_BEEN_INVITED, nation)); + return sendMessage(player, t(Messages.YOU_HAVE_BEEN_INVITED, nation)); } - public void newNation(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { + public boolean newNation(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { if (args.length <= 1) { - sendMessage(t(Messages.USAGE, label, "create", "")); - return; + return sendMessage(t(Messages.USAGE, label, "create", "")); } if (NationManager.isInNation((Player) sender)) { - sendMessage(t(Messages.ALREADY_IN_NATION)); - return; + return sendMessage(t(Messages.ALREADY_IN_NATION)); } String name = args[1]; // check if name is valid (ascii) if (!name.matches("^[a-zA-Z0-9]*$") || name.length() > 16) { - sendMessage(t(Messages.INVALID_NAME)); - return; + return sendMessage(t(Messages.INVALID_NAME)); } // create nation @@ -373,7 +339,7 @@ public void newNation(@NotNull CommandSender sender, @NotNull String label, @Not Nations.getNationManager().add(nation); // send message - sendMessage(t(Messages.NEW_NATION, nation)); + return sendMessage(t(Messages.NEW_NATION, nation)); } @Override diff --git a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java index ad85eaa..0dd73bb 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java @@ -14,7 +14,7 @@ public class BaseCommand implements CommandExecutor, TabCompleter { private @Nullable CommandSender sender; - public void execute(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { + public boolean execute(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { throw new UnsupportedOperationException("Not implemented yet"); } @@ -49,10 +49,11 @@ public Player getPlayer() { * * @param message The message to send */ - public void sendMessage(@NotNull Component message) { + public boolean sendMessage(@NotNull Component message) { if (this.sender != null) { this.sender.sendMessage(message); } + return true; } /** @@ -61,8 +62,9 @@ public void sendMessage(@NotNull Component message) { * @param player The player to send the message to * @param message The message to send */ - public void sendMessage(@NotNull Player player, @NotNull Component message) { + public boolean sendMessage(@NotNull Player player, @NotNull Component message) { player.sendMessage(message); + return true; } @Override diff --git a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java index f1e2520..25be505 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java @@ -78,6 +78,10 @@ public static boolean isNationLeader(@NotNull UUID uuid) { return nation.leader.equals(uuid); } + public static List getNationInvites(Nation nation) { + return nation.invited.stream().map(uuid -> Nations.getPlugin(Nations.class).getServer().getPlayer(uuid)).toList(); + } + /** * Add a nation * @@ -157,10 +161,6 @@ public List getNationsInviting(UUID uuid) { return nations.values().stream().filter(nation -> nation.invited.contains(uuid)).map(nation -> nation.name).toList(); } - public static List getNationInvites(Nation nation) { - return nation.invited.stream().map(uuid -> Nations.getPlugin(Nations.class).getServer().getPlayer(uuid)).toList(); - } - /** * Load nations from the config */ From 2769a567114a9228074455d294afdd49a449a3d9 Mon Sep 17 00:00:00 2001 From: km127pl Date: Fri, 12 Jan 2024 22:38:40 +0100 Subject: [PATCH 46/49] OP's already have the permission --- .../pro/cloudnode/smp/nations/commands/NationsCommand.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index 491d46f..665bda2 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -225,7 +225,7 @@ private boolean list(@NotNull CommandSender sender, @NotNull String label, @NotN } private boolean forceDelete(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { - if (!sender.hasPermission("nations.admin") && !sender.isOp() && !sender.hasPermission("nations.forceDelete")) { + if (!sender.hasPermission("nations.admin") && !sender.hasPermission("nations.forceDelete")) { return sendMessage(t(Messages.NO_PERMISSION)); } @@ -243,7 +243,7 @@ private boolean forceDelete(@NotNull CommandSender sender, @NotNull String label } private boolean reload(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { - if (!sender.hasPermission("nations.admin") && !sender.isOp() && !sender.hasPermission("nations.reload")) { + if (!sender.hasPermission("nations.admin") && !sender.hasPermission("nations.reload")) { return sendMessage(t(Messages.NO_PERMISSION)); } if (args.length > 1) { From c4fc1b3cdb83e0bb5b8d0154270eef157fd667b2 Mon Sep 17 00:00:00 2001 From: km127pl Date: Fri, 12 Jan 2024 22:44:23 +0100 Subject: [PATCH 47/49] remove unused --- .../pro/cloudnode/smp/nations/Nations.java | 20 +--------- .../smp/nations/util/BaseCommand.java | 3 +- .../cloudnode/smp/nations/util/Nation.java | 9 ----- .../smp/nations/util/NationManager.java | 40 +------------------ 4 files changed, 4 insertions(+), 68 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/Nations.java b/src/main/java/pro/cloudnode/smp/nations/Nations.java index 5c02bc2..9b48b9a 100644 --- a/src/main/java/pro/cloudnode/smp/nations/Nations.java +++ b/src/main/java/pro/cloudnode/smp/nations/Nations.java @@ -30,25 +30,7 @@ public final class Nations extends JavaPlugin { public static @NotNull Component t(@NotNull Messages message, @NotNull Object... args) { return MiniMessage.miniMessage().deserialize(message.replacePlaceholders(args)); } - - /** - * Translate a message to a string and replace placeholders - * - * @param message the message to translate - * @param args the arguments to replace placeholders with - * @return the translated string - */ - public static @NotNull String ts(@NotNull Messages message, @NotNull Object... args) { - return message.replacePlaceholders(args); - } - - /** - * Get the plugin instance - */ - public static @NotNull Nations getPlugin() { - return Nations.getPlugin(Nations.class); - } - + @Override public void onEnable() { // save messages.yml if it doesn't exist diff --git a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java index 0dd73bb..edcd3e3 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/BaseCommand.java @@ -21,8 +21,7 @@ public boolean execute(@NotNull CommandSender sender, @NotNull String label, @No @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { this.sender = sender; - execute(sender, label, args); - return true; + return execute(sender, label, args); } /** diff --git a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java index 014bdd1..366483e 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/Nation.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/Nation.java @@ -17,15 +17,6 @@ public class Nation { public @NotNull ArrayList invited; public @NotNull String color; - public Nation(@NotNull UUID uuid, @NotNull String name, @NotNull UUID leader, @NotNull ArrayList members, @NotNull ArrayList invited, @NotNull String color) { - this.uuid = uuid; - this.name = name; - this.leader = leader; - this.members = members; - this.invited = invited; - this.color = color; - } - public Nation(@NotNull String name, @NotNull UUID leader) { this.uuid = UUID.randomUUID(); this.name = name; diff --git a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java index 25be505..c3d4770 100644 --- a/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java +++ b/src/main/java/pro/cloudnode/smp/nations/util/NationManager.java @@ -103,16 +103,6 @@ public void remove(Nation nation) { updatePlayersName(leader); } - /** - * Get a nation by UUID - * - * @param uuid The UUID of the nation - * @return The nation, or null if not found - */ - public Nation get(UUID uuid) { - return nations.get(uuid); - } - /** * Get a nation by name * @@ -138,9 +128,7 @@ public void save() { // save nations YamlConfiguration config = new YamlConfiguration(); if (!nations.isEmpty()) { - nations.forEach((uuid, nation) -> { - nation.save(config); - }); + nations.forEach((uuid, nation) -> nation.save(config)); } // write to plugins/Nations/nations.yml @@ -169,33 +157,9 @@ public void load() { if (file.exists()) { FileConfiguration config = YamlConfiguration.loadConfiguration(file); if (config.getConfigurationSection("nations") != null) { - Objects.requireNonNull(config.getConfigurationSection("nations")).getKeys(false).forEach(key -> { - add(new Nation(key, config)); - }); + Objects.requireNonNull(config.getConfigurationSection("nations")).getKeys(false).forEach(key -> add(new Nation(key, config))); } } } - /** - * Check if a player is the leader of a nation - * - * @param uuid The UUID of the player - * @return Whether the player is the leader of a nation - */ - public boolean isLeader(UUID uuid) { - if (!isInNation(uuid)) return false; - return Objects.requireNonNull(getPlayerNation(uuid)).leader.equals(uuid); - } - - /** - * Check if a player is the leader of a nation - * - * @param player The player - * @return Whether the player is the leader of a nation - */ - public boolean isLeader(Player player) { - if (!isInNation(player)) return false; - return isLeader(player.getUniqueId()); - } - } From 98ebea2d08f836f6b837e1322f715a60b634aa66 Mon Sep 17 00:00:00 2001 From: km127pl Date: Fri, 12 Jan 2024 22:45:45 +0100 Subject: [PATCH 48/49] missing space --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index bc8ada1..7af44ee 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -2,7 +2,7 @@ name: JavaDocs on: push: - branches: [ main] + branches: [ main ] workflow_dispatch: permissions: From 89d361d300f30dbd2b1c9aaf654401680e330aaf Mon Sep 17 00:00:00 2001 From: km127pl Date: Sun, 21 Jan 2024 12:07:03 +0100 Subject: [PATCH 49/49] add plugin version info at no arguments --- .../pro/cloudnode/smp/nations/Nations.java | 15 +++++++++++++ .../smp/nations/commands/NationsCommand.java | 21 ++++--------------- .../smp/nations/locale/Messages.java | 3 ++- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/main/java/pro/cloudnode/smp/nations/Nations.java b/src/main/java/pro/cloudnode/smp/nations/Nations.java index 9b48b9a..9966d79 100644 --- a/src/main/java/pro/cloudnode/smp/nations/Nations.java +++ b/src/main/java/pro/cloudnode/smp/nations/Nations.java @@ -3,6 +3,7 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import pro.cloudnode.smp.nations.commands.NationsCommand; import pro.cloudnode.smp.nations.listeners.ChatMessageListener; @@ -56,4 +57,18 @@ public void onEnable() { public void onDisable() { nationManager.save(); } + + public static Nations getInstance() { + return getPlugin(Nations.class); + } + + @ApiStatus.Experimental + public static String getVersion() { + return getInstance().getPluginMeta().getVersion(); + } + + @ApiStatus.Experimental + public static String getMinecraftVersion() { + return getInstance().getPluginMeta().getAPIVersion(); + } } diff --git a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java index 665bda2..e68b321 100644 --- a/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java +++ b/src/main/java/pro/cloudnode/smp/nations/commands/NationsCommand.java @@ -78,23 +78,10 @@ private boolean cancelInvite(@NotNull CommandSender sender, @NotNull String labe // help for each command private boolean help(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { - if (args.length <= 1) { - // list of commands - sendMessage(t(Messages.COMMANDS_HEADER)); - sendMessage(t(Messages.COMMANDS_ITEM, "create", "", "create a new nation")); - sendMessage(t(Messages.COMMANDS_ITEM, "invite", "", "invite a player to your nation")); - sendMessage(t(Messages.COMMANDS_ITEM, "kick", "", "kick a player from your nation")); - sendMessage(t(Messages.COMMANDS_ITEM, "list", "", "list all nations")); - sendMessage(t(Messages.COMMANDS_ITEM, "quit", "", "quit your nation")); - sendMessage(t(Messages.COMMANDS_ITEM, "info", "", "get info about your nation")); - sendMessage(t(Messages.COMMANDS_ITEM, "option", " ", "set options for your nation")); - sendMessage(t(Messages.COMMANDS_ITEM, "join", "", "join a nation")); - sendMessage(t(Messages.COMMANDS_ITEM, "help", "", "show this help message")); - sendMessage(t(Messages.COMMANDS_ITEM, "cancel-invite", "", "cancel an invite to your nation")); - if (sender.hasPermission("nations.admin")) { - sendMessage(t(Messages.COMMANDS_ITEM, "force-delete", "", "force delete a nation")); - sendMessage(t(Messages.COMMANDS_ITEM, "reload", "", "reload the plugin")); - } + // send plugin info + if (args.length == 0) { + sendMessage(t(Messages.PLUGIN_INFO, Nations.getVersion(), Nations.getMinecraftVersion())); + return true; } switch (args[1]) { diff --git a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java index 17931f9..a930234 100644 --- a/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java +++ b/src/main/java/pro/cloudnode/smp/nations/locale/Messages.java @@ -62,7 +62,8 @@ public enum Messages { PLAYER_JOIN_SERVER("player-join-server", "[+] () "), PLAYER_LEAVE_SERVER("player-leave-server", "[-] () "), PLAYER_NOT_INVITED("player-not-invited", "(!) Player is not invited to your nation."), - CANCELED_INVITE("canceled-invite", "You have canceled the invite for "); + CANCELED_INVITE("canceled-invite", "You have canceled the invite for "), + PLUGIN_INFO("plugin-info", "Running SMPNations, v$0 for $1"); public final String key;