60 lines
1.8 KiB
Kotlin
60 lines
1.8 KiB
Kotlin
package moe.kageru.kagebot
|
|
|
|
import arrow.core.extensions.list.foldable.find
|
|
import moe.kageru.kagebot.Util.checked
|
|
import moe.kageru.kagebot.config.Config
|
|
import moe.kageru.kagebot.config.ConfigParser
|
|
import moe.kageru.kagebot.cron.CronD
|
|
import moe.kageru.kagebot.persistence.Dao
|
|
import org.javacord.api.DiscordApiBuilder
|
|
import org.javacord.api.event.message.MessageCreateEvent
|
|
import java.io.File
|
|
import kotlin.system.exitProcess
|
|
|
|
fun main() {
|
|
Kagebot.init()
|
|
}
|
|
|
|
object Kagebot {
|
|
fun MessageCreateEvent.process() {
|
|
if (messageAuthor.isBotUser) {
|
|
handleOwn()
|
|
return
|
|
}
|
|
Config.commands
|
|
.find { it.matches(readableMessageContent) && it.isAllowed(this) }
|
|
.map { it.execute(this) }
|
|
}
|
|
|
|
private fun MessageCreateEvent.handleOwn() {
|
|
if (messageAuthor.isYourself) {
|
|
val loggedMessage = readableMessageContent.ifBlank { "[embed]" }
|
|
Log.info("<Self> $loggedMessage")
|
|
}
|
|
}
|
|
|
|
fun init() {
|
|
val secret = File("secret").readText().trim()
|
|
val api = DiscordApiBuilder().setToken(secret).login().join()
|
|
Globals.api = api
|
|
ConfigParser.initialLoad(ConfigParser.DEFAULT_CONFIG_PATH).mapLeft { e ->
|
|
println("Config parsing error:")
|
|
generateSequence(e) { e.cause }
|
|
.map { err ->
|
|
err.stackTrace.joinToString("\n", prefix = "$err: ${err.message}", postfix = "\n")
|
|
}.forEach(::println)
|
|
exitProcess(1)
|
|
}
|
|
Runtime.getRuntime().addShutdownHook(Thread {
|
|
Log.info("Bot has been interrupted. Shutting down.")
|
|
Dao.setCommandCounter(Globals.commandCounter.get())
|
|
Dao.close()
|
|
api.disconnect()
|
|
})
|
|
Log.info("kagebot Mk II running")
|
|
api.addMessageCreateListener { checked { it.process() } }
|
|
Config.features.eventFeatures().forEach { it.register(api) }
|
|
CronD.startAll()
|
|
}
|
|
}
|