Discord.JS,如何使用一个不和谐按钮来允许购买各种服务器角色

Posted

技术标签:

【中文标题】Discord.JS,如何使用一个不和谐按钮来允许购买各种服务器角色【英文标题】:Discord.JS, How to use one discord button to allow the purchase of various server roles 【发布时间】:2021-08-19 01:57:42 【问题描述】:

抱歉标题措辞不佳,我会尽力解释。我正在使用新的不和谐按钮模块创建角色商店命令,但遇到了一个问题,据我了解,我必须为每个角色创建一个按钮,以便有人购买。在搜索文档后,我仍然有点难过。这是我整理的一些示例代码,以显示我正在尝试做的事情:

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 个不同的角色,因此为每个角色创建一个按钮非常麻烦,我正在寻找一种方法来只使用一个适用于的“购买角色”按钮所有可用的角色。

如果我没有解释清楚,请告诉我,感谢任何帮助!

【问题讨论】:

所以你想在用户点击按钮时将公会中的每个角色分配给用户? @EJBEAN 不抱歉,我仍在努力找出解释它的最佳方式哈哈,几乎有一个角色商店允许用户购买角色。这是一张图片:imgur.com/a/piAuoXz 两个“购买角色”按钮都是相同的(ID 为 buy_role),我遇到的唯一问题是弄清楚如何指定要购买的角色,因为按钮是相同的(如果声明必须不同) 现在检查答案:D 【参考方案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 [ name: 'rolename', id: 'roleid' ] 而不是公会中的每个角色(我不确定你的目标是什么)

【讨论】:

看起来棒极了!在这方面我有点慢,所以我会阅读它以尝试理解它,我会回复你! 我的坏病添加了 cmets 哦,这完全不适合你,如果你愿意的话,那就太棒了 添加了 cmets,如果您需要帮助,请在堆栈或不和谐中与我联系 (EJ BEAN#3961) 刚刚发送了一个不和谐的请求:)【参考方案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);
  
);```

【讨论】:

以上是关于Discord.JS,如何使用一个不和谐按钮来允许购买各种服务器角色的主要内容,如果未能解决你的问题,请参考以下文章

如何自动更改不和谐机器人的昵称。 (Javascript)(Discord.js)

使用 discord.js 查找不和谐消息的内容

如何获取对特定消息做出反应的用户的不和谐 ID discord.js

我不知道 discord.js v13 按钮

使用 Discord 按钮的建议命令 Discord.JS

剪切 Discord 消息的特定部分?不和谐.js