Skip to content

Commit 549eaba

Browse files
committed
list nation members
1 parent ebec880 commit 549eaba

File tree

4 files changed

+163
-15
lines changed

4 files changed

+163
-15
lines changed

src/main/java/pro/cloudnode/smp/smpcore/Messages.java

Lines changed: 95 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@
66
import net.kyori.adventure.text.minimessage.tag.resolver.Formatter;
77
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
88
import org.bukkit.OfflinePlayer;
9+
import org.bukkit.permissions.Permissible;
910
import org.jetbrains.annotations.NotNull;
1011
import org.jetbrains.annotations.Nullable;
1112

1213
import java.time.ZoneOffset;
14+
import java.util.ArrayList;
1315
import java.util.Arrays;
1416
import java.util.Calendar;
1517
import java.util.Date;
@@ -187,7 +189,7 @@ public Messages() {
187189
.deserialize(Objects.requireNonNull(config.getString(member.isActive() ? "nation.members.status.active" : "nation.members.status.inactive")));
188190
}
189191

190-
public @NotNull Component nationMembersList(final @NotNull Nation nation) {
192+
public @NotNull Component nationMembersList(final @NotNull Nation nation, final @NotNull Permissible sender) {
191193
final @NotNull HashSet<@NotNull Member> members = nation.members();
192194
final @NotNull Component header = MiniMessage.miniMessage()
193195
.deserialize(Objects.requireNonNull(config.getString("nation.members.list.header"))
@@ -198,7 +200,98 @@ public Messages() {
198200
Placeholder.unparsed("nation-inactive-members", members.stream().filter(m -> !m.isActive()).count() + ""),
199201
Placeholder.unparsed("nation-total-members", members.size() + "")
200202
);
201-
return header;
203+
204+
final @NotNull List<@NotNull Component> list = new ArrayList<>();
205+
206+
final @NotNull Member leader = members.stream().filter(m -> m.uuid.equals(nation.leaderUUID)).findFirst().orElseThrow(IllegalStateException::new);
207+
list.add(nationMembersListEntry(nation, leader, sender));
208+
209+
final @NotNull Member vice = members.stream().filter(m -> m.uuid.equals(nation.viceLeaderUUID)).findFirst().orElseThrow(IllegalStateException::new);
210+
if (!vice.uuid.equals(leader.uuid))
211+
list.add(nationMembersListEntry(nation, vice, sender));
212+
213+
final @NotNull List<@NotNull Component> citizens = members.stream().filter(m -> !m.uuid.equals(leader.uuid) && !m.uuid.equals(vice.uuid) && m.isActive()).map(m -> nationMembersListEntry(nation, m, sender)).toList();
214+
list.addAll(citizens);
215+
216+
final @NotNull List<@NotNull Component> inactive = members.stream().filter(m -> !m.uuid.equals(leader.uuid) && !m.uuid.equals(vice.uuid) && !m.isActive()).map(m -> nationMembersListEntry(nation, m, sender)).toList();
217+
list.addAll(inactive);
218+
219+
final @NotNull TextComponent.Builder listComponent = Component.text();
220+
for (int i = 0; i < list.size(); i++) {
221+
listComponent.append(list.get(i));
222+
if (i + 1 < list.size()) listComponent.append(Component.newline());
223+
}
224+
225+
return Component.text().append(header).append(Component.newline()).append(listComponent.build()).build();
226+
}
227+
228+
private @NotNull Component nationMembersListEntry(final @NotNull Nation nation, final @NotNull Member member, final @NotNull Permissible sender) {
229+
if (member.uuid.equals(nation.leaderUUID)) {
230+
return MiniMessage.miniMessage()
231+
.deserialize(Objects.requireNonNull(config.getString("nation.members.list.entry.leader"))
232+
.replaceAll("<color>", "<#" + nation.color + ">")
233+
.replaceAll("</color>", "</#" + nation.color + ">")
234+
.replaceAll("<member-name>", Optional.ofNullable(member.player().getName()).orElse(member.uuid.toString())),
235+
Placeholder.component("member-status", nationMembersStatus(member)),
236+
Placeholder.component("buttons", nationMembersListButtons(nation, member, sender))
237+
);
238+
}
239+
if (member.uuid.equals(nation.viceLeaderUUID)) {
240+
return MiniMessage.miniMessage()
241+
.deserialize(Objects.requireNonNull(config.getString("nation.members.list.entry.vice"))
242+
.replaceAll("<color>", "<#" + nation.color + ">")
243+
.replaceAll("</color>", "</#" + nation.color + ">")
244+
.replaceAll("<member-name>", Optional.ofNullable(member.player().getName()).orElse(member.uuid.toString())),
245+
Placeholder.component("member-status", nationMembersStatus(member)),
246+
Placeholder.component("buttons", nationMembersListButtons(nation, member, sender))
247+
);
248+
}
249+
if (member.isActive()) {
250+
return MiniMessage.miniMessage()
251+
.deserialize(Objects.requireNonNull(config.getString("nation.members.list.entry.citizen"))
252+
.replaceAll("<color>", "<#" + nation.color + ">")
253+
.replaceAll("</color>", "</#" + nation.color + ">")
254+
.replaceAll("<member-name>", Optional.ofNullable(member.player().getName()).orElse(member.uuid.toString())),
255+
Placeholder.component("member-status", nationMembersStatus(member)),
256+
Placeholder.component("buttons", nationMembersListButtons(nation, member, sender))
257+
);
258+
}
259+
return MiniMessage.miniMessage()
260+
.deserialize(Objects.requireNonNull(config.getString("nation.members.list.entry.inactive-citizen"))
261+
.replaceAll("<color>", "<#" + nation.color + ">")
262+
.replaceAll("</color>", "</#" + nation.color + ">")
263+
.replaceAll("<member-name>", Optional.ofNullable(member.player().getName()).orElse(member.uuid.toString())),
264+
Placeholder.component("member-status", nationMembersStatus(member)),
265+
Placeholder.component("buttons", nationMembersListButtons(nation, member, sender))
266+
);
267+
}
268+
269+
private @NotNull Component nationMembersListButtons(final @NotNull Nation nation, final @NotNull Member member, final @NotNull Permissible sender) {
270+
final @NotNull List<@NotNull Component> buttons = new ArrayList<>();
271+
if (sender.hasPermission(Permission.NATION_MEMBERS_KICK) && !(member.uuid.equals(nation.leaderUUID) || member.uuid.equals(nation.viceLeaderUUID)))
272+
buttons.add(nationMembersListButton("kick", nation, member));
273+
if (sender.hasPermission(Permission.NATION_VICE_DEMOTE) && member.uuid.equals(nation.viceLeaderUUID) && !member.uuid.equals(nation.leaderUUID))
274+
buttons.add(nationMembersListButton("demote", nation, member));
275+
if (sender.hasPermission(Permission.NATION_VICE_PROMOTE) && nation.viceLeaderUUID.equals(nation.leaderUUID) && !(member.uuid.equals(nation.leaderUUID) || member.uuid.equals(nation.viceLeaderUUID)) && member.isActive())
276+
buttons.add(nationMembersListButton("promote", nation, member));
277+
278+
final @NotNull TextComponent.Builder buttonsComponent = Component.text();
279+
if (!buttons.isEmpty()) buttonsComponent.append(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("nation.members.list.buttons.prefix"))));
280+
for (int i = 0; i < buttons.size(); i++) {
281+
buttonsComponent.append(buttons.get(i));
282+
if (i + 1 < buttons.size()) buttonsComponent.append(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("nation.members.list.buttons.separator"))));
283+
}
284+
if (!buttons.isEmpty()) buttonsComponent.append(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("nation.members.list.buttons.suffix"))));
285+
286+
return Component.text().append(buttonsComponent.build()).build();
287+
}
288+
289+
private @NotNull Component nationMembersListButton(final @NotNull String button, final @NotNull Nation nation, final @NotNull Member member) {
290+
return MiniMessage.miniMessage()
291+
.deserialize(Objects.requireNonNull(config.getString("nation.members.list.buttons." + button))
292+
.replaceAll("<color>", "<#" + nation.color + ">")
293+
.replaceAll("</color>", "</#" + nation.color + ">")
294+
.replaceAll("<member-name>", Optional.ofNullable(member.player().getName()).orElse(member.uuid.toString())));
202295
}
203296

204297
// errors

src/main/java/pro/cloudnode/smp/smpcore/Permission.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,19 @@ public final class Permission {
6666
* List the members of your nation
6767
*/
6868
public static @NotNull String NATION_MEMBERS_LIST = "smpcore.nation.members.list";
69+
70+
/**
71+
* Kick nation members
72+
*/
73+
public static @NotNull String NATION_MEMBERS_KICK = "smpcore.nation.members.kick";
74+
75+
/**
76+
* Appoint nation citizen as vice-leader
77+
*/
78+
public static @NotNull String NATION_VICE_PROMOTE = "smpcore.nation.vice-promote";
79+
80+
/**
81+
* Relieve vice-leader of duties
82+
*/
83+
public static @NotNull String NATION_VICE_DEMOTE = "smpcore.nation.vice-demote";
6984
}
Lines changed: 52 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package pro.cloudnode.smp.smpcore.command;
22

3+
import net.kyori.adventure.text.Component;
4+
import net.kyori.adventure.text.TextComponent;
35
import org.bukkit.command.CommandSender;
46
import org.bukkit.entity.Player;
57
import org.jetbrains.annotations.NotNull;
@@ -9,33 +11,71 @@
911
import pro.cloudnode.smp.smpcore.Permission;
1012
import pro.cloudnode.smp.smpcore.SMPCore;
1113

14+
import java.util.Arrays;
1215
import java.util.List;
1316
import java.util.Optional;
1417

1518
public final class NationCommand extends Command {
1619

1720
@Override
18-
public boolean run(@NotNull CommandSender sender, @NotNull String label, @NotNull String @NotNull [] args) {
19-
return false;
21+
public boolean run(final @NotNull CommandSender sender, final @NotNull String label, final @NotNull String @NotNull [] args) {
22+
if (!sender.hasPermission(Permission.NATION))
23+
return sendMessage(sender, SMPCore.messages().errorNoPermission());
24+
if (!(sender instanceof final @NotNull Player player))
25+
return sendMessage(sender, SMPCore.messages().errorNotPlayer());
26+
final @NotNull Optional<@NotNull Member> member = Member.get(player);
27+
if (member.isEmpty())
28+
return sendMessage(sender, SMPCore.messages().errorNotMember());
29+
30+
if (args.length == 0) return helpSubCommands(member.get(), sender, label);
31+
final @NotNull String command = label + " " + args[0];
32+
final @NotNull String @NotNull [] argsSubset = Arrays.copyOfRange(args, 1, args.length);
33+
switch (args[0]) {
34+
case "members": return members(member.get(), sender, command, argsSubset);
35+
default: return helpSubCommands(member.get(), sender, label);
36+
}
2037
}
2138

2239
@Override
23-
public @Nullable List<@NotNull String> tab(@NotNull CommandSender sender, @NotNull String label, @NotNull String @NotNull [] args) {
40+
public @Nullable List<@NotNull String> tab(final @NotNull CommandSender sender, final @NotNull String label, final @NotNull String @NotNull [] args) {
2441
return List.of();
2542
}
2643

27-
public boolean listMembers(@NotNull CommandSender sender) {
28-
if (!sender.hasPermission(Permission.NATION) || !sender.hasPermission(Permission.NATION_MEMBERS_LIST))
44+
public boolean helpSubCommands(final @NotNull Member member, final @NotNull CommandSender sender, final @NotNull String label) {
45+
final @NotNull String command = "/" + label;
46+
final @NotNull TextComponent.Builder subCommandBuilder = Component.text()
47+
.append(SMPCore.messages().subCommandHeader("Nation", command + " ...")).append(Component.newline());
48+
if (member.nationID != null && sender.hasPermission(Permission.NATION_MEMBERS_LIST)) subCommandBuilder.append(Component.newline()).append(SMPCore.messages()
49+
.subCommandEntry(command + " members ", "members"));
50+
return sendMessage(sender, subCommandBuilder.build());
51+
}
52+
53+
public boolean members(final @NotNull Member member, final @NotNull CommandSender sender, final @NotNull String label, final @NotNull String @NotNull [] args) {
54+
if (args.length == 0) return membersSubcommand(sender, "/" + label);
55+
final @NotNull String command = label + " " + args[0];
56+
final @NotNull String @NotNull [] argsSubset = Arrays.copyOfRange(args, 1, args.length);
57+
return switch (args[0]) {
58+
case "list" -> listMembers(member, sender);
59+
default -> membersSubcommand(sender, "/" + label);
60+
};
61+
}
62+
63+
public boolean membersSubcommand(final @NotNull CommandSender sender, final @NotNull String label) {
64+
final @NotNull TextComponent.Builder subCommandBuilder = Component.text()
65+
.append(SMPCore.messages().subCommandHeader("Nation Members", label + " ...")).append(Component.newline());
66+
if (sender.hasPermission(Permission.NATION_MEMBERS_LIST)) subCommandBuilder.append(Component.newline()).append(SMPCore.messages()
67+
.subCommandEntry(label + " list ", "list"));
68+
return sendMessage(sender, subCommandBuilder.build());
69+
}
70+
71+
public boolean listMembers(final @NotNull Member member, final @NotNull CommandSender sender) {
72+
if (!sender.hasPermission(Permission.NATION_MEMBERS_LIST))
2973
return sendMessage(sender, SMPCore.messages().errorNoPermission());
30-
if (!(sender instanceof final @NotNull Player player))
31-
return sendMessage(sender, SMPCore.messages().errorNotPlayer());
32-
final @NotNull Optional<@NotNull Member> member = Member.get(player);
33-
if (member.isEmpty())
34-
return sendMessage(sender, SMPCore.messages().errorNotMember());
35-
final @NotNull Optional<@NotNull Nation> nation = member.get().nation();
74+
75+
final @NotNull Optional<@NotNull Nation> nation = member.nation();
3676
if (nation.isEmpty())
3777
return sendMessage(sender, SMPCore.messages().errorNotInNation());
3878

39-
return sendMessage(sender, SMPCore.messages().nationMembersList(nation.get()));
79+
return sendMessage(sender, SMPCore.messages().nationMembersList(nation.get(), sender));
4080
}
4181
}

src/main/resources/messages.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ nation:
5757
inactive-citizen: <dark_gray> -</dark_gray> <hover:show_text:'<gray>Citizen</gray> <member-name><newline><member-status>'><gray><member-name></gray></hover><buttons>
5858
buttons:
5959
prefix: ' '
60-
join: ' '
60+
separator: ' '
6161
suffix: ''
6262
kick: <click:run_command:/nation kick <member-name>><hover:show_text:'Remove member from the nation'><dark_gray>[<red>Kick</red>]</dark_gray></hover></click>
6363
demote: <click:run_command:/nation vice-demote <member-name>><hover:show_text:'Demote vice-leader to citizen'><dark_gray>[<red>Demote</red>]</dark_gray></hover></click>

0 commit comments

Comments
 (0)