diff --git a/build.gradle.kts b/build.gradle.kts index 016d403..fa28a2f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,70 +1,51 @@ -import org.jetbrains.kotlin.gradle.dsl.JvmTarget -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile - plugins { id("java") kotlin("jvm") version "2.0.20" - id("com.gradleup.shadow") version "8.3.0" } -group = "net.wh64" -version = "1.0-SNAPSHOT" +group = property("group")!! +version = property("version")!! val ktor_version: String by project val log4j_version: String by project val exposed_version: String by project -java { - toolchain { - languageVersion.set(JavaLanguageVersion.of(21)) - } +allprojects { + apply(plugin = "java") + apply(plugin = "org.jetbrains.kotlin.jvm") - sourceCompatibility = JavaVersion.VERSION_21 - targetCompatibility = JavaVersion.VERSION_21 -} - -repositories { - mavenCentral() -} - -dependencies { - implementation(kotlin("stdlib")) - implementation(kotlin("reflect")) - implementation("net.dv8tion:JDA:5.1.0") - implementation("io.ktor:ktor-client-cio:$ktor_version") - implementation("io.ktor:ktor-client-core:$ktor_version") - implementation("org.apache.logging.log4j:log4j-api:$log4j_version") - implementation("org.apache.logging.log4j:log4j-core:$log4j_version") - implementation("org.jetbrains.exposed:exposed-core:$exposed_version") - implementation("org.jetbrains.exposed:exposed-jdbc:$exposed_version") - implementation("org.apache.logging.log4j:log4j-slf4j2-impl:$log4j_version") - implementation("io.ktor:ktor-client-okhttp-jvm:2.3.12") -// testImplementation(platform("org.junit:junit-bom:5.10.0")) -// testImplementation("org.junit.jupiter:junit-jupiter") -} - -tasks { - test { - useJUnitPlatform() - } - - withType { - options.encoding = "UTF-8" - } - - withType { - compilerOptions { - jvmTarget.set(JvmTarget.JVM_21) + java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(21)) } + + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } - shadowJar { - archiveBaseName.set(project.name) - archiveClassifier.set("") - archiveVersion.set("") - - manifest { - attributes["Main-Class"] = "net.projecttl.p.x32.Px32" - } + repositories { + mavenCentral() } } + +subprojects { + dependencies { + implementation(kotlin("stdlib")) + implementation(kotlin("reflect")) + implementation("net.dv8tion:JDA:5.1.0") + implementation("io.ktor:ktor-client-cio:$ktor_version") + implementation("io.ktor:ktor-client-core:$ktor_version") + implementation("org.apache.logging.log4j:log4j-api:$log4j_version") + implementation("org.apache.logging.log4j:log4j-core:$log4j_version") + implementation("org.jetbrains.exposed:exposed-core:$exposed_version") + implementation("org.jetbrains.exposed:exposed-jdbc:$exposed_version") + implementation("org.apache.logging.log4j:log4j-slf4j2-impl:$log4j_version") + implementation("io.ktor:ktor-client-okhttp-jvm:2.3.12") + testImplementation(platform("org.junit:junit-bom:5.10.0")) + testImplementation("org.junit.jupiter:junit-jupiter") + } +} + +tasks.test { + useJUnitPlatform() +} diff --git a/gradle.properties b/gradle.properties index b3b29dc..787bb7d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,9 @@ +kotlin.code.style=official +org.gradle.jvmargs=-Xmx2048M -Dfile.encoding=UTF-8 + +group=net.projecttl +version=0.1.0-SNAPSHOT + ktor_version=2.3.12 log4j_version=2.23.1 exposed_version=0.54.0 diff --git a/px32-bot-api/build.gradle.kts b/px32-bot-api/build.gradle.kts new file mode 100644 index 0000000..2da79c1 --- /dev/null +++ b/px32-bot-api/build.gradle.kts @@ -0,0 +1,15 @@ +plugins { + id("java") +} + +group = rootProject.group +version = rootProject.version + +dependencies { + testImplementation(platform("org.junit:junit-bom:5.10.0")) + testImplementation("org.junit.jupiter:junit-jupiter") +} + +tasks.test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/px32-bot-core/build.gradle.kts b/px32-bot-core/build.gradle.kts new file mode 100644 index 0000000..8f676dd --- /dev/null +++ b/px32-bot-core/build.gradle.kts @@ -0,0 +1,14 @@ +plugins { + id("java") +} + +group = rootProject.group +version = rootProject.version + +repositories { + mavenCentral() +} + +tasks.test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/px32-bot-core/src/main/java/net/wh64/p/x32/KernelCore.java b/px32-bot-core/src/main/java/net/wh64/p/x32/KernelCore.java new file mode 100644 index 0000000..884cc76 --- /dev/null +++ b/px32-bot-core/src/main/java/net/wh64/p/x32/KernelCore.java @@ -0,0 +1,18 @@ +package net.wh64.p.x32; + +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.JDABuilder; + +public class KernelCore { + private final JDABuilder builder; + + public KernelCore(String token) { + this.builder = JDABuilder.createDefault(token); + } + + public JDA build() { + JDA jda = builder.build(); + + return jda; + } +} diff --git a/px32-bot-core/src/main/kotlin/net/wh64/p/x32/GlobalCommandHandler.kt b/px32-bot-core/src/main/kotlin/net/wh64/p/x32/GlobalCommandHandler.kt new file mode 100644 index 0000000..388d235 --- /dev/null +++ b/px32-bot-core/src/main/kotlin/net/wh64/p/x32/GlobalCommandHandler.kt @@ -0,0 +1,5 @@ +package net.wh64.p.x32 + +class GlobalCommandHandler { + +} \ No newline at end of file diff --git a/px32-bot-core/src/main/kotlin/net/wh64/p/x32/SlashCommandExecutor.kt b/px32-bot-core/src/main/kotlin/net/wh64/p/x32/SlashCommandExecutor.kt new file mode 100644 index 0000000..8139280 --- /dev/null +++ b/px32-bot-core/src/main/kotlin/net/wh64/p/x32/SlashCommandExecutor.kt @@ -0,0 +1,39 @@ +package net.wh64.p.x32 + +import net.dv8tion.jda.api.events.interaction.command.MessageContextInteractionEvent +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent +import net.dv8tion.jda.api.events.interaction.command.UserContextInteractionEvent +import net.dv8tion.jda.api.interactions.commands.build.CommandData + +interface SlashCommandExecutor { + val data: CommandData + fun execute(ev: SlashCommandInteractionEvent) +} + +interface UserContextExecutor { + val data: CommandData + fun execute(ev: UserContextInteractionEvent) +} + +interface MessageContextExecutor { + val data: CommandData + fun execute(ev: MessageContextInteractionEvent) +} + +abstract class CommandAdapter : SlashCommandExecutor, UserContextExecutor, MessageContextExecutor { + abstract override val data: CommandData + + override fun execute(ev: SlashCommandInteractionEvent) { + executor(ev) + } + + override fun execute(ev: UserContextInteractionEvent) { + executor(ev) + } + + override fun execute(ev: MessageContextInteractionEvent) { + executor(ev) + } + + abstract fun executor(ev: Any) +} diff --git a/px32-bot-runner/build.gradle.kts b/px32-bot-runner/build.gradle.kts new file mode 100644 index 0000000..e162800 --- /dev/null +++ b/px32-bot-runner/build.gradle.kts @@ -0,0 +1,31 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + id("com.gradleup.shadow") version "8.3.0" +} + +group = rootProject.group +version = rootProject.version + +tasks { + test { + useJUnitPlatform() + } + + processResources { + filesMatching("default.properties") { + expand(project.properties) + } + } + + withType { + options.encoding = "UTF-8" + } + + withType { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_21) + } + } +} \ No newline at end of file diff --git a/px32-bot-runner/src/main/java/net/projecttl/p/x32/exec/Px32.java b/px32-bot-runner/src/main/java/net/projecttl/p/x32/exec/Px32.java new file mode 100644 index 0000000..f00177c --- /dev/null +++ b/px32-bot-runner/src/main/java/net/projecttl/p/x32/exec/Px32.java @@ -0,0 +1,20 @@ +package net.projecttl.p.x32.exec; + +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.JDABuilder; +import net.projecttl.p.x32.exec.config.DefaultConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Px32 { + public static final Logger log = LoggerFactory.getLogger(Px32.class); + private static JDA jda; + + public static void main(String[] args) { + JDABuilder builder = JDABuilder.createDefault(System.getenv("BOT_TOKEN")); + log.info("Px32 {}", DefaultConfig.INSTANCE.getVersion()); + + builder.setAutoReconnect(true); + jda = builder.build(); + } +} diff --git a/px32-bot-runner/src/main/kotlin/net/projecttl/p/x32/exec/config/DefaultConfig.kt b/px32-bot-runner/src/main/kotlin/net/projecttl/p/x32/exec/config/DefaultConfig.kt new file mode 100644 index 0000000..b4c0d58 --- /dev/null +++ b/px32-bot-runner/src/main/kotlin/net/projecttl/p/x32/exec/config/DefaultConfig.kt @@ -0,0 +1,24 @@ +package net.projecttl.p.x32.exec.config + +import java.util.* +import kotlin.reflect.KProperty + +object DefaultConfig { + private fun useConfig(): DefaultConfigDelegate { + return DefaultConfigDelegate() + } + + val version: String by useConfig() +} + +private class DefaultConfigDelegate { + private val props = Properties() + + init { + props.load(this.javaClass.getResourceAsStream("/default.properties")) + } + + operator fun getValue(thisRef: Any?, property: KProperty<*>): String { + return props.getProperty(property.name).toString() + } +} diff --git a/px32-bot-runner/src/main/resources/default.properties b/px32-bot-runner/src/main/resources/default.properties new file mode 100644 index 0000000..a50bf5c --- /dev/null +++ b/px32-bot-runner/src/main/resources/default.properties @@ -0,0 +1 @@ +version=${version} diff --git a/src/main/resources/log4j2.xml b/px32-bot-runner/src/main/resources/log4j2.xml similarity index 100% rename from src/main/resources/log4j2.xml rename to px32-bot-runner/src/main/resources/log4j2.xml diff --git a/settings.gradle.kts b/settings.gradle.kts index eb6c344..e1bdce5 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,2 +1,4 @@ rootProject.name = "px32-bot" - +include("px32-bot-runner") +include("px32-bot-core") +include("px32-bot-api") diff --git a/src/main/java/net/projecttl/p/x32/Px32.java b/src/main/java/net/projecttl/p/x32/Px32.java deleted file mode 100644 index 555995d..0000000 --- a/src/main/java/net/projecttl/p/x32/Px32.java +++ /dev/null @@ -1,47 +0,0 @@ -package net.projecttl.p.x32; - -import net.dv8tion.jda.api.JDA; -import net.dv8tion.jda.api.JDABuilder; -import net.dv8tion.jda.api.interactions.commands.Command; -import net.dv8tion.jda.api.interactions.commands.build.Commands; -import net.projecttl.p.x32.command.Ping; -import net.projecttl.p.x32.handler.CommandExecutor; -import net.projecttl.p.x32.handler.CommandHandler; -import net.projecttl.p.x32.handler.Ready; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; - -public class Px32 { - public static final Logger log = LoggerFactory.getLogger(Px32.class); - private JDA jda; - private final ArrayList commands = new ArrayList<>(); - - private void register() { - commands.forEach(command -> { - jda.upsertCommand(command.getData()).queue(); - jda.updateCommands().addCommands( - Commands.context(Command.Type.USER, command.getData().getName()) - ).queue(); - log.info("registered command: {}", command.getData().getName()); - }); - } - - public static void main(String[] args) { - Px32 core = new Px32(); - JDABuilder builder = JDABuilder.createDefault(System.getenv("BOT_TOKEN")); - - core.commands.add(new Ping()); - CommandHandler handler = new CommandHandler(core.commands); - - builder.addEventListeners( - handler, - new Ready() - ); - builder.setAutoReconnect(true); - - core.jda = builder.build(); - core.register(); - } -} diff --git a/src/main/java/net/projecttl/p/x32/command/Ping.java b/src/main/java/net/projecttl/p/x32/command/Ping.java deleted file mode 100644 index 6fe25e2..0000000 --- a/src/main/java/net/projecttl/p/x32/command/Ping.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.projecttl.p.x32.command; - -import net.dv8tion.jda.api.EmbedBuilder; -import net.dv8tion.jda.api.entities.MessageEmbed; -import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; -import net.dv8tion.jda.api.interactions.commands.build.CommandData; -import net.dv8tion.jda.internal.interactions.CommandDataImpl; -import net.projecttl.p.x32.handler.CommandExecutor; -import org.jetbrains.annotations.NotNull; - -import java.util.Random; -import java.util.concurrent.atomic.AtomicReference; - -import static java.lang.String.format; - -public class Ping implements CommandExecutor { - @NotNull - @Override - public CommandData getData() { - return CommandData.fromData(new CommandDataImpl( - "ping", - "Discord API 레이턴시를 확인 합니다." - ).toData()); - } - - @Override - public void execute(SlashCommandInteractionEvent ev) { - long current = System.currentTimeMillis(); - AtomicReference embed = new AtomicReference<>(new EmbedBuilder() - .setDescription(":hourglass: Just wait a seconds...") - .build()); - - ev.replyEmbeds(embed.get()).queue(hook -> { - Random r = new Random(); - embed.set(new EmbedBuilder() - .setTitle(":ping_pong: Pong!") - .addField("\uD83E\uDD16", format("**%d**ms", System.currentTimeMillis() - current), true) - .addField("\uD83D\uDD0C", format("**%d**ms", ev.getJDA().getGatewayPing()), true) - .setColor(r.nextInt(0x000001, 0xffffff)) - .build()); - - hook.editOriginalEmbeds(embed.get()).queue(); - }); - } -} diff --git a/src/main/java/net/projecttl/p/x32/handler/CommandHandler.java b/src/main/java/net/projecttl/p/x32/handler/CommandHandler.java deleted file mode 100644 index aab83c7..0000000 --- a/src/main/java/net/projecttl/p/x32/handler/CommandHandler.java +++ /dev/null @@ -1,42 +0,0 @@ -package net.projecttl.p.x32.handler; - -import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; -import net.dv8tion.jda.api.events.interaction.command.UserContextInteractionEvent; -import net.dv8tion.jda.api.hooks.ListenerAdapter; -import net.projecttl.p.x32.Px32; - -import java.util.List; - -public class CommandHandler extends ListenerAdapter { - private final List commands; - - public CommandHandler(List commands) { - this.commands = commands; - } - - @Override - public void onSlashCommandInteraction(SlashCommandInteractionEvent ev) { - if (ev.getUser().isBot()) { - return; - } - - for (CommandExecutor command : commands) { - if (!command.getData().getName().equals(ev.getName())) { - continue; - } - - try { - command.execute(ev); - Px32.log.info("user {} execute command: {}", ev.getUser().getId(), ev.getName()); - } catch (Exception ex) { - Px32.log.error("user {} execute command {} failed", ev.getUser().getId(), ev.getName(), ex); - } - break; - } - } - - @Override - public void onUserContextInteraction(UserContextInteractionEvent ev) { - Px32.log.info("user {} execute context: {}", ev.getUser().getId(), ev.getName()); - } -} diff --git a/src/main/java/net/projecttl/p/x32/handler/Ready.java b/src/main/java/net/projecttl/p/x32/handler/Ready.java deleted file mode 100644 index 2d2cc2c..0000000 --- a/src/main/java/net/projecttl/p/x32/handler/Ready.java +++ /dev/null @@ -1,15 +0,0 @@ -package net.projecttl.p.x32.handler; - -import net.dv8tion.jda.api.events.session.ReadyEvent; -import net.dv8tion.jda.api.hooks.ListenerAdapter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class Ready extends ListenerAdapter { - private static final Logger log = LoggerFactory.getLogger(Ready.class); - - @Override - public void onReady(ReadyEvent ev) { - log.info("Logged in as {}", ev.getJDA().getSelfUser().getAsTag()); - } -} diff --git a/src/main/kotlin/net/projecttl/p/x32/Database.kt b/src/main/kotlin/net/projecttl/p/x32/Database.kt deleted file mode 100644 index 9cff878..0000000 --- a/src/main/kotlin/net/projecttl/p/x32/Database.kt +++ /dev/null @@ -1,4 +0,0 @@ -package net.projecttl.p.x32 - -class Database { -} diff --git a/src/main/kotlin/net/projecttl/p/x32/handler/CommandExecutor.kt b/src/main/kotlin/net/projecttl/p/x32/handler/CommandExecutor.kt deleted file mode 100644 index 2403160..0000000 --- a/src/main/kotlin/net/projecttl/p/x32/handler/CommandExecutor.kt +++ /dev/null @@ -1,9 +0,0 @@ -package net.projecttl.p.x32.handler - -import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent -import net.dv8tion.jda.api.interactions.commands.build.CommandData - -interface CommandExecutor { - val data: CommandData - fun execute(ev: SlashCommandInteractionEvent) -} \ No newline at end of file diff --git a/src/main/kotlin/net/projecttl/p/x32/service/ServiceProvider.kt b/src/main/kotlin/net/projecttl/p/x32/service/ServiceProvider.kt deleted file mode 100644 index c631815..0000000 --- a/src/main/kotlin/net/projecttl/p/x32/service/ServiceProvider.kt +++ /dev/null @@ -1,16 +0,0 @@ -package net.projecttl.p.x32.service - -import org.jetbrains.exposed.sql.transactions.transaction - -interface ServiceProvider { - fun dbQuery(block: () -> T): T = - transaction { block() } - - fun create(data: T) - - fun read(id: P): T? - - fun update(id: P, data: T) {} - - fun delete(id: P) {} -} \ No newline at end of file