diff --git a/src/db/migrations/0041-room-mention-role.sql b/src/db/migrations/0041-room-mention-role.sql new file mode 100644 index 0000000..d8a6280 --- /dev/null +++ b/src/db/migrations/0041-room-mention-role.sql @@ -0,0 +1,5 @@ +BEGIN TRANSACTION; + +ALTER TABLE channel_room ADD COLUMN room_mention_role TEXT; + +COMMIT; diff --git a/src/db/migrations/0041-room-ping-role.sql b/src/db/migrations/0041-room-ping-role.sql deleted file mode 100644 index 972552a..0000000 --- a/src/db/migrations/0041-room-ping-role.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN TRANSACTION; - -ALTER TABLE channel_room ADD COLUMN ping_role_id TEXT; - -COMMIT; diff --git a/src/db/orm-defs.d.ts b/src/db/orm-defs.d.ts index 3438d58..2376627 100644 --- a/src/db/orm-defs.d.ts +++ b/src/db/orm-defs.d.ts @@ -21,7 +21,7 @@ export type Models = { speedbump_checked: number | null guild_id: string | null custom_topic: number - ping_role_id: string | null + room_mention_role: string | null } channel_speedbump: { diff --git a/src/m2d/converters/event-to-message.js b/src/m2d/converters/event-to-message.js index a1b7524..77e984c 100644 --- a/src/m2d/converters/event-to-message.js +++ b/src/m2d/converters/event-to-message.js @@ -463,7 +463,7 @@ async function checkWrittenMentions(content, senderMxid, roomID, guild, di) { if (writtenMentionMatch[1] === "room") { // convert @room to discord const {powers: {[senderMxid]: userPower}, powerLevels} = await mxUtils.getEffectivePower(roomID, [senderMxid], di.api) if (userPower >= (powerLevels.notifications?.room ?? 50)) { - const roleID = select("channel_room", "ping_role_id", {room_id: roomID}).pluck().get() + const roleID = select("channel_room", "room_mention_role", {room_id: roomID}).pluck().get() return { // @ts-ignore - typescript doesn't know about indices yet content: content.slice(0, writtenMentionMatch.indices[1][0]-1) + (roleID ? `<@&${roleID}>` : "@everyone") + content.slice(writtenMentionMatch.indices[1][1]), diff --git a/src/web/pug/guild.pug b/src/web/pug/guild.pug index 9cad912..7950532 100644 --- a/src/web/pug/guild.pug +++ b/src/web/pug/guild.pug @@ -189,8 +189,8 @@ block body .s-empty-state No channels linked between Discord and Matrix yet... if space_id && linkedChannelsWithDetails.length - - const customPingRooms = linkedChannelsWithDetails.filter(row => row.ping_role_id) - - const defaultPingRooms = linkedChannelsWithDetails.filter(row => !row.ping_role_id) + - const customPingRooms = linkedChannelsWithDetails.filter(row => row.room_mention_role) + - const defaultPingRooms = linkedChannelsWithDetails.filter(row => !row.room_mention_role) - const pingRoles = [...guild.roles].filter(role => role.id !== guild_id).sort((a, b) => b.position - a.position) h3.mt32.fs-category#room-notifications Room notifications .s-card.p0 @@ -209,20 +209,20 @@ block body +discord(row.channel) td.pr12 .d-flex.ai-start.g8 - form.fl-grow1.wmn0.d-flex.ai-stretch.g8(method="post" action=rel("/api/room-ping-role")) + form.fl-grow1.wmn0.d-flex.ai-stretch.g8(method="post" action=rel("/api/room-mention-role")) input(type="hidden" name="guild_id" value=guild_id) input(type="hidden" name="channel_id" value=row.channel.id) .s-select.fl-grow1.wmn0 - select.w100(name="ping_role_id" id="ping-role-" + row.channel.id aria-label="Notify role for #" + row.channel.name onchange="this.form.requestSubmit()" style="height: 32px") - if !pingRoles.some(role => role.id === row.ping_role_id) - option(value=row.ping_role_id selected disabled) Deleted role (choose a replacement) + select.w100(name="room_mention_role" id="ping-role-" + row.channel.id aria-label="Notify role for #" + row.channel.name onchange="this.form.requestSubmit()" style="height: 32px") + if !pingRoles.some(role => role.id === row.room_mention_role) + option(value=row.room_mention_role selected disabled) Deleted role (choose a replacement) each role in pingRoles - option(value=role.id selected=row.ping_role_id === role.id)= "@" + role.name + option(value=role.id selected=row.room_mention_role === role.id)= "@" + role.name button.s-btn.s-btn__outlined.py0.box-border(type="submit" data-room-ping-save style="height: 32px; min-height: 0") Save - form.d-flex.ai-stretch(method="post" action=rel("/api/room-ping-role")) + form.d-flex.ai-stretch(method="post" action=rel("/api/room-mention-role")) input(type="hidden" name="guild_id" value=guild_id) input(type="hidden" name="channel_id" value=row.channel.id) - input(type="hidden" name="ping_role_id" value="") + input(type="hidden" name="room_mention_role" value="") button.s-btn.s-btn__danger.s-btn__outlined.py0(type="submit" aria-label="Remove custom role for #" + row.channel.name style="height: 32px") Remove script. @@ -231,7 +231,7 @@ block body if defaultPingRooms.length && pingRoles.length details.mt16.mx12.mb12 summary.s-label.cursor-pointer Add custom role - form.mt16(method="post" action=rel("/api/room-ping-role")) + form.mt16(method="post" action=rel("/api/room-mention-role")) input(type="hidden" name="guild_id" value=guild_id) .d-flex.fw-wrap.ai-end.g16 .fl-grow1.wmn0(style="flex-basis: 0; min-width: 180px") @@ -245,7 +245,7 @@ block body .fl-grow1.wmn0(style="flex-basis: 0; min-width: 180px") label.s-label(for="ping-role-new") Notify role .s-select - select.w100.box-border#ping-role-new(name="ping_role_id" required style="height: 32px") + select.w100.box-border#ping-role-new(name="room_mention_role" required style="height: 32px") option(value="" selected disabled) Choose a role each role in pingRoles option(value=role.id)= "@" + role.name diff --git a/src/web/routes/guild-settings.js b/src/web/routes/guild-settings.js index 6560519..9f626d7 100644 --- a/src/web/routes/guild-settings.js +++ b/src/web/routes/guild-settings.js @@ -142,20 +142,20 @@ as.router.post("/api/default-roles", defineEventHandler(async event => { })) // An empty role restores @everyone -as.router.post("/api/room-ping-role", defineEventHandler(async event => { +as.router.post("/api/room-mention-role", defineEventHandler(async event => { const body = await readValidatedBody(event, z.object({ guild_id: z.string(), channel_id: z.string(), - ping_role_id: z.string().regex(/^(?:[0-9]+)?$/) + room_mention_role: z.string().regex(/^(?:[0-9]+)?$/) }).parse) const managed = await auth.getManagedGuilds(event) if (!managed.has(body.guild_id)) throw createError({status: 403, message: "Forbidden", data: "Can't change settings for a guild you don't have Manage Server permissions in"}) const room = select("channel_room", "room_id", {channel_id: body.channel_id, guild_id: body.guild_id}).get() if (!room) throw createError({status: 404, message: "Linked channel not found"}) const guild = discord.guilds.get(body.guild_id) - if (body.ping_role_id && (!guild?.roles.some(role => role.id === body.ping_role_id) || body.ping_role_id === body.guild_id)) { + if (body.room_mention_role && (!guild?.roles.some(role => role.id === body.room_mention_role) || body.room_mention_role === body.guild_id)) { throw createError({status: 400, message: "Choose a role from this server"}) } - db.prepare("UPDATE channel_room SET ping_role_id = ? WHERE channel_id = ? AND guild_id = ?").run(body.ping_role_id || null, body.channel_id, body.guild_id) + db.prepare("UPDATE channel_room SET room_mention_role = ? WHERE channel_id = ? AND guild_id = ?").run(body.room_mention_role || null, body.channel_id, body.guild_id) return sendRedirect(event, `/guild?guild_id=${body.guild_id}#room-notifications`, 302) })) diff --git a/src/web/routes/guild.js b/src/web/routes/guild.js index 4d50926..ef2065e 100644 --- a/src/web/routes/guild.js +++ b/src/web/routes/guild.js @@ -99,7 +99,7 @@ function getChannelRoomsLinks(guild, rooms, roles) { let channelIDs = discord.guildChannelMap.get(guild.id) assert(channelIDs) - let linkedChannels = select("channel_room", ["channel_id", "room_id", "name", "nick", "ping_role_id"], {channel_id: channelIDs}).all() + let linkedChannels = select("channel_room", ["channel_id", "room_id", "name", "nick", "room_mention_role"], {channel_id: channelIDs}).all() let linkedChannelsWithDetails = linkedChannels.map(c => ({ // @ts-ignore /** @type {DiscordTypes.APIGuildChannel} */ channel: discord.channels.get(c.channel_id),