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)