Make permissions command apply recursively

This commit is contained in:
Cadence Ember 2024-08-28 00:17:34 +12:00
commit ddb211f8f3
5 changed files with 69 additions and 36 deletions

View file

@ -5,23 +5,27 @@ const Ty = require("../../types")
const {discord, sync, db, select, from} = require("../../passthrough")
const assert = require("assert/strict")
/** @type {import("../../matrix/api")} */
const api = sync.require("../../matrix/api")
/** @param {DiscordTypes.APIContextMenuGuildInteraction} interaction */
async function interact({data, channel, id, token, guild_id}) {
/**
* @param {DiscordTypes.APIContextMenuGuildInteraction} interaction
* @returns {Promise<DiscordTypes.APIInteractionResponse>}
*/
async function _interact({data, channel, guild_id}) {
const row = select("event_message", ["event_id", "source"], {message_id: data.target_id}).get()
assert(row)
// Can't operate on Discord users
if (row.source === 1) { // discord
return discord.snow.interaction.createInteractionResponse(id, token, {
return {
type: DiscordTypes.InteractionResponseType.ChannelMessageWithSource,
data: {
content: `This command is only meaningful for Matrix users.`,
flags: DiscordTypes.MessageFlags.Ephemeral
}
})
}
}
// Get the message sender, the person that will be inspected/edited
@ -42,16 +46,16 @@ async function interact({data, channel, id, token, guild_id}) {
// Administrators equal to the bot cannot be demoted
if (userPower >= 100) {
return discord.snow.interaction.createInteractionResponse(id, token, {
return {
type: DiscordTypes.InteractionResponseType.ChannelMessageWithSource,
data: {
content: `\`${sender}\` has administrator permissions. This cannot be edited.`,
flags: DiscordTypes.MessageFlags.Ephemeral
}
})
}
}
await discord.snow.interaction.createInteractionResponse(id, token, {
return {
type: DiscordTypes.InteractionResponseType.ChannelMessageWithSource,
data: {
content: `Showing permissions for \`${sender}\`. Click to edit.`,
@ -79,30 +83,47 @@ async function interact({data, channel, id, token, guild_id}) {
}
]
}
})
}
}
/** @param {DiscordTypes.APIMessageComponentSelectMenuInteraction} interaction */
async function interactEdit({data, channel, id, token, guild_id, message}) {
/**
* @param {DiscordTypes.APIMessageComponentSelectMenuInteraction} interaction
*/
async function interactEdit({data, id, token, guild_id, message}) {
// Get the person that will be inspected/edited
const mxid = message.content.match(/`(@(?:[^:]+):(?:[a-z0-9:-]+\.[a-z0-9.:-]+))`/)?.[1]
assert(mxid)
const permission = data.values[0]
const power = permission === "moderator" ? 50 : 0
await discord.snow.interaction.createInteractionResponse(id, token, {
type: DiscordTypes.InteractionResponseType.UpdateMessage,
data: {
content: `Updating \`${mxid}\` to **${permission}**, please wait...`,
components: []
}
})
// Get the space, where the power levels will be inspected/edited
const spaceID = select("guild_space", "space_id", {guild_id}).pluck().get()
assert(spaceID)
// Do it
const permission = data.values[0]
const power = permission === "moderator" ? 50 : 0
await api.setUserPower(spaceID, mxid, power)
// TODO: Cascade permissions through room hierarchy (make a helper for this already, geez...)
await api.setUserPowerCascade(spaceID, mxid, power)
// ACK
await discord.snow.interaction.createInteractionResponse(id, token, {
type: DiscordTypes.InteractionResponseType.DeferredMessageUpdate
await discord.snow.interaction.editOriginalInteractionResponse(discord.application.id, token, {
content: `Updated \`${mxid}\` to **${permission}**.`,
components: []
})
}
/** @param {DiscordTypes.APIContextMenuGuildInteraction} interaction */
async function interact(interaction) {
await discord.snow.interaction.createInteractionResponse(interaction.id, interaction.token, await _interact(interaction))
}
module.exports.interact = interact
module.exports.interactEdit = interactEdit
module.exports._interact = _interact