Add uptime command

This commit is contained in:
William Blake Galbreath
2025-01-11 23:08:45 -08:00
committed by granny
parent 4b07a47c59
commit 53d235c392
5 changed files with 85 additions and 144 deletions

View File

@@ -8,13 +8,14 @@
import org.slf4j.Logger;
public class Commands {
@@ -245,6 +_,10 @@
@@ -245,6 +_,11 @@
StopCommand.register(this.dispatcher);
TransferCommand.register(this.dispatcher);
WhitelistCommand.register(this.dispatcher);
+ org.purpurmc.purpur.command.CreditsCommand.register(this.dispatcher); // Purpur - Add credits command
+ org.purpurmc.purpur.command.DemoCommand.register(this.dispatcher); // Purpur - Add demo command
+ org.purpurmc.purpur.command.PingCommand.register(this.dispatcher); // Purpur - Add ping command
+ org.purpurmc.purpur.command.UptimeCommand.register(this.dispatcher); // Purpur - Add uptime command
+ org.purpurmc.purpur.command.TPSBarCommand.register(this.dispatcher); // Purpur - Implement TPSBar
}

View File

@@ -1,5 +1,13 @@
--- a/net/minecraft/server/MinecraftServer.java
+++ b/net/minecraft/server/MinecraftServer.java
@@ -284,6 +_,7 @@
public joptsimple.OptionSet options;
public org.bukkit.command.ConsoleCommandSender console;
public static int currentTick; // Paper - improve tick loop
+ public static final long startTimeMillis = System.currentTimeMillis(); // Purpur - Add uptime command
public java.util.Queue<Runnable> processQueue = new java.util.concurrent.ConcurrentLinkedQueue<Runnable>();
public int autosavePeriod;
// Paper - don't store the vanilla dispatcher
@@ -294,7 +_,7 @@
public static final int TICK_TIME = 1000000000 / MinecraftServer.TPS;
private static final int SAMPLE_INTERVAL = 20; // Paper - improve server tick loop

View File

@@ -172,6 +172,7 @@ public class PurpurConfig {
public static String pingCommandOutput = "<green>%s's ping is %sms";
public static String tpsbarCommandOutput = "<green>Tpsbar toggled <onoff> for <target>";
public static String dontRunWithScissors = "<red><italic>Don't run with scissors!";
public static String uptimeCommandOutput = "<green>Server uptime is <uptime>";
public static String unverifiedUsername = "default";
private static void messages() {
cannotRideMob = getString("settings.messages.cannot-ride-mob", cannotRideMob);
@@ -185,6 +186,7 @@ public class PurpurConfig {
pingCommandOutput = getString("settings.messages.ping-command-output", pingCommandOutput);
tpsbarCommandOutput = getString("settings.messages.tpsbar-command-output", tpsbarCommandOutput);
dontRunWithScissors = getString("settings.messages.dont-run-with-scissors", dontRunWithScissors);
uptimeCommandOutput = getString("settings.messages.uptime-command-output", uptimeCommandOutput);
unverifiedUsername = getString("settings.messages.unverified-username", unverifiedUsername);
}
@@ -237,6 +239,15 @@ public class PurpurConfig {
public static int commandTPSBarTickInterval = 20;
public static boolean commandGamemodeRequiresPermission = false;
public static boolean hideHiddenPlayersFromEntitySelector = false;
public static String uptimeFormat = "<days><hours><minutes><seconds>";
public static String uptimeDay = "%02d day, ";
public static String uptimeDays = "%02d days, ";
public static String uptimeHour = "%02d hour, ";
public static String uptimeHours = "%02d hours, ";
public static String uptimeMinute = "%02d minute, and ";
public static String uptimeMinutes = "%02d minutes, and ";
public static String uptimeSecond = "%02d second";
public static String uptimeSeconds = "%02d seconds";
private static void commandSettings() {
commandTPSBarTitle = getString("settings.command.tpsbar.title", commandTPSBarTitle);
commandTPSBarProgressOverlay = BossBar.Overlay.valueOf(getString("settings.command.tpsbar.overlay", commandTPSBarProgressOverlay.name()));
@@ -250,6 +261,15 @@ public class PurpurConfig {
commandTPSBarTickInterval = getInt("settings.command.tpsbar.tick-interval", commandTPSBarTickInterval);
commandGamemodeRequiresPermission = getBoolean("settings.command.gamemode.requires-specific-permission", commandGamemodeRequiresPermission);
hideHiddenPlayersFromEntitySelector = getBoolean("settings.command.hide-hidden-players-from-entity-selector", hideHiddenPlayersFromEntitySelector);
uptimeFormat = getString("settings.command.uptime.format", uptimeFormat);
uptimeDay = getString("settings.command.uptime.day", uptimeDay);
uptimeDays = getString("settings.command.uptime.days", uptimeDays);
uptimeHour = getString("settings.command.uptime.hour", uptimeHour);
uptimeHours = getString("settings.command.uptime.hours", uptimeHours);
uptimeMinute = getString("settings.command.uptime.minute", uptimeMinute);
uptimeMinutes = getString("settings.command.uptime.minutes", uptimeMinutes);
uptimeSecond = getString("settings.command.uptime.second", uptimeSecond);
uptimeSeconds = getString("settings.command.uptime.seconds", uptimeSeconds);
}
public static int barrelRows = 3;

View File

@@ -0,0 +1,55 @@
package org.purpurmc.purpur.command;
import com.mojang.brigadier.CommandDispatcher;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands;
import net.minecraft.server.MinecraftServer;
import org.purpurmc.purpur.PurpurConfig;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
public class UptimeCommand {
public static void register(CommandDispatcher<CommandSourceStack> dispatcher) {
dispatcher.register(Commands.literal("uptime")
.requires((listener) -> listener.hasPermission(2, "bukkit.command.uptime"))
.executes((context) -> execute(context.getSource()))
);
}
private static int execute(CommandSourceStack sender) {
Data data = new Data();
data.format = PurpurConfig.uptimeFormat;
data.hide = true;
data.millis = System.currentTimeMillis() - MinecraftServer.startTimeMillis;
process(data, "<days>", PurpurConfig.uptimeDay, PurpurConfig.uptimeDays, TimeUnit.DAYS, TimeUnit.MILLISECONDS::toDays);
process(data, "<hours>", PurpurConfig.uptimeHour, PurpurConfig.uptimeHours, TimeUnit.HOURS, TimeUnit.MILLISECONDS::toHours);
process(data, "<minutes>", PurpurConfig.uptimeMinute, PurpurConfig.uptimeMinutes, TimeUnit.MINUTES, TimeUnit.MILLISECONDS::toMinutes);
data.hide = false; // never hide seconds
process(data, "<seconds>", PurpurConfig.uptimeSecond, PurpurConfig.uptimeSeconds, TimeUnit.SECONDS, TimeUnit.MILLISECONDS::toSeconds);
Component output = MiniMessage.miniMessage().deserialize(PurpurConfig.uptimeCommandOutput, Placeholder.unparsed("uptime", data.format));
sender.sendSuccess(output, false);
return 1;
}
private static void process(Data data, String replace, String singular, String plural, TimeUnit unit, Function<Long, Long> func) {
if (data.format.contains(replace)) {
long val = func.apply(data.millis);
if (data.hide) data.hide = val == 0;
if (!data.hide) data.millis -= unit.toMillis(val);
data.format = data.format.replace(replace, data.hide ? "" : String.format(val == 1 ? singular : plural, val));
}
}
private static class Data {
String format;
boolean hide;
long millis;
}
}