Add cooldown mechanism to Login command

This commit is contained in:
akastijn 2025-07-04 21:41:33 +02:00
parent e591a0c9c3
commit 4e66e00eae

View File

@ -1,6 +1,12 @@
package com.alttd.webinterface.commands; package com.alttd.webinterface.commands;
import com.alttd.webinterface.config.Config; import com.alttd.webinterface.config.Config;
import java.time.Instant;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import com.alttd.webinterface.web_interact.AuthService; import com.alttd.webinterface.web_interact.AuthService;
import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.tree.LiteralCommandNode; import com.mojang.brigadier.tree.LiteralCommandNode;
@ -13,6 +19,8 @@ import net.kyori.adventure.text.minimessage.MiniMessage;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public class Login { public class Login {
private static final Map<UUID, Instant> cooldowns = new ConcurrentHashMap<>();
private static final int COOLDOWN_SECONDS = 15;
public Login(ProxyServer proxyServer) { public Login(ProxyServer proxyServer) {
LiteralCommandNode<CommandSource> commandStart = LiteralArgumentBuilder LiteralCommandNode<CommandSource> commandStart = LiteralArgumentBuilder
@ -23,6 +31,13 @@ public class Login {
context.getSource().sendMessage(MiniMessage.miniMessage().deserialize("<red>You must be a player to use this command.</red>")); context.getSource().sendMessage(MiniMessage.miniMessage().deserialize("<red>You must be a player to use this command.</red>"));
return 0; return 0;
} }
if (isOnCooldown(player.getUniqueId())) {
player.sendMessage(MiniMessage.miniMessage().deserialize("<red>Please wait before using this command again.</red>"));
return 0;
}
cooldowns.put(player.getUniqueId(), Instant.now().plusSeconds(COOLDOWN_SECONDS));
AuthService.getLoginCodeAsync(player.getUniqueId()).thenAccept(optionalLoginCode -> { AuthService.getLoginCodeAsync(player.getUniqueId()).thenAccept(optionalLoginCode -> {
optionalLoginCode.ifPresentOrElse((loginCode) -> { optionalLoginCode.ifPresentOrElse((loginCode) -> {
player.sendMessage(MiniMessage.miniMessage().deserialize(resolveLogin(Config.YOUR_LOGIN_CODE, loginCode))); player.sendMessage(MiniMessage.miniMessage().deserialize(resolveLogin(Config.YOUR_LOGIN_CODE, loginCode)));
@ -42,6 +57,17 @@ public class Login {
proxyServer.getCommandManager().register(metaStart, brigadierCommandStart); proxyServer.getCommandManager().register(metaStart, brigadierCommandStart);
} }
private boolean isOnCooldown(UUID uuid) {
Instant lastUsage = cooldowns.get(uuid);
if (lastUsage != null) {
if (lastUsage.isAfter(Instant.now())) {
return true;
}
cooldowns.remove(uuid);
}
return false;
}
private @NotNull String resolveLogin(String message, String loginCode) { private @NotNull String resolveLogin(String message, String loginCode) {
return message return message
.replace("<login_endpoint>", Config.LOGIN_ENDPOINT) .replace("<login_endpoint>", Config.LOGIN_ENDPOINT)