From 2c7a3a8c3f242d6460d0b157a683149655ff6021 Mon Sep 17 00:00:00 2001 From: Warrior <50800980+Warriorrrr@users.noreply.github.com> Date: Sun, 14 Jul 2024 20:18:44 +0200 Subject: [PATCH] Update pause command --- pom.xml | 15 ++-- src/main/java/net/earthmc/queue/Queue.java | 35 +++++++- .../java/net/earthmc/queue/QueuePlugin.java | 33 ++++---- .../earthmc/queue/commands/PauseCommand.java | 83 ++++++++----------- .../earthmc/queue/commands/QueueCommand.java | 7 +- 5 files changed, 95 insertions(+), 78 deletions(-) diff --git a/pom.xml b/pom.xml index 70a881d..7284a21 100644 --- a/pom.xml +++ b/pom.xml @@ -25,13 +25,13 @@ com.velocitypowered velocity-api - 3.1.2-SNAPSHOT + 3.3.0-SNAPSHOT provided - mysql - mysql-connector-java - 8.0.30 + com.mysql + mysql-connector-j + 8.0.31 org.junit.jupiter @@ -81,14 +81,13 @@ - com.zaxxer.hikari - net.earthmc.queue.libs.hikari + com.mysql + net.earthmc.queue.libs.mysql - com.zaxxer:HikariCP - mysql:mysql-connector-java + com.mysql:mysql-connector-j diff --git a/src/main/java/net/earthmc/queue/Queue.java b/src/main/java/net/earthmc/queue/Queue.java index 5878fc9..474b450 100644 --- a/src/main/java/net/earthmc/queue/Queue.java +++ b/src/main/java/net/earthmc/queue/Queue.java @@ -7,6 +7,10 @@ import net.earthmc.queue.object.Ratio; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.Style; +import net.kyori.adventure.text.format.TextDecoration; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.VisibleForTesting; import java.time.Duration; @@ -38,6 +42,7 @@ public class Queue { private int maxPlayers; private boolean paused; + private String pauseReason; private Instant unpauseTime = Instant.MAX; private Instant lastSendTime = Instant.EPOCH; private int failedAttempts; @@ -167,7 +172,7 @@ public void sendProgressMessages(SubQueue queue) { player.sendMessage(Component.text("You are currently in position ", NamedTextColor.YELLOW).append(Component.text(player.position() + 1, NamedTextColor.GREEN).append(Component.text(" of ", NamedTextColor.YELLOW).append(Component.text(queue.players().size(), NamedTextColor.GREEN).append(Component.text(" for " + formattedName + ".", NamedTextColor.YELLOW)))))); if (paused) - player.sendMessage(Component.text("The queue you are currently in is paused.", NamedTextColor.GRAY)); + sendPausedQueueMessage(player); } } @@ -215,8 +220,9 @@ public void enqueue(QueuedPlayer player, boolean confirmation) { if (!player.priority().message().equals(Component.empty())) player.sendMessage(player.priority().message()); - if (paused) - player.sendMessage(Component.text("The queue you are currently in is paused.", NamedTextColor.GRAY)); + if (paused) { + sendPausedQueueMessage(player); + } } public int insertionIndex(QueuedPlayer player, SubQueue subQueue) { @@ -294,19 +300,40 @@ public boolean paused() { } public void pause(boolean paused) { - pause(paused, Instant.MAX); + pause(paused, Instant.MAX, null); } public void pause(boolean paused, Instant unpauseTime) { + pause(paused, unpauseTime, null); + } + + public void pause(boolean paused, Instant unpauseTime, @Nullable String reason) { this.paused = paused; this.unpauseTime = unpauseTime; + this.pauseReason = reason; this.failedAttempts = 0; } + public void sendPausedQueueMessage(final QueuedPlayer player) { + if (!paused) + return; + + player.sendMessage(Component.text("The queue you are currently in is paused.", NamedTextColor.GRAY)); + + if (pauseReason != null) + player.sendMessage(Component.text("Reason: ", NamedTextColor.GRAY).append(Component.text(pauseReason, Style.style(TextDecoration.ITALIC)))); + } + + @NotNull public Instant unpauseTime() { return this.unpauseTime; } + @Nullable + public String pauseReason() { + return this.pauseReason; + } + @Override public boolean equals(Object other) { if (this == other) diff --git a/src/main/java/net/earthmc/queue/QueuePlugin.java b/src/main/java/net/earthmc/queue/QueuePlugin.java index 31dd552..edc1c32 100644 --- a/src/main/java/net/earthmc/queue/QueuePlugin.java +++ b/src/main/java/net/earthmc/queue/QueuePlugin.java @@ -70,7 +70,7 @@ public QueuePlugin(ProxyServer proxy, CommandManager commandManager, Logger logg commandManager.register("joinqueue", new JoinCommand(this)); commandManager.register("leavequeue", new LeaveCommand()); - commandManager.register("pausequeue", new PauseCommand()); + commandManager.register(PauseCommand.createCommand(this)); commandManager.register("queue", new QueueCommand(this)); } @@ -330,21 +330,20 @@ public void loadPausedQueues() { if (Files.exists(pausedQueuesPath)) { @SuppressWarnings("UnstableApiUsage") - Type type = new TypeToken>() {}.getType(); + Type type = new TypeToken>(){}.getType(); try { - Map pausedQueues = new Gson().fromJson(Files.readString(pausedQueuesPath), type); - for (Map.Entry entry : pausedQueues.entrySet()) { - Queue queue = queue(entry.getKey()); + Set pausedQueues = new Gson().fromJson(Files.readString(pausedQueuesPath), type); + for (final PausedQueue pausedQueue : pausedQueues) { + Queue queue = queue(pausedQueue.server()); if (queue == null) continue; - Instant instant = Instant.ofEpochSecond(entry.getValue()); - if (Instant.now().isAfter(instant)) + if (Instant.now().isAfter(pausedQueue.unpauseTime())) continue; - queue.pause(true, Instant.ofEpochSecond(entry.getValue())); - logger.info("Re-paused the queue for " + entry.getKey() + "."); + queue.pause(true, pausedQueue.unpauseTime(), pausedQueue.reason()); + logger.info("Re-paused the queue for {}.", pausedQueue.server()); } try { @@ -357,25 +356,29 @@ public void loadPausedQueues() { } public void savePausedQueues() { - Map pausedQueues = new HashMap<>(); + Set pausedQueues = new HashSet<>(); for (Map.Entry entry : this.queues().entrySet()) { if (entry.getValue().paused()) - pausedQueues.put(entry.getKey(), entry.getValue().unpauseTime().getEpochSecond()); + pausedQueues.add(new PausedQueue(entry.getKey(), entry.getValue().unpauseTime(), entry.getValue().pauseReason())); } - if (pausedQueues.size() > 0) { + if (!pausedQueues.isEmpty()) { Path pausedQueuesPath = pluginFolderPath.resolve("paused-queues.json"); try { if (!Files.exists(pausedQueuesPath)) Files.createFile(pausedQueuesPath); - Files.writeString(pausedQueuesPath, new Gson().toJson(pausedQueues)); + @SuppressWarnings("UnstableApiUsage") + Type type = new TypeToken>(){}.getType(); + Files.writeString(pausedQueuesPath, new Gson().toJson(pausedQueues, type)); - logger.info("Successfully saved " + pausedQueues.size() + " paused queue(s) to paused-queues.json"); + logger.info("Successfully saved {} paused queue(s) to paused-queues.json", pausedQueues.size()); } catch (Exception e) { - logger.error("Unable to save " + pausedQueues.size() + " paused queues.", e); + logger.error("Unable to save {} paused queues.", pausedQueues.size(), e); } } } + + private record PausedQueue(String server, Instant unpauseTime, String reason) {} } diff --git a/src/main/java/net/earthmc/queue/commands/PauseCommand.java b/src/main/java/net/earthmc/queue/commands/PauseCommand.java index 8a7167b..4f1bb20 100644 --- a/src/main/java/net/earthmc/queue/commands/PauseCommand.java +++ b/src/main/java/net/earthmc/queue/commands/PauseCommand.java @@ -1,66 +1,51 @@ package net.earthmc.queue.commands; -import com.google.common.primitives.Ints; +import com.mojang.brigadier.Command; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.tree.LiteralCommandNode; +import com.velocitypowered.api.command.BrigadierCommand; import com.velocitypowered.api.command.CommandSource; -import com.velocitypowered.api.command.SimpleCommand; import net.earthmc.queue.Queue; import net.earthmc.queue.QueuePlugin; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import java.time.Instant; -import java.util.Collections; -import java.util.List; -public class PauseCommand extends BaseCommand implements SimpleCommand { - - @Override - @SuppressWarnings("UnstableApiUsage") - public void execute(Invocation invocation) { - CommandSource source = invocation.source(); - - if (!source.hasPermission("queue.pause")) { - source.sendMessage(Component.text("You do not have enough permissions to use this command.", NamedTextColor.RED)); - return; - } - - if (invocation.arguments().length == 0) { - source.sendMessage(Component.text("Not enough arguments. Usage: /pausequeue [queue] [seconds].", NamedTextColor.RED)); - return; - } +public class PauseCommand { + + public static BrigadierCommand createCommand(final QueuePlugin plugin) { + LiteralCommandNode node = BrigadierCommand.literalArgumentBuilder("pausequeue") + .requires(source -> source.hasPermission("queue.pause")) + .then(BrigadierCommand.requiredArgumentBuilder("server", StringArgumentType.word()) + .suggests((ctx, builder) -> { + plugin.queues().keySet().forEach(builder::suggest); + return builder.buildFuture(); + }) + .then(BrigadierCommand.requiredArgumentBuilder("reason", StringArgumentType.greedyString()) + .executes(context -> pause(context, context.getArgument("reason", String.class))) + ) + .executes(context -> pause(context, null))) + .build(); + + return new BrigadierCommand(node); + } - Queue queue = QueuePlugin.instance().queue(invocation.arguments()[0]); + public static int pause(final CommandContext context, String reason) { + String server = context.getArgument("server", String.class); + Queue queue = QueuePlugin.instance().queue(server); if (queue == null) { - source.sendMessage(Component.text(invocation.arguments()[0] + " is not a valid queue.", NamedTextColor.RED)); - return; + context.getSource().sendMessage(Component.text(server + " is not a valid server.", NamedTextColor.RED)); + return 0; } - Instant unpauseTime = Instant.MAX; - boolean usingSeconds = false; - Integer seconds = 0; - - if (invocation.arguments().length > 1) { - seconds = Ints.tryParse(invocation.arguments()[1]); - - usingSeconds = seconds != null; - if (seconds != null) - unpauseTime = Instant.now().plusSeconds(seconds); - } - - if (queue.paused()) - queue.pause(false); - else - queue.pause(true, unpauseTime); - - String message = String.format("You have %s the queue for server %s.", queue.paused() ? "paused" : "resumed", invocation.arguments()[0]); - if (usingSeconds && queue.paused()) - message += " for " + seconds + " seconds."; - - source.sendMessage(Component.text(message, NamedTextColor.GREEN)); - } + queue.pause(!queue.paused(), Instant.MAX, reason); + String message = String.format("You have %s the queue for server %s", queue.paused() ? "paused" : "resumed", server); + if (reason != null) + message += " with the reason '" + reason + "'."; - @Override - public List suggest(Invocation invocation) { - return Collections.emptyList(); + context.getSource().sendMessage(Component.text(message, NamedTextColor.GREEN)); + return Command.SINGLE_SUCCESS; } } diff --git a/src/main/java/net/earthmc/queue/commands/QueueCommand.java b/src/main/java/net/earthmc/queue/commands/QueueCommand.java index bcc89c3..caf4eca 100644 --- a/src/main/java/net/earthmc/queue/commands/QueueCommand.java +++ b/src/main/java/net/earthmc/queue/commands/QueueCommand.java @@ -7,6 +7,8 @@ import net.earthmc.queue.QueuedPlayer; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.Style; +import net.kyori.adventure.text.format.TextDecoration; import org.jetbrains.annotations.NotNull; import java.util.Arrays; @@ -58,8 +60,9 @@ public void execute(Invocation invocation) { QueuedPlayer queuedPlayer = QueuePlugin.instance().queued(player); player.sendMessage(Component.text("You are currently in position ", NamedTextColor.YELLOW).append(Component.text(queuedPlayer.position() + 1, NamedTextColor.GREEN).append(Component.text(" of ", NamedTextColor.YELLOW).append(Component.text(queuedPlayer.queue().getSubQueue(queuedPlayer).players().size(), NamedTextColor.GREEN).append(Component.text(" for " + queuedPlayer.queue().getServerFormatted(), NamedTextColor.YELLOW)))))); - if (queuedPlayer.queue().paused()) - player.sendMessage(Component.text("The queue you are currently in is paused.", NamedTextColor.GRAY)); + if (queuedPlayer.queue().paused()) { + queuedPlayer.queue().sendPausedQueueMessage(queuedPlayer); + } return; }