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]`
This commit is contained in:
Logan Cusano
2024-08-11 20:13:57 -04:00
parent d18ffd4c11
commit 94374b4d45
7 changed files with 73 additions and 30 deletions

View File

@@ -2,25 +2,30 @@ import { DebugBuilder } from "../../modules/debugger.mjs";
const log = new DebugBuilder("server", "discordBot.addons.linkCop");
import { gptHandler } from "../modules/gptHandler.mjs";
import dotenv from "dotenv";
import { getGuildConfig, setGuildConfig } from "../../modules/mongo-wrappers/mongoConfigWrappers.mjs";
dotenv.config();
const approvedLinksChannel = "767303243285790721";
const restrictedChannelIds =
process.env.LINKCOP_RESTRICTED_CHANNEL_IDS.split(",");
const linkRegExp =
/(?:http[s]?:\/\/)?(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_\+.~#?&\/=]*)/g;
const linkRegExp = /http[s]?:\/\/\S+/g;
export const linkCop = async (nodeIo, message) => {
if (
message.channel.id == approvedLinksChannel ||
!restrictedChannelIds.includes(message.channel.id)
)
return false;
// Set the channel IDs based on the guild the message was sent in
const approvedLinksChannel = await getGuildConfig(message.guild.id, "approvedLinksChannel") || "767303243285790721";
const restrictedChannelIds = await getGuildConfig(message.guild.id, "restrictedChannelIds");
// Check if the message was sent in an restricted channel
if (
message.channel.id == approvedLinksChannel || !Array.isArray(restrictedChannelIds) ||
(Array.isArray(restrictedChannelIds) || !restrictedChannelIds.includes(message.channel.id))
) {
return false;
}
// Check if there are URLs in the sent message
const urls = [...message.content.matchAll(linkRegExp)];
log.DEBUG("Parsed URLs from message:", urls);
const urls = String(message.content).matchAll(linkRegExp);
if (!urls || urls.length === 0) return false;
log.DEBUG("Found URLs: ", urls);
log.INFO("Found URLs: ", urls);
let conversation = [];

View File

@@ -8,6 +8,7 @@ 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();
@@ -110,6 +111,10 @@ export const serverClient = new Client({
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);

View File

@@ -4,12 +4,12 @@ import dotenv from "dotenv";
dotenv.config();
import { Events } from "discord.js";
import { gptHandler } from "../modules/gptHandler.mjs";
const welcomeChannel = process.env.WELCOME_CHANNEL_ID; // TODO - Need to add a DB section for server configs so it's not static to one server
import { getGuildConfig, setGuildConfig, getConfig, setConfig } from "../../modules/mongo-wrappers/mongoConfigWrappers.mjs";
export const name = Events.GuildMemberAdd;
export async function execute(nodeIo, member) {
export async function execute(nodeIo, member) {
const welcomeChannel = await getGuildConfig(message.guild.id, "welcomeChannelId");
log.INFO("New user joined the server", member);
let conversation = [];
conversation.push({

View File

@@ -1,6 +1,7 @@
import { DebugBuilder } from "../../modules/debugger.mjs";
const log = new DebugBuilder("server", "discordBot.events.interactionCreate");
import { Events } from "discord.js";
import PresenceManager from "../modules/presenceManager.mjs";
export const name = Events.InteractionCreate;
@@ -8,6 +9,10 @@ export async function execute(nodeIo, interaction) {
const command = interaction.client.commands.get(interaction.commandName);
log.INFO("Interaction created for command: ", command);
// Set the presence for handling interaction
const interactionPm = new PresenceManager(interaction.client);
await interactionPm.setPresence("online", "PLAYING", "handling interaction");
// Execute autocomplete if the user is checking autocomplete
if (interaction.isAutocomplete()) {
log.INFO("Running autocomplete for command: ", command.data.name);
@@ -33,4 +38,7 @@ export async function execute(nodeIo, interaction) {
// Execute the command
command.execute(nodeIo, interaction);
// Reset the presence
await interactionPm.resetToDefault();
}

View File

@@ -5,25 +5,40 @@ dotenv.config();
import { Events } from "discord.js";
import { gptInteraction } from "../addons/gptInteraction.mjs";
import { linkCop } from "../addons/linkCop.mjs";
const IGNORED_CHANNELS = process.env.IGNORED_CHANNEL_IDS.split(",");
import PresenceManager from "../modules/presenceManager.mjs";
import { getGuildConfig, setGuildConfig } from "../../modules/mongo-wrappers/mongoConfigWrappers.mjs";
export const name = Events.MessageCreate;
export async function execute(nodeIo, message) {
// Get the ignored channels from the server config
const IGNORED_CHANNELS = await getGuildConfig(message.guild.id, "ignoredChannels");
// Ignore ignored channels
if (IGNORED_CHANNELS.includes(message.channel.id)) return;
if (!Array.isArray(IGNORED_CHANNELS) || Array.isArray(IGNORED_CHANNELS) && IGNORED_CHANNELS.includes(message.channel.id)) { return; }
// Ignore messages from a bot
if (message.author.bot) return;
if (message.author.bot) { return; }
log.INFO("Message create", message);
// Set presence for reading message
const messagePm = new PresenceManager(message.client);
await messagePm.setPresence("online", "WATCHING", "latest messages");
// Check if the message mentions the bot
if (message.mentions.users.has(nodeIo.serverClient.user.id)) {
return await gptInteraction(nodeIo, message);
const interaction = await gptInteraction(nodeIo, message);
// Reset the presence
await messagePm.resetToDefault();
return interaction;
}
// Check if the message contains a link in a channel it shouldn't
if (await linkCop(nodeIo, message)) return;
await linkCop(nodeIo, message);
// Reset the presence
await messagePm.resetToDefault();
}