Files
drb-server/discordBot/discordBot.mjs
Logan Cusano 94374b4d45 Implement Dynamic Presence #19
## Added Dynamic Presence to Functions
- Added default to startup
- Added to RSS manager
- Added to interaction create event
- Added to message create function

## Related Work #15
### LinkCop
- Updated with new regex string and logic approved and restricted channels
- Implemented new config storage
### Guild Member Add (event)
- Implemented new config storage for welcome channel
### Message Create (event)
- Implemented new config storage for ignored channel IDs
- Improved the logic for gpt interactions to reset presence
### Mongo Config Wrappers
- Updated logic in order to handle different data types the same way
- Updated set functions to wrap the value in the key
- Updated get functions to return the keyyed value ie `config[key]`
2024-08-11 20:13:57 -04:00

134 lines
4.3 KiB
JavaScript

import { DebugBuilder } from "../modules/debugger.mjs";
import { Client, GatewayIntentBits, Collection } from "discord.js";
import {
registerActiveCommands,
unregisterAllCommands,
} from "./modules/registerCommands.mjs";
import { RSSController } from "../rss-manager/rssController.mjs";
import { join, dirname } from "path";
import { readdirSync } from "fs";
import { fileURLToPath } from "url";
import PresenceManager from "./modules/presenceManager.mjs";
import dotenv from "dotenv";
dotenv.config();
const log = new DebugBuilder("server", "discordBot");
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
/**
* Add the enabled commands to the bot to be used by users in discord
* (commands that end in '.mjs' will be enabled, to disable just remove the extension or replace with '.mjs.disabled')
* @param {any} serverClient
* @param {any} _commandsPath="./commands"
* @returns {any}
*/
export const addEnabledCommands = async (
serverClient,
_commandsPath = "./commands",
) => {
// Setup commands for the Discord bot
serverClient.commands = new Collection();
const commandsPath = join(__dirname, _commandsPath);
const commandFiles = readdirSync(commandsPath).filter((file) =>
file.endsWith(".mjs"),
);
for (const file of commandFiles) {
const filePath = await join(commandsPath, file);
log.INFO(`Adding enabled command: ${filePath}`);
await import(`file://${filePath}`).then((command) => {
if (command.data instanceof Promise) {
command.data.then(async (builder) => {
command.data = builder;
log.DEBUG("Importing command: ", command.data.name, command);
// Set a new item in the Collection
// With the key as the command name and the value as the exported module
serverClient.commands.set(command.data.name, command);
});
} else {
log.DEBUG("Importing command: ", command.data.name, command);
// Set a new item in the Collection
// With the key as the command name and the value as the exported module
serverClient.commands.set(command.data.name, command);
}
});
}
// Register the commands currently in use by the bot
await registerActiveCommands(serverClient);
};
/**
* Add the enabled event listeners to the bot
* (events that end in '.mjs' will be enabled, to disable just remove the extension or replace with '.mjs.disabled')
* @param {any} serverClient
* @param {any} _eventsPath="./events"
* @returns {any}
*/
export function addEnabledEventListeners(
serverClient,
_eventsPath = "./events",
) {
const eventsPath = join(__dirname, _eventsPath);
const eventFiles = readdirSync(eventsPath).filter((file) =>
file.endsWith(".mjs"),
);
for (const file of eventFiles) {
const filePath = join(eventsPath, file);
log.INFO(`Adding enabled event listener: ${filePath}`);
import(`file://${filePath}`).then((event) => {
log.DEBUG("Adding event: ", event);
if (event.once) {
serverClient.once(event.name, (...args) =>
event.execute(serverClient.nodeIo, ...args),
);
} else {
serverClient.on(event.name, (...args) =>
event.execute(serverClient.nodeIo, ...args),
);
}
});
}
}
// The discord client
export const serverClient = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildVoiceStates,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent,
GatewayIntentBits.GuildMembers,
GatewayIntentBits.GuildPresences,
],
});
// Run when the bot is ready
serverClient.on("ready", async () => {
log.INFO(`Logged in as ${serverClient.user.tag}!`);
// Set the presence to default
const pm = new PresenceManager(serverClient);
await pm.resetToDefault();
// Add and register commands
await addEnabledCommands(serverClient);
// Config the discord bot with events
await addEnabledEventListeners(serverClient);
// Start the RSS Controller
serverClient.RSSController = await new RSSController(serverClient);
serverClient.RSSController.start();
log.INFO("RSS Controller:", serverClient.RSSController);
});
// Startup the discord bot
log.INFO(`Logging into discord with ID: ${process.env.DISCORD_TOKEN}`);
serverClient.login(process.env.DISCORD_TOKEN);