Discord JS // Попытка добавить роль и удалить роли, реагируя на сообщение - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь закодировать ролевую реакцию для моего бота разногласий. В настоящее время, сейчас я застрял на том, как сделать так, чтобы несколько человек могли реагировать на сообщение, чтобы получить роль (и) или удалить роль (и). Я также хотел бы, чтобы встраиваемое сообщение было постоянным.

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

Это мой текущий код:

const Discord = require("discord.js");
const colors = require("../colors");
const botconfig = require("../botconfig")

module.exports.run = async (bot, message, args) => {


    const eRole = message.guild.roles.get('688477690344374283'); // Events
    const uRole = message.guild.roles.get('688477558982836344'); // Updates
    const pRole = message.guild.roles.get('688477868078137369'); // Polls
    const smRole = message.guild.roles.get('687498488295981069'); // Social Media
    const qRole = message.guild.roles.get('688477467840872452'); // QOTD

   const filter = (reaction, user) => ['❤️', '?', '?', '?','?'].includes(reaction.emoji.name) && user.id === message.author.id;

  let embed = new Discord.RichEmbed()
        .setTitle('Pinged Roles')
        .setDescription(`

      ❤️ ${eRole.toString()}
      ? ${uRole.toString()}
      ? ${pRole.toString()}
      ? ${smRole.toString()}
      ? ${qRole.toString()}
        `)
        .addField("**TIP:**", "Double react to remove a role")
        .setColor(colors.aqua)
        .setTimestamp()
        .setFooter(`mc.advancius.net`,bot.user.displayAvatarURL)

    message.channel.send(embed).then(async msg => {

        await msg.react('❤️');
        await msg.react('?');
        await msg.react('?');
        await msg.react('?');
        await msg.react('?');

      msg.awaitReactions(filter, {

        max:1,


        }).then(collected => {

            const reaction = collected.first();

            switch (reaction.emoji.name) {
                case '❤️':
                    if (message.member.roles.has(eRole.id)) {
                        return message.channel.send('You are already in this role!').then(m => m.delete(3000));
                    }
                    message.member.addRole(eRole).catch(err => {
                        console.log(err);
                        return message.channel.send(`Error adding you to this role: **${err.message}**.`);
                    });
                    message.channel.send(`You have been added to the **${eRole.name}** role!`).then(m => m.delete(3000));

                    break;
                case '?':
                    if (message.member.roles.has(uRole.id)) {

                        return message.channel.send('You are already in this role!').then(m => m.delete(3000));
                    }
                    message.member.addRole(uRole).catch(err => {
                        console.log(err);
                        return message.channel.send(`Error adding you to this role: **${err.message}**.`);
                    });
                    message.channel.send(`You have been added to the **${uRole.name}** role!`).then(m => m.delete(3000));

                    break;
                case '?':
                    if (message.member.roles.has(pRole.id)) {

                        return message.channel.send('You are already in this role!').then(m => m.delete(3000));
                    }
                    message.member.addRole(pRole).catch(err => {
                        console.log(err);
                        return message.channel.send(`Error adding you to this role: **${err.message}**.`);
                    });
                    message.channel.send(`You have been added to the **${pRole.name}** role!`).then(m => m.delete(3000));

                    break;
              case '?':
                    if (message.member.roles.has(smRole.id)) {

                        return message.channel.send('You are already in this role!').then(m => m.delete(3000));
                    }
                    message.member.addRole(smRole).catch(err => {
                        console.log(err);
                        return message.channel.send(`Error adding you to this role: **${err.message}**.`);
                    });
                    message.channel.send(`You have been added to the **${smRole.name}** role!`).then(m => m.delete(3000));

                    break;
              case '?':
                    if (message.member.roles.has(qRole.id)) {
                        return message.channel.send('You are already in this role!').then(m => m.delete(3000));
                    }
                    message.member.addRole(qRole).catch(err => {
                        console.log(err);
                        return message.channel.send(`Error adding you to this role: **${err.message}**.`);
                    });
                    message.channel.send(`You have been added to the **${qRole.name}** role!`).then(m => m.delete(3000));

                    break;
          };
      });
  })             
};

exports.help = {
    name: 'roles2'
};

1 Ответ

0 голосов
/ 21 апреля 2020

Вместо сборщика я бы посоветовал сохранить объект или идентификатор этого сообщения в JSON и прослушать события messageReactionAdd и messageReactionRemove, чтобы проверить смайлики, используемые для добавления и удаления роли.

Пример:

bot.on("messageReactionAdd", (reaction, user) => {

     if (reaction.message.id != "stored_msg_id") return; // or you can compare the message objects

     const eRole = message.guild.roles.get('688477690344374283');
     switch (reaction.emoji.name) { 
          case "❤️": reaction.message.guild.member(user).addRole(eRole); break;
          // etc.
     }
});

Все может измениться в зависимости от вашей версии разногласий. js версия

...