Skip to content

Commit

Permalink
fix/role attribution (#360)
Browse files Browse the repository at this point in the history
* update: roles

* feat: updateRole script
  • Loading branch information
JustDams authored Jun 19, 2023
1 parent 183528f commit eb1c676
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 37 deletions.
63 changes: 58 additions & 5 deletions commands/roles.js
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -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)

Expand All @@ -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
Expand All @@ -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)
})
}
}

Expand Down Expand Up @@ -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'))
Expand Down
50 changes: 18 additions & 32 deletions functions/roles.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
const GuildRoles = require('../database/guildRoles')
const GuildCustomRole = require('../database/guildCustomRole')
const User = require('../database/user')
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)
Expand All @@ -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
}
20 changes: 20 additions & 0 deletions updateRole.js
Original file line number Diff line number Diff line change
@@ -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))

0 comments on commit eb1c676

Please sign in to comment.