Skip to content

Commit b2ccd4e

Browse files
authored
Prevent revealing vanished players (#19)
2 parents 61278a5 + 674fbe8 commit b2ccd4e

File tree

6 files changed

+35
-6
lines changed

6 files changed

+35
-6
lines changed

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import io.papermc.paper.ban.BanListType;
44
import org.bukkit.OfflinePlayer;
5+
import org.bukkit.entity.Player;
6+
import org.bukkit.metadata.MetadataValue;
57
import org.jetbrains.annotations.NotNull;
68
import org.jetbrains.annotations.Nullable;
79

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

50+
/**
51+
* Check if player is online and not vanished
52+
*/
53+
public boolean onlineNotVanished() {
54+
final @NotNull Optional<@NotNull Player> player = Optional.ofNullable(player().getPlayer());
55+
if (player.isEmpty()) return false;
56+
for (final @NotNull MetadataValue meta : player.get().getMetadata("vanished"))
57+
if (meta.asBoolean()) return false;
58+
return player.get().isOnline();
59+
}
60+
4861
public boolean isActive() {
4962
return new Date().getTime() - player().getLastSeen() < (long) SMPCore.config().membersInactiveDays() * 24 * 60 * 60 * 1000;
5063
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,11 @@ public Messages() {
239239
.ofNullable(player.getName()).orElse(player.getUniqueId().toString())));
240240
}
241241

242+
public @NotNull Component errorCommandOnStaff(final @NotNull String label) {
243+
return MiniMessage.miniMessage()
244+
.deserialize(Objects.requireNonNull(config.getString("error.command-on-staff")), Placeholder.unparsed("command", label));
245+
}
246+
242247
public record SubCommandArgument(@NotNull String name, boolean required) {
243248
public @NotNull Component component() {
244249
return required ? SMPCore.messages().subCommandArgumentRequired(name) : SMPCore.messages()

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,9 @@ public final class Permission {
4646
public static @NotNull String ALT_REMOVE_JOINED = "smpcore.alt.remove.joined";
4747

4848
public static @NotNull String SEEN = "smpcore.seen";
49+
50+
/**
51+
* Allow using `/seen` on staff
52+
*/
53+
public static @NotNull String SEEN_STAFF = "smpcore.seen.staff";
4954
}

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ private void e404 (final @NotNull io.javalin.http.Context ctx) {
3434
obj.addProperty("name", player.getName());
3535
obj.addProperty("nation", member.nationID);
3636
obj.addProperty("staff", member.staff);
37-
obj.addProperty("online", player.isOnline());
37+
obj.addProperty("online", member.onlineNotVanished());
3838
obj.addProperty("whitelisted", player.isWhitelisted());
3939
obj.addProperty("banned", player.isBanned());
4040
obj.addProperty("altOwner", member.altOwnerUUID == null ? null : member.altOwnerUUID.toString());
4141
obj.addProperty("added", member.added.getTime());
42-
obj.addProperty("lastSeen", player.getLastSeen());
42+
obj.addProperty("lastSeen", member.staff ? 0 : player.getLastSeen());
4343
obj.addProperty("firstSeen", player.getFirstPlayed());
4444
obj.addProperty("active", member.isActive());
4545
return obj;
@@ -103,8 +103,8 @@ public Rest(final int port) {
103103
final @NotNull JsonArray arr = new JsonArray();
104104
for (final @NotNull Member member : members) {
105105
if (filter != null) {
106-
if (filter.equals("online") && !member.player().isOnline()) continue;
107-
if (filter.equals("offline") && member.player().isOnline()) continue;
106+
if (filter.equals("online") && !member.onlineNotVanished()) continue;
107+
if (filter.equals("offline") && member.onlineNotVanished()) continue;
108108
if (filter.equals("banned") && !member.player().isBanned()) continue;
109109
}
110110
final @NotNull JsonObject m = getMemberObject(member);
@@ -148,7 +148,7 @@ public Rest(final int port) {
148148
altObj.addProperty("name", player.getName());
149149
altObj.addProperty("nation", alt.nationID);
150150
altObj.addProperty("added", alt.added.getTime());
151-
altObj.addProperty("lastSeen", player.getLastSeen());
151+
altObj.addProperty("lastSeen", alt.staff ? 0 : player.getLastSeen());
152152
altsArray.add(altObj);
153153
}
154154
obj.add("alts", altsArray);

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import pro.cloudnode.smp.smpcore.SMPCore;
99

1010
import java.util.List;
11+
import java.util.Objects;
1112
import java.util.Optional;
1213

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

2526
final @NotNull Optional<@NotNull Member> member = Member.get(player.getUniqueId());
27+
28+
if (!sender.hasPermission(Permission.SEEN_STAFF) && member.isPresent() && member.get().staff) return sendMessage(sender, SMPCore.messages().errorCommandOnStaff(label));
29+
2630
return member.map(m -> sendMessage(sender, SMPCore.messages().seen(m)))
2731
.orElseGet(() -> sendMessage(sender, SMPCore.messages().seen(player)));
2832
}
2933

3034
@Override
3135
public @NotNull List<@NotNull String> tab(@NotNull CommandSender sender, @NotNull String label, @NotNull String @NotNull [] args) {
32-
return Member.getNames().stream().toList();
36+
if (sender.hasPermission(Permission.SEEN_STAFF)) return Member.getNames().stream().toList();
37+
else return Member.get().stream().filter(m -> !m.staff).map(m -> m.player().getName()).filter(Objects::nonNull).toList();
3338
}
3439
}

src/main/resources/messages.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,4 @@ error:
5252
member-not-alt: <red>(!) Member <gray><player></gray> is not an alt.</red>
5353
remove-joined-alt: <red>(!) You cannot remove alt player <gray><alt></gray> because they have played the server.</red>
5454
never-joined: <red>(!) Player <gray><player></gray> has never played on the server.</red>
55+
command-on-staff: <red>(!) You cannot use <gray>/<command></gray> on staff.</red>

0 commit comments

Comments
 (0)