automod/bot/src/index.ts
2023-07-01 13:49:36 +02:00

99 lines
2.5 KiB
TypeScript

import {
AutomodClient,
checkEnv,
connectDb,
connectRedis,
createLogger,
} from "lib";
import { config } from "dotenv";
import { ConnectionState } from "revolt.js";
import { inspect } from "util";
const ENV_VARS = [
"TOKEN",
"MONGODB_URI",
"MONGODB_DATABASE",
"REDIS_URI",
] as const;
const logger = createLogger();
config();
if (process.env.NODE_ENV != "production") {
logger.info("$NODE_ENV is not set; Loading .env.dev");
config({ path: "../.env.dev" });
}
if (process.env.ENV_FILE) {
logger.info("$ENV_FILE is set; Loading additional environment file");
config({ path: process.env.ENV_FILE });
}
checkEnv(ENV_VARS);
const environment: { [key in (typeof ENV_VARS)[number]]: string } =
ENV_VARS.reduce(
(prev, cur) => ({ ...prev, [cur]: process.env[cur] ?? "" }),
{},
) as never;
const client = new AutomodClient(
{
baseURL: "https://revolt.chat/api",
autoReconnect: true,
},
await connectDb(environment.MONGODB_URI, environment.MONGODB_DATABASE),
await connectRedis(environment.REDIS_URI),
);
client.events.on("error", (e) =>
logger.error(
`Revolt.js events error: ${inspect(e).replaceAll(
environment.TOKEN,
"[Redacted]",
)}`,
),
);
let lastStateUpdate = Date.now();
client.events.on("state", (state) => {
const stateName = Object.entries(ConnectionState).find(
(s) => s[1] == state,
)?.[0];
const now = Date.now();
logger.info(
`Connection state changed to ${state} (${stateName}, ${
now - lastStateUpdate
}ms)`,
);
lastStateUpdate = now;
if (state == ConnectionState.Disconnected && !client.options.debug) {
logger.warn("Disconnected; Enabling debug logging");
client.options.debug = true;
}
if (state == ConnectionState.Connected && client.options.debug) {
logger.info("Reconnected; Disabling debug logging");
client.options.debug = false;
}
});
logger.info("Starting login...");
await client.loginBot(environment.TOKEN);
await new Promise<void>((resolve) =>
client.once("ready", () => {
logger.done(`Ready: Logged in as @${client.user?.username}!`);
resolve();
}),
);
export { client, logger, environment };
Promise.all([
import("./modules/commands.js"),
import("./modules/i18n.js"),
import("./modules/timedActions.js"),
import("./modules/events.js"),
import("./modules/message_logs.js"),
]);