From effd1068471f9224aca42287eae309da015d0466 Mon Sep 17 00:00:00 2001 From: kageru Date: Sat, 8 Jun 2019 11:07:52 +0200 Subject: [PATCH] bot runs and can ping/pong --- build.gradle.kts | 16 ++++++++-- settings.gradle | 3 +- src/main/kotlin/moe/kageru/kagebot/Command.kt | 6 ++++ src/main/kotlin/moe/kageru/kagebot/Config.kt | 29 +++++++++++++++++ src/main/kotlin/moe/kageru/kagebot/Log.kt | 25 +++++++++++++++ src/main/kotlin/moe/kageru/kagebot/main.kt | 32 +++++++++++++++++++ src/main/resources/config.toml | 13 ++++++++ 7 files changed, 119 insertions(+), 5 deletions(-) create mode 100644 src/main/kotlin/moe/kageru/kagebot/Command.kt create mode 100644 src/main/kotlin/moe/kageru/kagebot/Config.kt create mode 100644 src/main/kotlin/moe/kageru/kagebot/Log.kt create mode 100644 src/main/kotlin/moe/kageru/kagebot/main.kt create mode 100644 src/main/resources/config.toml diff --git a/build.gradle.kts b/build.gradle.kts index 7d52e45..4b5c288 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,6 +2,15 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { kotlin("jvm") version "1.3.31" + application +} +sourceSets { + getByName("main").resources.srcDirs("src/main/resources") +} + +sourceSets["main"].resources.srcDir("src/main/resources") +application { + mainClassName = "moe.kageru.kagebot.MainKt" } group = "moe.kageru.kagebot" @@ -12,10 +21,11 @@ repositories { } dependencies { - implementation(kotlin("stdlib-jdk11")) - compile("com.electronwill.night-config:toml:3.6.0") + implementation(kotlin("stdlib-jdk8")) + implementation("org.javacord:javacord:3.0.4") + compile("com.moandjiezana.toml:toml4j:0.7.2") } tasks.withType { - kotlinOptions.jvmTarget = "1.11" + kotlinOptions.jvmTarget = "1.8" } \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index e953bd5..72aaf76 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1 @@ -rootProject.name = 'kagebot' - +rootProject.name = 'moe.kageru.kagebot' diff --git a/src/main/kotlin/moe/kageru/kagebot/Command.kt b/src/main/kotlin/moe/kageru/kagebot/Command.kt new file mode 100644 index 0000000..10d1d02 --- /dev/null +++ b/src/main/kotlin/moe/kageru/kagebot/Command.kt @@ -0,0 +1,6 @@ +package moe.kageru.kagebot + +class Command(private val input: String, private val output: String) { + fun matches(msg: String) = msg.startsWith(this.input) + fun respond() = this.output +} \ No newline at end of file diff --git a/src/main/kotlin/moe/kageru/kagebot/Config.kt b/src/main/kotlin/moe/kageru/kagebot/Config.kt new file mode 100644 index 0000000..0dae7b3 --- /dev/null +++ b/src/main/kotlin/moe/kageru/kagebot/Config.kt @@ -0,0 +1,29 @@ +package moe.kageru.kagebot + +import com.moandjiezana.toml.Toml +import java.io.File + +class Config(val system: System, val commands: Commands) { + companion object { + val config: Config by lazy { read("config.toml") } + val secret = File("secret").readText().replace("\n", "") + + private fun read(path: String): Config { + val rawConfig: Toml = Toml().read(run { + val file = File(path) + if (file.isFile) { + return@run file + } + println("Config not found, falling back to defaults...") + File(this::class.java.classLoader.getResource(path)!!.toURI()) + }) + return rawConfig.to(Config::class.java) + } + + } +} + +data class System(val serverId: String, val admins: List) + +// wrapper for toml deserialization +data class Commands(val commands: List) diff --git a/src/main/kotlin/moe/kageru/kagebot/Log.kt b/src/main/kotlin/moe/kageru/kagebot/Log.kt new file mode 100644 index 0000000..c8cf4a0 --- /dev/null +++ b/src/main/kotlin/moe/kageru/kagebot/Log.kt @@ -0,0 +1,25 @@ +package moe.kageru.kagebot + +import java.time.ZoneId +import java.time.format.DateTimeFormatter +import java.util.logging.* + +object Log { + val log: Logger by lazy { + val log = Logger.getGlobal() + val fh = FileHandler("kagebot.log", true) + val formatter = LogFormatter() + fh.formatter = formatter + log.addHandler(fh) + return@lazy log + } +} + +private class LogFormatter : Formatter() { + private val timeFormatter: DateTimeFormatter = + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault()) + + override fun format(record: LogRecord): String { + return "[${record.level}] ${timeFormatter.format(record.instant)}: ${record.message}\n" + } +} \ No newline at end of file diff --git a/src/main/kotlin/moe/kageru/kagebot/main.kt b/src/main/kotlin/moe/kageru/kagebot/main.kt new file mode 100644 index 0000000..a624423 --- /dev/null +++ b/src/main/kotlin/moe/kageru/kagebot/main.kt @@ -0,0 +1,32 @@ +package moe.kageru.kagebot + +import moe.kageru.kagebot.Config.Companion.config +import moe.kageru.kagebot.Log.log +import org.javacord.api.DiscordApiBuilder +import java.lang.System + +fun main() { + try { + createBot() + } catch (e: Exception) { + log.warning("An exception occurred in the main thread, exiting. ${e.stackTrace.joinToString("\n")}") + System.exit(1) + } +} + +fun createBot() { + val api = DiscordApiBuilder().setToken(Config.secret).login().join() + println(config.system.admins) + Runtime.getRuntime().addShutdownHook(Thread { + log.info("Bot has been interrupted. Shutting down.") + api.disconnect() + }) + log.info("kagebot Mk II running") + api.addMessageCreateListener { event -> + if (config.commands.commands[0].matches(event.messageContent)) { + event.channel.sendMessage(config.commands.commands[0].respond()) + println("message was created") + } + } + +} diff --git a/src/main/resources/config.toml b/src/main/resources/config.toml new file mode 100644 index 0000000..a6a0d09 --- /dev/null +++ b/src/main/resources/config.toml @@ -0,0 +1,13 @@ +[system] +serverId = "356414885292277771" +admins = [ + "137780880344088576" +] + +[commands] +commands = [ + { + input = "!ping", + output = "pong" + } +] \ No newline at end of file