Discord.js имеет Событие, которое вы можете слушать, которое называется guildMemberUpdate
, которое запускается всякий раз, когда член гильдии ... хорошо ... обновляется.Среди прочего, это включает в себя добавление / удаление ролей.Это означает, что вы можете прослушивать обновления участников и определять, получила ли пользователь новую роль и является ли эта новая роль «Novitiate».
После этого вам нужно сохранить метку / дату в файле илинекоторые базы данных и периодически проверять это.Если прошло более 7 дней с тех пор, как пользователь получил роль, назначьте этому пользователю новую роль.
Пример кода (не тестировался, но должен дать представление):
bot.on('guildMemberUpdate', (oldMember, newMember) => {
if (!(oldMember.roles.has(role => role.name === 'Novitiate')) &&
newMember.roles.has(role => role.name === 'Novitiate')) {
// member has gotten the role 'Novitiate'
// This doesn't work, it just a demo on saving the timestamp
database.save('assignedRole', { user: newMember.id, guild: newMember.guild, date: new Date() });
}
});
function periodicalCheck () {
let rows = database.get('assignedRole');
let alteredRows = rows;
for (let row of rows) {
if (dateDiff(row.date) >= 7) {
let guild = bot.guilds.find(guild => guild.id === row.guild);
let member = guild.members.find(member => member.id === row.user);
member.addRole('Member');
alteredRows.splice(alteredRows.indexOf(row), 1);
}
}
// Remove the records which have been used to clean up the database
database.set('assignedRole', alteredRows);
}
function dateDiff (date) {
let timeDiff = Math.abs(new Date().getTime() - new Date(date).getTime());
return Math.ceil(timeDiff / (1000 * 3600 * 24));
}
Единственное, что нужно сделать сейчас, - это найти способ хранения этой информации и вызвать метод periodicalCheck
с интервалом.