This commit is contained in:
kento2 2026-04-16 22:17:48 +02:00
parent ad4e00a6ab
commit 3433e1d4df
9 changed files with 43 additions and 35 deletions

View file

@ -1,16 +1,14 @@
TODO
- separate error handling from processing
- tab completion
environment environment
----------- -----------
```shell ```shell
docker network create scrow 2>/dev/null || true 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 -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='' --name mongo-express -p 8081:8081 mongo-express 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
``` ```
acce**ss the mongo-db web interface at http://localhost:8081; username `a`, password `1234`**
modules modules
------- -------

View file

@ -36,9 +36,9 @@ dependencies {
api("org.spigotmc:spigot-api:1.21.11-R0.1-SNAPSHOT") api("org.spigotmc:spigot-api:1.21.11-R0.1-SNAPSHOT")
api("net.kyori:adventure-platform-bukkit:4.4.1") api("net.kyori:adventure-platform-bukkit:4.4.1")
api("de.kentoj:kencommandapi-core:2.0.1") api("de.kentoj:kencommandapi-core:2.0.2")
implementation("de.kentoj:kencommandapi-bukkit:2.0.1") implementation("de.kentoj:kencommandapi-bukkit:2.0.2")
api("de.kentoj:kencommandapi-bukkit:2.0.1") api("de.kentoj:kencommandapi-bukkit:2.0.2")
} }
publishing { publishing {

View file

@ -1,5 +1,6 @@
package de.kentoj.scrow.bukkit; package de.kentoj.scrow.bukkit;
import com.mongodb.reactivestreams.client.MongoClient;
import com.mongodb.reactivestreams.client.MongoDatabase; import com.mongodb.reactivestreams.client.MongoDatabase;
import de.kentoj.kencommandapi.BukkitKenCommandApi; import de.kentoj.kencommandapi.BukkitKenCommandApi;
import de.kentoj.scrow.bukkit.friends.FriendsService; import de.kentoj.scrow.bukkit.friends.FriendsService;

View file

@ -2,6 +2,7 @@ package de.kentoj.scrow.bukkit;
import de.kentoj.scrow.bukkit.economy.CoinsCommand; import de.kentoj.scrow.bukkit.economy.CoinsCommand;
import de.kentoj.scrow.bukkit.friends.command.FriendCommand; import de.kentoj.scrow.bukkit.friends.command.FriendCommand;
import de.kentoj.scrow.bukkit.friends.friendship.MongoFriendshipDAO;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
@ -11,11 +12,11 @@ public class CoreImplPlugin extends JavaPlugin {
@Override @Override
public void onEnable() { public void onEnable() {
ScrowAPISurface.initScrowAPI(this, false); ScrowAPISurface.initScrowAPI(this, true);
{ {
ScrowAPI.getCommandManager().register(new CoinsCommand().getRootNode()); ScrowAPI.getCommandManager().register(new CoinsCommand().getRootNode());
ScrowAPI.getCommandManager().register(new FriendCommand().getRootNode()); ScrowAPI.getCommandManager().register(new FriendCommand(new MongoFriendshipDAO(ScrowAPI.getDatabase())).getRootNode());
} }
{ {
@ -33,6 +34,10 @@ public class CoreImplPlugin extends JavaPlugin {
.doOnNext(a -> System.out.println("coins: " + a)) .doOnNext(a -> System.out.println("coins: " + a))
.block(); .block();
} }
}
@Override
public void onDisable() {
ScrowAPISurface.destroyScrowAPI(); ScrowAPISurface.destroyScrowAPI();
} }
} }

View file

@ -20,7 +20,7 @@ import reactor.core.scheduler.Schedulers;
@NoArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ScrowAPISurface { public class ScrowAPISurface {
private static @Nullable MongoClient databaseClient = null; private static @Nullable MongoClient mongoClient;
public static void initScrowAPI(Plugin plugin, boolean enableDatabase) { public static void initScrowAPI(Plugin plugin, boolean enableDatabase) {
ScrowAPI.setMinecraftScheduler(Schedulers.fromExecutor(cmd -> { ScrowAPI.setMinecraftScheduler(Schedulers.fromExecutor(cmd -> {
@ -38,7 +38,9 @@ public class ScrowAPISurface {
.uuidRepresentation(UuidRepresentation.STANDARD) .uuidRepresentation(UuidRepresentation.STANDARD)
.applyConnectionString(new ConnectionString("mongodb://localhost:27017/scrow")) .applyConnectionString(new ConnectionString("mongodb://localhost:27017/scrow"))
.build(); .build();
databaseClient = MongoClients.create(settings);
mongoClient = MongoClients.create(settings);
ScrowAPI.setDatabase(mongoClient.getDatabase("scrow"));
} }
ScrowAPI.setEconomyService( ScrowAPI.setEconomyService(
@ -52,8 +54,8 @@ public class ScrowAPISurface {
} }
public static void destroyScrowAPI() { public static void destroyScrowAPI() {
if (databaseClient != null) { if (mongoClient != null) {
databaseClient.close(); mongoClient.close();
} }
} }
} }

View file

@ -3,6 +3,7 @@ package de.kentoj.scrow.bukkit.friends.command;
import de.kentoj.kencommandapi.BukkitCommandContext; import de.kentoj.kencommandapi.BukkitCommandContext;
import de.kentoj.kencommandapi.api.structure.node.CommandNode; import de.kentoj.kencommandapi.api.structure.node.CommandNode;
import de.kentoj.scrow.bukkit.ScrowAPI; import de.kentoj.scrow.bukkit.ScrowAPI;
import de.kentoj.scrow.bukkit.friends.friendship.FriendshipDAO;
import lombok.Getter; import lombok.Getter;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -11,8 +12,8 @@ public class FriendCommand {
@Getter @Getter
private final CommandNode<CommandSender, BukkitCommandContext> rootNode; private final CommandNode<CommandSender, BukkitCommandContext> rootNode;
public FriendCommand() { public FriendCommand(FriendshipDAO friendshipDAO) {
this.rootNode = ScrowAPI.getCommandManager().createNode("friends", "f", "friend"); this.rootNode = ScrowAPI.getCommandManager().createNode("friends", "f", "friend");
rootNode.addLiteral(new FriendListLiteral().getNode()); rootNode.addLiteral(new FriendListLiteral(friendshipDAO).getNode());
} }
} }

View file

@ -3,6 +3,7 @@ package de.kentoj.scrow.bukkit.friends.command;
import de.kentoj.kencommandapi.BukkitCommandContext; import de.kentoj.kencommandapi.BukkitCommandContext;
import de.kentoj.kencommandapi.api.structure.node.CommandNode; import de.kentoj.kencommandapi.api.structure.node.CommandNode;
import de.kentoj.scrow.bukkit.ScrowAPI; import de.kentoj.scrow.bukkit.ScrowAPI;
import de.kentoj.scrow.bukkit.friends.friendship.FriendshipDAO;
import lombok.Getter; import lombok.Getter;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -12,8 +13,10 @@ public class FriendListLiteral {
@Getter @Getter
private final CommandNode<CommandSender, BukkitCommandContext> node; private final CommandNode<CommandSender, BukkitCommandContext> node;
private final FriendshipDAO friendshipDAO;
public FriendListLiteral() { public FriendListLiteral(FriendshipDAO friendshipDAO) {
this.friendshipDAO = friendshipDAO;
this.node = ScrowAPI.getCommandManager().createNode("list"); this.node = ScrowAPI.getCommandManager().createNode("list");
node.setExecutor(this::friendList); node.setExecutor(this::friendList);
} }
@ -21,11 +24,11 @@ public class FriendListLiteral {
private void friendList(BukkitCommandContext ctx) { private void friendList(BukkitCommandContext ctx) {
var ownUid = ctx.getPlayerSender().getUniqueId(); var ownUid = ctx.getPlayerSender().getUniqueId();
ctx.getPlayerSender().sendMessage("friends:"); ctx.getPlayerSender().sendMessage("friends:");
ScrowAPI.getFriendsService().getFriendships(ownUid) friendshipDAO.getFriendships(ownUid)
.publishOn(ScrowAPI.getMinecraftScheduler()) .publishOn(ScrowAPI.getMinecraftScheduler())
.subscribeOn(Schedulers.boundedElastic()) .subscribeOn(Schedulers.boundedElastic())
.map(friendship -> { .map(friendship -> {
var friendPlayerUid = friendship.getOther(ownUid); var friendPlayerUid = friendship.getUuids().getOther(ownUid);
var friendPlayerName = Bukkit.getOfflinePlayer(friendPlayerUid).getName(); var friendPlayerName = Bukkit.getOfflinePlayer(friendPlayerUid).getName();
return "- " + friendPlayerName; return "- " + friendPlayerName;
}).doOnNext(line -> { }).doOnNext(line -> {

View file

@ -1,15 +1,13 @@
package de.kentoj.scrow.bukkit.friends.friendship; package de.kentoj.scrow.bukkit.friends.friendship;
import de.kentoj.scrow.bukkit.friends.Friendship; import de.kentoj.scrow.bukkit.friends.Friendship;
import de.kentoj.scrow.bukkit.util.pair.Tuple2;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import java.time.Instant;
import java.util.UUID; import java.util.UUID;
public interface FriendshipRepository { public interface FriendshipDAO {
Flux<@NotNull Friendship> getFriendships(UUID playerId); Flux<@NotNull Friendship> getFriendships(UUID playerId);

View file

@ -17,23 +17,23 @@ import reactor.core.publisher.Mono;
import java.sql.Date; import java.sql.Date;
import java.util.UUID; import java.util.UUID;
public class MongoFriendshipRepository implements FriendshipRepository { public class MongoFriendshipDAO implements FriendshipDAO {
private static final String COLLECTION_NAME = "friendships"; private static final String COLLECTION_NAME = "friendships";
private final MongoDatabase database; private final MongoDatabase database;
public MongoFriendshipRepository(MongoDatabase database) { public MongoFriendshipDAO(MongoDatabase database) {
this.database = database; this.database = database;
database.createCollection(COLLECTION_NAME); Mono.from(database.createCollection(COLLECTION_NAME)).block();
collection().createIndex( Mono.from(collection().createIndex(
Indexes.compoundIndex( Indexes.compoundIndex(
Indexes.ascending("first"), Indexes.ascending("first"),
Indexes.ascending("second") Indexes.ascending("second")
), ),
new IndexOptions().unique(true) new IndexOptions().unique(true)
); )).block();
} }
@Override @Override