From 243bdd78f42cc6f10ef7291dba9d34bcad184ef6 Mon Sep 17 00:00:00 2001 From: Kegan Dougal Date: Wed, 9 Dec 2015 16:09:47 +0000 Subject: [PATCH] Handle presence key in /sync --- lib/models/event.js | 2 +- lib/sync.js | 18 ++++++++++++- lib/utils.js | 63 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 2 deletions(-) diff --git a/lib/models/event.js b/lib/models/event.js index 18c2fe068..dd0d4623e 100644 --- a/lib/models/event.js +++ b/lib/models/event.js @@ -63,7 +63,7 @@ module.exports.MatrixEvent.prototype = { * @return {string} The user ID, e.g. @alice:matrix.org */ getSender: function() { - return this.event.user_id; + return this.event.sender || this.event.user_id; // v2 / v1 }, /** diff --git a/lib/sync.js b/lib/sync.js index 1e7cb00af..26c604b4e 100644 --- a/lib/sync.js +++ b/lib/sync.js @@ -150,7 +150,7 @@ SyncApi.prototype._sync = function(syncOptions, attempt) { // data looks like: // { // next_batch: $token, - // presence: [PresencEvents], + // presence: { events: [] }, // rooms: { // invite: { // $roomid: { @@ -175,6 +175,22 @@ SyncApi.prototype._sync = function(syncOptions, attempt) { // } console.log("Got data %s", data); + // handle presence events (User objects) + if (data.presence && utils.isArray(data.presence.events)) { + data.presence.events.map(client.getEventMapper()).forEach(function(presenceEvent) { + var user = client.store.getUser(presenceEvent.getSender()); + if (user) { + user.setPresenceEvent(presenceEvent); + } + else { + user = createNewUser(client, presenceEvent.getSender()); + user.setPresenceEvent(presenceEvent); + client.store.storeUser(user); + } + client.emit("event", presenceEvent); + }); + } + /* var i, j; // intercept the results and put them into our store diff --git a/lib/utils.js b/lib/utils.js index 955903fff..90416fb85 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -367,6 +367,69 @@ module.exports.runPolyfills = function() { return A; }; } + + // Array.prototype.forEach + // ======================================================== + // SOURCE: + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach + // Production steps of ECMA-262, Edition 5, 15.4.4.18 + // Reference: http://es5.github.io/#x15.4.4.18 + if (!Array.prototype.forEach) { + + Array.prototype.forEach = function(callback, thisArg) { + + var T, k; + + if (this == null) { + throw new TypeError(' this is null or not defined'); + } + + // 1. Let O be the result of calling ToObject passing the |this| value as the argument. + var O = Object(this); + + // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length". + // 3. Let len be ToUint32(lenValue). + var len = O.length >>> 0; + + // 4. If IsCallable(callback) is false, throw a TypeError exception. + // See: http://es5.github.com/#x9.11 + if (typeof callback !== "function") { + throw new TypeError(callback + ' is not a function'); + } + + // 5. If thisArg was supplied, let T be thisArg; else let T be undefined. + if (arguments.length > 1) { + T = thisArg; + } + + // 6. Let k be 0 + k = 0; + + // 7. Repeat, while k < len + while (k < len) { + + var kValue; + + // a. Let Pk be ToString(k). + // This is implicit for LHS operands of the in operator + // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk. + // This step can be combined with c + // c. If kPresent is true, then + if (k in O) { + + // i. Let kValue be the result of calling the Get internal method of O with argument Pk. + kValue = O[k]; + + // ii. Call the Call internal method of callback with T as the this value and + // argument list containing kValue, k, and O. + callback.call(T, kValue, k, O); + } + // d. Increase k by 1. + k++; + } + // 8. return undefined + }; + } }; /**