mirror of
https://github.com/dalbodeule/chibot-chzzk-bot.git
synced 2025-08-08 05:11:12 +00:00
add chzzk chat handler, command handler
This commit is contained in:
69
src/main/kotlin/space/mori/chzzk_bot/chzzk/ChzzkHandler.kt
Normal file
69
src/main/kotlin/space/mori/chzzk_bot/chzzk/ChzzkHandler.kt
Normal 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()
|
||||
}
|
||||
}
|
@@ -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 ?: "----"}")
|
||||
}
|
||||
}
|
34
src/main/kotlin/space/mori/chzzk_bot/chzzk/MessageHandler.kt
Normal file
34
src/main/kotlin/space/mori/chzzk_bot/chzzk/MessageHandler.kt
Normal 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() }
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user