import DiscordApi from "discord.js"; import OpenAIApi from "openai"; import { PrismaClient } from "@prisma/client"; import Typescript from "typescript"; import fs from "node:fs"; import { queueRequest } from "./execution"; import InteractionManager from "./interactionManager"; import newConfig, { IConfig, IConfigRequired } from "./configDefault"; const discord = new DiscordApi.Client({ intents: [ DiscordApi.GatewayIntentBits.Guilds, DiscordApi.GatewayIntentBits.GuildMessages, DiscordApi.GatewayIntentBits.MessageContent, ] }); function getConfig() { let fileConfig: IConfig | undefined = undefined; try { fs.statSync("./config.ts"); const program = Typescript.createProgram( ["./config.ts"], {outDir: "./dist"} ); program.getSourceFiles() .filter(e => { if (!e.fileName.match(`^${process.cwd()}`)) return true; if (e.fileName.match(`${process.cwd()}/node_modules`)) return false; if (e.fileName.match(`${process.cwd()}/src/`)) return false; return true; }) .forEach(e => program.emit(e)); // eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-unsafe-member-access fileConfig = require("../config").default as IConfig; } catch (e) { //FIXME: make errors more descriptive to the enduser console.log(e); } return fileConfig !== undefined ? newConfig(fileConfig) : newConfig(); } export const config: IConfigRequired = getConfig(); export const openai = new OpenAIApi({ apiKey: config.tokens.OpenAI }); export const database = new PrismaClient(); const interactionManager = new InteractionManager(); interactionManager.bindClient(discord); discord.on("ready", event => { console.log(`Connected to Discord as ${event.user.tag} (${event.user.id})`); }); discord.on("messageCreate", message => { if (message.author.bot) return; if (!message.mentions.has(message.client.user, { ignoreEveryone: true })) return; return queueRequest(message); }); if (require.main === module) { void discord.login(config.tokens.Discord); process.on("SIGINT", () => { console.log("got SIGINT, exiting"); //FIXME: finish executing requests then exit discord.destroy() .then(() => process.exit()) .catch((e) => { console.error("Failed to gracefully exit"); console.error(e); process.exit(); }); }); }