Skip to content

Commit

Permalink
Update pause command
Browse files Browse the repository at this point in the history
  • Loading branch information
Warriorrrr committed Jul 14, 2024
1 parent 8edf137 commit 2c7a3a8
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 78 deletions.
15 changes: 7 additions & 8 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,13 @@
<dependency>
<groupId>com.velocitypowered</groupId>
<artifactId>velocity-api</artifactId>
<version>3.1.2-SNAPSHOT</version>
<version>3.3.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.31</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
Expand Down Expand Up @@ -81,14 +81,13 @@
</filters>
<relocations>
<relocation>
<pattern>com.zaxxer.hikari</pattern>
<shadedPattern>net.earthmc.queue.libs.hikari</shadedPattern>
<pattern>com.mysql</pattern>
<pattern>net.earthmc.queue.libs.mysql</pattern>
</relocation>
</relocations>
<artifactSet>
<includes>
<include>com.zaxxer:HikariCP</include>
<include>mysql:mysql-connector-java</include>
<include>com.mysql:mysql-connector-j</include>
</includes>
</artifactSet>
</configuration>
Expand Down
35 changes: 31 additions & 4 deletions src/main/java/net/earthmc/queue/Queue.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
}

Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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)
Expand Down
33 changes: 18 additions & 15 deletions src/main/java/net/earthmc/queue/QueuePlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}

Expand Down Expand Up @@ -330,21 +330,20 @@ public void loadPausedQueues() {

if (Files.exists(pausedQueuesPath)) {
@SuppressWarnings("UnstableApiUsage")
Type type = new TypeToken<Map<String, Long>>() {}.getType();
Type type = new TypeToken<Set<PausedQueue>>(){}.getType();

try {
Map<String, Long> pausedQueues = new Gson().fromJson(Files.readString(pausedQueuesPath), type);
for (Map.Entry<String, Long> entry : pausedQueues.entrySet()) {
Queue queue = queue(entry.getKey());
Set<PausedQueue> 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 {
Expand All @@ -357,25 +356,29 @@ public void loadPausedQueues() {
}

public void savePausedQueues() {
Map<String, Long> pausedQueues = new HashMap<>();
Set<PausedQueue> pausedQueues = new HashSet<>();
for (Map.Entry<String, Queue> 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<Set<PausedQueue>>(){}.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) {}
}
83 changes: 34 additions & 49 deletions src/main/java/net/earthmc/queue/commands/PauseCommand.java
Original file line number Diff line number Diff line change
@@ -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<CommandSource> 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<CommandSource> 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<String> suggest(Invocation invocation) {
return Collections.emptyList();
context.getSource().sendMessage(Component.text(message, NamedTextColor.GREEN));
return Command.SINGLE_SUCCESS;
}
}
7 changes: 5 additions & 2 deletions src/main/java/net/earthmc/queue/commands/QueueCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down

0 comments on commit 2c7a3a8

Please sign in to comment.