From 4e66e00eae7358040c028fc403d9f03b196ea820 Mon Sep 17 00:00:00 2001 From: akastijn Date: Fri, 4 Jul 2025 21:41:33 +0200 Subject: [PATCH] Add cooldown mechanism to Login command --- .../alttd/webinterface/commands/Login.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/main/java/com/alttd/webinterface/commands/Login.java b/src/main/java/com/alttd/webinterface/commands/Login.java index d20b47c..a379660 100644 --- a/src/main/java/com/alttd/webinterface/commands/Login.java +++ b/src/main/java/com/alttd/webinterface/commands/Login.java @@ -1,6 +1,12 @@ package com.alttd.webinterface.commands; 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.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.tree.LiteralCommandNode; @@ -13,6 +19,8 @@ import net.kyori.adventure.text.minimessage.MiniMessage; import org.jetbrains.annotations.NotNull; public class Login { + private static final Map cooldowns = new ConcurrentHashMap<>(); + private static final int COOLDOWN_SECONDS = 15; public Login(ProxyServer proxyServer) { LiteralCommandNode commandStart = LiteralArgumentBuilder @@ -23,6 +31,13 @@ public class Login { context.getSource().sendMessage(MiniMessage.miniMessage().deserialize("You must be a player to use this command.")); return 0; } + + if (isOnCooldown(player.getUniqueId())) { + player.sendMessage(MiniMessage.miniMessage().deserialize("Please wait before using this command again.")); + return 0; + } + cooldowns.put(player.getUniqueId(), Instant.now().plusSeconds(COOLDOWN_SECONDS)); + AuthService.getLoginCodeAsync(player.getUniqueId()).thenAccept(optionalLoginCode -> { optionalLoginCode.ifPresentOrElse((loginCode) -> { player.sendMessage(MiniMessage.miniMessage().deserialize(resolveLogin(Config.YOUR_LOGIN_CODE, loginCode))); @@ -42,6 +57,17 @@ public class Login { 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) { return message .replace("", Config.LOGIN_ENDPOINT)