Переместить пользователя в другую роль на основе времени X на сервере - PullRequest
0 голосов
/ 21 января 2019

Я довольно долго возился с этим, и мне кажется, что он не работает.
Я хочу, чтобы мой бот Discord автоматически назначал другую роль, когда пользователь получает Novitiate.роль.Это потому, что я хочу дать новобранцам нашей внутриигровой гильдии тестовый период в одну неделю, прежде чем они станут полноправными членами.
Как я могу автоматизировать это с помощью бота Discord?

Пока чтоЯ пробовал подобные вещи, но все безрезультатно:

bot.on('message', message => {
    if (message.member.roles.has(role => role.name === 'Novitiate')) {
       // user has that role
       message.member.addRole('Member');
       console.log(`User has been moved to new role!`);
    }
});

Я понятия не имею, как установить «таймер», когда пользователю назначена определенная роль (Novitiate), поэтому я надеюсь, что кто-то сможетНаправь меня в правильном направлении.

1 Ответ

0 голосов
/ 22 января 2019

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 с интервалом.

...