Skip to content
23 changes: 21 additions & 2 deletions src/main/java/pro/cloudnode/smp/smpcore/Configuration.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.resolver.Formatter;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.time.Duration;
import java.time.temporal.ChronoUnit;
Expand Down Expand Up @@ -103,10 +106,26 @@ public boolean deathBanEnabled() {
}

public @NotNull String staffTeamId() {
return Objects.requireNonNull(config.getString("staff-team.id"));
return Objects.requireNonNull(config.getString("staff.team.id"));
}

public @NotNull Component staffTeamName() {
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("staff-team.name")));
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("staff.team.name")));
}

public void staffCommands(final boolean addMode, final @NotNull OfflinePlayer player) {
final @Nullable String name = player.getName();
if (name == null)
return;

final List<String> commands = config.getStringList("staff.commands." + (addMode ? "add" : "remove"));

SMPCore.runMain(() -> {
for (final String command : commands)
Bukkit.dispatchCommand(
Bukkit.getConsoleSender(),
command.replace("<player>", name)
);
});
}
}
11 changes: 10 additions & 1 deletion src/main/java/pro/cloudnode/smp/smpcore/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ private Member(final @NotNull UUID uuid, final @Nullable String nationID, final
this.added = added;
}

public Member(final @NotNull OfflinePlayer player) {
this(player, null);
}

public Member(final @NotNull OfflinePlayer player, final @Nullable Member altOwner) {
this(player.getUniqueId(), null, false, altOwner == null ? null : altOwner.uuid, new Date());
}
Expand Down Expand Up @@ -270,8 +274,13 @@ public static int count() {
team.displayName(SMPCore.config().staffTeamName());
team.prefix(SMPCore.config().staffTeamName().append(Component.text(" ")));

for (final Member staff : getStaff())
for (final Member staff : getStaff()) try {
team.addPlayer(staff.player());
}
catch (final IllegalArgumentException e) {
SMPCore.getInstance().getLogger().log(Level.FINEST, "could not add staff member "
+ staff.player().getUniqueId() + " to staff team", e);
}

return team;
}
Expand Down
85 changes: 84 additions & 1 deletion src/main/java/pro/cloudnode/smp/smpcore/Messages.java
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,63 @@ public Messages() {
.ofNullable(alt.player().getName()).orElse(alt.player().getUniqueId().toString())));
}

public @NotNull Component membersNationlessFallback() {
return MiniMessage.miniMessage().deserialize(
Objects.requireNonNull(config.getString("members.nationless-fallback"))
);
}

public @NotNull Component membersListHeader() {
return MiniMessage.miniMessage().deserialize(
Objects.requireNonNull(config.getString("members.list.header"))
);
}

public @NotNull Component membersListNone() {
return MiniMessage.miniMessage().deserialize(
Objects.requireNonNull(config.getString("members.list.none"))
);
}

public @NotNull Component membersListEntry(final @NotNull Member member) {
return MiniMessage.miniMessage().deserialize(
Objects.requireNonNull(config.getString("members.list.entry")),
Placeholder.unparsed("player", Optional.ofNullable(member.player().getName())
.orElse(member.player().getUniqueId().toString())),
Formatter.choice("staff", member.staff ? 1 : 0),
Placeholder.component("nation", member.nation()
.map(n -> n.getTeam().displayName())
.orElse(membersNationlessFallback())
),
Formatter.date("added", member.added.toInstant().atZone(ZoneOffset.systemDefault()))
);
}

public @NotNull Component membersAdded(final @NotNull Member member) {
return MiniMessage.miniMessage().deserialize(
Objects.requireNonNull(config.getString("members.added")),
Placeholder.unparsed("player", Optional.ofNullable(member.player().getName())
.orElse(member.player().getUniqueId().toString()))
);
}

public @NotNull Component membersDeleted(final @NotNull OfflinePlayer player) {
return MiniMessage.miniMessage().deserialize(
Objects.requireNonNull(config.getString("members.deleted")),
Placeholder.unparsed("player", Optional.ofNullable(player.getName())
.orElse(player.getUniqueId().toString()))
);
}

public @NotNull Component membersSetStaff(final @NotNull Member member) {
return MiniMessage.miniMessage().deserialize(
Objects.requireNonNull(config.getString("members.set-staff")),
Placeholder.unparsed("player", Optional.ofNullable(member.player().getName())
.orElse(member.player().getUniqueId().toString())),
Formatter.choice("staff", member.staff ? 1 : 0)
);
}

public @NotNull Component seen(final @NotNull Member member) {
if (member.player().isOnline()) return MiniMessage.miniMessage()
.deserialize(Objects.requireNonNull(config.getString("seen.online")), Placeholder.unparsed("player", Optional
Expand Down Expand Up @@ -636,13 +693,39 @@ public Messages() {
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("error.duration-zero-or-less")));
}

public @NotNull Component invalidDuration(final @NotNull String duration) {
public @NotNull Component errorInvalidDuration(final @NotNull String duration) {
return MiniMessage.miniMessage().deserialize(
Objects.requireNonNull(config.getString("error.invalid-duration")),
Placeholder.unparsed("duration", duration)
);
}

public @NotNull Component errorAlreadyMember(final @NotNull Member member) {
return MiniMessage.miniMessage().deserialize(
Objects.requireNonNull(config.getString("error.already-member")),
Placeholder.unparsed("player", Optional.ofNullable(member.player().getName())
.orElse(member.player().getUniqueId().toString()))
);
}

public @NotNull Component errorAlreadyStaff(final @NotNull Member member) {
return MiniMessage.miniMessage().deserialize(
Objects.requireNonNull(config.getString("error.already-staff")),
Placeholder.unparsed("player", Optional.ofNullable(member.player().getName())
.orElse(member.player().getUniqueId().toString())),
Formatter.choice("staff", member.staff ? 1 : 0)
);
}

public @NotNull Component errorRemoveMemberLeader(final @NotNull Member member, final @NotNull Nation nation) {
return MiniMessage.miniMessage().deserialize(
Objects.requireNonNull(config.getString("error.remove-member-leader")),
Placeholder.unparsed("player", Optional.ofNullable(member.player().getName())
.orElse(member.player().getUniqueId().toString())),
Placeholder.unparsed("nation", nation.name)
);
}

public record SubCommandArgument(@NotNull String name, boolean required) {
public @NotNull Component component() {
return required ? SMPCore.messages().subCommandArgumentRequired(name) : SMPCore.messages()
Expand Down
25 changes: 25 additions & 0 deletions src/main/java/pro/cloudnode/smp/smpcore/Permission.java
Original file line number Diff line number Diff line change
Expand Up @@ -161,4 +161,29 @@ public final class Permission {
* Bypass death ban.
*/
public static final @NotNull String DEATHBAN_BYPASS = "smpcore.deathban.bypass";

/**
* Access to the {@code /smpcore member} command.
*/
public static final @NotNull String MEMBER = "smpcore.member";

/**
* Add member to server.
*/
public static final @NotNull String MEMBER_ADD = "smpcore.member.add";

/**
* List server members.
*/
public static final @NotNull String MEMBER_LIST = "smpcore.member.list";

/**
* Revoke server membership.
*/
public static final @NotNull String MEMBER_REMOVE = "smpcore.member.remove";

/**
* Set member staff status.
*/
public static final @NotNull String MEMBER_SET_STAFF = "smpcore.member.set.staff";
}
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ public boolean run(@NotNull CommandSender sender, @NotNull String label, @NotNul
duration = Duration.parse(durationArg);
}
catch (DateTimeParseException ignored) {
return sendMessage(sender, SMPCore.messages().invalidDuration(durationArg));
return sendMessage(sender, SMPCore.messages().errorInvalidDuration(durationArg));
}

if (duration != null && (duration.isNegative() || duration.isZero()))
Expand Down
Loading
Loading