javascript - Mineflayer:让机器人只回复一次
问题描述
我是 js 和 mineflayer 的新手,所以我想知道如何让 bot.on('chat') 运行一次,比如聊天中的第一条消息。在此示例中,机器人只是回复发送的每条消息,并回复相同的消息。
我不知道如何解决这个问题,我尝试将它放在一个函数中,所以它只在那时调用,但它似乎就像打开一个侦听器并在函数运行完成后继续说消息。
var bot = mineflayer.createBot({
host: "localhost",
port: 25565,
username: "",
password: "",
version: "1.8.9"
});
bot.on('chat', function(username, message) {
if (username === bot.username) return;
bot.chat(message);
});
使其仅在被调用时回复消息或仅运行该事件一次的任何方法都可能有所帮助。谢谢!
解决方案
注意是2019年;请在现代 NodeJS 环境中使用 let/const 而不是 var ,而不是在未使用绑定“this”时使用=>
unnamed s。function
IE,const bot = mineflayer...
每次触发 'chat' 事件时,on 处理程序都会运行。使用 bot.once 将不允许您继续检查您是否实际响应。您是 js 新手,所以我不会深入研究用于删除事件侦听器的 API。
鉴于这些限制,让我们保持简单。您可以有一个外部布尔标志,它还允许您在运行时的稍后时间通过if (responded) return;
以下代码中的某些内容轻松地打开/关闭。您的代码可能如下所示:
let responded = false;
bot.on('chat', (username, message) => {
if (responded) return;
if (username === bot.username) return;
bot.chat(`Received ${message}`);
responded = true;
return;
});
推荐阅读
- react-native - 如何避免使用 AppCenter 和 Detox 进行多次构建?
- ios - 如何在 Swift 中初始化 Realm 配置?
- swift - Swift Pong(No SpriteKit):如何计算球的角度来移动球
- html - 如何在 html 模板中引用变量?
- azure - 服务终结点不适用于应用程序网关后面的 Azure Functions 代理
- java - Passay密码不重复字符序列
- mysql - MySQL如何检查值是否以字母开头并以数字结尾?
- sql - PostgreSQL 如何对文本值进行排序?
- python - 如何在本地安装和访问python模块?
- azure - Azure Durable Functions - 指向持久函数存储帐户的配置在哪里