Skip to content

Commit

Permalink
also apply this behavior to members of moderation room
Browse files Browse the repository at this point in the history
  • Loading branch information
H-Shay committed Oct 23, 2024
1 parent af60730 commit 72b2025
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 7 deletions.
8 changes: 4 additions & 4 deletions src/commands/SetPowerLevelCommand.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,15 @@ export async function execSetPowerLevelCommand(roomId: string, event: any, mjoln

for (const targetRoomId of targetRooms) {
try {
if (target === mjolnirId) {
if (target === mjolnirId || mjolnir.moderators.checkMembership(target)) {
// don't let the bot demote itself
const currentLevels = await mjolnir.client.getRoomStateEvent(targetRoomId, "m.room.power_levels", "");
const botLevel = currentLevels["users"][mjolnirId];
if (level < botLevel) {
const targetLevel = currentLevels["users"][mjolnirId];
if (level < targetLevel) {
await mjolnir.managementRoomOutput.logMessage(
LogLevel.INFO,
"PowerLevelCommand",
`You are attempting to lower the bot's power level: current level ${botLevel}, requested level ${level}, aborting.`,
`You are attempting to lower the bot/a moderator's power level: current level ${targetLevel}, requested level ${level}, aborting.`,
);
return;
}
Expand Down
33 changes: 30 additions & 3 deletions test/integration/commands/powerLevelCommandTest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,20 @@ import { strict as assert } from "assert";
import { newTestUser } from "../clientHelper";

describe("Test: power levels", function () {
it("Does not allow the bot to demote itself in a protected room.", async function () {
it("Does not allow the bot to demote itself or members of management room in a protected room.", async function () {
this.timeout(60000);
const mod = await newTestUser(this.config.homeserverUrl, { name: { contains: "moderator" } });
const mod2 = await newTestUser(this.config.homeserverUrl, { name: { contains: "moderator2" } });
await mod.joinRoom(this.config.managementRoom);
await mod2.joinRoom(this.config.managementRoom);

const targetRoom = await mod.createRoom({ preset: "public_chat" });
await this.mjolnir.client.joinRoom(targetRoom);
await mod2.joinRoom(targetRoom);
const botId = await this.mjolnir.client.getUserId();
await mod.setUserPowerLevel(botId, targetRoom, 100);
const mod2Id = await mod2.getUserId();
await mod.setUserPowerLevel(mod2Id, targetRoom, 100);

await mod.sendMessage(this.mjolnir.managementRoomId, {
msgtype: "m.text.",
Expand All @@ -42,18 +48,39 @@ describe("Test: power levels", function () {
mod.on("room.message", (roomId: string, event: any) => {
if (
roomId === this.mjolnir.managementRoomId &&
event.content?.body.includes("You are attempting to lower the bot's power level")
event.content?.body.includes("You are attempting to lower the bot/a moderator's power level")
) {
resolve(event);
}
});
});
await reply;

const currentLevels = await mod.getRoomStateEvent(targetRoom, "m.room.power_levels", "");
let currentLevels = await mod.getRoomStateEvent(targetRoom, "m.room.power_levels", "");
const botLevel = currentLevels["users"][botId];
assert.equal(botLevel, 100);

await mod.sendMessage(this.mjolnir.managementRoomId, {
msgtype: "m.text",
body: `!mjolnir powerlevel ${mod2Id} 50 ${targetRoom}`,
});

let reply2 = new Promise((resolve, reject) => {
mod.on("room.message", (roomId: string, event: any) => {
if (
roomId === this.mjolnir.managementRoomId &&
event.content?.body.includes("You are attempting to lower the bot/a moderator's power level")
) {
resolve(event);
}
});
});
await reply2;

currentLevels = await mod.getRoomStateEvent(targetRoom, "m.room.power_levels", "");
const mod2Level = currentLevels["users"][mod2Id];
assert.equal(mod2Level, 100);

mod.stop();
});
});

0 comments on commit 72b2025

Please sign in to comment.