From 1defd83fdef31782be2a5e61a1d85e665df1c163 Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Thu, 12 Feb 2026 19:43:29 +1300 Subject: [PATCH] Sync create polls permission from Discord --- src/d2m/actions/create-room.js | 9 +++++++-- src/d2m/actions/register-user.js | 4 ++++ src/d2m/event-dispatcher.js | 15 +++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/d2m/actions/create-room.js b/src/d2m/actions/create-room.js index acd47d4..735b84c 100644 --- a/src/d2m/actions/create-room.js +++ b/src/d2m/actions/create-room.js @@ -124,7 +124,11 @@ async function channelToKState(channel, guild, di) { const everyonePermissions = dUtils.getPermissions(guild.id, [], guild.roles, undefined, channel.permission_overwrites) const everyoneCanSend = dUtils.hasPermission(everyonePermissions, DiscordTypes.PermissionFlagsBits.SendMessages) - const everyoneCanMentionEveryone = dUtils.hasAllPermissions(everyonePermissions, ["MentionEveryone"]) + const everyoneCanMentionEveryone = dUtils.hasPermission(everyonePermissions, DiscordTypes.PermissionFlagsBits.MentionEveryone) + + const pollStartPowerLevel = {} + const everyoneCanCreatePolls = dUtils.hasPermission(everyonePermissions, DiscordTypes.PermissionFlagsBits.SendPolls) + if (everyoneCanSend && !everyoneCanCreatePolls) pollStartPowerLevel["org.matrix.msc3381.poll.start"] = 10 const spacePowerDetails = await mUtils.getEffectivePower(guildSpaceID, [], di.api) spacePowerDetails.powerLevels.users ??= {} @@ -159,7 +163,8 @@ async function channelToKState(channel, guild, di) { events_default: everyoneCanSend ? 0 : READ_ONLY_ROOM_EVENTS_DEFAULT_POWER, events: { "m.reaction": 0, - "m.room.redaction": 0 // only affects redactions of own events, required to be able to un-react + "m.room.redaction": 0, // only affects redactions of own events, required to be able to un-react + ...pollStartPowerLevel }, notifications: { room: everyoneCanMentionEveryone ? 0 : 20 diff --git a/src/d2m/actions/register-user.js b/src/d2m/actions/register-user.js index d20bfb8..1bdd6e3 100644 --- a/src/d2m/actions/register-user.js +++ b/src/d2m/actions/register-user.js @@ -182,6 +182,10 @@ function memberToPowerLevel(user, member, guild, channel) { const everyoneCanMentionEveryone = dUtils.hasPermission(everyonePermissions, DiscordTypes.PermissionFlagsBits.MentionEveryone) const userCanMentionEveryone = dUtils.hasPermission(permissions, DiscordTypes.PermissionFlagsBits.MentionEveryone) if (!everyoneCanMentionEveryone && userCanMentionEveryone) return 20 + /* PL 10 = Create Polls for technical reasons. */ + const everyoneCanCreatePolls = dUtils.hasPermission(everyonePermissions, DiscordTypes.PermissionFlagsBits.SendPolls) + const userCanCreatePolls = dUtils.hasPermission(permissions, DiscordTypes.PermissionFlagsBits.SendPolls) + if (!everyoneCanCreatePolls && userCanCreatePolls) return 10 return 0 } diff --git a/src/d2m/event-dispatcher.js b/src/d2m/event-dispatcher.js index af18669..c3bba33 100644 --- a/src/d2m/event-dispatcher.js +++ b/src/d2m/event-dispatcher.js @@ -196,6 +196,21 @@ module.exports = { await createSpace.syncSpace(guild) }, + /** + * @param {import("./discord-client")} client + * @param {DiscordTypes.GatewayGuildRoleUpdateDispatchData} data + */ + async GUILD_ROLE_UPDATE(client, data) { + const guild = client.guilds.get(data.guild_id) + if (!guild) return + const spaceID = select("guild_space", "space_id", {guild_id: data.guild_id}).pluck().get() + if (!spaceID) return + + if (data.role.id === data.guild_id) { // @everyone role changed - find a way to do this more efficiently in the future to handle many role updates + await createSpace.syncSpaceFully(guild) + } + }, + /** * @param {import("./discord-client")} client * @param {DiscordTypes.GatewayChannelUpdateDispatchData} channelOrThread