From 72f98b024be7f30272b23991c361a37884bf43e0 Mon Sep 17 00:00:00 2001 From: dalbodeule <11470513+dalbodeule@users.noreply.github.com> Date: Tue, 30 Jul 2024 14:28:43 +0900 Subject: [PATCH] add webserver, etc... - add ktor webserver - package is subpackaged. --- .idea/ktor.xml | 6 ++ .idea/sqldialects.xml | 3 - build.gradle.kts | 22 ++----- chatbot/build.gradle.kts | 50 ++++++++++++++++ .../chzzk_bot/chatbot}/chzzk/ChzzkApis.kt | 2 +- .../chzzk_bot/chatbot}/chzzk/ChzzkHandler.kt | 49 +++++----------- .../chzzk_bot/chatbot}/chzzk/Connector.kt | 8 ++- .../chatbot}/chzzk/MessageHandler.kt | 10 ++-- .../chzzk_bot/chatbot}/discord/Commands.kt | 2 +- .../chzzk_bot/chatbot}/discord/Discord.kt | 58 +++++++++++++++---- .../chatbot}/discord/commands/AddCommand.kt | 14 ++--- .../discord/commands/AddManagerCommand.kt | 8 +-- .../chatbot}/discord/commands/AlertCommand.kt | 12 ++-- .../discord/commands/ListManagerCommand.kt | 8 +-- .../chatbot}/discord/commands/PingCommand.kt | 4 +- .../discord/commands/RegisterCommand.kt | 10 ++-- .../discord/commands/RemoveCommand.kt | 14 ++--- .../discord/commands/RemoveManagerCommand.kt | 8 +-- .../discord/commands/UpdateCommand.kt | 14 ++--- common/build.gradle.kts | 42 ++++++++++++++ .../space/mori/chzzk_bot/common}/Connector.kt | 9 ++- .../mori/chzzk_bot/common}/models/Command.kt | 2 +- .../mori/chzzk_bot/common}/models/Counter.kt | 2 +- .../chzzk_bot/common}/models/DailyCounters.kt | 2 +- .../mori/chzzk_bot/common}/models/Manager.kt | 2 +- .../common}/models/PersonalCounter.kt | 2 +- .../mori/chzzk_bot/common}/models/User.kt | 2 +- .../common}/services/CommandService.kt | 8 +-- .../common}/services/CounterService.kt | 4 +- .../common}/services/ManagerService.kt | 8 +-- .../chzzk_bot/common}/services/UserService.kt | 6 +- gradle.properties | 2 +- settings.gradle.kts | 9 ++- src/main/kotlin/space/mori/chzzk_bot/Main.kt | 12 +++- webserver/build.gradle.kts | 45 ++++++++++++++ .../space/mori/chzzk_bot/webserver/Main.kt | 44 ++++++++++++++ .../chzzk_bot/webserver/routes/ApiRoutes.kt | 19 ++++++ .../main/resources/openapi/documentation.yaml | 35 +++++++++++ 38 files changed, 409 insertions(+), 148 deletions(-) create mode 100644 .idea/ktor.xml create mode 100644 chatbot/build.gradle.kts rename {src/main/kotlin/space/mori/chzzk_bot => chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot}/chzzk/ChzzkApis.kt (98%) rename {src/main/kotlin/space/mori/chzzk_bot => chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot}/chzzk/ChzzkHandler.kt (69%) rename {src/main/kotlin/space/mori/chzzk_bot => chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot}/chzzk/Connector.kt (80%) rename {src/main/kotlin/space/mori/chzzk_bot => chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot}/chzzk/MessageHandler.kt (96%) rename {src/main/kotlin/space/mori/chzzk_bot => chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot}/discord/Commands.kt (87%) rename {src/main/kotlin/space/mori/chzzk_bot => chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot}/discord/Discord.kt (56%) rename {src/main/kotlin/space/mori/chzzk_bot => chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot}/discord/commands/AddCommand.kt (87%) rename {src/main/kotlin/space/mori/chzzk_bot => chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot}/discord/commands/AddManagerCommand.kt (88%) rename {src/main/kotlin/space/mori/chzzk_bot => chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot}/discord/commands/AlertCommand.kt (86%) rename {src/main/kotlin/space/mori/chzzk_bot => chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot}/discord/commands/ListManagerCommand.kt (86%) rename {src/main/kotlin/space/mori/chzzk_bot => chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot}/discord/commands/PingCommand.kt (83%) rename {src/main/kotlin/space/mori/chzzk_bot => chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot}/discord/commands/RegisterCommand.kt (86%) rename {src/main/kotlin/space/mori/chzzk_bot => chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot}/discord/commands/RemoveCommand.kt (83%) rename {src/main/kotlin/space/mori/chzzk_bot => chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot}/discord/commands/RemoveManagerCommand.kt (89%) rename {src/main/kotlin/space/mori/chzzk_bot => chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot}/discord/commands/UpdateCommand.kt (85%) create mode 100644 common/build.gradle.kts rename {src/main/kotlin/space/mori/chzzk_bot => common/src/main/kotlin/space/mori/chzzk_bot/common}/Connector.kt (82%) rename {src/main/kotlin/space/mori/chzzk_bot => common/src/main/kotlin/space/mori/chzzk_bot/common}/models/Command.kt (94%) rename {src/main/kotlin/space/mori/chzzk_bot => common/src/main/kotlin/space/mori/chzzk_bot/common}/models/Counter.kt (92%) rename {src/main/kotlin/space/mori/chzzk_bot => common/src/main/kotlin/space/mori/chzzk_bot/common}/models/DailyCounters.kt (94%) rename {src/main/kotlin/space/mori/chzzk_bot => common/src/main/kotlin/space/mori/chzzk_bot/common}/models/Manager.kt (94%) rename {src/main/kotlin/space/mori/chzzk_bot => common/src/main/kotlin/space/mori/chzzk_bot/common}/models/PersonalCounter.kt (94%) rename {src/main/kotlin/space/mori/chzzk_bot => common/src/main/kotlin/space/mori/chzzk_bot/common}/models/User.kt (95%) rename {src/main/kotlin/space/mori/chzzk_bot => common/src/main/kotlin/space/mori/chzzk_bot/common}/services/CommandService.kt (90%) rename {src/main/kotlin/space/mori/chzzk_bot => common/src/main/kotlin/space/mori/chzzk_bot/common}/services/CounterService.kt (97%) rename {src/main/kotlin/space/mori/chzzk_bot => common/src/main/kotlin/space/mori/chzzk_bot/common}/services/ManagerService.kt (91%) rename {src/main/kotlin/space/mori/chzzk_bot => common/src/main/kotlin/space/mori/chzzk_bot/common}/services/UserService.kt (92%) create mode 100644 webserver/build.gradle.kts create mode 100644 webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/Main.kt create mode 100644 webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/routes/ApiRoutes.kt create mode 100644 webserver/src/main/resources/openapi/documentation.yaml diff --git a/.idea/ktor.xml b/.idea/ktor.xml new file mode 100644 index 0000000..2385664 --- /dev/null +++ b/.idea/ktor.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/sqldialects.xml b/.idea/sqldialects.xml index 257aa19..63772a3 100644 --- a/.idea/sqldialects.xml +++ b/.idea/sqldialects.xml @@ -3,7 +3,4 @@ - - - \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 0d66252..2397b3a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,7 +5,6 @@ plugins { id("application") kotlin("jvm") version kotlinVersion kotlin("plugin.jpa") version kotlinVersion - id("org.graalvm.buildtools.native") version "0.10.2" } group = "${project.group}" @@ -32,24 +31,10 @@ dependencies { implementation("net.dv8tion:JDA:5.0.1") { exclude(module = "opus-java") } - // https://mvnrepository.com/artifact/io.github.R2turnTrue/chzzk4j - implementation("io.github.R2turnTrue:chzzk4j:0.0.9") // https://mvnrepository.com/artifact/ch.qos.logback/logback-classic implementation("ch.qos.logback:logback-classic:1.5.6") - // https://mvnrepository.com/artifact/org.jetbrains.exposed/exposed-core - implementation("org.jetbrains.exposed:exposed-core:0.52.0") - // https://mvnrepository.com/artifact/org.jetbrains.exposed/exposed-dao - implementation("org.jetbrains.exposed:exposed-dao:0.52.0") - // https://mvnrepository.com/artifact/org.jetbrains.exposed/exposed-jdbc - implementation("org.jetbrains.exposed:exposed-jdbc:0.52.0") - // https://mvnrepository.com/artifact/org.jetbrains.exposed/exposed-kotlin-datetime - implementation("org.jetbrains.exposed:exposed-java-time:0.52.0") - - // https://mvnrepository.com/artifact/com.zaxxer/HikariCP - implementation("com.zaxxer:HikariCP:5.1.0") - // https://mvnrepository.com/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0-RC") // https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-reflect @@ -58,13 +43,14 @@ dependencies { // https://mvnrepository.com/artifact/com.google.code.gson/gson implementation("com.google.code.gson:gson:2.11.0") - // https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client - implementation("org.mariadb.jdbc:mariadb-java-client:3.4.1") - // https://mvnrepository.com/artifact/io.github.cdimascio/dotenv-kotlin implementation("io.github.cdimascio:dotenv-kotlin:6.4.1") kotlin("stdlib") + + listOf(project(":common"), project(":chatbot"), project(":webserver")).forEach { + implementation(it) + } } tasks.withType { diff --git a/chatbot/build.gradle.kts b/chatbot/build.gradle.kts new file mode 100644 index 0000000..5c53230 --- /dev/null +++ b/chatbot/build.gradle.kts @@ -0,0 +1,50 @@ +plugins { + kotlin("jvm") +} + +group = project.rootProject.group +version = project.rootProject.version + +repositories { + mavenCentral() +} + +dependencies { + // https://mvnrepository.com/artifact/net.dv8tion/JDA + implementation("net.dv8tion:JDA:5.0.1") { + exclude(module = "opus-java") + } + + // https://mvnrepository.com/artifact/io.github.R2turnTrue/chzzk4j + implementation("io.github.R2turnTrue:chzzk4j:0.0.9") + + // https://mvnrepository.com/artifact/ch.qos.logback/logback-classic + implementation("ch.qos.logback:logback-classic:1.5.6") + + // https://mvnrepository.com/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0-RC") + // https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-reflect + implementation("org.jetbrains.kotlin:kotlin-reflect:2.0.0") + + // https://mvnrepository.com/artifact/com.google.code.gson/gson + implementation("com.google.code.gson:gson:2.11.0") + + // https://mvnrepository.com/artifact/io.github.cdimascio/dotenv-kotlin + implementation("io.github.cdimascio:dotenv-kotlin:6.4.1") + + // https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp + implementation("com.squareup.okhttp3:okhttp:4.12.0") + + testImplementation(kotlin("test")) + + listOf(project(":common")).forEach { + implementation(it) + } +} + +tasks.test { + useJUnitPlatform() +} +kotlin { + jvmToolchain(21) +} \ No newline at end of file diff --git a/src/main/kotlin/space/mori/chzzk_bot/chzzk/ChzzkApis.kt b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/chzzk/ChzzkApis.kt similarity index 98% rename from src/main/kotlin/space/mori/chzzk_bot/chzzk/ChzzkApis.kt rename to chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/chzzk/ChzzkApis.kt index 95c552a..09806a8 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/chzzk/ChzzkApis.kt +++ b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/chzzk/ChzzkApis.kt @@ -1,4 +1,4 @@ -package space.mori.chzzk_bot.chzzk +package space.mori.chzzk_bot.chatbot.chzzk import com.google.gson.Gson import com.google.gson.reflect.TypeToken diff --git a/src/main/kotlin/space/mori/chzzk_bot/chzzk/ChzzkHandler.kt b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/chzzk/ChzzkHandler.kt similarity index 69% rename from src/main/kotlin/space/mori/chzzk_bot/chzzk/ChzzkHandler.kt rename to chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/chzzk/ChzzkHandler.kt index 62d3de7..40e6a59 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/chzzk/ChzzkHandler.kt +++ b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/chzzk/ChzzkHandler.kt @@ -1,37 +1,34 @@ -package space.mori.chzzk_bot.chzzk +package space.mori.chzzk_bot.chatbot.chzzk -import net.dv8tion.jda.api.EmbedBuilder -import net.dv8tion.jda.api.utils.messages.MessageCreateBuilder import org.slf4j.Logger import org.slf4j.LoggerFactory -import space.mori.chzzk_bot.chzzk.Connector.chzzk -import space.mori.chzzk_bot.discord -import space.mori.chzzk_bot.models.User -import space.mori.chzzk_bot.services.UserService +import space.mori.chzzk_bot.chatbot.chzzk.Connector.chzzk +import space.mori.chzzk_bot.chatbot.discord.Discord +import space.mori.chzzk_bot.common.models.User +import space.mori.chzzk_bot.common.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 import java.net.SocketTimeoutException -import java.time.Instant object ChzzkHandler { private val handlers = mutableListOf() private val logger = LoggerFactory.getLogger(this::class.java) @Volatile private var running: Boolean = false - internal fun addUser(chzzkChannel: ChzzkChannel, user: User) { + fun addUser(chzzkChannel: ChzzkChannel, user: User) { handlers.add(UserHandler(chzzkChannel, logger, user)) } - internal fun enable() { + fun enable() { UserService.getAllUsers().map { - chzzk.getChannel(it.token)?.let { token -> addUser(token, it)} + chzzk.getChannel(it.token)?.let { token -> addUser(token, it) } } } - internal fun disable() { + fun disable() { handlers.forEach { handler -> handler.disable() } @@ -53,7 +50,7 @@ object ChzzkHandler { throw RuntimeException("${chzzkChannel.channelName} doesn't have handler") } - internal fun runStreamInfo() { + fun runStreamInfo() { running = true val thread = Thread({ while(running) { @@ -78,7 +75,7 @@ object ChzzkHandler { thread.start() } - internal fun stopStreamInfo() { + fun stopStreamInfo() { running = false } } @@ -137,30 +134,12 @@ class UserHandler( logger.info("${user.username} is live.") logger.info("ChzzkChat connecting... ${channel.channelName} - ${channel.channelId}") - listener.connectAsync() + listener.connectBlocking() - if(user.liveAlertMessage != "" && user.liveAlertGuild != null && user.liveAlertChannel != null) { - val channel = discord.getChannel(user.liveAlertGuild!!, user.liveAlertChannel!!) ?: throw RuntimeException("${user.liveAlertChannel} is not valid.") + Discord.sendDiscord(user, status) - val embed = EmbedBuilder() - embed.setTitle(status.content.liveTitle, "https://chzzk.naver.com/live/${user.token}") - embed.setDescription("${user.username} 님이 방송을 시작했습니다.") - embed.setUrl(status.content.channel.channelImageUrl) - embed.setTimestamp(Instant.now()) - embed.setAuthor(user.username, "https://chzzk.naver.com/live/${user.token}", status.content.channel.channelImageUrl) - embed.addField("카테고리", status.content.liveCategoryValue, true) - embed.addField("태그", status.content.tags.joinToString(", "), true) - embed.setImage(status.content.liveImageUrl.replace("{type}", "1080")) + listener.sendChat("${user.username} 님의 방송이 감지되었습니다.") - channel.sendMessage( - MessageCreateBuilder() - .setContent(user.liveAlertMessage) - .setEmbeds(embed.build()) - .build() - ).queue() - - listener.sendChat("${user.username} 님의 방송이 감지되었습니다.") - } } else { logger.info("${user.username} is offline.") listener.closeAsync() diff --git a/src/main/kotlin/space/mori/chzzk_bot/chzzk/Connector.kt b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/chzzk/Connector.kt similarity index 80% rename from src/main/kotlin/space/mori/chzzk_bot/chzzk/Connector.kt rename to chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/chzzk/Connector.kt index 9004558..7309c11 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/chzzk/Connector.kt +++ b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/chzzk/Connector.kt @@ -1,10 +1,14 @@ -package space.mori.chzzk_bot.chzzk +package space.mori.chzzk_bot.chatbot.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 -import space.mori.chzzk_bot.dotenv + +val dotenv = dotenv { + ignoreIfMissing = true +} object Connector { val chzzk: Chzzk = ChzzkBuilder() diff --git a/src/main/kotlin/space/mori/chzzk_bot/chzzk/MessageHandler.kt b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/chzzk/MessageHandler.kt similarity index 96% rename from src/main/kotlin/space/mori/chzzk_bot/chzzk/MessageHandler.kt rename to chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/chzzk/MessageHandler.kt index 93f8f00..dac4335 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/chzzk/MessageHandler.kt +++ b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/chzzk/MessageHandler.kt @@ -1,10 +1,10 @@ -package space.mori.chzzk_bot.chzzk +package space.mori.chzzk_bot.chatbot.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 space.mori.chzzk_bot.common.models.User +import space.mori.chzzk_bot.common.services.CommandService +import space.mori.chzzk_bot.common.services.CounterService +import space.mori.chzzk_bot.common.services.UserService import xyz.r2turntrue.chzzk4j.chat.ChatMessage import xyz.r2turntrue.chzzk4j.chat.ChzzkChat import xyz.r2turntrue.chzzk4j.types.channel.ChzzkChannel diff --git a/src/main/kotlin/space/mori/chzzk_bot/discord/Commands.kt b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/Commands.kt similarity index 87% rename from src/main/kotlin/space/mori/chzzk_bot/discord/Commands.kt rename to chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/Commands.kt index 94c6b0a..ecb2f53 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/discord/Commands.kt +++ b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/Commands.kt @@ -1,4 +1,4 @@ -package space.mori.chzzk_bot.discord +package space.mori.chzzk_bot.chatbot.discord import net.dv8tion.jda.api.JDA import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent diff --git a/src/main/kotlin/space/mori/chzzk_bot/discord/Discord.kt b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/Discord.kt similarity index 56% rename from src/main/kotlin/space/mori/chzzk_bot/discord/Discord.kt rename to chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/Discord.kt index 8ce5878..40f8af4 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/discord/Discord.kt +++ b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/Discord.kt @@ -1,5 +1,7 @@ -package space.mori.chzzk_bot.discord +package space.mori.chzzk_bot.chatbot.discord +import io.github.cdimascio.dotenv.dotenv +import net.dv8tion.jda.api.EmbedBuilder import net.dv8tion.jda.api.JDA import net.dv8tion.jda.api.JDABuilder import net.dv8tion.jda.api.entities.Activity @@ -8,16 +10,53 @@ import net.dv8tion.jda.api.events.guild.GuildJoinEvent import net.dv8tion.jda.api.events.guild.member.GuildMemberRemoveEvent import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent import net.dv8tion.jda.api.hooks.ListenerAdapter -import space.mori.chzzk_bot.dotenv +import net.dv8tion.jda.api.utils.messages.MessageCreateBuilder import org.slf4j.LoggerFactory -import space.mori.chzzk_bot.discord.commands.* -import space.mori.chzzk_bot.services.ManagerService +import space.mori.chzzk_bot.chatbot.chzzk.IData +import space.mori.chzzk_bot.chatbot.chzzk.IStreamInfo +import space.mori.chzzk_bot.chatbot.discord.commands.* +import space.mori.chzzk_bot.common.models.User +import space.mori.chzzk_bot.common.services.ManagerService +import java.time.Instant + +val dotenv = dotenv { + ignoreIfMissing = true +} class Discord: ListenerAdapter() { - private lateinit var bot: JDA private var guild: Guild? = null private val logger = LoggerFactory.getLogger(this::class.java) + companion object { + lateinit var bot: JDA + + internal fun getChannel(guildId: Long, channelId: Long) = + bot.getGuildById(guildId)?.getTextChannelById(channelId) + + fun sendDiscord(user: User, status: IData) { + if(user.liveAlertMessage != "" && user.liveAlertGuild != null && user.liveAlertChannel != null) { + val channel = getChannel(user.liveAlertGuild!!, user.liveAlertChannel!!) ?: throw RuntimeException("${user.liveAlertChannel} is not valid.") + + val embed = EmbedBuilder() + embed.setTitle(status.content.liveTitle, "https://chzzk.naver.com/live/${user.token}") + embed.setDescription("${user.username} 님이 방송을 시작했습니다.") + embed.setUrl(status.content.channel.channelImageUrl) + embed.setTimestamp(Instant.now()) + embed.setAuthor(user.username, "https://chzzk.naver.com/live/${user.token}", status.content.channel.channelImageUrl) + embed.addField("카테고리", status.content.liveCategoryValue, true) + embed.addField("태그", status.content.tags.joinToString(", "), true) + embed.setImage(status.content.liveImageUrl.replace("{type}", "1080")) + + channel.sendMessage( + MessageCreateBuilder() + .setContent(user.liveAlertMessage) + .setEmbeds(embed.build()) + .build() + ).queue() + } + } + } + private val commands = listOf( AddCommand, AlertCommand, @@ -61,7 +100,7 @@ class Discord: ListenerAdapter() { .queue() } - internal fun enable() { + fun enable() { val thread = Thread { try { bot = JDABuilder.createDefault(dotenv["DISCORD_TOKEN"]) @@ -83,7 +122,7 @@ class Discord: ListenerAdapter() { thread.start() } - internal fun disable() { + fun disable() { try { bot.shutdown() } catch(e: Exception) { @@ -91,7 +130,4 @@ class Discord: ListenerAdapter() { logger.debug(e.stackTraceToString()) } } - - internal fun getChannel(guildId: Long, channelId: Long) = - bot.getGuildById(guildId)?.getTextChannelById(channelId) -} +} \ No newline at end of file diff --git a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/AddCommand.kt b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/AddCommand.kt similarity index 87% rename from src/main/kotlin/space/mori/chzzk_bot/discord/commands/AddCommand.kt rename to chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/AddCommand.kt index e48d049..772de12 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/AddCommand.kt +++ b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/AddCommand.kt @@ -1,4 +1,4 @@ -package space.mori.chzzk_bot.discord.commands +package space.mori.chzzk_bot.chatbot.discord.commands import net.dv8tion.jda.api.JDA import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent @@ -6,12 +6,12 @@ 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.CommandService -import space.mori.chzzk_bot.services.ManagerService -import space.mori.chzzk_bot.services.UserService +import space.mori.chzzk_bot.chatbot.chzzk.ChzzkHandler +import space.mori.chzzk_bot.chatbot.chzzk.Connector +import space.mori.chzzk_bot.chatbot.discord.CommandInterface +import space.mori.chzzk_bot.common.services.CommandService +import space.mori.chzzk_bot.common.services.ManagerService +import space.mori.chzzk_bot.common.services.UserService object AddCommand : CommandInterface { private val logger = LoggerFactory.getLogger(this::class.java) diff --git a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/AddManagerCommand.kt b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/AddManagerCommand.kt similarity index 88% rename from src/main/kotlin/space/mori/chzzk_bot/discord/commands/AddManagerCommand.kt rename to chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/AddManagerCommand.kt index c55c4c6..e3526a3 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/AddManagerCommand.kt +++ b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/AddManagerCommand.kt @@ -1,4 +1,4 @@ -package space.mori.chzzk_bot.discord.commands +package space.mori.chzzk_bot.chatbot.discord.commands import net.dv8tion.jda.api.JDA import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent @@ -6,9 +6,9 @@ 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.discord.CommandInterface -import space.mori.chzzk_bot.services.ManagerService -import space.mori.chzzk_bot.services.UserService +import space.mori.chzzk_bot.chatbot.discord.CommandInterface +import space.mori.chzzk_bot.common.services.ManagerService +import space.mori.chzzk_bot.common.services.UserService object AddManagerCommand : CommandInterface { private val logger = LoggerFactory.getLogger(this::class.java) diff --git a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/AlertCommand.kt b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/AlertCommand.kt similarity index 86% rename from src/main/kotlin/space/mori/chzzk_bot/discord/commands/AlertCommand.kt rename to chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/AlertCommand.kt index 177a2e0..dcc9098 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/AlertCommand.kt +++ b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/AlertCommand.kt @@ -1,4 +1,4 @@ -package space.mori.chzzk_bot.discord.commands +package space.mori.chzzk_bot.chatbot.discord.commands import net.dv8tion.jda.api.JDA import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent @@ -6,11 +6,11 @@ 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.ManagerService -import space.mori.chzzk_bot.services.UserService +import space.mori.chzzk_bot.chatbot.chzzk.ChzzkHandler +import space.mori.chzzk_bot.chatbot.chzzk.Connector +import space.mori.chzzk_bot.chatbot.discord.CommandInterface +import space.mori.chzzk_bot.common.services.ManagerService +import space.mori.chzzk_bot.common.services.UserService object AlertCommand : CommandInterface { private val logger = LoggerFactory.getLogger(this::class.java) diff --git a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/ListManagerCommand.kt b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/ListManagerCommand.kt similarity index 86% rename from src/main/kotlin/space/mori/chzzk_bot/discord/commands/ListManagerCommand.kt rename to chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/ListManagerCommand.kt index 509bd6b..87ed6f3 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/ListManagerCommand.kt +++ b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/ListManagerCommand.kt @@ -1,13 +1,13 @@ -package space.mori.chzzk_bot.discord.commands +package space.mori.chzzk_bot.chatbot.discord.commands import net.dv8tion.jda.api.EmbedBuilder import net.dv8tion.jda.api.JDA import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent import net.dv8tion.jda.api.interactions.commands.build.Commands import org.slf4j.LoggerFactory -import space.mori.chzzk_bot.discord.CommandInterface -import space.mori.chzzk_bot.services.ManagerService -import space.mori.chzzk_bot.services.UserService +import space.mori.chzzk_bot.chatbot.discord.CommandInterface +import space.mori.chzzk_bot.common.services.ManagerService +import space.mori.chzzk_bot.common.services.UserService object ListManagerCommand : CommandInterface { private val logger = LoggerFactory.getLogger(this::class.java) diff --git a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/PingCommand.kt b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/PingCommand.kt similarity index 83% rename from src/main/kotlin/space/mori/chzzk_bot/discord/commands/PingCommand.kt rename to chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/PingCommand.kt index 939a7e3..5df7cbb 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/PingCommand.kt +++ b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/PingCommand.kt @@ -1,10 +1,10 @@ -package space.mori.chzzk_bot.discord.commands +package space.mori.chzzk_bot.chatbot.discord.commands import net.dv8tion.jda.api.JDA import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent import net.dv8tion.jda.api.interactions.commands.build.Commands import org.slf4j.LoggerFactory -import space.mori.chzzk_bot.discord.CommandInterface +import space.mori.chzzk_bot.chatbot.discord.CommandInterface object PingCommand: CommandInterface { private val logger = LoggerFactory.getLogger(this::class.java) diff --git a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/RegisterCommand.kt b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/RegisterCommand.kt similarity index 86% rename from src/main/kotlin/space/mori/chzzk_bot/discord/commands/RegisterCommand.kt rename to chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/RegisterCommand.kt index bb70636..cabe38d 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/RegisterCommand.kt +++ b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/RegisterCommand.kt @@ -1,4 +1,4 @@ -package space.mori.chzzk_bot.discord.commands +package space.mori.chzzk_bot.chatbot.discord.commands import net.dv8tion.jda.api.JDA import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent @@ -6,10 +6,10 @@ 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 +import space.mori.chzzk_bot.chatbot.chzzk.ChzzkHandler +import space.mori.chzzk_bot.chatbot.chzzk.Connector +import space.mori.chzzk_bot.chatbot.discord.CommandInterface +import space.mori.chzzk_bot.common.services.UserService object RegisterCommand: CommandInterface { private val logger = LoggerFactory.getLogger(this::class.java) diff --git a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/RemoveCommand.kt b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/RemoveCommand.kt similarity index 83% rename from src/main/kotlin/space/mori/chzzk_bot/discord/commands/RemoveCommand.kt rename to chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/RemoveCommand.kt index 97a2de5..5bd8c41 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/RemoveCommand.kt +++ b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/RemoveCommand.kt @@ -1,4 +1,4 @@ -package space.mori.chzzk_bot.discord.commands +package space.mori.chzzk_bot.chatbot.discord.commands import net.dv8tion.jda.api.JDA import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent @@ -6,12 +6,12 @@ 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.CommandService -import space.mori.chzzk_bot.services.ManagerService -import space.mori.chzzk_bot.services.UserService +import space.mori.chzzk_bot.chatbot.chzzk.ChzzkHandler +import space.mori.chzzk_bot.chatbot.chzzk.Connector +import space.mori.chzzk_bot.chatbot.discord.CommandInterface +import space.mori.chzzk_bot.common.services.CommandService +import space.mori.chzzk_bot.common.services.ManagerService +import space.mori.chzzk_bot.common.services.UserService object RemoveCommand : CommandInterface { private val logger = LoggerFactory.getLogger(this::class.java) diff --git a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/RemoveManagerCommand.kt b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/RemoveManagerCommand.kt similarity index 89% rename from src/main/kotlin/space/mori/chzzk_bot/discord/commands/RemoveManagerCommand.kt rename to chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/RemoveManagerCommand.kt index 143e9ca..020d38f 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/RemoveManagerCommand.kt +++ b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/RemoveManagerCommand.kt @@ -1,4 +1,4 @@ -package space.mori.chzzk_bot.discord.commands +package space.mori.chzzk_bot.chatbot.discord.commands import net.dv8tion.jda.api.JDA import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent @@ -6,9 +6,9 @@ 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.discord.CommandInterface -import space.mori.chzzk_bot.services.ManagerService -import space.mori.chzzk_bot.services.UserService +import space.mori.chzzk_bot.chatbot.discord.CommandInterface +import space.mori.chzzk_bot.common.services.ManagerService +import space.mori.chzzk_bot.common.services.UserService object RemoveManagerCommand : CommandInterface { private val logger = LoggerFactory.getLogger(this::class.java) diff --git a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/UpdateCommand.kt b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/UpdateCommand.kt similarity index 85% rename from src/main/kotlin/space/mori/chzzk_bot/discord/commands/UpdateCommand.kt rename to chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/UpdateCommand.kt index 6c43a1f..3d9c03d 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/UpdateCommand.kt +++ b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/discord/commands/UpdateCommand.kt @@ -1,4 +1,4 @@ -package space.mori.chzzk_bot.discord.commands +package space.mori.chzzk_bot.chatbot.discord.commands import net.dv8tion.jda.api.JDA import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent @@ -6,12 +6,12 @@ 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.CommandService -import space.mori.chzzk_bot.services.ManagerService -import space.mori.chzzk_bot.services.UserService +import space.mori.chzzk_bot.chatbot.chzzk.ChzzkHandler +import space.mori.chzzk_bot.chatbot.chzzk.Connector +import space.mori.chzzk_bot.chatbot.discord.CommandInterface +import space.mori.chzzk_bot.common.services.CommandService +import space.mori.chzzk_bot.common.services.ManagerService +import space.mori.chzzk_bot.common.services.UserService object UpdateCommand : CommandInterface { private val logger = LoggerFactory.getLogger(this::class.java) diff --git a/common/build.gradle.kts b/common/build.gradle.kts new file mode 100644 index 0000000..a1f5ed5 --- /dev/null +++ b/common/build.gradle.kts @@ -0,0 +1,42 @@ +plugins { + kotlin("jvm") +} + +group = project.rootProject.group +version = project.rootProject.version + +repositories { + mavenCentral() +} + +dependencies { + // https://mvnrepository.com/artifact/org.jetbrains.exposed/exposed-core + api("org.jetbrains.exposed:exposed-core:0.52.0") + // https://mvnrepository.com/artifact/org.jetbrains.exposed/exposed-dao + api("org.jetbrains.exposed:exposed-dao:0.52.0") + // https://mvnrepository.com/artifact/org.jetbrains.exposed/exposed-jdbc + api("org.jetbrains.exposed:exposed-jdbc:0.52.0") + // https://mvnrepository.com/artifact/org.jetbrains.exposed/exposed-kotlin-datetime + api("org.jetbrains.exposed:exposed-java-time:0.52.0") + + // https://mvnrepository.com/artifact/com.zaxxer/HikariCP + api("com.zaxxer:HikariCP:5.1.0") + + // https://mvnrepository.com/artifact/ch.qos.logback/logback-classic + implementation("ch.qos.logback:logback-classic:1.5.6") + + // https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client + implementation("org.mariadb.jdbc:mariadb-java-client:3.4.1") + + // https://mvnrepository.com/artifact/io.github.cdimascio/dotenv-kotlin + implementation("io.github.cdimascio:dotenv-kotlin:6.4.1") + + testImplementation(kotlin("test")) +} + +tasks.test { + useJUnitPlatform() +} +kotlin { + jvmToolchain(21) +} diff --git a/src/main/kotlin/space/mori/chzzk_bot/Connector.kt b/common/src/main/kotlin/space/mori/chzzk_bot/common/Connector.kt similarity index 82% rename from src/main/kotlin/space/mori/chzzk_bot/Connector.kt rename to common/src/main/kotlin/space/mori/chzzk_bot/common/Connector.kt index bd763ef..8f8f7d3 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/Connector.kt +++ b/common/src/main/kotlin/space/mori/chzzk_bot/common/Connector.kt @@ -1,11 +1,16 @@ -package space.mori.chzzk_bot +package space.mori.chzzk_bot.common import com.zaxxer.hikari.HikariConfig import com.zaxxer.hikari.HikariDataSource +import io.github.cdimascio.dotenv.dotenv import org.jetbrains.exposed.sql.Database import org.jetbrains.exposed.sql.SchemaUtils import org.jetbrains.exposed.sql.transactions.transaction -import space.mori.chzzk_bot.models.* +import space.mori.chzzk_bot.common.models.* + +val dotenv = dotenv { + ignoreIfMissing = true +} object Connector { private val hikariConfig = HikariConfig().apply { diff --git a/src/main/kotlin/space/mori/chzzk_bot/models/Command.kt b/common/src/main/kotlin/space/mori/chzzk_bot/common/models/Command.kt similarity index 94% rename from src/main/kotlin/space/mori/chzzk_bot/models/Command.kt rename to common/src/main/kotlin/space/mori/chzzk_bot/common/models/Command.kt index 2cd8ce6..7a73deb 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/models/Command.kt +++ b/common/src/main/kotlin/space/mori/chzzk_bot/common/models/Command.kt @@ -1,4 +1,4 @@ -package space.mori.chzzk_bot.models +package space.mori.chzzk_bot.common.models import org.jetbrains.exposed.dao.IntEntity import org.jetbrains.exposed.dao.IntEntityClass diff --git a/src/main/kotlin/space/mori/chzzk_bot/models/Counter.kt b/common/src/main/kotlin/space/mori/chzzk_bot/common/models/Counter.kt similarity index 92% rename from src/main/kotlin/space/mori/chzzk_bot/models/Counter.kt rename to common/src/main/kotlin/space/mori/chzzk_bot/common/models/Counter.kt index 4fbc08b..d1a8308 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/models/Counter.kt +++ b/common/src/main/kotlin/space/mori/chzzk_bot/common/models/Counter.kt @@ -1,4 +1,4 @@ -package space.mori.chzzk_bot.models +package space.mori.chzzk_bot.common.models import org.jetbrains.exposed.dao.IntEntity import org.jetbrains.exposed.dao.IntEntityClass diff --git a/src/main/kotlin/space/mori/chzzk_bot/models/DailyCounters.kt b/common/src/main/kotlin/space/mori/chzzk_bot/common/models/DailyCounters.kt similarity index 94% rename from src/main/kotlin/space/mori/chzzk_bot/models/DailyCounters.kt rename to common/src/main/kotlin/space/mori/chzzk_bot/common/models/DailyCounters.kt index 04f051b..43cfb5e 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/models/DailyCounters.kt +++ b/common/src/main/kotlin/space/mori/chzzk_bot/common/models/DailyCounters.kt @@ -1,4 +1,4 @@ -package space.mori.chzzk_bot.models +package space.mori.chzzk_bot.common.models import org.jetbrains.exposed.dao.IntEntity import org.jetbrains.exposed.dao.IntEntityClass diff --git a/src/main/kotlin/space/mori/chzzk_bot/models/Manager.kt b/common/src/main/kotlin/space/mori/chzzk_bot/common/models/Manager.kt similarity index 94% rename from src/main/kotlin/space/mori/chzzk_bot/models/Manager.kt rename to common/src/main/kotlin/space/mori/chzzk_bot/common/models/Manager.kt index 238a1f6..9d55a0d 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/models/Manager.kt +++ b/common/src/main/kotlin/space/mori/chzzk_bot/common/models/Manager.kt @@ -1,4 +1,4 @@ -package space.mori.chzzk_bot.models +package space.mori.chzzk_bot.common.models import org.jetbrains.exposed.dao.IntEntity import org.jetbrains.exposed.dao.IntEntityClass diff --git a/src/main/kotlin/space/mori/chzzk_bot/models/PersonalCounter.kt b/common/src/main/kotlin/space/mori/chzzk_bot/common/models/PersonalCounter.kt similarity index 94% rename from src/main/kotlin/space/mori/chzzk_bot/models/PersonalCounter.kt rename to common/src/main/kotlin/space/mori/chzzk_bot/common/models/PersonalCounter.kt index 826e2b4..3ab2602 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/models/PersonalCounter.kt +++ b/common/src/main/kotlin/space/mori/chzzk_bot/common/models/PersonalCounter.kt @@ -1,4 +1,4 @@ -package space.mori.chzzk_bot.models +package space.mori.chzzk_bot.common.models import org.jetbrains.exposed.dao.IntEntity import org.jetbrains.exposed.dao.IntEntityClass diff --git a/src/main/kotlin/space/mori/chzzk_bot/models/User.kt b/common/src/main/kotlin/space/mori/chzzk_bot/common/models/User.kt similarity index 95% rename from src/main/kotlin/space/mori/chzzk_bot/models/User.kt rename to common/src/main/kotlin/space/mori/chzzk_bot/common/models/User.kt index 6aa65d7..cee84c3 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/models/User.kt +++ b/common/src/main/kotlin/space/mori/chzzk_bot/common/models/User.kt @@ -1,4 +1,4 @@ -package space.mori.chzzk_bot.models +package space.mori.chzzk_bot.common.models import org.jetbrains.exposed.dao.IntEntity import org.jetbrains.exposed.dao.IntEntityClass diff --git a/src/main/kotlin/space/mori/chzzk_bot/services/CommandService.kt b/common/src/main/kotlin/space/mori/chzzk_bot/common/services/CommandService.kt similarity index 90% rename from src/main/kotlin/space/mori/chzzk_bot/services/CommandService.kt rename to common/src/main/kotlin/space/mori/chzzk_bot/common/services/CommandService.kt index 9cc7f19..3dc4c49 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/services/CommandService.kt +++ b/common/src/main/kotlin/space/mori/chzzk_bot/common/services/CommandService.kt @@ -1,12 +1,12 @@ -package space.mori.chzzk_bot.services +package space.mori.chzzk_bot.common.services import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq import org.jetbrains.exposed.sql.and import org.jetbrains.exposed.sql.transactions.transaction import org.jetbrains.exposed.sql.update -import space.mori.chzzk_bot.models.Command -import space.mori.chzzk_bot.models.Commands -import space.mori.chzzk_bot.models.User +import space.mori.chzzk_bot.common.models.Command +import space.mori.chzzk_bot.common.models.Commands +import space.mori.chzzk_bot.common.models.User object CommandService { fun saveCommand(user: User, command: String, content: String, failContent: String): Command { diff --git a/src/main/kotlin/space/mori/chzzk_bot/services/CounterService.kt b/common/src/main/kotlin/space/mori/chzzk_bot/common/services/CounterService.kt similarity index 97% rename from src/main/kotlin/space/mori/chzzk_bot/services/CounterService.kt rename to common/src/main/kotlin/space/mori/chzzk_bot/common/services/CounterService.kt index ddea649..85cdba2 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/services/CounterService.kt +++ b/common/src/main/kotlin/space/mori/chzzk_bot/common/services/CounterService.kt @@ -1,8 +1,8 @@ -package space.mori.chzzk_bot.services +package space.mori.chzzk_bot.common.services import org.jetbrains.exposed.sql.and import org.jetbrains.exposed.sql.transactions.transaction -import space.mori.chzzk_bot.models.* +import space.mori.chzzk_bot.common.models.* import java.time.LocalDate object CounterService { diff --git a/src/main/kotlin/space/mori/chzzk_bot/services/ManagerService.kt b/common/src/main/kotlin/space/mori/chzzk_bot/common/services/ManagerService.kt similarity index 91% rename from src/main/kotlin/space/mori/chzzk_bot/services/ManagerService.kt rename to common/src/main/kotlin/space/mori/chzzk_bot/common/services/ManagerService.kt index b049c9f..49615f8 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/services/ManagerService.kt +++ b/common/src/main/kotlin/space/mori/chzzk_bot/common/services/ManagerService.kt @@ -1,11 +1,11 @@ -package space.mori.chzzk_bot.services +package space.mori.chzzk_bot.common.services import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq import org.jetbrains.exposed.sql.and import org.jetbrains.exposed.sql.transactions.transaction -import space.mori.chzzk_bot.models.Manager -import space.mori.chzzk_bot.models.Managers -import space.mori.chzzk_bot.models.User +import space.mori.chzzk_bot.common.models.Manager +import space.mori.chzzk_bot.common.models.Managers +import space.mori.chzzk_bot.common.models.User object ManagerService { fun saveManager(user: User, discordId: Long, name: String): Manager { diff --git a/src/main/kotlin/space/mori/chzzk_bot/services/UserService.kt b/common/src/main/kotlin/space/mori/chzzk_bot/common/services/UserService.kt similarity index 92% rename from src/main/kotlin/space/mori/chzzk_bot/services/UserService.kt rename to common/src/main/kotlin/space/mori/chzzk_bot/common/services/UserService.kt index ee83679..1e275c5 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/services/UserService.kt +++ b/common/src/main/kotlin/space/mori/chzzk_bot/common/services/UserService.kt @@ -1,10 +1,10 @@ -package space.mori.chzzk_bot.services +package space.mori.chzzk_bot.common.services import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq import org.jetbrains.exposed.sql.transactions.transaction import org.jetbrains.exposed.sql.update -import space.mori.chzzk_bot.models.User -import space.mori.chzzk_bot.models.Users +import space.mori.chzzk_bot.common.models.User +import space.mori.chzzk_bot.common.models.Users object UserService { fun saveUser(username: String, token: String, discordID: Long): User { diff --git a/gradle.properties b/gradle.properties index ac14cb4..34c6fb8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ kotlin.code.style=official group = space.mori -version = 1.0.3 +version = 1.1.0 org.gradle.jvmargs=-Dfile.encoding=UTF-8 org.gradle.console=plain diff --git a/settings.gradle.kts b/settings.gradle.kts index 7b9b8dd..9168bc6 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -14,6 +14,13 @@ pluginManagement { mavenCentral() gradlePluginPortal() maven { url = uri("https://maven.covers1624.net") } - maven { url = uri("https://repo.spring.io/plugins-release/") } + maven { url = uri("https://jitpack.io") } + } } +plugins { + id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" +} +include("common") +include("chatbot") +include("webserver") diff --git a/src/main/kotlin/space/mori/chzzk_bot/Main.kt b/src/main/kotlin/space/mori/chzzk_bot/Main.kt index d81e516..8af78b0 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/Main.kt +++ b/src/main/kotlin/space/mori/chzzk_bot/Main.kt @@ -5,9 +5,12 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.runBlocking import org.slf4j.Logger import org.slf4j.LoggerFactory -import space.mori.chzzk_bot.chzzk.ChzzkHandler -import space.mori.chzzk_bot.discord.Discord -import space.mori.chzzk_bot.chzzk.Connector as ChzzkConnector +import space.mori.chzzk_bot.chatbot.chzzk.ChzzkHandler +import space.mori.chzzk_bot.chatbot.discord.Discord +import space.mori.chzzk_bot.chatbot.chzzk.Connector as ChzzkConnector +import space.mori.chzzk_bot.common.Connector +import space.mori.chzzk_bot.webserver.start +import space.mori.chzzk_bot.webserver.stop import java.util.concurrent.TimeUnit import kotlin.system.exitProcess @@ -26,6 +29,7 @@ fun main(args: Array) { discord.enable() chzzkHandler.enable() chzzkHandler.runStreamInfo() + start() if(dotenv.get("RUN_AGENT", "false").toBoolean()) { runBlocking { @@ -36,6 +40,8 @@ fun main(args: Array) { Runtime.getRuntime().addShutdownHook(Thread { logger.info("Shutting down...") + stop() + chzzkHandler.stopStreamInfo() chzzkHandler.disable() discord.disable() diff --git a/webserver/build.gradle.kts b/webserver/build.gradle.kts new file mode 100644 index 0000000..ed4d4bb --- /dev/null +++ b/webserver/build.gradle.kts @@ -0,0 +1,45 @@ +plugins { + kotlin("jvm") + kotlin("plugin.serialization").version("2.0.0") +} + +group = project.rootProject.group +version = project.rootProject.version + +repositories { + mavenCentral() +} + +val ktorVersion = "2.3.12" + +dependencies { + implementation("io.ktor:ktor-server-core:$ktorVersion") + implementation("io.ktor:ktor-server-netty:$ktorVersion") + implementation("io.ktor:ktor-server-websockets:$ktorVersion") + implementation("io.ktor:ktor-server-swagger:$ktorVersion") + implementation("io.ktor:ktor-server-content-negotiation:$ktorVersion") + implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion") + implementation("io.ktor:ktor-server-cors:$ktorVersion") + implementation("io.ktor:ktor-server-swagger:$ktorVersion") + + implementation("io.swagger.codegen.v3:swagger-codegen-generators:1.0.50") + + // https://mvnrepository.com/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0-RC") + // https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-reflect + implementation("org.jetbrains.kotlin:kotlin-reflect:2.0.0") + + // https://mvnrepository.com/artifact/ch.qos.logback/logback-classic + implementation("ch.qos.logback:logback-classic:1.5.6") + + implementation(project(":common")) + + testImplementation(kotlin("test")) +} + +tasks.test { + useJUnitPlatform() +} +kotlin { + jvmToolchain(21) +} \ No newline at end of file diff --git a/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/Main.kt b/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/Main.kt new file mode 100644 index 0000000..10195e2 --- /dev/null +++ b/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/Main.kt @@ -0,0 +1,44 @@ +package space.mori.chzzk_bot.webserver + +import io.ktor.http.* +import io.ktor.serialization.kotlinx.json.* +import io.ktor.server.application.* +import io.ktor.server.engine.* +import io.ktor.server.netty.* +import io.ktor.server.plugins.contentnegotiation.* +import io.ktor.server.plugins.cors.routing.* +import io.ktor.server.plugins.swagger.* +import io.ktor.server.routing.* +import io.ktor.server.websocket.* +import kotlinx.serialization.json.Json +import space.mori.chzzk_bot.webserver.routes.apiRoutes + +val server = embeddedServer(Netty, port = 8080) { + install(WebSockets) + install(ContentNegotiation) { + json(Json { + prettyPrint = true + isLenient = true + }) + } + install(CORS) { + anyHost() + allowHeader(HttpHeaders.ContentType) + } + routing { + apiRoutes() + swaggerUI("swagger-ui/index.html", "openapi/documentation.yaml") { + options { + version = "1.1.0" + } + } + } +} + +fun start() { + server.start(wait = true) +} + +fun stop() { + server.stop() +} \ No newline at end of file diff --git a/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/routes/ApiRoutes.kt b/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/routes/ApiRoutes.kt new file mode 100644 index 0000000..44d544c --- /dev/null +++ b/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/routes/ApiRoutes.kt @@ -0,0 +1,19 @@ +package space.mori.chzzk_bot.webserver.routes + +import io.ktor.http.* +import io.ktor.server.application.* +import io.ktor.server.response.* +import io.ktor.server.routing.* + +fun Routing.apiRoutes() { + route("/") { + get { + call.respondText("Hello World!", status = HttpStatusCode.OK) + } + } + route("/health") { + get { + call.respondText("OK", status= HttpStatusCode.OK) + } + } +} \ No newline at end of file diff --git a/webserver/src/main/resources/openapi/documentation.yaml b/webserver/src/main/resources/openapi/documentation.yaml new file mode 100644 index 0000000..544971c --- /dev/null +++ b/webserver/src/main/resources/openapi/documentation.yaml @@ -0,0 +1,35 @@ +openapi: "3.1.0" +info: + title: "chzzk_bot API" + description: "chzzk_bot API" + version: "1.0.0" +servers: +- url: "http://localhost:8080" +paths: + /: + get: + summary: "Webroot" + description: "Main page of this api" + responses: + "200": + description: "OK" + content: + text/plain: + schema: + type: "string" + examples: + Example#1: + value: "Hello World!" + /health: + get: + description: "Health Check endpoint" + responses: + "200": + description: "OK" + content: + text/plain: + schema: + type: "string" + examples: + Example#1: + value: "OK" \ No newline at end of file