diff --git a/src/d2m/actions/poll-end.js b/src/d2m/actions/poll-end.js index 9ffcaf6..b0d29b9 100644 --- a/src/d2m/actions/poll-end.js +++ b/src/d2m/actions/poll-end.js @@ -113,7 +113,8 @@ async function endPoll(closeMessage) { return { username: "Total results including Matrix votes", avatar_url: `${reg.ooye.bridge_origin}/discord/poll-star-avatar.png`, - content: messageString + content: messageString, + flags: DiscordTypes.MessageFlags.SuppressEmbeds } } } diff --git a/src/d2m/converters/edit-to-changes.js b/src/d2m/converters/edit-to-changes.js index 82b9417..b73d6e0 100644 --- a/src/d2m/converters/edit-to-changes.js +++ b/src/d2m/converters/edit-to-changes.js @@ -16,8 +16,12 @@ function eventCanBeEdited(ev) { if (ev.old.event_type === "m.room.message" && ev.old.event_subtype !== "m.text" && ev.old.event_subtype !== "m.emote" && ev.old.event_subtype !== "m.notice") { return false } - // Discord does not allow stickers to be edited. Poll closures are sent as "edits", but not in a way we care about. - if (ev.old.event_type === "m.sticker" || ev.old.event_type === "org.matrix.msc3381.poll.start") { + // Discord does not allow stickers to be edited. + if (ev.old.event_type === "m.sticker") { + return false + } + // Discord does not allow the data of polls to be edited, they may only be responded to. + if (ev.old.event_type === "org.matrix.msc3381.poll.start" || ev.old.event_type === "org.matrix.msc3381.poll.end") { return false } // Anything else is fair game. diff --git a/src/d2m/converters/message-to-event.js b/src/d2m/converters/message-to-event.js index 9236c89..2f12958 100644 --- a/src/d2m/converters/message-to-event.js +++ b/src/d2m/converters/message-to-event.js @@ -20,6 +20,8 @@ const mxUtils = sync.require("../../matrix/utils") const dUtils = sync.require("../../discord/utils") /** @type {import("./find-mentions")} */ const findMentions = sync.require("./find-mentions") +/** @type {import("../../discord/interactions/poll-responses")} */ +const pollResponses = sync.require("../../discord/interactions/poll-responses") const {reg} = require("../../matrix/read-registration") /** @@ -269,7 +271,21 @@ async function messageToEvent(message, guild, options = {}, di) { } if (message.type === DiscordTypes.MessageType.PollResult) { - const event_id = select("event_message", "event_id", {message_id: message.message_reference?.message_id}).pluck().get() + const pollMessageID = message.message_reference?.message_id + if (!pollMessageID) return [] + const event_id = select("event_message", "event_id", {message_id: pollMessageID}).pluck().get() + const roomID = select("channel_room", "room_id", {channel_id: message.channel_id}).pluck().get() + const pollQuestionText = select("poll", "question_text", {message_id: pollMessageID}).pluck().get() + if (!event_id || !roomID || !pollQuestionText) return [] // drop it if the corresponding poll start was not bridged + + const rep = new mxUtils.MatrixStringBuilder() + rep.addLine(`The poll ${pollQuestionText} has closed.`, tag`The poll ${pollQuestionText} has closed.`) + + const {messageString} = pollResponses.getCombinedResults(pollMessageID, true) // poll results have already been double-checked before this point, so these totals will be accurate + rep.addLine(markdown.toHTML(messageString, {discordOnly: true, escapeHTML: false}), markdown.toHTML(messageString, {})) + + const {body, formatted_body} = rep.get() + return [{ $type: "org.matrix.msc3381.poll.end", "m.relates_to": { @@ -277,7 +293,11 @@ async function messageToEvent(message, guild, options = {}, di) { event_id }, "org.matrix.msc3381.poll.end": {}, - body: "This poll has ended.", + "org.matrix.msc1767.text": body, + "org.matrix.msc1767.html": formatted_body, + body: body, + format: "org.matrix.custom.html", + formatted_body: formatted_body, msgtype: "m.text" }] }