Rocket.Chat已弃用并删除了内部Hubot功能,但在我们公司中,目前有些脚本无法移至外部bot,因此我们希望自行维护内部Hubot功能(因为我们已经由于与LDAP相关的更改而具有自定义派生功能。
几乎可以使它工作。内部Hubot已初始化,脚本已加载。但是调用某些命令会返回Meteor code must always run within a Fiber (...)
错误。
经过一些调试后,似乎核心问题是Hubot机器人和适配器的类继承不起作用。有一些自定义类可以扩展Hubot的软件包:
export class InternalHubotRobot extends Hubot.Robot {
constructor(name, alias) {
super(null, 'shell', false, name, alias);
this.hear = bind(this.hear);
this.respond = bind(this.respond);
this.enter = bind(this.enter);
this.leave = bind(this.leave);
this.topic = bind(this.topic);
this.error = bind(this.error);
this.catchAll = bind(this.catchAll);
this.user = Meteor.users.findOne({ username: this.name }, { fields: { username: 1 } });
this.adapter = new RocketChatAdapter(this);
new HubotScripts(this);
console.log(`InternalHubotRobot initialized as '${ this.name }'`);
}
loadAdapter() { return false; }
hear(regex, callback) { return super.hear(regex, Meteor.bindEnvironment(callback)); }
respond(regex, callback) { return super.respond(regex, Meteor.bindEnvironment(callback)); }
enter(callback) { return super.enter(Meteor.bindEnvironment(callback)); }
leave(callback) { return super.leave(Meteor.bindEnvironment(callback)); }
topic(callback) { return super.topic(Meteor.bindEnvironment(callback)); }
error(callback) { return super.error(Meteor.bindEnvironment(callback)); }
catchAll(callback) { return super.catchAll(Meteor.bindEnvironment(callback)); }
}
和
export class RocketChatAdapter extends Hubot.Adapter {
constructor(robot) {
super(robot);
console.log('RocketChatAdapter initialized');
}
send(envelope, ...strings) {
this.robot.logger.info('[ROBOT → adapter → send()]');
// ...
}
// Many more overrides
}
内部Hubot用InternalHubot = new InternalHubotRobot(RocketChat.settings.get('InternalHubot_Username'), 'Custom Alias');
初始化,我在日志中看到:
I20190318-11:28:59.866(1)? RocketChatAdapter initialized
I20190318-11:29:00.209(1)? [Mon Mar 18 2019 11:29:00 GMT+0100 (CET)] WARNING A script has tried registering a HTTP route while the HTTP server is disabled with --disabled-httpd.
I20190318-11:29:00.211(1)? Loaded help.coffee
I20190318-11:29:00.211(1)? InternalHubotRobot initialized as 'Custom Alias'
因此,两个构造函数均被正确调用。但是,对机械手和适配器方法的所有方法调用都是从Hubot软件包而不是从InternalHubotRobot
/ RocketChatAdapter
的基类上调用的。
这是问题所在::由于这些方法未按应有的方式被覆盖/调用,因此存在光纤错误,并且由于默认的Hubot适配器的send()
方法未执行而没有发送响应任何东西。
我做了什么:
robot.respond /(help)+(?:\s+(.*))?$/i, Meteor.bindEnvironment((incomingMessage)
这样的包装来摆脱Fiber错误(这基本上是InternalHubotRobot
的构造函数应该通过用bind()
包裹方法来完成的工作send
来发送响应:
Hubot.Robot.prototype.send = function(envelope, ...args) {
return sendHelper(this, envelope, args, (string) =>
RocketChat.sendMessage(InternalHubot.user, { msg: string }, { _id: envelope.room })
);
};
但是:它很脏,我想依靠子类中的继承和方法重写。
我不是JavaScript / Meteor / Rocket.Chat专家,所以也许我缺少了一些细节。 如何实现工作继承?
有关版本的信息: