feat: 使SQL不再硬编码
This commit is contained in:
parent
3f3196e5ac
commit
9cb6bcef50
|
|
@ -9,6 +9,7 @@ import top.r3944realms.ltdmanager.napcat.request.group.GetGroupIgnoredNotifiesRe
|
||||||
import top.r3944realms.ltdmanager.napcat.request.group.GetGroupSystemMsgRequest
|
import top.r3944realms.ltdmanager.napcat.request.group.GetGroupSystemMsgRequest
|
||||||
import top.r3944realms.ltdmanager.napcat.request.group.SetGroupAddRequestRequest
|
import top.r3944realms.ltdmanager.napcat.request.group.SetGroupAddRequestRequest
|
||||||
import top.r3944realms.ltdmanager.utils.LoggerUtil
|
import top.r3944realms.ltdmanager.utils.LoggerUtil
|
||||||
|
import top.r3944realms.ltdmanager.utils.SqlTemplate
|
||||||
|
|
||||||
class GroupRequestHandlerModule(
|
class GroupRequestHandlerModule(
|
||||||
moduleName: String,
|
moduleName: String,
|
||||||
|
|
@ -132,13 +133,14 @@ class GroupRequestHandlerModule(
|
||||||
LoggerUtil.logger.debug("[$name] 事件处理完成")
|
LoggerUtil.logger.debug("[$name] 事件处理完成")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val queryWhitelistRecord = SqlTemplate.fromFile("whitlist/query_whitlist_record.sql")
|
||||||
|
|
||||||
private fun queryPlayerStatus(actor: Long): Int {
|
private fun queryPlayerStatus(actor: Long): Int {
|
||||||
LoggerUtil.logger.debug("[$name] 查询玩家状态: qq=$actor")
|
LoggerUtil.logger.debug("[$name] 查询玩家状态: qq=$actor")
|
||||||
try {
|
try {
|
||||||
getConnection().use { conn ->
|
getConnection().use { conn ->
|
||||||
val stmt = conn.prepareStatement(
|
val sql = queryWhitelistRecord.bind("placeholder" to "?")
|
||||||
"SELECT status FROM minecraft_manager_ltd_9.players WHERE qq=?"
|
val stmt = conn.prepareStatement(sql)
|
||||||
)
|
|
||||||
stmt.setLong(1, actor)
|
stmt.setLong(1, actor)
|
||||||
val rs = stmt.executeQuery()
|
val rs = stmt.executeQuery()
|
||||||
val status = if (rs.next()) rs.getInt("status") else 0
|
val status = if (rs.next()) rs.getInt("status") else 0
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ import top.r3944realms.ltdmanager.napcat.data.msghistory.MsgHistorySpecificMsg
|
||||||
import top.r3944realms.ltdmanager.napcat.request.other.SendGroupMsgRequest
|
import top.r3944realms.ltdmanager.napcat.request.other.SendGroupMsgRequest
|
||||||
import top.r3944realms.ltdmanager.utils.HtmlTemplateUtil
|
import top.r3944realms.ltdmanager.utils.HtmlTemplateUtil
|
||||||
import top.r3944realms.ltdmanager.utils.LoggerUtil
|
import top.r3944realms.ltdmanager.utils.LoggerUtil
|
||||||
|
import top.r3944realms.ltdmanager.utils.SqlTemplate
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.sql.Timestamp
|
import java.sql.Timestamp
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
@ -128,6 +129,11 @@ class InvitationCodesModule(
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
private val qualificationSql = SqlTemplate.fromFile("invitation/query_qualification.sql")
|
||||||
|
private val tokenInfoSql = SqlTemplate.fromFile("invitation/query_token_info.sql")
|
||||||
|
private val codeIdsSql = SqlTemplate.fromFile("invitation/query_code_ids.sql")
|
||||||
|
private val upsertAscriptionSql = SqlTemplate.fromFile("invitation/upsert_ascription.sql")
|
||||||
|
|
||||||
private val fileLock = ReentrantLock()
|
private val fileLock = ReentrantLock()
|
||||||
|
|
||||||
private var lastTriggerMapState = loadState()
|
private var lastTriggerMapState = loadState()
|
||||||
|
|
@ -205,13 +211,8 @@ class InvitationCodesModule(
|
||||||
if (msgs.isEmpty()) return
|
if (msgs.isEmpty()) return
|
||||||
|
|
||||||
val qqIds = msgs.map { it.userId }
|
val qqIds = msgs.map { it.userId }
|
||||||
val placeholders = java.lang.String.join(",", Collections.nCopies(qqIds.size, "?"))
|
val placeholders = qqIds.joinToString(",") { "?" }
|
||||||
// 修正SQL语句的表名引用
|
val sql = qualificationSql.bind("placeholders" to placeholders)
|
||||||
val sql = """
|
|
||||||
SELECT q.player_id, q.effective, q.is_used, q.qq, q.status
|
|
||||||
FROM ltd_manager_bot.qualified_user_info q
|
|
||||||
WHERE q.qq IN ($placeholders)
|
|
||||||
""".trimIndent()
|
|
||||||
try {
|
try {
|
||||||
getConnection().use { conn ->
|
getConnection().use { conn ->
|
||||||
conn.prepareStatement(sql).use { pstmt ->
|
conn.prepareStatement(sql).use { pstmt ->
|
||||||
|
|
@ -291,13 +292,8 @@ class InvitationCodesModule(
|
||||||
if (list.isEmpty()) return
|
if (list.isEmpty()) return
|
||||||
|
|
||||||
val whiteListIds = list.map { it.first }
|
val whiteListIds = list.map { it.first }
|
||||||
val placeholders = java.lang.String.join(",", Collections.nCopies(whiteListIds.size, "?"))
|
val placeholders = whiteListIds.joinToString(",") { "?" }
|
||||||
|
val sql = tokenInfoSql.bind("placeholders" to placeholders)
|
||||||
val sql = """
|
|
||||||
SELECT q.player_id, q.player_name, q.token, q.expires_at
|
|
||||||
FROM ltd_manager_bot.qualified_user_info q
|
|
||||||
WHERE q.player_id IN ($placeholders)
|
|
||||||
""".trimIndent()
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
getConnection().use { conn ->
|
getConnection().use { conn ->
|
||||||
|
|
@ -507,11 +503,7 @@ class InvitationCodesModule(
|
||||||
if (invitationCodes.isEmpty()) return emptyMap()
|
if (invitationCodes.isEmpty()) return emptyMap()
|
||||||
|
|
||||||
val placeholders = invitationCodes.joinToString(",") { "?" }
|
val placeholders = invitationCodes.joinToString(",") { "?" }
|
||||||
val sql = """
|
val sql = codeIdsSql.bind("placeholders" to placeholders)
|
||||||
SELECT i.id, i.code
|
|
||||||
FROM blessingskin.invitation_codes i
|
|
||||||
WHERE i.code IN ($placeholders)
|
|
||||||
""".trimIndent()
|
|
||||||
|
|
||||||
return getConnection().use { conn ->
|
return getConnection().use { conn ->
|
||||||
conn.prepareStatement(sql).use { pstmt ->
|
conn.prepareStatement(sql).use { pstmt ->
|
||||||
|
|
@ -543,12 +535,8 @@ class InvitationCodesModule(
|
||||||
|
|
||||||
if (playerIds.isEmpty()) return
|
if (playerIds.isEmpty()) return
|
||||||
|
|
||||||
val placeholders = playerIds.joinToString(",") { "(?, ?)" }
|
val values = playerIds.joinToString(",") { "(?, ?)" }
|
||||||
val sql = """
|
val sql = upsertAscriptionSql.bind("values" to values)
|
||||||
INSERT INTO ltd_manager_bot.invitation_code_ascription (id, token_id)
|
|
||||||
VALUES $placeholders
|
|
||||||
ON DUPLICATE KEY UPDATE token_id = VALUES(token_id)
|
|
||||||
""".trimIndent()
|
|
||||||
|
|
||||||
getConnection().use { conn ->
|
getConnection().use { conn ->
|
||||||
conn.prepareStatement(sql).use { pstmt ->
|
conn.prepareStatement(sql).use { pstmt ->
|
||||||
|
|
|
||||||
|
|
@ -56,11 +56,12 @@ class GiteaWebhookModule(
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun startServer() {
|
private fun startServer() {
|
||||||
var executor = Executors.newFixedThreadPool(2)
|
val threadPool = Executors.newFixedThreadPool(2)
|
||||||
server = HttpServer.create(InetSocketAddress(port), 0).apply {
|
server = HttpServer.create(InetSocketAddress(port), 0).apply {
|
||||||
createContext(webhookPath) { exchange ->
|
createContext(webhookPath) { exchange ->
|
||||||
scope?.launch { handleRequest(exchange) }
|
scope?.launch { handleRequest(exchange) }
|
||||||
}
|
}
|
||||||
|
executor = threadPool
|
||||||
start()
|
start()
|
||||||
}
|
}
|
||||||
LoggerUtil.logger.info("[$name] Webhook服务器已启动在端口 $port$webhookPath")
|
LoggerUtil.logger.info("[$name] Webhook服务器已启动在端口 $port$webhookPath")
|
||||||
|
|
@ -155,7 +156,8 @@ class GiteaWebhookModule(
|
||||||
private fun formatPush(p: PushPayload): String {
|
private fun formatPush(p: PushPayload): String {
|
||||||
val repo = p.repository.fullName
|
val repo = p.repository.fullName
|
||||||
val branch = p.ref.removePrefix("refs/heads/").removePrefix("refs/tags/")
|
val branch = p.ref.removePrefix("refs/heads/").removePrefix("refs/tags/")
|
||||||
val pusher = p.pusher?.login?.ifEmpty { p.pusher?.fullName } ?: p.sender.login.ifEmpty { p.sender.fullName }
|
val pusherUser = p.pusher
|
||||||
|
val pusher = pusherUser?.login?.ifEmpty { pusherUser.fullName } ?: p.sender.login.ifEmpty { p.sender.fullName }
|
||||||
val count = p.totalCommits
|
val count = p.totalCommits
|
||||||
|
|
||||||
val sb = StringBuilder()
|
val sb = StringBuilder()
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
package top.r3944realms.ltdmanager.utils
|
||||||
|
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
class SqlTemplate private constructor(private val template: String) {
|
||||||
|
|
||||||
|
fun bind(vararg pairs: Pair<String, String>): String {
|
||||||
|
var result = template
|
||||||
|
for ((key, value) in pairs) {
|
||||||
|
result = result.replace("\${$key}", value)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private val cache = mutableMapOf<String, SqlTemplate>()
|
||||||
|
|
||||||
|
private val baseDir: String by lazy {
|
||||||
|
val configDir = File("config/sql")
|
||||||
|
if (!configDir.exists()) configDir.mkdirs()
|
||||||
|
configDir.absolutePath
|
||||||
|
}
|
||||||
|
|
||||||
|
fun fromFile(path: String): SqlTemplate {
|
||||||
|
return cache.getOrPut(path) {
|
||||||
|
val file = File(baseDir, path)
|
||||||
|
require(file.exists()) {
|
||||||
|
"SQL template not found: ${file.absolutePath}"
|
||||||
|
}
|
||||||
|
SqlTemplate(file.readText().trimIndent())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun clearCache() = cache.clear()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
package top.r394realms.ltdmanagertest.util
|
||||||
|
|
||||||
|
import top.r3944realms.ltdmanager.utils.SqlTemplate
|
||||||
|
|
||||||
|
fun main() {
|
||||||
|
val sqlTemplateTest = SqlTemplateTest()
|
||||||
|
sqlTemplateTest.main()
|
||||||
|
}
|
||||||
|
|
||||||
|
class SqlTemplateTest {
|
||||||
|
val testSql = SqlTemplate.fromFile("test/test.sql")
|
||||||
|
private fun test01(): String {
|
||||||
|
return testSql.bind("placeholder" to "?")
|
||||||
|
}
|
||||||
|
fun main() {
|
||||||
|
println(test01())
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user