Zonies-Bot/functions/checkRoles.js
2025-05-12 15:20:40 -05:00

73 lines
2.2 KiB
JavaScript

const path = require("path");
const db = require(path.join(__dirname, "../models/guilds"));
/**
* Checks and validates role reaction messages across all guilds
* @param {Object} client - Discord client instance
* @returns {Promise<void>}
*/
async function checkRoles(client) {
try {
// Find all guilds with role reactions
const guildsWithRoles = await db.find({
$expr: { $gt: [{ $size: "$roles" }, 0] }
});
if (!guildsWithRoles?.length) return;
// Process each guild sequentially to avoid rate limits
for (const guild of guildsWithRoles) {
try {
await processGuildRoles(client, guild);
} catch (error) {
console.error(`Error processing guild ${guild.id}:`, error);
}
}
} catch (error) {
console.error('Error in checkRoles:', error);
}
}
/**
* Process role reactions for a single guild
* @param {Object} client - Discord client instance
* @param {Object} guild - Guild data from database
* @returns {Promise<void>}
*/
async function processGuildRoles(client, guild) {
const validRoles = [];
const invalidRoles = [];
// Process each role reaction message
for (const role of guild.roles) {
try {
const channel = client.channels.get(role.chanId);
// Skip if channel doesn't exist or role array is empty
if (!channel || !role.roles?.length) {
invalidRoles.push(role);
continue;
}
// Verify message exists
const message = await channel.fetchMessage(role.msgId).catch(() => null);
if (message) {
validRoles.push(role);
} else {
invalidRoles.push(role);
}
} catch (error) {
console.error(`Error processing role ${role.msgId} in guild ${guild.id}:`, error);
invalidRoles.push(role);
}
}
// Update guild with only valid roles if there were any invalid ones
if (invalidRoles.length > 0) {
await client.database.updateGuild(guild.id, {
roles: validRoles
});
}
}
module.exports = checkRoles;