129 lines
4.4 KiB
JavaScript
129 lines
4.4 KiB
JavaScript
const { Client, Intents, MessageEmbed } = require("discord.js")
|
|
const fetch = require("node-fetch")
|
|
const fs = require("fs")
|
|
const humanizeDuration = require("humanize-duration")
|
|
const path = require("path")
|
|
const shell = require("child_process")
|
|
const log = require("./logger")
|
|
|
|
const GITHUB_USER_API = "https://api.github.com/users/"
|
|
var DEVELOPER_LOOKUP_TABLE = {}
|
|
|
|
let lookups = (process.env.DEVELOPERS).split(",")
|
|
for (let i = 0; i < lookups.length; i++) {
|
|
let user = lookups[i].split("=")
|
|
DEVELOPER_LOOKUP_TABLE[user[0]] = user[1]
|
|
}
|
|
|
|
humanize = (s) => humanizeDuration(s * 1000)
|
|
|
|
var client = new Client({ intents: [Intents.FLAGS.GUILDS] })
|
|
|
|
function getCommitInfo() {
|
|
return new Promise((resolve, reject) => {
|
|
// thank god Git is made by Torvalds so it's LF
|
|
|
|
let description = shell.execSync(`cd ${process.env.TADAH_PATH} && git log -1 --pretty=%B`).toString()
|
|
description = description.split("\n")
|
|
delete description[0]
|
|
description = description.join("\n").replace(/(\r\n|\n|\r)/gm, "").trim()
|
|
|
|
if (!description) {
|
|
description = "*No description provided.*"
|
|
}
|
|
|
|
// this is so fucking stupid
|
|
let author = { username: "", avatar: "", url: "" }
|
|
let email = shell.execSync(`cd ${process.env.TADAH_PATH} && git log -1 --pretty=format:'%ae'`).toString().trim()
|
|
|
|
let lookedUp = DEVELOPER_LOOKUP_TABLE[email]
|
|
if (!lookedUp) lookedUp = ""
|
|
|
|
fetch(GITHUB_USER_API + lookedUp)
|
|
.then(res => res.json())
|
|
.then((data) => {
|
|
if (data.message == "Not Found") {
|
|
author.username = shell.execSync(`cd ${process.env.TADAH_PATH} && git log -1 --pretty=format:'%an'`).toString().trim()
|
|
delete author.avatar
|
|
delete author.url
|
|
} else {
|
|
author.username = data.login
|
|
author.avatar = data.avatar_url
|
|
author.url = data.html_url
|
|
}
|
|
|
|
resolve({ description, author })
|
|
})
|
|
})
|
|
}
|
|
|
|
function yell(wid, buildTime, downTime, deployTime, mixTime) {
|
|
log.info(`[${wid}] Yelling!`)
|
|
getCommitInfo().then((result) => {
|
|
let embed = {
|
|
title: "",
|
|
"description": result.description,
|
|
color: 0x455dd8,
|
|
author: { name: result.author.username },
|
|
fields: [
|
|
{
|
|
name: "Total Deploy Time",
|
|
value: humanize(deployTime),
|
|
inline: true
|
|
},
|
|
{
|
|
name: "Build Time",
|
|
value: humanize(buildTime),
|
|
inline: true
|
|
},
|
|
{
|
|
name: "Mix Time",
|
|
value: humanize(mixTime),
|
|
inline: true
|
|
},
|
|
{
|
|
name: "Downtime",
|
|
value: humanize(downTime),
|
|
inline: true
|
|
}
|
|
],
|
|
timestamp: new Date(),
|
|
footer: { text: `WID: ${wid}` }
|
|
}
|
|
|
|
if (result.author.hasOwnProperty("avatar")) {
|
|
embed.author.icon_url = result.author.avatar
|
|
embed.author.url = result.author.url
|
|
}
|
|
|
|
client.channels.cache.get(process.env.DEPLOY_LOG_CHANNEL_ID).send({ content: "**New Tadah version!**", embeds: [embed] })
|
|
log.info(`[${wid}] Yelled!`)
|
|
})
|
|
}
|
|
|
|
function login() {
|
|
client.login(process.env.YELLER_TOKEN)
|
|
client.on("ready", () => { log.info("Logged into Yeller") })
|
|
}
|
|
|
|
function error(wid, code, exception = "") {
|
|
// 0 = general exception
|
|
// 1 = timed out (race condition)
|
|
if (code < 0 || code > 1) throw "Invalid yeller error code"
|
|
let exceptionName
|
|
switch (code) {
|
|
case 0:
|
|
exceptionName = "GENERAL_EXCEPTION"
|
|
break
|
|
case 1:
|
|
exceptionName = "TIMED_OUT"
|
|
break
|
|
default:
|
|
exceptionName = "UNKNOWN_EXCEPTION"
|
|
}
|
|
|
|
client.channels.cache.get(process.env.DEPLOY_ERROR_CHANNEL_ID).send(`An unexpected error occurred during a deploy.\n\nInternally, it was a \`${exceptionName}\`.\nThe WID was \`${wid}\`.\nThe full exception:\n\`\`\`${exception.stack}\`\`\`\n\n<@&${process.env.DEVELOPER_ROLE_ID}>`)
|
|
log.info(`[${wid}] Yelled the error!`)
|
|
}
|
|
|
|
module.exports = { login, yell, error } |