From fbb0e503798ffbef623d083854440f890f4d04b7 Mon Sep 17 00:00:00 2001 From: dalbodeule <11470513+dalbodeule@users.noreply.github.com> Date: Mon, 17 Jun 2024 16:21:34 +0900 Subject: [PATCH] add alert commands --- src/main/kotlin/space/mori/chzzk_bot/Main.kt | 2 + .../mori/chzzk_bot/chzzk/ChzzkHandler.kt | 14 +++++- .../space/mori/chzzk_bot/discord/Discord.kt | 2 +- .../discord/commands/AlertCommand.kt | 44 +++++++++++++++++++ .../mori/chzzk_bot/services/UserService.kt | 11 ++--- 5 files changed, 66 insertions(+), 7 deletions(-) create mode 100644 src/main/kotlin/space/mori/chzzk_bot/discord/commands/AlertCommand.kt diff --git a/src/main/kotlin/space/mori/chzzk_bot/Main.kt b/src/main/kotlin/space/mori/chzzk_bot/Main.kt index 9a34f2a..d81e516 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/Main.kt +++ b/src/main/kotlin/space/mori/chzzk_bot/Main.kt @@ -25,6 +25,7 @@ val chzzkHandler = ChzzkHandler fun main(args: Array) { discord.enable() chzzkHandler.enable() + chzzkHandler.runStreamInfo() if(dotenv.get("RUN_AGENT", "false").toBoolean()) { runBlocking { @@ -35,6 +36,7 @@ fun main(args: Array) { Runtime.getRuntime().addShutdownHook(Thread { logger.info("Shutting down...") + chzzkHandler.stopStreamInfo() chzzkHandler.disable() discord.disable() connector.dataSource.close() diff --git a/src/main/kotlin/space/mori/chzzk_bot/chzzk/ChzzkHandler.kt b/src/main/kotlin/space/mori/chzzk_bot/chzzk/ChzzkHandler.kt index e3d2634..cf1dee5 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/chzzk/ChzzkHandler.kt +++ b/src/main/kotlin/space/mori/chzzk_bot/chzzk/ChzzkHandler.kt @@ -44,6 +44,14 @@ object ChzzkHandler { throw RuntimeException("${chzzkChannel.channelName} doesn't have handler") } + internal fun reloadUser(chzzkChannel: ChzzkChannel, user: User) { + val handler = handlers.firstOrNull { it.channel.channelId == chzzkChannel.channelId } + if (handler != null) + handler.reloadUser(user) + else + throw RuntimeException("${chzzkChannel.channelName} doesn't have handler") + } + internal fun runStreamInfo() { running = true Thread { @@ -67,7 +75,7 @@ object ChzzkHandler { class UserHandler( val channel: ChzzkChannel, private val logger: Logger, - private val user: User, + private var user: User, private var _isActive: Boolean = false ) { private lateinit var messageHandler: MessageHandler @@ -109,6 +117,10 @@ class UserHandler( messageHandler.reloadCommand() } + internal fun reloadUser(user: User) { + this.user = user + } + internal val isActive: Boolean get() = _isActive diff --git a/src/main/kotlin/space/mori/chzzk_bot/discord/Discord.kt b/src/main/kotlin/space/mori/chzzk_bot/discord/Discord.kt index 29038a5..ab4416e 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/discord/Discord.kt +++ b/src/main/kotlin/space/mori/chzzk_bot/discord/Discord.kt @@ -4,7 +4,6 @@ import net.dv8tion.jda.api.JDA import net.dv8tion.jda.api.JDABuilder import net.dv8tion.jda.api.entities.Activity import net.dv8tion.jda.api.entities.Guild -import net.dv8tion.jda.api.entities.channel.concrete.TextChannel import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent import net.dv8tion.jda.api.hooks.ListenerAdapter import space.mori.chzzk_bot.dotenv @@ -18,6 +17,7 @@ class Discord: ListenerAdapter() { private val commands = listOf( AddCommand, + AlertCommand, PingCommand, RegisterCommand, RemoveCommand, diff --git a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/AlertCommand.kt b/src/main/kotlin/space/mori/chzzk_bot/discord/commands/AlertCommand.kt new file mode 100644 index 0000000..98b8600 --- /dev/null +++ b/src/main/kotlin/space/mori/chzzk_bot/discord/commands/AlertCommand.kt @@ -0,0 +1,44 @@ +package space.mori.chzzk_bot.discord.commands + +import net.dv8tion.jda.api.JDA +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent +import net.dv8tion.jda.api.interactions.commands.OptionType +import net.dv8tion.jda.api.interactions.commands.build.Commands +import net.dv8tion.jda.api.interactions.commands.build.OptionData +import org.slf4j.LoggerFactory +import space.mori.chzzk_bot.chzzk.ChzzkHandler +import space.mori.chzzk_bot.chzzk.Connector +import space.mori.chzzk_bot.discord.CommandInterface +import space.mori.chzzk_bot.services.UserService + +object AlertCommand : CommandInterface { + private val logger = LoggerFactory.getLogger(this::class.java) + override val name: String = "add" + override val command = Commands.slash(name, "명령어를 추가합니다.") + .addOptions(OptionData(OptionType.CHANNEL, "channel", "알림을 보낼 채널을 입력하세요.")) + .addOptions(OptionData(OptionType.STRING, "content", "표시될 텍스트를 입력하세요. 비워두면 알람이 취소됩니다.")) + + override fun run(event: SlashCommandInteractionEvent, bot: JDA) { + val channel = event.getOption("channel")?.asChannel + val content = event.getOption("content")?.asString + + val user = UserService.getUser(event.user.idLong) + if(user == null) { + event.hook.sendMessage("치지직 계정을 찾을 수 없습니다.").queue() + return + } + + val chzzkChannel = Connector.getChannel(user.token) + + try { + val newUser = UserService.updateLiveAlert(user.id.value, channel?.guild?.idLong ?: 0L, channel?.idLong ?: 0L, content ?: "") + try { + ChzzkHandler.reloadUser(chzzkChannel!!, newUser) + } catch (_: Exception) {} + event.hook.sendMessage("업데이트가 완료되었습니다.").queue() + } catch (e: Exception) { + event.hook.sendMessage("에러가 발생했습니다.").queue() + logger.debug(e.stackTraceToString()) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/space/mori/chzzk_bot/services/UserService.kt b/src/main/kotlin/space/mori/chzzk_bot/services/UserService.kt index 6c2e501..a9a5bb8 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/services/UserService.kt +++ b/src/main/kotlin/space/mori/chzzk_bot/services/UserService.kt @@ -45,17 +45,18 @@ object UserService { } } - fun updateLiveAlert(id: Int, guildId: Long, channelId: Long, alertMessage: String?) { + fun updateLiveAlert(id: Int, guildId: Long, channelId: Long, alertMessage: String?): User { return transaction { val updated = Users.update({ Users.id eq id }) { - it[Users.liveAlertGuild] = guildId - it[Users.liveAlertChannel] = channelId - it[Users.liveAlertMessage] = alertMessage ?: "" + it[liveAlertGuild] = guildId + it[liveAlertChannel] = channelId + it[liveAlertMessage] = alertMessage ?: "" } if(updated == 0) throw RuntimeException("User not found! $id") + val users = User.find { Users.id eq id } - User.find(Users.id eq id) + return@transaction users.first() } } } \ No newline at end of file