Бот спрашивает пользователя, к какой роли он хочет присоединиться, бот добавляет его в роль на основе ответа.

В свободное время я медленно изучаю javascript и еще не дошел до этого. Но друг попросил меня сделать простого бота, который будет отправлять личные сообщения каждому новому пользователю, который присоединяется к серверу, спрашивает их, какого цвета они хотели бы, чтобы их имя пользователя было, и добавляет их к роли, которой они отвечают. Роли на сервере не имеют значения разрешений. Это просто цвет для имени пользователя (сервер Discord - это чат сообщества на основе DeviantArt).

В приведенном ниже отрывке он работает нормально, пока пользователь не ответит «синим цветом» и ответом «Пожалуйста, выберите цвет или убедитесь, что вы ввели цвет точно так, как показано». отправляется вместо добавления пользователя к нужной роли и ответа с указанием цвета. Я почти уверен, что проблема с этой частью:

user.addTo(server.roles.get("name", `${collected.first().content}`));
newmsg.channel.send(`Your name is now: **${collected.first().content}** Thank you and enjoy the server!`)

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

bot.on('guildMemberAdd', member => {
   member.send("Welcome to RebornWings! Please select a color for your username! **Choices: orange-red, red, blue, blue-green, or purple** Please type exactly how they appear in the list of choices.")
   .then((newmsg) => { //Now newmsg is the message you sent
     newmsg.channel.awaitMessages(response => response.content, {
       max: 1,
       time: 300000,
       errors: ['time'],
    }).then((collected) => {
     user.addTo(server.roles.get("name", `${collected.first().content}`))
     newmsg.channel.send(`Your name is now: **${collected.first().content}** Thank you and enjoy the server!`)
}).catch(() => {
newmsg.channel.send('Please choose a color or be sure you typed the color exactly as shown.');
      });
    });
});

bot.login(config.token);

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

Заранее спасибо за помощь, пока я медленно учусь самостоятельно.


person Zarvix    schedule 26.08.2018    source источник
comment
Перечисленные цвета действительно отображаются: да, но вы сами ввели их для отправленного сообщения, они не отражают напрямую то, что сервер пытается сопоставить (вероятно, внутри server.roles.get()). Кроме того, вы проверяли, что collected.first().content содержит то, что вы ожидаете? Наконец (на самом деле, во-первых) вызываемый .catch() получает ошибку в качестве первого аргумента, описывающего проблему: попробуйте .catch((err) => {... и отобразите этот err, чтобы лучше понять, что произошло.   -  person Stock Overflaw    schedule 27.08.2018


Ответы (1)


Оператор Catch после процесса добавления роли запускается, потому что вы пытаетесь неправильно получить роль и добавить ее к несуществующей переменной.

Было бы правильно, если бы вы заменили user на member и заменили addTo на addRole.
Также get для этой цели не используется. Вы используете Collection # get с идентификаторами Snowflake (роли сервера сохраняются в коллекции).
Для вашей цели вам просто нужно заменить get на find, и все будет работать нормально. Но, как уже сказал Stock Overflaw, я сначала проверю, правильно ли ввел пользователь. Вы НИКОГДА не доверяете слепому вводу пользователей.

person theLee    schedule 27.08.2018