From 07fa0efab719be36ad773dcd2381ae8f9820fcc8 Mon Sep 17 00:00:00 2001 From: kento2 Date: Sat, 14 Feb 2026 14:04:36 +0100 Subject: [PATCH] . --- build.gradle.kts | 6 +- .../kentoj/scrow/services/EconomyService.java | 3 +- .../scrow/economy/EconomyServiceImpl.java | 71 ++++++++++++++++++- .../java/de/kentoj/scrow/economy/Main.java | 24 ++++++- .../kentoj/scrow/economy/MongoDbHelper.java | 15 ++-- 5 files changed, 107 insertions(+), 12 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 4b2a8a6..bc59d7c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -29,8 +29,8 @@ subprojects { // https://mvnrepository.com/artifact/com.google.guava/guava implementation("com.google.guava:guava:33.5.0-jre") - // https://www.mongodb.com/docs/drivers/java/sync/current/get-started/ - implementation(platform("org.mongodb:mongodb-driver-bom:5.6.3")) - implementation("org.mongodb:mongodb-driver-sync") + // https://www.mongodb.com/docs/languages/java/reactive-streams-driver/current/get-started/download-and-install/ + implementation(platform("org.mongodb:mongodb-driver-bom:5.6.1")) + implementation("org.mongodb:mongodb-driver-reactivestreams") } } \ No newline at end of file diff --git a/core-api/src/main/java/de/kentoj/scrow/services/EconomyService.java b/core-api/src/main/java/de/kentoj/scrow/services/EconomyService.java index 9422500..785bc90 100644 --- a/core-api/src/main/java/de/kentoj/scrow/services/EconomyService.java +++ b/core-api/src/main/java/de/kentoj/scrow/services/EconomyService.java @@ -11,9 +11,8 @@ public interface EconomyService { /** * @param playerId uuid of player - * @return new coins balance */ - Mono<@NotNull Integer> depositCoins(UUID playerId, int amount); + Mono<@NotNull Void> depositCoins(UUID playerId, int amount); /** * @param playerId uuid of player diff --git a/core-impl/src/main/java/de/kentoj/scrow/economy/EconomyServiceImpl.java b/core-impl/src/main/java/de/kentoj/scrow/economy/EconomyServiceImpl.java index a8a036a..73389eb 100644 --- a/core-impl/src/main/java/de/kentoj/scrow/economy/EconomyServiceImpl.java +++ b/core-impl/src/main/java/de/kentoj/scrow/economy/EconomyServiceImpl.java @@ -1,4 +1,73 @@ package de.kentoj.scrow.economy; -public class EconomyServiceImpl { +import com.google.common.base.Preconditions; +import com.mongodb.client.model.Filters; +import com.mongodb.client.model.UpdateOptions; +import com.mongodb.client.model.Updates; +import com.mongodb.reactivestreams.client.MongoCollection; +import com.mongodb.reactivestreams.client.MongoDatabase; +import de.kentoj.scrow.services.EconomyService; +import org.bson.Document; +import org.jetbrains.annotations.NotNull; +import reactor.core.publisher.Mono; + +import java.util.UUID; + +public class EconomyServiceImpl implements EconomyService { + + private static final String COLLECTION_NAME = "economy"; + private final @NotNull MongoDatabase database; + + public EconomyServiceImpl(MongoDatabase database) { + this.database = database; + Mono.from(database.createCollection(COLLECTION_NAME)).block(); + } + + @Override + public Mono<@NotNull Integer> getCoins(UUID playerId) { + return Mono.from( + getCollection().find(Filters.eq("_id", playerId)).first() + ).map(result -> result.getInteger("coins")).defaultIfEmpty(0); + } + + @Override + public Mono<@NotNull Void> setCoins(UUID playerId, int amount) { + Preconditions.checkArgument(amount >= 0, "amount can not be negative"); + + return Mono.from( + getCollection().updateOne( + Filters.eq("_id", playerId), + Updates.set("coins", amount), + new UpdateOptions().upsert(true) + ) + ).then(); + } + + @Override + public Mono<@NotNull Void> depositCoins(UUID playerId, int amount) { + Preconditions.checkArgument(amount >= 0, "amount can not be negative"); + + return Mono.from(getCollection().updateOne( + Filters.eq("_id", playerId), + Updates.inc("coins", amount), + new UpdateOptions().upsert(true) + )).then(); + } + + @Override + public Mono<@NotNull Boolean> tryWithdrawCoins(UUID playerId, int amount) { + Preconditions.checkArgument(amount >= 0, "amount can not be negative"); + + return Mono.from(getCollection().updateOne( + Filters.and( + Filters.eq("_id", playerId), + Filters.gte("coins", amount) + ), + Updates.inc("coins", -1 * amount) + )).map(result -> result.getModifiedCount() > 0); + } + + private MongoCollection getCollection() { + return database.getCollection(COLLECTION_NAME); + } } diff --git a/core-impl/src/main/java/de/kentoj/scrow/economy/Main.java b/core-impl/src/main/java/de/kentoj/scrow/economy/Main.java index 2fa6244..54480fb 100644 --- a/core-impl/src/main/java/de/kentoj/scrow/economy/Main.java +++ b/core-impl/src/main/java/de/kentoj/scrow/economy/Main.java @@ -1,8 +1,28 @@ package de.kentoj.scrow.economy; +import de.kentoj.scrow.services.EconomyService; +import reactor.core.publisher.Mono; + +import java.util.UUID; + public class Main { public static void main(String[] args) { - var a = new MongoDbHelper(); - a.close(); + var con = new MongoDbHelper(); + + var playerId = UUID.randomUUID(); + EconomyService economyService = new EconomyServiceImpl(con.getDatabase()); + Mono.when( + economyService.setCoins(playerId, 120), + economyService.depositCoins(playerId, 100) + ) + .then(economyService.tryWithdrawCoins(playerId, 300)) + .doOnNext(a -> System.out.println("withdraw 1 success " + a)) + .then(economyService.tryWithdrawCoins(playerId, 50)) + .doOnNext(a -> System.out.println("withdraw 2 success " + a)) + .then(economyService.getCoins(playerId)) + .doOnNext(a -> System.out.println("coins: " + a)) + .block(); + + con.close(); } } diff --git a/core-impl/src/main/java/de/kentoj/scrow/economy/MongoDbHelper.java b/core-impl/src/main/java/de/kentoj/scrow/economy/MongoDbHelper.java index 409d889..e62ee2d 100644 --- a/core-impl/src/main/java/de/kentoj/scrow/economy/MongoDbHelper.java +++ b/core-impl/src/main/java/de/kentoj/scrow/economy/MongoDbHelper.java @@ -1,9 +1,12 @@ package de.kentoj.scrow.economy; -import com.mongodb.client.MongoClient; -import com.mongodb.client.MongoClients; -import com.mongodb.client.MongoDatabase; +import com.mongodb.ConnectionString; +import com.mongodb.MongoClientSettings; +import com.mongodb.reactivestreams.client.MongoClient; +import com.mongodb.reactivestreams.client.MongoClients; +import com.mongodb.reactivestreams.client.MongoDatabase; import lombok.Getter; +import org.bson.UuidRepresentation; import java.io.Closeable; @@ -14,7 +17,11 @@ public class MongoDbHelper implements Closeable { private final MongoDatabase database; public MongoDbHelper() { - con = MongoClients.create("mongodb://:@localhost:27017/db?ssl=false"); + var settings = MongoClientSettings.builder() + .applyConnectionString(new ConnectionString("mongodb://localhost:27017/scrow?ssl=false")) + .uuidRepresentation(UuidRepresentation.STANDARD) + .build(); + con = MongoClients.create(settings); database = con.getDatabase("scrow"); }