diff --git a/src/domain/session/rightpanel/members/comparator.js b/src/domain/session/rightpanel/members/comparator.js index 50ddb9ba..642f8512 100644 --- a/src/domain/session/rightpanel/members/comparator.js +++ b/src/domain/session/rightpanel/members/comparator.js @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {PowerLevels} from "../../../../matrix/room/timeline/PowerLevels.js"; +import {PowerLevels} from "../../../../matrix/room/PowerLevels.js"; export function createMemberComparator(powerLevels) { const collator = new Intl.Collator(); diff --git a/src/domain/session/room/timeline/ReactionsViewModel.js b/src/domain/session/room/timeline/ReactionsViewModel.js index 51226775..051e4de9 100644 --- a/src/domain/session/room/timeline/ReactionsViewModel.js +++ b/src/domain/session/room/timeline/ReactionsViewModel.js @@ -190,7 +190,7 @@ import {HomeServer as MockHomeServer} from "../../../../mocks/HomeServer.js"; import {BaseMessageTile} from "./tiles/BaseMessageTile.js"; import {MappedList} from "../../../../observable/list/MappedList.js"; import {ObservableValue} from "../../../../observable/ObservableValue.js"; -import {PowerLevels} from "../../../../matrix/room/timeline/PowerLevels.js"; +import {PowerLevels} from "../../../../matrix/room/PowerLevels.js"; export function tests() { const fragmentIdComparer = new FragmentIdComparer([]); diff --git a/src/matrix/room/BaseRoom.js b/src/matrix/room/BaseRoom.js index b24ef706..4a8f50b4 100644 --- a/src/matrix/room/BaseRoom.js +++ b/src/matrix/room/BaseRoom.js @@ -28,7 +28,7 @@ import {EventEntry} from "./timeline/entries/EventEntry.js"; import {ObservedEventMap} from "./ObservedEventMap.js"; import {DecryptionSource} from "../e2ee/common.js"; import {ensureLogItem} from "../../logging/utils.js"; -import {PowerLevels} from "./timeline/PowerLevels.js"; +import {PowerLevels} from "./PowerLevels.js"; import {RetainedObservableValue} from "../../observable/ObservableValue.js"; const EVENT_ENCRYPTED_TYPE = "m.room.encrypted"; diff --git a/src/matrix/room/timeline/PowerLevels.js b/src/matrix/room/PowerLevels.js similarity index 99% rename from src/matrix/room/timeline/PowerLevels.js rename to src/matrix/room/PowerLevels.js index c19f992d..bb723c34 100644 --- a/src/matrix/room/timeline/PowerLevels.js +++ b/src/matrix/room/PowerLevels.js @@ -14,6 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ +export const EVENT_TYPE = "m.room.power_levels"; + export class PowerLevels { constructor({powerLevelEvent, createEvent, ownUserId, membership}) { this._plEvent = powerLevelEvent; diff --git a/src/matrix/room/Room.js b/src/matrix/room/Room.js index c49d6a4e..f5c42097 100644 --- a/src/matrix/room/Room.js +++ b/src/matrix/room/Room.js @@ -23,6 +23,7 @@ import {WrappedError} from "../error.js" import {Heroes} from "./members/Heroes.js"; import {AttachmentUpload} from "./AttachmentUpload.js"; import {DecryptionSource} from "../e2ee/common.js"; +import {PowerLevels, EVENT_TYPE as POWERLEVELS_EVENT_TYPE } from "./PowerLevels.js"; const EVENT_ENCRYPTED_TYPE = "m.room.encrypted"; @@ -173,6 +174,7 @@ export class Room extends BaseRoom { if (Array.isArray(roomResponse.timeline?.events)) { removedPendingEvents = await this._sendQueue.removeRemoteEchos(roomResponse.timeline.events, txn, log); } + const powerLevelsEvent = this._getPowerLevelsEvent(roomResponse); return { summaryChanges, roomEncryption, @@ -182,6 +184,7 @@ export class Room extends BaseRoom { removedPendingEvents, memberChanges, heroChanges, + powerLevelsEvent, shouldFlushKeyShares, }; } @@ -194,7 +197,7 @@ export class Room extends BaseRoom { afterSync(changes, log) { const { summaryChanges, newEntries, updatedEntries, newLiveKey, - removedPendingEvents, memberChanges, + removedPendingEvents, memberChanges, powerLevelsEvent, heroChanges, roomEncryption } = changes; log.set("id", this.id); @@ -236,6 +239,9 @@ export class Room extends BaseRoom { emitChange = true; } } + if (powerLevelsEvent) { + this._updatePowerLevels(powerLevelsEvent); + } if (emitChange) { this._emitUpdate(); } @@ -262,6 +268,23 @@ export class Room extends BaseRoom { } } + _getPowerLevelsEvent(roomResponse) { + const isPowerlevelEvent = event => event.state_key === "" && event.type === POWERLEVELS_EVENT_TYPE; + const powerLevelEvent = roomResponse.timeline?.events.find(isPowerlevelEvent) ?? roomResponse.state?.events.find(isPowerlevelEvent); + return powerLevelEvent; + } + + _updatePowerLevels(powerLevelEvent) { + if (this._powerLevels) { + const newPowerLevels = new PowerLevels({ + powerLevelEvent, + ownUserId: this._user.id, + membership: this.membership, + }); + this._powerLevels.set(newPowerLevels); + } + } + needsAfterSyncCompleted({shouldFlushKeyShares}) { return shouldFlushKeyShares; }