OttoBot/src/main/kotlin/nl/voidcorp/dbot/UnityBot.kt

72 lines
2.4 KiB
Kotlin

package nl.voidcorp.dbot
import io.javalin.Javalin
import io.javalin.json.FromJsonMapper
import io.javalin.json.JavalinJson
import io.javalin.json.ToJsonMapper
import net.dv8tion.jda.core.EmbedBuilder
import net.dv8tion.jda.core.JDABuilder
import net.dv8tion.jda.core.OnlineStatus
import net.dv8tion.jda.core.entities.Game
import net.dv8tion.jda.webhook.WebhookClient
import net.dv8tion.jda.webhook.WebhookClientBuilder
import nl.voidcorp.dbot.storage.GitlabWebhook
import org.slf4j.LoggerFactory
import java.io.File
import java.io.FileReader
fun main(args: Array<String>) {
val log = LoggerFactory.getLogger("UnityBot")
JavalinJson.apply {
toJsonMapper = object : ToJsonMapper {
override fun map(obj: Any): String = gson.toJson(obj)
}
fromJsonMapper = object : FromJsonMapper {
override fun <T> map(json: String, targetClass: Class<T>): T = gson.fromJson(json, targetClass)
}
}
if (!File(".hooks").exists()) {
log.error("The .hooks file does not exist!")
log.error("Exiting")
System.exit(1)
}
val hooks = mutableListOf<WebhookClient>()
FileReader(".hooks").forEachLine {
val wh = WebhookClientBuilder(it).build()
hooks += wh
}
log.info(hooks.toString())
val app = Javalin.create().requestLogger { ctx, timeMs ->
if (ctx.res.status >= 400) {
log.error("${ctx.method()} ${ctx.path()} -> ${ctx.status()} (${timeMs}ms)")
} else {
log.info("${ctx.method()} ${ctx.path()} -> ${ctx.status()} (${timeMs}ms)")
}
}.disableStartupBanner().start(4466)
app.post("/gitlab.json") { ctx ->
val bod = ctx.validatedBody<GitlabWebhook>()
if (bod.value != null) {
bod.value!!.apply {
val embed = EmbedBuilder()
embed.setTitle(project.name, project.web_url)
val builder = embed.descriptionBuilder
var url = ""
commits.forEach {
builder.append("${it.message} (${it.timestamp})")
url = it.url
}
embed.setAuthor("$user_name ($user_username)", url, user_avatar)
hooks.forEach { it.send(embed.build()) }
}
}
ctx.status(200).result("OK")
}
val bot = JDABuilder(args[0]).setStatus(OnlineStatus.ONLINE).setGame(Game.watching("fraud")).addEventListener(Events).build()
}