From 8a39edab39846fa1f39676b7e2f316dbb393dd10 Mon Sep 17 00:00:00 2001 From: Kowalski Date: Mon, 27 Jul 2026 12:43:46 +0200 Subject: [PATCH 1/3] accept latest teleport request if no player specified --- .../TeleportRequestService.java | 29 ++++++------ .../teleportrequest/TpaAcceptCommand.java | 19 ++++++++ .../self/TeleportHereRequestService.java | 36 ++++++--------- .../self/TpaHereActionCommand.java | 44 ++++++++++++++----- 4 files changed, 79 insertions(+), 49 deletions(-) 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()); } } From 6c89e5c9f9233123ffcba116ef9cf2ef1d33974b Mon Sep 17 00:00:00 2001 From: Kowalski Date: Sun, 6 Sep 2026 12:22:16 +0200 Subject: [PATCH 2/3] Apply team review suggestions --- .../feature/teleportrequest/TeleportRequestService.java | 9 ++++++++- .../core/feature/teleportrequest/TpaAcceptCommand.java | 5 +---- .../teleportrequest/self/TeleportHereRequestService.java | 9 ++++++++- .../teleportrequest/self/TpaHereActionCommand.java | 5 +---- 4 files changed, 18 insertions(+), 10 deletions(-) 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 403fc0dde..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 @@ -8,6 +8,7 @@ import java.util.Comparator; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.UUID; @Service @@ -36,10 +37,16 @@ boolean hasRequest(UUID requester, UUID target) { return request != null && request.target().equals(target); } + 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) { 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(); } 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 79ce64c4a..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 @@ -11,7 +11,6 @@ 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; @@ -38,10 +37,8 @@ class TpaAcceptCommand { @Execute @DescriptionDocs(description = "Accept the last received teleport request") void executeLatest(@Sender Player player) { - Player target = this.requestService.findRequests(player.getUniqueId()).stream() + Player target = this.requestService.findLatestRequest(player.getUniqueId()) .map(this.server::getPlayer) - .filter(Objects::nonNull) - .findFirst() .orElse(null); if (target == null) { 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 b1c9c2c78..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 @@ -9,6 +9,7 @@ import java.util.Comparator; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.UUID; @Service @@ -37,10 +38,16 @@ boolean hasRequest(UUID requester, UUID target) { return request != null && request.target().equals(target); } + 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) { 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(); } 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 65ac57ff2..84ecddc43 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,7 +12,6 @@ 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; @@ -39,10 +38,8 @@ class TpaHereActionCommand { @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() + Player target = this.requestService.findLatestRequest(player.getUniqueId()) .map(this.server::getPlayer) - .filter(Objects::nonNull) - .findFirst() .orElse(null); if (target == null) { From 5d2dc5cc9178e22573548a8587f5c3bbef1614ff Mon Sep 17 00:00:00 2001 From: Kowalski Date: Sun, 6 Sep 2026 14:24:10 +0200 Subject: [PATCH 3/3] Fix request owner id in tpahere accept and deny --- .../teleportrequest/self/TpaHereActionCommand.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) 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 84ecddc43..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 @@ -55,6 +55,7 @@ void acceptLatest(@Sender Player player) { @Permission("eternalcore.tpaccept") void accept(@Sender Player player, @Arg(SelfRequesterArgument.KEY) Player target) { UUID playerId = player.getUniqueId(); + UUID targetId = target.getUniqueId(); this.teleportTaskService.createTeleport( playerId, @@ -63,7 +64,7 @@ void accept(@Sender Player player, @Arg(SelfRequesterArgument.KEY) Player target this.settings.tpaTimer() ); - this.requestService.removeRequest(playerId); + this.requestService.removeRequest(targetId); this.noticeService .create() @@ -74,7 +75,7 @@ void accept(@Sender Player player, @Arg(SelfRequesterArgument.KEY) Player target this.noticeService .create() - .player(playerId) + .player(targetId) .notice(translation -> translation.tpa().tpaAcceptReceivedMessage()) .placeholder("{PLAYER}", player.getName()) .send(); @@ -85,7 +86,9 @@ void accept(@Sender Player player, @Arg(SelfRequesterArgument.KEY) Player target @DescriptionDocs(description = "Deny a teleport here request") void executeTarget(@Sender Player player, @Arg(SelfRequesterArgument.KEY) Player target) { UUID playerId = player.getUniqueId(); - this.requestService.removeRequest(playerId); + UUID targetId = target.getUniqueId(); + + this.requestService.removeRequest(targetId); this.noticeService .create() @@ -96,7 +99,7 @@ void executeTarget(@Sender Player player, @Arg(SelfRequesterArgument.KEY) Player this.noticeService .create() - .player(playerId) + .player(targetId) .notice(translation -> translation.tpa().tpaDenyReceivedMessage()) .placeholder("{PLAYER}", player.getName()) .send();