diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..082506d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,34 @@ +# Builder Stage +FROM ghcr.io/graalvm/graalvm-ce:latest AS builder + +# Install necessary tools +RUN gu install native-image + +# Set working directory +WORKDIR /app + +# Install dependencies +COPY build.gradle.kts settings.gradle.kts gradlew ./ +COPY gradle ./gradle +RUN ./gradlew --no-daemon dependencies + +# Copy the source code +COPY src ./src + +# Build the application +RUN ./gradlew nativeCompile + +# Runner Stage +FROM alpine:latest AS runner + +# Set working directory +WORKDIR /app + +# Copy the native image from the builder stage +COPY --from=builder /app/chzzk_bot . + +# Ensure the application binary is executable +RUN chmod +x /app/chzzk_bot + +# Run the application +CMD ["./chzzk_bot"] \ No newline at end of file diff --git a/docker-build.sh b/docker-build.sh new file mode 100755 index 0000000..8cb1772 --- /dev/null +++ b/docker-build.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +current_time=$(date +"%Y%m%d%H%M") +docker build -t dalbodeule/chzzkbot:latest -t dalbodeule/chzzkbot:$current_time --push . \ No newline at end of file diff --git a/get-metadata.sh b/get-metadata.sh new file mode 100755 index 0000000..66d350f --- /dev/null +++ b/get-metadata.sh @@ -0,0 +1,5 @@ +#!/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/resources/META-INF/native-image/reflect-config.json b/src/main/resources/META-INF/native-image/reflect-config.json index bf310b1..25b71f1 100644 --- a/src/main/resources/META-INF/native-image/reflect-config.json +++ b/src/main/resources/META-INF/native-image/reflect-config.json @@ -8,6 +8,9 @@ { "name":"[Lcom.zaxxer.hikari.util.ConcurrentBag$IConcurrentBagEntry;" }, +{ + "name":"[Ljava.lang.Object;" +}, { "name":"[Ljava.lang.String;" }, @@ -52,14 +55,81 @@ "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":[] }] @@ -92,14 +162,30 @@ "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, @@ -117,12 +203,19 @@ { "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" }, @@ -139,6 +232,10 @@ { "name":"java.lang.invoke.CallSite" }, +{ + "name":"java.lang.reflect.RecordComponent", + "methods":[{"name":"getName","parameterTypes":[] }, {"name":"getType","parameterTypes":[] }] +}, { "name":"java.net.NetPermission" }, @@ -182,6 +279,13 @@ { "name":"java.sql.Date" }, +{ + "name":"java.sql.ResultSet" +}, +{ + "name":"java.sql.SQLException", + "fields":[{"name":"next"}] +}, { "name":"java.util.Date" }, @@ -237,6 +341,15 @@ { "name":"jdk.internal.misc.Unsafe" }, +{ + "name":"kotlin.Any" +}, +{ + "name":"kotlin.Boolean" +}, +{ + "name":"kotlin.Int" +}, { "name":"kotlin.Metadata", "queryAllDeclaredMethods":true, @@ -246,6 +359,12 @@ "name":"kotlin.SafePublicationLazyImpl", "fields":[{"name":"_value"}] }, +{ + "name":"kotlin.String" +}, +{ + "name":"kotlin.Unit" +}, { "name":"kotlin.jvm.internal.DefaultConstructorMarker" }, @@ -253,6 +372,10 @@ "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"}] @@ -295,12 +418,29 @@ }, { "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":"onShutdown","parameterTypes":["net.dv8tion.jda.api.events.session.ShutdownEvent"] }, {"name":"onStatusChange","parameterTypes":["net.dv8tion.jda.api.events.StatusChangeEvent"] }] + "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 @@ -322,10 +462,34 @@ { "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":[] }] @@ -342,6 +506,14 @@ "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"] }] @@ -386,6 +558,10 @@ "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":[] }] @@ -394,6 +570,10 @@ "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":[] }] @@ -402,6 +582,10 @@ "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":[] }] @@ -463,5 +647,53 @@ { "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 index 7d430cd..fff97f2 100644 --- a/src/main/resources/META-INF/native-image/resource-config.json +++ b/src/main/resources/META-INF/native-image/resource-config.json @@ -12,10 +12,14 @@ "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" }, { @@ -24,6 +28,8 @@ "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" }, {