gradle time

This commit is contained in:
kento2 2026-07-05 17:44:01 +02:00
parent 7040a6ce1e
commit 9421ef511e
47 changed files with 482 additions and 226 deletions

61
.idea/workspace.xml generated
View file

@ -4,26 +4,54 @@
<option name="autoReloadType" value="SELECTIVE" /> <option name="autoReloadType" value="SELECTIVE" />
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="56c685a1-f609-4ffd-a951-849beb2a7f8d" name="Changes" comment="currently refactoring a lot"> <list default="true" id="56c685a1-f609-4ffd-a951-849beb2a7f8d" name="Changes" comment=".">
<change afterPath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/instancemanager/cache/InstanceCache.java" afterDir="false" /> <change afterPath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendRequestDeclineLiteral.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/notification/NotificationListener.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/network/NetworkPlayerWatchdog.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/core-lib/src/main/java/de/kentoj/scrowlib/player/NetworkPlayer.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/core-lib/src/main/java/de/kentoj/scrowlib/player/NetworkPlayerFactory.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/core-lib/src/main/java/de/kentoj/scrowlib/player/NetworkPlayerImpl.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/network/FriendNotifications.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-api/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-api/build.gradle.kts" afterDir="false" /> <change beforePath="$PROJECT_DIR$/README.md" beforeDir="false" afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/friends/OrderedUUIDPair.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/friends/OrderedUUIDPair.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/ScrowAPI.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/ScrowAPI.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/friends/FriendRequest.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-lib/src/main/java/de/kentoj/scrowlib/friends/FriendRequest.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/friends/FriendRequestService.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-lib/src/main/java/de/kentoj/scrowlib/friends/FriendRequestService.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/friends/Friendship.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-lib/src/main/java/de/kentoj/scrowlib/friends/Friendship.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/friends/FriendshipService.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-lib/src/main/java/de/kentoj/scrowlib/friends/FriendshipService.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/friends/OrderedUUIDPair.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-lib/src/main/java/de/kentoj/scrowlib/friends/OrderedUUIDPair.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/minigame/MinigameInfo.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/misc/EconomyService.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-lib/src/main/java/de/kentoj/scrowlib/economy/EconomyService.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/misc/PlayerManager.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/scheduler/TaskImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/scheduler/TaskImpl.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/scheduler/TaskImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/scheduler/TaskImpl.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-impl/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-impl/build.gradle.kts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/CoreImplPlugin.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/CoreImplPlugin.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/CoreImplPlugin.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/CoreImplPlugin.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/ScrowAPISurface.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/ScrowAPISurface.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/ScrowAPISurface.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/ScrowAPISurface.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/economy/InMemoryEconomyService.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-lib/src/main/java/de/kentoj/scrowlib/economy/InMemoryEconomyService.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/economy/PostgresEconomyService.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-lib/src/main/java/de/kentoj/scrowlib/economy/PostgresEconomyService.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendAddLiteral.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendAddLiteral.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendAddLiteral.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendAddLiteral.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/friendship/PostgresFriendshipService.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/friendship/PostgresFriendshipService.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendCommand.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendCommand.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/request/PostgresFriendRequestService.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/request/PostgresFriendRequestService.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendListLiteral.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendListLiteral.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/instancemanager/command/InstanceCommand.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/instancemanager/command/InstanceCommand.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendRemoveLiteral.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendRemoveLiteral.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/instancemanager/command/InstanceDestroyLiteral.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/instancemanager/command/InstanceDestroyLiteral.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendRequestsLiteral.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/command/FriendRequestsLiteral.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/server/LobbyCommand.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/instancemanager/command/LobbyCommand.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/friendship/FriendshipImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-lib/src/main/java/de/kentoj/scrowlib/friends/friendship/FriendshipImpl.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/server/PlayCommand.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/instancemanager/command/PlayCommand.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/friendship/InMemoryFriendshipService.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-lib/src/main/java/de/kentoj/scrowlib/friends/friendship/InMemoryFriendshipService.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/friendship/PostgresFriendshipService.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-lib/src/main/java/de/kentoj/scrowlib/friends/friendship/PostgresFriendshipService.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/request/FriendRequestImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-lib/src/main/java/de/kentoj/scrowlib/friends/request/FriendRequestImpl.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/request/InMemoryFriendRequestService.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-lib/src/main/java/de/kentoj/scrowlib/friends/request/InMemoryFriendRequestService.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/friends/request/PostgresFriendRequestService.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-lib/src/main/java/de/kentoj/scrowlib/friends/request/PostgresFriendRequestService.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/instancemanager/command/PlayCommand.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/instancemanager/command/PlayCommand.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/playermanager/PlayerManagerImpl.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/core-lib/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/core-lib/build.gradle.kts" afterDir="false" /> <change beforePath="$PROJECT_DIR$/core-lib/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/core-lib/build.gradle.kts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-velocity-api/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/core-velocity-api/build.gradle.kts" afterDir="false" /> <change beforePath="$PROJECT_DIR$/core-lib/src/main/java/de/kentoj/scrowlib/messaging/MessageBroker.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-lib/src/main/java/de/kentoj/scrowlib/messaging/MessageBroker.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-lib/src/main/java/de/kentoj/scrowlib/messaging/ResultRepository.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-lib/src/main/java/de/kentoj/scrowlib/messaging/ResultRepository.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-velocity-api/src/main/java/de/kentoj/scrow/velocity/ScrowAPI.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-velocity-api/src/main/java/de/kentoj/scrow/velocity/ScrowAPI.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-velocity-impl/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/core-velocity-impl/build.gradle.kts" afterDir="false" /> <change beforePath="$PROJECT_DIR$/core-velocity-impl/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/core-velocity-impl/build.gradle.kts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/CoreVelocityPlugin.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/CoreVelocityPlugin.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/ScrowAPISurface.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/ScrowAPISurface.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/ScrowAPISurface.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/ScrowAPISurface.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/privmsg/LastTargetCache.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/privmsg/LastTargetCache.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/privmsg/ReplyCommand.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/privmsg/ReplyCommand.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/server/SendPlayerWatchdog.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/network/SendPlayerWatchdog.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/server/ServerRegisterWatchdog.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-velocity-impl/src/main/java/de/kentoj/scrow/corevelocity/network/ServerRegisterWatchdog.java" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -114,6 +142,7 @@
<list> <list>
<option value="Kotlin Class" /> <option value="Kotlin Class" />
<option value="Interface" /> <option value="Interface" />
<option value="package-info" />
<option value="Class" /> <option value="Class" />
</list> </list>
</option> </option>
@ -144,7 +173,7 @@
"keyToString": { "keyToString": {
"Gradle.Download Sources.executor": "Run", "Gradle.Download Sources.executor": "Run",
"Gradle.core [:core-velocity-impl:shadowJar].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 [clean].executor": "Run",
"Gradle.core [publishAllPublicationsToScrowRepository].executor": "Run", "Gradle.core [publishAllPublicationsToScrowRepository].executor": "Run",
"Gradle.core [publishCoreLibPublicationToScrowRepository].executor": "Run", "Gradle.core [publishCoreLibPublicationToScrowRepository].executor": "Run",
@ -184,6 +213,8 @@
<recent name="de.kentoj.scrow.bukkit.region" /> <recent name="de.kentoj.scrow.bukkit.region" />
</key> </key>
<key name="CopyClassDialog.RECENTS_KEY"> <key name="CopyClassDialog.RECENTS_KEY">
<recent name="de.kentoj.scrow.bukkit.player" />
<recent name="de.kentoj.scrow.bukkit.friends.command" />
<recent name="de.kentoj.scrowlib.messaging" /> <recent name="de.kentoj.scrowlib.messaging" />
<recent name="de.kentoj.scrow.bukkit.region.event" /> <recent name="de.kentoj.scrow.bukkit.region.event" />
</key> </key>
@ -363,9 +394,9 @@
<servers /> <servers />
</component> </component>
<component name="VcsManagerConfiguration"> <component name="VcsManagerConfiguration">
<MESSAGE value="." />
<MESSAGE value="fix: unable to leave regions when unloaded" /> <MESSAGE value="fix: unable to leave regions when unloaded" />
<MESSAGE value="currently refactoring a lot" /> <MESSAGE value="currently refactoring a lot" />
<option name="LAST_COMMIT_MESSAGE" value="currently refactoring a lot" /> <MESSAGE value="." />
<option name="LAST_COMMIT_MESSAGE" value="." />
</component> </component>
</project> </project>

View file

@ -3,36 +3,13 @@ TODO
- improve error handling in Task ig - improve error handling in Task ig
- try with InMemory db and debug postgres implementation - try with InMemory db and debug postgres implementation
- logging in general, log some exceptions to game chat - logging in general, log some exceptions to game chat
- sleep - notification: Friend is now offline/online
- messages across server
- /ignore command
environment environment
----------- -----------
```shell - **core-lib**: stateless library
docker network create scrow 2>/dev/null || true - **core-bukkit** stateful plugin/api for minecraft development, depends on core-lib
docker run -d --network scrow -it --rm --name mongo -p 27017:27017 mongo - **core-velocity** stateful plugin/api for proxy development, depends on core-lib
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

View file

@ -1,22 +1,25 @@
package de.kentoj.scrow.bukkit; package de.kentoj.scrow.bukkit;
import de.kentoj.kencommandapi.CommandAPI; import de.kentoj.kencommandapi.CommandAPI;
import de.kentoj.scrow.bukkit.friends.FriendRequestService; import de.kentoj.scrowlib.friends.FriendRequestService;
import de.kentoj.scrow.bukkit.friends.FriendshipService; import de.kentoj.scrowlib.friends.FriendshipService;
import de.kentoj.scrow.bukkit.misc.EconomyService; import de.kentoj.scrowlib.economy.EconomyService;
import de.kentoj.scrow.bukkit.misc.PlayerManager; import de.kentoj.scrowlib.player.NetworkPlayer;
import de.kentoj.scrowlib.player.NetworkPlayerFactory;
import de.kentoj.scrow.bukkit.region.RegionManager; import de.kentoj.scrow.bukkit.region.RegionManager;
import de.kentoj.scrowlib.instancemanager.InstanceManager; import de.kentoj.scrowlib.instancemanager.InstanceManager;
import de.kentoj.scrowlib.messaging.MessageBroker; import de.kentoj.scrowlib.messaging.MessageBroker;
import io.nats.client.Connection;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.bukkit.OfflinePlayer;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.jdbi.v3.core.Jdbi; import org.jdbi.v3.core.Jdbi;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.UUID;
@NoArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ScrowAPI { public class ScrowAPI {
@ -41,8 +44,15 @@ public class ScrowAPI {
private static RegionManager regionManager; private static RegionManager regionManager;
@Getter @Getter
private static CommandAPI commandApi; private static CommandAPI commandApi;
@Getter private static NetworkPlayerFactory playerFactory;
private static PlayerManager playerManager;
public static NetworkPlayer getPlayer(OfflinePlayer player) {
return getPlayer(player.getUniqueId());
}
public static NetworkPlayer getPlayer(UUID uuid) {
return playerFactory.create(uuid);
}
@ApiStatus.Internal @ApiStatus.Internal
public static void setEconomyService(EconomyService economyService) { public static void setEconomyService(EconomyService economyService) {
@ -90,8 +100,8 @@ public class ScrowAPI {
} }
@ApiStatus.Internal @ApiStatus.Internal
public static void setPlayerManager(PlayerManager playerManager) { public static void setPlayerFactory(NetworkPlayerFactory playerFactory) {
ScrowAPI.playerManager = playerManager; ScrowAPI.playerFactory = playerFactory;
} }
} }

View file

@ -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();
}

View file

@ -1,8 +0,0 @@
package de.kentoj.scrow.bukkit.misc;
import java.util.UUID;
public interface PlayerManager {
void sendPlayer(UUID uuid, String instanceHandle);
}

View file

@ -24,7 +24,7 @@ public class TaskImpl<T> implements Task<T> {
private static final ExecutorService EXECUTOR = Executors.newVirtualThreadPerTaskExecutor(); private static final ExecutorService EXECUTOR = Executors.newVirtualThreadPerTaskExecutor();
private final Supplier<TaskState<T>> compute; private final Supplier<TaskState<T>> compute;
private TaskState<T> cachedResult = null; private volatile TaskState<T> cachedResult = null;
@Override @Override
public CompletableFuture<T> toFuture() { public CompletableFuture<T> toFuture() {
@ -90,8 +90,10 @@ public class TaskImpl<T> implements Task<T> {
} }
private TaskState<T> state() { private TaskState<T> state() {
if (cachedResult == null) synchronized (this) {
cachedResult = compute.get(); if (cachedResult == null)
return cachedResult; cachedResult = compute.get();
return cachedResult;
}
} }
} }

View file

@ -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.friends.command.FriendCommand;
import de.kentoj.scrow.bukkit.instancemanager.cache.InstanceCache; import de.kentoj.scrow.bukkit.instancemanager.cache.InstanceCache;
import de.kentoj.scrow.bukkit.instancemanager.command.InstanceCommand; 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.LobbyCommand;
import de.kentoj.scrow.bukkit.instancemanager.command.PlayCommand; import de.kentoj.scrow.bukkit.instancemanager.command.PlayCommand;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
@ -30,8 +28,6 @@ public class CoreImplPlugin extends JavaPlugin {
ScrowAPI.getCommandApi().register(new LobbyCommand().getRootNode()); ScrowAPI.getCommandApi().register(new LobbyCommand().getRootNode());
} }
new RegionTask(new RegionPlayerTracker()).runTaskTimer(this, 10, 10);
// TODO/FIXME // TODO/FIXME
//registerServer(); //registerServer();
} }

View file

@ -1,14 +1,17 @@
package de.kentoj.scrow.bukkit; package de.kentoj.scrow.bukkit;
import de.kentoj.kencommandapi.CommandAPI; import de.kentoj.kencommandapi.CommandAPI;
import de.kentoj.scrow.bukkit.economy.InMemoryEconomyService; import de.kentoj.scrowlib.economy.InMemoryEconomyService;
import de.kentoj.scrow.bukkit.economy.PostgresEconomyService; import de.kentoj.scrowlib.economy.PostgresEconomyService;
import de.kentoj.scrow.bukkit.friends.friendship.InMemoryFriendshipService; import de.kentoj.scrowlib.friends.friendship.InMemoryFriendshipService;
import de.kentoj.scrow.bukkit.friends.friendship.PostgresFriendshipService; import de.kentoj.scrowlib.friends.friendship.PostgresFriendshipService;
import de.kentoj.scrow.bukkit.friends.request.InMemoryFriendRequestService; import de.kentoj.scrowlib.friends.request.InMemoryFriendRequestService;
import de.kentoj.scrow.bukkit.friends.request.PostgresFriendRequestService; import de.kentoj.scrowlib.friends.request.PostgresFriendRequestService;
import de.kentoj.scrow.bukkit.playermanager.PlayerManagerImpl; 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.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.instancemanager.InstanceManagerImpl;
import de.kentoj.scrowlib.messaging.MessageBroker; import de.kentoj.scrowlib.messaging.MessageBroker;
import de.kentoj.scrowlib.utils.EnvUtils; import de.kentoj.scrowlib.utils.EnvUtils;
@ -17,12 +20,9 @@ import io.nats.client.Options;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.jdbi.v3.core.ConnectionFactory;
import org.jdbi.v3.core.Jdbi; import org.jdbi.v3.core.Jdbi;
import java.io.IOException; import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties; import java.util.Properties;
@NoArgsConstructor(access = AccessLevel.NONE) @NoArgsConstructor(access = AccessLevel.NONE)
@ -53,7 +53,7 @@ public class ScrowAPISurface {
ScrowAPI.setJdbi(Jdbi.create(EnvUtils.envOrThrow("HOST_POSTGRES"), props)); 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.setRegionManager(new RegionManagerImpl());
ScrowAPI.setCommandApi(new CommandAPI(plugin)); ScrowAPI.setCommandApi(new CommandAPI(plugin));
ScrowAPI.setInstanceManager(new InstanceManagerImpl(ScrowAPI.getMessageBroker())); ScrowAPI.setInstanceManager(new InstanceManagerImpl(ScrowAPI.getMessageBroker()));
@ -63,6 +63,9 @@ public class ScrowAPISurface {
new PostgresFriendRequestService() : new InMemoryFriendRequestService()); new PostgresFriendRequestService() : new InMemoryFriendRequestService());
ScrowAPI.setFriendshipService(ScrowAPI.getJdbi() != null ? ScrowAPI.setFriendshipService(ScrowAPI.getJdbi() != null ?
new PostgresFriendshipService() : new InMemoryFriendshipService()); new PostgresFriendshipService() : new InMemoryFriendshipService());
new RegionTask(new RegionPlayerTracker()).runTaskTimer(plugin, 10, 10);
new NetworkPlayerWatchdog().listen();
} }
public static void destroyScrowAPI() { public static void destroyScrowAPI() {

View file

@ -8,13 +8,16 @@ import de.kentoj.kencommandapi.api.invocation.CommandExecutor;
import de.kentoj.kencommandapi.api.node.CommandNode; import de.kentoj.kencommandapi.api.node.CommandNode;
import de.kentoj.kencommandapi.type.OfflinePlayerArgumentType; import de.kentoj.kencommandapi.type.OfflinePlayerArgumentType;
import de.kentoj.scrow.bukkit.ScrowAPI; import de.kentoj.scrow.bukkit.ScrowAPI;
import de.kentoj.scrow.bukkit.friends.friendship.FriendshipImpl; import de.kentoj.scrowlib.friends.FriendRequestService;
import de.kentoj.scrow.bukkit.friends.request.FriendRequestImpl; 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.Task;
import de.kentoj.scrow.bukkit.scheduler.Tasks; import de.kentoj.scrow.bukkit.scheduler.Tasks;
import de.kentoj.scrowlib.convention.ScrowMessageStyle; import de.kentoj.scrowlib.convention.ScrowMessageStyle;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import net.kyori.adventure.text.Component;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -31,6 +34,8 @@ public class FriendAddLiteral implements CommandExecutor<CommandSender> {
private final CommandNode<CommandSender> literal; private final CommandNode<CommandSender> literal;
private final CommandArgument<CommandSender, OfflinePlayer> playerArg; private final CommandArgument<CommandSender, OfflinePlayer> playerArg;
private final ScrowMessageStyle style; private final ScrowMessageStyle style;
private final FriendRequestService requestService = ScrowAPI.getFriendRequestService();
private final FriendshipService friendsService = ScrowAPI.getFriendshipService();
public FriendAddLiteral(ScrowMessageStyle style) { public FriendAddLiteral(ScrowMessageStyle style) {
this.style = style; this.style = style;
@ -54,30 +59,28 @@ public class FriendAddLiteral implements CommandExecutor<CommandSender> {
} }
private void sendRequest(Player self, OfflinePlayer other) { private void sendRequest(Player self, OfflinePlayer other) {
Tasks.runAsync(() -> ScrowAPI.getFriendRequestService() Tasks.runAsync(() ->
.saveFriendRequest(new FriendRequestImpl(self.getUniqueId(), other.getUniqueId()))) requestService.saveFriendRequest(new FriendRequestImpl(self.getUniqueId(), other.getUniqueId())))
.runSync(() -> { .runSync(() -> {
self.sendMessage(style.ok("Successfully sent " + other.getName() + " a friend request.")); self.sendMessage(style.ok("Successfully sent " + other.getName() + " a friend request."));
var otherPlayer = other.getPlayer(); var msg = Component.text(self.getName() + " sent you a friend request.")
if (otherPlayer != null) .append(FriendCommand.friendRequestOptions(self.getName(), true));
otherPlayer.sendMessage(style.ok(" wants to be friends with you. Use '/f add " + self.getName() + "' to accept.")); ScrowAPI.getPlayer(other).sendMessage(style.ok(msg));
}); })
.await();
} }
private void acceptRequest(Player self, OfflinePlayer other) { private void acceptRequest(Player self, OfflinePlayer other) {
Tasks.runAsync(() -> Tasks.awaitAll( Tasks.runAsync(() -> Tasks.awaitAll(
Tasks.runAsync(() -> ScrowAPI.getFriendRequestService() Tasks.runAsync(() -> requestService.deleteFriendRequest(self.getUniqueId(), other.getUniqueId())),
.deleteFriendRequest(self.getUniqueId(), other.getUniqueId())), Tasks.runAsync(() -> requestService.deleteFriendRequest(other.getUniqueId(), self.getUniqueId())),
Tasks.runAsync(() -> ScrowAPI.getFriendRequestService() Tasks.runAsync(() -> friendsService.saveFriendship(new FriendshipImpl(self.getUniqueId(), other.getUniqueId(), Instant.now()))
.deleteFriendRequest(other.getUniqueId(), self.getUniqueId())),
Tasks.runAsync(() -> ScrowAPI.getFriendshipService()
.saveFriendship(new FriendshipImpl(self.getUniqueId(), other.getUniqueId(), Instant.now()))
))) )))
.runSync(() -> { .runSync(() -> {
self.sendMessage(style.ok("You are now friends with " + other.getName() + ".")); self.sendMessage(style.ok("You are now friends with " + other.getName() + "."));
if (other.getPlayer() != null) ScrowAPI.getPlayer(other).sendMessage(style.ok("You are now friends with " + self.getName() + "."));
other.getPlayer().sendMessage(style.ok("You are now friends with " + self.getName() + ".")); })
}); .await();
} }
private Result<AddAction, String> findAction(Player self, OfflinePlayer other) { private Result<AddAction, String> findAction(Player self, OfflinePlayer other) {
@ -92,27 +95,24 @@ public class FriendAddLiteral implements CommandExecutor<CommandSender> {
if (isAlreadyFriendTask.await()) if (isAlreadyFriendTask.await())
return Results.failure("You are already friends with " + other.getName() + "."); return Results.failure("You are already friends with " + other.getName() + ".");
if (isAlreadySent.await()) 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()) if (isShouldAccept.await())
return Results.success(AddAction.ACCEPT_REQUEST); return Results.success(AddAction.ACCEPT_REQUEST);
return Results.success(AddAction.SEND_REQUEST); return Results.success(AddAction.SEND_REQUEST);
} }
private static Task<Boolean> checkShouldAccept(Player self, OfflinePlayer other) { private Task<Boolean> checkShouldAccept(Player self, OfflinePlayer other) {
return Tasks.supplyAsync(() -> return Tasks.supplyAsync(() -> requestService.getFriendRequest(other.getUniqueId(), self.getUniqueId()))
ScrowAPI.getFriendRequestService().getFriendRequest(other.getUniqueId(), self.getUniqueId()))
.mapSync(Objects::nonNull); .mapSync(Objects::nonNull);
} }
private static Task<Boolean> checkAlreadyFriends(Player self, OfflinePlayer other) { private Task<Boolean> checkAlreadyFriends(Player self, OfflinePlayer other) {
return Tasks.supplyAsync(() -> return Tasks.supplyAsync(() -> friendsService.getFriendship(self.getUniqueId(), other.getUniqueId()))
ScrowAPI.getFriendshipService().getFriendship(self.getUniqueId(), other.getUniqueId()))
.mapSync(Objects::nonNull); .mapSync(Objects::nonNull);
} }
private static Task<Boolean> checkAlreadySent(UUID self, UUID other) { private Task<Boolean> checkAlreadySent(UUID self, UUID other) {
return Tasks.supplyAsync(() -> return Tasks.supplyAsync(() -> requestService.getFriendRequest(self, other))
ScrowAPI.getFriendRequestService().getFriendRequest(self, other))
.mapSync(Objects::nonNull); .mapSync(Objects::nonNull);
} }

View file

@ -5,18 +5,37 @@ import de.kentoj.kencommandapi.api.node.RootCommandNode;
import de.kentoj.scrowlib.convention.ScrowMessageStyle; import de.kentoj.scrowlib.convention.ScrowMessageStyle;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.NoArgsConstructor; 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 net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@NoArgsConstructor(access = AccessLevel.NONE) @NoArgsConstructor(access = AccessLevel.NONE)
public class FriendCommand { public class FriendCommand {
public static RootCommandNode<CommandSender> create() { public static RootCommandNode<CommandSender> create() {
var style = new ScrowMessageStyle("Friends", NamedTextColor.GREEN); var style = new ScrowMessageStyle("Friends", NamedTextColor.AQUA);
RootCommandNode<CommandSender> rootNode = CommandNode.rootNode(style, "f", "friend"); RootCommandNode<CommandSender> rootNode = CommandNode.rootNode(style, "f", "friend");
rootNode.addLiteral(new FriendListLiteral(style).getLiteral()); rootNode.addLiteral(new FriendListLiteral(style).getLiteral());
rootNode.addLiteral(new FriendAddLiteral(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()); rootNode.addLiteral(new FriendRequestsLiteral(style).getLiteral());
return rootNode; 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));
}
} }

View file

@ -20,7 +20,7 @@ import org.bukkit.entity.Player;
import java.util.List; import java.util.List;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import static java.util.Objects.*; import static java.util.Objects.requireNonNull;
import static net.kyori.adventure.text.Component.text; import static net.kyori.adventure.text.Component.text;
public class FriendListLiteral implements CommandExecutor<CommandSender> { public class FriendListLiteral implements CommandExecutor<CommandSender> {
@ -61,14 +61,13 @@ public class FriendListLiteral implements CommandExecutor<CommandSender> {
private Component formatList(List<OfflinePlayer> friends) { private Component formatList(List<OfflinePlayer> friends) {
var message = style.ok(MiniMessage.miniMessage().deserialize("Your friends:")); var message = style.ok(MiniMessage.miniMessage().deserialize("Your friends:"));
for (var friend : friends) { for (var friend : friends) {
var status = text("(").append(friend.isOnline() var status = MiniMessage.miniMessage().deserialize(friend.isOnline()
? text("online").color(NamedTextColor.GRAY) ? " <gray>(<green>online<gray>)"
: text("offline").color(NamedTextColor.RED)) : " <gray>(<red>offline<gray>)");
.append(text(")"));
message = message message = message
.appendNewline() .appendNewline()
.append(text("").color(NamedTextColor.AQUA)) .append(text(" ").color(style.getPrefixColor()))
.append(text(requireNonNull(friend.getName()))) .append(text(requireNonNull(friend.getName())).color(NamedTextColor.GRAY))
.append(status); .append(status);
} }
return message; return message;

View file

@ -19,16 +19,16 @@ import java.util.concurrent.CompletableFuture;
public class FriendRemoveLiteral implements CommandExecutor<CommandSender> { public class FriendRemoveLiteral implements CommandExecutor<CommandSender> {
@Getter @Getter
private final CommandNode<CommandSender> rootNode; private final CommandNode<CommandSender> literal;
private final CommandArgument<CommandSender, OfflinePlayer> playerArg; private final CommandArgument<CommandSender, OfflinePlayer> playerArg;
private final ScrowMessageStyle style; private final ScrowMessageStyle style;
public FriendRemoveLiteral(ScrowMessageStyle style) { public FriendRemoveLiteral(ScrowMessageStyle style) {
this.style = style; this.style = style;
this.playerArg = CommandArgument.arg("player", OfflinePlayerArgumentType.getInstance()); this.playerArg = CommandArgument.arg("player", OfflinePlayerArgumentType.getInstance());
this.rootNode = CommandNode.node("remove"); this.literal = CommandNode.node("remove");
this.rootNode.addArgument(playerArg); this.literal.addArgument(playerArg);
this.rootNode.setExecutor(this); this.literal.setExecutor(this);
} }
@Override @Override

View file

@ -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<CommandSender> {
@Getter
private final CommandNode<CommandSender> literal;
private final CommandArgument<CommandSender, OfflinePlayer> 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<Result<Object, String>> execute(CommandContext<CommandSender> ctx) {
var self = (Player) ctx.getSender();
var other = ctx.getArg(playerArg);
return Tasks.supplyAsync(() ->
requestService.deleteFriendRequest(other.getUniqueId(), self.getUniqueId()))
.<Result<Object, String>>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();
}
}

View file

@ -6,7 +6,7 @@ import de.kentoj.kencommandapi.api.invocation.CommandContext;
import de.kentoj.kencommandapi.api.invocation.CommandExecutor; import de.kentoj.kencommandapi.api.invocation.CommandExecutor;
import de.kentoj.kencommandapi.api.node.CommandNode; import de.kentoj.kencommandapi.api.node.CommandNode;
import de.kentoj.scrow.bukkit.ScrowAPI; 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.scrow.bukkit.scheduler.Tasks;
import de.kentoj.scrowlib.convention.ScrowMessageStyle; import de.kentoj.scrowlib.convention.ScrowMessageStyle;
import lombok.Getter; import lombok.Getter;
@ -57,8 +57,9 @@ public class FriendRequestsLiteral implements CommandExecutor<CommandSender> {
for (String requester : requesters) { for (String requester : requesters) {
message = message message = message
.appendNewline() .appendNewline()
.append(text("").color(NamedTextColor.AQUA)) .append(text("").color(style.getPrefixColor()))
.append(Component.text(requester)); .append(Component.text(requester).color(NamedTextColor.GRAY)
.append(FriendCommand.friendRequestOptions(requester, false)));
} }
return message; return message;
} }

View file

@ -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));
});
}
}

View file

@ -47,7 +47,7 @@ public class PlayCommand implements CommandExecutor<CommandSender> {
return Results.failure("No instance for " + gamemode + " found."); return Results.failure("No instance for " + gamemode + " found.");
return Results.ofCallable(() -> { return Results.ofCallable(() -> {
ScrowAPI.getPlayerManager().sendPlayer(player.getUniqueId(), instance.getHandle()); ScrowAPI.getPlayer(player).sendToInstance(instance.getHandle());
return new Object(); return new Object();
}).mapFailure(Exception::getMessage); }).mapFailure(Exception::getMessage);
}).toFuture(); }).toFuture();

View file

@ -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<Player, Document> handler) {
ScrowAPI.getMessageBroker().subscribe(subject, doc -> {
var player = Bukkit.getPlayer(doc.get("playerId", UUID.class));
if (player != null)
handler.accept(player, doc);
});
}
}

View file

@ -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);
}
}

View file

@ -24,6 +24,7 @@ dependencies {
api("de.kentoj.scrow:kencommandapi-core:0.30") api("de.kentoj.scrow:kencommandapi-core:0.30")
compileOnly("net.kyori:adventure-api:5.2.0") compileOnly("net.kyori:adventure-api:5.2.0")
compileOnly("net.kyori:adventure-text-minimessage:5.2.0")
} }
publishing { publishing {

View file

@ -1,4 +1,4 @@
package de.kentoj.scrow.bukkit.misc; package de.kentoj.scrowlib.economy;
import java.util.UUID; import java.util.UUID;

View file

@ -1,7 +1,6 @@
package de.kentoj.scrow.bukkit.economy; package de.kentoj.scrowlib.economy;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import de.kentoj.scrow.bukkit.misc.EconomyService;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;

View file

@ -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.ScrowAPI;
import de.kentoj.scrow.bukkit.misc.EconomyService;
import org.jdbi.v3.core.Jdbi; import org.jdbi.v3.core.Jdbi;
import java.util.UUID; import java.util.UUID;

View file

@ -1,4 +1,4 @@
package de.kentoj.scrow.bukkit.friends; package de.kentoj.scrowlib.friends;
import java.time.Instant; import java.time.Instant;
import java.util.UUID; import java.util.UUID;

View file

@ -1,4 +1,4 @@
package de.kentoj.scrow.bukkit.friends; package de.kentoj.scrowlib.friends;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;

View file

@ -1,7 +1,6 @@
package de.kentoj.scrow.bukkit.friends; package de.kentoj.scrowlib.friends;
import java.time.Instant; import java.time.Instant;
import java.util.UUID;
public interface Friendship { public interface Friendship {

View file

@ -1,4 +1,4 @@
package de.kentoj.scrow.bukkit.friends; package de.kentoj.scrowlib.friends;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;

View file

@ -1,4 +1,4 @@
package de.kentoj.scrow.bukkit.friends; package de.kentoj.scrowlib.friends;
import lombok.Getter; import lombok.Getter;

View file

@ -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.scrowlib.friends.Friendship;
import de.kentoj.scrow.bukkit.friends.OrderedUUIDPair; import de.kentoj.scrowlib.friends.OrderedUUIDPair;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.Value; import lombok.Value;

View file

@ -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.scrowlib.friends.Friendship;
import de.kentoj.scrow.bukkit.friends.FriendshipService; import de.kentoj.scrowlib.friends.FriendshipService;
import de.kentoj.scrow.bukkit.friends.OrderedUUIDPair; import de.kentoj.scrowlib.friends.OrderedUUIDPair;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;

View file

@ -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.ScrowAPI;
import de.kentoj.scrow.bukkit.friends.FriendRequest; import de.kentoj.scrowlib.friends.Friendship;
import de.kentoj.scrow.bukkit.friends.Friendship; import de.kentoj.scrowlib.friends.FriendshipService;
import de.kentoj.scrow.bukkit.friends.FriendshipService; import de.kentoj.scrowlib.friends.OrderedUUIDPair;
import de.kentoj.scrow.bukkit.friends.OrderedUUIDPair;
import de.kentoj.scrow.bukkit.friends.request.FriendRequestImpl;
import org.jdbi.v3.core.Jdbi; import org.jdbi.v3.core.Jdbi;
import org.jdbi.v3.core.statement.StatementContext; import org.jdbi.v3.core.statement.StatementContext;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.time.Instant; import java.time.OffsetDateTime;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
@ -90,10 +88,13 @@ public class PostgresFriendshipService implements FriendshipService {
} }
private Friendship parseFriendship(ResultSet rs, StatementContext __) throws SQLException { private Friendship parseFriendship(ResultSet rs, StatementContext __) throws SQLException {
for (int i = 0; i < 5; i++) {
System.out.println("parsing friendship");
}
return new FriendshipImpl( return new FriendshipImpl(
rs.getObject("first_uuid", UUID.class), rs.getObject("first_uuid", UUID.class),
rs.getObject("second_uuid", UUID.class), rs.getObject("second_uuid", UUID.class),
rs.getObject("created_at", Instant.class) rs.getObject("created_at", OffsetDateTime.class).toInstant()
); );
} }
} }

View file

@ -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.AllArgsConstructor;
import lombok.Value; import lombok.Value;

View file

@ -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.scrowlib.friends.FriendRequest;
import de.kentoj.scrow.bukkit.friends.FriendRequestService; import de.kentoj.scrowlib.friends.FriendRequestService;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;

View file

@ -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.ScrowAPI;
import de.kentoj.scrow.bukkit.friends.FriendRequest; import de.kentoj.scrowlib.friends.FriendRequest;
import de.kentoj.scrow.bukkit.friends.FriendRequestService; import de.kentoj.scrowlib.friends.FriendRequestService;
import lombok.extern.slf4j.Slf4j;
import org.jdbi.v3.core.Jdbi; import org.jdbi.v3.core.Jdbi;
import org.jdbi.v3.core.statement.StatementContext; import org.jdbi.v3.core.statement.StatementContext;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import javax.swing.tree.RowMapper;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.time.Instant; import java.time.OffsetDateTime;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
@Slf4j
public class PostgresFriendRequestService implements FriendRequestService { public class PostgresFriendRequestService implements FriendRequestService {
private final Jdbi jdbi; private final Jdbi jdbi;
@ -102,7 +103,7 @@ public class PostgresFriendRequestService implements FriendRequestService {
return new FriendRequestImpl( return new FriendRequestImpl(
rs.getObject("from_uuid", UUID.class), rs.getObject("from_uuid", UUID.class),
rs.getObject("to_uuid", UUID.class), rs.getObject("to_uuid", UUID.class),
rs.getObject("created_at", Instant.class) rs.getObject("created_at", OffsetDateTime.class).toInstant()
); );
} }
} }

View file

@ -20,22 +20,27 @@ public class MessageBroker {
public MessageBroker(Connection nats) { public MessageBroker(Connection nats) {
this.nats = nats; this.nats = nats;
this.dispatcher = nats.createDispatcher(); this.dispatcher = nats.createDispatcher();
}
public void publish(String subject, Document document) {
nats.publish(subject, DocumentRepository.toBytes(document));
} }
public void publish(String subject, Result<Document, String> result) { public void publish(String subject, Result<Document, String> result) {
nats.publish(subject, ResultRepository.toBytes(result)); this.publish(subject, ResultRepository.toDocument(result));
} }
/** /**
* subscribes to a subject, handler may run asynchronously * subscribes to a subject, handler may run asynchronously
*/ */
public void subscribe(String subject, Consumer<Document> handler) { public void subscribe(String subject, Consumer<Document> handler) {
dispatcher.subscribe(subject, msg -> { dispatcher.subscribe(subject, msg ->
executor.submit(() -> handler.accept(DocumentRepository.fromMessage(msg))); executor.submit(() -> handler.accept(DocumentRepository.fromMessage(msg))));
});
} }
/**
* handler may run asynchronously
*/
public void handle(String subject, RequestHandler handler) { public void handle(String subject, RequestHandler handler) {
dispatcher.subscribe(subject, msg -> { dispatcher.subscribe(subject, msg -> {
if (msg.getReplyTo() == null) { if (msg.getReplyTo() == null) {

View file

@ -10,11 +10,10 @@ import org.bson.Document;
@NoArgsConstructor(access = AccessLevel.NONE) @NoArgsConstructor(access = AccessLevel.NONE)
public class ResultRepository { public class ResultRepository {
public static byte[] toBytes(Result<Document, String> result) { public static Document toDocument(Result<Document, String> result) {
var doc = result.hasSuccess() return result.hasSuccess()
? new Document("data", result.getSuccess().orElseThrow()) ? new Document("data", result.getSuccess().orElseThrow())
: new Document("error", result.getFailure().orElseThrow()); : new Document("error", result.getFailure().orElseThrow());
return DocumentRepository.toBytes(doc);
} }
public static Result<Document, String> fromDocument(Document doc) { public static Result<Document, String> fromDocument(Document doc) {

View file

@ -0,0 +1,8 @@
package de.kentoj.scrowlib.player;
import net.kyori.adventure.audience.Audience;
public interface NetworkPlayer extends Audience {
void sendToInstance(String handle);
}

View file

@ -0,0 +1,9 @@
package de.kentoj.scrowlib.player;
import java.util.UUID;
@FunctionalInterface
public interface NetworkPlayerFactory {
NetworkPlayer create(UUID uuid);
}

View file

@ -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)));
}
}

View file

@ -1,14 +1,19 @@
package de.kentoj.scrow.velocity; package de.kentoj.scrow.velocity;
import com.velocitypowered.api.proxy.Player;
import de.kentoj.kencommandapi.CommandAPI; import de.kentoj.kencommandapi.CommandAPI;
import de.kentoj.scrowlib.instancemanager.InstanceManager; import de.kentoj.scrowlib.instancemanager.InstanceManager;
import de.kentoj.scrowlib.messaging.MessageBroker; import de.kentoj.scrowlib.messaging.MessageBroker;
import de.kentoj.scrowlib.player.NetworkPlayer;
import de.kentoj.scrowlib.player.NetworkPlayerFactory;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.jdbi.v3.core.Jdbi; import org.jdbi.v3.core.Jdbi;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
import java.util.UUID;
@NoArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ScrowAPI { public class ScrowAPI {
@ -20,6 +25,16 @@ public class ScrowAPI {
private static MessageBroker messageBroker; private static MessageBroker messageBroker;
@Getter @Getter
private static InstanceManager instanceManager; 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 @ApiStatus.Internal
public static void setCommandApi(CommandAPI commandApi) { public static void setCommandApi(CommandAPI commandApi) {
@ -40,5 +55,10 @@ public class ScrowAPI {
public static void setJdbi(Jdbi jdbi) { public static void setJdbi(Jdbi jdbi) {
ScrowAPI.jdbi = jdbi; ScrowAPI.jdbi = jdbi;
} }
@ApiStatus.Internal
public static void setPlayerFactory(NetworkPlayerFactory playerFactory) {
ScrowAPI.playerFactory = playerFactory;
}
} }

View file

@ -23,9 +23,6 @@ dependencies {
// https://docs.papermc.io/velocity/dev/creating-your-first-plugin/ // https://docs.papermc.io/velocity/dev/creating-your-first-plugin/
annotationProcessor("com.velocitypowered:velocity-api:3.5.0-SNAPSHOT") 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 // https://mvnrepository.com/artifact/org.postgresql/postgresql
implementation("org.postgresql:postgresql:42.7.12") implementation("org.postgresql:postgresql:42.7.12")
} }

View file

@ -4,12 +4,13 @@ import com.google.inject.Inject;
import com.velocitypowered.api.plugin.Plugin; import com.velocitypowered.api.plugin.Plugin;
import com.velocitypowered.api.proxy.ProxyServer; import com.velocitypowered.api.proxy.ProxyServer;
import de.kentoj.scrow.corevelocity.command.OnlineCommand; 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.LastTargetCache;
import de.kentoj.scrow.corevelocity.privmsg.MsgCommand; import de.kentoj.scrow.corevelocity.privmsg.MsgCommand;
import de.kentoj.scrow.corevelocity.privmsg.PrivMsgHandler; import de.kentoj.scrow.corevelocity.privmsg.PrivMsgHandler;
import de.kentoj.scrow.corevelocity.privmsg.ReplyCommand; import de.kentoj.scrow.corevelocity.privmsg.ReplyCommand;
import de.kentoj.scrow.corevelocity.server.SendPlayerWatchdog; import de.kentoj.scrow.corevelocity.network.SendPlayerWatchdog;
import de.kentoj.scrow.corevelocity.server.ServerRegisterWatchdog; import de.kentoj.scrow.corevelocity.network.ServerRegisterWatchdog;
import de.kentoj.scrow.generated.BuildInfo; import de.kentoj.scrow.generated.BuildInfo;
import de.kentoj.scrow.velocity.ScrowAPI; import de.kentoj.scrow.velocity.ScrowAPI;
import de.kentoj.scrowlib.convention.ScrowMessageStyle; import de.kentoj.scrowlib.convention.ScrowMessageStyle;
@ -37,9 +38,10 @@ public class CoreVelocityPlugin {
cmds.register(new OnlineCommand(server).getRootNode()); cmds.register(new OnlineCommand(server).getRootNode());
} }
var registerWatchdog = new ServerRegisterWatchdog(ScrowAPI.getMessageBroker(), server); var registerWatchdog = new ServerRegisterWatchdog(server);
var sendPlayerWatchdog = new SendPlayerWatchdog(ScrowAPI.getMessageBroker(), server); var sendPlayerWatchdog = new SendPlayerWatchdog(server);
registerWatchdog.listen(); registerWatchdog.listen();
sendPlayerWatchdog.listen(); sendPlayerWatchdog.listen();
server.getEventManager().register(this, new FriendNotifications());
} }
} }

View file

@ -5,6 +5,7 @@ import de.kentoj.kencommandapi.CommandAPI;
import de.kentoj.scrow.velocity.ScrowAPI; import de.kentoj.scrow.velocity.ScrowAPI;
import de.kentoj.scrowlib.instancemanager.InstanceManagerImpl; import de.kentoj.scrowlib.instancemanager.InstanceManagerImpl;
import de.kentoj.scrowlib.messaging.MessageBroker; import de.kentoj.scrowlib.messaging.MessageBroker;
import de.kentoj.scrowlib.player.NetworkPlayerImpl;
import de.kentoj.scrowlib.utils.EnvUtils; import de.kentoj.scrowlib.utils.EnvUtils;
import io.nats.client.Nats; import io.nats.client.Nats;
import io.nats.client.Options; import io.nats.client.Options;
@ -42,8 +43,8 @@ public class ScrowAPISurface {
} }
ScrowAPI.setInstanceManager(new InstanceManagerImpl(ScrowAPI.getMessageBroker())); ScrowAPI.setInstanceManager(new InstanceManagerImpl(ScrowAPI.getMessageBroker()));
ScrowAPI.setCommandApi(new CommandAPI(server)); ScrowAPI.setCommandApi(new CommandAPI(server));
ScrowAPI.setPlayerFactory(playerId -> new NetworkPlayerImpl(ScrowAPI.getMessageBroker(), playerId));
} }
public static void destroyScrowAPI() { public static void destroyScrowAPI() {

View file

@ -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()));
}
}

View file

@ -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.api.Result;
import com.leakyabstractions.result.core.Results; import com.leakyabstractions.result.core.Results;
import com.velocitypowered.api.proxy.ProxyServer; import com.velocitypowered.api.proxy.ProxyServer;
import de.kentoj.scrow.velocity.ScrowAPI;
import de.kentoj.scrowlib.messaging.MessageBroker; import de.kentoj.scrowlib.messaging.MessageBroker;
import io.nats.client.Connection;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.bson.Document; import org.bson.Document;
@ -18,11 +18,11 @@ import java.util.concurrent.ExecutionException;
@RequiredArgsConstructor @RequiredArgsConstructor
public class SendPlayerWatchdog { public class SendPlayerWatchdog {
private final MessageBroker natsRepo; private final MessageBroker messageBroker = ScrowAPI.getMessageBroker();
private final ProxyServer server; private final ProxyServer server;
public void listen() { public void listen() {
natsRepo.handle("players.send", doc -> sendPlayer( messageBroker.handle("player.send", doc -> sendPlayer(
doc.get("playerId", UUID.class), doc.get("playerId", UUID.class),
doc.getString("handle") doc.getString("handle")
)); ));

View file

@ -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.ProxyServer;
import com.velocitypowered.api.proxy.server.ServerInfo; import com.velocitypowered.api.proxy.server.ServerInfo;
import de.kentoj.scrow.velocity.ScrowAPI;
import de.kentoj.scrowlib.messaging.MessageBroker; import de.kentoj.scrowlib.messaging.MessageBroker;
import io.nats.client.Connection;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.java.Log; import lombok.extern.java.Log;
@ -13,18 +13,18 @@ import java.net.InetSocketAddress;
@RequiredArgsConstructor @RequiredArgsConstructor
public class ServerRegisterWatchdog { public class ServerRegisterWatchdog {
private final MessageBroker natsRepo; private final MessageBroker messageBroker = ScrowAPI.getMessageBroker();
private final ProxyServer server; private final ProxyServer server;
public void listen() { public void listen() {
natsRepo.subscribe("event.instance.up", doc -> { messageBroker.subscribe("event.instance.up", doc -> {
var handle = doc.getString("handle"); var handle = doc.getString("handle");
var port = doc.getInteger("port"); var port = doc.getInteger("port");
server.unregisterServer(new ServerInfo(handle, new InetSocketAddress(port))); server.unregisterServer(new ServerInfo(handle, new InetSocketAddress(port)));
log.info("registered server " + handle); log.info("registered server " + handle);
}); });
natsRepo.subscribe("event.instance.down", doc -> { messageBroker.subscribe("event.instance.down", doc -> {
var handle = doc.getString("handle"); var handle = doc.getString("handle");
var port = doc.getInteger("port"); var port = doc.getInteger("port");
server.unregisterServer(new ServerInfo(handle, new InetSocketAddress(port))); server.unregisterServer(new ServerInfo(handle, new InetSocketAddress(port)));

View file

@ -1,7 +1,7 @@
package de.kentoj.scrow.corevelocity.privmsg; package de.kentoj.scrow.corevelocity.privmsg;
import com.github.benmanes.caffeine.cache.Cache; import com.google.common.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine; import com.google.common.cache.CacheBuilder;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -10,8 +10,8 @@ import java.util.concurrent.TimeUnit;
public class LastTargetCache { public class LastTargetCache {
private final Cache<@NotNull UUID, UUID> cache = Caffeine.newBuilder() private final Cache<@NotNull UUID, @NotNull UUID> cache = CacheBuilder.newBuilder()
.expireAfterWrite(20, TimeUnit.MINUTES) .expireAfterAccess(20, TimeUnit.MINUTES)
.build(); .build();
public @Nullable UUID getLastTarget(UUID uuid) { public @Nullable UUID getLastTarget(UUID uuid) {

View file

@ -46,7 +46,6 @@ public class ReplyCommand implements SyncCommandExecutor<CommandSource> {
if (target == null) if (target == null)
return Results.failure("The player you last messaged is no longer online."); return Results.failure("The player you last messaged is no longer online.");
cache.setLastTarget(sender.getUniqueId(), target.getUniqueId());
privMsgHandler.handle(sender, target, msg); privMsgHandler.handle(sender, target, msg);
return Results.success(new Object()); return Results.success(new Object());
} }