@Limonic

Почему бот выдаёт роль сам себе?

Написал бота, который выдаёт роли по реакции. Всё работает, но бот выдаёт роль себе, а не тому, кто поставил реакцию на его сообщение.
const config = require('./config.json');
const Discord = require('discord.js');
const prefix = config.prefix;
var en1 = "1️⃣";
rn1 = ["817391471765356554"];
en2 = "2️⃣";
rn2 = ["817391475137708072"];
en3 = "3️⃣";
rn3 = ["817391477801222235"];
en4 = "4️⃣";
rn4 = ["817391485615603802"];

function role(robot, message, args) {
    if (message.content === `?role`)
        message.channel.send('Чтобы выбрать роль, нажмите на реакцию под сообщением. 1️⃣ , если вы учитесь на первом курсе. 2️⃣ если вы учитесь на втором курсе. 3️⃣ если вы учитесь на третьем курсе. 4️⃣ если вы учитесь на четвёртом курсе.').then(sentMessage => {
            sentMessage.react(`1️⃣`)
            sentMessage.react(`2️⃣`)
            sentMessage.react(`3️⃣`)
            sentMessage.react(`4️⃣`)
        })
}
exports.exec = (robot) => {
    robot.on("ready", () => {
        console.log(`Logged in as ${client.user.tag}`)
    });
    robot.on("message", e => {
        if (e.content.startsWith(prefix + "reaction")) {
            if (!e.channel.guild) return;
            for (let o in en1) {
                var n = [e.guild.emojis.find(e => e.name == en1[o])];
                for (let o in n) e.react(n[o])
            }
        }
    });

    robot.on("messageReactionAdd", (e, n) => {
        if (n && !n.bot && e.message.channel.guild) {
            for (let o in en1)
                if (e.emoji.name === en1) {
                    e.message.member.roles.add('817391471765356554');
                } else if (e.emoji.name === en2) {
                e.message.member.roles.add('817391475137708072');
            } else if (e.emoji.name === en3) {
                e.message.member.roles.add('817391477801222235');
            } else if (e.emoji.name === en4) {
                e.message.member.roles.add('817391485615603802');
            }
        }
    });
    robot.on("messageReactionRemove", (e, n) => {
        if (n && !n.bot && e.message.channel.guild) {
            for (let o in en1)
                if (e.emoji.name === en1) {
                    e.message.member.roles.remove('817391471765356554');
                }
            else if (e.emoji.name === en2) {
                e.message.member.roles.remove('817391475137708072');
            } else if (e.emoji.name === en3) {
                e.message.member.roles.remove('817391477801222235');
            } else if (e.emoji.name === en4) {
                e.message.member.roles.remove('817391485615603802');
            }
        }
    });



    var comms_list = [{
        name: "role",
        out: role,
        about: "выдача роли"
    }];

    module.exports.comms = comms_list;
}
  • Вопрос задан
  • 85 просмотров
Решения вопроса 1
Alexandre888
@Alexandre888 Куратор тега Боты
Javascript-разработчик
проблема здесь:
e.message.member.roles.add('817391471765356554');

e.message.member.roles.remove('817391475137708072');

функция .on(), при обнаружении названия эвента (messageReactionAdd/Remove), автоматически "присваивает" первому параметру тип класса MessageReaction, второму - тип класса User.

первый параметр у вас называется e, второй - n (крайне не советую пользоваться подобными однобуквенными названиями).

ну и идём по цепочке:

1) вы обращаетесь к параметру e, который имеет тип класса MessageReaction (e)
2) класс MessageReaction имеет свойство message, которое в конкретном случае является сообщением, на котором была обнаружена поставленная реакция
(e.message)

далее, вы просто указываете одно из свойств класса Messagemember, в котором на данный момент, говоря по-простому, содержится бот.

605107379c123771277515.png
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы