157 lines
5.3 KiB
JavaScript
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; |