防止不和谐机器人在用户提示中执行命令

Posted

技术标签:

【中文标题】防止不和谐机器人在用户提示中执行命令【英文标题】:Preventing a discord bot from executing a command in a user prompt 【发布时间】:2020-05-24 17:46:27 【问题描述】:

我需要一些帮助/建议来。

我的机器人目前具有提示用户问题的功能,它会将用户的答案添加到数据库中。我要解决的问题是,目前用户能够输入一个机器人命令作为答案,并且机器人将执行该命令并将其作为答案添加到数据库中。

一个非常简单的例子来说明这会带来多大的问题:

User: ?question 
Bot: Cats or Dogs?
User: ?question 
Bot: "?question" have been added to the database
Bot: Cats or Dogs?

我对机器人将命令添加到数据库没有问题,因为这是用户输入的内容(用户在那里输入机器人命令可能与此相关),但我不希望机器人执行该命令。

现在我有两个模糊的想法来解决这个问题(我不知道这是否有效):

我需要将用户的答案转换为“答案”类型变量,机器人无法使用它来搜索命令,但仍可以使用它上传到数据库并从中获取并显示在列表中答案。虽然不知道能不能在bot开始搜索命令之前执行。 我需要以某种方式改变这个问答系统的工作方式。

注意:目前我的机器人通过分割用户消息.slice(config.prefix.length)的第一位来检测命令

任何帮助或建议将不胜感激。 提前致谢!

【问题讨论】:

您有使用命令处理程序吗?这将是一个简单的修改。 【参考方案1】:

以下是您问题的一些答案:

机器人接受命令作为答案。 如果您改变主意,可以通过仅允许少数选定响应(“cat”或“dog”)或禁止以? 开头的命令来禁止此操作。 如果使用命令作为答案,则执行该命令。 这是因为您检查消息是否是代码中某处的命令。机器人不仅将用户的消息识别为有效答案,而且还识别出它满足您设置的前缀并因此运行命令。如果您有一个标志表明用户的下一个响应是问答问题的答案,那么您可以在执行命令之前检查该标志是否处于活动状态。例如:
// Assume that the user's ID is in this array after they
// requested to answer a Q&A question.
var usersAwaitingResponse = [];
...
client.on("message", function(message) 
    if (usersAwaitingResponse.includes(message.author.id)) 
        // take in the answer and then end the function by calling "return;"
     else 
        // check if the message was a command and act accordingly
    
);

前缀检查 最后,我建议您通过在消息文本上使用.startsWith(config.prefix) 来检查消息是否是命令。如果您希望用户只在前缀后输入允许的字符,那么您可以使用正则表达式。任何一种方法都可以节省时间和内存,而不是对字符串进行切片。下面是一个例子:

// using "startsWith"
function checkIfCommand(message) 
    return message.content.startsWith(config.prefix);


// using a regular expression
function checkIfCommand(message) 
    /**
     * If all the matches are fulfilled, the test passes:
     *
     * ^ - The match should be at the beginning of the string.
     * $config.prefix - The prefix (interpolated into the string).
     * [A-Z0-9]+ - match as much characters that are A to Z or 0 to 9
     * \s? - Match a whitespace character (if there is one)
     * "gi" - global, case insensitive
    **/
    return new RegExp(`^$config.prefix[A-Z]+\s?`, "gi").test(message.content);

【讨论】:

以上是关于防止不和谐机器人在用户提示中执行命令的主要内容,如果未能解决你的问题,请参考以下文章

如何跳过机器人执行命令 |不和谐

如何在 Javascript 中为不和谐机器人制作随机生成器?

Heroku 部署了我的不和谐机器人,但它的命令不起作用

获取成员的预期同步代码不同步

不和谐机器人中的命令问题

Discord.py 机器人:如何让我的不和谐机器人向我发送对用户在 DM 中使用的命令的响应,例如进行调查?