diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestService.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestService.java index e20ab4cc4..403fc0dde 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestService.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestService.java @@ -4,7 +4,8 @@ import com.eternalcode.core.injector.annotations.component.Service; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; -import java.util.ArrayList; +import java.time.Instant; +import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.UUID; @@ -12,7 +13,7 @@ @Service class TeleportRequestService { - private final Cache requests; + private final Cache requests; @Inject TeleportRequestService(TeleportRequestSettings settings) { @@ -23,7 +24,7 @@ class TeleportRequestService { } void createRequest(UUID requester, UUID target) { - this.requests.put(requester, target); + this.requests.put(requester, new Request(target, Instant.now())); } void removeRequest(UUID requester) { @@ -31,22 +32,18 @@ void removeRequest(UUID requester) { } boolean hasRequest(UUID requester, UUID target) { - UUID foundTarget = this.requests.getIfPresent(requester); - return foundTarget != null && foundTarget.equals(target); + Request request = this.requests.getIfPresent(requester); + return request != null && request.target().equals(target); } List findRequests(UUID target) { - Map map = this.requests.asMap(); - - List requesters = new ArrayList<>(); - - for (Map.Entry entry : map.entrySet()) { - if (entry.getValue().equals(target)) { - requesters.add(entry.getKey()); - } - } - - return requesters; + return this.requests.asMap().entrySet().stream() + .filter(entry -> entry.getValue().target().equals(target)) + .sorted(Map.Entry.comparingByValue(Comparator.comparing(Request::createdAt).reversed())) + .map(Map.Entry::getKey) + .toList(); } + private record Request(UUID target, Instant createdAt) {} + } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TpaAcceptCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TpaAcceptCommand.java index e6909872c..79ce64c4a 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TpaAcceptCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TpaAcceptCommand.java @@ -11,6 +11,7 @@ import dev.rollczi.litecommands.annotations.execute.Execute; import dev.rollczi.litecommands.annotations.permission.Permission; import java.util.List; +import java.util.Objects; import java.util.UUID; import org.bukkit.Server; import org.bukkit.entity.Player; @@ -34,6 +35,24 @@ class TpaAcceptCommand { this.server = server; } + @Execute + @DescriptionDocs(description = "Accept the last received teleport request") + void executeLatest(@Sender Player player) { + Player target = this.requestService.findRequests(player.getUniqueId()).stream() + .map(this.server::getPlayer) + .filter(Objects::nonNull) + .findFirst() + .orElse(null); + + if (target == null) { + this.noticeService.player(player.getUniqueId(), translation -> translation.tpa().tpaAcceptNoRequestMessage()); + + return; + } + + this.executeTarget(player, target); + } + @Execute @DescriptionDocs(description = "Accept teleport request", arguments = "") void executeTarget(@Sender Player player, @Arg(RequesterArgument.KEY) Player target) { diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/self/TeleportHereRequestService.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/self/TeleportHereRequestService.java index ffcdcbfbc..b1c9c2c78 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/self/TeleportHereRequestService.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/self/TeleportHereRequestService.java @@ -5,7 +5,8 @@ import com.eternalcode.core.injector.annotations.component.Service; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; -import java.util.ArrayList; +import java.time.Instant; +import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.UUID; @@ -13,7 +14,7 @@ @Service class TeleportHereRequestService { - private final Cache requests; + private final Cache requests; @Inject TeleportHereRequestService(TeleportRequestSettings settings) { @@ -24,7 +25,7 @@ class TeleportHereRequestService { } void createRequest(UUID requester, UUID target) { - this.requests.put(requester, target); + this.requests.put(requester, new Request(target, Instant.now())); } void removeRequest(UUID requester) { @@ -32,29 +33,18 @@ void removeRequest(UUID requester) { } boolean hasRequest(UUID requester, UUID target) { - Map map = this.requests.asMap(); - - for (Map.Entry entry : map.entrySet()) { - if (entry.getKey().equals(requester) && entry.getValue().equals(target)) { - return true; - } - } - - return false; + Request request = this.requests.getIfPresent(requester); + return request != null && request.target().equals(target); } List findRequests(UUID target) { - Map map = this.requests.asMap(); - - List requesters = new ArrayList<>(); - - for (Map.Entry entry : map.entrySet()) { - if (entry.getValue().equals(target)) { - requesters.add(entry.getKey()); - } - } - - return requesters; + return this.requests.asMap().entrySet().stream() + .filter(entry -> entry.getValue().target().equals(target)) + .sorted(Map.Entry.comparingByValue(Comparator.comparing(Request::createdAt).reversed())) + .map(Map.Entry::getKey) + .toList(); } + private record Request(UUID target, Instant createdAt) {} + } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/self/TpaHereActionCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/self/TpaHereActionCommand.java index 77421d826..65ac57ff2 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/self/TpaHereActionCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/self/TpaHereActionCommand.java @@ -12,6 +12,7 @@ import dev.rollczi.litecommands.annotations.execute.Execute; import dev.rollczi.litecommands.annotations.permission.Permission; import java.util.List; +import java.util.Objects; import java.util.UUID; import org.bukkit.Server; import org.bukkit.entity.Player; @@ -34,28 +35,49 @@ class TpaHereActionCommand { this.server = server; } + @Execute(name = "tpahereaccept") + @Permission("eternalcore.tpaccept") + @DescriptionDocs(description = "Accept the last received teleport here request") + void acceptLatest(@Sender Player player) { + Player target = this.requestService.findRequests(player.getUniqueId()).stream() + .map(this.server::getPlayer) + .filter(Objects::nonNull) + .findFirst() + .orElse(null); + + if (target == null) { + this.noticeService.player(player.getUniqueId(), translation -> translation.tpa().tpaAcceptNoRequestMessage()); + + return; + } + + this.accept(player, target); + } + @Execute(name = "tpahereaccept") @Permission("eternalcore.tpaccept") void accept(@Sender Player player, @Arg(SelfRequesterArgument.KEY) Player target) { + UUID playerId = player.getUniqueId(); + this.teleportTaskService.createTeleport( - player.getUniqueId(), + playerId, PositionAdapter.convert(player.getLocation()), PositionAdapter.convert(target.getLocation()), this.settings.tpaTimer() ); - this.requestService.removeRequest(target.getUniqueId()); + this.requestService.removeRequest(playerId); this.noticeService .create() - .player(player.getUniqueId()) + .player(playerId) .notice(translation -> translation.tpa().tpaAcceptMessage()) .placeholder("{PLAYER}", target.getName()) .send(); this.noticeService .create() - .player(target.getUniqueId()) + .player(playerId) .notice(translation -> translation.tpa().tpaAcceptReceivedMessage()) .placeholder("{PLAYER}", player.getName()) .send(); @@ -65,18 +87,19 @@ void accept(@Sender Player player, @Arg(SelfRequesterArgument.KEY) Player target @Permission("eternalcore.tpahere.deny") @DescriptionDocs(description = "Deny a teleport here request") void executeTarget(@Sender Player player, @Arg(SelfRequesterArgument.KEY) Player target) { - this.requestService.removeRequest(target.getUniqueId()); + UUID playerId = player.getUniqueId(); + this.requestService.removeRequest(playerId); this.noticeService .create() - .player(player.getUniqueId()) + .player(playerId) .notice(translation -> translation.tpa().tpaDenyDoneMessage()) .placeholder("{PLAYER}", target.getName()) .send(); this.noticeService .create() - .player(target.getUniqueId()) + .player(playerId) .notice(translation -> translation.tpa().tpaDenyReceivedMessage()) .placeholder("{PLAYER}", player.getName()) .send(); @@ -86,10 +109,11 @@ void executeTarget(@Sender Player player, @Arg(SelfRequesterArgument.KEY) Player @Permission("eternalcore.tpahere.deny") @DescriptionDocs(description = "Deny all teleport here requests") void executeAll(@Sender Player player) { - List requests = this.requestService.findRequests(player.getUniqueId()); + UUID playerId = player.getUniqueId(); + List requests = this.requestService.findRequests(playerId); if (requests.isEmpty()) { - this.noticeService.player(player.getUniqueId(), translation -> translation.tpa().tpaDenyNoRequestMessage()); + this.noticeService.player(playerId, translation -> translation.tpa().tpaDenyNoRequestMessage()); return; } @@ -107,7 +131,7 @@ void executeAll(@Sender Player player) { } } - this.noticeService.player(player.getUniqueId(), translation -> translation.tpa().tpaDenyAllDenied()); + this.noticeService.player(playerId, translation -> translation.tpa().tpaDenyAllDenied()); } }