diff --git a/bukkit/build.gradle b/bukkit/build.gradle index 858b701a..c139b2d4 100644 --- a/bukkit/build.gradle +++ b/bukkit/build.gradle @@ -14,6 +14,7 @@ dependencies { compileOnly 'de.themoep:minedown-adventure:1.7.1-SNAPSHOT' compileOnly 'dev.dejvokep:boosted-yaml:1.3' compileOnly 'com.zaxxer:HikariCP:5.0.1' + compileOnly 'redis.clients:jedis:' + jedis_version compileOnly 'net.william278:DesertWell:1.1' compileOnly 'net.william278:Annotaml:2.0' compileOnly 'net.william278:AdvancementAPI:97a9583413' diff --git a/bukkit/src/main/java/net/william278/husksync/BukkitHuskSync.java b/bukkit/src/main/java/net/william278/husksync/BukkitHuskSync.java index 9fa24325..9eb0f268 100644 --- a/bukkit/src/main/java/net/william278/husksync/BukkitHuskSync.java +++ b/bukkit/src/main/java/net/william278/husksync/BukkitHuskSync.java @@ -134,7 +134,7 @@ public class BukkitHuskSync extends JavaPlugin implements HuskSync { // Prepare redis connection this.redisManager = new RedisManager(this); getLoggingAdapter().log(Level.INFO, "Attempting to establish connection to the Redis server..."); - initialized.set(this.redisManager.initialize().join()); + initialized.set(this.redisManager.initialize()); if (initialized.get()) { getLoggingAdapter().log(Level.INFO, "Successfully established a connection to the Redis server"); } else { diff --git a/common/src/main/java/net/william278/husksync/redis/RedisManager.java b/common/src/main/java/net/william278/husksync/redis/RedisManager.java index 34a94966..81d8f89e 100644 --- a/common/src/main/java/net/william278/husksync/redis/RedisManager.java +++ b/common/src/main/java/net/william278/husksync/redis/RedisManager.java @@ -19,7 +19,7 @@ import java.util.concurrent.CompletableFuture; /** * Manages the connection to the Redis server, handling the caching of user data */ -public class RedisManager { +public class RedisManager extends JedisPubSub { protected static final String KEY_NAMESPACE = "husksync:"; protected static String clusterId = ""; @@ -53,21 +53,19 @@ public class RedisManager { * * @return a future returning void when complete */ - public CompletableFuture initialize() { - return CompletableFuture.supplyAsync(() -> { - if (redisPassword.isBlank()) { - jedisPool = new JedisPool(jedisPoolConfig, redisHost, redisPort, 0, redisUseSsl); - } else { - jedisPool = new JedisPool(jedisPoolConfig, redisHost, redisPort, 0, redisPassword, redisUseSsl); - } - try { - jedisPool.getResource().ping(); - } catch (JedisException e) { - return false; - } - CompletableFuture.runAsync(this::subscribe); - return true; - }); + public boolean initialize() { + if (redisPassword.isBlank()) { + jedisPool = new JedisPool(jedisPoolConfig, redisHost, redisPort, 0, redisUseSsl); + } else { + jedisPool = new JedisPool(jedisPoolConfig, redisHost, redisPort, 0, redisPassword, redisUseSsl); + } + try { + jedisPool.getResource().ping(); + } catch (JedisException e) { + return false; + } + CompletableFuture.runAsync(this::subscribe); + return true; } private void subscribe() { @@ -75,38 +73,41 @@ public class RedisManager { new Jedis(redisHost, redisPort, DefaultJedisClientConfig.builder() .password(redisPassword).timeoutMillis(0).ssl(redisUseSsl).build())) { subscriber.connect(); - subscriber.subscribe(new JedisPubSub() { - @Override - public void onMessage(@NotNull String channel, @NotNull String message) { - RedisMessageType.getTypeFromChannel(channel).ifPresent(messageType -> { - if (messageType == RedisMessageType.UPDATE_USER_DATA) { - final RedisMessage redisMessage = RedisMessage.fromJson(message); - plugin.getOnlineUser(redisMessage.targetUserUuid).ifPresent(user -> { - final UserData userData = plugin.getDataAdapter().fromBytes(redisMessage.data); - user.setData(userData, plugin.getSettings(), plugin.getEventCannon(), - plugin.getLoggingAdapter(), plugin.getMinecraftVersion()).thenAccept(succeeded -> { - if (succeeded) { - switch (plugin.getSettings().notificationDisplaySlot) { - case CHAT -> plugin.getLocales().getLocale("data_update_complete") - .ifPresent(user::sendMessage); - case ACTION_BAR -> plugin.getLocales().getLocale("data_update_complete") - .ifPresent(user::sendActionBar); - case TOAST -> plugin.getLocales().getLocale("data_update_complete") - .ifPresent(locale -> user.sendToast(locale, new MineDown(""), - "minecraft:bell", "TASK")); - } - plugin.getEventCannon().fireSyncCompleteEvent(user); - } else { - plugin.getLocales().getLocale("data_update_failed") - .ifPresent(user::sendMessage); - } - }); - }); - } - }); - } - }, Arrays.stream(RedisMessageType.values()).map(RedisMessageType::getMessageChannel).toArray(String[]::new)); + subscriber.subscribe(this, Arrays.stream(RedisMessageType.values()) + .map(RedisMessageType::getMessageChannel) + .toArray(String[]::new)); + } + } + + @Override + public void onMessage(@NotNull String channel, @NotNull String message) { + final RedisMessageType messageType = RedisMessageType.getTypeFromChannel(channel).orElse(null); + if (messageType != RedisMessageType.UPDATE_USER_DATA) { + return; } + + final RedisMessage redisMessage = RedisMessage.fromJson(message); + plugin.getOnlineUser(redisMessage.targetUserUuid).ifPresent(user -> { + final UserData userData = plugin.getDataAdapter().fromBytes(redisMessage.data); + user.setData(userData, plugin.getSettings(), plugin.getEventCannon(), + plugin.getLoggingAdapter(), plugin.getMinecraftVersion()).thenAccept(succeeded -> { + if (succeeded) { + switch (plugin.getSettings().notificationDisplaySlot) { + case CHAT -> plugin.getLocales().getLocale("data_update_complete") + .ifPresent(user::sendMessage); + case ACTION_BAR -> plugin.getLocales().getLocale("data_update_complete") + .ifPresent(user::sendActionBar); + case TOAST -> plugin.getLocales().getLocale("data_update_complete") + .ifPresent(locale -> user.sendToast(locale, new MineDown(""), + "minecraft:bell", "TASK")); + } + plugin.getEventCannon().fireSyncCompleteEvent(user); + } else { + plugin.getLocales().getLocale("data_update_failed") + .ifPresent(user::sendMessage); + } + }); + }); } protected void sendMessage(@NotNull String channel, @NotNull String message) {