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()
|
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
|
// set the pagination token before adding the events in case people
|
||||||
// fire off pagination requests in response to the Room.timeline
|
// fire off pagination requests in response to the Room.timeline
|
||||||
// events.
|
// events.
|
||||||
@@ -279,6 +298,31 @@ SyncApi.prototype._peekPoll = function(roomId, token) {
|
|||||||
timeout: 30 * 1000,
|
timeout: 30 * 1000,
|
||||||
from: token
|
from: token
|
||||||
}, undefined, 50 * 1000).done(function(res) {
|
}, 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)
|
// strip out events which aren't for the given room_id (e.g presence)
|
||||||
var events = res.chunk.filter(function(e) {
|
var events = res.chunk.filter(function(e) {
|
||||||
return e.room_id === roomId;
|
return e.room_id === roomId;
|
||||||
|
|||||||
Reference in New Issue
Block a user