因此,我正在创建一个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)
})
答案 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)