mirror of
				https://github.com/node-red/node-red-nodes.git
				synced 2025-03-01 10:37:43 +00:00 
			
		
		
		
	tidy up xmpp node
This commit is contained in:
		
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -6,3 +6,5 @@ puball.sh
 | 
			
		||||
setenv.sh
 | 
			
		||||
/.project
 | 
			
		||||
package-lock.json
 | 
			
		||||
social/xmpp/92-xmpp.old
 | 
			
		||||
*.tgz
 | 
			
		||||
 
 | 
			
		||||
@@ -109,7 +109,7 @@
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<script type="text/html" data-template-name="xmpp-server">
 | 
			
		||||
    <div class="form-row node-input-server">
 | 
			
		||||
    <div class="form-row">
 | 
			
		||||
        <label for="node-config-input-server"><i class="fa fa-bookmark"></i> Server</label>
 | 
			
		||||
        <input class="input-append-left" type="text" id="node-config-input-server" placeholder="blah.im" style="width: 40%;" >
 | 
			
		||||
        <label for="node-config-input-port" style="margin-left: 10px; width: 35px; "> Port</label>
 | 
			
		||||
 
 | 
			
		||||
@@ -12,17 +12,17 @@ module.exports = function(RED) {
 | 
			
		||||
        this.username = n.user.split('@')[0];
 | 
			
		||||
        // The user may elect to just specify the jid in the settings,
 | 
			
		||||
        //  in which case extract the server from the jid and default the port
 | 
			
		||||
        if("undefined" === typeof n.server || n.server === ""){
 | 
			
		||||
        if ("undefined" === typeof n.server || n.server === "") {
 | 
			
		||||
            this.server = n.user.split('@')[1];
 | 
			
		||||
        }
 | 
			
		||||
        else{
 | 
			
		||||
            this.server = n.server;
 | 
			
		||||
        }
 | 
			
		||||
        if("undefined" === typeof n.port || n.port === ""){
 | 
			
		||||
        if ("undefined" === typeof n.port || n.port === "") {
 | 
			
		||||
            this.port = 5222;
 | 
			
		||||
        }
 | 
			
		||||
        else{
 | 
			
		||||
            this.port = n.port;
 | 
			
		||||
            this.port = parseInt(n.port);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // The password is obfuscated and stored in a separate location
 | 
			
		||||
@@ -32,8 +32,15 @@ module.exports = function(RED) {
 | 
			
		||||
        }
 | 
			
		||||
        // The basic xmpp client object, this will be referred to as "xmpp" in the nodes.
 | 
			
		||||
        // note we're not actually connecting here.
 | 
			
		||||
        var proto = "xmpp";
 | 
			
		||||
        if (this.port === 5223) {
 | 
			
		||||
            proto = "xmpps";
 | 
			
		||||
        }
 | 
			
		||||
        if (RED.settings.verbose || LOGITALL) {
 | 
			
		||||
            this.log("Setting up connection xmpp: {service: "+proto+"://"+this.server+":"+this.port+", username: "+this.username+", password: "+this.password+"}");
 | 
			
		||||
        }
 | 
			
		||||
        this.client = client({
 | 
			
		||||
            service: 'xmpp://' + this.server + ':' + this.port,
 | 
			
		||||
            service: proto+'://' + this.server + ':' + this.port,
 | 
			
		||||
            username: this.username,
 | 
			
		||||
            password: this.password
 | 
			
		||||
        });
 | 
			
		||||
@@ -48,7 +55,7 @@ module.exports = function(RED) {
 | 
			
		||||
 | 
			
		||||
        // function for a node to tell us it has us as config
 | 
			
		||||
        this.register = function(xmppThat) {
 | 
			
		||||
            if (RED.settings.verbose || LOGITALL) {that.log("registering "+xmppThat.id);}
 | 
			
		||||
            if (RED.settings.verbose || LOGITALL) {that.log("registering "+xmppThat.id); }
 | 
			
		||||
            that.users[xmppThat.id] = xmppThat;
 | 
			
		||||
            // So we could start the connection here, but we already have the logic in the thats.
 | 
			
		||||
            // if (Object.keys(that.users).length === 1) {
 | 
			
		||||
@@ -58,7 +65,7 @@ module.exports = function(RED) {
 | 
			
		||||
 | 
			
		||||
        // function for a node to tell us it's not using us anymore
 | 
			
		||||
        this.deregister = function(xmppThat,done) {
 | 
			
		||||
            if (RED.settings.verbose || LOGITALL) {that.log("deregistering "+xmppThat.id);}
 | 
			
		||||
            if (RED.settings.verbose || LOGITALL) {that.log("deregistering "+xmppThat.id); }
 | 
			
		||||
            delete that.users[xmppThat.id];
 | 
			
		||||
            if (that.closing) {
 | 
			
		||||
                return done();
 | 
			
		||||
@@ -67,7 +74,6 @@ module.exports = function(RED) {
 | 
			
		||||
                if (that.client && that.client.connected) {
 | 
			
		||||
                    return that.client.stop(done);
 | 
			
		||||
                } else {
 | 
			
		||||
                    that.client.stop();
 | 
			
		||||
                    return done();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
@@ -78,8 +84,8 @@ module.exports = function(RED) {
 | 
			
		||||
        this.lastUsed = undefined;
 | 
			
		||||
        // function for a node to tell us it has just sent a message to our server
 | 
			
		||||
        // so we know which node to blame if it all goes Pete Tong
 | 
			
		||||
        this.used = function(xmppThat){
 | 
			
		||||
            if (RED.settings.verbose || LOGITALL) {that.log(xmppThat.id+" sent a message to the xmpp server");}
 | 
			
		||||
        this.used = function(xmppThat) {
 | 
			
		||||
            if (RED.settings.verbose || LOGITALL) {that.log(xmppThat.id+" sent a message to the xmpp server"); }
 | 
			
		||||
            that.lastUsed = xmppThat;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -95,30 +101,41 @@ module.exports = function(RED) {
 | 
			
		||||
                        that.log(stanza);
 | 
			
		||||
                    }
 | 
			
		||||
                    var err = stanza.getChild('error');
 | 
			
		||||
                    if(err){
 | 
			
		||||
                    if (err) {
 | 
			
		||||
                        var textObj = err.getChild('text');
 | 
			
		||||
                        var text = "node-red:common.status.error";
 | 
			
		||||
                        if("undefined" !== typeof textObj){
 | 
			
		||||
                        if ("undefined" !== typeof textObj) {
 | 
			
		||||
                            text = textObj.getText();
 | 
			
		||||
                        }
 | 
			
		||||
                        if (RED.settings.verbose || LOGITALL) {that.log("Culprit: "+that.lastUsed);}
 | 
			
		||||
                        if("undefined" !== typeof that.lastUsed){
 | 
			
		||||
                        else{
 | 
			
		||||
                            textObj = err.getChild('code');
 | 
			
		||||
                            if ("undefined" !== typeof textObj) {
 | 
			
		||||
                                text = textObj.getText();
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                        if (RED.settings.verbose || LOGITALL) {that.log("Culprit: "+that.lastUsed); }
 | 
			
		||||
                        if ("undefined" !== typeof that.lastUsed) {
 | 
			
		||||
                            that.lastUsed.status({fill:"red",shape:"ring",text:text});
 | 
			
		||||
                            that.lastUsed.warn(text);
 | 
			
		||||
                        }
 | 
			
		||||
                        if (RED.settings.verbose || LOGITALL) {
 | 
			
		||||
                            that.log("We did wrong: "+text);
 | 
			
		||||
                            that.log(stanza);
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        // maybe throw the message or summit
 | 
			
		||||
                        //that.error(text);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            else if(stanza.is('presence')){
 | 
			
		||||
                if(['subscribe','subscribed','unsubscribe','unsubscribed'].indexOf(stanza.attrs.type) > -1){
 | 
			
		||||
                    if (RED.settings.verbose || LOGITALL) {that.log("got a subscription based message");}
 | 
			
		||||
                    switch(stanza.attrs.type){
 | 
			
		||||
            else if (stanza.is('presence')) {
 | 
			
		||||
                if (['subscribe','subscribed','unsubscribe','unsubscribed'].indexOf(stanza.attrs.type) > -1) {
 | 
			
		||||
                    if (RED.settings.verbose || LOGITALL) {that.log("got a subscription based message"); }
 | 
			
		||||
                    switch(stanza.attrs.type) {
 | 
			
		||||
                    case 'subscribe':
 | 
			
		||||
                        // they're asking for permission let's just say yes
 | 
			
		||||
                        var response = xml('presence',
 | 
			
		||||
                                           {type:'subscribed', to:stanza.attrs.from});
 | 
			
		||||
                            {type:'subscribed', to:stanza.attrs.from});
 | 
			
		||||
                        // if an error comes back we can't really blame anyone else
 | 
			
		||||
                        that.used(that);
 | 
			
		||||
                        that.client.send(response);
 | 
			
		||||
@@ -128,7 +145,26 @@ module.exports = function(RED) {
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            else if (stanza.is('iq')) {
 | 
			
		||||
                if (RED.settings.verbose || LOGITALL) {that.log("got an iq query"); }
 | 
			
		||||
                if (stanza.attrs.type === 'error') {
 | 
			
		||||
                    if (RED.settings.verbose || LOGITALL) {that.log("oh noes, it's an error"); }
 | 
			
		||||
                    if (stanza.attrs.id === that.lastUsed.id) {
 | 
			
		||||
                        that.lastUsed.status({fill:"red", shape:"ring", text:stanza.getChild('error')});
 | 
			
		||||
                        that.lastUsed.warn(stanza.getChild('error'));
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                else if (stanza.attrs.type === 'result') {
 | 
			
		||||
                    // AM To-Do check for 'bind' result with our current jid
 | 
			
		||||
                    var query = stanza.getChild('query');
 | 
			
		||||
                    if (RED.settings.verbose || LOGITALL) {that.log("result!"); }
 | 
			
		||||
                    if (RED.settings.verbose || LOGITALL) {that.log(query); }
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        // We shouldn't have any errors here that the input/output nodes can't handle
 | 
			
		||||
        //   if you need to see everything though; uncomment this block
 | 
			
		||||
        // this.client.on('error', err => {
 | 
			
		||||
@@ -142,22 +178,29 @@ module.exports = function(RED) {
 | 
			
		||||
            that.connected = true;
 | 
			
		||||
            await that.client.send(xml('presence'));
 | 
			
		||||
            //      await that.client.send(xml('presence', {type: 'available'},xml('status', {}, 'available')));
 | 
			
		||||
            if (RED.settings.verbose || LOGITALL) {that.log('connected as '+that.username+' to ' +that.server+':'+that.port);}
 | 
			
		||||
            if (RED.settings.verbose || LOGITALL) {that.log('connected as '+that.username+' to ' +that.server+':'+that.port); }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // if the connection has gone away, not sure why!
 | 
			
		||||
        this.client.on('offline', () => {
 | 
			
		||||
            that.connected = false;
 | 
			
		||||
            if (RED.settings.verbose || LOGITALL) {that.log('connection closed');}
 | 
			
		||||
            if (RED.settings.verbose || LOGITALL) {that.log('connection closed'); }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // gets called when the node is destroyed, e.g. if N-R is being stopped.
 | 
			
		||||
        this.on("close", async done => {
 | 
			
		||||
            if(that.connected){
 | 
			
		||||
            if (that.client.connected) {
 | 
			
		||||
                await that.client.send(xml('presence', {type: 'unavailable'}));
 | 
			
		||||
                try{
 | 
			
		||||
                    if (RED.settings.verbose || LOGITALL) {
 | 
			
		||||
                        that.log("Calling stop() after close, status is "+that.client.status);
 | 
			
		||||
                    }
 | 
			
		||||
                    await that.client.stop().then(that.log("XMPP client stopped")).catch(error=>{that.warn("Got an error whilst closing xmpp session: "+error)});
 | 
			
		||||
                }
 | 
			
		||||
                catch(e) {
 | 
			
		||||
                    that.warn(e);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            that.client.stop().catch(that.error);
 | 
			
		||||
            
 | 
			
		||||
            done();
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
@@ -175,11 +218,12 @@ module.exports = function(RED) {
 | 
			
		||||
        this.nick = this.serverConfig.nickname || this.serverConfig.username.split("@")[0];
 | 
			
		||||
        this.join = n.join || false;
 | 
			
		||||
        this.sendAll = n.sendObject;
 | 
			
		||||
        // Yes, it's called "from", don't ask me why; I don't know why
 | 
			
		||||
        this.from = n.to || "";
 | 
			
		||||
        var node = this;
 | 
			
		||||
 | 
			
		||||
        var xmpp = this.serverConfig.client;
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        /* connection states
 | 
			
		||||
           online: We are connected
 | 
			
		||||
           offline: disconnected and will not autoretry
 | 
			
		||||
@@ -202,12 +246,12 @@ module.exports = function(RED) {
 | 
			
		||||
                // (third argument to the x/muc/children )
 | 
			
		||||
                // We also turn off chat history (maxstanzas 0) because that's not what this node is about.
 | 
			
		||||
                var stanza = xml('presence',
 | 
			
		||||
                                 {"to": to},
 | 
			
		||||
                                 xml("x",'http://jabber.org/protocol/muc'),
 | 
			
		||||
                                 { maxstanzas:0, seconds:1 }
 | 
			
		||||
                                );
 | 
			
		||||
                    {"to": to},
 | 
			
		||||
                    xml("x",'http://jabber.org/protocol/muc'),
 | 
			
		||||
                    { maxstanzas:0, seconds:1 }
 | 
			
		||||
                );
 | 
			
		||||
                node.serverConfig.used(node);
 | 
			
		||||
                xmpp.send(stanza);
 | 
			
		||||
                xmpp.send(stanza).catch(error => {node.warn("Got error when sending presence: "+error)});
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
@@ -233,10 +277,10 @@ module.exports = function(RED) {
 | 
			
		||||
            node.status({fill:"grey",shape:"dot",text:"disconnecting"});
 | 
			
		||||
        });
 | 
			
		||||
        // we'll not add a offline catcher, as the error catcher should populate the status for us
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        // Should we listen on other's status (chatstate) or a chatroom state (groupbuddy)?
 | 
			
		||||
        xmpp.on('error', err => {
 | 
			
		||||
            if (RED.settings.verbose || LOGITALL) { node.log(err); }
 | 
			
		||||
            if (RED.settings.verbose || LOGITALL) { node.log("XMPP Error: "+err); }
 | 
			
		||||
            if (err.hasOwnProperty("stanza")) {
 | 
			
		||||
                if (err.stanza.name === 'stream:error') { node.error("stream:error - bad login id/pwd ?",err); }
 | 
			
		||||
                else { node.error(err.stanza.name,err); }
 | 
			
		||||
@@ -252,11 +296,21 @@ module.exports = function(RED) {
 | 
			
		||||
                    node.status({fill:"red",shape:"ring",text:"bad address"});
 | 
			
		||||
                }
 | 
			
		||||
                else if (err === "XMPP authentication failure") {
 | 
			
		||||
                    node.error(err,err);
 | 
			
		||||
                    node.error("Authentication failure! "+err,err);
 | 
			
		||||
                    node.status({fill:"red",shape:"ring",text:"XMPP authentication failure"});
 | 
			
		||||
                }
 | 
			
		||||
                else if (err.name === "SASLError") {
 | 
			
		||||
                    node.error("Authorization error! "+err.condition,err);
 | 
			
		||||
                    node.status({fill:"red",shape:"ring",text:"XMPP authorization failure"});
 | 
			
		||||
                }
 | 
			
		||||
                else if (err == "TimeoutError") {
 | 
			
		||||
                    // Suppress it!
 | 
			
		||||
                    node.warn("Timed out! ");
 | 
			
		||||
                    node.status({fill:"grey",shape:"dot",text:"opening"});
 | 
			
		||||
                    //node.status({fill:"red",shape:"ring",text:"XMPP timeout"});
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    node.error(err.errno,err);
 | 
			
		||||
                    node.error(err,err);
 | 
			
		||||
                    node.status({fill:"red",shape:"ring",text:"node-red:common.status.error"});
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
@@ -265,7 +319,7 @@ module.exports = function(RED) {
 | 
			
		||||
        // Meat of it, a stanza object contains chat messages (and other things)
 | 
			
		||||
        xmpp.on('stanza', async (stanza) =>{
 | 
			
		||||
            //      node.log("Received stanza");
 | 
			
		||||
            if (RED.settings.verbose || LOGITALL) {node.log(stanza);}
 | 
			
		||||
            if (RED.settings.verbose || LOGITALL) {node.log(stanza); }
 | 
			
		||||
            if (stanza.is('message')) {
 | 
			
		||||
                if (stanza.attrs.type == 'chat') {
 | 
			
		||||
                    var body = stanza.getChild('body');
 | 
			
		||||
@@ -276,18 +330,19 @@ module.exports = function(RED) {
 | 
			
		||||
                            msg.topic = stanza.attrs.from
 | 
			
		||||
                        }
 | 
			
		||||
                        else { msg.topic = ids[0]; }
 | 
			
		||||
                        if (!node.join && ((node.from === "") || (node.from === stanza.attrs.from))) {
 | 
			
		||||
                        //                        if (RED.settings.verbose || LOGITALL) {node.log("Received a message from "+stanza.attrs.from); }
 | 
			
		||||
                        if (!node.join && ((node.from === "") || (node.from === stanza.attrs.to))) {
 | 
			
		||||
                            node.send([msg,null]);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                else if(stanza.attrs.type == 'groupchat'){
 | 
			
		||||
                else if (stanza.attrs.type == 'groupchat') {
 | 
			
		||||
                    const parts = stanza.attrs.from.split("/");
 | 
			
		||||
                    var conference = parts[0];
 | 
			
		||||
                    var from = parts[1];
 | 
			
		||||
                    var body = stanza.getChild('body');
 | 
			
		||||
                    var payload = "";
 | 
			
		||||
                    if("undefined" !== typeof body){
 | 
			
		||||
                    if ("undefined" !== typeof body) {
 | 
			
		||||
                        payload = body.getText();
 | 
			
		||||
                    }
 | 
			
		||||
                    var msg = { topic:from, payload:payload, room:conference };
 | 
			
		||||
@@ -298,23 +353,23 @@ module.exports = function(RED) {
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            else if(stanza.is('presence')){
 | 
			
		||||
                if(['subscribe','subscribed','unsubscribe','unsubscribed'].indexOf(stanza.attrs.type) > -1){
 | 
			
		||||
            else if (stanza.is('presence')) {
 | 
			
		||||
                if (['subscribe','subscribed','unsubscribe','unsubscribed'].indexOf(stanza.attrs.type) > -1) {
 | 
			
		||||
                    // this isn't for us, let the config node deal with it.
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
                else{
 | 
			
		||||
                    var statusText="";
 | 
			
		||||
                    if(stanza.attrs.type === 'unavailable'){
 | 
			
		||||
                    if (stanza.attrs.type === 'unavailable') {
 | 
			
		||||
                        // the user might not exist, but the server doesn't tell us that!
 | 
			
		||||
                        statusText = "offline";
 | 
			
		||||
                    }
 | 
			
		||||
                    var status = stanza.getChild('status');
 | 
			
		||||
                    if("undefined" !== typeof status){
 | 
			
		||||
                    if ("undefined" !== typeof status) {
 | 
			
		||||
                        statusText = status.getText();
 | 
			
		||||
                    }
 | 
			
		||||
                    // right, do we care if there's no status?
 | 
			
		||||
                    if(statusText !== ""){
 | 
			
		||||
                    if (statusText !== "") {
 | 
			
		||||
                        var from = stanza.attrs.from;
 | 
			
		||||
                        var state = stanza.attrs.show;
 | 
			
		||||
                        var msg = {topic:from, payload: {presence:state, status:statusText} };
 | 
			
		||||
@@ -330,8 +385,6 @@ module.exports = function(RED) {
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        // xmpp.on('subscribe', from => {
 | 
			
		||||
        //   xmpp.acceptSubscription(from);
 | 
			
		||||
        // });
 | 
			
		||||
@@ -340,13 +393,16 @@ module.exports = function(RED) {
 | 
			
		||||
        this.serverConfig.register(this);
 | 
			
		||||
        // Now actually make the connection
 | 
			
		||||
        try {
 | 
			
		||||
            if(xmpp.status === "online"){
 | 
			
		||||
            if (xmpp.status === "online") {
 | 
			
		||||
                node.status({fill:"green",shape:"dot",text:"node-red:common.status.connected"});
 | 
			
		||||
            }
 | 
			
		||||
            else{
 | 
			
		||||
                node.status({fill:"grey",shape:"dot",text:"node-red:common.status.connecting"});
 | 
			
		||||
                if(xmpp.status === "offline"){
 | 
			
		||||
                    xmpp.start();
 | 
			
		||||
                if (xmpp.status === "offline") {
 | 
			
		||||
                    if (RED.settings.verbose || LOGITALL) {
 | 
			
		||||
                        node.log("starting xmpp client");
 | 
			
		||||
                    }
 | 
			
		||||
                    xmpp.start().catch(error => {node.warn("Got error on start: "+error); node.warn("XMPP Status is now: "+xmpp.status)});
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -392,7 +448,7 @@ module.exports = function(RED) {
 | 
			
		||||
 | 
			
		||||
        xmpp.on('online', function(data) {
 | 
			
		||||
            node.status({fill:"green",shape:"dot",text:"node-red:common.status.connected"});
 | 
			
		||||
            if ((node.join) && (node.from !== "")) {
 | 
			
		||||
            if ((node.join) && (node.to !== "")) {
 | 
			
		||||
                // disable chat history
 | 
			
		||||
                var to = node.to+'/'+node.nick;
 | 
			
		||||
                // the presence with the muc x element signifies we want to join the muc
 | 
			
		||||
@@ -400,10 +456,10 @@ module.exports = function(RED) {
 | 
			
		||||
                // (third argument to the x/muc/children )
 | 
			
		||||
                // We also turn off chat history (maxstanzas 0) because that's not what this node is about.
 | 
			
		||||
                var stanza = xml('presence',
 | 
			
		||||
                                 {"to": to},
 | 
			
		||||
                                 xml("x",'http://jabber.org/protocol/muc'),
 | 
			
		||||
                                 { maxstanzas:0, seconds:1 }
 | 
			
		||||
                                );
 | 
			
		||||
                    {"to": to},
 | 
			
		||||
                    xml("x",'http://jabber.org/protocol/muc'),
 | 
			
		||||
                    { maxstanzas:0, seconds:1 }
 | 
			
		||||
                );
 | 
			
		||||
                node.serverConfig.used(node);
 | 
			
		||||
                xmpp.send(stanza);
 | 
			
		||||
            }
 | 
			
		||||
@@ -444,7 +500,7 @@ module.exports = function(RED) {
 | 
			
		||||
                    node.error("Timeout connecting to server",err);
 | 
			
		||||
                    node.status({fill:"red",shape:"ring",text:"timeout"});
 | 
			
		||||
                }
 | 
			
		||||
                if (err.errno === "ENOTFOUND") {
 | 
			
		||||
                else if (err.errno === "ENOTFOUND") {
 | 
			
		||||
                    node.error("Server doesn't exist "+xmpp.options.service,err);
 | 
			
		||||
                    node.status({fill:"red",shape:"ring",text:"bad address"});
 | 
			
		||||
                }
 | 
			
		||||
@@ -452,8 +508,14 @@ module.exports = function(RED) {
 | 
			
		||||
                    node.error(err,err);
 | 
			
		||||
                    node.status({fill:"red",shape:"ring",text:"XMPP authentication failure"});
 | 
			
		||||
                }
 | 
			
		||||
                else if (err == "TimeoutError") {
 | 
			
		||||
                    // OK, this happens with OpenFire, suppress it.
 | 
			
		||||
                    node.status({fill:"grey",shape:"dot",text:"opening"});
 | 
			
		||||
                    node.log("Timed out! ",err);
 | 
			
		||||
                    //                    node.status({fill:"red",shape:"ring",text:"XMPP timeout"});
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    node.error(err.errno,err);
 | 
			
		||||
                    node.error("Unknown error: "+err,err);
 | 
			
		||||
                    node.status({fill:"red",shape:"ring",text:"node-red:common.status.error"});
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
@@ -462,12 +524,12 @@ module.exports = function(RED) {
 | 
			
		||||
        //register with config
 | 
			
		||||
        this.serverConfig.register(this);
 | 
			
		||||
        // Now actually make the connection
 | 
			
		||||
        if(xmpp.status === "online"){
 | 
			
		||||
        if (xmpp.status === "online") {
 | 
			
		||||
            node.status({fill:"green",shape:"dot",text:"online"});
 | 
			
		||||
        }
 | 
			
		||||
        else{
 | 
			
		||||
            node.status({fill:"grey",shape:"dot",text:"node-red:common.status.connecting"});
 | 
			
		||||
            if(xmpp.status === "offline"){
 | 
			
		||||
            if (xmpp.status === "offline") {
 | 
			
		||||
                xmpp.start().catch(error => {
 | 
			
		||||
                    node.error("Bad xmpp configuration; service: "+xmpp.options.service+" jid: "+node.serverConfig.jid);
 | 
			
		||||
                    node.warn(error);
 | 
			
		||||
@@ -482,20 +544,31 @@ module.exports = function(RED) {
 | 
			
		||||
            if (msg.presence) {
 | 
			
		||||
                if (['away', 'dnd', 'xa', 'chat'].indexOf(msg.presence) > -1 ) {
 | 
			
		||||
                    var stanza = xml('presence',
 | 
			
		||||
                                     {"show":msg.presence},
 | 
			
		||||
                                     xml('status',{},msg.payload));
 | 
			
		||||
                        {"show":msg.presence},
 | 
			
		||||
                        xml('status',{},msg.payload));
 | 
			
		||||
                    node.serverConfig.used(node);
 | 
			
		||||
                    xmpp.send(stanza);
 | 
			
		||||
                }
 | 
			
		||||
                else { node.warn("Can't set presence - invalid value: "+msg.presence); }
 | 
			
		||||
            }
 | 
			
		||||
            else if(msg.command){
 | 
			
		||||
                if(msg.command === "subscribe"){
 | 
			
		||||
            else if (msg.command) {
 | 
			
		||||
                if (msg.command === "subscribe") {
 | 
			
		||||
                    var stanza = xml('presence',
 | 
			
		||||
                                     {type:'subscribe', to: msg.payload});
 | 
			
		||||
                        {type:'subscribe', to: msg.payload});
 | 
			
		||||
                    node.serverConfig.used(node);
 | 
			
		||||
                    xmpp.send(stanza);
 | 
			
		||||
                }
 | 
			
		||||
                else if (msg.command === "get") {
 | 
			
		||||
                    var to = node.to || msg.topic || "";
 | 
			
		||||
                    var stanza = xml('iq',
 | 
			
		||||
                        {type:'get', id:node.id, to: to},
 | 
			
		||||
                        xml('query', 'http://jabber.org/protocol/muc#admin',
 | 
			
		||||
                            xml('item',{affiliation:msg.payload})));
 | 
			
		||||
                    node.serverConfig.used(node);
 | 
			
		||||
                    if (RED.settings.verbose || LOGITALL) {node.log("sending stanza "+stanza.toString()); }
 | 
			
		||||
                    xmpp.send(stanza);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                var to = node.to || msg.topic || "";
 | 
			
		||||
@@ -533,7 +606,7 @@ module.exports = function(RED) {
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        node.on("close", function(removed, done) {
 | 
			
		||||
            if (RED.settings.verbose || LOGITALL) {node.log("Closing");}
 | 
			
		||||
            if (RED.settings.verbose || LOGITALL) {node.log("Closing"); }
 | 
			
		||||
            node.status({fill:"red",shape:"ring",text:"node-red:common.status.disconnected"});
 | 
			
		||||
            node.serverConfig.deregister(node, done);
 | 
			
		||||
        });
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "node-red-node-xmpp",
 | 
			
		||||
    "version": "0.3.0",
 | 
			
		||||
    "version": "0.3.1",
 | 
			
		||||
    "description": "A Node-RED node to talk to an XMPP server",
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@xmpp/client": "^0.11.1"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user