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.SetGroupAddRequestRequest
|
||||
import top.r3944realms.ltdmanager.utils.LoggerUtil
|
||||
import top.r3944realms.ltdmanager.utils.SqlTemplate
|
||||
|
||||
class GroupRequestHandlerModule(
|
||||
moduleName: String,
|
||||
|
|
@ -132,13 +133,14 @@ class GroupRequestHandlerModule(
|
|||
LoggerUtil.logger.debug("[$name] 事件处理完成")
|
||||
}
|
||||
|
||||
private val queryWhitelistRecord = SqlTemplate.fromFile("whitlist/query_whitlist_record.sql")
|
||||
|
||||
private fun queryPlayerStatus(actor: Long): Int {
|
||||
LoggerUtil.logger.debug("[$name] 查询玩家状态: qq=$actor")
|
||||
try {
|
||||
getConnection().use { conn ->
|
||||
val stmt = conn.prepareStatement(
|
||||
"SELECT status FROM minecraft_manager_ltd_9.players WHERE qq=?"
|
||||
)
|
||||
val sql = queryWhitelistRecord.bind("placeholder" to "?")
|
||||
val stmt = conn.prepareStatement(sql)
|
||||
stmt.setLong(1, actor)
|
||||
val rs = stmt.executeQuery()
|
||||
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.utils.HtmlTemplateUtil
|
||||
import top.r3944realms.ltdmanager.utils.LoggerUtil
|
||||
import top.r3944realms.ltdmanager.utils.SqlTemplate
|
||||
import java.io.File
|
||||
import java.sql.Timestamp
|
||||
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 var lastTriggerMapState = loadState()
|
||||
|
|
@ -205,13 +211,8 @@ class InvitationCodesModule(
|
|||
if (msgs.isEmpty()) return
|
||||
|
||||
val qqIds = msgs.map { it.userId }
|
||||
val placeholders = java.lang.String.join(",", Collections.nCopies(qqIds.size, "?"))
|
||||
// 修正SQL语句的表名引用
|
||||
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()
|
||||
val placeholders = qqIds.joinToString(",") { "?" }
|
||||
val sql = qualificationSql.bind("placeholders" to placeholders)
|
||||
try {
|
||||
getConnection().use { conn ->
|
||||
conn.prepareStatement(sql).use { pstmt ->
|
||||
|
|
@ -291,13 +292,8 @@ class InvitationCodesModule(
|
|||
if (list.isEmpty()) return
|
||||
|
||||
val whiteListIds = list.map { it.first }
|
||||
val placeholders = java.lang.String.join(",", Collections.nCopies(whiteListIds.size, "?"))
|
||||
|
||||
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()
|
||||
val placeholders = whiteListIds.joinToString(",") { "?" }
|
||||
val sql = tokenInfoSql.bind("placeholders" to placeholders)
|
||||
|
||||
try {
|
||||
getConnection().use { conn ->
|
||||
|
|
@ -507,11 +503,7 @@ class InvitationCodesModule(
|
|||
if (invitationCodes.isEmpty()) return emptyMap()
|
||||
|
||||
val placeholders = invitationCodes.joinToString(",") { "?" }
|
||||
val sql = """
|
||||
SELECT i.id, i.code
|
||||
FROM blessingskin.invitation_codes i
|
||||
WHERE i.code IN ($placeholders)
|
||||
""".trimIndent()
|
||||
val sql = codeIdsSql.bind("placeholders" to placeholders)
|
||||
|
||||
return getConnection().use { conn ->
|
||||
conn.prepareStatement(sql).use { pstmt ->
|
||||
|
|
@ -543,12 +535,8 @@ class InvitationCodesModule(
|
|||
|
||||
if (playerIds.isEmpty()) return
|
||||
|
||||
val placeholders = playerIds.joinToString(",") { "(?, ?)" }
|
||||
val sql = """
|
||||
INSERT INTO ltd_manager_bot.invitation_code_ascription (id, token_id)
|
||||
VALUES $placeholders
|
||||
ON DUPLICATE KEY UPDATE token_id = VALUES(token_id)
|
||||
""".trimIndent()
|
||||
val values = playerIds.joinToString(",") { "(?, ?)" }
|
||||
val sql = upsertAscriptionSql.bind("values" to values)
|
||||
|
||||
getConnection().use { conn ->
|
||||
conn.prepareStatement(sql).use { pstmt ->
|
||||
|
|
|
|||
|
|
@ -56,11 +56,12 @@ class GiteaWebhookModule(
|
|||
}
|
||||
|
||||
private fun startServer() {
|
||||
var executor = Executors.newFixedThreadPool(2)
|
||||
val threadPool = Executors.newFixedThreadPool(2)
|
||||
server = HttpServer.create(InetSocketAddress(port), 0).apply {
|
||||
createContext(webhookPath) { exchange ->
|
||||
scope?.launch { handleRequest(exchange) }
|
||||
}
|
||||
executor = threadPool
|
||||
start()
|
||||
}
|
||||
LoggerUtil.logger.info("[$name] Webhook服务器已启动在端口 $port$webhookPath")
|
||||
|
|
@ -155,7 +156,8 @@ class GiteaWebhookModule(
|
|||
private fun formatPush(p: PushPayload): String {
|
||||
val repo = p.repository.fullName
|
||||
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 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