diff --git a/build.gradle.kts b/build.gradle.kts index 57dcea2..4e3cc76 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } group = "cn.hamster3.mc.plugin" -version = "1.1.2" +version = "1.2.0" subprojects { apply { @@ -24,9 +24,11 @@ subprojects { } dependencies { - compileOnly("org.jetbrains:annotations:+") - compileOnly("org.projectlombok:lombok:+") - annotationProcessor("org.projectlombok:lombok:+") + // https://mvnrepository.com/artifact/org.jetbrains/annotations + compileOnly("org.jetbrains:annotations:24.1.0") + // https://mvnrepository.com/artifact/org.projectlombok/lombok + compileOnly("org.projectlombok:lombok:1.18.30") + annotationProcessor("org.projectlombok:lombok:1.18.30") } java { @@ -49,6 +51,11 @@ subprojects { shadowJar { archiveClassifier = "" destinationDirectory = rootProject.buildDir + relocate("io.netty", "cn.hamster3.mc.plugin.core.lib.io.netty") + relocate("io.lettuce", "cn.hamster3.mc.plugin.core.lib.io.lettuce") + relocate("reactor", "cn.hamster3.mc.plugin.core.lib.reactor") + relocate("org.reactivestreams", "cn.hamster3.mc.plugin.core.lib.org.reactivestreams") + relocate("org.quartz", "cn.hamster3.mc.plugin.core.lib.org.quartz") relocate("org.terracotta.quartz", "cn.hamster3.mc.plugin.core.lib.org.terracotta.quartz") relocate("net.kyori", "cn.hamster3.mc.plugin.core.lib.net.kyori") diff --git a/core-bukkit/build.gradle.kts b/core-bukkit/build.gradle.kts index 552e21d..0919ccd 100644 --- a/core-bukkit/build.gradle.kts +++ b/core-bukkit/build.gradle.kts @@ -1,27 +1,35 @@ -@file:Suppress("GradlePackageVersionRange", "GradlePackageUpdate") - evaluationDependsOn(":core-common") dependencies { - implementation(project(":core-common")) { isTransitive = false } + implementation(project(":core-common")) { + isTransitive = false + } compileOnly("org.spigotmc:spigot-api:1.20.2-R0.1-SNAPSHOT") - implementation("de.tr7zw:item-nbt-api:+") - compileOnly("net.milkbowl.vault:VaultAPI:+") { isTransitive = false } - compileOnly("org.black_ixx:playerpoints:+") { isTransitive = false } + implementation("de.tr7zw:item-nbt-api:2.12.3-SNAPSHOT") + compileOnly("net.milkbowl.vault:VaultAPI:1.7") { + isTransitive = false + } + compileOnly("org.black_ixx:playerpoints:3.2.6") { + isTransitive = false + } - implementation("net.kyori:adventure-platform-bukkit:4+") { + implementation("net.kyori:adventure-platform-bukkit:4.3.2") { exclude(group = "org.jetbrains") exclude(group = "com.google.code.gson") } - implementation("net.kyori:adventure-text-minimessage:4+") { + implementation("net.kyori:adventure-text-minimessage:4.15.0") { exclude(module = "adventure-api") exclude(group = "org.jetbrains") } implementation("com.zaxxer:HikariCP:4.0.3") { exclude(group = "org.slf4j") } - implementation("org.quartz-scheduler:quartz:2.3.2") { isTransitive = false } + // https://mvnrepository.com/artifact/io.lettuce/lettuce-core + implementation("io.lettuce:lettuce-core:6.3.1.RELEASE") + implementation("org.quartz-scheduler:quartz:2.3.2") { + isTransitive = false + } } tasks { diff --git a/core-bukkit/src/main/java/cn/hamster3/mc/plugin/core/bukkit/HamsterCorePlugin.java b/core-bukkit/src/main/java/cn/hamster3/mc/plugin/core/bukkit/HamsterCorePlugin.java index 7f461e1..682c843 100644 --- a/core-bukkit/src/main/java/cn/hamster3/mc/plugin/core/bukkit/HamsterCorePlugin.java +++ b/core-bukkit/src/main/java/cn/hamster3/mc/plugin/core/bukkit/HamsterCorePlugin.java @@ -13,6 +13,7 @@ import cn.hamster3.mc.plugin.core.bukkit.page.handler.PageHandler; import cn.hamster3.mc.plugin.core.bukkit.page.listener.PageListener; import cn.hamster3.mc.plugin.core.bukkit.util.CoreBukkitUtils; import cn.hamster3.mc.plugin.core.common.api.CoreAPI; +import lombok.Getter; import net.kyori.adventure.platform.bukkit.BukkitAudiences; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -25,14 +26,11 @@ import org.jetbrains.annotations.NotNull; import java.util.logging.Logger; public class HamsterCorePlugin extends JavaPlugin { + @Getter private static HamsterCorePlugin instance; - + @Getter private BukkitAudiences audienceProvider; - public static HamsterCorePlugin getInstance() { - return instance; - } - /** * 在服务器主线程上执行一个任务 * @@ -105,6 +103,8 @@ public class HamsterCorePlugin extends JavaPlugin { logger.info("仓鼠核心正在关闭"); CoreBukkitAPI.getInstance().getDataSource().close(); logger.info("已关闭数据库连接池"); + CoreAPI.getInstance().getRedisClient().close(); + logger.info("已关闭 Redis 连接池"); CoreAPI.getInstance().getExecutorService().shutdownNow(); logger.info("已关闭线程池"); CoreAPI.getInstance().getScheduledService().shutdownNow(); @@ -121,8 +121,4 @@ public class HamsterCorePlugin extends JavaPlugin { long time = System.currentTimeMillis() - start; logger.info("仓鼠核心已关闭,总计耗时 " + time + " ms"); } - - public BukkitAudiences getAudienceProvider() { - return audienceProvider; - } } diff --git a/core-bukkit/src/main/java/cn/hamster3/mc/plugin/core/bukkit/api/CoreBukkitAPI.java b/core-bukkit/src/main/java/cn/hamster3/mc/plugin/core/bukkit/api/CoreBukkitAPI.java index d673c39..7cc1048 100644 --- a/core-bukkit/src/main/java/cn/hamster3/mc/plugin/core/bukkit/api/CoreBukkitAPI.java +++ b/core-bukkit/src/main/java/cn/hamster3/mc/plugin/core/bukkit/api/CoreBukkitAPI.java @@ -11,6 +11,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; +import io.lettuce.core.RedisClient; import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.text.Component; import org.bukkit.configuration.ConfigurationSection; @@ -21,14 +22,21 @@ import org.jetbrains.annotations.NotNull; @SuppressWarnings("unused") public final class CoreBukkitAPI extends CoreAPI { + @NotNull private final Gson gson; + @NotNull private final Gson humanGson; + @NotNull + private final RedisClient redisClient; + @NotNull private final HikariDataSource datasource; private CoreBukkitAPI() { HamsterCorePlugin plugin = HamsterCorePlugin.getInstance(); FileConfiguration config = plugin.getConfig(); + redisClient = RedisClient.create(config.getString("redis-url")); + ConfigurationSection datasourceConfig = config.getConfigurationSection("datasource"); if (datasourceConfig == null) { throw new IllegalArgumentException("配置文件中未找到 datasource 节点"); @@ -88,6 +96,11 @@ public final class CoreBukkitAPI extends CoreAPI { return datasource; } + @Override + public @NotNull RedisClient getRedisClient() { + return redisClient; + } + @Override public @NotNull Gson getGson() { return gson; diff --git a/core-bukkit/src/main/resources/config.yml b/core-bukkit/src/main/resources/config.yml index 605a9a0..de6198c 100644 --- a/core-bukkit/src/main/resources/config.yml +++ b/core-bukkit/src/main/resources/config.yml @@ -35,3 +35,13 @@ datasource: # 验证连接存活的超时时间 # 单位:毫秒 validation-timeout: 5000 + +# redis 连接配置,连接格式如下: +# redis://用户名:密码@主机名:端口/数据库索引?参数名=参数值&参数名=参数值 +# 若没有设置 redis 用户名,则可以省略: +# redis://密码@localhost:6379?clientName=HamsterBall +# 若没有设置 redis 用户名和密码,则可以省略: +# redis://localhost:6379?clientName=HamsterBall +# 若不设置数据库,则默认使用 0 +# 详细信息:https://github.com/lettuce-io/lettuce-core/wiki/Redis-URI-and-connection-details +redis-url: "redis://localhost:6379?clientName=HamsterCore" diff --git a/core-bungee/build.gradle.kts b/core-bungee/build.gradle.kts index 17e5cc7..e667fed 100644 --- a/core-bungee/build.gradle.kts +++ b/core-bungee/build.gradle.kts @@ -1,23 +1,30 @@ -@file:Suppress("GradlePackageVersionRange", "GradlePackageUpdate") +@file:Suppress("VulnerableLibrariesLocal") evaluationDependsOn(":core-common") dependencies { - implementation(project(":core-common")) { isTransitive = false } - compileOnly("net.md-5:bungeecord-api:+") + implementation(project(":core-common")) { + isTransitive = false + } + compileOnly("net.md-5:bungeecord-api:1.20-R0.1") - implementation("net.kyori:adventure-platform-bungeecord:4+") { + implementation("net.kyori:adventure-platform-bungeecord:4.3.2") { exclude(group = "org.jetbrains") exclude(group = "com.google.code.gson") } - implementation("net.kyori:adventure-text-minimessage:4+") { + implementation("net.kyori:adventure-text-minimessage:4.15.0") { exclude(module = "adventure-api") exclude(group = "org.jetbrains") } + implementation("com.zaxxer:HikariCP:4.0.3") { exclude(group = "org.slf4j") } - implementation("org.quartz-scheduler:quartz:2.3.2") { isTransitive = false } + // https://mvnrepository.com/artifact/io.lettuce/lettuce-core + implementation("io.lettuce:lettuce-core:6.3.1.RELEASE") + implementation("org.quartz-scheduler:quartz:2.3.2") { + isTransitive = false + } } tasks { diff --git a/core-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterCorePlugin.java b/core-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterCorePlugin.java index d1a15f7..cd142ae 100644 --- a/core-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterCorePlugin.java +++ b/core-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterCorePlugin.java @@ -2,19 +2,18 @@ package cn.hamster3.mc.plugin.core.bungee; import cn.hamster3.mc.plugin.core.bungee.api.CoreBungeeAPI; import cn.hamster3.mc.plugin.core.common.api.CoreAPI; +import lombok.Getter; import net.kyori.adventure.platform.bungeecord.BungeeAudiences; import net.md_5.bungee.api.plugin.Plugin; import java.util.logging.Logger; public class HamsterCorePlugin extends Plugin { + @Getter private static HamsterCorePlugin instance; + @Getter private BungeeAudiences audienceProvider; - public static HamsterCorePlugin getInstance() { - return instance; - } - @Override public void onLoad() { long start = System.currentTimeMillis(); @@ -45,6 +44,8 @@ public class HamsterCorePlugin extends Plugin { logger.info("仓鼠核心正在关闭"); CoreBungeeAPI.getInstance().getDataSource().close(); logger.info("已关闭数据库连接池"); + CoreAPI.getInstance().getRedisClient().close(); + logger.info("已关闭 Redis 连接池"); CoreAPI.getInstance().getExecutorService().shutdownNow(); logger.info("已关闭线程池"); CoreAPI.getInstance().getScheduledService().shutdownNow(); @@ -53,7 +54,4 @@ public class HamsterCorePlugin extends Plugin { logger.info("仓鼠核心已关闭,总计耗时 " + time + " ms"); } - public BungeeAudiences getAudienceProvider() { - return audienceProvider; - } } diff --git a/core-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/CoreBungeeAPI.java b/core-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/CoreBungeeAPI.java index adc1d81..6b5798c 100644 --- a/core-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/CoreBungeeAPI.java +++ b/core-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/CoreBungeeAPI.java @@ -10,21 +10,29 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; -import net.kyori.adventure.platform.AudienceProvider; +import io.lettuce.core.RedisClient; +import net.kyori.adventure.platform.bungeecord.BungeeAudiences; import net.kyori.adventure.text.Component; import net.md_5.bungee.config.Configuration; import org.jetbrains.annotations.NotNull; @SuppressWarnings("unused") public final class CoreBungeeAPI extends CoreAPI { + @NotNull private final Gson gson; + @NotNull private final Gson humanGson; + @NotNull + private final RedisClient redisClient; + @NotNull private final HikariDataSource datasource; private CoreBungeeAPI() { HamsterCorePlugin plugin = HamsterCorePlugin.getInstance(); - Configuration config = CoreBungeeCordUtils.getPluginConfig(plugin); + + redisClient = RedisClient.create(config.getString("redis-url")); + Configuration datasourceConfig = config.getSection("datasource"); if (datasourceConfig == null) { throw new IllegalArgumentException("配置文件中未找到 datasource 节点"); @@ -71,7 +79,7 @@ public final class CoreBungeeAPI extends CoreAPI { } @Override - public @NotNull AudienceProvider getAudienceProvider() { + public @NotNull BungeeAudiences getAudienceProvider() { return HamsterCorePlugin.getInstance().getAudienceProvider(); } @@ -80,6 +88,11 @@ public final class CoreBungeeAPI extends CoreAPI { return datasource; } + @Override + public @NotNull RedisClient getRedisClient() { + return redisClient; + } + @Override public @NotNull Gson getGson() { return gson; diff --git a/core-bungee/src/main/resources/config.yml b/core-bungee/src/main/resources/config.yml index 14ce02e..f5b10df 100644 --- a/core-bungee/src/main/resources/config.yml +++ b/core-bungee/src/main/resources/config.yml @@ -31,3 +31,13 @@ datasource: # 验证连接存活的超时时间 # 单位:毫秒 validation-timeout: 5000 + +# redis 连接配置,连接格式如下: +# redis://用户名:密码@主机名:端口/数据库索引?参数名=参数值&参数名=参数值 +# 若没有设置 redis 用户名,则可以省略: +# redis://密码@localhost:6379?clientName=HamsterBall +# 若没有设置 redis 用户名和密码,则可以省略: +# redis://localhost:6379?clientName=HamsterBall +# 若不设置数据库,则默认使用 0 +# 详细信息:https://github.com/lettuce-io/lettuce-core/wiki/Redis-URI-and-connection-details +redis-url: "redis://localhost:6379?clientName=HamsterCore" diff --git a/core-common/build.gradle.kts b/core-common/build.gradle.kts index 98cd631..9445066 100644 --- a/core-common/build.gradle.kts +++ b/core-common/build.gradle.kts @@ -1,20 +1,23 @@ -@file:Suppress("VulnerableLibrariesLocal", "GradlePackageUpdate", "GradlePackageVersionRange") - -plugins { - id("java-library") -} +@file:Suppress("VulnerableLibrariesLocal") dependencies { compileOnly("com.google.code.gson:gson:2.8.0") - api("net.kyori:adventure-platform-api:4+") { + implementation("net.kyori:adventure-platform-api:4.3.2") { exclude(group = "org.jetbrains") } - api("net.kyori:adventure-text-serializer-gson:4.13+") { + implementation("net.kyori:adventure-text-serializer-gson:4.13.1") { exclude(group = "org.jetbrains") exclude(group = "com.google.code.gson") } - implementation("org.quartz-scheduler:quartz:2.3.2") { isTransitive = false } + + // https://mvnrepository.com/artifact/io.lettuce/lettuce-core + implementation("io.lettuce:lettuce-core:6.3.1.RELEASE") { + exclude(group = "io.netty") + } + implementation("org.quartz-scheduler:quartz:2.3.2") { + isTransitive = false + } } tasks { diff --git a/core-common/src/main/java/cn/hamster3/mc/plugin/core/common/api/CoreAPI.java b/core-common/src/main/java/cn/hamster3/mc/plugin/core/common/api/CoreAPI.java index 379f4fe..422b996 100644 --- a/core-common/src/main/java/cn/hamster3/mc/plugin/core/common/api/CoreAPI.java +++ b/core-common/src/main/java/cn/hamster3/mc/plugin/core/common/api/CoreAPI.java @@ -2,6 +2,7 @@ package cn.hamster3.mc.plugin.core.common.api; import cn.hamster3.mc.plugin.core.common.thread.NamedThreadFactory; import com.google.gson.Gson; +import io.lettuce.core.RedisClient; import lombok.Getter; import net.kyori.adventure.platform.AudienceProvider; import org.jetbrains.annotations.NotNull; @@ -55,6 +56,12 @@ public abstract class CoreAPI { return getDataSource().getConnection(); } + /** + * @return lettuce redis 客户端 + */ + @NotNull + public abstract RedisClient getRedisClient(); + /** * @return GSON 工具 */