From 2ac27d29e7454d947f86114e4624edfa0157f598 Mon Sep 17 00:00:00 2001 From: RTAkland Date: Thu, 17 Oct 2024 12:51:20 +0800 Subject: [PATCH] feat: support mysql and postgresql database --- build.gradle.kts | 3 +++ gradle/libs.versions.toml | 5 +++++ src/main/kotlin/cn/rtast/fancybot/Const.kt | 10 +++++++++- .../kotlin/cn/rtast/fancybot/db/ActionTable.kt | 10 +++++----- .../kotlin/cn/rtast/fancybot/entity/Config.kt | 13 ++++++++++++- .../cn/rtast/fancybot/enums/DatabaseType.kt | 12 ++++++++++++ .../kotlin/cn/rtast/fancybot/util/Database.kt | 15 ++++++++++++++- .../cn/rtast/fancybot/util/file/ConfigManager.kt | 1 + src/main/resources/config.json | 8 ++++++++ 9 files changed, 69 insertions(+), 8 deletions(-) create mode 100644 src/main/kotlin/cn/rtast/fancybot/enums/DatabaseType.kt diff --git a/build.gradle.kts b/build.gradle.kts index cbf80af..c918abd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -36,7 +36,10 @@ dependencies { implementation(libs.okhttp) implementation(libs.exposed.core) implementation(libs.exposed.jdbc) + implementation(libs.exposed.dao) implementation(libs.sqlite.jdbc) + implementation(libs.mysql.jdbc) + implementation(libs.postgressql.jdbc) implementation(libs.motd.pinger) implementation(libs.animated.gif.lib) implementation(libs.simple.java.mail) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7fb0bb4..824f7e8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,6 +15,8 @@ logbackClassicVersion = "1.5.8" sl4jVersion = "2.0.16" awsS3SDKVersion = "2.28.18" rconLibVersion = "1.1.0" +mysqlConnectorVersion = "9.1.0" +postgresqlVersion = "42.7.4" [libraries] ronebot = { group = "cn.rtast", name = "ROneBot", version.ref = "ronebotVersion" } @@ -22,7 +24,10 @@ motd-pinger = { group = "cn.rtast", name = "MotdPinger", version.ref = "motdPing okhttp = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttpVersion" } exposed-core = { group = "org.jetbrains.exposed", name = "exposed-core", version.ref = "exposedVersion" } exposed-jdbc = { group = "org.jetbrains.exposed", name = "exposed-jdbc", version.ref = "exposedVersion" } +exposed-dao = { group = "org.jetbrains.exposed", name = "exposed-dao", version.ref = "exposedVersion" } sqlite-jdbc = { group = "org.xerial", name = "sqlite-jdbc", version.ref = "sqliteJDBCVersion" } +mysql-jdbc = { group = "com.mysql", name = "mysql-connector-j", version.ref = "mysqlConnectorVersion" } +postgressql-jdbc = { group = "org.postgresql", name = "postgresql", version.ref = "postgresqlVersion" } animated-gif-lib = { group = "com.madgag", name = "animated-gif-lib", version.ref = "animatedGifLibVersion" } simple-java-mail = { group = "org.simplejavamail", name = "simple-java-mail", version.ref = "simpleJavaMailVersion" } jsoup = { group = "org.jsoup", name = "jsoup", version.ref = "jsoupVersion" } diff --git a/src/main/kotlin/cn/rtast/fancybot/Const.kt b/src/main/kotlin/cn/rtast/fancybot/Const.kt index 2df9bf6..6d8e035 100644 --- a/src/main/kotlin/cn/rtast/fancybot/Const.kt +++ b/src/main/kotlin/cn/rtast/fancybot/Const.kt @@ -23,11 +23,11 @@ import cn.rtast.fancybot.commands.misc.JrrpCommand import cn.rtast.fancybot.commands.niuzi.NiuziRedeemCommand import cn.rtast.fancybot.commands.misc.ShortLinkCommand import cn.rtast.fancybot.entity.Config +import cn.rtast.fancybot.enums.DatabaseType import cn.rtast.fancybot.enums.ImageBedType import cn.rtast.fancybot.enums.ImageType import cn.rtast.fancybot.enums.WSType import cn.rtast.fancybot.items.* -import cn.rtast.fancybot.util.Logger import cn.rtast.fancybot.util.file.BlackListManager import cn.rtast.fancybot.util.file.ConfigManager import cn.rtast.fancybot.util.file.NiuziBankManager @@ -50,6 +50,14 @@ const val API_RTAST_URL = "https://api.rtast.cn" const val PBI_API_URL = "https://pbi.us.kg" val DEFAULT_CONFIG = Config( + database = Config.Database( + DatabaseType.SQLite, + "127.0.0.1", + 3306, + "root", + "114514", + "fancybot" + ), ncmAPI = "https://ncm.rtast.cn", wsAddress = "ws://127.0.0.1", wsType = WSType.Client, diff --git a/src/main/kotlin/cn/rtast/fancybot/db/ActionTable.kt b/src/main/kotlin/cn/rtast/fancybot/db/ActionTable.kt index da6e0c8..b3d7a26 100644 --- a/src/main/kotlin/cn/rtast/fancybot/db/ActionTable.kt +++ b/src/main/kotlin/cn/rtast/fancybot/db/ActionTable.kt @@ -10,10 +10,10 @@ package cn.rtast.fancybot.db import org.jetbrains.exposed.sql.Table object ActionTable : Table("action") { - val id = integer("id").autoIncrement().nullable() - val action = varchar("action", 255).nullable() - val timestamp = long("timestamp").nullable() - val triggerId = long("trigger_id").nullable() - val result = varchar("result", 255) + val id = integer("id").autoIncrement() + val action = varchar("action", 255) + val timestamp = long("timestamp") + val triggerId = long("trigger_id") + val result = text("result") override val primaryKey = PrimaryKey(id) } \ No newline at end of file diff --git a/src/main/kotlin/cn/rtast/fancybot/entity/Config.kt b/src/main/kotlin/cn/rtast/fancybot/entity/Config.kt index b33879a..a5fd68d 100644 --- a/src/main/kotlin/cn/rtast/fancybot/entity/Config.kt +++ b/src/main/kotlin/cn/rtast/fancybot/entity/Config.kt @@ -7,11 +7,13 @@ package cn.rtast.fancybot.entity +import cn.rtast.fancybot.enums.DatabaseType import cn.rtast.fancybot.enums.ImageBedType import cn.rtast.fancybot.enums.ImageType import cn.rtast.fancybot.enums.WSType data class Config( + val database: Database, val ncmAPI: String, val wsType: WSType, val wsAddress: String, @@ -49,4 +51,13 @@ data class Config( val apiRtastKey: String, val azureAppClientId: String, val youtubeDataApiKey: String, -) \ No newline at end of file +) { + data class Database( + val type: DatabaseType, + val host: String, + val port: Int, + val user: String, + val password: String, + val database: String, + ) +} \ No newline at end of file diff --git a/src/main/kotlin/cn/rtast/fancybot/enums/DatabaseType.kt b/src/main/kotlin/cn/rtast/fancybot/enums/DatabaseType.kt new file mode 100644 index 0000000..a065f00 --- /dev/null +++ b/src/main/kotlin/cn/rtast/fancybot/enums/DatabaseType.kt @@ -0,0 +1,12 @@ +/* + * Copyright © 2024 RTAkland + * Author: RTAkland + * Date: 2024/10/17 + */ + + +package cn.rtast.fancybot.enums + +enum class DatabaseType { + SQLite, MySQL, PostgreSQL +} \ No newline at end of file diff --git a/src/main/kotlin/cn/rtast/fancybot/util/Database.kt b/src/main/kotlin/cn/rtast/fancybot/util/Database.kt index cef7867..3c55bd1 100644 --- a/src/main/kotlin/cn/rtast/fancybot/util/Database.kt +++ b/src/main/kotlin/cn/rtast/fancybot/util/Database.kt @@ -8,6 +8,7 @@ package cn.rtast.fancybot.util import cn.rtast.fancybot.ROOT_PATH +import cn.rtast.fancybot.configManager import cn.rtast.fancybot.db.ActionTable import cn.rtast.fancybot.db.BlackListTable import cn.rtast.fancybot.db.JrrpTable @@ -15,13 +16,25 @@ import cn.rtast.fancybot.db.MinecraftAccessTokenTable import cn.rtast.fancybot.db.NiuziBankTable import cn.rtast.fancybot.db.NiuziTable import cn.rtast.fancybot.db.RCONTable +import cn.rtast.fancybot.enums.DatabaseType import kotlinx.coroutines.Dispatchers import org.jetbrains.exposed.sql.Database import org.jetbrains.exposed.sql.SchemaUtils import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction suspend fun initDatabase() { - Database.connect("jdbc:sqlite:file:$ROOT_PATH/data.sqlite", "org.sqlite.JDBC") + val host = configManager.dbConfig.host + val port = configManager.dbConfig.port + val user = configManager.dbConfig.user + val password = configManager.dbConfig.password + val database = configManager.dbConfig.database + if (configManager.dbConfig.type == DatabaseType.MySQL) { + Database.connect("jdbc:mysql://${host}:${port}/$database", "com.mysql.cj.jdbc.Driver", user, password) + } else if (configManager.dbConfig.type == DatabaseType.PostgreSQL) { + Database.connect("jdbc:postgresql://$host:$port/$database", driver = "org.postgresql.Driver", user, password) + } else { + Database.connect("jdbc:sqlite:file:$ROOT_PATH/data.sqlite", "org.sqlite.JDBC") + } suspendedTransaction { SchemaUtils.createMissingTablesAndColumns(JrrpTable) SchemaUtils.createMissingTablesAndColumns(NiuziBankTable) diff --git a/src/main/kotlin/cn/rtast/fancybot/util/file/ConfigManager.kt b/src/main/kotlin/cn/rtast/fancybot/util/file/ConfigManager.kt index 406d69b..c24b3f9 100644 --- a/src/main/kotlin/cn/rtast/fancybot/util/file/ConfigManager.kt +++ b/src/main/kotlin/cn/rtast/fancybot/util/file/ConfigManager.kt @@ -49,4 +49,5 @@ class ConfigManager : JsonFileHandler("config.json") { val apiRtastKey = config.apiRtastKey val azureAppClientId = config.azureAppClientId val youtubeDataApiKey = config.youtubeDataApiKey + val dbConfig = config.database } \ No newline at end of file diff --git a/src/main/resources/config.json b/src/main/resources/config.json index 7a40fa2..11657b2 100644 --- a/src/main/resources/config.json +++ b/src/main/resources/config.json @@ -1,4 +1,12 @@ { + "database": { + "type": "SQLite", + "host": "127.0.0.1", + "port": 3306, + "user": "root", + "password": "114514", + "database": "fancybot" + }, "ncmAPI": "https://ncm.rtast.cn", "wsType": "Client", "wsAddress": "ws://127.0.0.1",