【问题标题】:Can't give multiple roles with dropdown roles不能使用下拉角色提供多个角色
【发布时间】:2022-01-11 03:08:06
【问题描述】:

我正在尝试在 discord.js 版本 12 中创建一个下拉角色系统,每当我选择多个角色时,它只会给我添加的第一个角色。

这是我的代码:

client.on('clickMenu', async menu => {

        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)
          }  
        }
      })

每当我获得所有角色时,我只会获得一个角色。

【问题讨论】:

    标签: javascript node.js discord.js


    【解决方案1】:

    在您的代码中,您仅使用menu.values[0] 比较menu.values 的第一项。如果要添加/删除所有角色,则需要使用某种循环:

    client.on("clickMenu", async (menu) => {
      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]) 的第一个元素。如果您只允许一个角色,那很好,但如果您选择多个角色,则不起作用。要解决这个问题,您可以遍历所有选定的 values。

      您还可以通过创建一个roles 对象来简化代码,其中键是菜单值。

      client.on('clickMenu', async menu => {
        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)
          }
        }
      })
      

      【讨论】:

      • 哇哦!谢谢!!
      猜你喜欢
      • 1970-01-01
      • 2011-02-17
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多