You've already forked matrix-js-sdk
mirror of
https://github.com/matrix-org/matrix-js-sdk.git
synced 2025-11-28 05:03:59 +03:00
make presence work when peeking. fixes https://github.com/vector-im/vector-web/issues/780
This commit is contained in:
44
lib/sync.js
44
lib/sync.js
@@ -225,6 +225,25 @@ SyncApi.prototype.peek = function(roomId) {
|
||||
response.messages.chunk, client.getEventMapper()
|
||||
);
|
||||
|
||||
// XXX: copypasted from /sync until we kill off this
|
||||
// minging v1 API stuff)
|
||||
// handle presence events (User objects)
|
||||
if (response.presence && utils.isArray(response.presence)) {
|
||||
response.presence.map(client.getEventMapper()).forEach(
|
||||
function(presenceEvent) {
|
||||
var user = client.store.getUser(presenceEvent.getContent().user_id);
|
||||
if (user) {
|
||||
user.setPresenceEvent(presenceEvent);
|
||||
}
|
||||
else {
|
||||
user = createNewUser(client, presenceEvent.getContent().user_id);
|
||||
user.setPresenceEvent(presenceEvent);
|
||||
client.store.storeUser(user);
|
||||
}
|
||||
client.emit("event", presenceEvent);
|
||||
});
|
||||
}
|
||||
|
||||
// set the pagination token before adding the events in case people
|
||||
// fire off pagination requests in response to the Room.timeline
|
||||
// events.
|
||||
@@ -279,6 +298,31 @@ SyncApi.prototype._peekPoll = function(roomId, token) {
|
||||
timeout: 30 * 1000,
|
||||
from: token
|
||||
}, undefined, 50 * 1000).done(function(res) {
|
||||
|
||||
// We have a problem that we get presence both from /events and /sync
|
||||
// however, /sync only returns presence for users in rooms
|
||||
// you're actually joined to.
|
||||
// in order to be sure to get presence for all of the users in the
|
||||
// peeked room, we handle presence explicitly here. This may result
|
||||
// in duplicate presence events firing for some users, which is a
|
||||
// performance drain, but such is life.
|
||||
// XXX: copypasted from /sync until we can kill this minging v1 stuff.
|
||||
|
||||
res.chunk.filter(function(e) {
|
||||
return e.type === "m.presence";
|
||||
}).map(self.client.getEventMapper()).map(function(presenceEvent) {
|
||||
var user = self.client.store.getUser(presenceEvent.getContent().user_id);
|
||||
if (user) {
|
||||
user.setPresenceEvent(presenceEvent);
|
||||
}
|
||||
else {
|
||||
user = createNewUser(self.client, presenceEvent.getContent().user_id);
|
||||
user.setPresenceEvent(presenceEvent);
|
||||
self.client.store.storeUser(user);
|
||||
}
|
||||
self.client.emit("event", presenceEvent);
|
||||
});
|
||||
|
||||
// strip out events which aren't for the given room_id (e.g presence)
|
||||
var events = res.chunk.filter(function(e) {
|
||||
return e.room_id === roomId;
|
||||
|
||||
Reference in New Issue
Block a user