【问题标题】: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)的第一位来检测命令

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

【问题讨论】:

  • 您有使用命令处理程序吗?这将是一个简单的修改。

标签: node.js discord.js


【解决方案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);
}

【讨论】:

    猜你喜欢
    • 2021-08-30
    • 2018-11-10
    • 1970-01-01
    • 2018-07-21
    • 2020-11-18
    • 2020-02-18
    • 2021-06-20
    • 2017-05-31
    • 2021-10-21
    相关资源
    最近更新 更多