|
20 | 20 | public final class NationCommand extends Command { |
21 | 21 |
|
22 | 22 | @Override |
23 | | - public boolean run(final @NotNull CommandSender sender, final @NotNull String label, final @NotNull String @NotNull [] args) { |
| 23 | + public boolean run( |
| 24 | + final @NotNull CommandSender sender, |
| 25 | + final @NotNull String label, |
| 26 | + @NotNull String @NotNull [] args |
| 27 | + ) { |
24 | 28 | if (!sender.hasPermission(Permission.NATION)) |
25 | 29 | return sendMessage(sender, SMPCore.messages().errorNoPermission()); |
26 | | - if (!(sender instanceof final @NotNull Player player)) |
27 | | - return sendMessage(sender, SMPCore.messages().errorNotPlayer()); |
28 | | - final @NotNull Optional<@NotNull Member> member = Member.get(player); |
29 | | - if (member.isEmpty()) |
30 | | - return sendMessage(sender, SMPCore.messages().errorNotMember()); |
31 | 30 |
|
32 | | - if (args.length == 0) return helpSubCommands(member.get(), sender, label); |
33 | | - final @NotNull String command = label + " " + args[0]; |
| 31 | + final @NotNull Optional<@NotNull Member> member = sender instanceof final @NotNull Player player ? Member.get( |
| 32 | + player) : Optional.empty(); |
| 33 | + |
| 34 | + final @NotNull Optional<@NotNull Nation> nation; |
| 35 | + if (args.length > 0 && args[0].startsWith("id:")) { |
| 36 | + final @NotNull String id = args[0].substring(3); |
| 37 | + nation = Nation.get(id); |
| 38 | + args = Arrays.copyOfRange(args, 1, args.length); |
| 39 | + if (nation.isEmpty()) |
| 40 | + return sendMessage(sender, SMPCore.messages().nationNotFound(id)); |
| 41 | + } |
| 42 | + else |
| 43 | + nation = member.flatMap(Member::nation); |
| 44 | + |
| 45 | + if (args.length == 0) |
| 46 | + return helpSubCommands(member.orElse(null), nation.orElse(null), sender, label); |
| 47 | + |
| 48 | + final boolean other = member.isEmpty() || nation.isEmpty() || !nation.get().id.equals(member.get().nationID); |
| 49 | + final @NotNull String command = label + (other && nation.isPresent() ? " id:" + nation.get().id : "") + " " |
| 50 | + + args[0]; |
34 | 51 | final @NotNull String @NotNull [] argsSubset = Arrays.copyOfRange(args, 1, args.length); |
35 | 52 | switch (args[0]) { |
36 | | - case "members": return members(member.get(), sender, command, argsSubset); |
37 | | - default: return helpSubCommands(member.get(), sender, label); |
| 53 | + case "members": |
| 54 | + return members(member.orElse(null), nation.orElse(null), sender, command, argsSubset); |
| 55 | + default: |
| 56 | + return helpSubCommands(member.orElse(null), nation.orElse(null), sender, label); |
38 | 57 | } |
39 | 58 | } |
40 | 59 |
|
41 | 60 | @Override |
42 | | - public @Nullable List<@NotNull String> tab(final @NotNull CommandSender sender, final @NotNull String label, final @NotNull String @NotNull [] args) { |
| 61 | + public @Nullable List<@NotNull String> tab( |
| 62 | + final @NotNull CommandSender sender, |
| 63 | + final @NotNull String label, |
| 64 | + final @NotNull String @NotNull [] args |
| 65 | + ) { |
43 | 66 | return List.of(); |
44 | 67 | } |
45 | 68 |
|
46 | | - public boolean helpSubCommands(final @NotNull Member member, final @NotNull CommandSender sender, final @NotNull String label) { |
47 | | - final @NotNull String command = "/" + label; |
| 69 | + public boolean helpSubCommands( |
| 70 | + final @Nullable Member member, |
| 71 | + final @Nullable Nation nation, |
| 72 | + final @NotNull CommandSender sender, |
| 73 | + final @NotNull String label |
| 74 | + ) { |
| 75 | + final boolean other = member == null || nation == null || !nation.id.equals(member.nationID); |
| 76 | + |
| 77 | + final @NotNull String command = "/" + label + (other && nation != null ? " id:" + nation.id : ""); |
48 | 78 | final @NotNull TextComponent.Builder subCommandBuilder = Component.text() |
49 | | - .append(SMPCore.messages().subCommandHeader("Nation", command + " ...")).append(Component.newline()); |
50 | | - if (member.nationID != null && ( |
51 | | - sender.hasPermission(Permission.NATION_MEMBERS_LIST) |
52 | | - || sender.hasPermission(Permission.NATION_MEMBERS_KICK) |
53 | | - )) subCommandBuilder.append(Component.newline()).append(SMPCore.messages() |
54 | | - .subCommandEntry(command + " members ", "members")); |
| 79 | + .append(SMPCore.messages().subCommandHeader("Nation", command + " ...")) |
| 80 | + .append(Component.newline()); |
| 81 | + |
| 82 | + if (nation != null) { |
| 83 | + if (( |
| 84 | + !other && hasAnyPermission(sender, Permission.NATION_MEMBERS_LIST, Permission.NATION_MEMBERS_KICK) |
| 85 | + ) || hasAnyPermission(sender, Permission.NATION_MEMBERS_LIST_OTHER, Permission.NATION_MEMBERS_KICK_OTHER)) |
| 86 | + subCommandBuilder.append(Component.newline()) |
| 87 | + .append(SMPCore.messages().subCommandEntry(command + " members ", "members")); |
| 88 | + } |
| 89 | + |
55 | 90 | return sendMessage(sender, subCommandBuilder.build()); |
56 | 91 | } |
57 | 92 |
|
58 | | - public boolean members(final @NotNull Member member, final @NotNull CommandSender sender, final @NotNull String label, final @NotNull String @NotNull [] args) { |
59 | | - if (args.length == 0) return membersSubcommand(sender, "/" + label); |
| 93 | + public boolean members( |
| 94 | + final @Nullable Member member, |
| 95 | + final @Nullable Nation nation, |
| 96 | + final @NotNull CommandSender sender, |
| 97 | + final @NotNull String label, |
| 98 | + final @NotNull String @NotNull [] args |
| 99 | + ) { |
| 100 | + if (nation == null) |
| 101 | + return sendMessage(sender, SMPCore.messages().errorNotInNation()); |
| 102 | + |
| 103 | + if (args.length == 0) |
| 104 | + return membersSubcommand(member, nation, sender, "/" + label); |
60 | 105 | final @NotNull String command = label + " " + args[0]; |
61 | 106 | final @NotNull String @NotNull [] argsSubset = Arrays.copyOfRange(args, 1, args.length); |
62 | 107 | return switch (args[0]) { |
63 | | - case "list" -> listMembers(member, sender); |
64 | | - case "kick" -> kickMember(member, sender, command, argsSubset); |
65 | | - default -> membersSubcommand(sender, "/" + label); |
| 108 | + case "list" -> listMembers(member, nation, sender); |
| 109 | + case "kick" -> kickMember(member, nation, sender, command, argsSubset); |
| 110 | + default -> membersSubcommand(member, nation, sender, "/" + label); |
66 | 111 | }; |
67 | 112 | } |
68 | 113 |
|
69 | | - public boolean membersSubcommand(final @NotNull CommandSender sender, final @NotNull String label) { |
| 114 | + public boolean membersSubcommand( |
| 115 | + final @Nullable Member member, |
| 116 | + final @NotNull Nation nation, |
| 117 | + final @NotNull CommandSender sender, |
| 118 | + final @NotNull String label |
| 119 | + ) { |
| 120 | + final boolean other = member == null || !nation.id.equals(member.nationID); |
| 121 | + |
70 | 122 | final @NotNull TextComponent.Builder subCommandBuilder = Component.text() |
71 | | - .append(SMPCore.messages().subCommandHeader("Nation Members", label + " ...")).append(Component.newline()); |
72 | | - if (sender.hasPermission(Permission.NATION_MEMBERS_LIST)) subCommandBuilder.append(Component.newline()).append(SMPCore.messages() |
73 | | - .subCommandEntry(label + " list ", "list")); |
74 | | - if (sender.hasPermission(Permission.NATION_MEMBERS_KICK)) subCommandBuilder.append(Component.newline()).append(SMPCore.messages() |
75 | | - .subCommandEntry(label + " kick ", "kick", Messages.SubCommandArgument.of(new Messages.SubCommandArgument("member", true)), "remove a member from the nation")); |
| 123 | + .append(SMPCore.messages().subCommandHeader("Nation Members", label + " ...")) |
| 124 | + .append(Component.newline()); |
| 125 | + |
| 126 | + if ((!other && sender.hasPermission(Permission.NATION_MEMBERS_LIST)) |
| 127 | + || sender.hasPermission(Permission.NATION_MEMBERS_LIST_OTHER)) |
| 128 | + subCommandBuilder.append(Component.newline()) |
| 129 | + .append(SMPCore.messages().subCommandEntry(label + " list ", "list", "List nation members.")); |
| 130 | + |
| 131 | + if ((!other && sender.hasPermission(Permission.NATION_MEMBERS_KICK)) |
| 132 | + || sender.hasPermission(Permission.NATION_MEMBERS_KICK_OTHER)) |
| 133 | + subCommandBuilder.append(Component.newline()).append(SMPCore.messages().subCommandEntry( |
| 134 | + label + " kick ", "kick", new Messages.SubCommandArgument[]{ |
| 135 | + new Messages.SubCommandArgument("member", true) |
| 136 | + }, "Kick a member from the nation." |
| 137 | + )); |
| 138 | + |
76 | 139 | return sendMessage(sender, subCommandBuilder.build()); |
77 | 140 | } |
78 | 141 |
|
79 | | - public boolean listMembers(final @NotNull Member member, final @NotNull CommandSender sender) { |
80 | | - if (!sender.hasPermission(Permission.NATION_MEMBERS_LIST)) |
| 142 | + public boolean listMembers( |
| 143 | + final @Nullable Member member, |
| 144 | + final @NotNull Nation nation, |
| 145 | + final @NotNull CommandSender sender |
| 146 | + ) { |
| 147 | + if (!sender.hasPermission(Permission.NATION_MEMBERS_LIST_OTHER) && ( |
| 148 | + member == null || !nation.id.equals(member.nationID) |
| 149 | + || !sender.hasPermission(Permission.NATION_MEMBERS_LIST) |
| 150 | + )) |
81 | 151 | return sendMessage(sender, SMPCore.messages().errorNoPermission()); |
82 | | - |
83 | | - final @NotNull Optional<@NotNull Nation> nation = member.nation(); |
84 | | - if (nation.isEmpty()) |
85 | | - return sendMessage(sender, SMPCore.messages().errorNotInNation()); |
86 | | - |
87 | | - return sendMessage(sender, SMPCore.messages().nationMembersList(nation.get(), sender)); |
| 152 | + else |
| 153 | + return sendMessage(sender, SMPCore.messages().nationMembersList(nation, sender)); |
88 | 154 | } |
89 | 155 |
|
90 | | - public boolean kickMember(final @NotNull Member member, final @NotNull CommandSender sender, final @NotNull String label, final @NotNull String @NotNull [] args) { |
91 | | - if (!sender.hasPermission(Permission.NATION_MEMBERS_KICK)) |
| 156 | + public boolean kickMember( |
| 157 | + final @Nullable Member member, |
| 158 | + final @NotNull Nation nation, |
| 159 | + final @NotNull CommandSender sender, |
| 160 | + final @NotNull String label, |
| 161 | + final @NotNull String @NotNull [] args |
| 162 | + ) { |
| 163 | + if (!sender.hasPermission(Permission.NATION_MEMBERS_KICK_OTHER) && ( |
| 164 | + member == null || !nation.id.equals(member.nationID) |
| 165 | + || !sender.hasPermission(Permission.NATION_MEMBERS_KICK) |
| 166 | + )) |
92 | 167 | return sendMessage(sender, SMPCore.messages().errorNoPermission()); |
93 | | - final @NotNull Optional<@NotNull Nation> nation = member.nation(); |
94 | | - if (nation.isEmpty()) |
95 | | - return sendMessage(sender, SMPCore.messages().errorNotInNation()); |
96 | | - if (args.length == 0) return sendMessage(sender, SMPCore.messages().usage(label, "kick <member>")); |
| 168 | + |
| 169 | + if (args.length == 0) |
| 170 | + return sendMessage(sender, SMPCore.messages().usage(label, "kick <member>")); |
| 171 | + |
97 | 172 | final @NotNull OfflinePlayer target = sender.getServer().getOfflinePlayer(args[0]); |
98 | 173 | final @NotNull Optional<@NotNull Member> targetMemberOptional = Member.get(target); |
99 | 174 | if (targetMemberOptional.isEmpty()) |
100 | 175 | return sendMessage(sender, SMPCore.messages().errorNotMember(target)); |
| 176 | + |
101 | 177 | final @NotNull Member targetMember = targetMemberOptional.get(); |
102 | 178 | if (targetMember.nationID == null || !targetMember.nationID.equals(member.nationID)) |
103 | 179 | return sendMessage(sender, SMPCore.messages().errorMemberNotYourNation(targetMember)); |
104 | | - if (targetMember.uuid.equals(nation.get().leaderUUID) || targetMember.uuid.equals(nation.get().viceLeaderUUID)) |
| 180 | + if (targetMember.uuid.equals(nation.leaderUUID) || targetMember.uuid.equals(nation.viceLeaderUUID)) |
105 | 181 | return sendMessage(sender, SMPCore.messages().errorKickLeadership()); |
106 | 182 |
|
107 | | - nation.get().remove(targetMember); |
| 183 | + nation.remove(targetMember); |
108 | 184 | return sendMessage(sender, SMPCore.messages().nationMembersKicked(targetMember)); |
109 | 185 | } |
110 | 186 | } |
0 commit comments