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

157 lines
5.3 KiB
JavaScript

const path = require("path");
const Embed = require(path.join(__dirname, "../functions/embed"));
/**
* Validates role mentions in a message
* @param {string} content - Message content to validate
* @param {string} language - User's language setting
* @param {Object} client - Discord client instance
* @returns {Object} Validation result with roles and error message if any
*/
function validateRoleMentions(content, language, client) {
const regex = /{role:(.*?)}/g;
const matches = content.match(regex);
if (!matches || matches.length === 0) {
return {
isValid: false,
error: client.translate.get(language, "Events.messageCreate.noRoles")
};
}
const roles = matches.map(match => match.match(/{role:(.*?)}/)[1]);
if (roles.length > 20) {
return {
isValid: false,
error: client.translate.get(language, "Events.messageCreate.maxRoles")
};
}
return { isValid: true, roles };
}
/**
* Finds server roles by name
* @param {Array} roles - Array of role names
* @param {Object} server - Server object
* @returns {Object} Result containing found roles and unknown roles
*/
function findServerRoles(roles, server) {
const roleIds = roles.map(roleName =>
[...server.roles].find(([_, role]) =>
roleName.toLowerCase() === role.name.toLowerCase()
)
);
const unknown = roles.filter((_, index) => !roleIds[index]);
return { roleIds, unknown };
}
/**
* Checks for duplicate roles
* @param {Array} roleIds - Array of role IDs
* @returns {Array} Array of duplicate roles
*/
function findDuplicateRoles(roleIds) {
return roleIds.filter((role, index) =>
roleIds.findIndex(r => r[0] === role[0]) !== index
);
}
/**
* Checks role positions against bot's role
* @param {Array} roleIds - Array of role IDs
* @param {Object} botRole - Bot's highest role
* @returns {Array} Array of roles with invalid positions
*/
function checkRolePositions(roleIds, botRole) {
return roleIds.filter(role => role[1].rank <= botRole.rank);
}
/**
* Main collector function for message editing
* @param {Object} client - Discord client instance
* @param {Object} message - Message object
* @param {Object} db - Database object
*/
async function Collector(client, message, db) {
const collector = client.messageEdit.get(message.authorId);
// Validate role mentions
const validation = validateRoleMentions(message.content, db.language, client);
if (!validation.isValid) {
await message.reply({
embeds: [new Embed().setColor("#FF0000").setDescription(validation.error)]
}, false).catch(() => {});
return message.react(client.config.emojis.cross).catch(() => {});
}
// Find server roles
const { roleIds, unknown } = findServerRoles(validation.roles, message.server);
if (unknown.length > 0) {
await message.reply({
embeds: [new Embed().setColor("#FF0000").setDescription(
`${client.translate.get(db.language, "Events.messageCreate.unknown")}\n${
unknown.map(e => `\`{role:${e}}\``).join(", ")
}`
)]
}, false).catch(() => {});
return message.react(client.config.emojis.cross).catch(() => {});
}
// Check for duplicates
const duplicates = findDuplicateRoles(roleIds);
if (duplicates.length > 0) {
await message.reply({
embeds: [new Embed().setColor("#FF0000").setDescription(
`${client.translate.get(db.language, "Events.messageCreate.duplicate")}\n${
duplicates.map(e => `\`{role:${e[1].name}}\``)
}`
)]
}, false).catch(() => {});
return message.react(client.config.emojis.cross).catch(() => {});
}
// Check role positions
const botRole = message.channel.server.member.orderedRoles.reverse()[0];
if (!botRole) {
await message.reply({
embeds: [new Embed().setColor("#FF0000").setDescription(
client.translate.get(db.language, "Events.messageCreate.noBotRole")
)]
}, false).catch(() => {});
return message.react(client.config.emojis.cross).catch(() => {});
}
const invalidPositions = checkRolePositions(roleIds, botRole);
if (invalidPositions.length > 0) {
await message.reply({
embeds: [new Embed().setColor("#FF0000").setDescription(
`${client.translate.get(db.language, "Events.messageCreate.positions")}\n${
invalidPositions.map(e => `\`{role:${e[1].name}}\``)
}`
)]
}, false).catch(() => {});
return message.react(client.config.emojis.cross).catch(() => {});
}
// Process valid message
await message.delete().catch(() => {});
collector.roles = roleIds;
collector.regex = validation.roles;
const react = [client.config.emojis.check];
const messageContent = collector.type === "content"
? { content: message.content, interactions: [react] }
: {
embeds: [new Embed().setDescription(message.content).setColor("#A52F05")],
interactions: [react]
};
const msg = await message.channel.sendMessage(messageContent);
collector.messageId = msg.id;
}
module.exports = Collector;