Discord.JS, Как использовать одну кнопку discord, чтобы разрешить покупку различных ролей сервера

#button #discord.js #roles #discord-buttons

Вопрос:

Извините за плохо сформулированное название, я постараюсь объяснить как можно лучше. Я создаю команду магазина ролей, используя новый модуль discord-buttons, и столкнулся с проблемой, насколько я понимаю, мне пришлось бы создать кнопку для каждой отдельной роли, чтобы кто-то мог ее купить. После просмотра документации я все еще немного озадачен. Вот несколько примеров кода, которые я собрал, чтобы показать, что я пытаюсь сделать:

 let embedRed = new Discord.MessageEmbed()
                
        .setTitle('Red Role')
        .setColor('#c46413')
        .addField('**Price**', '10,000', true)
        .addField('**Color Hex:**', '#ffffff',true)

 let embedBlue = new Discord.MessageEmbed() 
                  
          .setTitle('Blue')
          .setColor('#c2a289')
          .addField('**Price**', '10,000', true)
          .addField('**Color Hex:**', '#ffffff',true)

  ///Buttons
let buttonBuyRed = new MessageButton()
.setStyle('green')
.setLabel('Buy Red Role')
.setID('role_buy1')


let buttonBuyBlue = new MessageButton()
.setStyle('green')
.setLabel('Buy Blue Role')
.setID('role_buy2')

//embeded messages being sent
 message.channel.send({ buttons: [buttonBuyRed], embed: embedRed});
    message.channel.send({ buttons: [buttonBuyRed], embed: embedBlue});


//What happens if buttons are pressed
client.on('clickButton', async (role_buy1) => {
  if (button.id === 'roley_buy1') {
    button.channel.send(`${button.clicker.user.tag} bought red role`);
db.push(message.author.id, `${message.guild.roles.cache.get('role id here')}`) //role being pushed to user's inventory
  }
});

client.on('clickButton', async (role_buy2) => {
  if (button.id === 'role_buy2') {
    button.channel.send(`${button.clicker.user.tag} bought blue role`);
db.push(message.author.id, `${message.guild.roles.cache.get('role id here')}`) //role being pushed to user's inventory
  }
});
 

Поскольку у меня есть около 25 различных ролей, которые я хочу, чтобы пользователи могли приобретать, создать кнопку для каждой роли довольно сложно, я ищу способ просто использовать одну единственную кнопку «buy_role», которая работает для всех доступных ролей.

Если я что-то не объяснил ясно, пожалуйста, дайте мне знать, любая помощь будет признательна!

Комментарии:

1. итак, вы хотите назначить каждую роль в гильдии пользователю, когда он нажимает на кнопку?

2. @EJBEAN Нет, извините, я все еще пытаюсь придумать лучший способ объяснить это, ха-ха, В значительной степени есть магазин ролей, который позволяет пользователям покупать роли. Вот фотография: imgur.com/a/piAuoXz Обе кнопки «Купить роль» одинаковы (с идентификатором buy_role), единственная проблема, с которой я сталкиваюсь, заключается в том, чтобы выяснить, как указать, какая роль покупается, поскольку кнопка одинакова (оператор if должен отличаться)

3. проверьте ответ сейчас 😀

Ответ №1:

Поэтому я пришел к выводу, что этот код работает, но если в вашей гильдии много ролей, это приведет к ошибке «Недопустимое тело формы».

         const rolesInGuild = message.guild.roles.cache.array(); //creating array from collection of roles in a guild
        const buttons = []; // an empty array for our buttons
        for (const role of rolesInGuild) { // creating a loop inorder to create a button for every roles in rolesInGuild Array
            const button = new MessageButton()
                .setStyle('red') // default: blurple
                .setLabel(`${role.name}`) // default: NO_LABEL_PROVIDED
                .setID(`${role.id}`);
            buttons.push(button); // button id is the same as role id so its unique!
        }
        console.log(rolesInGuild);
        console.log(buttons);
        await message.channel.send('test', { buttons: buttons }); // sending our buttons

        bot.on('clickButton', async(button) => {
            for (const btn of buttons) {
                if (btn.custom_id == button.id) {
                    const role = button.guild.roles.cache.get(btn.custom_id);
                    const member = message.guild.members.cache.get(button.clicker.user.id);
                    member.roles.add(role);
                }
            }
        });
 

введите описание изображения здесь

вы можете добавить определенные роли в массив rolesInGuild в этом формате
[{ имя: ‘имя роли’, идентификатор: ‘идентификатор роли’ }] вместо всех ролей в гильдии ( я не был уверен, какова ваша цель)

Комментарии:

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

2. моя плохая больная добавляй комментарии

3. о, это совсем не на вас, если вы хотите, хотя это было бы потрясающе

4. добавлены комментарии, если вам нужна помощь в чем-то, свяжитесь со мной в stack или discord (EJ BEAN#3961)

5. только что отправил запрос на discord 🙂

Ответ №2:

у вас есть ${message.guild...} , это неправильно, если у вас есть ошибка, так что попробуйте это:

   if (button.id === 'roley_buy1') {
    button.channel.send(`${button.clicker.user.tag} bought red role`);
    db.push(message.author.id, `${button.guild.roles.cache.get('role id here')}`) //role 
    being pushed to user's inventory
    button.clicker.roles.add('your role id');
    // or you can find the role using
    const role = button.guild.roles.cache.find(role => role.name == 'rolename');
    button.clicker.roles.add(role);
  }
});```