Как использовать методы многопользовательского чата xmpp в приложении ionic 3?

Я новичок в xmpp server, и мне нужно развивать чат-связь по протоколу xmpp в моем приложении ionic 3.

В настоящее время я использовал параметры этого сервера:

openFire 4.0.4: легко устанавливается и работает нормально, но получает ошибку в методах xmpp muc.

Я интегрировал службы xmpp, используя https://github.com/junglestory/xmpp-ionic3 в моем проекте, но я получаю ошибку от всех методов xmpp muc, таких как ошибка на изображении ниже:

введите описание изображения здесь

Мой код:

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { Events } from 'ionic-angular';
import {Strophe} from "strophe";

declare var Strophe:any;

export class Message {
 id: String;
 senderId: String;
 text: String;
 time: String;
}

@Injectable()
export class XMPPService {
 private dismissObserver: any;
 public dismiss: any;

 private BOSH_SERVICE: string = "https://dev.entelroaming.gearlabs.cl/http-bind/";
 private CONFERENCE_SERVICE: string = "conference.dev.entelroaming.gearlabs.cl";
 private connection: Strophe.Connection;
 private roomName: string = "";

 constructor(public events: Events) { 
    this.dismissObserver = null;
    this.dismiss = Observable.create(observer => {

        console.log("xmpp observer", observer);
        this.dismissObserver = observer;
    });
}

/*Function
    Connects the client from the Jabber server.
  Parameters:
    (String) jid - Jabber id.
    (String) host - Host name.
    (String) pass - Password.
  Returns:
*/
login(jid, host, pass) {

    console.log("login jid", jid);
    console.log("login host", host);
    console.log("login pass", pass);

    this.connection = new Strophe.Connection(this.BOSH_SERVICE, { 'keepalive': true });
    this.connection.connect(jid + '@' + host, pass, (status)=>{
        console.log("xmpp status", status);
          this.onConnect(status);
        });
}

/*Function
    Disconnects the client from the Jabber server.
  Parameters:
  Returns:
*/ 
logout() {
    console.log("logout the xmpp");
    this.connection.options.sync = true; // Switch to using synchronous requests since this is typically called onUnload.
    this.connection.flush();
    this.connection.disconnect();
}

/*Function
    Queries a room for a list of occupants
  Parameters:
  Returns:
    iq - Room info.
*/
allRoster() {   
    console.log("allRoster xmpp service");
    console.log("1", this.connection);
    this.connection.muc.init(this.connection);
    return new Promise<any>(resolve => {
        this.connection.muc.queryOccupants(this.CONFERENCE_SERVICE, function (msg) {
            let items = [];
            let rosters = msg.querySelectorAll('item');

            rosters.forEach(function(roster) {
                console.log("xmpp roster", roster);
                items.push({
                    id: roster.getAttribute("jid"),
                    name: roster.getAttribute("name") || roster.getAttribute("jid"),
                    lastText: 'Available to Chat',
                    avata: 'assets/imgs/ben.png'
                });
                console.log("xmpp items", items);
            });

            resolve(items);
        }, function (err) {
            console.log("rooms - error: " + err);
            console.log(err);
        })
    });
}

/*Function
    Create multi-user chat room.
  Parameters:
    (String) roomName - The multi-user chat room name.
  Returns:
  id - the unique id used to create the chat room.
*/
create(roomName) {
    let nick = this.getNick();
    console.log("xmpp nick", nick);
    let roomId = this.timestamp();
    console.log("xmpp roomId", roomId);
    let roomJid = roomId + "@" + this.CONFERENCE_SERVICE
    console.log("xmpp roomJid", roomJid);
    let room = roomJid + "/" + nick;
    console.log("xmpp room", room);

    this.connection.muc.setStatus(roomId + "@" + this.CONFERENCE_SERVICE, nick, null, null);
    this.connection.muc.createInstantRoom(room, roomName, 
        function (status) {
            console.log("Succesfully created ChatRoom", status);
        }, function (err) {
            console.log("Error creating ChatRoom", status);
            console.log(err);
        });

    this.connection.muc.setRoomName(roomId + "@" + this.CONFERENCE_SERVICE, nick);
    this.setRoomName(roomName);

    return roomJid;
}

/*Function
    Join a multi-user chat room
  Parameters:
    (String) roomJid - The multi-user chat room to join.
  Returns:
*/
join(roomJid) {
    console.log("xmpp join roomJid", roomJid);
    this.connection.muc.join(roomJid, this.getNick(), null, null, null, null, null, null);
}

/*Function
    Send the message in the chat room.
  Parameters:
    (String) roomJid - The multi-user chat room id.
    (String) message - Send message.
  Returns:
*/
sendMessage(roomJid, message) {
    console.log("xmpp sendMessage roomJid", roomJid);
    console.log("xmpp sendMessage message", message);
    this.connection.muc.groupchat(roomJid, message, null);
}

/*Function
    Send a mediated invitation.
  Parameters:
    (String) roomJid - The multi-user chat room name.
    (String) id - The invitation's receiver.
  Returns:
*/
invite(roomJid, id) {
    console.log("xmpp invite roomJid", roomJid);
    console.log("xmpp invite id", id);
    if (id !== "") {
      this.connection.muc.invite(roomJid, id, "hi?");
    }
}

// Create timestamp for multi-user chat room id.
timestamp() {
    return Math.floor(new Date().getTime() / 1000);
}

// Set room name.
setRoomName(roomName) {
    console.log("xmpp setRoomName roomName", roomName);
    this.roomName = roomName;
}

// Get room Name
getRoomName() {
    return this.roomName;
}

// Parse nickname of jabber id.
getNick() {
    let nick = this.connection.jid;
    nick = nick.substring(0, nick.indexOf('@'));
    return nick;
}

/*Function
    Connect XMPP.
  Parameters:    
  Returns:
    status - Status of connection.
*/
onConnect(status) {
    console.log("xmpp onConnect status", status);
    var self = this;

    switch (status) {

        case Strophe.Status.CONNECTED:
            console.log("status 1", status);
            console.log('[Connection] Strophe is Connected');

            this.connection.addHandler((msg)=>{ self.onMessage(msg); return true;}, null, 'message', null, null, null);       
            this.connection.addHandler((stanza)=>{self.onSubscriptionRequest(stanza)}, null, "presence", "subscribe");

            this.dismissObserver.next("login");

            break;
        case Strophe.Status.ATTACHED:
            console.log("status 2", status);
            console.log('[Connection] Strophe is Attached');
            break;

        case Strophe.Status.DISCONNECTED:
            console.log("status 3", status);
            console.log('[Connection] Strophe is Disconnected');
            this.dismissObserver.next("logout");
            break;

        case Strophe.Status.AUTHFAIL:
            console.log("status 4", status);
            console.log('[Connection] Strophe is Authentication failed');
            break;

        case Strophe.Status.CONNECTING:
            console.log("status 5", status);
            console.log('[Connection] Strophe is Connecting');
            break;

        case Strophe.Status.DISCONNECTING:
            console.log("status 6", status);
            console.log('[Connection] Strophe is Disconnecting');
            break;

        case Strophe.Status.AUTHENTICATING:
            console.log("status 7", status);
            console.log('[Connection] Strophe is Authenticating');
            break;

        case Strophe.Status.ERROR:
        case Strophe.Status.CONNFAIL:
            console.log("status 8", status);
            console.log('[Connection] Failed (' + status + ')');
            break;

        default:
            console.log('[Connection] Unknown status received:', status);
            break;
    }
};

// Parse multi-chat room id.
getParseRoomJid(id) {
    var pos = id.indexOf('/');

    if (pos > 0) {
        id = id.substring(0, pos);
    }

    return id;
}

// parse jabber id.
getParseID(id) {
    var pos = id.indexOf('/');

    if (pos > 0) {
        id = id.substring(pos+1, id.length);
    }

    return id;
}

//When a new message is recieved
onMessage(msg) {
    let message: Message;
    let from = msg.getAttribute('from');
    let type = msg.getAttribute('type');
    let elems = msg.getElementsByTagName('body');
    var delays = msg.getElementsByTagName('delay');

    if (type == "groupchat" && elems.length > 0) {            
        let body = elems[0];
        let textMsg = Strophe.getText(body);
        //let currentDate: Date;
        let currentDate = new Date();
        let date = currentDate.toLocaleTimeString().replace(/:\d+ /, ' ');

        // history
        if (delays.length > 0) {               
           let delay = delays[0];
           date = delay.getAttribute('stamp');
        }

        message = {
          id: this.getParseRoomJid(from),
          senderId: this.getParseID(from),
          text: textMsg,
          time: date
        };
    }

    this.events.publish('message', message);
};

 onSubscriptionRequest(stanza) {
    console.log(stanza);
 }
}

Я хочу, чтобы решение успешно интегрировалось с сервисами xmpp в ionic 3. Пожалуйста, дайте какие-либо предложения здесь как можно скорее, это было бы очень признательно.

0 ответов

Другие вопросы по тегам