Commit 8e029d5c260423ccc747495e6048f9f1a5944d0f
1 parent
97aef7616d
Exists in
master
cleaning isAFriend
Showing 2 changed files with 0 additions and 24 deletions Inline Diff
adaptor-xmpp.js
1 | var xmpp = require('simple-xmpp'); | 1 | var xmpp = require('simple-xmpp'); |
2 | var moment = require('moment'); | 2 | var moment = require('moment'); |
3 | var MatrixUtil = require('./matrix-util'); | 3 | var MatrixUtil = require('./matrix-util'); |
4 | 4 | ||
5 | var username; | 5 | var username; |
6 | var password; | 6 | var password; |
7 | 7 | ||
8 | var callbacks; | 8 | var callbacks; |
9 | var matrix; | 9 | var matrix; |
10 | var matrixUtil; | 10 | var matrixUtil; |
11 | 11 | ||
12 | function onOnline(data) { | 12 | function onOnline(data) { |
13 | logger.info('XMPP login successful', {data: data}); | 13 | logger.info('XMPP login successful', {data: data}); |
14 | 14 | ||
15 | xmpp.getRoster(); | 15 | xmpp.getRoster(); |
16 | 16 | ||
17 | if (callbacks.onOnline) { | 17 | if (callbacks.onOnline) { |
18 | callbacks.onOnline(); | 18 | callbacks.onOnline(); |
19 | } | 19 | } |
20 | } | 20 | } |
21 | 21 | ||
22 | function onPM(sender, msg) { | 22 | function onPM(sender, msg) { |
23 | if (sender.toLowerCase() == username.replace(/\/.*/, '').toLowerCase()) { | 23 | if (sender.toLowerCase() == username.replace(/\/.*/, '').toLowerCase()) { |
24 | return; | 24 | return; |
25 | } | 25 | } |
26 | 26 | ||
27 | logger.verbose('Got a message', {from: sender, msg: msg}); | 27 | logger.verbose('Got a message', {from: sender, msg: msg}); |
28 | 28 | ||
29 | if (callbacks.onPM) { | 29 | if (callbacks.onPM) { |
30 | callbacks.onPM(sender, msg); | 30 | callbacks.onPM(sender, msg); |
31 | } | 31 | } |
32 | 32 | ||
33 | matrixUtil.updateLastIncoming(sender, msg); | 33 | matrixUtil.updateLastIncoming(sender, msg); |
34 | } | 34 | } |
35 | 35 | ||
36 | function onError(err) { | 36 | function onError(err) { |
37 | logger.warn('XMPP error, terminating in 3 secs', {err: err}); | 37 | logger.warn('XMPP error, terminating in 3 secs', {err: err}); |
38 | setTimeout(process.exit, 3000, 1); | 38 | setTimeout(process.exit, 3000, 1); |
39 | } | 39 | } |
40 | 40 | ||
41 | function onSubscribe(sender) { | 41 | function onSubscribe(sender) { |
42 | xmpp.acceptSubscription(sender); | 42 | xmpp.acceptSubscription(sender); |
43 | } | 43 | } |
44 | 44 | ||
45 | function onUnsubscribe(sender) { | 45 | function onUnsubscribe(sender) { |
46 | xmpp.acceptUnsubscription(sender); | 46 | xmpp.acceptUnsubscription(sender); |
47 | } | 47 | } |
48 | 48 | ||
49 | function onBuddy(jid, state, statusText, resource) { | 49 | function onBuddy(jid, state, statusText, resource) { |
50 | matrixUtil.updateBuddyState(jid, state, statusText, resource); | 50 | matrixUtil.updateBuddyState(jid, state, statusText, resource); |
51 | } | 51 | } |
52 | 52 | ||
53 | function isPartnerOffline(partner) { | 53 | function isPartnerOffline(partner) { |
54 | if (!matrixUtil.isAFriend(partner)) { | ||
55 | logger.verbose(partner + ' is not a friend yet, adding it as a friend') | ||
56 | addFriend(partner); | ||
57 | } | ||
58 | |||
59 | return matrixUtil.isPartnerOffline(partner); | 54 | return matrixUtil.isPartnerOffline(partner); |
60 | } | 55 | } |
61 | 56 | ||
62 | function init(_username, _password, _logger, _callbacks) { | 57 | function init(_username, _password, _logger, _callbacks) { |
63 | username = _username; | 58 | username = _username; |
64 | password = _password; | 59 | password = _password; |
65 | logger = _logger; | 60 | logger = _logger; |
66 | callbacks = _callbacks; | 61 | callbacks = _callbacks; |
67 | 62 | ||
68 | xmpp.on('online', onOnline); | 63 | xmpp.on('online', onOnline); |
69 | xmpp.on('chat', onPM); | 64 | xmpp.on('chat', onPM); |
70 | xmpp.on('error', onError); | 65 | xmpp.on('error', onError); |
71 | xmpp.on('subscribe', onSubscribe); | 66 | xmpp.on('subscribe', onSubscribe); |
72 | xmpp.on('unsubscribe', onUnsubscribe); | 67 | xmpp.on('unsubscribe', onUnsubscribe); |
73 | xmpp.on('buddy', onBuddy); | 68 | xmpp.on('buddy', onBuddy); |
74 | 69 | ||
75 | xmpp.unsubscribe(); | 70 | xmpp.unsubscribe(); |
76 | 71 | ||
77 | xmpp.connect({ | 72 | xmpp.connect({ |
78 | jid: username, | 73 | jid: username, |
79 | password: password | 74 | password: password |
80 | }); | 75 | }); |
81 | } | 76 | } |
82 | 77 | ||
83 | function setOptions(options) { | 78 | function setOptions(options) { |
84 | if (!options.matrix) { | 79 | if (!options.matrix) { |
85 | return; | 80 | return; |
86 | } | 81 | } |
87 | 82 | ||
88 | matrix = options.matrix; | 83 | matrix = options.matrix; |
89 | matrixUtil = new MatrixUtil({matrix: matrix, logger: logger}); | 84 | matrixUtil = new MatrixUtil({matrix: matrix, logger: logger}); |
90 | } | 85 | } |
91 | 86 | ||
92 | function sendMessage(destination, msg) { | 87 | function sendMessage(destination, msg) { |
93 | if (!destination) { | 88 | if (!destination) { |
94 | logger.warn('adaptorXmpp.sendMessage: Undefined destination, send message aborted', {destination: destination, msg: msg}); | 89 | logger.warn('adaptorXmpp.sendMessage: Undefined destination, send message aborted', {destination: destination, msg: msg}); |
95 | } | 90 | } |
96 | 91 | ||
97 | if (!msg) { | 92 | if (!msg) { |
98 | logger.warn('adaptorXmpp.sendMessage: Undefined message, send message aborted', {destination: destination, msg: msg}); | 93 | logger.warn('adaptorXmpp.sendMessage: Undefined message, send message aborted', {destination: destination, msg: msg}); |
99 | } | 94 | } |
100 | 95 | ||
101 | 96 | ||
102 | if (destination.toLowerCase() != username.replace(/\/.*/, '').toLowerCase()) { | 97 | if (destination.toLowerCase() != username.replace(/\/.*/, '').toLowerCase()) { |
103 | logger.verbose('Sending message', {from: username, destination: destination, msg: msg}); | 98 | logger.verbose('Sending message', {from: username, destination: destination, msg: msg}); |
104 | } | 99 | } |
105 | 100 | ||
106 | xmpp.send(destination, msg); | 101 | xmpp.send(destination, msg); |
107 | 102 | ||
108 | matrixUtil.updateLastOutgoing(destination, msg); | 103 | matrixUtil.updateLastOutgoing(destination, msg); |
109 | } | 104 | } |
110 | 105 | ||
111 | function addFriend(friend) { | 106 | function addFriend(friend) { |
112 | logger.verbose('Adding XMP friend: ' + friend); | 107 | logger.verbose('Adding XMP friend: ' + friend); |
113 | xmpp.subscribe(friend); | 108 | xmpp.subscribe(friend); |
114 | } | 109 | } |
115 | 110 | ||
116 | function isAFriend(jid) { | ||
117 | return matrixUtil.isAFriend(jid); | ||
118 | } | ||
119 | |||
120 | exports.init = init; | 111 | exports.init = init; |
121 | exports.sendMessage = sendMessage; | 112 | exports.sendMessage = sendMessage; |
122 | exports.setOptions = setOptions; | 113 | exports.setOptions = setOptions; |
123 | exports.addFriend = addFriend; | 114 | exports.addFriend = addFriend; |
124 | exports.isPartnerOffline = isPartnerOffline; | 115 | exports.isPartnerOffline = isPartnerOffline; |
125 | exports.isAFriend = isAFriend; | ||
126 | 116 |
matrix-util.js
1 | 'use strict'; | 1 | 'use strict'; |
2 | 2 | ||
3 | var moment = require('moment'); | 3 | var moment = require('moment'); |
4 | var momentFormat = 'YYYY-MM-DD HH:mm:ss'; | 4 | var momentFormat = 'YYYY-MM-DD HH:mm:ss'; |
5 | 5 | ||
6 | module.exports = MatrixUtil; | 6 | module.exports = MatrixUtil; |
7 | 7 | ||
8 | function _cleanPartnerId(partnerId) { | 8 | function _cleanPartnerId(partnerId) { |
9 | let cleaned = partnerId; | 9 | let cleaned = partnerId; |
10 | 10 | ||
11 | try { | 11 | try { |
12 | cleaned = cleaned.toLocaleString(); | 12 | cleaned = cleaned.toLocaleString(); |
13 | cleaned = cleaned.trim().toLowerCase(); | 13 | cleaned = cleaned.trim().toLowerCase(); |
14 | } catch(e) { | 14 | } catch(e) { |
15 | return partnerId; | 15 | return partnerId; |
16 | } | 16 | } |
17 | 17 | ||
18 | return cleaned; | 18 | return cleaned; |
19 | } | 19 | } |
20 | 20 | ||
21 | function MatrixUtil(options) { | 21 | function MatrixUtil(options) { |
22 | if (!options) { | 22 | if (!options) { |
23 | console.trace('Undefined options'); | 23 | console.trace('Undefined options'); |
24 | process.exit(1); | 24 | process.exit(1); |
25 | } | 25 | } |
26 | 26 | ||
27 | this.matrix = options.matrix; | 27 | this.matrix = options.matrix; |
28 | if (!this.matrix) { | 28 | if (!this.matrix) { |
29 | console.trace("Matrix not set"); | 29 | console.trace("Matrix not set"); |
30 | process.exit(1); | 30 | process.exit(1); |
31 | } | 31 | } |
32 | 32 | ||
33 | this.logger = options.logger; | 33 | this.logger = options.logger; |
34 | if (!this.logger) { | 34 | if (!this.logger) { |
35 | console.trace("Logger not set"); | 35 | console.trace("Logger not set"); |
36 | process.exit(1); | 36 | process.exit(1); |
37 | } | 37 | } |
38 | } | 38 | } |
39 | 39 | ||
40 | MatrixUtil.prototype.updateBuddyState = function(jid, state, statusText, resource) { | 40 | MatrixUtil.prototype.updateBuddyState = function(jid, state, statusText, resource) { |
41 | if (!jid) {return; } | 41 | if (!jid) {return; } |
42 | if (jid == 'undefined') {return; } | 42 | if (jid == 'undefined') {return; } |
43 | 43 | ||
44 | jid = _cleanPartnerId(jid); | 44 | jid = _cleanPartnerId(jid); |
45 | 45 | ||
46 | if (!resource) { | 46 | if (!resource) { |
47 | resource = 'undefined'; | 47 | resource = 'undefined'; |
48 | } | 48 | } |
49 | 49 | ||
50 | let logger = this.logger; | 50 | let logger = this.logger; |
51 | let matrix = this.matrix; | 51 | let matrix = this.matrix; |
52 | 52 | ||
53 | logger.verbose('Buddy state change', {jid: jid, state: state, statusText: statusText, resource: resource}); | 53 | logger.verbose('Buddy state change', {jid: jid, state: state, statusText: statusText, resource: resource}); |
54 | 54 | ||
55 | if (!matrix) { | 55 | if (!matrix) { |
56 | return; | 56 | return; |
57 | } | 57 | } |
58 | 58 | ||
59 | if (!matrix.buddies) { | 59 | if (!matrix.buddies) { |
60 | matrix.buddies = {}; | 60 | matrix.buddies = {}; |
61 | } | 61 | } |
62 | 62 | ||
63 | if (!matrix.buddies[jid]) { | 63 | if (!matrix.buddies[jid]) { |
64 | matrix.buddies[jid] = {resources: {}}; | 64 | matrix.buddies[jid] = {resources: {}}; |
65 | } | 65 | } |
66 | 66 | ||
67 | try { | 67 | try { |
68 | matrix.buddies[jid]['resources'][resource] = { | 68 | matrix.buddies[jid]['resources'][resource] = { |
69 | state: state, | 69 | state: state, |
70 | statusText: statusText, | 70 | statusText: statusText, |
71 | last_update: moment().format(momentFormat) | 71 | last_update: moment().format(momentFormat) |
72 | } | 72 | } |
73 | } | 73 | } |
74 | catch(e) { | 74 | catch(e) { |
75 | logger.warn('MatrixUtil: Exception on update resources on matrix', {jid: jid, state: state, statusText: statusText, resource: resource}); | 75 | logger.warn('MatrixUtil: Exception on update resources on matrix', {jid: jid, state: state, statusText: statusText, resource: resource}); |
76 | } | 76 | } |
77 | 77 | ||
78 | if (resource != 'undefined' && matrix.buddies[jid].resources['undefined']) { | 78 | if (resource != 'undefined' && matrix.buddies[jid].resources['undefined']) { |
79 | try { | 79 | try { |
80 | delete matrix.buddies[jid].resources['undefined']; | 80 | delete matrix.buddies[jid].resources['undefined']; |
81 | } | 81 | } |
82 | catch(e) {}; | 82 | catch(e) {}; |
83 | } | 83 | } |
84 | } | 84 | } |
85 | 85 | ||
86 | MatrixUtil.prototype.isAFriend = function(jid) { | ||
87 | if (!jid) { return; } | ||
88 | |||
89 | jid = _cleanPartnerId(jid); | ||
90 | |||
91 | let matrix = this.matrix; | ||
92 | |||
93 | if (!matrix) { return false; }; | ||
94 | if (!matrix.buddies) { return false; } | ||
95 | if (!matrix.buddies[jid]) { return false; } | ||
96 | |||
97 | return true; | ||
98 | } | ||
99 | |||
100 | MatrixUtil.prototype.isPartnerOffline = function(partner) { | 86 | MatrixUtil.prototype.isPartnerOffline = function(partner) { |
101 | if (!partner) { return; } | 87 | if (!partner) { return; } |
102 | 88 | ||
103 | partner = _cleanPartnerId(partner); | 89 | partner = _cleanPartnerId(partner); |
104 | 90 | ||
105 | let matrix = this.matrix; | 91 | let matrix = this.matrix; |
106 | let logger = this.logger; | 92 | let logger = this.logger; |
107 | 93 | ||
108 | if (!matrix) { return false; } | 94 | if (!matrix) { return false; } |
109 | 95 | ||
110 | if (!matrix.buddies[partner]) { return false; } | 96 | if (!matrix.buddies[partner]) { return false; } |
111 | if (!matrix.buddies[partner].resources) { return false; }; | 97 | if (!matrix.buddies[partner].resources) { return false; }; |
112 | 98 | ||
113 | let resources = matrix.buddies[partner].resources; | 99 | let resources = matrix.buddies[partner].resources; |
114 | for (let key in resources) { | 100 | for (let key in resources) { |
115 | if (resources.hasOwnProperty(key)) { | 101 | if (resources.hasOwnProperty(key)) { |
116 | let resource = resources[key]; | 102 | let resource = resources[key]; |
117 | if (resources[key].state == 'online') { | 103 | if (resources[key].state == 'online') { |
118 | return false; | 104 | return false; |
119 | } | 105 | } |
120 | } | 106 | } |
121 | } | 107 | } |
122 | logger.verbose('Offline partner detected: ' + partner); | 108 | logger.verbose('Offline partner detected: ' + partner); |
123 | return true; | 109 | return true; |
124 | } | 110 | } |
125 | 111 | ||
126 | MatrixUtil.prototype._updateLastResponseTime = function(partner) { | 112 | MatrixUtil.prototype._updateLastResponseTime = function(partner) { |
127 | let matrix = this.matrix; | 113 | let matrix = this.matrix; |
128 | let logger = this.logger; | 114 | let logger = this.logger; |
129 | 115 | ||
130 | if (!matrix.buddies[partner]['last_outgoing']) { | 116 | if (!matrix.buddies[partner]['last_outgoing']) { |
131 | logger.verbose('No outgoing yet, skip updateLastResponseTime'); | 117 | logger.verbose('No outgoing yet, skip updateLastResponseTime'); |
132 | return; | 118 | return; |
133 | } | 119 | } |
134 | 120 | ||
135 | if (!matrix.buddies[partner]['last_outgoing']['last_update_ts']) { | 121 | if (!matrix.buddies[partner]['last_outgoing']['last_update_ts']) { |
136 | logger.verbose('No outgoing timestamp yet, skip updateLastResponseTime'); | 122 | logger.verbose('No outgoing timestamp yet, skip updateLastResponseTime'); |
137 | return; | 123 | return; |
138 | } | 124 | } |
139 | 125 | ||
140 | if ( | 126 | if ( |
141 | matrix.buddies[partner]['last_incoming'] | 127 | matrix.buddies[partner]['last_incoming'] |
142 | && (Number(matrix.buddies[partner]['last_incoming']['last_update_ts']) > Number(matrix.buddies[partner]['last_outgoing']['last_update_ts'])) | 128 | && (Number(matrix.buddies[partner]['last_incoming']['last_update_ts']) > Number(matrix.buddies[partner]['last_outgoing']['last_update_ts'])) |
143 | ) { | 129 | ) { |
144 | return; | 130 | return; |
145 | } | 131 | } |
146 | 132 | ||
147 | let delta = Date.now() - Number(matrix.buddies[partner]['last_outgoing']['last_update_ts']); | 133 | let delta = Date.now() - Number(matrix.buddies[partner]['last_outgoing']['last_update_ts']); |
148 | delta = (delta / 1000).toFixed(2); | 134 | delta = (delta / 1000).toFixed(2); |
149 | logger.verbose('MatrixUtil: Response time in ' + delta + ' seconds', {partner: partner}); | 135 | logger.verbose('MatrixUtil: Response time in ' + delta + ' seconds', {partner: partner}); |
150 | matrix.buddies[partner]['last_response_time_in_secs'] = delta; | 136 | matrix.buddies[partner]['last_response_time_in_secs'] = delta; |
151 | } | 137 | } |
152 | 138 | ||
153 | MatrixUtil.prototype._updateLastMessage = function(partner, msg, direction) { | 139 | MatrixUtil.prototype._updateLastMessage = function(partner, msg, direction) { |
154 | if (!partner) { return; } | 140 | if (!partner) { return; } |
155 | partner = _cleanPartnerId(partner); | 141 | partner = _cleanPartnerId(partner); |
156 | 142 | ||
157 | let matrix = this.matrix; | 143 | let matrix = this.matrix; |
158 | let logger = this.logger; | 144 | let logger = this.logger; |
159 | 145 | ||
160 | if (!matrix) { | 146 | if (!matrix) { |
161 | return; | 147 | return; |
162 | } | 148 | } |
163 | 149 | ||
164 | if (!matrix.buddies) { | 150 | if (!matrix.buddies) { |
165 | matrix.buddies = {}; | 151 | matrix.buddies = {}; |
166 | } | 152 | } |
167 | 153 | ||
168 | if (!matrix.buddies[partner]) { | 154 | if (!matrix.buddies[partner]) { |
169 | matrix.buddies[partner] = {}; | 155 | matrix.buddies[partner] = {}; |
170 | } | 156 | } |
171 | 157 | ||
172 | if (direction == 'incoming') { | 158 | if (direction == 'incoming') { |
173 | try { | 159 | try { |
174 | this._updateLastResponseTime(partner); | 160 | this._updateLastResponseTime(partner); |
175 | } | 161 | } |
176 | catch(e) { | 162 | catch(e) { |
177 | logger.warn('Exception when updateLastResponseTime', {err: e}); | 163 | logger.warn('Exception when updateLastResponseTime', {err: e}); |
178 | } | 164 | } |
179 | } | 165 | } |
180 | 166 | ||
181 | matrix.buddies[partner]['waiting_for_response'] = (direction == 'outgoing'); | 167 | matrix.buddies[partner]['waiting_for_response'] = (direction == 'outgoing'); |
182 | 168 | ||
183 | matrix.buddies[partner]['last_' + direction] = { | 169 | matrix.buddies[partner]['last_' + direction] = { |
184 | msg: msg, | 170 | msg: msg, |
185 | last_update: moment().format(momentFormat), | 171 | last_update: moment().format(momentFormat), |
186 | last_update_ts: Date.now() | 172 | last_update_ts: Date.now() |
187 | } | 173 | } |
188 | 174 | ||
189 | if (direction == 'outgoing') { | 175 | if (direction == 'outgoing') { |
190 | return; | 176 | return; |
191 | } | 177 | } |
192 | } | 178 | } |
193 | 179 | ||
194 | 180 | ||
195 | MatrixUtil.prototype.updateLastIncoming = function(partner, msg) { | 181 | MatrixUtil.prototype.updateLastIncoming = function(partner, msg) { |
196 | this._updateLastMessage(partner, msg, 'incoming'); | 182 | this._updateLastMessage(partner, msg, 'incoming'); |
197 | } | 183 | } |
198 | 184 | ||
199 | MatrixUtil.prototype.updateLastOutgoing = function(partner, msg) { | 185 | MatrixUtil.prototype.updateLastOutgoing = function(partner, msg) { |
200 | this._updateLastMessage(partner, msg, 'outgoing'); | 186 | this._updateLastMessage(partner, msg, 'outgoing'); |
201 | } | 187 | } |
202 | 188 |