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..27e085393 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,15 +4,17 @@ 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.Optional; import java.util.UUID; @Service class TeleportRequestService { - private final Cache requests; + private final Cache requests; @Inject TeleportRequestService(TeleportRequestSettings settings) { @@ -23,7 +25,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 +33,24 @@ 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()); - } - } + Optional findLatestRequest(UUID target) { + return this.requests.asMap().entrySet().stream() + .filter(entry -> entry.getValue().target().equals(target)) + .max(Comparator.comparing(entry -> entry.getValue().createdAt())) + .map(Map.Entry::getKey); + } - return requesters; + List findRequests(UUID target) { + return this.requests.asMap().entrySet().stream() + .filter(entry -> entry.getValue().target().equals(target)) + .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..7a2c14b6b 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 @@ -34,6 +34,22 @@ class TpaAcceptCommand { this.server = server; } + @Execute + @DescriptionDocs(description = "Accept the last received teleport request") + void executeLatest(@Sender Player player) { + Player target = this.requestService.findLatestRequest(player.getUniqueId()) + .map(this.server::getPlayer) + .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..f90fe5369 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,15 +5,17 @@ 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.Optional; import java.util.UUID; @Service class TeleportHereRequestService { - private final Cache requests; + private final Cache requests; @Inject TeleportHereRequestService(TeleportRequestSettings settings) { @@ -24,7 +26,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 +34,24 @@ 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; - } - } + Request request = this.requests.getIfPresent(requester); + return request != null && request.target().equals(target); + } - return false; + Optional findLatestRequest(UUID target) { + return this.requests.asMap().entrySet().stream() + .filter(entry -> entry.getValue().target().equals(target)) + .max(Comparator.comparing(entry -> entry.getValue().createdAt())) + .map(Map.Entry::getKey); } 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)) + .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..73d055c59 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 @@ -34,28 +34,48 @@ 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.findLatestRequest(player.getUniqueId()) + .map(this.server::getPlayer) + .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(); + UUID targetId = target.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(targetId); 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(targetId) .notice(translation -> translation.tpa().tpaAcceptReceivedMessage()) .placeholder("{PLAYER}", player.getName()) .send(); @@ -65,18 +85,21 @@ 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(); + UUID targetId = target.getUniqueId(); + + this.requestService.removeRequest(targetId); 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(targetId) .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()); } }