Skip to content

Commit dfc1535

Browse files
committed
kick member from the nation
1 parent 549eaba commit dfc1535

File tree

4 files changed

+55
-1
lines changed

4 files changed

+55
-1
lines changed

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,12 @@ public Messages() {
294294
.replaceAll("<member-name>", Optional.ofNullable(member.player().getName()).orElse(member.uuid.toString())));
295295
}
296296

297+
public @NotNull Component nationMembersKicked(final @NotNull Member member) {
298+
return MiniMessage.miniMessage()
299+
.deserialize(Objects.requireNonNull(config.getString("nation.members.kicked")), Placeholder.unparsed("player", Optional
300+
.ofNullable(member.player().getName()).orElse(member.uuid.toString())));
301+
}
302+
297303
// errors
298304

299305
public @NotNull Component errorNoPermission() {
@@ -372,10 +378,20 @@ public Messages() {
372378
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("error.not-in-nation")));
373379
}
374380

381+
public @NotNull Component errorMemberNotYourNation(final @NotNull Member member) {
382+
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("error.member-not-your-nation")), Placeholder
383+
.unparsed("player", Optional
384+
.ofNullable(member.player().getName()).orElse(member.player().getUniqueId().toString())));
385+
}
386+
375387
public @NotNull Component errorNotPlayer() {
376388
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("error.not-player")));
377389
}
378390

391+
public @NotNull Component errorKickLeadership() {
392+
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("error.kick-leadership")));
393+
}
394+
379395
public record SubCommandArgument(@NotNull String name, boolean required) {
380396
public @NotNull Component component() {
381397
return required ? SMPCore.messages().subCommandArgumentRequired(name) : SMPCore.messages()

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,12 @@ public void add(final @NotNull Member member) {
117117
getTeam().addPlayer(member.player());
118118
}
119119

120+
public void remove(final @NotNull Member member) {
121+
member.nationID = null;
122+
member.save();
123+
getTeam().removePlayer(member.player());
124+
}
125+
120126
public Nation(final @NotNull ResultSet rs) throws @NotNull SQLException {
121127
this(
122128
rs.getString("id"),

src/main/java/pro/cloudnode/smp/smpcore/command/NationCommand.java

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
import net.kyori.adventure.text.Component;
44
import net.kyori.adventure.text.TextComponent;
5+
import org.bukkit.OfflinePlayer;
56
import org.bukkit.command.CommandSender;
67
import org.bukkit.entity.Player;
78
import org.jetbrains.annotations.NotNull;
89
import org.jetbrains.annotations.Nullable;
910
import pro.cloudnode.smp.smpcore.Member;
11+
import pro.cloudnode.smp.smpcore.Messages;
1012
import pro.cloudnode.smp.smpcore.Nation;
1113
import pro.cloudnode.smp.smpcore.Permission;
1214
import pro.cloudnode.smp.smpcore.SMPCore;
@@ -45,7 +47,10 @@ public boolean helpSubCommands(final @NotNull Member member, final @NotNull Comm
4547
final @NotNull String command = "/" + label;
4648
final @NotNull TextComponent.Builder subCommandBuilder = Component.text()
4749
.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()
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()
4954
.subCommandEntry(command + " members ", "members"));
5055
return sendMessage(sender, subCommandBuilder.build());
5156
}
@@ -56,6 +61,7 @@ public boolean members(final @NotNull Member member, final @NotNull CommandSende
5661
final @NotNull String @NotNull [] argsSubset = Arrays.copyOfRange(args, 1, args.length);
5762
return switch (args[0]) {
5863
case "list" -> listMembers(member, sender);
64+
case "kick" -> kickMember(member, sender, command, argsSubset);
5965
default -> membersSubcommand(sender, "/" + label);
6066
};
6167
}
@@ -65,6 +71,8 @@ public boolean membersSubcommand(final @NotNull CommandSender sender, final @Not
6571
.append(SMPCore.messages().subCommandHeader("Nation Members", label + " ...")).append(Component.newline());
6672
if (sender.hasPermission(Permission.NATION_MEMBERS_LIST)) subCommandBuilder.append(Component.newline()).append(SMPCore.messages()
6773
.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"));
6876
return sendMessage(sender, subCommandBuilder.build());
6977
}
7078

@@ -78,4 +86,25 @@ public boolean listMembers(final @NotNull Member member, final @NotNull CommandS
7886

7987
return sendMessage(sender, SMPCore.messages().nationMembersList(nation.get(), sender));
8088
}
89+
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))
92+
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>"));
97+
final @NotNull OfflinePlayer target = sender.getServer().getOfflinePlayer(args[0]);
98+
final @NotNull Optional<@NotNull Member> targetMemberOptional = Member.get(target);
99+
if (targetMemberOptional.isEmpty())
100+
return sendMessage(sender, SMPCore.messages().errorNotMember(target));
101+
final @NotNull Member targetMember = targetMemberOptional.get();
102+
if (targetMember.nationID == null || !targetMember.nationID.equals(member.nationID))
103+
return sendMessage(sender, SMPCore.messages().errorMemberNotYourNation(targetMember));
104+
if (targetMember.uuid.equals(nation.get().leaderUUID) || targetMember.uuid.equals(nation.get().viceLeaderUUID))
105+
return sendMessage(sender, SMPCore.messages().errorKickLeadership());
106+
107+
nation.get().remove(targetMember);
108+
return sendMessage(sender, SMPCore.messages().nationMembersKicked(targetMember));
109+
}
81110
}

src/main/resources/messages.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ nation:
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>
6464
promote: <click:run_command:/nation vice-promote <member-name>><hover:show_text:'Appoint citizen as vice-leader'><dark_gray>[<green>Promote</green>]</dark_gray></hover></click>
65+
kicked: <green>(!) Player <gray><player></gray> is no longer a member of the nation.</green>
6566
error:
6667
no-permission: <red>(!) You don't have permission to use this command.</red>
6768
player-not-banned: <red>(!) Player <gray><player></gray> is not banned and is not a member.</red>
@@ -77,4 +78,6 @@ error:
7778
never-joined: <red>(!) Player <gray><player></gray> has never played on the server.</red>
7879
command-on-staff: <red>(!) You cannot use <gray>/<command></gray> on staff.</red>
7980
not-in-nation: <red>(!) You are not a member of any nation.</red>
81+
member-not-your-nation: <red>(!) Member <gray><player></gray> is not a member of your nation.</red>
8082
not-player: <red>(!) You must be a player to use this command.</red>
83+
nation-kick-leadership: <red>(!) You cannot kick a member of the nation's leadership.</red>

0 commit comments

Comments
 (0)