防止不和谐机器人在用户提示中执行命令
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);
【讨论】:
以上是关于防止不和谐机器人在用户提示中执行命令的主要内容,如果未能解决你的问题,请参考以下文章