You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

139 lines
4.1 KiB
JavaScript

"use strict";
const defaultValue = require("default-value");
const numberDerivedEvents = require("../number-derived-events");
function mapLevels(eventContent) {
if (eventContent != null) {
return {
defaultRequiredPowerLevels: {
stateChange: defaultValue(eventContent.state_default, 50),
message: defaultValue(eventContent.events_default, 0),
},
requiredPowerLevels: {
kick: defaultValue(eventContent.kick, 50),
ban: defaultValue(eventContent.ban, 50),
invite: defaultValue(eventContent.invite, 50),
redact: defaultValue(eventContent.redact, 50)
},
requiredEventPowerLevels: eventContent.events,
requiredNotificationPowerLevels: { room: 50, ... eventContent.notifications },
defaultUserPowerLevel: defaultValue(eventContent.users_default, 0),
currentPowerLevels: eventContent.users
};
} else {
return {
defaultRequiredPowerLevels: {
stateChange: 0,
message: 0,
},
requiredPowerLevels: {
kick: 50,
ban: 50,
invite: 50,
redact: 50
},
requiredEventPowerLevels: {},
requiredNotificationPowerLevels: {
room: 50
},
defaultUserPowerLevel: 0,
currentPowerLevels: {}
};
}
}
// FIXME: Option for parsing as a whole, rather than as a diff? Maybe package `mapLevels` as a separate `map-power-levels-event-full` package or so?
// FIXME: Do above + emit as a whole event, for later use in powerlevel-modifying event creation; same for ACLs (maybe build an abstraction for automatically tracking this stuff internally?) -- and make sure to document that the user should use either the full event OR the derived event, not both, for the same purpose!
module.exports = function mapPowerLevelsEvent(event, _context) {
let oldState = mapLevels(event.unsigned.prev_content);
let newState = mapLevels(event.content);
let deltaEvents = [];
if (oldState.defaultUserPowerLevel !== newState.defaultUserPowerLevel) {
deltaEvents.push({
type: "defaultUserPowerLevelChanged",
sender: event.sender,
oldLevel: oldState.defaultUserPowerLevel,
newLevel: newState.defaultUserPowerLevel
});
}
for (let [ eventCategory, newLevel ] of Object.entries(newState.defaultRequiredPowerLevels)) {
let oldLevel = oldState.defaultRequiredPowerLevels[eventCategory];
if (newLevel !== oldLevel) {
deltaEvents.push({
type: "defaultRequiredPowerLevelChanged",
sender: event.sender,
eventCategory: eventCategory,
newLevel: newLevel,
oldLevel: oldLevel
});
}
}
for (let [ action, newLevel ] of Object.entries(newState.requiredPowerLevels)) {
let oldLevel = oldState.requiredPowerLevels[action];
if (newLevel !== oldLevel) {
deltaEvents.push({
type: "requiredPowerLevelChanged",
sender: event.sender,
action: action,
newLevel: newLevel,
oldLevel: oldLevel
});
}
}
for (let [ eventType, newLevel ] of Object.entries(newState.requiredEventPowerLevels)) {
let oldLevel = oldState.requiredEventPowerLevels[eventType]; // FIXME: Default power level?
if (newLevel !== oldLevel) {
deltaEvents.push({
type: "requiredEventPowerLevelChanged",
sender: event.sender,
eventType: eventType,
newLevel: newLevel,
oldLevel: oldLevel
});
}
}
for (let [ notificationType, newLevel ] of Object.entries(newState.requiredNotificationPowerLevels)) {
let oldLevel = oldState.requiredNotificationPowerLevels[notificationType];
if (newLevel !== oldLevel) {
deltaEvents.push({
type: "requiredNotificationPowerLevelChanged",
sender: event.sender,
notificationType: notificationType,
newLevel: newLevel,
oldLevel: oldLevel
});
}
}
for (let [ matrixID, newLevel ] of Object.entries(newState.currentPowerLevels)) {
let oldLevel = oldState.currentPowerLevels[matrixID];
if (newLevel !== oldLevel) {
deltaEvents.push({
type: "userPowerLevelChanged",
sender: event.sender,
user: matrixID,
newLevel: defaultValue(newLevel, newState.defaultUserPowerLevel),
oldLevel: defaultValue(oldLevel, oldState.defaultUserPowerLevel),
newLevelIsExplicit: (newLevel != null),
oldLevelIsExplicit: (oldLevel != null)
});
}
}
numberDerivedEvents(event.event_id, deltaEvents);
return deltaEvents;
};