创建多个 Jabber 客户端 Echo Bot

Posted

技术标签:

【中文标题】创建多个 Jabber 客户端 Echo Bot【英文标题】:Create Multiple Jabber Client Echo Bot 【发布时间】:2018-10-06 17:09:40 【问题描述】:

Hai ***ers, 我尝试了很多方法来解决我的问题,但最终导致堆栈溢出

编程语言: 打字稿

我的主要目标: 创建任意数量的客户端类,并且可以打开和关闭客户端,客户端将作为 Bot 从好友列表中回显文本

我使用 node-xmpp-client 库: https://github.com/chris-rock/node-xmpp-client

我的代码:

import * as Client from 'node-xmpp-client'; // Jabber Helper

export class TerminalJabber 
  private ter;
  private client;

  constructor(ter: any) 
    this.ter = ter;
    this.client = new Client(
      jid: this.ter.settings.username,
      password: this.ter.settings.password,
    );
  

  public turnOn()
    // Turn on Jabber
    this.client.on('online', () => 
      console.log('online');
      const stanza = new Client.Element('presence',  )
         .c('show').t('chat').up()
         .c('status').t('Happily echoing your <message/> stanzas');
      this.client.send(stanza);
    );

    this.client.on('stanza', (stanza) => 
      // Message come here and will echo from here
    );

     // Catch error
     this.client.on('error', (e) => 
       console.log('------>', e);
     );
  
  // Turn Off Jabber
  public turnOff () 
    // Turn Off Jabber
    this.client.end();
    return true;
  

问题是, Bot 可以启动,但是当我调用一个新类和 turnOn()turnOff() 时,它永远不会断开连接。

我如何称呼我的代码: //点击网址 /turnOn/:terId

// Hit URL
app.router.get(/turnOn/:id, turnOnController); // for turn On
app.router.get(/turnOff/:id, turnOfController); // for turn Off

TurnOnController()
  // Get data from database using id
  const data = Query ~ ;
  const terminal = new TerminalId(data)
  terminal.turnOn();


TurnOffController()
// Get data from database using id
  const data = Query ~ ;
  const terminal = new TerminalID(data)
  terminal.turnOff();

也许你有我的问题的解决方案? 一直在思考和阅读很多关于xmpp的帖子,但我无法解决这个问题,

请帮忙

真诚地, 谢谢

【问题讨论】:

你可能想在你使用这个类的地方添加代码,并展示你如何连接和断开等。 就像这样:ter 是存储凭据的对象数据 const temp = new TerminalJabber (ter); temp.turnOn(); 1天或2天后,我想关闭这个机器人,只需点击触发 const temp = new TerminalJabber (ter); temp.turnOff();当我点击并打开网址时,我可以使用他们的凭据打开 Jabber Bot.. 请在上面的问题中添加代码。 (使用问题下方的编辑链接)在创建新实例之前,您需要在 temp 实例上调用 turnOff 函数。 @Molda Done 先生,请看一下.. 【参考方案1】:

在创建新实例之前,您需要在 terminal 实例上调用 turnOff 方法。 这也意味着您需要从两个控制器访问该实例。

var terminals = ;

function turnOnController()

    var id = getIdSomehow();

    terminal[id] = new TerminalId(data);
    terminal[id].turnOn();



function turnOffController()

    var id = getIdSomehow();

    if (terminal[id])
        terminal[id].turnOff();


【讨论】:

但是,可以吗?如果在我的终端类上我声明新客户?数据会不会受到影响?因为当我触发 TurnOn 时,我的控制台会因为监听器而处于空闲状态。想象一下,如果我有 100 个 Id,那么我有 100 个客户端空闲用于这个 XMPP Bot 中心。所以通过回答,可以关闭如果他们触发了哪个机器人?顺便说一句,如果我使用 let 而不是 var 可以吗?因为我使用了不允许用于 var.. 的打字稿 如果您使用new TerminalId 初始化实例,则每个实例的数据将是唯一的。它们不会相互影响。我不使用打字稿,所以无法为您提供 letvar 的帮助。此外,您可以创建的客户端数量可能取决于您的系统。 所以如果我不想更改实例,我应该将 New TerminalId 保存到我的数据库吗?所以下次我想关闭时,我只是从我的数据库中调用,因为当我们打开它时,另一个用户也会打开它,对吗?所以我不确定实例是否相同,您对此有何看法?顺便说一句,您的回答对我有很大帮助。非常感谢,我想我需要和你多讨论一下来打开我的思路 您无法将实例保存到数据库。如果有帮助,您可以将其 id 保存到 db。您可以检查具有给定 id 的实例是否已经存在并仅在不存在时才创建新实例。一旦你关闭它,你也可以从实例中删除它。类似delete terminals[id] 谢谢@Molda,你帮我解决了我的问题,因为我还是Node JS的新手,所以我需要向像你这样的专家学习,顺便问一下,我如何获得返回值从我的终端类中看到的侦听器,而不是使用 var,在节点 Js 中是否有另一种方法从事件侦听器获取返回值?我从堆栈溢出中尝试了很多建议,但我找不到适合的,或者我不明白..

以上是关于创建多个 Jabber 客户端 Echo Bot的主要内容,如果未能解决你的问题,请参考以下文章

Perl Net::Jabber::Bot 新行

如何连接jabber bot和php?

hava jabber-bot。 XMPP over smack 4.2.0 with TLS

将在microsoft bot框架中开发的chatbot部署到Jabber即时通讯工具中

如何在本地机器上测试 xmpp/jabber?

在多个客户端之间共享 Jabber 聊天会话