99 lines
2.5 KiB
TypeScript
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"),
|
|
]);
|