Skip to content

Commit b03836a

Browse files
BillyGalbreathgranny
authored andcommitted
Add uptime command
1 parent 6489c0d commit b03836a

5 files changed

Lines changed: 85 additions & 144 deletions

File tree

patches/server/0178-Add-uptime-command.patch

Lines changed: 0 additions & 143 deletions
This file was deleted.

purpur-server/minecraft-patches/sources/net/minecraft/commands/Commands.java.patch

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@
88
import org.slf4j.Logger;
99

1010
public class Commands {
11-
@@ -245,6 +_,10 @@
11+
@@ -245,6 +_,11 @@
1212
StopCommand.register(this.dispatcher);
1313
TransferCommand.register(this.dispatcher);
1414
WhitelistCommand.register(this.dispatcher);
1515
+ org.purpurmc.purpur.command.CreditsCommand.register(this.dispatcher); // Purpur - Add credits command
1616
+ org.purpurmc.purpur.command.DemoCommand.register(this.dispatcher); // Purpur - Add demo command
1717
+ org.purpurmc.purpur.command.PingCommand.register(this.dispatcher); // Purpur - Add ping command
18+
+ org.purpurmc.purpur.command.UptimeCommand.register(this.dispatcher); // Purpur - Add uptime command
1819
+ org.purpurmc.purpur.command.TPSBarCommand.register(this.dispatcher); // Purpur - Implement TPSBar
1920
}
2021

purpur-server/minecraft-patches/sources/net/minecraft/server/MinecraftServer.java.patch

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
--- a/net/minecraft/server/MinecraftServer.java
22
+++ b/net/minecraft/server/MinecraftServer.java
3+
@@ -284,6 +_,7 @@
4+
public joptsimple.OptionSet options;
5+
public org.bukkit.command.ConsoleCommandSender console;
6+
public static int currentTick; // Paper - improve tick loop
7+
+ public static final long startTimeMillis = System.currentTimeMillis(); // Purpur - Add uptime command
8+
public java.util.Queue<Runnable> processQueue = new java.util.concurrent.ConcurrentLinkedQueue<Runnable>();
9+
public int autosavePeriod;
10+
// Paper - don't store the vanilla dispatcher
311
@@ -294,7 +_,7 @@
412
public static final int TICK_TIME = 1000000000 / MinecraftServer.TPS;
513
private static final int SAMPLE_INTERVAL = 20; // Paper - improve server tick loop

purpur-server/src/main/java/org/purpurmc/purpur/PurpurConfig.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ private static Map<String, Object> toMap(ConfigurationSection section) {
172172
public static String pingCommandOutput = "<green>%s's ping is %sms";
173173
public static String tpsbarCommandOutput = "<green>Tpsbar toggled <onoff> for <target>";
174174
public static String dontRunWithScissors = "<red><italic>Don't run with scissors!";
175+
public static String uptimeCommandOutput = "<green>Server uptime is <uptime>";
175176
public static String unverifiedUsername = "default";
176177
private static void messages() {
177178
cannotRideMob = getString("settings.messages.cannot-ride-mob", cannotRideMob);
@@ -185,6 +186,7 @@ private static void messages() {
185186
pingCommandOutput = getString("settings.messages.ping-command-output", pingCommandOutput);
186187
tpsbarCommandOutput = getString("settings.messages.tpsbar-command-output", tpsbarCommandOutput);
187188
dontRunWithScissors = getString("settings.messages.dont-run-with-scissors", dontRunWithScissors);
189+
uptimeCommandOutput = getString("settings.messages.uptime-command-output", uptimeCommandOutput);
188190
unverifiedUsername = getString("settings.messages.unverified-username", unverifiedUsername);
189191
}
190192

@@ -237,6 +239,15 @@ private static void disableGiveCommandDrops() {
237239
public static int commandTPSBarTickInterval = 20;
238240
public static boolean commandGamemodeRequiresPermission = false;
239241
public static boolean hideHiddenPlayersFromEntitySelector = false;
242+
public static String uptimeFormat = "<days><hours><minutes><seconds>";
243+
public static String uptimeDay = "%02d day, ";
244+
public static String uptimeDays = "%02d days, ";
245+
public static String uptimeHour = "%02d hour, ";
246+
public static String uptimeHours = "%02d hours, ";
247+
public static String uptimeMinute = "%02d minute, and ";
248+
public static String uptimeMinutes = "%02d minutes, and ";
249+
public static String uptimeSecond = "%02d second";
250+
public static String uptimeSeconds = "%02d seconds";
240251
private static void commandSettings() {
241252
commandTPSBarTitle = getString("settings.command.tpsbar.title", commandTPSBarTitle);
242253
commandTPSBarProgressOverlay = BossBar.Overlay.valueOf(getString("settings.command.tpsbar.overlay", commandTPSBarProgressOverlay.name()));
@@ -250,6 +261,15 @@ private static void commandSettings() {
250261
commandTPSBarTickInterval = getInt("settings.command.tpsbar.tick-interval", commandTPSBarTickInterval);
251262
commandGamemodeRequiresPermission = getBoolean("settings.command.gamemode.requires-specific-permission", commandGamemodeRequiresPermission);
252263
hideHiddenPlayersFromEntitySelector = getBoolean("settings.command.hide-hidden-players-from-entity-selector", hideHiddenPlayersFromEntitySelector);
264+
uptimeFormat = getString("settings.command.uptime.format", uptimeFormat);
265+
uptimeDay = getString("settings.command.uptime.day", uptimeDay);
266+
uptimeDays = getString("settings.command.uptime.days", uptimeDays);
267+
uptimeHour = getString("settings.command.uptime.hour", uptimeHour);
268+
uptimeHours = getString("settings.command.uptime.hours", uptimeHours);
269+
uptimeMinute = getString("settings.command.uptime.minute", uptimeMinute);
270+
uptimeMinutes = getString("settings.command.uptime.minutes", uptimeMinutes);
271+
uptimeSecond = getString("settings.command.uptime.second", uptimeSecond);
272+
uptimeSeconds = getString("settings.command.uptime.seconds", uptimeSeconds);
253273
}
254274

255275
public static int barrelRows = 3;
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package org.purpurmc.purpur.command;
2+
3+
import com.mojang.brigadier.CommandDispatcher;
4+
import net.kyori.adventure.text.Component;
5+
import net.kyori.adventure.text.minimessage.MiniMessage;
6+
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
7+
import net.minecraft.commands.CommandSourceStack;
8+
import net.minecraft.commands.Commands;
9+
import net.minecraft.server.MinecraftServer;
10+
import org.purpurmc.purpur.PurpurConfig;
11+
12+
import java.util.concurrent.TimeUnit;
13+
import java.util.function.Function;
14+
15+
public class UptimeCommand {
16+
public static void register(CommandDispatcher<CommandSourceStack> dispatcher) {
17+
dispatcher.register(Commands.literal("uptime")
18+
.requires((listener) -> listener.hasPermission(2, "bukkit.command.uptime"))
19+
.executes((context) -> execute(context.getSource()))
20+
);
21+
}
22+
23+
private static int execute(CommandSourceStack sender) {
24+
Data data = new Data();
25+
26+
data.format = PurpurConfig.uptimeFormat;
27+
data.hide = true;
28+
data.millis = System.currentTimeMillis() - MinecraftServer.startTimeMillis;
29+
30+
process(data, "<days>", PurpurConfig.uptimeDay, PurpurConfig.uptimeDays, TimeUnit.DAYS, TimeUnit.MILLISECONDS::toDays);
31+
process(data, "<hours>", PurpurConfig.uptimeHour, PurpurConfig.uptimeHours, TimeUnit.HOURS, TimeUnit.MILLISECONDS::toHours);
32+
process(data, "<minutes>", PurpurConfig.uptimeMinute, PurpurConfig.uptimeMinutes, TimeUnit.MINUTES, TimeUnit.MILLISECONDS::toMinutes);
33+
data.hide = false; // never hide seconds
34+
process(data, "<seconds>", PurpurConfig.uptimeSecond, PurpurConfig.uptimeSeconds, TimeUnit.SECONDS, TimeUnit.MILLISECONDS::toSeconds);
35+
36+
Component output = MiniMessage.miniMessage().deserialize(PurpurConfig.uptimeCommandOutput, Placeholder.unparsed("uptime", data.format));
37+
sender.sendSuccess(output, false);
38+
return 1;
39+
}
40+
41+
private static void process(Data data, String replace, String singular, String plural, TimeUnit unit, Function<Long, Long> func) {
42+
if (data.format.contains(replace)) {
43+
long val = func.apply(data.millis);
44+
if (data.hide) data.hide = val == 0;
45+
if (!data.hide) data.millis -= unit.toMillis(val);
46+
data.format = data.format.replace(replace, data.hide ? "" : String.format(val == 1 ? singular : plural, val));
47+
}
48+
}
49+
50+
private static class Data {
51+
String format;
52+
boolean hide;
53+
long millis;
54+
}
55+
}

0 commit comments

Comments
 (0)