diff --git a/addbot.js b/addbot.js index e13c829..ef1cc63 100755 --- a/addbot.js +++ b/addbot.js @@ -9,6 +9,7 @@ function addbot() { return `Open this link to add the bot to a Discord server:\nhttps://discord.com/oauth2/authorize?client_id=${id}&scope=bot&permissions=1610883072 ` } +/* c8 ignore next 3 */ if (process.argv.find(a => a.endsWith("addbot") || a.endsWith("addbot.js"))) { console.log(addbot()) } diff --git a/src/discord/interactions/matrix-info.test.js b/src/discord/interactions/matrix-info.test.js index f4d0f52..5d0206e 100644 --- a/src/discord/interactions/matrix-info.test.js +++ b/src/discord/interactions/matrix-info.test.js @@ -1,11 +1,8 @@ const {test} = require("supertape") const data = require("../../../test/data") -const DiscordTypes = require("discord-api-types/v10") -const {db, discord} = require("../../passthrough") -const {MatrixServerError} = require("../../matrix/mreq") -const {_interact, _interactButton} = require("./matrix-info") +const {_interact} = require("./matrix-info") -test("matrix info: checks if message has bridged", async t => { +test("matrix info: checks if message is bridged", async t => { const msg = await _interact({ data: { target_id: "0" diff --git a/src/discord/interactions/reactions.js b/src/discord/interactions/reactions.js index 67f3a68..0a6d5a6 100644 --- a/src/discord/interactions/reactions.js +++ b/src/discord/interactions/reactions.js @@ -8,19 +8,22 @@ const api = sync.require("../../matrix/api") /** @type {import("../../m2d/converters/utils")} */ const utils = sync.require("../../m2d/converters/utils") -/** @param {DiscordTypes.APIContextMenuGuildInteraction} interaction */ -/** @param {DiscordTypes.APIMessageApplicationCommandGuildInteraction} interaction */ -async function interact({id, token, data}) { +/** + * @param {DiscordTypes.APIMessageApplicationCommandGuildInteraction} interaction + * @param {{api: typeof api}} di + * @returns {Promise} + */ +async function _interact({data}, {api}) { const row = from("event_message").join("message_channel", "message_id").join("channel_room", "channel_id") .select("event_id", "room_id").where({message_id: data.target_id}).get() if (!row) { - return discord.snow.interaction.createInteractionResponse(id, token, { + return { type: DiscordTypes.InteractionResponseType.ChannelMessageWithSource, data: { content: "This message hasn't been bridged to Matrix.", flags: DiscordTypes.MessageFlags.Ephemeral } - }) + } } const reactions = await api.getFullRelations(row.room_id, row.event_id, "m.annotation") @@ -37,22 +40,30 @@ async function interact({id, token, data}) { } if (inverted.size === 0) { - return discord.snow.interaction.createInteractionResponse(id, token, { + return { type: DiscordTypes.InteractionResponseType.ChannelMessageWithSource, data: { content: "Nobody from Matrix reacted to this message.", flags: DiscordTypes.MessageFlags.Ephemeral } - }) + } } - return discord.snow.interaction.createInteractionResponse(id, token, { + return { type: DiscordTypes.InteractionResponseType.ChannelMessageWithSource, data: { content: [...inverted.entries()].map(([key, value]) => `${key} ā®ž ${value.join(" ā¬© ")}`).join("\n"), flags: DiscordTypes.MessageFlags.Ephemeral } - }) + } +} + +/* c8 ignore start */ + +/** @param {DiscordTypes.APIMessageApplicationCommandGuildInteraction} interaction */ +async function interact(interaction) { + await discord.snow.interaction.createInteractionResponse(interaction.id, interaction.token, await _interact(interaction, {api})) } module.exports.interact = interact +module.exports._interact = _interact diff --git a/src/discord/interactions/reactions.test.js b/src/discord/interactions/reactions.test.js new file mode 100644 index 0000000..c6de054 --- /dev/null +++ b/src/discord/interactions/reactions.test.js @@ -0,0 +1,87 @@ +const {test} = require("supertape") +const data = require("../../../test/data") +const DiscordTypes = require("discord-api-types/v10") +const {db, discord} = require("../../passthrough") +const {MatrixServerError} = require("../../matrix/mreq") +const {_interact} = require("./reactions") + +test("reactions: checks if message is bridged", async t => { + const msg = await _interact({ + data: { + target_id: "0" + } + }, {}) + t.equal(msg.data.content, "This message hasn't been bridged to Matrix.") +}) + +test("reactions: different response if nobody reacted", async t => { + const msg = await _interact({ + data: { + target_id: "1126786462646550579" + } + }, { + api: { + async getFullRelations(roomID, eventID) { + t.equal(roomID, "!kLRqKKUQXcibIMtOpl:cadence.moe") + t.equal(eventID, "$X16nfVks1wsrhq4E9SSLiqrf2N8KD0erD0scZG7U5xg") + return [] + } + } + }) + t.equal(msg.data.content, "Nobody from Matrix reacted to this message.") +}) + +test("reactions: shows reactions if there are some, ignoring discord users", async t => { + let called = 1 + const msg = await _interact({ + data: { + target_id: "1126786462646550579" + } + }, { + api: { + async getFullRelations(roomID, eventID) { + t.equal(roomID, "!kLRqKKUQXcibIMtOpl:cadence.moe") + t.equal(eventID, "$X16nfVks1wsrhq4E9SSLiqrf2N8KD0erD0scZG7U5xg") + return [{ + sender: "@cadence:cadence.moe", + content: { + "m.relates_to": { + key: "šŸˆ", + rel_type: "m.annotation" + } + } + }, { + sender: "@rnl:cadence.moe", + content: { + "m.relates_to": { + key: "šŸˆ", + rel_type: "m.annotation" + } + } + }, { + sender: "@cadence:cadence.moe", + content: { + "m.relates_to": { + key: "šŸˆā€ā¬›", + rel_type: "m.annotation" + } + } + }, { + sender: "@_ooye_rnl:cadence.moe", + content: { + "m.relates_to": { + key: "šŸˆ", + rel_type: "m.annotation" + } + } + }] + } + } + }) + t.equal( + msg.data.content, + "šŸˆ ā®ž cadence [they] ā¬© @rnl:cadence.moe" + + "\nšŸˆā€ā¬› ā®ž cadence [they]" + ) + t.equal(called, 1) +}) diff --git a/test/addbot.test.js b/test/addbot.test.js new file mode 100644 index 0000000..17c6dda --- /dev/null +++ b/test/addbot.test.js @@ -0,0 +1,8 @@ +// @ts-check + +const {addbot} = require("../addbot") +const {test} = require("supertape") + +test("addbot: returns message and invite link", t => { + t.equal(addbot(), `Open this link to add the bot to a Discord server:\nhttps://discord.com/oauth2/authorize?client_id=684280192553844747&scope=bot&permissions=1610883072 `) +}) diff --git a/test/test.js b/test/test.js index e0736c8..6695494 100644 --- a/test/test.js +++ b/test/test.js @@ -17,6 +17,7 @@ const passthrough = require("../src/passthrough") const db = new sqlite(":memory:") const {reg} = require("../src/matrix/read-registration") +reg.ooye.discord_token = "Njg0MjgwMTkyNTUzODQ0NzQ3.Xl3zlw.baby" reg.ooye.server_origin = "https://matrix.cadence.moe" // so that tests will pass even when hard-coded reg.ooye.server_name = "cadence.moe" reg.id = "baby" // don't actually take authenticated actions on the server @@ -113,6 +114,7 @@ file._actuallyUploadDiscordFileToMxc = function(url, res) { throw new Error(`Not db.exec(fs.readFileSync(join(__dirname, "ooye-test-data.sql"), "utf8")) + require("./addbot.test") require("../src/db/orm.test") require("../src/discord/utils.test") require("../src/matrix/kstate.test") @@ -138,4 +140,5 @@ file._actuallyUploadDiscordFileToMxc = function(url, res) { throw new Error(`Not require("../src/m2d/converters/emoji-sheet.test") require("../src/discord/interactions/invite.test") require("../src/discord/interactions/matrix-info.test") + require("../src/discord/interactions/reactions.test") })()