You've already forked matrix-js-sdk
mirror of
https://github.com/matrix-org/matrix-js-sdk.git
synced 2025-09-01 21:21:58 +03:00
@@ -36,6 +36,25 @@ function Room(roomId, storageToken) {
|
||||
this.summary = null;
|
||||
this.storageToken = storageToken;
|
||||
this._redactions = [];
|
||||
// receipts should clobber based on receipt_type and user_id pairs hence
|
||||
// the form of this structure. This is sub-optimal for the exposed APIs
|
||||
// which pass in an event ID and get back some receipts, so we also store
|
||||
// a pre-cached list for this purpose.
|
||||
this._receipts = {
|
||||
// receipt_type: {
|
||||
// user_id: {
|
||||
// eventId: <event_id>,
|
||||
// data: <receipt_data>
|
||||
// }
|
||||
// }
|
||||
};
|
||||
this._receiptCacheByEventId = {
|
||||
// $event_id: [{
|
||||
// type: $type,
|
||||
// userId: $user_id,
|
||||
// data: <receipt data>
|
||||
// }]
|
||||
};
|
||||
}
|
||||
utils.inherits(Room, EventEmitter);
|
||||
|
||||
@@ -164,6 +183,9 @@ Room.prototype.addEvents = function(events, duplicateStrategy) {
|
||||
if (events[i].getType() === "m.typing") {
|
||||
this.currentState.setTypingEvent(events[i]);
|
||||
}
|
||||
else if (events[i].getType() === "m.receipt") {
|
||||
this.addReceipt(events[i]);
|
||||
}
|
||||
else {
|
||||
if (duplicateStrategy) {
|
||||
// is there a duplicate?
|
||||
@@ -220,6 +242,82 @@ Room.prototype.recalculate = function(userId) {
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Get a list of user IDs who have <b>read up to</b> the given event.
|
||||
* @param {MatrixEvent} event the event to get read receipts for.
|
||||
* @return {String[]} A list of user IDs.
|
||||
*/
|
||||
Room.prototype.getUsersReadUpTo = function(event) {
|
||||
return this.getReceiptsForEvent(event).filter(function(receipt) {
|
||||
return receipt.type === "m.read";
|
||||
}).map(function(receipt) {
|
||||
return receipt.userId;
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Get a list of receipts for the given event.
|
||||
* @param {MatrixEvent} event the event to get receipts for
|
||||
* @return {Object[]} A list of receipts with a userId, type and data keys or
|
||||
* an empty list.
|
||||
*/
|
||||
Room.prototype.getReceiptsForEvent = function(event) {
|
||||
return this._receiptCacheByEventId[event.getId()] || [];
|
||||
};
|
||||
|
||||
/**
|
||||
* Add a receipt event to the room.
|
||||
* @param {MatrixEvent} event The m.receipt event.
|
||||
*/
|
||||
Room.prototype.addReceipt = function(event) {
|
||||
// event content looks like:
|
||||
// content: {
|
||||
// $event_id: {
|
||||
// $receipt_type: {
|
||||
// $user_id: {
|
||||
// ts: $timestamp
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
var self = this;
|
||||
utils.keys(event.getContent()).forEach(function(eventId) {
|
||||
utils.keys(event.getContent()[eventId]).forEach(function(receiptType) {
|
||||
utils.keys(event.getContent()[eventId][receiptType]).forEach(
|
||||
function(userId) {
|
||||
var receipt = event.getContent()[eventId][receiptType][userId];
|
||||
if (!self._receipts[receiptType]) {
|
||||
self._receipts[receiptType] = {};
|
||||
}
|
||||
if (!self._receipts[receiptType][userId]) {
|
||||
self._receipts[receiptType][userId] = {};
|
||||
}
|
||||
self._receipts[receiptType][userId] = {
|
||||
eventId: eventId,
|
||||
data: receipt
|
||||
};
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// pre-cache receipts by event
|
||||
self._receiptCacheByEventId = {};
|
||||
utils.keys(self._receipts).forEach(function(receiptType) {
|
||||
utils.keys(self._receipts[receiptType]).forEach(function(userId) {
|
||||
var receipt = self._receipts[receiptType][userId];
|
||||
if (!self._receiptCacheByEventId[receipt.eventId]) {
|
||||
self._receiptCacheByEventId[receipt.eventId] = [];
|
||||
}
|
||||
self._receiptCacheByEventId[receipt.eventId].push({
|
||||
userId: userId,
|
||||
type: receiptType,
|
||||
data: receipt.data
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
function setEventMetadata(event, stateContext, toStartOfTimeline) {
|
||||
// set sender and target properties
|
||||
event.sender = stateContext.getSentinelMember(
|
||||
|
Reference in New Issue
Block a user