Skip to content

Commit 657329c

Browse files
authored
Added commands to manage server members (#58)
2 parents ac07b93 + 057653d commit 657329c

File tree

8 files changed

+394
-10
lines changed

8 files changed

+394
-10
lines changed

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

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
import net.kyori.adventure.text.minimessage.MiniMessage;
55
import net.kyori.adventure.text.minimessage.tag.resolver.Formatter;
66
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
7+
import org.bukkit.Bukkit;
8+
import org.bukkit.OfflinePlayer;
79
import org.jetbrains.annotations.NotNull;
10+
import org.jetbrains.annotations.Nullable;
811

912
import java.time.Duration;
1013
import java.time.temporal.ChronoUnit;
@@ -103,10 +106,26 @@ public boolean deathBanEnabled() {
103106
}
104107

105108
public @NotNull String staffTeamId() {
106-
return Objects.requireNonNull(config.getString("staff-team.id"));
109+
return Objects.requireNonNull(config.getString("staff.team.id"));
107110
}
108111

109112
public @NotNull Component staffTeamName() {
110-
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("staff-team.name")));
113+
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("staff.team.name")));
114+
}
115+
116+
public void staffCommands(final boolean addMode, final @NotNull OfflinePlayer player) {
117+
final @Nullable String name = player.getName();
118+
if (name == null)
119+
return;
120+
121+
final List<String> commands = config.getStringList("staff.commands." + (addMode ? "add" : "remove"));
122+
123+
SMPCore.runMain(() -> {
124+
for (final String command : commands)
125+
Bukkit.dispatchCommand(
126+
Bukkit.getConsoleSender(),
127+
command.replace("<player>", name)
128+
);
129+
});
111130
}
112131
}

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ private Member(final @NotNull UUID uuid, final @Nullable String nationID, final
3636
this.added = added;
3737
}
3838

39+
public Member(final @NotNull OfflinePlayer player) {
40+
this(player, null);
41+
}
42+
3943
public Member(final @NotNull OfflinePlayer player, final @Nullable Member altOwner) {
4044
this(player.getUniqueId(), null, false, altOwner == null ? null : altOwner.uuid, new Date());
4145
}
@@ -270,8 +274,13 @@ public static int count() {
270274
team.displayName(SMPCore.config().staffTeamName());
271275
team.prefix(SMPCore.config().staffTeamName().append(Component.text(" ")));
272276

273-
for (final Member staff : getStaff())
277+
for (final Member staff : getStaff()) try {
274278
team.addPlayer(staff.player());
279+
}
280+
catch (final IllegalArgumentException e) {
281+
SMPCore.getInstance().getLogger().log(Level.FINEST, "could not add staff member "
282+
+ staff.player().getUniqueId() + " to staff team", e);
283+
}
275284

276285
return team;
277286
}

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

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,63 @@ public Messages() {
199199
.ofNullable(alt.player().getName()).orElse(alt.player().getUniqueId().toString())));
200200
}
201201

202+
public @NotNull Component membersNationlessFallback() {
203+
return MiniMessage.miniMessage().deserialize(
204+
Objects.requireNonNull(config.getString("members.nationless-fallback"))
205+
);
206+
}
207+
208+
public @NotNull Component membersListHeader() {
209+
return MiniMessage.miniMessage().deserialize(
210+
Objects.requireNonNull(config.getString("members.list.header"))
211+
);
212+
}
213+
214+
public @NotNull Component membersListNone() {
215+
return MiniMessage.miniMessage().deserialize(
216+
Objects.requireNonNull(config.getString("members.list.none"))
217+
);
218+
}
219+
220+
public @NotNull Component membersListEntry(final @NotNull Member member) {
221+
return MiniMessage.miniMessage().deserialize(
222+
Objects.requireNonNull(config.getString("members.list.entry")),
223+
Placeholder.unparsed("player", Optional.ofNullable(member.player().getName())
224+
.orElse(member.player().getUniqueId().toString())),
225+
Formatter.choice("staff", member.staff ? 1 : 0),
226+
Placeholder.component("nation", member.nation()
227+
.map(n -> n.getTeam().displayName())
228+
.orElse(membersNationlessFallback())
229+
),
230+
Formatter.date("added", member.added.toInstant().atZone(ZoneOffset.systemDefault()))
231+
);
232+
}
233+
234+
public @NotNull Component membersAdded(final @NotNull Member member) {
235+
return MiniMessage.miniMessage().deserialize(
236+
Objects.requireNonNull(config.getString("members.added")),
237+
Placeholder.unparsed("player", Optional.ofNullable(member.player().getName())
238+
.orElse(member.player().getUniqueId().toString()))
239+
);
240+
}
241+
242+
public @NotNull Component membersDeleted(final @NotNull OfflinePlayer player) {
243+
return MiniMessage.miniMessage().deserialize(
244+
Objects.requireNonNull(config.getString("members.deleted")),
245+
Placeholder.unparsed("player", Optional.ofNullable(player.getName())
246+
.orElse(player.getUniqueId().toString()))
247+
);
248+
}
249+
250+
public @NotNull Component membersSetStaff(final @NotNull Member member) {
251+
return MiniMessage.miniMessage().deserialize(
252+
Objects.requireNonNull(config.getString("members.set-staff")),
253+
Placeholder.unparsed("player", Optional.ofNullable(member.player().getName())
254+
.orElse(member.player().getUniqueId().toString())),
255+
Formatter.choice("staff", member.staff ? 1 : 0)
256+
);
257+
}
258+
202259
public @NotNull Component seen(final @NotNull Member member) {
203260
if (member.player().isOnline()) return MiniMessage.miniMessage()
204261
.deserialize(Objects.requireNonNull(config.getString("seen.online")), Placeholder.unparsed("player", Optional
@@ -636,13 +693,39 @@ public Messages() {
636693
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("error.duration-zero-or-less")));
637694
}
638695

639-
public @NotNull Component invalidDuration(final @NotNull String duration) {
696+
public @NotNull Component errorInvalidDuration(final @NotNull String duration) {
640697
return MiniMessage.miniMessage().deserialize(
641698
Objects.requireNonNull(config.getString("error.invalid-duration")),
642699
Placeholder.unparsed("duration", duration)
643700
);
644701
}
645702

703+
public @NotNull Component errorAlreadyMember(final @NotNull Member member) {
704+
return MiniMessage.miniMessage().deserialize(
705+
Objects.requireNonNull(config.getString("error.already-member")),
706+
Placeholder.unparsed("player", Optional.ofNullable(member.player().getName())
707+
.orElse(member.player().getUniqueId().toString()))
708+
);
709+
}
710+
711+
public @NotNull Component errorAlreadyStaff(final @NotNull Member member) {
712+
return MiniMessage.miniMessage().deserialize(
713+
Objects.requireNonNull(config.getString("error.already-staff")),
714+
Placeholder.unparsed("player", Optional.ofNullable(member.player().getName())
715+
.orElse(member.player().getUniqueId().toString())),
716+
Formatter.choice("staff", member.staff ? 1 : 0)
717+
);
718+
}
719+
720+
public @NotNull Component errorRemoveMemberLeader(final @NotNull Member member, final @NotNull Nation nation) {
721+
return MiniMessage.miniMessage().deserialize(
722+
Objects.requireNonNull(config.getString("error.remove-member-leader")),
723+
Placeholder.unparsed("player", Optional.ofNullable(member.player().getName())
724+
.orElse(member.player().getUniqueId().toString())),
725+
Placeholder.unparsed("nation", nation.name)
726+
);
727+
}
728+
646729
public record SubCommandArgument(@NotNull String name, boolean required) {
647730
public @NotNull Component component() {
648731
return required ? SMPCore.messages().subCommandArgumentRequired(name) : SMPCore.messages()

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,4 +161,29 @@ public final class Permission {
161161
* Bypass death ban.
162162
*/
163163
public static final @NotNull String DEATHBAN_BYPASS = "smpcore.deathban.bypass";
164+
165+
/**
166+
* Access to the {@code /smpcore member} command.
167+
*/
168+
public static final @NotNull String MEMBER = "smpcore.member";
169+
170+
/**
171+
* Add member to server.
172+
*/
173+
public static final @NotNull String MEMBER_ADD = "smpcore.member.add";
174+
175+
/**
176+
* List server members.
177+
*/
178+
public static final @NotNull String MEMBER_LIST = "smpcore.member.list";
179+
180+
/**
181+
* Revoke server membership.
182+
*/
183+
public static final @NotNull String MEMBER_REMOVE = "smpcore.member.remove";
184+
185+
/**
186+
* Set member staff status.
187+
*/
188+
public static final @NotNull String MEMBER_SET_STAFF = "smpcore.member.set.staff";
164189
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public boolean run(@NotNull CommandSender sender, @NotNull String label, @NotNul
9292
duration = Duration.parse(durationArg);
9393
}
9494
catch (DateTimeParseException ignored) {
95-
return sendMessage(sender, SMPCore.messages().invalidDuration(durationArg));
95+
return sendMessage(sender, SMPCore.messages().errorInvalidDuration(durationArg));
9696
}
9797

9898
if (duration != null && (duration.isNegative() || duration.isZero()))

0 commit comments

Comments
 (0)