diff --git a/build.gradle.kts b/build.gradle.kts index 0eb33a0..b29cebc 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } group = "cn.hamster3.mc.plugin" -version = "1.2.3" +version = "1.2.4" subprojects { apply { diff --git a/core-bukkit/build.gradle.kts b/core-bukkit/build.gradle.kts index f77dc5c..d3b41d9 100644 --- a/core-bukkit/build.gradle.kts +++ b/core-bukkit/build.gradle.kts @@ -4,7 +4,7 @@ dependencies { implementation(project(":core-common")) { isTransitive = false } - compileOnly("org.spigotmc:spigot-api:1.20.2-R0.1-SNAPSHOT") + compileOnly("org.spigotmc:spigot-api:1.20.4-R0.1-SNAPSHOT") implementation("de.tr7zw:item-nbt-api:2.12.3-SNAPSHOT") compileOnly("net.milkbowl.vault:VaultAPI:1.7") { 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 3681a41..a8c2591 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 @@ -23,6 +23,7 @@ import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitTask; import org.jetbrains.annotations.NotNull; +import java.io.File; import java.util.logging.Logger; @SuppressWarnings("CallToPrintStackTrace") @@ -56,17 +57,19 @@ public class HamsterCorePlugin extends JavaPlugin { @Override public void onLoad() { + instance = this; long start = System.currentTimeMillis(); Logger logger = getLogger(); logger.info("仓鼠核心正在初始化"); logger.info("Minecraft 版本: " + MinecraftVersion.getMCVersion()); - logger.info("nms 版本: " + MinecraftVersion.getNMSVersion()); - instance = this; - saveDefaultConfig(); - reloadConfig(); - logger.info("已读取配置文件"); + logger.info("NMS 版本: " + MinecraftVersion.getNMSVersion()); try { - CoreBukkitAPI.init(); + File dataFolder = getDataFolder(); + if (dataFolder.mkdir()) { + logger.info("已生成插件存档文件夹"); + } + File file = new File(dataFolder, "config.yml"); + CoreBukkitAPI.init(file); logger.info("已初始化 CoreAPI"); } catch (Exception e) { logger.warning("初始化 CoreAPI 出错"); @@ -108,7 +111,7 @@ public class HamsterCorePlugin extends JavaPlugin { Logger logger = getLogger(); CoreAPI.getInstance().getRedisClient().close(); logger.info("已关闭 Redis 连接池"); - CoreBukkitAPI.getInstance().getDataSource().close(); + CoreAPI.getInstance().getHikariDataSource().close(); logger.info("已关闭数据库连接池"); CoreAPI.getInstance().getExecutorService().shutdownNow(); logger.info("已关闭 ExecutorService 线程池"); 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 8702fd1..8bcc78e 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 @@ -5,35 +5,32 @@ import cn.hamster3.mc.plugin.core.bukkit.impl.ItemStackAdapter; import cn.hamster3.mc.plugin.core.bukkit.impl.PotionEffectAdapter; import cn.hamster3.mc.plugin.core.bukkit.util.MinecraftVersion; import cn.hamster3.mc.plugin.core.common.api.CoreAPI; +import cn.hamster3.mc.plugin.core.common.config.ConfigSection; +import cn.hamster3.mc.plugin.core.common.config.YamlConfig; import cn.hamster3.mc.plugin.core.common.data.DisplayMessage; import cn.hamster3.mc.plugin.core.common.impl.ComponentTypeAdapter; import cn.hamster3.mc.plugin.core.common.impl.MessageTypeAdapter; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.HikariDataSource; -import de.tr7zw.changeme.nbtapi.utils.nmsmappings.ClassWrapper; -import io.lettuce.core.RedisClient; import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.text.Component; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffect; import org.jetbrains.annotations.NotNull; +import java.io.File; +import java.io.IOException; +import java.util.logging.Logger; + @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() { + private CoreBukkitAPI(@NotNull ConfigSection config) { + super(config); gson = new GsonBuilder() .registerTypeAdapter(Component.class, ComponentTypeAdapter.INSTANCE) .registerTypeAdapter(DisplayMessage.class, MessageTypeAdapter.INSTANCE) @@ -45,67 +42,28 @@ public final class CoreBukkitAPI extends CoreAPI { .registerTypeAdapter(Component.class, ComponentTypeAdapter.INSTANCE) .registerTypeAdapter(DisplayMessage.class, MessageTypeAdapter.INSTANCE) .registerTypeAdapter(ItemStack.class, ItemStackAdapter.INSTANCE) - .registerTypeAdapter(ClassWrapper.CRAFT_ITEMSTACK.getClazz(), ItemStackAdapter.INSTANCE) + .registerTypeAdapter(MinecraftVersion.getCraftBukkitClassSilent("inventory.CraftItemStack"), ItemStackAdapter.INSTANCE) .registerTypeAdapter(PotionEffect.class, PotionEffectAdapter.INSTANCE) .serializeNulls() .setPrettyPrinting() .create(); - - HamsterCorePlugin plugin = HamsterCorePlugin.getInstance(); - FileConfiguration config = plugin.getConfig(); - - HamsterCorePlugin.getInstance().getLogger().info("正在创建 redis 客户端"); - redisClient = RedisClient.create(config.getString("redis-url")); - HamsterCorePlugin.getInstance().getLogger().info("redis 客户端创建完成"); - - ConfigurationSection datasourceConfig = config.getConfigurationSection("datasource"); - if (datasourceConfig == null) { - throw new IllegalArgumentException("配置文件中未找到 datasource 节点"); - } - HamsterCorePlugin.getInstance().getLogger().info("正在创建数据库连接池"); - HikariConfig hikariConfig = new HikariConfig(); - hikariConfig.setDriverClassName(datasourceConfig.getString("driver")); - hikariConfig.setJdbcUrl(datasourceConfig.getString("url")); - hikariConfig.setUsername(datasourceConfig.getString("username")); - hikariConfig.setPassword(datasourceConfig.getString("password")); - hikariConfig.setMaximumPoolSize(datasourceConfig.getInt("maximum-pool-size", 3)); - hikariConfig.setMinimumIdle(datasourceConfig.getInt("minimum-idle", 1)); - long keepAliveTime = datasourceConfig.getLong("keep-alive-time", 0); - if (keepAliveTime > 5000) { - hikariConfig.setKeepaliveTime(keepAliveTime); - } - hikariConfig.setIdleTimeout(datasourceConfig.getLong("idle-timeout", 10 * 60 * 1000)); - hikariConfig.setMaxLifetime(datasourceConfig.getLong("max-lifetime", 30 * 60 * 1000)); - hikariConfig.setValidationTimeout(datasourceConfig.getLong("validation-timeout", 5000)); - hikariConfig.setPoolName("HamsterCore-Pool"); - datasource = new HikariDataSource(hikariConfig); - HamsterCorePlugin.getInstance().getLogger().info("数据库连接池创建完成"); } public static CoreBukkitAPI getInstance() { return (CoreBukkitAPI) instance; } - public static void init() { + public static void init(@NotNull File configFile) throws IOException { if (instance != null) { return; } - instance = new CoreBukkitAPI(); + YamlConfig config = YamlConfig.load(configFile); + instance = new CoreBukkitAPI(config); } @Override - public @NotNull BukkitAudiences getAudienceProvider() { - return HamsterCorePlugin.getInstance().getAudienceProvider(); - } - - @Override - public @NotNull HikariDataSource getDataSource() { - return datasource; - } - - @Override - public @NotNull RedisClient getRedisClient() { - return redisClient; + public @NotNull Logger getLogger() { + return HamsterCorePlugin.getInstance().getLogger(); } @Override @@ -117,4 +75,9 @@ public final class CoreBukkitAPI extends CoreAPI { public @NotNull Gson getHumanGson() { return humanGson; } + + @Override + public @NotNull BukkitAudiences getAudienceProvider() { + return HamsterCorePlugin.getInstance().getAudienceProvider(); + } } diff --git a/core-bukkit/src/main/java/cn/hamster3/mc/plugin/core/bukkit/constant/CoreMessage.java b/core-bukkit/src/main/java/cn/hamster3/mc/plugin/core/bukkit/constant/CoreMessage.java index 719a746..8337548 100644 --- a/core-bukkit/src/main/java/cn/hamster3/mc/plugin/core/bukkit/constant/CoreMessage.java +++ b/core-bukkit/src/main/java/cn/hamster3/mc/plugin/core/bukkit/constant/CoreMessage.java @@ -74,7 +74,7 @@ public enum CoreMessage { public static void init(@NotNull Plugin plugin) { File dataFolder = plugin.getDataFolder(); if (dataFolder.mkdirs()) { - plugin.getLogger().info("已生成插件存档文件夹 " + dataFolder.getName()); + plugin.getLogger().info("已生成插件存档文件夹"); } File file = new File(dataFolder, "messages.yml"); YamlConfiguration config = new YamlConfiguration(); diff --git a/core-bukkit/src/main/java/cn/hamster3/mc/plugin/core/bukkit/util/CoreBukkitUtils.java b/core-bukkit/src/main/java/cn/hamster3/mc/plugin/core/bukkit/util/CoreBukkitUtils.java index 25d428d..9bcf789 100644 --- a/core-bukkit/src/main/java/cn/hamster3/mc/plugin/core/bukkit/util/CoreBukkitUtils.java +++ b/core-bukkit/src/main/java/cn/hamster3/mc/plugin/core/bukkit/util/CoreBukkitUtils.java @@ -307,7 +307,7 @@ public final class CoreBukkitUtils { File file = new File(plugin.getDataFolder(), filename); File parentFile = file.getParentFile(); if (parentFile.mkdirs()) { - plugin.getLogger().info("已生成插件存档文件夹 " + parentFile.getName()); + plugin.getLogger().info("已生成插件存档文件夹"); } if (!file.exists()) { plugin.getLogger().info("生成配置文件: " + filename); @@ -367,6 +367,7 @@ public final class CoreBukkitUtils { } @NotNull + @SuppressWarnings("deprecation") public static JsonObject serializePotionEffect(@NotNull PotionEffect effect) { JsonObject object = new JsonObject(); object.addProperty("type", effect.getType().getName()); @@ -376,6 +377,7 @@ public final class CoreBukkitUtils { } @NotNull + @SuppressWarnings("deprecation") public static PotionEffect deserializePotionEffect(@NotNull JsonObject object) { //noinspection ConstantConditions return new PotionEffect( diff --git a/core-bukkit/src/main/java/cn/hamster3/mc/plugin/core/bukkit/util/MinecraftVersion.java b/core-bukkit/src/main/java/cn/hamster3/mc/plugin/core/bukkit/util/MinecraftVersion.java index bc2bcda..1369664 100644 --- a/core-bukkit/src/main/java/cn/hamster3/mc/plugin/core/bukkit/util/MinecraftVersion.java +++ b/core-bukkit/src/main/java/cn/hamster3/mc/plugin/core/bukkit/util/MinecraftVersion.java @@ -22,7 +22,7 @@ public class MinecraftVersion { } /** - * 与当前服务端运行的 mc 版本号对比 + * 与当前服务端运行的 Minecraft 版本号对比 *
* 1: 当前版本高于输入版本号 *
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 f88f554..87f30ee 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
@@ -6,6 +6,9 @@ import lombok.Getter;
import net.kyori.adventure.platform.bungeecord.BungeeAudiences;
import net.md_5.bungee.api.plugin.Plugin;
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.StandardCopyOption;
import java.util.logging.Logger;
@SuppressWarnings("CallToPrintStackTrace")
@@ -17,12 +20,24 @@ public class HamsterCorePlugin extends Plugin {
@Override
public void onLoad() {
- long start = System.currentTimeMillis();
instance = this;
+ long start = System.currentTimeMillis();
Logger logger = getLogger();
logger.info("仓鼠核心正在初始化");
try {
- CoreBungeeAPI.init();
+ File dataFolder = getDataFolder();
+ if (dataFolder.mkdir()) {
+ logger.info("已生成插件存档文件夹");
+ }
+ File configFile = new File(dataFolder, "config.yml");
+ if (!configFile.exists()) {
+ Files.copy(
+ getResourceAsStream("config.yml"),
+ configFile.toPath(),
+ StandardCopyOption.REPLACE_EXISTING
+ );
+ }
+ CoreBungeeAPI.init(configFile);
logger.info("已初始化 CoreAPI");
} catch (Exception e) {
logger.warning("初始化 CoreAPI 出错");
@@ -49,7 +64,7 @@ public class HamsterCorePlugin extends Plugin {
Logger logger = getLogger();
CoreAPI.getInstance().getRedisClient().close();
logger.info("已关闭 Redis 连接池");
- CoreBungeeAPI.getInstance().getDataSource().close();
+ CoreAPI.getInstance().getHikariDataSource().close();
logger.info("已关闭数据库连接池");
CoreAPI.getInstance().getExecutorService().shutdownNow();
logger.info("已关闭 ExecutorService 线程池");
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 07b45b2..cb8c4da 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
@@ -1,33 +1,31 @@
package cn.hamster3.mc.plugin.core.bungee.api;
import cn.hamster3.mc.plugin.core.bungee.HamsterCorePlugin;
-import cn.hamster3.mc.plugin.core.bungee.util.CoreBungeeCordUtils;
import cn.hamster3.mc.plugin.core.common.api.CoreAPI;
+import cn.hamster3.mc.plugin.core.common.config.ConfigSection;
+import cn.hamster3.mc.plugin.core.common.config.YamlConfig;
import cn.hamster3.mc.plugin.core.common.data.DisplayMessage;
import cn.hamster3.mc.plugin.core.common.impl.ComponentTypeAdapter;
import cn.hamster3.mc.plugin.core.common.impl.MessageTypeAdapter;
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.bungeecord.BungeeAudiences;
import net.kyori.adventure.text.Component;
-import net.md_5.bungee.config.Configuration;
import org.jetbrains.annotations.NotNull;
+import java.io.File;
+import java.io.IOException;
+import java.util.logging.Logger;
+
@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() {
+ private CoreBungeeAPI(@NotNull ConfigSection config) {
+ super(config);
gson = new GsonBuilder()
.registerTypeAdapter(Component.class, ComponentTypeAdapter.INSTANCE)
.registerTypeAdapter(DisplayMessage.class, MessageTypeAdapter.INSTANCE)
@@ -38,62 +36,23 @@ public final class CoreBungeeAPI extends CoreAPI {
.serializeNulls()
.setPrettyPrinting()
.create();
-
- HamsterCorePlugin plugin = HamsterCorePlugin.getInstance();
- Configuration config = CoreBungeeCordUtils.getPluginConfig(plugin);
-
- HamsterCorePlugin.getInstance().getLogger().info("正在创建 redis 客户端");
- redisClient = RedisClient.create(config.getString("redis-url"));
- HamsterCorePlugin.getInstance().getLogger().info("redis 客户端创建完成");
-
- Configuration datasourceConfig = config.getSection("datasource");
- if (datasourceConfig == null) {
- throw new IllegalArgumentException("配置文件中未找到 datasource 节点");
- }
- HamsterCorePlugin.getInstance().getLogger().info("正在创建数据库连接池");
- HikariConfig hikariConfig = new HikariConfig();
- hikariConfig.setDriverClassName(datasourceConfig.getString("driver"));
- hikariConfig.setJdbcUrl(datasourceConfig.getString("url"));
- hikariConfig.setUsername(datasourceConfig.getString("username"));
- hikariConfig.setPassword(datasourceConfig.getString("password"));
- hikariConfig.setMaximumPoolSize(datasourceConfig.getInt("maximum-pool-size", 3));
- hikariConfig.setMinimumIdle(datasourceConfig.getInt("minimum-idle", 1));
- long keepAliveTime = datasourceConfig.getLong("keep-alive-time", 0);
- if (keepAliveTime > 5000) {
- hikariConfig.setKeepaliveTime(keepAliveTime);
- }
- hikariConfig.setIdleTimeout(datasourceConfig.getLong("idle-timeout", 10 * 60 * 1000));
- hikariConfig.setMaxLifetime(datasourceConfig.getLong("max-lifetime", 30 * 60 * 1000));
- hikariConfig.setValidationTimeout(datasourceConfig.getLong("validation-timeout", 5000));
- hikariConfig.setPoolName("HamsterCore-Pool");
- datasource = new HikariDataSource(hikariConfig);
- HamsterCorePlugin.getInstance().getLogger().info("数据库连接池创建完成");
}
public static CoreBungeeAPI getInstance() {
return (CoreBungeeAPI) instance;
}
- public static void init() {
+ public static void init(@NotNull File configFile) throws IOException {
if (instance != null) {
return;
}
- instance = new CoreBungeeAPI();
+ YamlConfig config = YamlConfig.load(configFile);
+ instance = new CoreBungeeAPI(config);
}
@Override
- public @NotNull BungeeAudiences getAudienceProvider() {
- return HamsterCorePlugin.getInstance().getAudienceProvider();
- }
-
- @Override
- public @NotNull HikariDataSource getDataSource() {
- return datasource;
- }
-
- @Override
- public @NotNull RedisClient getRedisClient() {
- return redisClient;
+ public @NotNull Logger getLogger() {
+ return HamsterCorePlugin.getInstance().getLogger();
}
@Override
@@ -105,4 +64,9 @@ public final class CoreBungeeAPI extends CoreAPI {
public @NotNull Gson getHumanGson() {
return humanGson;
}
+
+ @Override
+ public @NotNull BungeeAudiences getAudienceProvider() {
+ return HamsterCorePlugin.getInstance().getAudienceProvider();
+ }
}
diff --git a/core-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/CoreBungeeCordUtils.java b/core-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/CoreBungeeCordUtils.java
index 83c666e..5526be1 100644
--- a/core-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/CoreBungeeCordUtils.java
+++ b/core-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/CoreBungeeCordUtils.java
@@ -8,8 +8,8 @@ import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.IOException;
-import java.io.InputStream;
import java.nio.file.Files;
+import java.nio.file.StandardCopyOption;
@SuppressWarnings("unused")
public final class CoreBungeeCordUtils {
@@ -32,7 +32,7 @@ public final class CoreBungeeCordUtils {
public static Configuration getPluginConfig(@NotNull Plugin plugin) {
File configFile = new File(plugin.getDataFolder(), "config.yml");
if (!configFile.exists()) {
- return saveDefaultConfig(plugin);
+ return saveConfig(plugin);
}
try {
return ConfigurationProvider.getProvider(YamlConfiguration.class).load(configFile);
@@ -45,7 +45,7 @@ public final class CoreBungeeCordUtils {
public static Configuration getPluginConfig(@NotNull Plugin plugin, @NotNull String filename) {
File configFile = new File(plugin.getDataFolder(), filename);
if (!configFile.exists()) {
- return saveDefaultConfig(plugin, filename);
+ return saveConfig(plugin, filename);
}
try {
return ConfigurationProvider.getProvider(YamlConfiguration.class).load(configFile);
@@ -55,29 +55,22 @@ public final class CoreBungeeCordUtils {
}
@NotNull
- public static Configuration saveDefaultConfig(@NotNull Plugin plugin) {
- if (plugin.getDataFolder().mkdir()) {
- plugin.getLogger().info("已生成插件存档文件夹");
- }
- File configFile = new File(plugin.getDataFolder(), "config.yml");
- try {
- InputStream in = plugin.getResourceAsStream("config.yml");
- Files.copy(in, configFile.toPath());
- return ConfigurationProvider.getProvider(YamlConfiguration.class).load(configFile);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
+ public static Configuration saveConfig(@NotNull Plugin plugin) {
+ return saveConfig(plugin, "config.yml");
}
@NotNull
- public static Configuration saveDefaultConfig(@NotNull Plugin plugin, @NotNull String filename) {
+ public static Configuration saveConfig(@NotNull Plugin plugin, @NotNull String filename) {
if (plugin.getDataFolder().mkdir()) {
plugin.getLogger().info("已生成插件存档文件夹");
}
File configFile = new File(plugin.getDataFolder(), filename);
try {
- InputStream in = plugin.getResourceAsStream(filename);
- Files.copy(in, configFile.toPath());
+ Files.copy(
+ plugin.getResourceAsStream(filename),
+ configFile.toPath(),
+ StandardCopyOption.REPLACE_EXISTING
+ );
return ConfigurationProvider.getProvider(YamlConfiguration.class).load(configFile);
} catch (Exception e) {
throw new RuntimeException(e);
diff --git a/core-common/build.gradle.kts b/core-common/build.gradle.kts
index 9445066..9e9a824 100644
--- a/core-common/build.gradle.kts
+++ b/core-common/build.gradle.kts
@@ -2,6 +2,8 @@
dependencies {
compileOnly("com.google.code.gson:gson:2.8.0")
+ // https://mvnrepository.com/artifact/org.yaml/snakeyaml
+ compileOnly("org.yaml:snakeyaml:1.19")
implementation("net.kyori:adventure-platform-api:4.3.2") {
exclude(group = "org.jetbrains")
@@ -11,6 +13,9 @@ dependencies {
exclude(group = "com.google.code.gson")
}
+
+ // https://mvnrepository.com/artifact/com.zaxxer/HikariCP
+ compileOnly("com.zaxxer:HikariCP:5.1.0") { isTransitive = false }
// https://mvnrepository.com/artifact/io.lettuce/lettuce-core
implementation("io.lettuce:lettuce-core:6.3.1.RELEASE") {
exclude(group = "io.netty")
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 191e319..f318522 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
@@ -1,7 +1,10 @@
package cn.hamster3.mc.plugin.core.common.api;
+import cn.hamster3.mc.plugin.core.common.config.ConfigSection;
import cn.hamster3.mc.plugin.core.common.thread.NamedThreadFactory;
import com.google.gson.Gson;
+import com.zaxxer.hikari.HikariConfig;
+import com.zaxxer.hikari.HikariDataSource;
import io.lettuce.core.RedisClient;
import lombok.Getter;
import net.kyori.adventure.platform.AudienceProvider;
@@ -13,11 +16,24 @@ import java.sql.SQLException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
+import java.util.logging.Logger;
@SuppressWarnings("unused")
public abstract class CoreAPI {
@Getter
protected static CoreAPI instance;
+ /**
+ * lettuce redis 客户端
+ */
+ @Getter
+ @NotNull
+ private final RedisClient redisClient;
+ /**
+ * HamsterCore 公用数据库连接池
+ */
+ @Getter
+ @NotNull
+ private final HikariDataSource hikariDataSource;
/**
* 异步线程池
*/
@@ -29,13 +45,37 @@ public abstract class CoreAPI {
@Getter
private final ScheduledExecutorService scheduledService;
- public CoreAPI() {
+ public CoreAPI(@NotNull ConfigSection config) {
executorService = Executors.newCachedThreadPool(new NamedThreadFactory("HamsterCore - Executor"));
scheduledService = Executors.newScheduledThreadPool(1, new NamedThreadFactory("HamsterCore - Scheduler"));
- }
- @NotNull
- public abstract AudienceProvider getAudienceProvider();
+ getLogger().info("正在创建 redis 客户端");
+ redisClient = RedisClient.create(config.getString("redis-url"));
+ getLogger().info("redis 客户端创建完成");
+
+ ConfigSection datasourceConfig = config.getSection("datasource");
+ if (datasourceConfig == null) {
+ throw new IllegalArgumentException("配置文件中未找到 datasource 节点");
+ }
+ getLogger().info("正在创建数据库连接池");
+ HikariConfig hikariConfig = new HikariConfig();
+ hikariConfig.setDriverClassName(datasourceConfig.getString("driver"));
+ hikariConfig.setJdbcUrl(datasourceConfig.getString("url"));
+ hikariConfig.setUsername(datasourceConfig.getString("username"));
+ hikariConfig.setPassword(datasourceConfig.getString("password"));
+ hikariConfig.setMaximumPoolSize(datasourceConfig.getInt("maximum-pool-size", 3));
+ hikariConfig.setMinimumIdle(datasourceConfig.getInt("minimum-idle", 1));
+ long keepAliveTime = datasourceConfig.getLong("keep-alive-time", 0);
+ if (keepAliveTime > 5000) {
+ hikariConfig.setKeepaliveTime(keepAliveTime);
+ }
+ hikariConfig.setIdleTimeout(datasourceConfig.getLong("idle-timeout", 10 * 60 * 1000));
+ hikariConfig.setMaxLifetime(datasourceConfig.getLong("max-lifetime", 30 * 60 * 1000));
+ hikariConfig.setValidationTimeout(datasourceConfig.getLong("validation-timeout", 5000));
+ hikariConfig.setPoolName("HamsterCore-Pool");
+ hikariDataSource = new HikariDataSource(hikariConfig);
+ getLogger().info("数据库连接池创建完成");
+ }
/**
* 获取 HamsterCore 公用数据库连接池
@@ -43,7 +83,9 @@ public abstract class CoreAPI {
* @return 公用数据库连接池
*/
@NotNull
- public abstract DataSource getDataSource();
+ public DataSource getDataSource() {
+ return hikariDataSource;
+ }
/**
* 获取 HamsterCore 公用数据库连接
@@ -56,11 +98,8 @@ public abstract class CoreAPI {
return getDataSource().getConnection();
}
- /**
- * @return lettuce redis 客户端
- */
@NotNull
- public abstract RedisClient getRedisClient();
+ public abstract Logger getLogger();
/**
* @return GSON 工具
@@ -73,4 +112,7 @@ public abstract class CoreAPI {
*/
@NotNull
public abstract Gson getHumanGson();
+
+ @NotNull
+ public abstract AudienceProvider getAudienceProvider();
}
diff --git a/core-common/src/main/java/cn/hamster3/mc/plugin/core/common/config/ConfigSection.java b/core-common/src/main/java/cn/hamster3/mc/plugin/core/common/config/ConfigSection.java
new file mode 100644
index 0000000..4b6bb40
--- /dev/null
+++ b/core-common/src/main/java/cn/hamster3/mc/plugin/core/common/config/ConfigSection.java
@@ -0,0 +1,170 @@
+package cn.hamster3.mc.plugin.core.common.config;
+
+import lombok.Getter;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@SuppressWarnings({"unused", "unchecked"})
+@Getter
+public class ConfigSection {
+ @NotNull
+ protected final Map
+ * 如果要在异步线程使用,请自行新建一个 Calculator 实例
*
* @param expression 要计算的表达式例如:5+12*(3+5)/7
* @return 计算结果