diff --git a/lib/models/room.js b/lib/models/room.js index 1ba737a8f..9e1d58605 100644 --- a/lib/models/room.js +++ b/lib/models/room.js @@ -609,6 +609,7 @@ Room.prototype._addEventToTimeline = function(event, timeline, toStartOfTimeline * @private */ Room.prototype._addLiveEvents = function(events) { + // var now = Date.now(); for (var i = 0; i < events.length; i++) { if (events[i].getType() === "m.room.redaction") { var redactId = events[i].event.redacts; @@ -652,6 +653,16 @@ Room.prototype._addLiveEvents = function(events) { this.addReceipt(synthesizeReceipt( events[i].sender.userId, events[i], "m.read" ), true); + + // also, any live events from a user should be taken as implicit + // presence information: evidence that they are currently active. + // ...except in a world where we use 'user.currentlyActive' to reduce + // presence spam, this isn't very useful - we'll get a transition when + // they are no longer currently active anyway. so comment it out for now. + + // var user = this.currentState.getMember(events[i].sender.userId); + // user.lastActiveAgo = 0; + // user.lastPresenceTs = now; } } }; diff --git a/lib/models/user.js b/lib/models/user.js index be2b05f2d..152182339 100644 --- a/lib/models/user.js +++ b/lib/models/user.js @@ -30,7 +30,12 @@ limitations under the License. * @prop {string} displayName The 'displayname' of the user if known. * @prop {string} avatarUrl The 'avatar_url' of the user if known. * @prop {string} presence The presence enum if known. - * @prop {Number} lastActiveAgo The last time the user performed some action in ms. + * @prop {Number} lastActiveAgo The time elapsed in ms since the user interacted + * proactively with the server, or we saw a message from the user + * @prop {Number} lastPresenceTs Timestamp (ms since the epoch) for when we last + * received presence data for this user. We can subtract + * lastActiveAgo from this to approximate an absolute value for + * when a user was last active. * @prop {Boolean} currentlyActive Whether we should consider lastActiveAgo to be * an approximation and that the user should be seen as active 'now' * @prop {Object} events The events describing this user. @@ -42,6 +47,7 @@ function User(userId) { this.displayName = userId; this.avatarUrl = null; this.lastActiveAgo = 0; + this.lastPresenceTs = 0; this.currentlyActive = false; this.events = { presence: null, @@ -82,6 +88,7 @@ User.prototype.setPresenceEvent = function(event) { this.displayName = event.getContent().displayname; this.avatarUrl = event.getContent().avatar_url; this.lastActiveAgo = event.getContent().last_active_ago; + this.lastPresenceTs = Date.now(); this.currentlyActive = event.getContent().currently_active; if (eventsToFire.length > 0) {