diff --git a/src/Mjolnir.ts b/src/Mjolnir.ts index 8e11b19..daaff6f 100644 --- a/src/Mjolnir.ts +++ b/src/Mjolnir.ts @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { LogService, MatrixClient } from "matrix-bot-sdk"; +import { LogService, MatrixClient, Permalinks } from "matrix-bot-sdk"; import BanList, { ALL_RULE_TYPES } from "./models/BanList"; import { applyServerAcls } from "./actions/ApplyAcl"; import { RoomUpdateError } from "./models/RoomUpdateError"; @@ -37,7 +37,7 @@ export class Mjolnir { public readonly client: MatrixClient, public readonly managementRoomId: string, public readonly protectedRooms: { [roomId: string]: string }, - public readonly banLists: BanList[], + private banLists: BanList[], ) { client.on("room.event", this.handleEvent.bind(this)); @@ -69,6 +69,10 @@ export class Mjolnir { }) } + public get lists(): BanList[] { + return this.banLists; + } + public get state(): string { return this.currentState; } @@ -88,6 +92,7 @@ export class Mjolnir { if (config.verboseLogging) { await this.client.sendNotice(this.managementRoomId, "Syncing lists..."); } + await this.buildWatchedBanLists(); await this.syncLists(config.verboseLogging); } }).then(async () => { @@ -98,6 +103,52 @@ export class Mjolnir { }); } + public async watchList(roomRef: string) { + const joinedRooms = await this.client.getJoinedRooms(); + const permalink = Permalinks.parseUrl(roomRef); + if (!permalink.roomIdOrAlias) return; + + const roomId = await this.client.resolveRoom(permalink.roomIdOrAlias); + if (!joinedRooms.includes(roomId)) { + await this.client.joinRoom(permalink.roomIdOrAlias, permalink.viaServers); + } + + if (this.banLists.find(b => b.roomId === roomId)) return; + + const list = new BanList(roomId, roomRef, this.client); + await list.updateList(); + this.banLists.push(list); + } + + public async unwatchList(roomRef: string) { + const permalink = Permalinks.parseUrl(roomRef); + if (!permalink.roomIdOrAlias) return; + + const roomId = await this.client.resolveRoom(permalink.roomIdOrAlias); + const list = this.banLists.find(b => b.roomId === roomId); + if (list) this.banLists.splice(this.banLists.indexOf(list), 1); + } + + public async buildWatchedBanLists() { + const banLists: BanList[] = []; + const joinedRooms = await this.client.getJoinedRooms(); + for (const roomRef of config.banLists) { + const permalink = Permalinks.parseUrl(roomRef); + if (!permalink.roomIdOrAlias) continue; + + const roomId = await this.client.resolveRoom(permalink.roomIdOrAlias); + if (!joinedRooms.includes(roomId)) { + await this.client.joinRoom(permalink.roomIdOrAlias, permalink.viaServers); + } + + const list = new BanList(roomId, roomRef, this.client); + await list.updateList(); + banLists.push(list); + } + + this.banLists = banLists; + } + public async verifyPermissions(verbose: boolean = true) { const errors: RoomUpdateError[] = []; for (const roomId of Object.keys(this.protectedRooms)) { diff --git a/src/commands/CreateBanListCommand.ts b/src/commands/CreateBanListCommand.ts index cc969dc..e0672e1 100644 --- a/src/commands/CreateBanListCommand.ts +++ b/src/commands/CreateBanListCommand.ts @@ -54,9 +54,10 @@ export async function execCreateListCommand(roomId: string, event: any, mjolnir: }); const roomRef = Permalinks.forRoom(listRoomId); + await mjolnir.watchList(roomRef); - const html = `Created new list (${listRoomId}). It is not tracked - you will have to add this to the Mjolnir config to use it.`; - const text = `Created new list (${roomRef}). It is not tracked - you will have to add this to the Mjolnir config to use it.`; + const html = `Created new list (${listRoomId}). This list is now being watched.`; + const text = `Created new list (${roomRef}). This list is now being watched.`; const reply = RichReply.createFor(roomId, event, text, html); reply["msgtype"] = "m.notice"; await mjolnir.client.sendMessage(roomId, reply); diff --git a/src/index.ts b/src/index.ts index 36697bc..08bf6d3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -48,21 +48,7 @@ LogService.setLogger(new RichConsoleLogger()); const banLists: BanList[] = []; const protectedRooms: { [roomId: string]: string } = {}; - // Ensure we're in all the rooms we expect to be in const joinedRooms = await client.getJoinedRooms(); - for (const roomRef of config.banLists) { - const permalink = Permalinks.parseUrl(roomRef); - if (!permalink.roomIdOrAlias) continue; - - const roomId = await client.resolveRoom(permalink.roomIdOrAlias); - if (!joinedRooms.includes(roomId)) { - await client.joinRoom(permalink.roomIdOrAlias, permalink.viaServers); - } - - const list = new BanList(roomId, roomRef, client); - await list.updateList(); - banLists.push(list); - } // Ensure we're also joined to the rooms we're protecting for (const roomRef of config.protectedRooms) {