Discord.js 从带有前缀的句子中过滤命令(比如 Hey Bot 给我一块蛋糕)

Posted

技术标签:

【中文标题】Discord.js 从带有前缀的句子中过滤命令(比如 Hey Bot 给我一块蛋糕)【英文标题】:Discord.js Filter the command out of a sentence with prefix (like Hey Bot give me a cake) 【发布时间】:2021-12-01 12:13:55 【问题描述】:

我对 JS 和使用 discordjs 比较陌生。目前,带有前缀 (+) 和斜杠命令 (/) 的命令适用于我。但是,只有看起来像这样的命令才有效:Hey Bot pingHey Bot help 等。

我希望机器人过滤掉命令。例如Hey Bot show ping。 (Hey Bot 是前缀,ping 命令).. 我希望机器人像 Siri 一样工作,就像 Hey Bot show me the ping。但这仅适用于Hey Bot pingHey Bot ping word1 word2 etc。也许你知道我如何实现这一点.. 非常感谢!!

这是我的命令 ping.js:

const  Message, Client  = require("discord.js");

module.exports = 
    name: "ping",
    aliases: ['p'],
    permissions : ["SEND_MESSAGES"],
    /**
     *
     * @param Client client
     * @param Message message
     * @param String[] args
     */
    run: async (client, message, args) =>
    
        message.channel.send( content: `$client.ws.ping ws ping` );
    ,
;

我试过了

run: async (client, message, args) =>    
      if (message.content.toLowerCase().includes("ping")) 
      message.channel.send( content: `$client.ws.ping ws ping` )
    ,

而不是message.channel.send( content: `$client.ws.ping ws ping` );,但它对我不起作用..

这是我创建消息的方式:

适用于命令和事件处理程序

const client = require("..");
var config = require("../settings/config.json");
var ee = require("../settings/embed.json");
const  MessageEmbed  = require("discord.js");

client.on('messageCreate', async message => 
    let prefix = config.prefix
    if (!message.guild) return;
    if (message.author.bot) return;
    if (message.channel.partial) await message.channel.fetch();
    if (message.partial) await message.fetch();
    const args = message.content.slice(prefix.length).trim().split(/ +/);
    const cmd = args.shift().toLowerCase();

        if (message.mentions.has(client.user)) 
            message.channel.send(
                embeds: [new MessageEmbed()
                    .setColor(ee.embed_color)
                    .setAuthor(`TEST`)
                    .setDescription(`Use \`$prefixhelp\``)
                    .setFooter(ee.embed_footertext, ee.embed_footericon)
                ]
            );
    

    const command = client.commands.get(cmd.toLowerCase()) ||  client.commands.find((cmds) => cmds.aliases && cmds.aliases.includes(cmd));
    if (command) 
        if (!message.member.permissions.has(command.permissions || [])) 
            return message.reply(
                embeds: [
                    new MessageEmbed()
                        .setColor(ee.embed_color)
                        .setDescription(`** wrong $command.permissions **`)
                ]
            )
        
        command.run(client, message, args, prefix)
    
)

【问题讨论】:

【参考方案1】:

这不太理想,Siri 很高级,但是要搜索命令你可以这样做:

const command = client.commands.find(c => message.content.includes(c.name.toLowerCase())

当然你也可以包含别名:

String.prototype.includesAny = function (args) 
  for (const arg of args) 
    if (this.includes(arg)) return true;
  

const command = client.commands.find(c => message.content.includes(c.name.toLowerCase()) || message.content.includesAny(c.aliases)

【讨论】:

嘿,Mythical 先生!感谢您的想法和代码。到目前为止它工作正常,但现在它响应没有前缀Hey Bot 的命令。所以我可以使用ping 而不使用Hey Bot。那不会那么好..我现在不确定如何使用前缀作为必需的因素.. 在顶部,放这个:if(!message.content.startsWith("Hey Bot")) return; 对,我自己也能想到!多谢,伙计!但如果我添加这一行,我总是会收到SyntaxError: missing ) after argument list .. 抱歉问:/ 有效!谢了哥们!将其标记为正确!另一个问题。我可以用$config.prefix 之类的东西更改Hey Bot,这样我就可以更改配置前缀吗? :) 是的,你必须自己做,祝你好运

以上是关于Discord.js 从带有前缀的句子中过滤命令(比如 Hey Bot 给我一块蛋糕)的主要内容,如果未能解决你的问题,请参考以下文章

在 discord.js 中制作带有前缀的命令处理程序时出现问题 [重复]

Discord.js - 如何实现前缀以避免错误触发命令响应?

Discord bot 更改前缀命令出错 (discord.js)

Discord.js - 在前缀和命令之后获取信息

Discord.js 如何使用机器人提及和设置前缀作为前缀

如何让 discord.js 机器人在不包含前缀和命令名称的情况下重复用户的消息?