Создание нескольких эхо-ботов клиента Jabber

Привет, Stackoverflowers, я перепробовал так много способов решить свою проблему, и в итоге получил переполнение стека.

Язык программирования: машинопись

мои основные цели: создать столько классов клиентов, сколько я хочу, и могу включать и выключать клиент, клиент будет как бот, который выводит текст из списка друзей

Я использую библиотеку 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;
  }
}

Проблема в том, что бот может запуститься, но никогда не отключится, когда я вызову новый класс и turnOn() и turnOff().

Как я вызываю свой код: // Hit URL /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, но я не могу решить эту проблему,

Пожалуйста помоги

искренне, спасибо


person kevin tanzil    schedule 06.10.2018    source источник
comment
Вы можете добавить код, где вы используете этот класс, и показать, как вы подключаетесь и отключаетесь и т. д.   -  person Molda    schedule 06.10.2018
comment
точно так же: ter — это данные объекта, в которых хранятся учетные данные const temp = new TerminalJabber (ter); темп.включить(); и через 1 или 2 дня я хочу отключить этого бота, просто нажав URL-адрес, который запускает const temp = new TerminalJabber (ter); темп.выключить(); и когда я нажимаю и включаю URL-адрес, я могу включить Jabber Bot с их учетными данными..   -  person kevin tanzil    schedule 06.10.2018
comment
Пожалуйста, добавьте код к вашему вопросу выше. (Используйте ссылку редактирования ниже вашего вопроса) Вам нужно вызвать функцию TurnOff для временного экземпляра, прежде чем создавать новый.   -  person Molda    schedule 06.10.2018
comment
@Molda Готово, сэр, пожалуйста, посмотрите..   -  person kevin tanzil    schedule 06.10.2018


Ответы (1)


Вам нужно вызвать метод TurnOff для экземпляра terminal, прежде чем создавать новый. Это также означает, что вам необходимо иметь доступ к экземпляру с обоих контроллеров.

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();

}
person Molda    schedule 06.10.2018
comment
Но, это нормально? если в моем терминальном классе я объявлю нового клиента? данные будут затронуты или нет? потому что, когда я запускаю TurnOn, моя консоль будет бездействовать из-за даже слушателя ... и представьте, если у меня есть 100 идентификаторов, поэтому у меня есть 100 клиентов, простаивающих для этого центра ботов XMPP ... так что, делая ваш ответ, это можно отключить какой бот, если они сработали? Кстати, если я использую let вместо var ? потому что я использую машинописный текст, который не разрешен для var.. - person kevin tanzil; 06.10.2018
comment
Если вы инициализируете экземпляры с помощью new TerminalId, данные будут уникальными для каждого экземпляра. Они не будут влиять друг на друга. Я не использую машинописный текст, поэтому не могу помочь вам с let или var. Также количество клиентов, которые вы можете создать, вероятно, будет зависеть от вашей системы. - person Molda; 06.10.2018
comment
Итак, если я не хочу менять экземпляры, должен ли я сохранить New TerminalId в моей базе данных? так что в следующий раз, когда я захочу выключить, я просто позвоню из своей БД, потому что, когда мы включим его, другой пользователь тоже включит его, верно? поэтому я не уверен, что экземпляры будут одинаковыми, как вы об этом думаете? ваш ответ мне очень помогает. Большое спасибо, и я думаю, что мне нужно немного больше обсудить с вами, чтобы открыть мой разум - person kevin tanzil; 06.10.2018
comment
Вы не можете сохранить экземпляр в БД. Вы можете сохранить его идентификатор в БД, если это поможет. Вы можете проверить, существует ли экземпляр с данным идентификатором, и создать новый, только если это не так. После того, как вы отключите его, вы также можете удалить его из экземпляров. Что-то вроде delete terminals[id] - person Molda; 06.10.2018
comment
Спасибо, @Molda, вы очень помогли мне решить мою проблему, потому что я все еще новичок в Node JS, поэтому мне нужно учиться у такого эксперта, как вы. Кстати, как я получаю возвращаемое значение от слушателя, как вы видите из моего Терминальный класс, вместо использования var, в узле Js есть другой способ получить возвращаемое значение от прослушивателя событий? я пробовал так много предложений от переполнения стека, но я не могу найти подходящий, или, может быть, я не понимаю .. - person kevin tanzil; 06.10.2018