Добавление и удаление ролей на основе переменных

#mysql #cron #discord.js

Вопрос:

Я написал около 95% кода, необходимого для этой работы, просто нужно закончить его, чтобы в отправленном сообщении о внедрении отображался список людей, чьи роли были скорректированы правильно. Может ли кто-нибудь указать мне правильное направление, чтобы правильно отсортировать участников и разместить их в встраивании?

Вот код:

 cron.schedule('00 12 * * *', function () {
    con.query(`SELECT * FROM users WHERE member = 'Yes' AND user_registered < DATE_SUB(NOW(),INTERVAL 14 DAY)`, (err, rows) => {
        if (err) throw err

        rows.slice().forEach(row => {
            const discord = row.discord
            const member = bot.users.cache.get(discord)
            const rank = row.rank
            const messages = row.messages
            const registered = row.user_registered
            const days = Math.round((Date.now() / 1000 / 60 / 60 / 24) - (registered / 1000 / 60 / 60 / 24))

            if (days >= 14 amp;amp; messages >= 150 amp;amp; rank === 'Recruit') {
                member.roles.remove(member.guild.roles.cache.find(role => role.name === 'Recruit'))
                member.roles.add(member.guild.roles.cache.find(role => role.name === 'Noble'))
            } else if (days >= 30 amp;amp; messages >= 750 amp;amp; rank === 'Noble') {
                member.roles.remove(member.guild.roles.cache.find(role => role.name === 'Noble'))
                member.roles.add(member.guild.roles.cache.find(role => role.name === 'Hero'))
            } else if (days >= 90 amp;amp; messages >= 1500 amp;amp; rank === 'Hero') {
                member.roles.remove(member.guild.roles.cache.find(role => role.name === 'Hero'))
                member.roles.add(member.guild.roles.cache.find(role => role.name === 'Fabled'))
            } else if (days >= 180 amp;amp; messages >= 3000 amp;amp; rank === 'Fabled') {
                member.roles.remove(member.guild.roles.cache.find(role => role.name === 'Fabled'))
                member.roles.add(member.guild.roles.cache.find(role => role.name === 'Mythic'))
            } else if (days >= 365 amp;amp; messages >= 6000 amp;amp; rank === 'Mythic') {
                member.roles.remove(member.guild.roles.cache.find(role => role.name === 'Mythic'))
                member.roles.add(member.guild.roles.cache.find(role => role.name === 'Legend'))
            }

            const noble = a //This needs to be set up
            const hero = b //This needs to be set up
            const fabled = c //This needs to be set up
            const mythic = d //This needs to be set up
            const legend = e //This needs to be set up

            const promotionEmbed = new Discord.MessageEmbed()
                .setColor('#ff6600')
                .setTitle('Promotions')
                .setDescription(`The following members have been promoted:`)
                .addFields({
                    name: 'Noble',
                    value: `${noble.join('n')}` || 'None', //This needs to be set up
                    inline: true
                }, {
                    name: 'Hero',
                    value: `${hero.join('n')}` || 'None', //This needs to be set up
                    inline: true
                }, {
                    name: 'Fabled',
                    value: `${fabled.join('n')}` || 'None', //This needs to be set up
                    inline: true
                }, {
                    name: 'Mythic',
                    value: `${mythic.join('n')}` || 'None', //This needs to be set up
                    inline: true
                }, {
                    name: 'Legend',
                    value: `${legend.join('n')}` || 'None', //This needs to be set up
                    inline: true
                })

            genchat.send(promotionEmbed)
        })
    })
})
 

Ответ №1:

Как насчет этого?

 const noble = member.guild.members.cache.filter(member => member.roles.cache.find(role => role.name == "Noble")).array();
const hero =  member.guild.members.cache.filter(member => member.roles.cache.find(role => role.name == "Hero")).array();
const fabled = member.guild.members.cache.filter(member => member.roles.cache.find(role => role.name == "Fabled")).array();
const mythic = member.guild.members.cache.filter(member => member.roles.cache.find(role => role.name == "Mythic")).array();
const legend = member.guild.members.cache.filter(member => member.roles.cache.find(role => role.name == "Legend")).array();
 

Вы фильтруете членов гильдии и оставляете тех, у кого есть роли.

Редактировать:

 cron.schedule('00 12 * * *', function () {
    con.query(`SELECT * FROM users WHERE member = 'Yes' AND user_registered < DATE_SUB(NOW(),INTERVAL 14 DAY)`, (err, rows) => {
        if (err) throw err

        let noble = []
        let hero = []
        let fabled = []
        let mythic = []
        let legend = []

        rows.slice().forEach(row => {
            const discord = row.discord
            const member = bot.users.cache.get(discord)
            const rank = row.rank
            const messages = row.messages
            const registered = row.user_registered
            const days = Math.round((Date.now() / 1000 / 60 / 60 / 24) - (registered / 1000 / 60 / 60 / 24))

            if (days >= 14 amp;amp; messages >= 150 amp;amp; rank === 'Recruit') {
                member.roles.remove(member.guild.roles.cache.find(role => role.name === 'Recruit'))
                member.roles.add(member.guild.roles.cache.find(role => role.name === 'Noble'))
                noble.push(member)
            } else if (days >= 30 amp;amp; messages >= 750 amp;amp; rank === 'Noble') {
                member.roles.remove(member.guild.roles.cache.find(role => role.name === 'Noble'))
                member.roles.add(member.guild.roles.cache.find(role => role.name === 'Hero'))
                hero.push(member)
            } else if (days >= 90 amp;amp; messages >= 1500 amp;amp; rank === 'Hero') {
                member.roles.remove(member.guild.roles.cache.find(role => role.name === 'Hero'))
                member.roles.add(member.guild.roles.cache.find(role => role.name === 'Fabled'))
                fabled.push(member)
            } else if (days >= 180 amp;amp; messages >= 3000 amp;amp; rank === 'Fabled') {
                member.roles.remove(member.guild.roles.cache.find(role => role.name === 'Fabled'))
                member.roles.add(member.guild.roles.cache.find(role => role.name === 'Mythic'))
                mythic.push(member)
            } else if (days >= 365 amp;amp; messages >= 6000 amp;amp; rank === 'Mythic') {
                member.roles.remove(member.guild.roles.cache.find(role => role.name === 'Mythic'))
                member.roles.add(member.guild.roles.cache.find(role => role.name === 'Legend'))
                legend.push(member)
            }
        })

        const promotionEmbed = new Discord.MessageEmbed()
            .setColor('#ff6600')
            .setTitle('Promotions')
            .setDescription(`The following members have been promoted:`)
            .addFields({
                name: 'Noble',
                value: `${noble.join('n')}` || 'None', //This needs to be set up
                inline: true
            }, {
                name: 'Hero',
                value: `${hero.join('n')}` || 'None', //This needs to be set up
                inline: true
            }, {
                name: 'Fabled',
                value: `${fabled.join('n')}` || 'None', //This needs to be set up
                inline: true
            }, {
                name: 'Mythic',
                value: `${mythic.join('n')}` || 'None', //This needs to be set up
                inline: true
            }, {
                name: 'Legend',
                value: `${legend.join('n')}` || 'None', //This needs to be set up
                inline: true
            })
        genchat.send(promotionEmbed)

    })
})
 

Если я правильно понимаю, каждая строка-это один пользователь discord. Вам необходимо накопить изменения, внесенные пользователями за пределами foreach. И отправьте сообщение после завершения цикла for.

Ничего не тестировал, надеюсь, это поможет.

Комментарии:

1. Разве это не подтянуло бы всех участников этой роли, а не тех, чьи роли были изменены?

2. Я обновил свой ответ. Это должно посылать только тех, у кого скорректированы роли.

Ответ №2:

Skulaurun поднял меня с 95% до 99%, просто нужно было изменить определение члена и добавить еще немного sql для обновления базы данных, но вот готовый рабочий код.

Этот код назначает роли участников на основе активности сервера (отправленных сообщений) и информации о времени (как долго они были зарегистрированы на сервере), которая хранится в базе данных mysql.

 cron.schedule('51 10 * * *', function () {
    con.query(`SELECT * FROM users WHERE member = 'Yes' AND user_registered < DATE_SUB(NOW(),INTERVAL 14 DAY)`, (err, rows) => {
        if (err) throw err

        const genchat = bot.channels.cache.get('785187526477742141');

        let noble = []
        let hero = []
        let fabled = []
        let mythic = []
        let legend = []

        rows.slice().forEach(row => {
            const guild = bot.guilds.cache.get('779892144026288179')
            const discord = row.discord
            const member = guild.members.cache.get(discord)
            const rank = row.rank
            const messages = row.messages
            const registered = row.user_registered
            const days = Math.round((Date.now() / 1000 / 60 / 60 / 24) - (registered / 1000 / 60 / 60 / 24))

            if (days >= 14 amp;amp; messages >= 150 amp;amp; rank === 'Recruit') {
                member.roles.remove(guild.roles.cache.find(role => role.name === 'Recruit'))
                member.roles.add(guild.roles.cache.find(role => role.name === 'Noble'))

                noble.push(member)

                con.query(`UPDATE users SET rank = 'Noble' WHERE discord = '${member.user.id}'`, (err) => {
                    if (err) throw err
                })
            } else if (days >= 30 amp;amp; messages >= 750 amp;amp; rank === 'Noble') {
                member.roles.remove(guild.roles.cache.find(role => role.name === 'Noble'))
                member.roles.add(guild.roles.cache.find(role => role.name === 'Hero'))

                hero.push(member)

                con.query(`UPDATE users SET rank = 'Hero' WHERE discord = '${member.user.id}'`, (err) => {
                    if (err) throw err
                })
            } else if (days >= 90 amp;amp; messages >= 1500 amp;amp; rank === 'Hero') {
                member.roles.remove(guild.roles.cache.find(role => role.name === 'Hero'))
                member.roles.add(guild.roles.cache.find(role => role.name === 'Fabled'))

                fabled.push(member)

                con.query(`UPDATE users SET rank = 'Fabled' WHERE discord = '${member.user.id}'`, (err) => {
                    if (err) throw err
                })
            } else if (days >= 180 amp;amp; messages >= 3000 amp;amp; rank === 'Fabled') {
                member.roles.remove(guild.roles.cache.find(role => role.name === 'Fabled'))
                member.roles.add(guild.roles.cache.find(role => role.name === 'Mythic'))

                mythic.push(member)

                con.query(`UPDATE users SET rank = 'Mythic' WHERE discord = '${member.user.id}'`, (err) => {
                    if (err) throw err
                })
            } else if (days >= 365 amp;amp; messages >= 6000 amp;amp; rank === 'Mythic') {
                member.roles.remove(guild.roles.cache.find(role => role.name === 'Mythic'))
                member.roles.add(guild.roles.cache.find(role => role.name === 'Legend'))
                
                legend.push(member)

                con.query(`UPDATE users SET rank = 'Legend' WHERE discord = '${member.user.id}'`, (err) => {
                    if (err) throw err
                })
            }
        })

        const promotionEmbed = new Discord.MessageEmbed()
            .setColor('#ff6600')
            .setTitle('Promotions')
            .setDescription(`The following members have been promoted:`)
            .addFields({
                name: 'Noble',
                value: `${noble.join('n')}` || 'None',
                inline: true
            }, {
                name: 'Hero',
                value: `${hero.join('n')}` || 'None',
                inline: true
            }, {
                name: 'Fabled',
                value: `${fabled.join('n')}` || 'None',
                inline: true
            }, {
                name: 'Mythic',
                value: `${mythic.join('n')}` || 'None',
                inline: true
            }, {
                name: 'Legend',
                value: `${legend.join('n')}` || 'None',
                inline: true
            })
        genchat.send(promotionEmbed)

    })
});