Skip to content

Commit a4398f5

Browse files
committed
feat: add player presence support
1 parent ce3f2e2 commit a4398f5

13 files changed

Lines changed: 283 additions & 112 deletions

File tree

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ allprojects {
1212
}
1313

1414
group = "net.azisaba.interchatmod"
15-
version = "0.5.0"
15+
version = "0.6.0"
1616

1717
repositories {
1818
// mavenLocal()

common/src/main/java/net/azisaba/interchatmod/common/model/GuildMember.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,27 +18,37 @@ public final class GuildMember {
1818
private final @NotNull String name;
1919
private final @NotNull String role;
2020
private final @Nullable String nickname;
21+
private final @Nullable PresenceData presence;
2122

22-
public GuildMember(long guildId, @NotNull UUID uuid, @NotNull String name, @NotNull String role, @Nullable String nickname) {
23+
public GuildMember(long guildId, @NotNull UUID uuid, @NotNull String name, @NotNull String role, @Nullable String nickname, @Nullable PresenceData presence) {
2324
this.guildId = guildId;
2425
this.uuid = uuid;
2526
this.name = name;
2627
this.role = role;
2728
this.nickname = nickname;
29+
this.presence = presence;
2830
}
2931

3032
@NotNull
3133
public static Set<GuildMember> getGuildMembersFromArray(JsonArray arr) {
3234
Set<GuildMember> set = new HashSet<>();
3335
for (JsonElement element : arr) {
3436
JsonObject obj = element.getAsJsonObject();
37+
PresenceData presence = null;
38+
if (obj.has("presence")) {
39+
presence = new PresenceData(
40+
obj.get("presence").getAsJsonObject().get("server").getAsString(),
41+
obj.get("presence").getAsJsonObject().get("last_seen").getAsLong()
42+
);
43+
}
3544
set.add(
3645
new GuildMember(
3746
obj.get("guild_id").getAsLong(),
3847
UUID.fromString(obj.get("uuid").getAsString()),
3948
obj.get("name").getAsString(),
4049
obj.get("role").getAsString(),
41-
obj.get("nickname").isJsonNull() ? null : obj.get("nickname").getAsString()
50+
obj.get("nickname").isJsonNull() ? null : obj.get("nickname").getAsString(),
51+
presence
4252
)
4353
);
4454
}
@@ -65,6 +75,10 @@ public long guildId() {
6575
return nickname;
6676
}
6777

78+
public @Nullable PresenceData presence() {
79+
return presence;
80+
}
81+
6882
@Override
6983
public boolean equals(Object obj) {
7084
if (obj == this) return true;
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package net.azisaba.interchatmod.common.model;
2+
3+
public class PresenceData {
4+
public final String server;
5+
public final long lastSeen;
6+
7+
public PresenceData(String server, long lastSeen) {
8+
this.server = server;
9+
this.lastSeen = lastSeen;
10+
}
11+
}

fabric-1.16/src/main/java/net/azisaba/interchatmod/fabric/Commands.java

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,11 @@
88
import net.fabricmc.fabric.api.client.command.v1.ClientCommandManager;
99
import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource;
1010
import net.minecraft.command.CommandSource;
11-
import net.minecraft.text.ClickEvent;
12-
import net.minecraft.text.HoverEvent;
13-
import net.minecraft.text.LiteralText;
14-
import net.minecraft.text.Text;
11+
import net.minecraft.text.*;
1512
import net.minecraft.util.Formatting;
1613
import org.jetbrains.annotations.NotNull;
1714

18-
import java.util.Collections;
19-
import java.util.HashSet;
20-
import java.util.Locale;
21-
import java.util.Set;
15+
import java.util.*;
2216
import java.util.function.Consumer;
2317
import java.util.stream.Collectors;
2418
import java.util.stream.Stream;
@@ -225,15 +219,34 @@ private static int executeInfo(FabricClientCommandSource source) {
225219
.append(new LiteralText(String.valueOf(guild.capacity())).formatted(Formatting.RED))
226220
);
227221
Consumer<String> sendRole = (role) -> {
228-
String players =
222+
List<MutableText> players =
229223
members.stream()
230224
.filter(m -> m.role().equals(role.toUpperCase(Locale.ROOT)))
231-
.map(GuildMember::name)
232-
.collect(Collectors.joining(", "));
233-
source.sendFeedback(
234-
new LiteralText(role + ": ").formatted(Formatting.GOLD)
235-
.append(new LiteralText(players).formatted(Formatting.WHITE))
236-
);
225+
.map(member -> {
226+
if (member.presence() == null) {
227+
return new LiteralText(member.name()).formatted(Formatting.WHITE);
228+
}
229+
if (System.currentTimeMillis() - member.presence().lastSeen < 60000) {
230+
return new LiteralText(member.name()).formatted(Formatting.GREEN)
231+
.styled(style -> style.withHoverEvent(
232+
new HoverEvent(
233+
HoverEvent.Action.SHOW_TEXT,
234+
new LiteralText("プレイ中: ")
235+
.formatted(Formatting.GREEN)
236+
.append(new LiteralText(member.presence().server).formatted(Formatting.YELLOW)))));
237+
} else {
238+
return new LiteralText(member.name()).formatted(Formatting.WHITE);
239+
}
240+
})
241+
.collect(Collectors.toList());
242+
MutableText mu = new LiteralText(role + ": ").formatted(Formatting.GOLD);
243+
for (int i = 0; i < players.size(); i++) {
244+
mu = mu.append(players.get(i));
245+
if (i < players.size() - 1) {
246+
mu = mu.append(new LiteralText(", "));
247+
}
248+
}
249+
source.sendFeedback(mu);
237250
};
238251
sendRole.accept("Owner");
239252
sendRole.accept("Moderator");

fabric-1.17/src/main/java/net/azisaba/interchatmod/fabric/Commands.java

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,12 @@
77
import net.azisaba.interchatmod.common.util.Constants;
88
import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource;
99
import net.minecraft.command.CommandSource;
10-
import net.minecraft.text.ClickEvent;
11-
import net.minecraft.text.HoverEvent;
12-
import net.minecraft.text.LiteralText;
13-
import net.minecraft.text.Text;
10+
import net.minecraft.text.*;
1411
import net.minecraft.util.Formatting;
1512
import org.jetbrains.annotations.NotNull;
1613

17-
import java.util.Collections;
18-
import java.util.HashSet;
19-
import java.util.Locale;
20-
import java.util.Set;
14+
import java.util.*;
2115
import java.util.function.Consumer;
22-
import java.util.stream.Collectors;
2316
import java.util.stream.Stream;
2417

2518
import static net.fabricmc.fabric.api.client.command.v1.ClientCommandManager.argument;
@@ -224,15 +217,34 @@ private static int executeInfo(FabricClientCommandSource source) {
224217
.append(new LiteralText(String.valueOf(guild.capacity())).formatted(Formatting.RED))
225218
);
226219
Consumer<String> sendRole = (role) -> {
227-
String players =
220+
List<MutableText> players =
228221
members.stream()
229222
.filter(m -> m.role().equals(role.toUpperCase(Locale.ROOT)))
230-
.map(GuildMember::name)
231-
.collect(Collectors.joining(", "));
232-
source.sendFeedback(
233-
new LiteralText(role + ": ").formatted(Formatting.GOLD)
234-
.append(new LiteralText(players).formatted(Formatting.WHITE))
235-
);
223+
.map(member -> {
224+
if (member.presence() == null) {
225+
return new LiteralText(member.name()).formatted(Formatting.WHITE);
226+
}
227+
if (System.currentTimeMillis() - member.presence().lastSeen < 60000) {
228+
return new LiteralText(member.name()).formatted(Formatting.GREEN)
229+
.styled(style -> style.withHoverEvent(
230+
new HoverEvent(
231+
HoverEvent.Action.SHOW_TEXT,
232+
new LiteralText("プレイ中: ")
233+
.formatted(Formatting.GREEN)
234+
.append(new LiteralText(member.presence().server).formatted(Formatting.YELLOW)))));
235+
} else {
236+
return new LiteralText(member.name()).formatted(Formatting.WHITE);
237+
}
238+
})
239+
.toList();
240+
MutableText mu = new LiteralText(role + ": ").formatted(Formatting.GOLD);
241+
for (int i = 0; i < players.size(); i++) {
242+
mu = mu.append(players.get(i));
243+
if (i < players.size() - 1) {
244+
mu = mu.append(new LiteralText(", "));
245+
}
246+
}
247+
source.sendFeedback(mu);
236248
};
237249
sendRole.accept("Owner");
238250
sendRole.accept("Moderator");

fabric-1.18/src/main/java/net/azisaba/interchatmod/fabric/Commands.java

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,12 @@
77
import net.azisaba.interchatmod.common.util.Constants;
88
import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource;
99
import net.minecraft.command.CommandSource;
10-
import net.minecraft.text.ClickEvent;
11-
import net.minecraft.text.HoverEvent;
12-
import net.minecraft.text.LiteralText;
13-
import net.minecraft.text.Text;
10+
import net.minecraft.text.*;
1411
import net.minecraft.util.Formatting;
1512
import org.jetbrains.annotations.NotNull;
1613

17-
import java.util.Collections;
18-
import java.util.HashSet;
19-
import java.util.Locale;
20-
import java.util.Set;
14+
import java.util.*;
2115
import java.util.function.Consumer;
22-
import java.util.stream.Collectors;
2316
import java.util.stream.Stream;
2417

2518
import static net.fabricmc.fabric.api.client.command.v1.ClientCommandManager.argument;
@@ -224,15 +217,34 @@ private static int executeInfo(FabricClientCommandSource source) {
224217
.append(new LiteralText(String.valueOf(guild.capacity())).formatted(Formatting.RED))
225218
);
226219
Consumer<String> sendRole = (role) -> {
227-
String players =
220+
List<MutableText> players =
228221
members.stream()
229222
.filter(m -> m.role().equals(role.toUpperCase(Locale.ROOT)))
230-
.map(GuildMember::name)
231-
.collect(Collectors.joining(", "));
232-
source.sendFeedback(
233-
new LiteralText(role + ": ").formatted(Formatting.GOLD)
234-
.append(new LiteralText(players).formatted(Formatting.WHITE))
235-
);
223+
.map(member -> {
224+
if (member.presence() == null) {
225+
return new LiteralText(member.name()).formatted(Formatting.WHITE);
226+
}
227+
if (System.currentTimeMillis() - member.presence().lastSeen < 60000) {
228+
return new LiteralText(member.name()).formatted(Formatting.GREEN)
229+
.styled(style -> style.withHoverEvent(
230+
new HoverEvent(
231+
HoverEvent.Action.SHOW_TEXT,
232+
new LiteralText("プレイ中: ")
233+
.formatted(Formatting.GREEN)
234+
.append(new LiteralText(member.presence().server).formatted(Formatting.YELLOW)))));
235+
} else {
236+
return new LiteralText(member.name()).formatted(Formatting.WHITE);
237+
}
238+
})
239+
.toList();
240+
MutableText mu = new LiteralText(role + ": ").formatted(Formatting.GOLD);
241+
for (int i = 0; i < players.size(); i++) {
242+
mu = mu.append(players.get(i));
243+
if (i < players.size() - 1) {
244+
mu = mu.append(new LiteralText(", "));
245+
}
246+
}
247+
source.sendFeedback(mu);
236248
};
237249
sendRole.accept("Owner");
238250
sendRole.accept("Moderator");

fabric-1.19/src/main/java/net/azisaba/interchatmod/fabric/Commands.java

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,17 @@
55
import net.azisaba.interchatmod.common.model.Guild;
66
import net.azisaba.interchatmod.common.model.GuildMember;
77
import net.azisaba.interchatmod.common.util.Constants;
8-
import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
98
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
109
import net.minecraft.command.CommandSource;
1110
import net.minecraft.text.ClickEvent;
1211
import net.minecraft.text.HoverEvent;
12+
import net.minecraft.text.MutableText;
1313
import net.minecraft.text.Text;
1414
import net.minecraft.util.Formatting;
1515
import org.jetbrains.annotations.NotNull;
1616

17-
import java.util.Collections;
18-
import java.util.HashSet;
19-
import java.util.Locale;
20-
import java.util.Set;
17+
import java.util.*;
2118
import java.util.function.Consumer;
22-
import java.util.stream.Collectors;
2319
import java.util.stream.Stream;
2420

2521
import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.argument;
@@ -224,15 +220,34 @@ private static int executeInfo(FabricClientCommandSource source) {
224220
.append(Text.literal(String.valueOf(guild.capacity())).formatted(Formatting.RED))
225221
);
226222
Consumer<String> sendRole = (role) -> {
227-
String players =
223+
List<MutableText> players =
228224
members.stream()
229225
.filter(m -> m.role().equals(role.toUpperCase(Locale.ROOT)))
230-
.map(GuildMember::name)
231-
.collect(Collectors.joining(", "));
232-
source.sendFeedback(
233-
Text.literal(role + ": ").formatted(Formatting.GOLD)
234-
.append(Text.literal(players).formatted(Formatting.WHITE))
235-
);
226+
.map(member -> {
227+
if (member.presence() == null) {
228+
return Text.literal(member.name()).formatted(Formatting.WHITE);
229+
}
230+
if (System.currentTimeMillis() - member.presence().lastSeen < 60000) {
231+
return Text.literal(member.name()).formatted(Formatting.GREEN)
232+
.styled(style -> style.withHoverEvent(
233+
new HoverEvent(
234+
HoverEvent.Action.SHOW_TEXT,
235+
Text.literal("プレイ中: ")
236+
.formatted(Formatting.GREEN)
237+
.append(Text.literal(member.presence().server).formatted(Formatting.YELLOW)))));
238+
} else {
239+
return Text.literal(member.name()).formatted(Formatting.WHITE);
240+
}
241+
})
242+
.toList();
243+
MutableText mu = Text.literal(role + ": ").formatted(Formatting.GOLD);
244+
for (int i = 0; i < players.size(); i++) {
245+
mu = mu.append(players.get(i));
246+
if (i < players.size() - 1) {
247+
mu = mu.append(Text.literal(", "));
248+
}
249+
}
250+
source.sendFeedback(mu);
236251
};
237252
sendRole.accept("Owner");
238253
sendRole.accept("Moderator");

fabric-1.20/src/main/java/net/azisaba/interchatmod/fabric/Commands.java

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,13 @@
99
import net.minecraft.command.CommandSource;
1010
import net.minecraft.text.ClickEvent;
1111
import net.minecraft.text.HoverEvent;
12+
import net.minecraft.text.MutableText;
1213
import net.minecraft.text.Text;
1314
import net.minecraft.util.Formatting;
1415
import org.jetbrains.annotations.NotNull;
1516

16-
import java.util.Collections;
17-
import java.util.HashSet;
18-
import java.util.Locale;
19-
import java.util.Set;
17+
import java.util.*;
2018
import java.util.function.Consumer;
21-
import java.util.stream.Collectors;
2219
import java.util.stream.Stream;
2320

2421
import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.argument;
@@ -223,15 +220,34 @@ private static int executeInfo(FabricClientCommandSource source) {
223220
.append(Text.literal(String.valueOf(guild.capacity())).formatted(Formatting.RED))
224221
);
225222
Consumer<String> sendRole = (role) -> {
226-
String players =
223+
List<MutableText> players =
227224
members.stream()
228225
.filter(m -> m.role().equals(role.toUpperCase(Locale.ROOT)))
229-
.map(GuildMember::name)
230-
.collect(Collectors.joining(", "));
231-
source.sendFeedback(
232-
Text.literal(role + ": ").formatted(Formatting.GOLD)
233-
.append(Text.literal(players).formatted(Formatting.WHITE))
234-
);
226+
.map(member -> {
227+
if (member.presence() == null) {
228+
return Text.literal(member.name()).formatted(Formatting.WHITE);
229+
}
230+
if (System.currentTimeMillis() - member.presence().lastSeen < 60000) {
231+
return Text.literal(member.name()).formatted(Formatting.GREEN)
232+
.styled(style -> style.withHoverEvent(
233+
new HoverEvent(
234+
HoverEvent.Action.SHOW_TEXT,
235+
Text.literal("プレイ中: ")
236+
.formatted(Formatting.GREEN)
237+
.append(Text.literal(member.presence().server).formatted(Formatting.YELLOW)))));
238+
} else {
239+
return Text.literal(member.name()).formatted(Formatting.WHITE);
240+
}
241+
})
242+
.toList();
243+
MutableText mu = Text.literal(role + ": ").formatted(Formatting.GOLD);
244+
for (int i = 0; i < players.size(); i++) {
245+
mu = mu.append(players.get(i));
246+
if (i < players.size() - 1) {
247+
mu = mu.append(Text.literal(", "));
248+
}
249+
}
250+
source.sendFeedback(mu);
235251
};
236252
sendRole.accept("Owner");
237253
sendRole.accept("Moderator");

0 commit comments

Comments
 (0)