#javascript #node.js #discord.js
#язык JavaScript #node.js #discord.js
Вопрос:
Я пытаюсь создать выпадающую систему ролей в discord.js версия 12, и всякий раз, когда я выбираю более одной роли, она дает мне только первую, которую я добавляю.
Вот мой код:
client.on('clickMenu', async menu =gt; { if (menu.values[0] == "quote_pings") { if (menu.clicker.member.roles.cache.has("809011668465745940")) { await menu.clicker.member.roles.remove("809011668465745940") return menu.reply.send("I have removed you from the quote pings role.", true) } else if (!menu.clicker.member.roles.cache.has("809011668465745940")){ await menu.clicker.member.roles.add("809011668465745940") return menu.reply.send("I have given you the quote pings role!", true) } } else if (menu.values[0] == "economy_pings") { if (menu.clicker.member.roles.cache.has("809354393413222431")) { await menu.clicker.member.roles.remove("809354393413222431") return menu.reply.send("I have removed you from the economy pings role.", true) } else if (!menu.clicker.member.roles.cache.has("809354393413222431")){ await menu.clicker.member.roles.add("809354393413222431") return menu.reply.send("I have given you the economy pings role!", true) } } else if (menu.values[0] == "server_pings") { if (menu.clicker.member.roles.cache.has("772763475973242900")) { await menu.clicker.member.roles.remove("772763475973242900") return menu.reply.send("I have removed you from the economy pings role.", true) } else if (!menu.clicker.member.roles.cache.has("772763475973242900")){ await menu.clicker.member.roles.add("772763475973242900") return menu.reply.send("I have given you the economy pings role!", true) } } else if (menu.values[0] == "event_pings") { if (menu.clicker.member.roles.cache.has("828575560137572402")) { await menu.clicker.member.roles.remove("828575560137572402") return menu.reply.send("I have removed you from the event pings role.", true) } else if (!menu.clicker.member.roles.cache.has("828575560137572402")){ await menu.clicker.member.roles.add("828575560137572402") return menu.reply.send("I have given you the event pings role!", true) } } else if (menu.values[0] == "movie_pings") { if (menu.clicker.member.roles.cache.has("828575746845835305")) { await menu.clicker.member.roles.remove("828575746845835305") return menu.reply.send("I have removed you from the event pings role.", true) } else if (!menu.clicker.member.roles.cache.has("828575746845835305")){ await menu.clicker.member.roles.add("828575746845835305") return menu.reply.send("I have given you the event pings role!", true) } } else if (menu.values[0] == "chat_pings") { if (menu.clicker.member.roles.cache.has("872241962588201031")) { await menu.clicker.member.roles.remove("872241962588201031") return menu.reply.send("I have removed you from the chat revive pings role.", true) } else if (!menu.clicker.member.roles.cache.has("872241962588201031")){ await menu.clicker.member.roles.add("872241962588201031") return menu.reply.send("I have given you the chat revive pings role!", true) } } })
Всякий раз, когда я получаю все роли, я получаю только одну роль.
Ответ №1:
В своем коде вы сравниваете только первый элемент menu.values
, используя menu.values[0]
. Если вы хотите добавить/удалить все роли, вам нужно будет использовать какой-то цикл:
client.on("clickMenu", async (menu) =gt; { const { values } = menu; // Run through all values selected for (const value of values) { // Do different actions based on the current value // if/else if can also be used instead of a switch statement switch (value) { case "quote_pings": { if (menu.clicker.member.roles.cache.has("809011668465745940")) { await menu.clicker.member.roles.remove("809011668465745940"); menu.reply.send("I have removed you from the quote pings role.", true); } else if (!menu.clicker.member.roles.cache.has("809011668465745940")){ await menu.clicker.member.roles.add("809011668465745940"); menu.reply.send("I have given you the quote pings role!", true); } break; } case "economy_pings": { if (menu.clicker.member.roles.cache.has("809354393413222431")) { await menu.clicker.member.roles.remove("809354393413222431"); menu.reply.send("I have removed you from the economy pings role.", true); } else if (!menu.clicker.member.roles.cache.has("809354393413222431")){ await menu.clicker.member.roles.add("809354393413222431"); menu.reply.send("I have given you the economy pings role!", true); } break; } /** * etc... */ } } });
Ответ №2:
Проблема в том, что вы проверяете только первый элемент menu.values
( menu.values[0]
). Это прекрасно, если вы разрешите только одну роль, но не будет работать, если вы выберете более одной роли. Чтобы решить эту проблему, вы можете выполнить итерацию по всем выбранным value
s.
Вы также можете упростить свой код, создав roles
объект, в котором ключи являются значениями меню.
client.on('clickMenu', async menu =gt; { let roles = { quote_pings: { id: '809011668465745940', name: 'quote pings', }, economy_pings: { id: '809354393413222431', name: 'economy pings', }, server_pings: { id: '772763475973242900', name: 'server pings', }, event_pings: { id: '828575560137572402', name: 'event pings', }, movie_pings: { id: '828575746845835305', name: 'movie pings', }, chat_pings: { id: '872241962588201031', name: 'chat revive pings', }, } for (let value of menu.values) { let role = roles[value] if (!role) continue if (menu.clicker.member.roles.cache.has(role.id)) { await menu.clicker.member.roles.remove(role.id) menu.reply.send(`I have removed you from the ${role.name} role.`, true) } else { await menu.clicker.member.roles.add(role.id) menu.reply.send(`I have given you the ${role.name} role!`, true) } } })
Комментарии:
1. Ух ты! Спасибо!!