mirror of
https://github.com/dalbodeule/chibot-chzzk-bot.git
synced 2025-08-08 05:11:12 +00:00
add counter, counter handlers
This commit is contained in:
@@ -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) {
|
||||
|
@@ -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
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user