diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 74359b0..fba1aaf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -46,6 +46,7 @@ jobs: uses: docker/build-push-action@v2 with: context: . + platforms: linux/amd64,linux/arm64,linux/arm/v7 push: true tags: | ${{ secrets.DOCKER_USERNAME }}/chzzkbot:${{ env.DATETIME }} diff --git a/Dockerfile b/Dockerfile index ccf36a4..de1f4f8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ -# Stage 1: Build the executable with GraalVM -FROM gradle:jdk-21-and-22-graal as build +# Stage 1: Build the JAR file +FROM gradle:jdk21 as build WORKDIR /app @@ -8,20 +8,16 @@ COPY build.gradle.kts settings.gradle.kts gradlew gradle.properties ./ COPY gradle gradle COPY src src -# Build the project -RUN gradle nativeCompile +# Build the project using Gradle +RUN ./gradlew build -# Stage 2: Create a minimal Docker image and add the binary -FROM alpine:3.13 +# Stage 2: Run the JAR file using JDK 21 +FROM openjdk:21-jdk WORKDIR /app -# https://stackoverflow.com/a/77779723/11516704 -RUN apk add gcompat - -# Copy the executable from the build stage -COPY --from=build /app/build/native/nativeCompile/chzzk_bot . -COPY --from=build /app/build/native/nativeCompile/libjsound.so . +# Copy the JAR file from the build stage +COPY --from=build /app/build/libs/*.jar app.jar # Set the entry point -ENTRYPOINT ["./chzzk_bot"] \ No newline at end of file +ENTRYPOINT ["java", "-jar", "app.jar"] \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 8cf98d7..c2c12bd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,3 +1,5 @@ +import org.graalvm.buildtools.gradle.tasks.BuildNativeImageTask + plugins { val kotlinVersion = "2.0.0" @@ -104,3 +106,15 @@ tasks.withType { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } + +tasks.register("generateReflectConfig") { + group = "build" + description = "Generate GraalVM reflection configuration using agent" + mainClass = application.mainClass + + classpath = sourceSets["main"].runtimeClasspath + + jvmArgs( + "-agentlib:native-image-agent=config-output-dir=src/main/resources/META-INF/native-image" + ) +} \ No newline at end of file diff --git a/get-metadata.sh b/get-metadata.sh deleted file mode 100755 index 66d350f..0000000 --- a/get-metadata.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -export RUN_AGENT=true -./gradlew -Pagent run -./gradlew metadataCopy --task run --dir src/main/resources/META-INF/native-image \ No newline at end of file diff --git a/src/main/kotlin/space/mori/chzzk_bot/discord/Commands.kt b/src/main/kotlin/space/mori/chzzk_bot/discord/Commands.kt index 59a28c0..94c6b0a 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/discord/Commands.kt +++ b/src/main/kotlin/space/mori/chzzk_bot/discord/Commands.kt @@ -3,33 +3,9 @@ package space.mori.chzzk_bot.discord import net.dv8tion.jda.api.JDA import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent import net.dv8tion.jda.api.interactions.commands.build.CommandData -import org.reflections.Reflections - -@Target(AnnotationTarget.CLASS) -@Retention(AnnotationRetention.RUNTIME) -annotation class Command interface CommandInterface { val name: String fun run(event: SlashCommandInteractionEvent, bot: JDA): Unit val command: CommandData } - -fun getCommands(): List { - val commandList = mutableListOf() - - val packageName = "space.mori.chzzk_bot.discord.commands" - val reflections = Reflections(packageName) - val annotatedClasses = reflections.getTypesAnnotatedWith(Command::class.java) - - for(clazz in annotatedClasses) { - val obj = clazz.kotlin.objectInstance - if(obj is CommandInterface) { - commandList.add(obj) - } else { - throw IllegalStateException("${clazz.name} is not a CommandInterface") - } - } - - return commandList.toList() -} \ No newline at end of file diff --git a/src/main/kotlin/space/mori/chzzk_bot/discord/Discord.kt b/src/main/kotlin/space/mori/chzzk_bot/discord/Discord.kt index 765d3bd..04a153d 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/discord/Discord.kt +++ b/src/main/kotlin/space/mori/chzzk_bot/discord/Discord.kt @@ -8,17 +8,26 @@ import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEve import net.dv8tion.jda.api.hooks.ListenerAdapter import space.mori.chzzk_bot.dotenv import org.slf4j.LoggerFactory +import space.mori.chzzk_bot.discord.commands.* class Discord: ListenerAdapter() { private lateinit var bot: JDA private var guild: Guild? = null private val logger = LoggerFactory.getLogger(this::class.java) - private val commands = getCommands() + private val commands = listOf( + AddCommand, + PingCommand, + RegisterCommand, + RemoveCommand, + UpdateCommand, + ) override fun onSlashCommandInteraction(event: SlashCommandInteractionEvent) { event.deferReply().queue() - commands.find { it.name == event.name }?.run(event, bot) + val handler = commands.find { it.name == event.name } + logger.debug("Handler: ${handler?.name ?: "undefined"} command") + handler?.run(event, bot) } internal fun enable() { @@ -33,7 +42,10 @@ class Discord: ListenerAdapter() { bot.updateCommands() .addCommands(* commands.map { it.command }.toTypedArray()) - .onSuccess { logger.info("Command update success!") } + .onSuccess { + logger.info("Command update success!") + logger.debug("Command list: ${commands.joinToString("/ ") { it.name }}") + } .queue() diff --git a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/AddCommand.kt b/src/main/kotlin/space/mori/chzzk_bot/discord/commands/AddCommand.kt index 22409ef..4ddcb12 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/AddCommand.kt +++ b/src/main/kotlin/space/mori/chzzk_bot/discord/commands/AddCommand.kt @@ -8,12 +8,10 @@ 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.Command import space.mori.chzzk_bot.discord.CommandInterface import space.mori.chzzk_bot.services.CommandService import space.mori.chzzk_bot.services.UserService -@Command object AddCommand : CommandInterface { private val logger = LoggerFactory.getLogger(this::class.java) override val name: String = "add" diff --git a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/Ping.kt b/src/main/kotlin/space/mori/chzzk_bot/discord/commands/PingCommand.kt similarity index 87% rename from src/main/kotlin/space/mori/chzzk_bot/discord/commands/Ping.kt rename to src/main/kotlin/space/mori/chzzk_bot/discord/commands/PingCommand.kt index 9b217e6..939a7e3 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/Ping.kt +++ b/src/main/kotlin/space/mori/chzzk_bot/discord/commands/PingCommand.kt @@ -4,11 +4,9 @@ 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.Command import space.mori.chzzk_bot.discord.CommandInterface -@Command() -object Ping: CommandInterface { +object PingCommand: CommandInterface { private val logger = LoggerFactory.getLogger(this::class.java) override val name = "ping" override val command = Commands.slash(name, "봇이 살아있을까요?") diff --git a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/Register.kt b/src/main/kotlin/space/mori/chzzk_bot/discord/commands/RegisterCommand.kt similarity index 95% rename from src/main/kotlin/space/mori/chzzk_bot/discord/commands/Register.kt rename to src/main/kotlin/space/mori/chzzk_bot/discord/commands/RegisterCommand.kt index 4cdd4d0..4e2c604 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/Register.kt +++ b/src/main/kotlin/space/mori/chzzk_bot/discord/commands/RegisterCommand.kt @@ -8,12 +8,10 @@ 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.Command import space.mori.chzzk_bot.discord.CommandInterface import space.mori.chzzk_bot.services.UserService -@Command -object Register: CommandInterface { +object RegisterCommand: CommandInterface { private val logger = LoggerFactory.getLogger(this::class.java) override val name = "register" override val command = Commands.slash(name, "치지직 계정을 등록합니다.") diff --git a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/RemoveCommand.kt b/src/main/kotlin/space/mori/chzzk_bot/discord/commands/RemoveCommand.kt index 9d520ee..d16faad 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/RemoveCommand.kt +++ b/src/main/kotlin/space/mori/chzzk_bot/discord/commands/RemoveCommand.kt @@ -8,12 +8,10 @@ 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.Command import space.mori.chzzk_bot.discord.CommandInterface import space.mori.chzzk_bot.services.CommandService import space.mori.chzzk_bot.services.UserService -@Command object RemoveCommand : CommandInterface { private val logger = LoggerFactory.getLogger(this::class.java) override val name: String = "remove" diff --git a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/UpdateCommand.kt b/src/main/kotlin/space/mori/chzzk_bot/discord/commands/UpdateCommand.kt index fb92140..8a729d6 100644 --- a/src/main/kotlin/space/mori/chzzk_bot/discord/commands/UpdateCommand.kt +++ b/src/main/kotlin/space/mori/chzzk_bot/discord/commands/UpdateCommand.kt @@ -8,13 +8,10 @@ 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.Command import space.mori.chzzk_bot.discord.CommandInterface import space.mori.chzzk_bot.services.CommandService import space.mori.chzzk_bot.services.UserService -import xyz.r2turntrue.chzzk4j.types.channel.ChzzkChannel -@Command object UpdateCommand : CommandInterface { private val logger = LoggerFactory.getLogger(this::class.java) override val name: String = "update" diff --git a/src/main/resources/META-INF/native-image/jni-config.json b/src/main/resources/META-INF/native-image/jni-config.json deleted file mode 100644 index d3ab4ff..0000000 --- a/src/main/resources/META-INF/native-image/jni-config.json +++ /dev/null @@ -1,18 +0,0 @@ -[ -{ - "name":"java.lang.Boolean", - "methods":[{"name":"getBoolean","parameterTypes":["java.lang.String"] }] -}, -{ - "name":"java.lang.String", - "methods":[{"name":"lastIndexOf","parameterTypes":["int"] }, {"name":"substring","parameterTypes":["int"] }] -}, -{ - "name":"java.lang.System", - "methods":[{"name":"getProperty","parameterTypes":["java.lang.String"] }, {"name":"setProperty","parameterTypes":["java.lang.String","java.lang.String"] }] -}, -{ - "name":"space.mori.chzzk_bot.MainKt", - "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] -} -] \ No newline at end of file diff --git a/src/main/resources/META-INF/native-image/predefined-classes-config.json b/src/main/resources/META-INF/native-image/predefined-classes-config.json deleted file mode 100644 index 8478950..0000000 --- a/src/main/resources/META-INF/native-image/predefined-classes-config.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - { - "type":"agent-extracted", - "classes":[ - ] - } -] diff --git a/src/main/resources/META-INF/native-image/proxy-config.json b/src/main/resources/META-INF/native-image/proxy-config.json deleted file mode 100644 index fbfaf87..0000000 --- a/src/main/resources/META-INF/native-image/proxy-config.json +++ /dev/null @@ -1,5 +0,0 @@ -[ - { - "interfaces":["java.sql.Connection"] - } -] \ No newline at end of file diff --git a/src/main/resources/META-INF/native-image/reflect-config.json b/src/main/resources/META-INF/native-image/reflect-config.json deleted file mode 100644 index 45e0f13..0000000 --- a/src/main/resources/META-INF/native-image/reflect-config.json +++ /dev/null @@ -1,707 +0,0 @@ -[ -{ - "name":"[B" -}, -{ - "name":"[Lcom.fasterxml.jackson.databind.AbstractTypeResolver;" -}, -{ - "name":"[Lcom.zaxxer.hikari.util.ConcurrentBag$IConcurrentBagEntry;" -}, -{ - "name":"[Ljava.lang.Object;" -}, -{ - "name":"[Ljava.lang.String;" -}, -{ - "name":"[Ljava.sql.Statement;" -}, -{ - "name":"[Lnet.dv8tion.jda.api.entities.Guild;" -}, -{ - "name":"[Lnet.dv8tion.jda.api.entities.Member;" -}, -{ - "name":"[Lnet.dv8tion.jda.api.entities.Role;" -}, -{ - "name":"[Lnet.dv8tion.jda.api.entities.ScheduledEvent;" -}, -{ - "name":"[Lnet.dv8tion.jda.api.entities.User;" -}, -{ - "name":"[Lnet.dv8tion.jda.api.entities.emoji.RichCustomEmoji;" -}, -{ - "name":"[Lnet.dv8tion.jda.api.entities.sticker.GuildSticker;" -}, -{ - "name":"[Lnet.dv8tion.jda.api.managers.AudioManager;" -}, -{ - "name":"[Lsun.security.pkcs.SignerInfo;" -}, -{ - "name":"android.os.Build$VERSION" -}, -{ - "name":"apple.security.AppleProvider", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"ch.qos.logback.classic.BasicConfigurator", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"ch.qos.logback.classic.encoder.PatternLayoutEncoder", - "queryAllPublicMethods":true, - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"ch.qos.logback.classic.filter.ThresholdFilter", - "queryAllPublicMethods":true, - "methods":[{"name":"","parameterTypes":[] }, {"name":"setLevel","parameterTypes":["java.lang.String"] }] -}, -{ - "name":"ch.qos.logback.classic.joran.SerializedModelConfigurator", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"ch.qos.logback.classic.pattern.DateConverter", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"ch.qos.logback.classic.pattern.LevelConverter", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"ch.qos.logback.classic.pattern.LineSeparatorConverter", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"ch.qos.logback.classic.pattern.LoggerConverter", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"ch.qos.logback.classic.pattern.MessageConverter", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"ch.qos.logback.classic.pattern.ThreadConverter", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"ch.qos.logback.classic.util.DefaultJoranConfigurator", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"ch.qos.logback.core.ConsoleAppender", - "queryAllPublicMethods":true, - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"ch.qos.logback.core.OutputStreamAppender", - "methods":[{"name":"setEncoder","parameterTypes":["ch.qos.logback.core.encoder.Encoder"] }] -}, -{ - "name":"ch.qos.logback.core.UnsynchronizedAppenderBase", - "methods":[{"name":"addFilter","parameterTypes":["ch.qos.logback.core.filter.Filter"] }] -}, -{ - "name":"ch.qos.logback.core.encoder.Encoder", - "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }] -}, -{ - "name":"ch.qos.logback.core.encoder.LayoutWrappingEncoder", - "methods":[{"name":"setParent","parameterTypes":["ch.qos.logback.core.spi.ContextAware"] }] -}, -{ - "name":"ch.qos.logback.core.filter.Filter", - "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }] -}, -{ - "name":"ch.qos.logback.core.pattern.PatternLayoutEncoderBase", - "methods":[{"name":"setPattern","parameterTypes":["java.lang.String"] }] -}, -{ - "name":"ch.qos.logback.core.spi.ContextAware", - "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }] -}, -{ - "name":"com.fasterxml.jackson.databind.ext.Java7SupportImpl", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"com.sun.crypto.provider.AESCipher$General", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"com.sun.crypto.provider.ARCFOURCipher", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"com.sun.crypto.provider.ChaCha20Cipher$ChaCha20Poly1305", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"com.sun.crypto.provider.DESCipher", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"com.sun.crypto.provider.DESedeCipher", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"com.sun.crypto.provider.DHParameters", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"com.sun.crypto.provider.GaloisCounterMode$AESGCM", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"com.sun.crypto.provider.HmacCore$HmacSHA256", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"com.sun.crypto.provider.HmacCore$HmacSHA384", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"com.sun.crypto.provider.TlsKeyMaterialGenerator", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"com.sun.crypto.provider.TlsMasterSecretGenerator", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"com.sun.crypto.provider.TlsPrfGenerator$V12", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"com.zaxxer.hikari.HikariConfig", - "allDeclaredFields":true, - "queryAllPublicMethods":true, - "methods":[{"name":"getAllowPoolSuspension","parameterTypes":[] }, {"name":"getAutoCommit","parameterTypes":[] }, {"name":"getCatalog","parameterTypes":[] }, {"name":"getConnectionInitSql","parameterTypes":[] }, {"name":"getConnectionTestQuery","parameterTypes":[] }, {"name":"getConnectionTimeout","parameterTypes":[] }, {"name":"getDataSource","parameterTypes":[] }, {"name":"getDataSourceClassName","parameterTypes":[] }, {"name":"getDataSourceJNDI","parameterTypes":[] }, {"name":"getDataSourceProperties","parameterTypes":[] }, {"name":"getDriverClassName","parameterTypes":[] }, {"name":"getExceptionOverrideClassName","parameterTypes":[] }, {"name":"getHealthCheckProperties","parameterTypes":[] }, {"name":"getHealthCheckRegistry","parameterTypes":[] }, {"name":"getIdleTimeout","parameterTypes":[] }, {"name":"getInitializationFailTimeout","parameterTypes":[] }, {"name":"getIsolateInternalQueries","parameterTypes":[] }, {"name":"getJdbcUrl","parameterTypes":[] }, {"name":"getKeepaliveTime","parameterTypes":[] }, {"name":"getLeakDetectionThreshold","parameterTypes":[] }, {"name":"getMaxLifetime","parameterTypes":[] }, {"name":"getMaximumPoolSize","parameterTypes":[] }, {"name":"getMetricRegistry","parameterTypes":[] }, {"name":"getMetricsTrackerFactory","parameterTypes":[] }, {"name":"getMinimumIdle","parameterTypes":[] }, {"name":"getPassword","parameterTypes":[] }, {"name":"getPoolName","parameterTypes":[] }, {"name":"getReadOnly","parameterTypes":[] }, {"name":"getRegisterMbeans","parameterTypes":[] }, {"name":"getScheduledExecutor","parameterTypes":[] }, {"name":"getSchema","parameterTypes":[] }, {"name":"getThreadFactory","parameterTypes":[] }, {"name":"getTransactionIsolation","parameterTypes":[] }, {"name":"getUsername","parameterTypes":[] }, {"name":"getValidationTimeout","parameterTypes":[] }, {"name":"isAllowPoolSuspension","parameterTypes":[] }, {"name":"isAutoCommit","parameterTypes":[] }, {"name":"isIsolateInternalQueries","parameterTypes":[] }, {"name":"isReadOnly","parameterTypes":[] }, {"name":"isRegisterMbeans","parameterTypes":[] }, {"name":"setAllowPoolSuspension","parameterTypes":["boolean"] }, {"name":"setAutoCommit","parameterTypes":["boolean"] }, {"name":"setCatalog","parameterTypes":["java.lang.String"] }, {"name":"setClass","parameterTypes":["java.lang.Class"] }, {"name":"setConnectionInitSql","parameterTypes":["java.lang.String"] }, {"name":"setConnectionTestQuery","parameterTypes":["java.lang.String"] }, {"name":"setConnectionTimeout","parameterTypes":["long"] }, {"name":"setDataSource","parameterTypes":["javax.sql.DataSource"] }, {"name":"setDataSourceClassName","parameterTypes":["java.lang.String"] }, {"name":"setDataSourceJNDI","parameterTypes":["java.lang.String"] }, {"name":"setDataSourceProperties","parameterTypes":["java.util.Properties"] }, {"name":"setDriverClassName","parameterTypes":["java.lang.String"] }, {"name":"setExceptionOverrideClassName","parameterTypes":["java.lang.String"] }, {"name":"setHealthCheckProperties","parameterTypes":["java.util.Properties"] }, {"name":"setHealthCheckRegistry","parameterTypes":["java.lang.Object"] }, {"name":"setIdleTimeout","parameterTypes":["long"] }, {"name":"setInitializationFailTimeout","parameterTypes":["long"] }, {"name":"setIsolateInternalQueries","parameterTypes":["boolean"] }, {"name":"setJdbcUrl","parameterTypes":["java.lang.String"] }, {"name":"setKeepaliveTime","parameterTypes":["long"] }, {"name":"setLeakDetectionThreshold","parameterTypes":["long"] }, {"name":"setMaxLifetime","parameterTypes":["long"] }, {"name":"setMaximumPoolSize","parameterTypes":["int"] }, {"name":"setMetricRegistry","parameterTypes":["java.lang.Object"] }, {"name":"setMetricsTrackerFactory","parameterTypes":["com.zaxxer.hikari.metrics.MetricsTrackerFactory"] }, {"name":"setMinimumIdle","parameterTypes":["int"] }, {"name":"setPassword","parameterTypes":["java.lang.String"] }, {"name":"setPoolName","parameterTypes":["java.lang.String"] }, {"name":"setReadOnly","parameterTypes":["boolean"] }, {"name":"setRegisterMbeans","parameterTypes":["boolean"] }, {"name":"setScheduledExecutor","parameterTypes":["java.util.concurrent.ScheduledExecutorService"] }, {"name":"setSchema","parameterTypes":["java.lang.String"] }, {"name":"setThreadFactory","parameterTypes":["java.util.concurrent.ThreadFactory"] }, {"name":"setTransactionIsolation","parameterTypes":["java.lang.String"] }, {"name":"setUsername","parameterTypes":["java.lang.String"] }, {"name":"setValidationTimeout","parameterTypes":["long"] }] -}, -{ - "name":"com.zaxxer.hikari.pool.PoolBase", - "fields":[{"name":"catalog"}] -}, -{ - "name":"com.zaxxer.hikari.pool.PoolEntry", - "fields":[{"name":"state"}] -}, -{ - "name":"java.io.FilePermission" -}, -{ - "name":"java.lang.Class", - "methods":[{"name":"getPermittedSubclasses","parameterTypes":[] }, {"name":"getRecordComponents","parameterTypes":[] }, {"name":"isRecord","parameterTypes":[] }, {"name":"isSealed","parameterTypes":[] }] -}, -{ - "name":"java.lang.ClassValue" -}, -{ - "name":"java.lang.Module" -}, -{ - "name":"java.lang.Object" -}, -{ - "name":"java.lang.RuntimePermission" -}, -{ - "name":"java.lang.String" -}, -{ - "name":"java.lang.StringBuilder" -}, -{ - "name":"java.lang.Thread", - "fields":[{"name":"threadLocalRandomProbe"}] -}, -{ - "name":"java.lang.invoke.CallSite" -}, -{ - "name":"java.lang.reflect.RecordComponent", - "methods":[{"name":"getName","parameterTypes":[] }, {"name":"getType","parameterTypes":[] }] -}, -{ - "name":"java.net.NetPermission" -}, -{ - "name":"java.net.SocketPermission" -}, -{ - "name":"java.net.URLPermission", - "methods":[{"name":"","parameterTypes":["java.lang.String","java.lang.String"] }] -}, -{ - "name":"java.nio.Buffer" -}, -{ - "name":"java.security.AlgorithmParametersSpi" -}, -{ - "name":"java.security.AllPermission" -}, -{ - "name":"java.security.KeyStoreSpi" -}, -{ - "name":"java.security.SecureRandomParameters" -}, -{ - "name":"java.security.SecurityPermission" -}, -{ - "name":"java.security.interfaces.ECPrivateKey" -}, -{ - "name":"java.security.interfaces.ECPublicKey" -}, -{ - "name":"java.security.interfaces.RSAPrivateKey" -}, -{ - "name":"java.security.interfaces.RSAPublicKey" -}, -{ - "name":"java.sql.Date" -}, -{ - "name":"java.sql.ResultSet" -}, -{ - "name":"java.sql.SQLException", - "fields":[{"name":"next"}] -}, -{ - "name":"java.util.Date" -}, -{ - "name":"java.util.List", - "methods":[{"name":"copyOf","parameterTypes":["java.util.Collection"] }] -}, -{ - "name":"java.util.Optional", - "methods":[{"name":"isEmpty","parameterTypes":[] }] -}, -{ - "name":"java.util.PropertyPermission" -}, -{ - "name":"java.util.concurrent.ForkJoinTask", - "fields":[{"name":"aux"}, {"name":"status"}] -}, -{ - "name":"java.util.concurrent.atomic.AtomicBoolean", - "fields":[{"name":"value"}] -}, -{ - "name":"java.util.concurrent.atomic.AtomicReference", - "fields":[{"name":"value"}] -}, -{ - "name":"java.util.concurrent.atomic.Striped64", - "fields":[{"name":"base"}, {"name":"cellsBusy"}] -}, -{ - "name":"java.util.function.Function" -}, -{ - "name":"java.util.zip.DeflaterInputStream" -}, -{ - "name":"javax.net.ssl.SNIHostName", - "methods":[{"name":"","parameterTypes":["java.lang.String"] }] -}, -{ - "name":"javax.net.ssl.SSLParameters", - "methods":[{"name":"setServerNames","parameterTypes":["java.util.List"] }] -}, -{ - "name":"javax.security.auth.x500.X500Principal", - "fields":[{"name":"thisX500Name"}], - "methods":[{"name":"","parameterTypes":["sun.security.x509.X500Name"] }] -}, -{ - "name":"javax.smartcardio.CardPermission" -}, -{ - "name":"jdk.internal.misc.Unsafe" -}, -{ - "name":"kotlin.Any" -}, -{ - "name":"kotlin.Boolean" -}, -{ - "name":"kotlin.Int" -}, -{ - "name":"kotlin.Metadata", - "queryAllDeclaredMethods":true, - "methods":[{"name":"bv","parameterTypes":[] }, {"name":"d1","parameterTypes":[] }, {"name":"d2","parameterTypes":[] }, {"name":"k","parameterTypes":[] }, {"name":"mv","parameterTypes":[] }, {"name":"pn","parameterTypes":[] }, {"name":"xi","parameterTypes":[] }, {"name":"xs","parameterTypes":[] }] -}, -{ - "name":"kotlin.SafePublicationLazyImpl", - "fields":[{"name":"_value"}] -}, -{ - "name":"kotlin.String" -}, -{ - "name":"kotlin.Unit" -}, -{ - "name":"kotlin.jvm.internal.DefaultConstructorMarker" -}, -{ - "name":"kotlin.reflect.jvm.internal.ReflectionFactoryImpl", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"kotlin.reflect.jvm.internal.impl.resolve.scopes.DescriptorKindFilter", - "allPublicFields":true -}, -{ - "name":"kotlinx.coroutines.CancellableContinuationImpl", - "fields":[{"name":"_decisionAndIndex$volatile"}, {"name":"_parentHandle$volatile"}, {"name":"_state$volatile"}] -}, -{ - "name":"kotlinx.coroutines.CompletedExceptionally", - "fields":[{"name":"_handled$volatile"}] -}, -{ - "name":"kotlinx.coroutines.EventLoopImplBase", - "fields":[{"name":"_delayed$volatile"}, {"name":"_isCompleted$volatile"}, {"name":"_queue$volatile"}] -}, -{ - "name":"kotlinx.coroutines.JobSupport", - "fields":[{"name":"_parentHandle$volatile"}, {"name":"_state$volatile"}] -}, -{ - "name":"kotlinx.coroutines.JobSupport$Finishing", - "fields":[{"name":"_exceptionsHolder$volatile"}, {"name":"_isCompleting$volatile"}, {"name":"_rootCause$volatile"}] -}, -{ - "name":"kotlinx.coroutines.internal.DispatchedContinuation", - "fields":[{"name":"_reusableCancellableContinuation$volatile"}] -}, -{ - "name":"kotlinx.coroutines.internal.LimitedDispatcher", - "fields":[{"name":"runningWorkers$volatile"}] -}, -{ - "name":"kotlinx.coroutines.internal.LockFreeLinkedListNode", - "fields":[{"name":"_next$volatile"}, {"name":"_prev$volatile"}, {"name":"_removedRef$volatile"}] -}, -{ - "name":"kotlinx.coroutines.internal.LockFreeTaskQueue", - "fields":[{"name":"_cur$volatile"}] -}, -{ - "name":"kotlinx.coroutines.internal.LockFreeTaskQueueCore", - "fields":[{"name":"_next$volatile"}, {"name":"_state$volatile"}] -}, -{ - "name":"kotlinx.coroutines.internal.ThreadSafeHeap", - "fields":[{"name":"_size$volatile"}] -}, -{ - "name":"kotlinx.coroutines.scheduling.CoroutineScheduler", - "fields":[{"name":"_isTerminated$volatile"}, {"name":"controlState$volatile"}, {"name":"parkedWorkersStack$volatile"}] -}, -{ - "name":"net.dv8tion.jda.api.hooks.ListenerAdapter", - "methods":[{"name":"onGatewayPing","parameterTypes":["net.dv8tion.jda.api.events.GatewayPingEvent"] }, {"name":"onGenericGuild","parameterTypes":["net.dv8tion.jda.api.events.guild.GenericGuildEvent"] }, {"name":"onGenericSession","parameterTypes":["net.dv8tion.jda.api.events.session.GenericSessionEvent"] }, {"name":"onGuildReady","parameterTypes":["net.dv8tion.jda.api.events.guild.GuildReadyEvent"] }, {"name":"onHttpRequest","parameterTypes":["net.dv8tion.jda.api.events.http.HttpRequestEvent"] }, {"name":"onReady","parameterTypes":["net.dv8tion.jda.api.events.session.ReadyEvent"] }, {"name":"onSessionDisconnect","parameterTypes":["net.dv8tion.jda.api.events.session.SessionDisconnectEvent"] }, {"name":"onSessionResume","parameterTypes":["net.dv8tion.jda.api.events.session.SessionResumeEvent"] }, {"name":"onShutdown","parameterTypes":["net.dv8tion.jda.api.events.session.ShutdownEvent"] }, {"name":"onStatusChange","parameterTypes":["net.dv8tion.jda.api.events.StatusChangeEvent"] }] -}, -{ - "name":"net.dv8tion.jda.internal.utils.FallbackLogger", - "methods":[{"name":"","parameterTypes":["java.lang.String"] }] -}, -{ - "name":"org.jetbrains.exposed.dao.id.EntityID" -}, -{ - "name":"org.jetbrains.exposed.sql.ColumnType", - "methods":[{"name":"getNullable","parameterTypes":[] }, {"name":"setNullable","parameterTypes":["boolean"] }] -}, -{ - "name":"org.jetbrains.exposed.sql.IColumnType" -}, -{ - "name":"org.jetbrains.exposed.sql.IntegerColumnType", - "methods":[{"name":"","parameterTypes":[] }, {"name":"getNullable","parameterTypes":[] }, {"name":"setNullable","parameterTypes":["boolean"] }] -}, -{ - "name":"org.jetbrains.exposed.sql.statements.api.PreparedStatementApi" -}, -{ - "name":"org.mariadb.jdbc.Configuration", - "allDeclaredFields":true -}, -{ - "name":"org.mariadb.jdbc.Configuration$Builder", - "allDeclaredFields":true -}, -{ - "name":"org.mariadb.jdbc.Driver", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"org.slf4j.LoggerFactory" -}, -{ - "name":"org.slf4j.spi.SLF4JServiceProvider" -}, -{ - "name":"space.mori.chzzk_bot.discord.CommandInterface" -}, -{ - "name":"space.mori.chzzk_bot.discord.commands.AddCommand", - "fields":[{"name":"INSTANCE"}] -}, -{ - "name":"space.mori.chzzk_bot.discord.commands.Ping", - "fields":[{"name":"INSTANCE"}] -}, -{ - "name":"space.mori.chzzk_bot.discord.commands.Register", - "fields":[{"name":"INSTANCE"}] -}, -{ - "name":"space.mori.chzzk_bot.discord.commands.RemoveCommand", - "fields":[{"name":"INSTANCE"}] -}, -{ - "name":"space.mori.chzzk_bot.discord.commands.UpdateCommand", - "fields":[{"name":"INSTANCE"}] -}, -{ - "name":"space.mori.chzzk_bot.models.Command", - "methods":[{"name":"","parameterTypes":["org.jetbrains.exposed.dao.id.EntityID"] }] -}, -{ - "name":"space.mori.chzzk_bot.models.User", - "methods":[{"name":"","parameterTypes":["org.jetbrains.exposed.dao.id.EntityID"] }] -}, -{ - "name":"sun.security.pkcs12.PKCS12KeyStore", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.pkcs12.PKCS12KeyStore$DualFormatPKCS12", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.provider.DSA$SHA224withDSA", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.provider.DSA$SHA256withDSA", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.provider.JavaKeyStore$DualFormatJKS", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.provider.JavaKeyStore$JKS", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.provider.NativePRNG", - "methods":[{"name":"","parameterTypes":[] }, {"name":"","parameterTypes":["java.security.SecureRandomParameters"] }] -}, -{ - "name":"sun.security.provider.SHA", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.provider.SHA2$SHA224", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.provider.SHA2$SHA256", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.provider.SHA5$SHA384", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.provider.SHA5$SHA512", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.provider.X509Factory", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.provider.certpath.PKIXCertPathValidator", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.rsa.PSSParameters", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.rsa.RSAKeyFactory$Legacy", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.rsa.RSAPSSSignature", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.rsa.RSASignature$SHA1withRSA", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.rsa.RSASignature$SHA224withRSA", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.rsa.RSASignature$SHA256withRSA", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.rsa.RSASignature$SHA384withRSA", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.ssl.KeyManagerFactoryImpl$SunX509", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.ssl.SSLContextImpl$DefaultSSLContext", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.ssl.SSLContextImpl$TLS12Context", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.ssl.SSLContextImpl$TLSContext", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.ssl.TrustManagerFactoryImpl$PKIXFactory", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.util.ObjectIdentifier" -}, -{ - "name":"sun.security.x509.AuthorityInfoAccessExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, -{ - "name":"sun.security.x509.AuthorityKeyIdentifierExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, -{ - "name":"sun.security.x509.BasicConstraintsExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, -{ - "name":"sun.security.x509.CRLDistributionPointsExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, -{ - "name":"sun.security.x509.CertificateExtensions" -}, -{ - "name":"sun.security.x509.CertificatePoliciesExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, -{ - "name":"sun.security.x509.ExtendedKeyUsageExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, -{ - "name":"sun.security.x509.IssuerAlternativeNameExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, -{ - "name":"sun.security.x509.KeyUsageExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, -{ - "name":"sun.security.x509.NetscapeCertTypeExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, -{ - "name":"sun.security.x509.PrivateKeyUsageExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, -{ - "name":"sun.security.x509.SubjectAlternativeNameExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, -{ - "name":"sun.security.x509.SubjectKeyIdentifierExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, -{ - "name":"xyz.r2turntrue.chzzk4j.chat.WsMessageBase", - "allDeclaredFields":true -}, -{ - "name":"xyz.r2turntrue.chzzk4j.chat.WsMessageClientboundConnected", - "allDeclaredFields":true, - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"xyz.r2turntrue.chzzk4j.chat.WsMessageClientboundConnected$Body", - "allDeclaredFields":true, - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"xyz.r2turntrue.chzzk4j.chat.WsMessageServerboundConnect", - "allDeclaredFields":true, - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"xyz.r2turntrue.chzzk4j.chat.WsMessageServerboundConnect$Body", - "allDeclaredFields":true, - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"xyz.r2turntrue.chzzk4j.types.ChzzkUser", - "allDeclaredFields":true, - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"xyz.r2turntrue.chzzk4j.types.channel.ChzzkChannel", - "allDeclaredFields":true, - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"xyz.r2turntrue.chzzk4j.types.channel.ChzzkChannelFollowingData", - "allDeclaredFields":true, - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"xyz.r2turntrue.chzzk4j.types.channel.ChzzkChannelPersonalData", - "allDeclaredFields":true, - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"xyz.r2turntrue.chzzk4j.types.channel.ChzzkPartialChannel", - "allDeclaredFields":true -} -] \ No newline at end of file diff --git a/src/main/resources/META-INF/native-image/resource-config.json b/src/main/resources/META-INF/native-image/resource-config.json deleted file mode 100644 index fff97f2..0000000 --- a/src/main/resources/META-INF/native-image/resource-config.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "resources":{ - "includes":[{ - "pattern":"\\QMETA-INF/services/ch.qos.logback.classic.spi.Configurator\\E" - }, { - "pattern":"\\QMETA-INF/services/java.lang.System$LoggerFinder\\E" - }, { - "pattern":"\\QMETA-INF/services/java.net.spi.InetAddressResolverProvider\\E" - }, { - "pattern":"\\QMETA-INF/services/java.net.spi.URLStreamHandlerProvider\\E" - }, { - "pattern":"\\QMETA-INF/services/java.sql.Driver\\E" - }, { - "pattern":"\\QMETA-INF/services/java.time.zone.ZoneRulesProvider\\E" - }, { - "pattern":"\\QMETA-INF/services/javax.xml.parsers.SAXParserFactory\\E" - }, { - "pattern":"\\QMETA-INF/services/kotlin.reflect.jvm.internal.impl.resolve.ExternalOverridabilityCondition\\E" - }, { - "pattern":"\\QMETA-INF/services/kotlin.reflect.jvm.internal.impl.util.ModuleVisibilityHelper\\E" - }, { - "pattern":"\\QMETA-INF/services/org.jetbrains.exposed.dao.id.EntityIDFactory\\E" - }, { - "pattern":"\\QMETA-INF/services/org.jetbrains.exposed.sql.DatabaseConnectionAutoRegistration\\E" - }, { - "pattern":"\\QMETA-INF/services/org.jetbrains.exposed.sql.statements.GlobalStatementInterceptor\\E" - }, { - "pattern":"\\QMETA-INF/services/org.mariadb.jdbc.plugin.Codec\\E" - }, { - "pattern":"\\QMETA-INF/services/org.slf4j.spi.SLF4JServiceProvider\\E" - }, { - "pattern":"\\Qkotlin/kotlin.kotlin_builtins\\E" - }, { - "pattern":"\\Qlogback-test.scmo\\E" - }, { - "pattern":"\\Qlogback-test.xml\\E" - }, { - "pattern":"\\Qlogback.scmo\\E" - }, { - "pattern":"\\Qlogback.xml\\E" - }, { - "pattern":"\\Qmariadb.properties\\E" - }, { - "pattern":"\\Qspace/mori/chzzk_bot/discord/commands\\E" - }, { - "pattern":"java.base:\\Qjdk/internal/icu/impl/data/icudt72b/nfc.nrm\\E" - }, { - "pattern":"java.base:\\Qjdk/internal/icu/impl/data/icudt72b/nfkc.nrm\\E" - }, { - "pattern":"java.base:\\Qjdk/internal/icu/impl/data/icudt72b/uprops.icu\\E" - }, { - "pattern":"java.base:\\Qsun/net/idn/uidna.spp\\E" - }]}, - "bundles":[] -} \ No newline at end of file diff --git a/src/main/resources/META-INF/native-image/serialization-config.json b/src/main/resources/META-INF/native-image/serialization-config.json deleted file mode 100644 index d0304f2..0000000 --- a/src/main/resources/META-INF/native-image/serialization-config.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "types":[ - ], - "lambdaCapturingTypes":[ - ], - "proxies":[ - ] -} \ No newline at end of file