Skip to content

Commit

Permalink
add method to query default room power levels
Browse files Browse the repository at this point in the history
  • Loading branch information
bwindels committed Sep 3, 2018
1 parent d29524b commit d4ba869
Showing 1 changed file with 25 additions and 7 deletions.
32 changes: 25 additions & 7 deletions src/models/room-state.js
Original file line number Diff line number Diff line change
Expand Up @@ -596,6 +596,15 @@ RoomState.prototype.maySendMessage = function(userId) {
return this._maySendEventOfType('m.room.message', userId, false);
};

/**
* Check default power levels to see if it's allowed to send message events.
* @return {boolean} true if the default power levels permit to send
* message events into the given room.
*/
RoomState.prototype.maySendMessageByDefault = function() {
return this._maySendEventOfType('m.room.message', null, false);
};

/**
* Returns true if the given user ID has permission to send a normal
* event of type `eventType` into this room.
Expand Down Expand Up @@ -642,7 +651,8 @@ RoomState.prototype.maySendStateEvent = function(stateEventType, userId) {
* Returns true if the given user ID has permission to send a normal or state
* event of type `eventType` into this room.
* @param {string} eventType The type of event to test
* @param {string} userId The user ID of the user to test permission for
* @param {string} userId The user ID of the user to test permission for,
or falsy if testing for default power levels in the room.
* @param {boolean} state If true, tests if the user may send a state
event of this type. Otherwise tests whether
they may send a regular event.
Expand All @@ -651,10 +661,14 @@ RoomState.prototype.maySendStateEvent = function(stateEventType, userId) {
* according to the room's state.
*/
RoomState.prototype._maySendEventOfType = function(eventType, userId, state) {
const member = this.getMember(userId);
if (!member || member.membership == 'leave') {
return false;
let member = null;
if (userId) {
member = this.getMember(userId);
if (!member || member.membership == 'leave') {
return false;
}
}
let powerLevel = member ? member.powerLevel : 0;

const power_levels_event = this.getStateEvents('m.room.power_levels', '');

Expand All @@ -663,25 +677,29 @@ RoomState.prototype._maySendEventOfType = function(eventType, userId, state) {

let state_default = 0;
let events_default = 0;

if (power_levels_event) {
power_levels = power_levels_event.getContent();
events_levels = power_levels.events || {};

if (utils.isNumber(power_levels.state_default)) {
if (Number.isFinite(power_levels.state_default)) {
state_default = power_levels.state_default;
} else {
state_default = 50;
}
if (utils.isNumber(power_levels.events_default)) {
if (Number.isFinite(power_levels.events_default)) {
events_default = power_levels.events_default;
}
if (!member && Number.isFinite(power_levels.users_default)) {
powerLevel = power_levels.users_default;
}
}

let required_level = state ? state_default : events_default;
if (utils.isNumber(events_levels[eventType])) {
required_level = events_levels[eventType];
}
return member.powerLevel >= required_level;
return powerLevel >= required_level;
};

/**
Expand Down

0 comments on commit d4ba869

Please sign in to comment.