forked from dimitrilarue/node-facebook-chat
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
121 lines (103 loc) · 2.83 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
var util = require('util'),
xmpp = require('node-xmpp'),
EventEmitter = require('events').EventEmitter,
stanzaUtils = require("./stanza");
exports = module.exports = FacebookChat;
/**
* Facebook chat client
* @param params Required params for connection
* @param params.facebookId User Facebook ID
* @param params.accessToken User Facebook access token
* @param params.appId Your Facebook application ID
* @param params.appSecret Your Facebook application secret
*/
function FacebookChat(params) {
EventEmitter.call(this);
var self = this;
//Connect the client
this.client = new xmpp.Client({
jid: '-'+ params.facebookId +'@chat.facebook.com',
api_key: params.appId,
secret_key: params.appSecret,
access_token: params.accessToken
});
//If a error is receive
this.client.on('error', function(err){
self.emit('error', err);
});
//When Online
this.client.on('online', function(){
self.emit('online');
//Send Presence
var presence = new xmpp.Element('presence');
self.client.send(presence);
//And keep the connection live
setInterval(function(){
self.client.send(presence);
}, 1000 * 20);
});
//On stanza from facebook
this.client.on('stanza', function(stanza) {
if (stanza.is('iq')) {
var iq = stanzaUtils.onIq(stanza);
//Roster
if (iq && iq.type === 'jabber:iq:roster') {
self.emit('roster', iq.friends);
}
//vCard
if (iq && iq.type === 'vcard') {
self.emit('vcard', iq.vcard);
}
}
//Presence
else if(stanza.is('presence')) {
var presence = stanzaUtils.onPresence(stanza);
self.emit('presence', presence);
}
//Message
else if(stanza.is('message')) {
var message = stanzaUtils.onMessage(stanza);
//Message
if (message && message.body) {
self.emit('message', message);
}
//Composing message
if (message && message.composing) {
self.emit('composing', message.from);
}
}
});
}
util.inherits(FacebookChat, EventEmitter);
/**
* Send a roster request (friend list)
*/
FacebookChat.prototype.roster = function() {
this.client.send(
new xmpp.Element( 'iq', { type: 'get' })
.c('query', { xmlns: 'jabber:iq:roster'})
);
};
/**
* Send a message
* @param {String} to -FACEBOOK_ID@chat.facebook.com
* @param {String} message plain-text messages
*/
FacebookChat.prototype.send = function(to, message) {
this.client.send(stanzaUtils.message(to, message));
};
/**
* Send a vcard request
* @param {String} [to]
*/
FacebookChat.prototype.vcard = function(to) {
var params = { type: 'get' };
if (to) {
params.to = to;
}
this.client.send(
new xmpp.Element( 'iq', params)
.c('vCard', { xmlns: 'vcard-temp'})
.c('want-extval', { xmlns: 'http://www.facebook.com/xmpp/vcard/photo'})
);
};