|
|
|
import {BaseInteraction, Client} from "discord.js"
|
|
|
|
import {config} from "dotenv"
|
|
|
|
import {isChatInputCommand} from "./types/interactions"
|
|
|
|
import {commandDefinitions, executeCommand, storeCachedCommands} from "./commands/index"
|
|
|
|
import {checkIsRestart, reportFailed, reportReady, reportStarted} from "./ipc/restart"
|
|
|
|
import {defaultPresence} from "./defaultPresence"
|
|
|
|
|
|
|
|
async function main() {
|
|
|
|
await checkIsRestart()
|
|
|
|
config()
|
|
|
|
const c = new Client({
|
|
|
|
intents: [],
|
|
|
|
})
|
|
|
|
c.on("ready", async () => {
|
|
|
|
const app = c.application
|
|
|
|
if (!app) {
|
|
|
|
c.destroy()
|
|
|
|
await reportFailed(c, "No application was given")
|
|
|
|
return
|
|
|
|
} else {
|
|
|
|
try {
|
|
|
|
storeCachedCommands(await app.commands.set(commandDefinitions))
|
|
|
|
const g = await c.guilds.fetch()
|
|
|
|
for (const guild of g.values()) {
|
|
|
|
storeCachedCommands(await app.commands.set(commandDefinitions, guild.id))
|
|
|
|
}
|
|
|
|
} catch (ex) {
|
|
|
|
c.destroy()
|
|
|
|
await reportFailed(c, ex)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
const user = c.user
|
|
|
|
if (!user) {
|
|
|
|
c.destroy()
|
|
|
|
await reportFailed(c, "No user found")
|
|
|
|
return
|
|
|
|
} else {
|
|
|
|
user.setPresence(defaultPresence)
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
await reportReady(c)
|
|
|
|
} catch (ex) {
|
|
|
|
console.log(ex)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
c.on("error", async (ex) => {
|
|
|
|
c.destroy()
|
|
|
|
await reportFailed(c, ex)
|
|
|
|
})
|
|
|
|
c.on("interactionCreate", async (ev: BaseInteraction) => {
|
|
|
|
if (ev.client.user.presence.status !== "online") {
|
|
|
|
if (ev.isRepliable()) {
|
|
|
|
try {
|
|
|
|
await ev.reply({
|
|
|
|
content: "Shhh... I'm sleeping!! Try again later.",
|
|
|
|
ephemeral: true,
|
|
|
|
})
|
|
|
|
} catch (ex) {
|
|
|
|
console.log("failed sending busy reply", ex)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if (isChatInputCommand(ev)) {
|
|
|
|
try {
|
|
|
|
await executeCommand(ev)
|
|
|
|
} catch (ex) {
|
|
|
|
console.log("failed executing command", ev, ex)
|
|
|
|
if (!ev.replied) {
|
|
|
|
try {
|
|
|
|
await ev.reply({
|
|
|
|
ephemeral: true,
|
|
|
|
content: "Uuguuu... I can't think straight... try again later, 'kay?",
|
|
|
|
})
|
|
|
|
} catch (innerEx) {
|
|
|
|
console.log("failed sending error response", innerEx)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (ev.isRepliable()) {
|
|
|
|
try {
|
|
|
|
await ev.reply({
|
|
|
|
ephemeral: true,
|
|
|
|
content: "Huuuuuuuh? ... I don't know what to do with that yet.",
|
|
|
|
})
|
|
|
|
} catch (ex) {
|
|
|
|
console.log("failed sending unknown command response", ex)
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
console.log("got an interaction but can't reply to it")
|
|
|
|
}
|
|
|
|
})
|
|
|
|
await reportStarted()
|
|
|
|
await c.login(process.env.DISCORD_TOKEN || "")
|
|
|
|
}
|
|
|
|
|
|
|
|
main().catch((ex) => {
|
|
|
|
console.log("main thread failed", ex)
|
|
|
|
})
|