add counter, counter handlers

This commit is contained in:
dalbodeule
2024-06-13 14:43:49 +09:00
parent 4da72f194e
commit 20f6d84040
16 changed files with 285 additions and 41 deletions

View File

@@ -3,6 +3,7 @@ package space.mori.chzzk_bot.chzzk
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import space.mori.chzzk_bot.chzzk.Connector.chzzk
import space.mori.chzzk_bot.models.User
import space.mori.chzzk_bot.services.UserService
import xyz.r2turntrue.chzzk4j.chat.ChatEventListener
import xyz.r2turntrue.chzzk4j.chat.ChatMessage
@@ -14,13 +15,13 @@ object ChzzkHandler {
private val handlers = mutableListOf<UserHandler>()
private val logger = LoggerFactory.getLogger(this::class.java)
internal fun addUser(chzzkChannel: ChzzkChannel) {
handlers.add(UserHandler(chzzkChannel, logger))
internal fun addUser(chzzkChannel: ChzzkChannel, user: User) {
handlers.add(UserHandler(chzzkChannel, logger, user))
}
internal fun enable() {
UserService.getAllUsers().map {
chzzk.getChannel(it.token)?.let { token -> addUser(token)}
chzzk.getChannel(it.token)?.let { token -> addUser(token, it)}
}
}
@@ -31,7 +32,7 @@ object ChzzkHandler {
}
internal fun reloadCommand(chzzkChannel: ChzzkChannel) {
val handler = handlers.firstOrNull { it.channel == chzzkChannel }
val handler = handlers.firstOrNull { it.channel.channelId == chzzkChannel.channelId }
if (handler != null)
handler.reloadCommand()
else
@@ -39,7 +40,9 @@ object ChzzkHandler {
}
}
class UserHandler(val channel: ChzzkChannel, private val logger: Logger) {
class UserHandler(
val channel: ChzzkChannel, private val logger: Logger, private val user: User
) {
private lateinit var messageHandler: MessageHandler
private var listener: ChzzkChat = chzzk.chat(channel.channelId)
@@ -56,7 +59,7 @@ class UserHandler(val channel: ChzzkChannel, private val logger: Logger) {
}
override fun onChat(msg: ChatMessage) {
messageHandler.handle(msg)
messageHandler.handle(msg, user)
}
override fun onConnectionClosed(code: Int, reason: String?, remote: Boolean, tryingToReconnect: Boolean) {

View File

@@ -1,7 +1,9 @@
package space.mori.chzzk_bot.chzzk
import org.slf4j.Logger
import space.mori.chzzk_bot.models.User
import space.mori.chzzk_bot.services.CommandService
import space.mori.chzzk_bot.services.CounterService
import space.mori.chzzk_bot.services.UserService
import xyz.r2turntrue.chzzk4j.chat.ChatMessage
import xyz.r2turntrue.chzzk4j.chat.ChzzkChat
@@ -12,7 +14,12 @@ class MessageHandler(
private val logger: Logger,
private val listener: ChzzkChat
) {
private val commands = mutableMapOf<String, () -> Unit>()
private val commands = mutableMapOf<String, (msg: ChatMessage, user: User) -> Unit>()
private val counterPattern = Regex("<counter:([^>]+)>")
private val personalCounterPattern = Regex("<counter_personal:([^>]+)>")
private val dailyCounterPattern = Regex("<daily_counter:([^>]+)>")
private val namePattern = Regex("<name>")
init {
reloadCommand()
@@ -24,16 +31,59 @@ class MessageHandler(
val commands = CommandService.getCommands(user)
commands.map {
this.commands.put(it.command.lowercase()) {
logger.debug("${channel.channelName} - ${it.command} - ${it.content}")
listener.sendChat(it.content)
this.commands.put(it.command.lowercase()) { msg, user ->
logger.debug("${channel.channelName} - ${it.command} - ${it.content}/${it.failContent}")
val result = replaceCounters(Pair(it.content, it.failContent), user, msg.userId, msg.profile?.nickname ?: "")
listener.sendChat(result)
}
}
}
internal fun handle(msg: ChatMessage) {
internal fun handle(msg: ChatMessage, user: User) {
val commandKey = msg.content.split(' ')[0]
commands[commandKey.lowercase()]?.let { it() }
commands[commandKey.lowercase()]?.let { it(msg, user) }
}
private fun replaceCounters(chat: Pair<String, String>, user: User, userId: String, userName: String): String {
var result = chat.first
var isFail = false
result = counterPattern.replace(result) {
val name = it.groupValues[1]
CounterService.updateCounterValue(name, 1, user).toString()
}
result = personalCounterPattern.replace(result) {
val name = it.groupValues[1]
CounterService.updatePersonalCounterValue(name, userId, 1, user).toString()
}
result = dailyCounterPattern.replace(result) {
val name = it.groupValues[1]
val dailyCounter = CounterService.getDailyCounterValue(name, userId, user)
return@replace if(dailyCounter.second)
CounterService.updateDailyCounterValue(name, userId, 1, user).first.toString()
else {
isFail = true
dailyCounter.first.toString()
}
}
if(isFail) {
result = chat.second
result = dailyCounterPattern.replace(result) {
val name = it.groupValues[1]
val dailyCounter = CounterService.getDailyCounterValue(name, userId, user)
dailyCounter.first.toString()
}
}
result = namePattern.replace(result, userName)
return result
}
}