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