From baf024af84513abaee4e04b49ed6b3d9c150740d Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Mon, 23 Jun 2025 10:09:34 +1200 Subject: [PATCH] Fix invalid power level state changes --- src/d2m/actions/register-user.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/d2m/actions/register-user.js b/src/d2m/actions/register-user.js index 90528ac..a545b6d 100644 --- a/src/d2m/actions/register-user.js +++ b/src/d2m/actions/register-user.js @@ -3,6 +3,7 @@ const assert = require("assert").strict const {reg} = require("../../matrix/read-registration") const DiscordTypes = require("discord-api-types/v10") +const Ty = require("../../types") const mixin = require("@cloudrac3r/mixin-deep") const passthrough = require("../../passthrough") @@ -210,11 +211,13 @@ async function syncUser(user, member, channel, guild, roomID) { // Update room member state await api.sendState(roomID, "m.room.member", mxid, content, mxid) // Update power levels (only if we can actually access the member roles) + /** @type {Ty.Event.M_Power_Levels} */ const powerLevelsStateContent = await api.getStateEvent(roomID, "m.room.power_levels", "") - const oldPowerLevel = powerLevelsStateContent.users?.[mxid] || 0 + const oldPowerLevel = powerLevelsStateContent.users?.[mxid] || powerLevelsStateContent.events_default || 0 mixin(powerLevelsStateContent, {users: {[mxid]: powerLevel}}) - if (powerLevel === 0) delete powerLevelsStateContent.users[mxid] // keep the event compact - const sendPowerLevelAs = powerLevel < oldPowerLevel ? mxid : undefined // bridge bot won't not have permission to demote equal power users, so do this action as themselves + if (powerLevel === powerLevelsStateContent.events_default || 0) delete powerLevelsStateContent.users?.[mxid] // keep the event compact + const botPowerLevel = powerLevelsStateContent.users?.[`@${reg.sender_localpart}:${reg.ooye.server_name}`] || 100 + const sendPowerLevelAs = oldPowerLevel === botPowerLevel ? mxid : undefined // bridge bot can't demote equal power users, so do this action as themselves await api.sendState(roomID, "m.room.power_levels", "", powerLevelsStateContent, sendPowerLevelAs) // Update cached hash db.prepare("UPDATE sim_member SET hashed_profile_content = ? WHERE room_id = ? AND mxid = ?").run(currentHash, roomID, mxid)