diff --git a/commands/roles.js b/commands/roles.js index dcec88c7..625ac9bd 100644 --- a/commands/roles.js +++ b/commands/roles.js @@ -5,7 +5,7 @@ const errorCard = require('../templates/errorCard') const GuildRoles = require('../database/guildRoles') const GuildCustomRole = require('../database/guildCustomRole') const successCard = require('../templates/successCard') -const { updateRoles } = require('../functions/roles') +const { updateRoles, getRoleIds } = require('../functions/roles') const { getTranslations, getTranslation } = require('../languages/setup') const SETUP = 'setup' @@ -44,8 +44,26 @@ const setupRoles = async (interaction) => { rolesFields.reverse().forEach((v, i) => card.addFields({ name: `Level ${10 - i}`, value: v, inline: true })) if (error === 0) { - await GuildRoles.remove(interaction.guild.id) - GuildRoles.create(interaction.guild.id, roles[0], roles[1], roles[2], roles[3], roles[4], roles[5], roles[6], roles[7], roles[8], roles[9]) + GuildRoles.create( + interaction.guild.id, + roles[0], + roles[1], + roles[2], + roles[3], + roles[4], + roles[5], + roles[6], + roles[7], + roles[8], + roles[9] + ) + + roles.forEach((roleId, i) => GuildCustomRole.create( + interaction.guild.id, + roleId, + color.levels[1 + i].min, + color.levels[1 + i].max + )) await updateRoles(interaction.client, null, interaction.guild.id) @@ -78,8 +96,33 @@ const generateRoles = async (interaction) => { .catch(console.error) } + roles.reverse() + await GuildRoles.remove(interaction.guild.id) - GuildRoles.create(interaction.guild.id, roles[9], roles[8], roles[7], roles[6], roles[5], roles[4], roles[3], roles[2], roles[1], roles[0]) + GuildRoles.create( + interaction.guild.id, + roles[0], + roles[1], + roles[2], + roles[3], + roles[4], + roles[5], + roles[6], + roles[7], + roles[8], + roles[9] + ) + + roles.forEach((roleId, i) => { + i++ + + GuildCustomRole.create( + interaction.guild.id, + roleId, + color.levels[i].min, + color.levels[i].max + ) + }) await updateRoles(interaction.client, null, interaction.guild.id) @@ -89,6 +132,8 @@ const generateRoles = async (interaction) => { .setColor(color.primary) .setFooter({ text: `${name} ${getTranslation('strings.info', interaction.locale)}` }) + roles.reverse() + roles.forEach(e => card.addFields({ name: getTranslation(`options.levelRoles.${10 - roles.indexOf(e)}`, interaction.locale), value: `<@&${e}>`, inline: true @@ -102,13 +147,21 @@ const generateRoles = async (interaction) => { const removeRoles = async (interaction) => { const guildRoles = await GuildRoles.getRolesOf(interaction.guild.id) + if (!guildRoles) return + + const roles = getRoleIds(guildRoles) if (guildRoles) { for (let i = 1; i <= 10; i++) { if (guildRoles[`level${i}`] && interaction.guild.roles.cache.has(guildRoles[`level${i}`])) await interaction.guild.roles.delete(guildRoles[`level${i}`]).catch(console.error) } + await GuildRoles.remove(interaction.guild.id) + + roles.forEach(async e => { + await GuildCustomRole.remove(interaction.guild.id, e) + }) } } @@ -276,7 +329,7 @@ module.exports = { ], description: getTranslation('command.roles.description', 'en-US'), descriptionLocalizations: getTranslations('command.roles.description'), - usage: `\n - ${GENERATE}\n - ${SETUP}\n - ${REMOVE} \n - ${SETUP_ELO}`, + usage: `\n - ${GENERATE}\n - ${SETUP}\n - ${REMOVE} \n - ${SETUP_ELO} \n - ${REMOVE_ELO}`, type: 'utility', async execute(interaction) { if (!interaction.member.permissions.has('ManageRoles')) diff --git a/functions/roles.js b/functions/roles.js index de336164..8d183728 100644 --- a/functions/roles.js +++ b/functions/roles.js @@ -1,4 +1,3 @@ -const GuildRoles = require('../database/guildRoles') const GuildCustomRole = require('../database/guildCustomRole') const User = require('../database/user') const { getFaceitPlayerDatas } = require('./player') @@ -6,14 +5,15 @@ const { getFaceitPlayerDatas } = require('./player') const getRoleIds = (guildRoles) => Object.keys(Object.entries(guildRoles)[2][1]) .filter(e => e.startsWith('level')).map(e => guildRoles[e]) -const setupRoles = async (client, user, guildRoles, remove) => { - const guildId = guildRoles.guildId ?? guildRoles.id +const setupRoles = async (client, user, guildId, remove) => { const guildDatas = await client.guilds.fetch(guildId) let members if (user) members = [await guildDatas.members.fetch(user.at(0).discordId).catch(() => null)] else members = await guildDatas.members.fetch({ cache: false }) + const roles = await GuildCustomRole.getRolesOf(guildDatas.id) + members?.forEach(async (member) => { if (!member) return let user = await User.get(member.user.id) @@ -24,55 +24,41 @@ const setupRoles = async (client, user, guildRoles, remove) => { user = user.flat().at(0) const playerDatas = await getFaceitPlayerDatas(user.faceitId).catch(console.error) - if (!playerDatas?.games?.csgo) return - const playerLevel = playerDatas.games.csgo.skill_level const playerElo = playerDatas.games.csgo.faceit_elo - const rolesToAdd = [] - - if (guildRoles?.guildId) { - rolesToAdd.push({ - roleId: guildRoles.roleId, - remove: !(playerElo >= guildRoles.eloMin && playerElo <= guildRoles.eloMax && !remove) - }) - } else { - const roleLevels = getRoleIds(guildRoles) - rolesToAdd.push({ - roleId: roleLevels[playerLevel - 1], - remove - }) - } if (user.nickname) await member.edit({ nick: playerDatas.nickname }).catch(console.error) - rolesToAdd.forEach(async (role) => { - const { - roleId, - remove - } = role - + roles.forEach(async (role) => { + const removeRole = remove || playerElo < role.eloMin || playerElo > role.eloMax + const roleId = role.roleId const rolesFit = member.roles.resolve(roleId) - if (remove || !rolesFit) await member.roles.remove(roleId).catch(console.error) - if (!remove && !rolesFit) await member.roles.add(roleId).catch(console.error) + if (removeRole || !rolesFit) await member.roles.remove(roleId).catch((err) => handleRoleErrors(err, role)) + if (!removeRole && !rolesFit) await member.roles.add(roleId).catch((err) => handleRoleErrors(err, role)) }) }) } const updateRoles = async (client, discordId, guildId, remove = false) => { - let user, guildRoles + let user, guilds if (discordId) user = await User.get(discordId) - if (guildId) guildRoles = [await GuildRoles.getRolesOf(guildId), await GuildCustomRole.getRolesOf(guildId)].flat() - else guildRoles = [await GuildRoles.getAll(), await GuildCustomRole.getAll()].flat() + if (guildId) guilds = [guildId].flat() + else guilds = (await GuildCustomRole.getAll()).map(e => e.guildId).filter((e, i, a) => a.indexOf(e) === i) - Promise.all(guildRoles.map(async guildRoles => await setupRoles(client, user, guildRoles, remove).catch(console.error))) + Promise.all(guilds.map(async guild => await setupRoles(client, user, guild, remove).catch(console.error))) .then(() => { if (remove) User.remove(discordId, guildId) }) .catch(console.error) } +const handleRoleErrors = (err, role) => { + if (err.status === '404') GuildCustomRole.remove(role.guildId, role.roleId) +} + module.exports = { - updateRoles + updateRoles, + getRoleIds } diff --git a/updateRole.js b/updateRole.js new file mode 100644 index 00000000..75f91326 --- /dev/null +++ b/updateRole.js @@ -0,0 +1,20 @@ +const GuildCustomRole = require('./database/guildCustomRole') +const GuildRoles = require('./database/guildRoles') +const { getRoleIds } = require('./functions/roles') +const { color } = require('./config.json') +const mongo = require('./database/mongo') + +mongo().then(() => { console.info('🧱 Connected to mongo') }).catch(console.error) + +GuildRoles.getAll() + .then((guildRoles) => + guildRoles.forEach((roles) => { + getRoleIds(roles) + .forEach(async (roleId, i) => + GuildCustomRole.create(roles.id, roleId, color.levels[i + 1].min, color.levels[i + 1].max) + ) + })) + .then(() => console.info('✅ Roles updated')) + .catch(console.error) + .finally(() => process.exit(0)) +