feat: 添加 lettuce API

This commit is contained in:
2024-01-13 01:31:49 +08:00
parent ec6d5dec65
commit aeb73f0558
11 changed files with 118 additions and 46 deletions

View File

@@ -5,7 +5,7 @@ plugins {
} }
group = "cn.hamster3.mc.plugin" group = "cn.hamster3.mc.plugin"
version = "1.1.2" version = "1.2.0"
subprojects { subprojects {
apply { apply {
@@ -24,9 +24,11 @@ subprojects {
} }
dependencies { dependencies {
compileOnly("org.jetbrains:annotations:+") // https://mvnrepository.com/artifact/org.jetbrains/annotations
compileOnly("org.projectlombok:lombok:+") compileOnly("org.jetbrains:annotations:24.1.0")
annotationProcessor("org.projectlombok:lombok:+") // https://mvnrepository.com/artifact/org.projectlombok/lombok
compileOnly("org.projectlombok:lombok:1.18.30")
annotationProcessor("org.projectlombok:lombok:1.18.30")
} }
java { java {
@@ -49,6 +51,11 @@ subprojects {
shadowJar { shadowJar {
archiveClassifier = "" archiveClassifier = ""
destinationDirectory = rootProject.buildDir 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.quartz", "cn.hamster3.mc.plugin.core.lib.org.quartz")
relocate("org.terracotta.quartz", "cn.hamster3.mc.plugin.core.lib.org.terracotta.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") relocate("net.kyori", "cn.hamster3.mc.plugin.core.lib.net.kyori")

View File

@@ -1,27 +1,35 @@
@file:Suppress("GradlePackageVersionRange", "GradlePackageUpdate")
evaluationDependsOn(":core-common") evaluationDependsOn(":core-common")
dependencies { dependencies {
implementation(project(":core-common")) { isTransitive = false } implementation(project(":core-common")) {
isTransitive = false
}
compileOnly("org.spigotmc:spigot-api:1.20.2-R0.1-SNAPSHOT") compileOnly("org.spigotmc:spigot-api:1.20.2-R0.1-SNAPSHOT")
implementation("de.tr7zw:item-nbt-api:+") implementation("de.tr7zw:item-nbt-api:2.12.3-SNAPSHOT")
compileOnly("net.milkbowl.vault:VaultAPI:+") { isTransitive = false } compileOnly("net.milkbowl.vault:VaultAPI:1.7") {
compileOnly("org.black_ixx:playerpoints:+") { isTransitive = false } 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 = "org.jetbrains")
exclude(group = "com.google.code.gson") 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(module = "adventure-api")
exclude(group = "org.jetbrains") exclude(group = "org.jetbrains")
} }
implementation("com.zaxxer:HikariCP:4.0.3") { implementation("com.zaxxer:HikariCP:4.0.3") {
exclude(group = "org.slf4j") 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 { tasks {

View File

@@ -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.page.listener.PageListener;
import cn.hamster3.mc.plugin.core.bukkit.util.CoreBukkitUtils; import cn.hamster3.mc.plugin.core.bukkit.util.CoreBukkitUtils;
import cn.hamster3.mc.plugin.core.common.api.CoreAPI; import cn.hamster3.mc.plugin.core.common.api.CoreAPI;
import lombok.Getter;
import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -25,14 +26,11 @@ import org.jetbrains.annotations.NotNull;
import java.util.logging.Logger; import java.util.logging.Logger;
public class HamsterCorePlugin extends JavaPlugin { public class HamsterCorePlugin extends JavaPlugin {
@Getter
private static HamsterCorePlugin instance; private static HamsterCorePlugin instance;
@Getter
private BukkitAudiences audienceProvider; private BukkitAudiences audienceProvider;
public static HamsterCorePlugin getInstance() {
return instance;
}
/** /**
* 在服务器主线程上执行一个任务 * 在服务器主线程上执行一个任务
* *
@@ -105,6 +103,8 @@ public class HamsterCorePlugin extends JavaPlugin {
logger.info("仓鼠核心正在关闭"); logger.info("仓鼠核心正在关闭");
CoreBukkitAPI.getInstance().getDataSource().close(); CoreBukkitAPI.getInstance().getDataSource().close();
logger.info("已关闭数据库连接池"); logger.info("已关闭数据库连接池");
CoreAPI.getInstance().getRedisClient().close();
logger.info("已关闭 Redis 连接池");
CoreAPI.getInstance().getExecutorService().shutdownNow(); CoreAPI.getInstance().getExecutorService().shutdownNow();
logger.info("已关闭线程池"); logger.info("已关闭线程池");
CoreAPI.getInstance().getScheduledService().shutdownNow(); CoreAPI.getInstance().getScheduledService().shutdownNow();
@@ -121,8 +121,4 @@ public class HamsterCorePlugin extends JavaPlugin {
long time = System.currentTimeMillis() - start; long time = System.currentTimeMillis() - start;
logger.info("仓鼠核心已关闭,总计耗时 " + time + " ms"); logger.info("仓鼠核心已关闭,总计耗时 " + time + " ms");
} }
public BukkitAudiences getAudienceProvider() {
return audienceProvider;
}
} }

View File

@@ -11,6 +11,7 @@ import com.google.gson.Gson;
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource; import com.zaxxer.hikari.HikariDataSource;
import io.lettuce.core.RedisClient;
import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
@@ -21,14 +22,21 @@ import org.jetbrains.annotations.NotNull;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public final class CoreBukkitAPI extends CoreAPI { public final class CoreBukkitAPI extends CoreAPI {
@NotNull
private final Gson gson; private final Gson gson;
@NotNull
private final Gson humanGson; private final Gson humanGson;
@NotNull
private final RedisClient redisClient;
@NotNull
private final HikariDataSource datasource; private final HikariDataSource datasource;
private CoreBukkitAPI() { private CoreBukkitAPI() {
HamsterCorePlugin plugin = HamsterCorePlugin.getInstance(); HamsterCorePlugin plugin = HamsterCorePlugin.getInstance();
FileConfiguration config = plugin.getConfig(); FileConfiguration config = plugin.getConfig();
redisClient = RedisClient.create(config.getString("redis-url"));
ConfigurationSection datasourceConfig = config.getConfigurationSection("datasource"); ConfigurationSection datasourceConfig = config.getConfigurationSection("datasource");
if (datasourceConfig == null) { if (datasourceConfig == null) {
throw new IllegalArgumentException("配置文件中未找到 datasource 节点"); throw new IllegalArgumentException("配置文件中未找到 datasource 节点");
@@ -88,6 +96,11 @@ public final class CoreBukkitAPI extends CoreAPI {
return datasource; return datasource;
} }
@Override
public @NotNull RedisClient getRedisClient() {
return redisClient;
}
@Override @Override
public @NotNull Gson getGson() { public @NotNull Gson getGson() {
return gson; return gson;

View File

@@ -35,3 +35,13 @@ datasource:
# 验证连接存活的超时时间 # 验证连接存活的超时时间
# 单位:毫秒 # 单位:毫秒
validation-timeout: 5000 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"

View File

@@ -1,23 +1,30 @@
@file:Suppress("GradlePackageVersionRange", "GradlePackageUpdate") @file:Suppress("VulnerableLibrariesLocal")
evaluationDependsOn(":core-common") evaluationDependsOn(":core-common")
dependencies { dependencies {
implementation(project(":core-common")) { isTransitive = false } implementation(project(":core-common")) {
compileOnly("net.md-5:bungeecord-api:+") 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 = "org.jetbrains")
exclude(group = "com.google.code.gson") 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(module = "adventure-api")
exclude(group = "org.jetbrains") exclude(group = "org.jetbrains")
} }
implementation("com.zaxxer:HikariCP:4.0.3") { implementation("com.zaxxer:HikariCP:4.0.3") {
exclude(group = "org.slf4j") 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 { tasks {

View File

@@ -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.bungee.api.CoreBungeeAPI;
import cn.hamster3.mc.plugin.core.common.api.CoreAPI; import cn.hamster3.mc.plugin.core.common.api.CoreAPI;
import lombok.Getter;
import net.kyori.adventure.platform.bungeecord.BungeeAudiences; import net.kyori.adventure.platform.bungeecord.BungeeAudiences;
import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.api.plugin.Plugin;
import java.util.logging.Logger; import java.util.logging.Logger;
public class HamsterCorePlugin extends Plugin { public class HamsterCorePlugin extends Plugin {
@Getter
private static HamsterCorePlugin instance; private static HamsterCorePlugin instance;
@Getter
private BungeeAudiences audienceProvider; private BungeeAudiences audienceProvider;
public static HamsterCorePlugin getInstance() {
return instance;
}
@Override @Override
public void onLoad() { public void onLoad() {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
@@ -45,6 +44,8 @@ public class HamsterCorePlugin extends Plugin {
logger.info("仓鼠核心正在关闭"); logger.info("仓鼠核心正在关闭");
CoreBungeeAPI.getInstance().getDataSource().close(); CoreBungeeAPI.getInstance().getDataSource().close();
logger.info("已关闭数据库连接池"); logger.info("已关闭数据库连接池");
CoreAPI.getInstance().getRedisClient().close();
logger.info("已关闭 Redis 连接池");
CoreAPI.getInstance().getExecutorService().shutdownNow(); CoreAPI.getInstance().getExecutorService().shutdownNow();
logger.info("已关闭线程池"); logger.info("已关闭线程池");
CoreAPI.getInstance().getScheduledService().shutdownNow(); CoreAPI.getInstance().getScheduledService().shutdownNow();
@@ -53,7 +54,4 @@ public class HamsterCorePlugin extends Plugin {
logger.info("仓鼠核心已关闭,总计耗时 " + time + " ms"); logger.info("仓鼠核心已关闭,总计耗时 " + time + " ms");
} }
public BungeeAudiences getAudienceProvider() {
return audienceProvider;
}
} }

View File

@@ -10,21 +10,29 @@ import com.google.gson.Gson;
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource; 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.kyori.adventure.text.Component;
import net.md_5.bungee.config.Configuration; import net.md_5.bungee.config.Configuration;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public final class CoreBungeeAPI extends CoreAPI { public final class CoreBungeeAPI extends CoreAPI {
@NotNull
private final Gson gson; private final Gson gson;
@NotNull
private final Gson humanGson; private final Gson humanGson;
@NotNull
private final RedisClient redisClient;
@NotNull
private final HikariDataSource datasource; private final HikariDataSource datasource;
private CoreBungeeAPI() { private CoreBungeeAPI() {
HamsterCorePlugin plugin = HamsterCorePlugin.getInstance(); HamsterCorePlugin plugin = HamsterCorePlugin.getInstance();
Configuration config = CoreBungeeCordUtils.getPluginConfig(plugin); Configuration config = CoreBungeeCordUtils.getPluginConfig(plugin);
redisClient = RedisClient.create(config.getString("redis-url"));
Configuration datasourceConfig = config.getSection("datasource"); Configuration datasourceConfig = config.getSection("datasource");
if (datasourceConfig == null) { if (datasourceConfig == null) {
throw new IllegalArgumentException("配置文件中未找到 datasource 节点"); throw new IllegalArgumentException("配置文件中未找到 datasource 节点");
@@ -71,7 +79,7 @@ public final class CoreBungeeAPI extends CoreAPI {
} }
@Override @Override
public @NotNull AudienceProvider getAudienceProvider() { public @NotNull BungeeAudiences getAudienceProvider() {
return HamsterCorePlugin.getInstance().getAudienceProvider(); return HamsterCorePlugin.getInstance().getAudienceProvider();
} }
@@ -80,6 +88,11 @@ public final class CoreBungeeAPI extends CoreAPI {
return datasource; return datasource;
} }
@Override
public @NotNull RedisClient getRedisClient() {
return redisClient;
}
@Override @Override
public @NotNull Gson getGson() { public @NotNull Gson getGson() {
return gson; return gson;

View File

@@ -31,3 +31,13 @@ datasource:
# 验证连接存活的超时时间 # 验证连接存活的超时时间
# 单位:毫秒 # 单位:毫秒
validation-timeout: 5000 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"

View File

@@ -1,20 +1,23 @@
@file:Suppress("VulnerableLibrariesLocal", "GradlePackageUpdate", "GradlePackageVersionRange") @file:Suppress("VulnerableLibrariesLocal")
plugins {
id("java-library")
}
dependencies { dependencies {
compileOnly("com.google.code.gson:gson:2.8.0") 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") 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 = "org.jetbrains")
exclude(group = "com.google.code.gson") 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 { tasks {

View File

@@ -2,6 +2,7 @@ package cn.hamster3.mc.plugin.core.common.api;
import cn.hamster3.mc.plugin.core.common.thread.NamedThreadFactory; import cn.hamster3.mc.plugin.core.common.thread.NamedThreadFactory;
import com.google.gson.Gson; import com.google.gson.Gson;
import io.lettuce.core.RedisClient;
import lombok.Getter; import lombok.Getter;
import net.kyori.adventure.platform.AudienceProvider; import net.kyori.adventure.platform.AudienceProvider;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -55,6 +56,12 @@ public abstract class CoreAPI {
return getDataSource().getConnection(); return getDataSource().getConnection();
} }
/**
* @return lettuce redis 客户端
*/
@NotNull
public abstract RedisClient getRedisClient();
/** /**
* @return GSON 工具 * @return GSON 工具
*/ */