#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)
})
});