You've already forked matrix-js-sdk
mirror of
https://github.com/matrix-org/matrix-js-sdk.git
synced 2025-11-25 05:23:13 +03:00
Revert "Count notifications in encrypted rooms client-side"
This commit is contained in:
@@ -842,8 +842,39 @@ export class MatrixClient extends EventEmitter {
|
|||||||
// actions for themselves, so we have to kinda help them out when they are encrypted.
|
// actions for themselves, so we have to kinda help them out when they are encrypted.
|
||||||
// We do this so that push rules are correctly executed on events in their decrypted
|
// We do this so that push rules are correctly executed on events in their decrypted
|
||||||
// state, such as highlights when the user's name is mentioned.
|
// state, such as highlights when the user's name is mentioned.
|
||||||
this.on("Event.decrypted", (event: MatrixEvent) => {
|
this.on("Event.decrypted", (event) => {
|
||||||
this.updateEncryptedRoomNotificationCount(event);
|
const oldActions = event.getPushActions();
|
||||||
|
const actions = this.pushProcessor.actionsForEvent(event);
|
||||||
|
event.setPushActions(actions); // Might as well while we're here
|
||||||
|
|
||||||
|
const room = this.getRoom(event.getRoomId());
|
||||||
|
if (!room) return;
|
||||||
|
|
||||||
|
const currentCount = room.getUnreadNotificationCount(NotificationCountType.Highlight);
|
||||||
|
|
||||||
|
// Ensure the unread counts are kept up to date if the event is encrypted
|
||||||
|
// We also want to make sure that the notification count goes up if we already
|
||||||
|
// have encrypted events to avoid other code from resetting 'highlight' to zero.
|
||||||
|
const oldHighlight = oldActions && oldActions.tweaks
|
||||||
|
? !!oldActions.tweaks.highlight : false;
|
||||||
|
const newHighlight = actions && actions.tweaks
|
||||||
|
? !!actions.tweaks.highlight : false;
|
||||||
|
if (oldHighlight !== newHighlight || currentCount > 0) {
|
||||||
|
// TODO: Handle mentions received while the client is offline
|
||||||
|
// See also https://github.com/vector-im/element-web/issues/9069
|
||||||
|
if (!room.hasUserReadEvent(this.getUserId(), event.getId())) {
|
||||||
|
let newCount = currentCount;
|
||||||
|
if (newHighlight && !oldHighlight) newCount++;
|
||||||
|
if (!newHighlight && oldHighlight) newCount--;
|
||||||
|
room.setUnreadNotificationCount(NotificationCountType.Highlight, newCount);
|
||||||
|
|
||||||
|
// Fix 'Mentions Only' rooms from not having the right badge count
|
||||||
|
const totalCount = room.getUnreadNotificationCount(NotificationCountType.Total);
|
||||||
|
if (totalCount < newCount) {
|
||||||
|
room.setUnreadNotificationCount(NotificationCountType.Total, newCount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Like above, we have to listen for read receipts from ourselves in order to
|
// Like above, we have to listen for read receipts from ourselves in order to
|
||||||
@@ -889,38 +920,6 @@ export class MatrixClient extends EventEmitter {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* In encrypted rooms we can't rely on the server giving as the right
|
|
||||||
* notification count as it can't see the event type and message content.
|
|
||||||
* Therefore we increment the counters manually client-side
|
|
||||||
*/
|
|
||||||
private updateEncryptedRoomNotificationCount(event: MatrixEvent): void {
|
|
||||||
// TODO: Handle mentions received while the client is offline
|
|
||||||
// See also https://github.com/vector-im/element-web/issues/9069
|
|
||||||
|
|
||||||
const room = this.getRoom(event.getRoomId());
|
|
||||||
const actions = this.pushProcessor.actionsForEvent(event);
|
|
||||||
event.setPushActions(actions); // Might as well while we're here
|
|
||||||
|
|
||||||
if (!room) return;
|
|
||||||
// If the user has already read the message don't increase counters
|
|
||||||
if (room.hasUserReadEvent(this.getUserId(), event.getId())) return;
|
|
||||||
|
|
||||||
const currentHighlightCount = room.getUnreadNotificationCount(NotificationCountType.Highlight);
|
|
||||||
const currentTotalCount = room.getUnreadNotificationCount(NotificationCountType.Total);
|
|
||||||
|
|
||||||
const newHighlight = Boolean(actions?.tweaks?.highlight);
|
|
||||||
const newNotify = Boolean(actions?.notify);
|
|
||||||
|
|
||||||
if (newHighlight) {
|
|
||||||
room.setUnreadNotificationCount(NotificationCountType.Highlight, currentHighlightCount + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (newNotify) {
|
|
||||||
room.setUnreadNotificationCount(NotificationCountType.Total, currentTotalCount + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* High level helper method to begin syncing and poll for new events. To listen for these
|
* High level helper method to begin syncing and poll for new events. To listen for these
|
||||||
* events, add a listener for {@link module:client~MatrixClient#event:"event"}
|
* events, add a listener for {@link module:client~MatrixClient#event:"event"}
|
||||||
|
|||||||
@@ -157,7 +157,6 @@ export interface IDecryptOptions {
|
|||||||
|
|
||||||
export class MatrixEvent extends EventEmitter {
|
export class MatrixEvent extends EventEmitter {
|
||||||
private pushActions: IActionsObject = null;
|
private pushActions: IActionsObject = null;
|
||||||
private wirePushActions: IActionsObject = null;
|
|
||||||
private _replacingEvent: MatrixEvent = null;
|
private _replacingEvent: MatrixEvent = null;
|
||||||
private _localRedactionEvent: MatrixEvent = null;
|
private _localRedactionEvent: MatrixEvent = null;
|
||||||
private _isCancelled = false;
|
private _isCancelled = false;
|
||||||
@@ -989,16 +988,7 @@ export class MatrixEvent extends EventEmitter {
|
|||||||
* @return {?Object} push actions
|
* @return {?Object} push actions
|
||||||
*/
|
*/
|
||||||
public getPushActions(): IActionsObject | null {
|
public getPushActions(): IActionsObject | null {
|
||||||
return this.pushActions || this.wirePushActions;
|
return this.pushActions;
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the push actions, if known, for this event
|
|
||||||
*
|
|
||||||
* @return {?Object} push actions
|
|
||||||
*/
|
|
||||||
public getWirePushActions(): IActionsObject | null {
|
|
||||||
return this.wirePushActions;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1007,11 +997,7 @@ export class MatrixEvent extends EventEmitter {
|
|||||||
* @param {Object} pushActions push actions
|
* @param {Object} pushActions push actions
|
||||||
*/
|
*/
|
||||||
public setPushActions(pushActions: IActionsObject): void {
|
public setPushActions(pushActions: IActionsObject): void {
|
||||||
if (this._decryptionPromise) {
|
this.pushActions = pushActions;
|
||||||
this.wirePushActions = pushActions;
|
|
||||||
} else {
|
|
||||||
this.pushActions = pushActions;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
22
src/sync.ts
22
src/sync.ts
@@ -1222,18 +1222,24 @@ export class SyncApi {
|
|||||||
const accountDataEvents = this.mapSyncEventsFormat(joinObj.account_data);
|
const accountDataEvents = this.mapSyncEventsFormat(joinObj.account_data);
|
||||||
|
|
||||||
const encrypted = client.isRoomEncrypted(room.roomId);
|
const encrypted = client.isRoomEncrypted(room.roomId);
|
||||||
// We do this first so it's correct when any of the events fire. We
|
// we do this first so it's correct when any of the events fire
|
||||||
// track unread notifications ourselves in encrypted rooms in
|
if (joinObj.unread_notifications) {
|
||||||
// MatrixClient::updateEncryptedRoomNotificationCount()
|
|
||||||
if (!encrypted && joinObj.unread_notifications) {
|
|
||||||
room.setUnreadNotificationCount(
|
room.setUnreadNotificationCount(
|
||||||
NotificationCountType.Total,
|
NotificationCountType.Total,
|
||||||
joinObj.unread_notifications.notification_count,
|
joinObj.unread_notifications.notification_count,
|
||||||
);
|
);
|
||||||
room.setUnreadNotificationCount(
|
|
||||||
NotificationCountType.Highlight,
|
// We track unread notifications ourselves in encrypted rooms, so don't
|
||||||
joinObj.unread_notifications.highlight_count,
|
// bother setting it here. We trust our calculations better than the
|
||||||
);
|
// server's for this case, and therefore will assume that our non-zero
|
||||||
|
// count is accurate.
|
||||||
|
if (!encrypted
|
||||||
|
|| (encrypted && room.getUnreadNotificationCount(NotificationCountType.Highlight) <= 0)) {
|
||||||
|
room.setUnreadNotificationCount(
|
||||||
|
NotificationCountType.Highlight,
|
||||||
|
joinObj.unread_notifications.highlight_count,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
joinObj.timeline = joinObj.timeline || {} as ITimeline;
|
joinObj.timeline = joinObj.timeline || {} as ITimeline;
|
||||||
|
|||||||
Reference in New Issue
Block a user