add chzzk chat handler, command handler

This commit is contained in:
dalbodeule
2024-06-12 22:19:19 +09:00
parent 294bf04a50
commit 4b7fe25b21
14 changed files with 299 additions and 16 deletions

View File

@@ -0,0 +1,69 @@
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.services.UserService
import xyz.r2turntrue.chzzk4j.chat.ChatEventListener
import xyz.r2turntrue.chzzk4j.chat.ChatMessage
import xyz.r2turntrue.chzzk4j.chat.ChzzkChat
import xyz.r2turntrue.chzzk4j.types.channel.ChzzkChannel
import java.lang.Exception
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 enable() {
UserService.getAllUsers().map {
chzzk.getChannel(it.token)?.let { token -> addUser(token)}
}
}
internal fun disable() {
handlers.forEach { handler ->
handler.disable()
}
}
}
class UserHandler(private val channel: ChzzkChannel, private val logger: Logger) {
private lateinit var messageHandler: MessageHandler
private var listener: ChzzkChat = chzzk.chat(channel.channelId)
.withAutoReconnect(true)
.withChatListener(object : ChatEventListener {
override fun onConnect(chat: ChzzkChat, isReconnecting: Boolean) {
logger.info("ChzzkChat connected. ${channel.channelName} - ${channel.channelId} / reconnected: $isReconnecting")
messageHandler = MessageHandler(channel, logger, chat)
}
override fun onError(ex: Exception) {
logger.info("ChzzkChat error. ${channel.channelName} - ${channel.channelId}")
logger.debug(ex.stackTraceToString())
}
override fun onChat(msg: ChatMessage) {
messageHandler.handle(msg)
}
override fun onConnectionClosed(code: Int, reason: String?, remote: Boolean, tryingToReconnect: Boolean) {
logger.info("ChzzkChat closed. ${channel.channelName} - ${channel.channelId}")
logger.info("Reason: $reason / $tryingToReconnect")
}
})
.build()
init {
logger.info("ChzzkChat connecting... ${channel.channelName} - ${channel.channelId}")
listener.connectBlocking()
}
internal fun disable() {
listener.closeBlocking()
}
}

View File

@@ -1,14 +1,21 @@
package space.mori.chzzk_bot.chzzk
import io.github.cdimascio.dotenv.dotenv
import org.slf4j.LoggerFactory
import xyz.r2turntrue.chzzk4j.Chzzk
import xyz.r2turntrue.chzzk4j.ChzzkBuilder
import xyz.r2turntrue.chzzk4j.types.channel.ChzzkChannel
object Connector {
private val dotenv = dotenv()
val chzzk: Chzzk = ChzzkBuilder()
.withAuthorization(dotenv["NID_AUT"], dotenv["NID_SES"])
.build()
private val logger = LoggerFactory.getLogger(this::class.java)
fun getChannel(channelId: String) = chzzk.getChannel(channelId)
fun getChannel(channelId: String): ChzzkChannel? = chzzk.getChannel(channelId)
init {
logger.info("chzzk logged: ${chzzk.isLoggedIn} / ${chzzk.loggedUser?.nickname ?: "----"}")
}
}

View File

@@ -0,0 +1,34 @@
package space.mori.chzzk_bot.chzzk
import org.slf4j.Logger
import space.mori.chzzk_bot.services.CommandService
import space.mori.chzzk_bot.services.UserService
import xyz.r2turntrue.chzzk4j.chat.ChatMessage
import xyz.r2turntrue.chzzk4j.chat.ChzzkChat
import xyz.r2turntrue.chzzk4j.types.channel.ChzzkChannel
class MessageHandler(
private val channel: ChzzkChannel,
private val logger: Logger,
private val listener: ChzzkChat
) {
private val commands = mutableMapOf<String, () -> Unit>()
init {
val user = UserService.getUser(channel.channelId)
?: throw RuntimeException("User not found. it's bug? ${channel.channelName} - ${channel.channelId}")
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)
}
}
}
internal fun handle(msg: ChatMessage) {
val commandKey = msg.content.split(' ')[0]
commands[commandKey.lowercase()]?.let { it() }
}
}