Commit 8e029d5c260423ccc747495e6048f9f1a5944d0f

Authored by Adhidarma Hadiwinoto
1 parent 97aef7616d
Exists in master

cleaning isAFriend

Showing 2 changed files with 0 additions and 24 deletions Inline Diff

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
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