有些不和谐的bot命令别名有效,有些无效,没有得到任何错误?

时间:2019-12-24 22:07:22

标签: javascript bots discord discord.js

因此,我正在创建一个discord bot,它似乎可以完美完成,而不是一件事:有时,命令别名不起作用。他们只是没有得到回应。

我怀疑这可能与撇号/特殊字符有关,但是经过一些测试,我得出结论,这两个都不会导致错误。然后,我认为这可能是别名长度的问题,但是我使用一个随机的长字作为别名对其进行了测试,并且效果很好。我四处搜寻,没有发现别名的限制或为什么会发生这种情况,所以我完全不知所措。

下面是我的其中一个命令的代码:

const Discord = require("discord.js");
const colors = require("../../colors.json");

module.exports.run = async (bot, message, args) => {
    let embed = new Discord.RichEmbed()
    .setColor(colors.purple)
    .setAuthor('FIREFLY CURSE', 'placeholder.image.link', 'placeholder.link')
    .setDescription("placeholder description")
    .setThumbnail('placeholder.image.link')
    .addField('Test', 'X', false)
    .addField('Test', "Y", false);
    message.channel.send({embed:embed});
}

module.exports.config = {
    name: "firefly curse",
aliases: ["fireflycurse", "fireflyc", "fc", "firefly curse", "supercalifragilisticexpialidocious", "test'test", "test test", "numbertest",]
}

上面列出了我尝试过的别名。除“萤火虫诅咒”和“测试测试”以外的所有工作。这让我认为空间是个问题,但是在不同命令中,使用空格 的别名确实可行。除了嵌入文本中的不同文本之外,代码之间绝对没有区别,这不应该影响代码本身的执行。

命令处理程序代码:

const fs = require("fs");
bot.commands = new Discord.Collection();
bot.aliases = new Discord.Collection();

async function load(dir){
fs.readdir(`./commands/${dir}/`, (err, files) => {
        if(err) console.log(err)

        let jsfile = files.filter(f => f.split(".").pop);
        if(jsfile.length <= 0) {
            return console.log("commands missing!");
        }

    jsfile.forEach((f, i) => {
        let pull = require(`./commands/${dir}/${f}`)
        bot.commands.set(pull.config.name, pull);  
        pull.config.aliases.forEach(alias => {
            bot.aliases.set(alias, pull.config.name)

        })
    })
});
}

Bot.on代码块:

bot.on("message", async message => {
    if(message.author.bot || message.channel.type === "dm") return;

    let prefix = botconfig.prefix;
    let messageArray = message.content.split(" ")
    let cmd = messageArray[0];
    let args = messageArray.slice(1);

    if(!message.content.startsWith(prefix)) return;
    let commandfile = bot.commands.get(cmd.slice(prefix.length)) || bot.commands.get(bot.aliases.get(cmd.slice(prefix.length)))
    if(commandfile) commandfile.run(bot,message,args)

})

3 个答案:

答案 0 :(得分:1)

您想使命令像!say hello一样运行,以便机器人将发送hello消息。无需为此添加别名,例如say hello

在您的漫游器脚本中,所有内容都是正确的,除了一个错误:

const Discord = require("discord.js");
const colors = require("../../colors.json");

module.exports.run = async (bot, message, args) => {

    if(args[0] === 'curse'){

    let embed = new Discord.MessageEmbed()
    .setColor(colors.purple)
    .setAuthor('FIREFLY CURSE', 'placeholder.image.link', 'placeholder.link')
    .setDescription("placeholder description")
    .setThumbnail('placeholder.image.link')
    .addField('Test', 'X', false)
    .addField('Test', "Y", false);
    message.channel.send({embed:embed});
}
}

module.exports.config = {
    name: "firefly",
    aliases: []
}

现在尝试命令!firefly curse,这将起作用!

答案 1 :(得分:0)

请显示您的bot.on message区块。

与通常的机器人命令一样,它们带有空格,因此,如果命令名称中有空格,则不能由亨德勒命令处理。

P.S。很抱歉在回答中提出问题,无法写评论:C

答案 2 :(得分:0)

查看从消息中获取命令的代码,您需要考虑到命令中的空格以及参数。 现在,您只是期望并得到消息的第一个单词,并使命令的键映射,但是,您还应该允许参数的第一个元素允许空格:

curl -X POST   https://www.eventbriteapi.com/v3/events/{event_id}/ticket_classes/   -H 'Authorization: Bearer PERSONAL_OAUTH_TOKEN'   -H "Accept: application/json"
  -d '{
        "ticket_class": {
            "name": "VIP",
            "quantity_total": 100,
            "cost": "USD,1000"
            }
        }'

如果您不熟悉ternary operators,则此代码为扩展代码:

if (!message.content.startsWith(botconfig.prefix)) return;

const args = message.content.slice(botconfig.prefix.length).trim().split(' ');
const cmd = args.shift().toLowerCase();
// this is a simplified way to get the command, removing the prefix and creating the arguments

let commandfile = bot.commands.get(cmd.slice(prefix.length)) || bot.commands.get(bot.aliases.get(cmd.slice(prefix.length)))

const commandFile = args.length === 0 ? bot.commands.get(cmd) || bot.commands.get(bot.aliases.get(cmd)) : bot.commands.get(cmd  + ' ' + args[0]) || bot.commands.get(bot.aliases.get(cmd + ' ' + args[0])) || bot.commands.get(cmd) || bot.commands.get(bot.aliases.get(cmd));
// the ternary operator

if (commandfile) commandfile.run(bot,message,args)