我无法在 Discord.js 中添加多个前缀

时间:2021-02-10 01:11:22

标签: javascript node.js discord.js

当前前缀是“#”。

module.exports = async function(msg) {
    let args = msg.content.split(' ');
    let command = args.shift();
    if (command.charAt(0) === '#') {
      command = command.substring(1);
      commandName[command](msg, args);
    }
};

当我尝试向其添加前缀数组时,它似乎不起作用。

const prefix = [ '#', 'br', 'bread', '<@767558534074204191>', '<@!767558534074204191>', ];

module.exports = async function(msg) {
  let tokens = msg.content.split(' ');
  let command = tokens.shift();
  if (command.charAt(0) === prefix) {
    command = command.substring(1);
    commandName[command](msg, tokens);
  }
};

如何添加更多前缀以便我可以有多个前缀? 就像机器人提到的前缀之一。

2 个答案:

答案 0 :(得分:0)

线条

const prefix = [ '#', 'br', 'bread', '<@767558534074204191>', '<@!767558534074204191>' ];

  if (command.charAt(0) === prefix) {
     ... do stuff
  }
};

您定义了一个包含 5 个值的数组,然后您试图查看字符串命令的第一个字符是否等于该数组。这永远不会评估为真,因为函数 .charAt(0) 将只返回该字符串的第一个字符。

您要做的是根据命令检查数组的每个值。我们可以在遍历数组时对字符串使用 startsWith() 函数。

类似于:

const prefix = [ '#', 'br', 'bread', '<@767558534074204191>', '<@!767558534074204191>' ];
  
  // see if a value in the prefix array is at the beginning of the command.
  for(let x = 0; x < prefix.length; x++) {
      if (command.startsWith(prefix[x])) { 
          ...do whatever you were intending to here
          break // break out of the loop by using the break keyword.         
      }
  }
  })
};

答案 1 :(得分:0)

如果您有一个前缀数组,则无法将其与字符串的第一个字符进行比较。每次都是假的。您应该将字符串与字符串进行比较,因此您应该将数组的元素与消息进行比较。

您可以在数组上使用 .some() 方法来检查数组中是否至少有一个元素通过了由提供的函数实现的测试。在该函数中,您可以检查消息 startsWith() 是否是数组中的任何字符串。

如果 array.some(el => message.startsWith(el))true 中的任何字符串开头,则类似 message 的函数返回 array

检查以下代码段。您可以了解如何同时使用 .some() 和 .startsWith()

let message = '';
const prefixes = [ '#', 'br', 'bread', '<@767558534074204191>', '<@!767558534074204191>', ];

console.log(prefixes.some(prefix => message.startsWith(prefix)), message)

message = 'lorem ipsum'
console.log(prefixes.some(prefix => message.startsWith(prefix)), message)

message = '# lorem ipsum'
console.log(prefixes.some(prefix => message.startsWith(prefix)), message)

message = 'br lorem ipsum'
console.log(prefixes.some(prefix => message.startsWith(prefix)), message)

message = 'bread lorem ipsum'
console.log(prefixes.some(prefix => message.startsWith(prefix)), message)

message = '<@767558534074204191> lorem ipsum'
console.log(prefixes.some(prefix => message.startsWith(prefix)), message)

message = '<@!767558534074204191> lorem ipsum'
console.log(prefixes.some(prefix => message.startsWith(prefix)), message)

您的代码将如下所示:

const prefixes = [
  '#',
  'br',
  'bread',
  '<@767558534074204191>',
  '<@!767558534074204191>',
];

module.exports = async function(msg) {
  let tokens = msg.content.split(' ');
  let command = tokens.shift();

  if (prefixes.some(prefix => command.startsWith(prefix))) {
    command = command.substring(1);
    commandName[command](msg, tokens);
  }
};

更新:我刚刚查看并注意到您尝试使用 command.substring(1) 从命令中删除前缀。硬编码的 1 将始终仅删除第一个字符,因此您需要将其更改为前缀的长度。

目前,使用 .some() 您不知道使用了哪个前缀,因此最好使用 .find() 方法返回所提供数组中满足以下条件的第一个元素的值提供测试功能。通过这种方式,您可以检查消息是否包含任何前缀,并且您知道前缀及其长度。运行以下代码片段是如何工作的:

// I changed the order of prefixes as bread starts with br
const prefixes = [ '#', 'bread', 'br', '<@767558534074204191>', '<@!767558534074204191>', ];
let prefix = '';
let command = '';

command = 'lorem ipsum'
prefix = prefixes.find((prefix) => command.startsWith(prefix));
console.log({command, prefix});

command = '# lorem ipsum'
prefix = prefixes.find((prefix) => command.startsWith(prefix));
console.log({command, prefix});

command = 'br lorem ipsum'
prefix = prefixes.find((prefix) => command.startsWith(prefix));
console.log({command, prefix});

command = 'bread lorem ipsum'
prefix = prefixes.find((prefix) => command.startsWith(prefix));
console.log({command, prefix});

command = '<@767558534074204191> lorem ipsum'
prefix = prefixes.find((prefix) => command.startsWith(prefix));
console.log({command, prefix});

command = '<@!767558534074204191> lorem ipsum'
prefix = prefixes.find((prefix) => command.startsWith(prefix));
console.log({command, prefix});

所以您修改后的代码将如下所示:

client.on('message', (msg) => {
  let tokens = msg.content.split(' ');
  let command = tokens.shift();
  let prefix = prefixes.find((prefix) => command.startsWith(prefix));

  if (prefix) {
    command = command.substring(prefix.length);
    commandName[command](msg, tokens);
  }
});