Skip to content

Commit 150c744

Browse files
committed
Add a command and API endpoint to see the game date and time
1 parent b7c778e commit 150c744

File tree

8 files changed

+69
-0
lines changed

8 files changed

+69
-0
lines changed

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@
1111

1212
import java.time.ZoneOffset;
1313
import java.util.Arrays;
14+
import java.util.Calendar;
1415
import java.util.Date;
1516
import java.util.HashSet;
1617
import java.util.List;
1718
import java.util.Objects;
1819
import java.util.Optional;
20+
import java.util.TimeZone;
1921
import java.util.stream.Collectors;
2022

2123
public class Messages extends BaseConfig {
@@ -170,6 +172,16 @@ public Messages() {
170172
.toLocalDateTime()), Placeholder.component("last-seen-relative", SMPCore.relativeTime(lastSeen)));
171173
}
172174

175+
public @NotNull Component time(final @NotNull Date date) {
176+
final @NotNull Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
177+
calendar.setTime(date);
178+
final int day = calendar.get(Calendar.DAY_OF_MONTH);
179+
return MiniMessage.miniMessage()
180+
.deserialize(Objects.requireNonNull(config.getString("time")), Formatter.date("date", calendar
181+
.toInstant().atZone(ZoneOffset.UTC)
182+
.toLocalDateTime()), Placeholder.unparsed("day", String.valueOf(day)), Placeholder.unparsed("day", String.valueOf(day)), Formatter.choice("day-format", day));
183+
}
184+
173185
// errors
174186

175187
public @NotNull Component errorNoPermission() {

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,9 @@ public final class Permission {
5151
* Allow using `/seen` on staff
5252
*/
5353
public static @NotNull String SEEN_STAFF = "smpcore.seen.staff";
54+
55+
/**
56+
* Allow seeing the game time and date
57+
*/
58+
public static @NotNull String TIME = "smpcore.time";
5459
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@ public Rest(final int port) {
6969
ctx.header("Access-Control-Max-Age", "3600");
7070
});
7171

72+
javalin.get("/", ctx -> {
73+
final @NotNull JsonObject obj = new JsonObject();
74+
obj.addProperty("time", SMPCore.gameTime().getTime());
75+
ctx.json(obj);
76+
});
77+
7278
javalin.get("/members", ctx -> {
7379
final @Nullable String filter = ctx.queryParam("filter");
7480
final @Nullable String limitString = ctx.queryParam("limit");

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.zaxxer.hikari.HikariConfig;
44
import com.zaxxer.hikari.HikariDataSource;
55
import net.kyori.adventure.text.Component;
6+
import org.bukkit.World;
67
import org.bukkit.plugin.java.JavaPlugin;
78
import org.jetbrains.annotations.NotNull;
89
import org.jetbrains.annotations.Nullable;
@@ -11,6 +12,7 @@
1112
import pro.cloudnode.smp.smpcore.command.Command;
1213
import pro.cloudnode.smp.smpcore.command.MainCommand;
1314
import pro.cloudnode.smp.smpcore.command.SeenCommand;
15+
import pro.cloudnode.smp.smpcore.command.TimeCommand;
1416
import pro.cloudnode.smp.smpcore.command.UnbanCommand;
1517
import pro.cloudnode.smp.smpcore.listener.NationTeamUpdaterListener;
1618

@@ -73,6 +75,7 @@ public void onEnable() {
7375
put("ban", new BanCommand());
7476
put("unban", new UnbanCommand());
7577
put("seen", new SeenCommand());
78+
put("time", new TimeCommand());
7679
}};
7780
commands.put("alts", new AltsCommand(commands.get("smpcore")));
7881
for (final @NotNull Map.Entry<@NotNull String, @NotNull Command> entry : commands.entrySet())
@@ -192,4 +195,13 @@ public static boolean ifDisallowedCharacters(final @NotNull String source, final
192195
public static @NotNull Component relativeTime(final @NotNull Date date) {
193196
return relativeTime(date, new Date());
194197
}
198+
199+
private static @NotNull World overworld() {
200+
return Objects.requireNonNull(getInstance().getServer().getWorlds().stream()
201+
.filter(w -> w.getEnvironment() == World.Environment.NORMAL).findFirst().orElse(null));
202+
}
203+
204+
public static @NotNull Date gameTime() {
205+
return new Date(overworld().getGameTime() * 72);
206+
}
195207
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public boolean run(@NotNull CommandSender sender, @NotNull String label, @NotNul
3131
return switch (args[0]) {
3232
case "reload" -> reload(sender);
3333
case "alt" -> alt(sender, argsSubset, label + " " + args[0]);
34+
case "time", "date" -> time(sender, argsSubset, label + " " + args[0]);
3435
default -> sendMessage(sender, MiniMessage.miniMessage()
3536
.deserialize("<red>(!) Unrecognised command <gray><command>", Placeholder.unparsed("command", args[0])));
3637
};
@@ -42,6 +43,7 @@ public boolean run(@NotNull CommandSender sender, @NotNull String label, @NotNul
4243
if (args.length == 1) {
4344
if (sender.hasPermission(Permission.RELOAD)) suggestions.add("reload");
4445
if (sender.hasPermission(Permission.ALT)) suggestions.add("alt");
46+
if (sender.hasPermission(Permission.TIME)) suggestions.addAll(List.of("time", "date"));
4547
}
4648
else if (args.length > 1) switch (args[0]) {
4749
case "alt" -> {
@@ -234,4 +236,10 @@ else switch (originalArgs[0]) {
234236
}
235237
}
236238
}
239+
240+
public static boolean time(final @NotNull CommandSender sender, final @NotNull String @NotNull [] args, final @NotNull String label) {
241+
if (!sender.hasPermission(Permission.TIME))
242+
return sendMessage(sender, SMPCore.messages().errorNoPermission());
243+
return sendMessage(sender, SMPCore.messages().time(SMPCore.gameTime()));
244+
}
237245
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package pro.cloudnode.smp.smpcore.command;
2+
3+
import org.bukkit.command.CommandSender;
4+
import org.jetbrains.annotations.NotNull;
5+
6+
import java.util.List;
7+
8+
public final class TimeCommand extends Command {
9+
10+
@Override
11+
public boolean run(@NotNull CommandSender sender, @NotNull String label, @NotNull String @NotNull [] args) {
12+
return MainCommand.time(sender, args, label);
13+
}
14+
15+
@Override
16+
public @NotNull List<@NotNull String> tab(@NotNull CommandSender sender, @NotNull String label, @NotNull String @NotNull [] args) {
17+
return List.of();
18+
}
19+
}

src/main/resources/messages.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ seen:
3939
inactive: <aqua>(!) Member <white><player></white> is <red>inactive</red> and last seen on <white><last-seen:'dd MMM yyyy HH:mm'> UTC</white> <gray>(<last-seen-relative>)</aqua>
4040
non-member: <aqua>(!) Player <white><player></white> was last seen on <white><last-seen:'dd MMM yyyy HH:mm'> UTC</white> <gray>(<last-seen-relative>)</aqua>
4141

42+
time: <green>(!) It is currently <white><date:'EEEE, MMMM'> <day><day-format:'1#st|2#nd|3#rd|3<th|21#st|22#nd|23#rd|23<th|31#st'> <date:'yyyy'></white> and the time is <white><date:'HH:mm'> UTC</white>.</green>
43+
4244
error:
4345
no-permission: <red>(!) You don't have permission to use this command.</red>
4446
player-not-banned: <red>(!) Player <gray><player></gray> is not banned and is not a member.</red>

src/main/resources/plugin.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,8 @@ commands:
2727
description: Check when a player was last online
2828
usage: /<command> <player>
2929
aliases: [ lastseen ]
30+
time:
31+
permission: smpcore.time
32+
description: See the current game time and date
33+
usage: /<command>
34+
aliases: [ date, today ]

0 commit comments

Comments
 (0)