diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 044afa9..7b8811e 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -4,26 +4,54 @@
-
-
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
-
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
@@ -114,6 +142,7 @@
+
@@ -144,7 +173,7 @@
"keyToString": {
"Gradle.Download Sources.executor": "Run",
"Gradle.core [:core-velocity-impl:shadowJar].executor": "Run",
- "Gradle.core [build].executor": "Run",
+ "Gradle.core [build].executor": "Debug",
"Gradle.core [clean].executor": "Run",
"Gradle.core [publishAllPublicationsToScrowRepository].executor": "Run",
"Gradle.core [publishCoreLibPublicationToScrowRepository].executor": "Run",
@@ -184,6 +213,8 @@
+
+
@@ -363,9 +394,9 @@
-
-
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
index 88b73ad..ba45ef8 100644
--- a/README.md
+++ b/README.md
@@ -3,36 +3,13 @@ TODO
- improve error handling in Task ig
- try with InMemory db and debug postgres implementation
- logging in general, log some exceptions to game chat
-- sleep
+- notification: Friend is now offline/online
+- messages across server
+- /ignore command
environment
-----------
-```shell
-docker network create scrow 2>/dev/null || true
-docker run -d --network scrow -it --rm --name mongo -p 27017:27017 mongo
-docker run -d --network scrow -e ME_CONFIG_MONGODB_SERVER=mongo -e ME_CONFIG_MONGODB_AUTH_PASSWORD='' -e ME_CONFIG_MONGODB_AUTH_USERNAME='' -e ME_CONFIG_BASICAUTH_USERNAME='a' -e ME_CONFIG_BASICAUTH_PASSWORD=1234 --name mongo-express -p 8081:8081 mongo-express
-docker run -d --network scrow -p 4222:4222 --name nats nats
-```
-
-access the mongo-db web interface at http://localhost:8081; username `a`, password `1234`**
-
-## ENV
-
-- HOST_NATS e.g `nats://127.17.0.1:4222`
-- HOST_MONGO e.g `mongodb://localhost:27017/scrow`
-
-## modules
-
-### core-lib
-
-core-lib is a stateless java util library
-
-### core-bukkit-api
-
-core-bukkit-api is stateful and contains api for bukkit development
- * depends on core-lib
-
-### implementations
-
-core-bukkit-impl is a spigot plugin. It shades and implements core-bukkit-api
\ No newline at end of file
+- **core-lib**: stateless library
+- **core-bukkit** stateful plugin/api for minecraft development, depends on core-lib
+- **core-velocity** stateful plugin/api for proxy development, depends on core-lib
\ No newline at end of file
diff --git a/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/ScrowAPI.java b/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/ScrowAPI.java
index 4050735..c391e43 100644
--- a/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/ScrowAPI.java
+++ b/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/ScrowAPI.java
@@ -1,22 +1,25 @@
package de.kentoj.scrow.bukkit;
import de.kentoj.kencommandapi.CommandAPI;
-import de.kentoj.scrow.bukkit.friends.FriendRequestService;
-import de.kentoj.scrow.bukkit.friends.FriendshipService;
-import de.kentoj.scrow.bukkit.misc.EconomyService;
-import de.kentoj.scrow.bukkit.misc.PlayerManager;
+import de.kentoj.scrowlib.friends.FriendRequestService;
+import de.kentoj.scrowlib.friends.FriendshipService;
+import de.kentoj.scrowlib.economy.EconomyService;
+import de.kentoj.scrowlib.player.NetworkPlayer;
+import de.kentoj.scrowlib.player.NetworkPlayerFactory;
import de.kentoj.scrow.bukkit.region.RegionManager;
import de.kentoj.scrowlib.instancemanager.InstanceManager;
import de.kentoj.scrowlib.messaging.MessageBroker;
-import io.nats.client.Connection;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
+import org.bukkit.OfflinePlayer;
import org.bukkit.plugin.Plugin;
import org.jdbi.v3.core.Jdbi;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
+import java.util.UUID;
+
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ScrowAPI {
@@ -41,8 +44,15 @@ public class ScrowAPI {
private static RegionManager regionManager;
@Getter
private static CommandAPI commandApi;
- @Getter
- private static PlayerManager playerManager;
+ private static NetworkPlayerFactory playerFactory;
+
+ public static NetworkPlayer getPlayer(OfflinePlayer player) {
+ return getPlayer(player.getUniqueId());
+ }
+
+ public static NetworkPlayer getPlayer(UUID uuid) {
+ return playerFactory.create(uuid);
+ }
@ApiStatus.Internal
public static void setEconomyService(EconomyService economyService) {
@@ -90,8 +100,8 @@ public class ScrowAPI {
}
@ApiStatus.Internal
- public static void setPlayerManager(PlayerManager playerManager) {
- ScrowAPI.playerManager = playerManager;
+ public static void setPlayerFactory(NetworkPlayerFactory playerFactory) {
+ ScrowAPI.playerFactory = playerFactory;
}
}
diff --git a/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/minigame/MinigameInfo.java b/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/minigame/MinigameInfo.java
deleted file mode 100644
index 170da7d..0000000
--- a/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/minigame/MinigameInfo.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package de.kentoj.scrow.bukkit.minigame;
-
-import de.kentoj.scrowlib.instancemanager.ServerInstance;
-
-public interface MinigameInfo {
-
- String getName();
-
- int getPlayerCount();
-
- ServerInstance getServerInstance();
-}
diff --git a/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/misc/PlayerManager.java b/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/misc/PlayerManager.java
deleted file mode 100644
index 9469be5..0000000
--- a/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/misc/PlayerManager.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package de.kentoj.scrow.bukkit.misc;
-
-import java.util.UUID;
-
-public interface PlayerManager {
-
- void sendPlayer(UUID uuid, String instanceHandle);
-}
diff --git a/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/scheduler/TaskImpl.java b/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/scheduler/TaskImpl.java
index 7157252..b6f2d01 100644
--- a/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/scheduler/TaskImpl.java
+++ b/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/scheduler/TaskImpl.java
@@ -24,7 +24,7 @@ public class TaskImpl implements Task {
private static final ExecutorService EXECUTOR = Executors.newVirtualThreadPerTaskExecutor();
private final Supplier> compute;
- private TaskState cachedResult = null;
+ private volatile TaskState cachedResult = null;
@Override
public CompletableFuture toFuture() {
@@ -90,8 +90,10 @@ public class TaskImpl implements Task {
}
private TaskState state() {
- if (cachedResult == null)
- cachedResult = compute.get();
- return cachedResult;
+ synchronized (this) {
+ if (cachedResult == null)
+ cachedResult = compute.get();
+ return cachedResult;
+ }
}
}
diff --git a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/CoreImplPlugin.java b/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/CoreImplPlugin.java
index 997af36..86177b5 100644
--- a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/CoreImplPlugin.java
+++ b/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/CoreImplPlugin.java
@@ -4,8 +4,6 @@ import de.kentoj.scrow.bukkit.economy.command.CoinsCommand;
import de.kentoj.scrow.bukkit.friends.command.FriendCommand;
import de.kentoj.scrow.bukkit.instancemanager.cache.InstanceCache;
import de.kentoj.scrow.bukkit.instancemanager.command.InstanceCommand;
-import de.kentoj.scrow.bukkit.region.RegionPlayerTracker;
-import de.kentoj.scrow.bukkit.region.RegionTask;
import de.kentoj.scrow.bukkit.instancemanager.command.LobbyCommand;
import de.kentoj.scrow.bukkit.instancemanager.command.PlayCommand;
import org.bukkit.plugin.java.JavaPlugin;
@@ -30,8 +28,6 @@ public class CoreImplPlugin extends JavaPlugin {
ScrowAPI.getCommandApi().register(new LobbyCommand().getRootNode());
}
- new RegionTask(new RegionPlayerTracker()).runTaskTimer(this, 10, 10);
-
// TODO/FIXME
//registerServer();
}
diff --git a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/ScrowAPISurface.java b/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/ScrowAPISurface.java
index f4d6408..f0ba932 100644
--- a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/ScrowAPISurface.java
+++ b/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/ScrowAPISurface.java
@@ -1,14 +1,17 @@
package de.kentoj.scrow.bukkit;
import de.kentoj.kencommandapi.CommandAPI;
-import de.kentoj.scrow.bukkit.economy.InMemoryEconomyService;
-import de.kentoj.scrow.bukkit.economy.PostgresEconomyService;
-import de.kentoj.scrow.bukkit.friends.friendship.InMemoryFriendshipService;
-import de.kentoj.scrow.bukkit.friends.friendship.PostgresFriendshipService;
-import de.kentoj.scrow.bukkit.friends.request.InMemoryFriendRequestService;
-import de.kentoj.scrow.bukkit.friends.request.PostgresFriendRequestService;
-import de.kentoj.scrow.bukkit.playermanager.PlayerManagerImpl;
+import de.kentoj.scrowlib.economy.InMemoryEconomyService;
+import de.kentoj.scrowlib.economy.PostgresEconomyService;
+import de.kentoj.scrowlib.friends.friendship.InMemoryFriendshipService;
+import de.kentoj.scrowlib.friends.friendship.PostgresFriendshipService;
+import de.kentoj.scrowlib.friends.request.InMemoryFriendRequestService;
+import de.kentoj.scrowlib.friends.request.PostgresFriendRequestService;
+import de.kentoj.scrow.bukkit.network.NetworkPlayerWatchdog;
+import de.kentoj.scrowlib.player.NetworkPlayerImpl;
import de.kentoj.scrow.bukkit.region.RegionManagerImpl;
+import de.kentoj.scrow.bukkit.region.RegionPlayerTracker;
+import de.kentoj.scrow.bukkit.region.RegionTask;
import de.kentoj.scrowlib.instancemanager.InstanceManagerImpl;
import de.kentoj.scrowlib.messaging.MessageBroker;
import de.kentoj.scrowlib.utils.EnvUtils;
@@ -17,12 +20,9 @@ import io.nats.client.Options;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.bukkit.plugin.Plugin;
-import org.jdbi.v3.core.ConnectionFactory;
import org.jdbi.v3.core.Jdbi;
import java.io.IOException;
-import java.sql.Connection;
-import java.sql.SQLException;
import java.util.Properties;
@NoArgsConstructor(access = AccessLevel.NONE)
@@ -53,7 +53,7 @@ public class ScrowAPISurface {
ScrowAPI.setJdbi(Jdbi.create(EnvUtils.envOrThrow("HOST_POSTGRES"), props));
}
- ScrowAPI.setPlayerManager(new PlayerManagerImpl());
+ ScrowAPI.setPlayerFactory(playerId -> new NetworkPlayerImpl(ScrowAPI.getMessageBroker(), playerId));
ScrowAPI.setRegionManager(new RegionManagerImpl());
ScrowAPI.setCommandApi(new CommandAPI(plugin));
ScrowAPI.setInstanceManager(new InstanceManagerImpl(ScrowAPI.getMessageBroker()));
@@ -63,6 +63,9 @@ public class ScrowAPISurface {
new PostgresFriendRequestService() : new InMemoryFriendRequestService());
ScrowAPI.setFriendshipService(ScrowAPI.getJdbi() != null ?
new PostgresFriendshipService() : new InMemoryFriendshipService());
+
+ new RegionTask(new RegionPlayerTracker()).runTaskTimer(plugin, 10, 10);
+ new NetworkPlayerWatchdog().listen();
}
public static void destroyScrowAPI() {
diff --git a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendAddLiteral.java b/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendAddLiteral.java
index 0dd2ffe..0a5e8f0 100644
--- a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendAddLiteral.java
+++ b/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendAddLiteral.java
@@ -8,13 +8,16 @@ import de.kentoj.kencommandapi.api.invocation.CommandExecutor;
import de.kentoj.kencommandapi.api.node.CommandNode;
import de.kentoj.kencommandapi.type.OfflinePlayerArgumentType;
import de.kentoj.scrow.bukkit.ScrowAPI;
-import de.kentoj.scrow.bukkit.friends.friendship.FriendshipImpl;
-import de.kentoj.scrow.bukkit.friends.request.FriendRequestImpl;
+import de.kentoj.scrowlib.friends.FriendRequestService;
+import de.kentoj.scrowlib.friends.FriendshipService;
+import de.kentoj.scrowlib.friends.friendship.FriendshipImpl;
+import de.kentoj.scrowlib.friends.request.FriendRequestImpl;
import de.kentoj.scrow.bukkit.scheduler.Task;
import de.kentoj.scrow.bukkit.scheduler.Tasks;
import de.kentoj.scrowlib.convention.ScrowMessageStyle;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
+import net.kyori.adventure.text.Component;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@@ -31,6 +34,8 @@ public class FriendAddLiteral implements CommandExecutor {
private final CommandNode literal;
private final CommandArgument playerArg;
private final ScrowMessageStyle style;
+ private final FriendRequestService requestService = ScrowAPI.getFriendRequestService();
+ private final FriendshipService friendsService = ScrowAPI.getFriendshipService();
public FriendAddLiteral(ScrowMessageStyle style) {
this.style = style;
@@ -54,30 +59,28 @@ public class FriendAddLiteral implements CommandExecutor {
}
private void sendRequest(Player self, OfflinePlayer other) {
- Tasks.runAsync(() -> ScrowAPI.getFriendRequestService()
- .saveFriendRequest(new FriendRequestImpl(self.getUniqueId(), other.getUniqueId())))
+ Tasks.runAsync(() ->
+ requestService.saveFriendRequest(new FriendRequestImpl(self.getUniqueId(), other.getUniqueId())))
.runSync(() -> {
self.sendMessage(style.ok("Successfully sent " + other.getName() + " a friend request."));
- var otherPlayer = other.getPlayer();
- if (otherPlayer != null)
- otherPlayer.sendMessage(style.ok(" wants to be friends with you. Use '/f add " + self.getName() + "' to accept."));
- });
+ var msg = Component.text(self.getName() + " sent you a friend request.")
+ .append(FriendCommand.friendRequestOptions(self.getName(), true));
+ ScrowAPI.getPlayer(other).sendMessage(style.ok(msg));
+ })
+ .await();
}
private void acceptRequest(Player self, OfflinePlayer other) {
Tasks.runAsync(() -> Tasks.awaitAll(
- Tasks.runAsync(() -> ScrowAPI.getFriendRequestService()
- .deleteFriendRequest(self.getUniqueId(), other.getUniqueId())),
- Tasks.runAsync(() -> ScrowAPI.getFriendRequestService()
- .deleteFriendRequest(other.getUniqueId(), self.getUniqueId())),
- Tasks.runAsync(() -> ScrowAPI.getFriendshipService()
- .saveFriendship(new FriendshipImpl(self.getUniqueId(), other.getUniqueId(), Instant.now()))
+ Tasks.runAsync(() -> requestService.deleteFriendRequest(self.getUniqueId(), other.getUniqueId())),
+ Tasks.runAsync(() -> requestService.deleteFriendRequest(other.getUniqueId(), self.getUniqueId())),
+ Tasks.runAsync(() -> friendsService.saveFriendship(new FriendshipImpl(self.getUniqueId(), other.getUniqueId(), Instant.now()))
)))
.runSync(() -> {
self.sendMessage(style.ok("You are now friends with " + other.getName() + "."));
- if (other.getPlayer() != null)
- other.getPlayer().sendMessage(style.ok("You are now friends with " + self.getName() + "."));
- });
+ ScrowAPI.getPlayer(other).sendMessage(style.ok("You are now friends with " + self.getName() + "."));
+ })
+ .await();
}
private Result findAction(Player self, OfflinePlayer other) {
@@ -92,27 +95,24 @@ public class FriendAddLiteral implements CommandExecutor {
if (isAlreadyFriendTask.await())
return Results.failure("You are already friends with " + other.getName() + ".");
if (isAlreadySent.await())
- return Results.failure("You've already sent " + other + " a friend request.");
+ return Results.failure("You've already sent " + other.getName() + " a friend request.");
if (isShouldAccept.await())
return Results.success(AddAction.ACCEPT_REQUEST);
return Results.success(AddAction.SEND_REQUEST);
}
- private static Task checkShouldAccept(Player self, OfflinePlayer other) {
- return Tasks.supplyAsync(() ->
- ScrowAPI.getFriendRequestService().getFriendRequest(other.getUniqueId(), self.getUniqueId()))
+ private Task checkShouldAccept(Player self, OfflinePlayer other) {
+ return Tasks.supplyAsync(() -> requestService.getFriendRequest(other.getUniqueId(), self.getUniqueId()))
.mapSync(Objects::nonNull);
}
- private static Task checkAlreadyFriends(Player self, OfflinePlayer other) {
- return Tasks.supplyAsync(() ->
- ScrowAPI.getFriendshipService().getFriendship(self.getUniqueId(), other.getUniqueId()))
+ private Task checkAlreadyFriends(Player self, OfflinePlayer other) {
+ return Tasks.supplyAsync(() -> friendsService.getFriendship(self.getUniqueId(), other.getUniqueId()))
.mapSync(Objects::nonNull);
}
- private static Task checkAlreadySent(UUID self, UUID other) {
- return Tasks.supplyAsync(() ->
- ScrowAPI.getFriendRequestService().getFriendRequest(self, other))
+ private Task checkAlreadySent(UUID self, UUID other) {
+ return Tasks.supplyAsync(() -> requestService.getFriendRequest(self, other))
.mapSync(Objects::nonNull);
}
diff --git a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendCommand.java b/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendCommand.java
index 4e07f50..fbea61e 100644
--- a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendCommand.java
+++ b/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendCommand.java
@@ -5,18 +5,37 @@ import de.kentoj.kencommandapi.api.node.RootCommandNode;
import de.kentoj.scrowlib.convention.ScrowMessageStyle;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.event.ClickEvent;
+import net.kyori.adventure.text.event.HoverEvent;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.command.CommandSender;
@NoArgsConstructor(access = AccessLevel.NONE)
public class FriendCommand {
public static RootCommandNode create() {
- var style = new ScrowMessageStyle("Friends", NamedTextColor.GREEN);
+ var style = new ScrowMessageStyle("Friends", NamedTextColor.AQUA);
RootCommandNode rootNode = CommandNode.rootNode(style, "f", "friend");
rootNode.addLiteral(new FriendListLiteral(style).getLiteral());
rootNode.addLiteral(new FriendAddLiteral(style).getLiteral());
- rootNode.addLiteral(new FriendRemoveLiteral(style).getRootNode());
+ rootNode.addLiteral(new FriendRemoveLiteral(style).getLiteral());
+ rootNode.addLiteral(new FriendRequestDeclineLiteral(style).getLiteral());
rootNode.addLiteral(new FriendRequestsLiteral(style).getLiteral());
return rootNode;
}
+
+ public static Component friendRequestOptions(String requestSenderName, boolean runInstantly) {
+ return Component.text(" ")
+ .append(Component.text("[accept]")
+ .hoverEvent(HoverEvent.showText(Component.text("click to accept")))
+ .clickEvent(ClickEvent.runCommand("/f add " + requestSenderName))
+ .color(NamedTextColor.GREEN))
+ .append(Component.text(" "))
+ .append(Component.text("[decline]")
+ .hoverEvent(HoverEvent.showText(Component.text("click to decline")))
+ .clickEvent(runInstantly
+ ? ClickEvent.runCommand("/f decline " + requestSenderName)
+ : ClickEvent.suggestCommand("/f decline " + requestSenderName))
+ .color(NamedTextColor.RED));
+ }
}
diff --git a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendListLiteral.java b/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendListLiteral.java
index af26f57..bd92ccf 100644
--- a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendListLiteral.java
+++ b/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendListLiteral.java
@@ -20,7 +20,7 @@ import org.bukkit.entity.Player;
import java.util.List;
import java.util.concurrent.CompletableFuture;
-import static java.util.Objects.*;
+import static java.util.Objects.requireNonNull;
import static net.kyori.adventure.text.Component.text;
public class FriendListLiteral implements CommandExecutor {
@@ -61,14 +61,13 @@ public class FriendListLiteral implements CommandExecutor {
private Component formatList(List friends) {
var message = style.ok(MiniMessage.miniMessage().deserialize("Your friends:"));
for (var friend : friends) {
- var status = text("(").append(friend.isOnline()
- ? text("online").color(NamedTextColor.GRAY)
- : text("offline").color(NamedTextColor.RED))
- .append(text(")"));
+ var status = MiniMessage.miniMessage().deserialize(friend.isOnline()
+ ? " (online)"
+ : " (offline)");
message = message
.appendNewline()
- .append(text("≫").color(NamedTextColor.AQUA))
- .append(text(requireNonNull(friend.getName())))
+ .append(text("≫ ").color(style.getPrefixColor()))
+ .append(text(requireNonNull(friend.getName())).color(NamedTextColor.GRAY))
.append(status);
}
return message;
diff --git a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendRemoveLiteral.java b/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendRemoveLiteral.java
index 6bc6b30..3583e68 100644
--- a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendRemoveLiteral.java
+++ b/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendRemoveLiteral.java
@@ -19,16 +19,16 @@ import java.util.concurrent.CompletableFuture;
public class FriendRemoveLiteral implements CommandExecutor {
@Getter
- private final CommandNode rootNode;
+ private final CommandNode literal;
private final CommandArgument playerArg;
private final ScrowMessageStyle style;
public FriendRemoveLiteral(ScrowMessageStyle style) {
this.style = style;
this.playerArg = CommandArgument.arg("player", OfflinePlayerArgumentType.getInstance());
- this.rootNode = CommandNode.node("remove");
- this.rootNode.addArgument(playerArg);
- this.rootNode.setExecutor(this);
+ this.literal = CommandNode.node("remove");
+ this.literal.addArgument(playerArg);
+ this.literal.setExecutor(this);
}
@Override
diff --git a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendRequestDeclineLiteral.java b/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendRequestDeclineLiteral.java
new file mode 100644
index 0000000..015c3b9
--- /dev/null
+++ b/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendRequestDeclineLiteral.java
@@ -0,0 +1,53 @@
+package de.kentoj.scrow.bukkit.friends.command;
+
+import com.leakyabstractions.result.api.Result;
+import com.leakyabstractions.result.core.Results;
+import de.kentoj.kencommandapi.api.argument.CommandArgument;
+import de.kentoj.kencommandapi.api.invocation.CommandContext;
+import de.kentoj.kencommandapi.api.invocation.CommandExecutor;
+import de.kentoj.kencommandapi.api.node.CommandNode;
+import de.kentoj.kencommandapi.type.OfflinePlayerArgumentType;
+import de.kentoj.scrow.bukkit.ScrowAPI;
+import de.kentoj.scrowlib.friends.FriendRequestService;
+import de.kentoj.scrow.bukkit.scheduler.Tasks;
+import de.kentoj.scrowlib.convention.ScrowMessageStyle;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.bukkit.OfflinePlayer;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+
+import java.util.concurrent.CompletableFuture;
+
+@RequiredArgsConstructor
+public class FriendRequestDeclineLiteral implements CommandExecutor {
+
+ @Getter
+ private final CommandNode literal;
+ private final CommandArgument playerArg;
+ private final ScrowMessageStyle style;
+ private final FriendRequestService requestService = ScrowAPI.getFriendRequestService();
+
+ public FriendRequestDeclineLiteral(ScrowMessageStyle style) {
+ this.style = style;
+ playerArg = CommandArgument.arg("player", OfflinePlayerArgumentType.getInstance());
+ literal = CommandNode.node("reject", "decline");
+ literal.addArgument(playerArg);
+ literal.setExecutor(this);
+ }
+
+ @Override
+ public CompletableFuture> execute(CommandContext ctx) {
+ var self = (Player) ctx.getSender();
+ var other = ctx.getArg(playerArg);
+ return Tasks.supplyAsync(() ->
+ requestService.deleteFriendRequest(other.getUniqueId(), self.getUniqueId()))
+ .>mapSync(deleted -> {
+ if (!deleted)
+ return Results.failure("There's no incoming friend request from " + other.getName() + ".");
+ self.sendMessage(style.ok("Friend request declined."));
+ ScrowAPI.getPlayer(other).sendMessage(style.ok(self.getName() + " has declined your friend request."));
+ return Results.success(new Object());
+ }).toFuture();
+ }
+}
diff --git a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendRequestsLiteral.java b/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendRequestsLiteral.java
index 62948d1..75cce32 100644
--- a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendRequestsLiteral.java
+++ b/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendRequestsLiteral.java
@@ -6,7 +6,7 @@ import de.kentoj.kencommandapi.api.invocation.CommandContext;
import de.kentoj.kencommandapi.api.invocation.CommandExecutor;
import de.kentoj.kencommandapi.api.node.CommandNode;
import de.kentoj.scrow.bukkit.ScrowAPI;
-import de.kentoj.scrow.bukkit.friends.FriendRequest;
+import de.kentoj.scrowlib.friends.FriendRequest;
import de.kentoj.scrow.bukkit.scheduler.Tasks;
import de.kentoj.scrowlib.convention.ScrowMessageStyle;
import lombok.Getter;
@@ -57,8 +57,9 @@ public class FriendRequestsLiteral implements CommandExecutor {
for (String requester : requesters) {
message = message
.appendNewline()
- .append(text("≫").color(NamedTextColor.AQUA))
- .append(Component.text(requester));
+ .append(text("≫ ").color(style.getPrefixColor()))
+ .append(Component.text(requester).color(NamedTextColor.GRAY)
+ .append(FriendCommand.friendRequestOptions(requester, false)));
}
return message;
}
diff --git a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/notification/NotificationListener.java b/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/notification/NotificationListener.java
new file mode 100644
index 0000000..e218caa
--- /dev/null
+++ b/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/notification/NotificationListener.java
@@ -0,0 +1,19 @@
+package de.kentoj.scrow.bukkit.friends.notification;
+
+import de.kentoj.scrow.bukkit.ScrowAPI;
+import de.kentoj.scrowlib.messaging.MessageBroker;
+import org.bukkit.Bukkit;
+import org.bukkit.event.Listener;
+
+import java.util.UUID;
+
+public class NotificationListener {
+
+ private final MessageBroker messageBroker = ScrowAPI.getMessageBroker();
+
+ public NotificationListener() {
+ messageBroker.subscribe("event.player.connect", doc -> {
+ var player= Bukkit.getPlayer(doc.get("playerId", UUID.class));
+ });
+ }
+}
diff --git a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/instancemanager/command/PlayCommand.java b/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/instancemanager/command/PlayCommand.java
index 11b0c2d..633ac4a 100644
--- a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/instancemanager/command/PlayCommand.java
+++ b/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/instancemanager/command/PlayCommand.java
@@ -47,7 +47,7 @@ public class PlayCommand implements CommandExecutor {
return Results.failure("No instance for " + gamemode + " found.");
return Results.ofCallable(() -> {
- ScrowAPI.getPlayerManager().sendPlayer(player.getUniqueId(), instance.getHandle());
+ ScrowAPI.getPlayer(player).sendToInstance(instance.getHandle());
return new Object();
}).mapFailure(Exception::getMessage);
}).toFuture();
diff --git a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/network/NetworkPlayerWatchdog.java b/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/network/NetworkPlayerWatchdog.java
new file mode 100644
index 0000000..4e7a26e
--- /dev/null
+++ b/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/network/NetworkPlayerWatchdog.java
@@ -0,0 +1,61 @@
+package de.kentoj.scrow.bukkit.network;
+
+import de.kentoj.scrow.bukkit.ScrowAPI;
+import lombok.RequiredArgsConstructor;
+import net.kyori.adventure.key.Key;
+import net.kyori.adventure.sound.Sound;
+import net.kyori.adventure.text.minimessage.MiniMessage;
+import org.bson.Document;
+import org.bukkit.Bukkit;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.UUID;
+import java.util.function.BiConsumer;
+
+@RequiredArgsConstructor
+public class NetworkPlayerWatchdog {
+ private static final MiniMessage MM = MiniMessage.miniMessage();
+
+ public void listen() {
+ handle("player.sendMessage", (player, doc) -> {
+ var msg = MM.deserialize(doc.getString("message"));
+ player.sendMessage(msg);
+ });
+
+ // TODO test methods below
+
+ handle("player.sendActionBar", (player, doc) -> {
+ var msg = MM.deserialize(doc.getString("message"));
+ player.sendActionBar(msg);
+ });
+
+ handle("player.playSound", (player, doc) ->
+ player.playSound(toSound(doc)));
+
+ handle("player.playSound1", (player, doc) ->
+ player.playSound(toSound(doc), doc.getDouble("x"), doc.getDouble("y"), doc.getDouble("z")));
+
+ handle("player.stopSound", (player, doc) ->
+ player.stopSound(toSound(doc)));
+ }
+
+ private @NotNull Sound toSound(Document doc) {
+ @SuppressWarnings("PatternValidation")
+ var name = Key.key("namespace", doc.getString("name"));
+ var source = Sound.Source.valueOf(doc.getString("source"));
+ return Sound.sound(
+ name,
+ source,
+ doc.getDouble("volume").floatValue(),
+ doc.getDouble("pitch").floatValue());
+ }
+
+ private void handle(String subject, BiConsumer handler) {
+ ScrowAPI.getMessageBroker().subscribe(subject, doc -> {
+ var player = Bukkit.getPlayer(doc.get("playerId", UUID.class));
+ if (player != null)
+ handler.accept(player, doc);
+ });
+ }
+}
diff --git a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/playermanager/PlayerManagerImpl.java b/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/playermanager/PlayerManagerImpl.java
deleted file mode 100644
index d2f501e..0000000
--- a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/playermanager/PlayerManagerImpl.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package de.kentoj.scrow.bukkit.playermanager;
-
-import de.kentoj.scrow.bukkit.ScrowAPI;
-import de.kentoj.scrow.bukkit.misc.PlayerManager;
-import de.kentoj.scrowlib.messaging.MessageBroker;
-import de.kentoj.scrowlib.utils.ResultUtils;
-import lombok.RequiredArgsConstructor;
-import org.bson.Document;
-
-import java.util.UUID;
-
-@RequiredArgsConstructor
-public class PlayerManagerImpl implements PlayerManager {
-
- private final MessageBroker messageBroker = ScrowAPI.getMessageBroker();
-
- @Override
- public void sendPlayer(UUID playerId, String instanceHandle) {
- var result = messageBroker.request("players.send", new Document()
- .append("playerId", playerId)
- .append("handle", instanceHandle));
- ResultUtils.unwrap(result, "failed to send player to " + instanceHandle);
- }
-}
diff --git a/core-lib/build.gradle.kts b/core-lib/build.gradle.kts
index 3bc3bf0..f316c69 100644
--- a/core-lib/build.gradle.kts
+++ b/core-lib/build.gradle.kts
@@ -24,6 +24,7 @@ dependencies {
api("de.kentoj.scrow:kencommandapi-core:0.30")
compileOnly("net.kyori:adventure-api:5.2.0")
+ compileOnly("net.kyori:adventure-text-minimessage:5.2.0")
}
publishing {
diff --git a/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/misc/EconomyService.java b/core-lib/src/main/java/de/kentoj/scrowlib/economy/EconomyService.java
similarity index 95%
rename from core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/misc/EconomyService.java
rename to core-lib/src/main/java/de/kentoj/scrowlib/economy/EconomyService.java
index 5709df2..d509120 100644
--- a/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/misc/EconomyService.java
+++ b/core-lib/src/main/java/de/kentoj/scrowlib/economy/EconomyService.java
@@ -1,4 +1,4 @@
-package de.kentoj.scrow.bukkit.misc;
+package de.kentoj.scrowlib.economy;
import java.util.UUID;
diff --git a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/economy/InMemoryEconomyService.java b/core-lib/src/main/java/de/kentoj/scrowlib/economy/InMemoryEconomyService.java
similarity index 92%
rename from core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/economy/InMemoryEconomyService.java
rename to core-lib/src/main/java/de/kentoj/scrowlib/economy/InMemoryEconomyService.java
index f9a3930..3af992d 100644
--- a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/economy/InMemoryEconomyService.java
+++ b/core-lib/src/main/java/de/kentoj/scrowlib/economy/InMemoryEconomyService.java
@@ -1,7 +1,6 @@
-package de.kentoj.scrow.bukkit.economy;
+package de.kentoj.scrowlib.economy;
import com.google.common.base.Preconditions;
-import de.kentoj.scrow.bukkit.misc.EconomyService;
import java.util.HashMap;
import java.util.Map;
diff --git a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/economy/PostgresEconomyService.java b/core-lib/src/main/java/de/kentoj/scrowlib/economy/PostgresEconomyService.java
similarity index 97%
rename from core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/economy/PostgresEconomyService.java
rename to core-lib/src/main/java/de/kentoj/scrowlib/economy/PostgresEconomyService.java
index 302ee6c..20066a8 100644
--- a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/economy/PostgresEconomyService.java
+++ b/core-lib/src/main/java/de/kentoj/scrowlib/economy/PostgresEconomyService.java
@@ -1,7 +1,6 @@
-package de.kentoj.scrow.bukkit.economy;
+package de.kentoj.scrowlib.economy;
import de.kentoj.scrow.bukkit.ScrowAPI;
-import de.kentoj.scrow.bukkit.misc.EconomyService;
import org.jdbi.v3.core.Jdbi;
import java.util.UUID;
diff --git a/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/friends/FriendRequest.java b/core-lib/src/main/java/de/kentoj/scrowlib/friends/FriendRequest.java
similarity index 79%
rename from core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/friends/FriendRequest.java
rename to core-lib/src/main/java/de/kentoj/scrowlib/friends/FriendRequest.java
index 58e250f..9df5e84 100644
--- a/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/friends/FriendRequest.java
+++ b/core-lib/src/main/java/de/kentoj/scrowlib/friends/FriendRequest.java
@@ -1,4 +1,4 @@
-package de.kentoj.scrow.bukkit.friends;
+package de.kentoj.scrowlib.friends;
import java.time.Instant;
import java.util.UUID;
diff --git a/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/friends/FriendRequestService.java b/core-lib/src/main/java/de/kentoj/scrowlib/friends/FriendRequestService.java
similarity index 93%
rename from core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/friends/FriendRequestService.java
rename to core-lib/src/main/java/de/kentoj/scrowlib/friends/FriendRequestService.java
index 619a415..ef7ba39 100644
--- a/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/friends/FriendRequestService.java
+++ b/core-lib/src/main/java/de/kentoj/scrowlib/friends/FriendRequestService.java
@@ -1,4 +1,4 @@
-package de.kentoj.scrow.bukkit.friends;
+package de.kentoj.scrowlib.friends;
import java.util.List;
import java.util.UUID;
diff --git a/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/friends/Friendship.java b/core-lib/src/main/java/de/kentoj/scrowlib/friends/Friendship.java
similarity index 65%
rename from core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/friends/Friendship.java
rename to core-lib/src/main/java/de/kentoj/scrowlib/friends/Friendship.java
index 3eb61f0..e0ae3a4 100644
--- a/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/friends/Friendship.java
+++ b/core-lib/src/main/java/de/kentoj/scrowlib/friends/Friendship.java
@@ -1,7 +1,6 @@
-package de.kentoj.scrow.bukkit.friends;
+package de.kentoj.scrowlib.friends;
import java.time.Instant;
-import java.util.UUID;
public interface Friendship {
diff --git a/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/friends/FriendshipService.java b/core-lib/src/main/java/de/kentoj/scrowlib/friends/FriendshipService.java
similarity index 92%
rename from core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/friends/FriendshipService.java
rename to core-lib/src/main/java/de/kentoj/scrowlib/friends/FriendshipService.java
index 251a7ce..39e2ba6 100644
--- a/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/friends/FriendshipService.java
+++ b/core-lib/src/main/java/de/kentoj/scrowlib/friends/FriendshipService.java
@@ -1,4 +1,4 @@
-package de.kentoj.scrow.bukkit.friends;
+package de.kentoj.scrowlib.friends;
import java.util.List;
import java.util.UUID;
diff --git a/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/friends/OrderedUUIDPair.java b/core-lib/src/main/java/de/kentoj/scrowlib/friends/OrderedUUIDPair.java
similarity index 92%
rename from core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/friends/OrderedUUIDPair.java
rename to core-lib/src/main/java/de/kentoj/scrowlib/friends/OrderedUUIDPair.java
index cf892b0..18b2d5d 100644
--- a/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/friends/OrderedUUIDPair.java
+++ b/core-lib/src/main/java/de/kentoj/scrowlib/friends/OrderedUUIDPair.java
@@ -1,4 +1,4 @@
-package de.kentoj.scrow.bukkit.friends;
+package de.kentoj.scrowlib.friends;
import lombok.Getter;
diff --git a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/friendship/FriendshipImpl.java b/core-lib/src/main/java/de/kentoj/scrowlib/friends/friendship/FriendshipImpl.java
similarity index 71%
rename from core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/friendship/FriendshipImpl.java
rename to core-lib/src/main/java/de/kentoj/scrowlib/friends/friendship/FriendshipImpl.java
index 09d17c4..da1de60 100644
--- a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/friendship/FriendshipImpl.java
+++ b/core-lib/src/main/java/de/kentoj/scrowlib/friends/friendship/FriendshipImpl.java
@@ -1,7 +1,7 @@
-package de.kentoj.scrow.bukkit.friends.friendship;
+package de.kentoj.scrowlib.friends.friendship;
-import de.kentoj.scrow.bukkit.friends.Friendship;
-import de.kentoj.scrow.bukkit.friends.OrderedUUIDPair;
+import de.kentoj.scrowlib.friends.Friendship;
+import de.kentoj.scrowlib.friends.OrderedUUIDPair;
import lombok.RequiredArgsConstructor;
import lombok.Value;
diff --git a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/friendship/InMemoryFriendshipService.java b/core-lib/src/main/java/de/kentoj/scrowlib/friends/friendship/InMemoryFriendshipService.java
similarity index 83%
rename from core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/friendship/InMemoryFriendshipService.java
rename to core-lib/src/main/java/de/kentoj/scrowlib/friends/friendship/InMemoryFriendshipService.java
index 736a9b0..41a2ddd 100644
--- a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/friendship/InMemoryFriendshipService.java
+++ b/core-lib/src/main/java/de/kentoj/scrowlib/friends/friendship/InMemoryFriendshipService.java
@@ -1,8 +1,8 @@
-package de.kentoj.scrow.bukkit.friends.friendship;
+package de.kentoj.scrowlib.friends.friendship;
-import de.kentoj.scrow.bukkit.friends.Friendship;
-import de.kentoj.scrow.bukkit.friends.FriendshipService;
-import de.kentoj.scrow.bukkit.friends.OrderedUUIDPair;
+import de.kentoj.scrowlib.friends.Friendship;
+import de.kentoj.scrowlib.friends.FriendshipService;
+import de.kentoj.scrowlib.friends.OrderedUUIDPair;
import java.util.HashMap;
import java.util.List;
diff --git a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/friendship/PostgresFriendshipService.java b/core-lib/src/main/java/de/kentoj/scrowlib/friends/friendship/PostgresFriendshipService.java
similarity index 89%
rename from core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/friendship/PostgresFriendshipService.java
rename to core-lib/src/main/java/de/kentoj/scrowlib/friends/friendship/PostgresFriendshipService.java
index ee6fb93..7cace0e 100644
--- a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/friendship/PostgresFriendshipService.java
+++ b/core-lib/src/main/java/de/kentoj/scrowlib/friends/friendship/PostgresFriendshipService.java
@@ -1,18 +1,16 @@
-package de.kentoj.scrow.bukkit.friends.friendship;
+package de.kentoj.scrowlib.friends.friendship;
import de.kentoj.scrow.bukkit.ScrowAPI;
-import de.kentoj.scrow.bukkit.friends.FriendRequest;
-import de.kentoj.scrow.bukkit.friends.Friendship;
-import de.kentoj.scrow.bukkit.friends.FriendshipService;
-import de.kentoj.scrow.bukkit.friends.OrderedUUIDPair;
-import de.kentoj.scrow.bukkit.friends.request.FriendRequestImpl;
+import de.kentoj.scrowlib.friends.Friendship;
+import de.kentoj.scrowlib.friends.FriendshipService;
+import de.kentoj.scrowlib.friends.OrderedUUIDPair;
import org.jdbi.v3.core.Jdbi;
import org.jdbi.v3.core.statement.StatementContext;
import org.jetbrains.annotations.Nullable;
import java.sql.ResultSet;
import java.sql.SQLException;
-import java.time.Instant;
+import java.time.OffsetDateTime;
import java.util.List;
import java.util.UUID;
@@ -90,10 +88,13 @@ public class PostgresFriendshipService implements FriendshipService {
}
private Friendship parseFriendship(ResultSet rs, StatementContext __) throws SQLException {
+ for (int i = 0; i < 5; i++) {
+ System.out.println("parsing friendship");
+ }
return new FriendshipImpl(
rs.getObject("first_uuid", UUID.class),
rs.getObject("second_uuid", UUID.class),
- rs.getObject("created_at", Instant.class)
+ rs.getObject("created_at", OffsetDateTime.class).toInstant()
);
}
}
diff --git a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/request/FriendRequestImpl.java b/core-lib/src/main/java/de/kentoj/scrowlib/friends/request/FriendRequestImpl.java
similarity index 77%
rename from core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/request/FriendRequestImpl.java
rename to core-lib/src/main/java/de/kentoj/scrowlib/friends/request/FriendRequestImpl.java
index 802eb0d..ba4a069 100644
--- a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/request/FriendRequestImpl.java
+++ b/core-lib/src/main/java/de/kentoj/scrowlib/friends/request/FriendRequestImpl.java
@@ -1,6 +1,6 @@
-package de.kentoj.scrow.bukkit.friends.request;
+package de.kentoj.scrowlib.friends.request;
-import de.kentoj.scrow.bukkit.friends.FriendRequest;
+import de.kentoj.scrowlib.friends.FriendRequest;
import lombok.AllArgsConstructor;
import lombok.Value;
diff --git a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/request/InMemoryFriendRequestService.java b/core-lib/src/main/java/de/kentoj/scrowlib/friends/request/InMemoryFriendRequestService.java
similarity index 88%
rename from core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/request/InMemoryFriendRequestService.java
rename to core-lib/src/main/java/de/kentoj/scrowlib/friends/request/InMemoryFriendRequestService.java
index d0f929e..493a22c 100644
--- a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/request/InMemoryFriendRequestService.java
+++ b/core-lib/src/main/java/de/kentoj/scrowlib/friends/request/InMemoryFriendRequestService.java
@@ -1,7 +1,7 @@
-package de.kentoj.scrow.bukkit.friends.request;
+package de.kentoj.scrowlib.friends.request;
-import de.kentoj.scrow.bukkit.friends.FriendRequest;
-import de.kentoj.scrow.bukkit.friends.FriendRequestService;
+import de.kentoj.scrowlib.friends.FriendRequest;
+import de.kentoj.scrowlib.friends.FriendRequestService;
import java.util.HashSet;
import java.util.List;
diff --git a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/request/PostgresFriendRequestService.java b/core-lib/src/main/java/de/kentoj/scrowlib/friends/request/PostgresFriendRequestService.java
similarity index 92%
rename from core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/request/PostgresFriendRequestService.java
rename to core-lib/src/main/java/de/kentoj/scrowlib/friends/request/PostgresFriendRequestService.java
index c9c569b..9cf6691 100644
--- a/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/request/PostgresFriendRequestService.java
+++ b/core-lib/src/main/java/de/kentoj/scrowlib/friends/request/PostgresFriendRequestService.java
@@ -1,21 +1,22 @@
-package de.kentoj.scrow.bukkit.friends.request;
+package de.kentoj.scrowlib.friends.request;
import de.kentoj.scrow.bukkit.ScrowAPI;
-import de.kentoj.scrow.bukkit.friends.FriendRequest;
-import de.kentoj.scrow.bukkit.friends.FriendRequestService;
+import de.kentoj.scrowlib.friends.FriendRequest;
+import de.kentoj.scrowlib.friends.FriendRequestService;
+import lombok.extern.slf4j.Slf4j;
import org.jdbi.v3.core.Jdbi;
import org.jdbi.v3.core.statement.StatementContext;
import org.jetbrains.annotations.Nullable;
-import javax.swing.tree.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
-import java.time.Instant;
+import java.time.OffsetDateTime;
import java.util.List;
import java.util.UUID;
import static com.google.common.base.Preconditions.checkNotNull;
+@Slf4j
public class PostgresFriendRequestService implements FriendRequestService {
private final Jdbi jdbi;
@@ -102,7 +103,7 @@ public class PostgresFriendRequestService implements FriendRequestService {
return new FriendRequestImpl(
rs.getObject("from_uuid", UUID.class),
rs.getObject("to_uuid", UUID.class),
- rs.getObject("created_at", Instant.class)
+ rs.getObject("created_at", OffsetDateTime.class).toInstant()
);
}
}
\ No newline at end of file
diff --git a/core-lib/src/main/java/de/kentoj/scrowlib/messaging/MessageBroker.java b/core-lib/src/main/java/de/kentoj/scrowlib/messaging/MessageBroker.java
index 9f272a8..b837d28 100644
--- a/core-lib/src/main/java/de/kentoj/scrowlib/messaging/MessageBroker.java
+++ b/core-lib/src/main/java/de/kentoj/scrowlib/messaging/MessageBroker.java
@@ -20,22 +20,27 @@ public class MessageBroker {
public MessageBroker(Connection nats) {
this.nats = nats;
this.dispatcher = nats.createDispatcher();
+ }
+ public void publish(String subject, Document document) {
+ nats.publish(subject, DocumentRepository.toBytes(document));
}
public void publish(String subject, Result result) {
- nats.publish(subject, ResultRepository.toBytes(result));
+ this.publish(subject, ResultRepository.toDocument(result));
}
/**
* subscribes to a subject, handler may run asynchronously
*/
public void subscribe(String subject, Consumer handler) {
- dispatcher.subscribe(subject, msg -> {
- executor.submit(() -> handler.accept(DocumentRepository.fromMessage(msg)));
- });
+ dispatcher.subscribe(subject, msg ->
+ executor.submit(() -> handler.accept(DocumentRepository.fromMessage(msg))));
}
+ /**
+ * handler may run asynchronously
+ */
public void handle(String subject, RequestHandler handler) {
dispatcher.subscribe(subject, msg -> {
if (msg.getReplyTo() == null) {
diff --git a/core-lib/src/main/java/de/kentoj/scrowlib/messaging/ResultRepository.java b/core-lib/src/main/java/de/kentoj/scrowlib/messaging/ResultRepository.java
index 3faa12f..59a5d74 100644
--- a/core-lib/src/main/java/de/kentoj/scrowlib/messaging/ResultRepository.java
+++ b/core-lib/src/main/java/de/kentoj/scrowlib/messaging/ResultRepository.java
@@ -10,11 +10,10 @@ import org.bson.Document;
@NoArgsConstructor(access = AccessLevel.NONE)
public class ResultRepository {
- public static byte[] toBytes(Result result) {
- var doc = result.hasSuccess()
+ public static Document toDocument(Result result) {
+ return result.hasSuccess()
? new Document("data", result.getSuccess().orElseThrow())
: new Document("error", result.getFailure().orElseThrow());
- return DocumentRepository.toBytes(doc);
}
public static Result fromDocument(Document doc) {
diff --git a/core-lib/src/main/java/de/kentoj/scrowlib/player/NetworkPlayer.java b/core-lib/src/main/java/de/kentoj/scrowlib/player/NetworkPlayer.java
new file mode 100644
index 0000000..5a4ddb6
--- /dev/null
+++ b/core-lib/src/main/java/de/kentoj/scrowlib/player/NetworkPlayer.java
@@ -0,0 +1,8 @@
+package de.kentoj.scrowlib.player;
+
+import net.kyori.adventure.audience.Audience;
+
+public interface NetworkPlayer extends Audience {
+
+ void sendToInstance(String handle);
+}
\ No newline at end of file
diff --git a/core-lib/src/main/java/de/kentoj/scrowlib/player/NetworkPlayerFactory.java b/core-lib/src/main/java/de/kentoj/scrowlib/player/NetworkPlayerFactory.java
new file mode 100644
index 0000000..915cc30
--- /dev/null
+++ b/core-lib/src/main/java/de/kentoj/scrowlib/player/NetworkPlayerFactory.java
@@ -0,0 +1,9 @@
+package de.kentoj.scrowlib.player;
+
+import java.util.UUID;
+
+@FunctionalInterface
+public interface NetworkPlayerFactory {
+
+ NetworkPlayer create(UUID uuid);
+}
diff --git a/core-lib/src/main/java/de/kentoj/scrowlib/player/NetworkPlayerImpl.java b/core-lib/src/main/java/de/kentoj/scrowlib/player/NetworkPlayerImpl.java
new file mode 100644
index 0000000..b62f933
--- /dev/null
+++ b/core-lib/src/main/java/de/kentoj/scrowlib/player/NetworkPlayerImpl.java
@@ -0,0 +1,66 @@
+package de.kentoj.scrowlib.player;
+
+import de.kentoj.scrowlib.messaging.MessageBroker;
+import lombok.RequiredArgsConstructor;
+import net.kyori.adventure.sound.Sound;
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.minimessage.MiniMessage;
+import org.bson.Document;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.UUID;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+@RequiredArgsConstructor
+public class NetworkPlayerImpl implements NetworkPlayer {
+ private static final MiniMessage MM = MiniMessage.miniMessage();
+ private static final ExecutorService EXECUTOR = Executors.newVirtualThreadPerTaskExecutor();
+ private final MessageBroker messageBroker;
+ private final UUID playerId;
+
+ @Override
+ public void sendMessage(@NotNull Component message) {
+ requestAsync("player.sendMessage", new Document("message", MM.serialize(message)));
+ }
+
+ @Override
+ public void sendActionBar(@NotNull Component message) {
+ requestAsync("player.sendActionBar", new Document("message", MM.serialize(message)));
+ }
+
+ @Override
+ public void playSound(@NotNull Sound sound) {
+ requestAsync("player.playSound", new Document("message", toDocument(sound)));
+ }
+
+ @Override
+ public void playSound(@NotNull Sound sound, double x, double y, double z) {
+ requestAsync("player.playSound1", new Document("message", toDocument(sound)
+ .append("x", x)
+ .append("y", y)
+ .append("z", z)));
+ }
+
+ @Override
+ public void stopSound(@NotNull Sound sound) {
+ requestAsync("player.stopSound", toDocument(sound));
+ }
+
+ private Document toDocument(Sound sound) {
+ return new Document("name", sound.name().value())
+ .append("pitch", sound.pitch())
+ .append("volume", sound.volume())
+ .append("source", sound.source().name());
+ }
+
+ @Override
+ public void sendToInstance(String handle) {
+ requestAsync("player.send", new Document("handle", handle));
+ }
+
+ private void requestAsync(String topic, Document document) {
+ EXECUTOR.submit(() -> messageBroker.publish(topic, document
+ .append("playerId", playerId)));
+ }
+}
diff --git a/core-velocity-api/src/main/java/de/kentoj/scrow/velocity/ScrowAPI.java b/core-velocity-api/src/main/java/de/kentoj/scrow/velocity/ScrowAPI.java
index e4096f5..571b3a5 100644
--- a/core-velocity-api/src/main/java/de/kentoj/scrow/velocity/ScrowAPI.java
+++ b/core-velocity-api/src/main/java/de/kentoj/scrow/velocity/ScrowAPI.java
@@ -1,14 +1,19 @@
package de.kentoj.scrow.velocity;
+import com.velocitypowered.api.proxy.Player;
import de.kentoj.kencommandapi.CommandAPI;
import de.kentoj.scrowlib.instancemanager.InstanceManager;
import de.kentoj.scrowlib.messaging.MessageBroker;
+import de.kentoj.scrowlib.player.NetworkPlayer;
+import de.kentoj.scrowlib.player.NetworkPlayerFactory;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.jdbi.v3.core.Jdbi;
import org.jetbrains.annotations.ApiStatus;
+import java.util.UUID;
+
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ScrowAPI {
@@ -20,6 +25,16 @@ public class ScrowAPI {
private static MessageBroker messageBroker;
@Getter
private static InstanceManager instanceManager;
+ private static NetworkPlayerFactory playerFactory;
+
+ public static NetworkPlayer getPlayer(Player player) {
+ return getPlayer(player.getUniqueId());
+ }
+
+ public static NetworkPlayer getPlayer(UUID uuid) {
+ return playerFactory.create(uuid);
+ }
+
@ApiStatus.Internal
public static void setCommandApi(CommandAPI commandApi) {
@@ -40,5 +55,10 @@ public class ScrowAPI {
public static void setJdbi(Jdbi jdbi) {
ScrowAPI.jdbi = jdbi;
}
+
+ @ApiStatus.Internal
+ public static void setPlayerFactory(NetworkPlayerFactory playerFactory) {
+ ScrowAPI.playerFactory = playerFactory;
+ }
}
diff --git a/core-velocity-impl/build.gradle.kts b/core-velocity-impl/build.gradle.kts
index f20ac0b..316fe6d 100644
--- a/core-velocity-impl/build.gradle.kts
+++ b/core-velocity-impl/build.gradle.kts
@@ -23,9 +23,6 @@ dependencies {
// https://docs.papermc.io/velocity/dev/creating-your-first-plugin/
annotationProcessor("com.velocitypowered:velocity-api:3.5.0-SNAPSHOT")
- // https://mvnrepository.com/artifact/com.github.ben-manes.caffeine/caffeine
- implementation("com.github.ben-manes.caffeine:caffeine:3.2.4")
-
// https://mvnrepository.com/artifact/org.postgresql/postgresql
implementation("org.postgresql:postgresql:42.7.12")
}
diff --git a/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/CoreVelocityPlugin.java b/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/CoreVelocityPlugin.java
index b5dbfbc..c859c12 100644
--- a/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/CoreVelocityPlugin.java
+++ b/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/CoreVelocityPlugin.java
@@ -4,12 +4,13 @@ import com.google.inject.Inject;
import com.velocitypowered.api.plugin.Plugin;
import com.velocitypowered.api.proxy.ProxyServer;
import de.kentoj.scrow.corevelocity.command.OnlineCommand;
+import de.kentoj.scrow.corevelocity.network.FriendNotifications;
import de.kentoj.scrow.corevelocity.privmsg.LastTargetCache;
import de.kentoj.scrow.corevelocity.privmsg.MsgCommand;
import de.kentoj.scrow.corevelocity.privmsg.PrivMsgHandler;
import de.kentoj.scrow.corevelocity.privmsg.ReplyCommand;
-import de.kentoj.scrow.corevelocity.server.SendPlayerWatchdog;
-import de.kentoj.scrow.corevelocity.server.ServerRegisterWatchdog;
+import de.kentoj.scrow.corevelocity.network.SendPlayerWatchdog;
+import de.kentoj.scrow.corevelocity.network.ServerRegisterWatchdog;
import de.kentoj.scrow.generated.BuildInfo;
import de.kentoj.scrow.velocity.ScrowAPI;
import de.kentoj.scrowlib.convention.ScrowMessageStyle;
@@ -37,9 +38,10 @@ public class CoreVelocityPlugin {
cmds.register(new OnlineCommand(server).getRootNode());
}
- var registerWatchdog = new ServerRegisterWatchdog(ScrowAPI.getMessageBroker(), server);
- var sendPlayerWatchdog = new SendPlayerWatchdog(ScrowAPI.getMessageBroker(), server);
+ var registerWatchdog = new ServerRegisterWatchdog(server);
+ var sendPlayerWatchdog = new SendPlayerWatchdog(server);
registerWatchdog.listen();
sendPlayerWatchdog.listen();
+ server.getEventManager().register(this, new FriendNotifications());
}
}
\ No newline at end of file
diff --git a/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/ScrowAPISurface.java b/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/ScrowAPISurface.java
index b550dde..f8c4a2a 100644
--- a/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/ScrowAPISurface.java
+++ b/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/ScrowAPISurface.java
@@ -5,6 +5,7 @@ import de.kentoj.kencommandapi.CommandAPI;
import de.kentoj.scrow.velocity.ScrowAPI;
import de.kentoj.scrowlib.instancemanager.InstanceManagerImpl;
import de.kentoj.scrowlib.messaging.MessageBroker;
+import de.kentoj.scrowlib.player.NetworkPlayerImpl;
import de.kentoj.scrowlib.utils.EnvUtils;
import io.nats.client.Nats;
import io.nats.client.Options;
@@ -42,8 +43,8 @@ public class ScrowAPISurface {
}
ScrowAPI.setInstanceManager(new InstanceManagerImpl(ScrowAPI.getMessageBroker()));
-
ScrowAPI.setCommandApi(new CommandAPI(server));
+ ScrowAPI.setPlayerFactory(playerId -> new NetworkPlayerImpl(ScrowAPI.getMessageBroker(), playerId));
}
public static void destroyScrowAPI() {
diff --git a/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/network/FriendNotifications.java b/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/network/FriendNotifications.java
new file mode 100644
index 0000000..8626737
--- /dev/null
+++ b/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/network/FriendNotifications.java
@@ -0,0 +1,23 @@
+package de.kentoj.scrow.corevelocity.network;
+
+import com.velocitypowered.api.event.Subscribe;
+import com.velocitypowered.api.event.connection.DisconnectEvent;
+import com.velocitypowered.api.event.connection.PostLoginEvent;
+import de.kentoj.scrow.velocity.ScrowAPI;
+import de.kentoj.scrowlib.messaging.MessageBroker;
+import org.bson.Document;
+
+public class FriendNotifications {
+
+ private final MessageBroker messageBroker = ScrowAPI.getMessageBroker();
+
+ @Subscribe
+ private void onConnect(PostLoginEvent ev) {
+ messageBroker.publish("event.player.connect", new Document("playerId", ev.getPlayer().getUniqueId()));
+ }
+
+ @Subscribe
+ private void onDisconnect(DisconnectEvent ev) {
+ messageBroker.publish("event.player.disconnect", new Document("playerId", ev.getPlayer().getUniqueId()));
+ }
+}
diff --git a/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/server/SendPlayerWatchdog.java b/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/network/SendPlayerWatchdog.java
similarity index 86%
rename from core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/server/SendPlayerWatchdog.java
rename to core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/network/SendPlayerWatchdog.java
index e7cd617..0c375ea 100644
--- a/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/server/SendPlayerWatchdog.java
+++ b/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/network/SendPlayerWatchdog.java
@@ -1,10 +1,10 @@
-package de.kentoj.scrow.corevelocity.server;
+package de.kentoj.scrow.corevelocity.network;
import com.leakyabstractions.result.api.Result;
import com.leakyabstractions.result.core.Results;
import com.velocitypowered.api.proxy.ProxyServer;
+import de.kentoj.scrow.velocity.ScrowAPI;
import de.kentoj.scrowlib.messaging.MessageBroker;
-import io.nats.client.Connection;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.bson.Document;
@@ -18,11 +18,11 @@ import java.util.concurrent.ExecutionException;
@RequiredArgsConstructor
public class SendPlayerWatchdog {
- private final MessageBroker natsRepo;
+ private final MessageBroker messageBroker = ScrowAPI.getMessageBroker();
private final ProxyServer server;
public void listen() {
- natsRepo.handle("players.send", doc -> sendPlayer(
+ messageBroker.handle("player.send", doc -> sendPlayer(
doc.get("playerId", UUID.class),
doc.getString("handle")
));
diff --git a/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/server/ServerRegisterWatchdog.java b/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/network/ServerRegisterWatchdog.java
similarity index 75%
rename from core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/server/ServerRegisterWatchdog.java
rename to core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/network/ServerRegisterWatchdog.java
index a7a36b6..1433364 100644
--- a/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/server/ServerRegisterWatchdog.java
+++ b/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/network/ServerRegisterWatchdog.java
@@ -1,9 +1,9 @@
-package de.kentoj.scrow.corevelocity.server;
+package de.kentoj.scrow.corevelocity.network;
import com.velocitypowered.api.proxy.ProxyServer;
import com.velocitypowered.api.proxy.server.ServerInfo;
+import de.kentoj.scrow.velocity.ScrowAPI;
import de.kentoj.scrowlib.messaging.MessageBroker;
-import io.nats.client.Connection;
import lombok.RequiredArgsConstructor;
import lombok.extern.java.Log;
@@ -13,18 +13,18 @@ import java.net.InetSocketAddress;
@RequiredArgsConstructor
public class ServerRegisterWatchdog {
- private final MessageBroker natsRepo;
+ private final MessageBroker messageBroker = ScrowAPI.getMessageBroker();
private final ProxyServer server;
public void listen() {
- natsRepo.subscribe("event.instance.up", doc -> {
+ messageBroker.subscribe("event.instance.up", doc -> {
var handle = doc.getString("handle");
var port = doc.getInteger("port");
server.unregisterServer(new ServerInfo(handle, new InetSocketAddress(port)));
log.info("registered server " + handle);
});
- natsRepo.subscribe("event.instance.down", doc -> {
+ messageBroker.subscribe("event.instance.down", doc -> {
var handle = doc.getString("handle");
var port = doc.getInteger("port");
server.unregisterServer(new ServerInfo(handle, new InetSocketAddress(port)));
diff --git a/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/privmsg/LastTargetCache.java b/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/privmsg/LastTargetCache.java
index 0ba877d..db0a0b5 100644
--- a/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/privmsg/LastTargetCache.java
+++ b/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/privmsg/LastTargetCache.java
@@ -1,7 +1,7 @@
package de.kentoj.scrow.corevelocity.privmsg;
-import com.github.benmanes.caffeine.cache.Cache;
-import com.github.benmanes.caffeine.cache.Caffeine;
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -10,8 +10,8 @@ import java.util.concurrent.TimeUnit;
public class LastTargetCache {
- private final Cache<@NotNull UUID, UUID> cache = Caffeine.newBuilder()
- .expireAfterWrite(20, TimeUnit.MINUTES)
+ private final Cache<@NotNull UUID, @NotNull UUID> cache = CacheBuilder.newBuilder()
+ .expireAfterAccess(20, TimeUnit.MINUTES)
.build();
public @Nullable UUID getLastTarget(UUID uuid) {
diff --git a/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/privmsg/ReplyCommand.java b/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/privmsg/ReplyCommand.java
index 91d0b51..def084c 100644
--- a/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/privmsg/ReplyCommand.java
+++ b/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/privmsg/ReplyCommand.java
@@ -46,7 +46,6 @@ public class ReplyCommand implements SyncCommandExecutor {
if (target == null)
return Results.failure("The player you last messaged is no longer online.");
- cache.setLastTarget(sender.getUniqueId(), target.getUniqueId());
privMsgHandler.handle(sender, target, msg);
return Results.success(new Object());
}