Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions src/main/java/pro/cloudnode/smp/smpcore/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import io.papermc.paper.ban.BanListType;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.bukkit.metadata.MetadataValue;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

Expand Down Expand Up @@ -45,6 +47,17 @@ private Member(final @NotNull ResultSet rs) throws @NotNull SQLException {
return SMPCore.getInstance().getServer().getOfflinePlayer(uuid);
}

/**
* Check if player is online and not vanished
*/
public boolean onlineNotVanished() {
final @NotNull Optional<@NotNull Player> player = Optional.ofNullable(player().getPlayer());
if (player.isEmpty()) return false;
for (final @NotNull MetadataValue meta : player.get().getMetadata("vanished"))
if (meta.asBoolean()) return false;
return player.get().isOnline();
}

public boolean isActive() {
return new Date().getTime() - player().getLastSeen() < (long) SMPCore.config().membersInactiveDays() * 24 * 60 * 60 * 1000;
}
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/pro/cloudnode/smp/smpcore/Messages.java
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,11 @@ public Messages() {
.ofNullable(player.getName()).orElse(player.getUniqueId().toString())));
}

public @NotNull Component errorCommandOnStaff(final @NotNull String label) {
return MiniMessage.miniMessage()
.deserialize(Objects.requireNonNull(config.getString("error.command-on-staff")), Placeholder.unparsed("command", label));
}

public record SubCommandArgument(@NotNull String name, boolean required) {
public @NotNull Component component() {
return required ? SMPCore.messages().subCommandArgumentRequired(name) : SMPCore.messages()
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/pro/cloudnode/smp/smpcore/Permission.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,9 @@ public final class Permission {
public static @NotNull String ALT_REMOVE_JOINED = "smpcore.alt.remove.joined";

public static @NotNull String SEEN = "smpcore.seen";

/**
* Allow using `/seen` on staff
*/
public static @NotNull String SEEN_STAFF = "smpcore.seen.staff";
}
10 changes: 5 additions & 5 deletions src/main/java/pro/cloudnode/smp/smpcore/Rest.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,12 @@ private void e404 (final @NotNull io.javalin.http.Context ctx) {
obj.addProperty("name", player.getName());
obj.addProperty("nation", member.nationID);
obj.addProperty("staff", member.staff);
obj.addProperty("online", player.isOnline());
obj.addProperty("online", member.onlineNotVanished());
obj.addProperty("whitelisted", player.isWhitelisted());
obj.addProperty("banned", player.isBanned());
obj.addProperty("altOwner", member.altOwnerUUID == null ? null : member.altOwnerUUID.toString());
obj.addProperty("added", member.added.getTime());
obj.addProperty("lastSeen", player.getLastSeen());
obj.addProperty("lastSeen", member.staff ? 0 : player.getLastSeen());
obj.addProperty("firstSeen", player.getFirstPlayed());
obj.addProperty("active", member.isActive());
return obj;
Expand Down Expand Up @@ -103,8 +103,8 @@ public Rest(final int port) {
final @NotNull JsonArray arr = new JsonArray();
for (final @NotNull Member member : members) {
if (filter != null) {
if (filter.equals("online") && !member.player().isOnline()) continue;
if (filter.equals("offline") && member.player().isOnline()) continue;
if (filter.equals("online") && !member.onlineNotVanished()) continue;
if (filter.equals("offline") && member.onlineNotVanished()) continue;
if (filter.equals("banned") && !member.player().isBanned()) continue;
}
final @NotNull JsonObject m = getMemberObject(member);
Expand Down Expand Up @@ -148,7 +148,7 @@ public Rest(final int port) {
altObj.addProperty("name", player.getName());
altObj.addProperty("nation", alt.nationID);
altObj.addProperty("added", alt.added.getTime());
altObj.addProperty("lastSeen", player.getLastSeen());
altObj.addProperty("lastSeen", alt.staff ? 0 : player.getLastSeen());
altsArray.add(altObj);
}
obj.add("alts", altsArray);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import pro.cloudnode.smp.smpcore.SMPCore;

import java.util.List;
import java.util.Objects;
import java.util.Optional;

public final class SeenCommand extends Command {
Expand All @@ -23,12 +24,16 @@ public boolean run(@NotNull CommandSender sender, @NotNull String label, @NotNul
if (!player.hasPlayedBefore()) return sendMessage(sender, SMPCore.messages().errorNeverJoined(player));

final @NotNull Optional<@NotNull Member> member = Member.get(player.getUniqueId());

if (!sender.hasPermission(Permission.SEEN_STAFF) && member.isPresent() && member.get().staff) return sendMessage(sender, SMPCore.messages().errorCommandOnStaff(label));

return member.map(m -> sendMessage(sender, SMPCore.messages().seen(m)))
.orElseGet(() -> sendMessage(sender, SMPCore.messages().seen(player)));
}

@Override
public @NotNull List<@NotNull String> tab(@NotNull CommandSender sender, @NotNull String label, @NotNull String @NotNull [] args) {
return Member.getNames().stream().toList();
if (sender.hasPermission(Permission.SEEN_STAFF)) return Member.getNames().stream().toList();
else return Member.get().stream().filter(m -> !m.staff).map(m -> m.player().getName()).filter(Objects::nonNull).toList();
}
}
1 change: 1 addition & 0 deletions src/main/resources/messages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,4 @@ error:
member-not-alt: <red>(!) Member <gray><player></gray> is not an alt.</red>
remove-joined-alt: <red>(!) You cannot remove alt player <gray><alt></gray> because they have played the server.</red>
never-joined: <red>(!) Player <gray><player></gray> has never played on the server.</red>
command-on-staff: <red>(!) You cannot use <gray>/<command></gray> on staff.</red>