diff --git a/discord/interactions/invite.js b/discord/interactions/invite.js index 0590be8d..689ea1aa 100644 --- a/discord/interactions/invite.js +++ b/discord/interactions/invite.js @@ -7,31 +7,34 @@ const {discord, sync, db, select, from} = require("../../passthrough") /** @type {import("../../matrix/api")} */ const api = sync.require("../../matrix/api") -/** @param {DiscordTypes.APIChatInputApplicationCommandGuildInteraction} interaction */ -async function interact({id, token, data, channel, member, guild_id}) { +/** + * @param {DiscordTypes.APIChatInputApplicationCommandGuildInteraction} interaction + * @returns {Promise} + */ +async function _interact({data, channel, guild_id}) { // Check guild is bridged const spaceID = select("guild_space", "space_id", {guild_id}).pluck().get() const roomID = select("channel_room", "room_id", {channel_id: channel.id}).pluck().get() - if (!spaceID || !roomID) return discord.snow.interaction.createInteractionResponse(id, token, { + if (!spaceID || !roomID) return { type: DiscordTypes.InteractionResponseType.ChannelMessageWithSource, data: { content: "This server isn't bridged to Matrix, so you can't invite Matrix users.", flags: DiscordTypes.MessageFlags.Ephemeral } - }) + } // Get named MXID /** @type {DiscordTypes.APIApplicationCommandInteractionDataStringOption[] | undefined} */ // @ts-ignore const options = data.options const input = options?.[0].value || "" const mxid = input.match(/@([^:]+):([a-z0-9:-]+\.[a-z0-9.:-]+)/)?.[0] - if (!mxid) return discord.snow.interaction.createInteractionResponse(id, token, { + if (!mxid) return { type: DiscordTypes.InteractionResponseType.ChannelMessageWithSource, data: { content: "You have to say the Matrix ID of the person you want to invite. Matrix IDs look like this: `@username:example.org`", flags: DiscordTypes.MessageFlags.Ephemeral } - }) + } // Check for existing invite to the space let spaceMember @@ -39,24 +42,24 @@ async function interact({id, token, data, channel, member, guild_id}) { spaceMember = await api.getStateEvent(spaceID, "m.room.member", mxid) } catch (e) {} if (spaceMember && spaceMember.membership === "invite") { - return discord.snow.interaction.createInteractionResponse(id, token, { + return { type: DiscordTypes.InteractionResponseType.ChannelMessageWithSource, data: { content: `\`${mxid}\` already has an invite, which they haven't accepted yet.`, flags: DiscordTypes.MessageFlags.Ephemeral } - }) + } } // Invite Matrix user if not in space if (!spaceMember || spaceMember.membership !== "join") { await api.inviteToRoom(spaceID, mxid) - return discord.snow.interaction.createInteractionResponse(id, token, { + return { type: DiscordTypes.InteractionResponseType.ChannelMessageWithSource, data: { content: `You invited \`${mxid}\` to the server.` } - }) + } } // The Matrix user *is* in the space, maybe we want to invite them to this channel? @@ -65,7 +68,7 @@ async function interact({id, token, data, channel, member, guild_id}) { roomMember = await api.getStateEvent(roomID, "m.room.member", mxid) } catch (e) {} if (!roomMember || (roomMember.membership !== "join" && roomMember.membership !== "invite")) { - return discord.snow.interaction.createInteractionResponse(id, token, { + return { type: DiscordTypes.InteractionResponseType.ChannelMessageWithSource, data: { content: `\`${mxid}\` is already in this server. Would you like to additionally invite them to this specific channel?`, @@ -80,34 +83,49 @@ async function interact({id, token, data, channel, member, guild_id}) { }] }] } - }) + } } // The Matrix user *is* in the space and in the channel. - return discord.snow.interaction.createInteractionResponse(id, token, { + return { type: DiscordTypes.InteractionResponseType.ChannelMessageWithSource, data: { content: `\`${mxid}\` is already in this server and this channel.`, flags: DiscordTypes.MessageFlags.Ephemeral } - }) + } } -/** @param {DiscordTypes.APIMessageComponentGuildInteraction} interaction */ -async function interactButton({id, token, data, channel, member, guild_id, message}) { +/** + * @param {DiscordTypes.APIMessageComponentGuildInteraction} interaction + * @returns {Promise} + */ +async function _interactButton({channel, message}) { const mxid = message.content.match(/`(@(?:[^:]+):(?:[a-z0-9:-]+\.[a-z0-9.:-]+))`/)?.[1] assert(mxid) const roomID = select("channel_room", "room_id", {channel_id: channel.id}).pluck().get() await api.inviteToRoom(roomID, mxid) - return discord.snow.interaction.createInteractionResponse(id, token, { + return { type: DiscordTypes.InteractionResponseType.UpdateMessage, data: { content: `You invited \`${mxid}\` to the channel.`, flags: DiscordTypes.MessageFlags.Ephemeral, components: [] } - }) + } +} + +/** @param {DiscordTypes.APIChatInputApplicationCommandGuildInteraction} interaction */ +async function interact(interaction) { + await discord.snow.interaction.createInteractionResponse(interaction.id, interaction.token, await _interact(interaction)) +} + +/** @param {DiscordTypes.APIMessageComponentGuildInteraction} interaction */ +async function interactButton(interaction) { + await discord.snow.interaction.createInteractionResponse(interaction.id, interaction.token, await _interactButton(interaction)) } module.exports.interact = interact module.exports.interactButton = interactButton +module.exports._interact = _interact +module.exports._interactButton = _interactButton