Better text spoilers
Remove spoiler content from plaintext body Don't bridge embeds if their link is spoilered (deliberately imprecise)
This commit is contained in:
@@ -312,6 +312,21 @@ test("message2event embeds: youtube video", async t => {
|
||||
}])
|
||||
})
|
||||
|
||||
test("message2event embeds: embed not bridged if its link was spoilered", async t => {
|
||||
const events = await messageToEvent({
|
||||
...data.message_with_embeds.youtube_video,
|
||||
content: "||https://youtu.be/kDMHHw8JqLE?si=NaqNjVTtXugHeG_E\n\n\nJutomi I'm gonna make these sounds in your walls tonight||"
|
||||
}, data.guild.general)
|
||||
t.deepEqual(events, [{
|
||||
$type: "m.room.message",
|
||||
msgtype: "m.text",
|
||||
body: "[spoiler]",
|
||||
format: "org.matrix.custom.html",
|
||||
formatted_body: `<span data-mx-spoiler=""><a href="https://youtu.be/kDMHHw8JqLE?si=NaqNjVTtXugHeG_E">https://youtu.be/kDMHHw8JqLE?si=NaqNjVTtXugHeG_E</a><br><br><br>Jutomi I'm gonna make these sounds in your walls tonight</span>`,
|
||||
"m.mentions": {}
|
||||
}])
|
||||
})
|
||||
|
||||
test("message2event embeds: tenor gif should show a video link without a provider", async t => {
|
||||
const events = await messageToEvent(data.message_with_embeds.tenor_gif, data.guild.general, {}, {})
|
||||
t.deepEqual(events, [{
|
||||
|
||||
@@ -26,8 +26,9 @@ const userRegex = reg.namespaces.users.map(u => new RegExp(u.regex))
|
||||
* @param {DiscordTypes.APIMessage} message
|
||||
* @param {DiscordTypes.APIGuild} guild
|
||||
* @param {boolean} useHTML
|
||||
* @param {string[]} spoilers
|
||||
*/
|
||||
function getDiscordParseCallbacks(message, guild, useHTML) {
|
||||
function getDiscordParseCallbacks(message, guild, useHTML, spoilers = []) {
|
||||
return {
|
||||
/** @param {{id: string, type: "discordUser"}} node */
|
||||
user: node => {
|
||||
@@ -90,6 +91,10 @@ function getDiscordParseCallbacks(message, guild, useHTML) {
|
||||
here: () => {
|
||||
if (message.mention_everyone) return "@room"
|
||||
return "@here"
|
||||
},
|
||||
spoiler: node => {
|
||||
spoilers.push(node.raw)
|
||||
return useHTML
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -392,6 +397,7 @@ async function messageToEvent(message, guild, options = {}, di) {
|
||||
return content.replace(/https:\/\/(cdn|media)\.discordapp\.(?:com|net)\/attachments\/([0-9]+)\/([0-9]+)\/([-A-Za-z0-9_.,]+)/g, url => dUtils.getPublicUrlForCdn(url))
|
||||
}
|
||||
|
||||
const spoilers = []
|
||||
/**
|
||||
* Translate links and emojis and mentions and stuff. Give back the text and HTML so they can be combined into bigger events.
|
||||
* @param {string} content Partial or complete Discord message content
|
||||
@@ -431,7 +437,7 @@ async function messageToEvent(message, guild, options = {}, di) {
|
||||
}
|
||||
|
||||
let html = await markdown.toHtmlWithPostParser(content, transformParsedVia, {
|
||||
discordCallback: getDiscordParseCallbacks(message, guild, true),
|
||||
discordCallback: getDiscordParseCallbacks(message, guild, true, spoilers),
|
||||
...customOptions
|
||||
}, customParser, customHtmlOutput)
|
||||
|
||||
@@ -692,6 +698,13 @@ async function messageToEvent(message, guild, options = {}, di) {
|
||||
continue // If discord creates an embed preview for a discord channel link, don't copy that embed
|
||||
}
|
||||
|
||||
if (embed.url && spoilers.some(sp => sp.match(/\bhttps?:\/\/[a-z]/))) {
|
||||
// If the original message had spoilered URLs, don't generate any embeds for links.
|
||||
// This logic is the same as the Discord desktop client. It doesn't match specific embeds to specific spoilered text, it's all or nothing.
|
||||
// It's not easy to do much better because posting a link like youtu.be generates an embed.url with youtube.com/watch, so you can't match up the text without making at least that a special case.
|
||||
continue
|
||||
}
|
||||
|
||||
// Start building up a replica ("rep") of the embed in Discord-markdown format, which we will convert into both plaintext and formatted body at once
|
||||
const rep = new mxUtils.MatrixStringBuilder()
|
||||
|
||||
|
||||
@@ -862,6 +862,20 @@ test("message2event: advanced written @mentions for matrix users", async t => {
|
||||
t.equal(called, 1, "should only look up the member list once")
|
||||
})
|
||||
|
||||
test("message2event: spoilers are removed from plaintext body", async t => {
|
||||
const events = await messageToEvent({
|
||||
content: "||**beatrice**||"
|
||||
})
|
||||
t.deepEqual(events, [{
|
||||
$type: "m.room.message",
|
||||
"m.mentions": {},
|
||||
msgtype: "m.text",
|
||||
body: "[spoiler]",
|
||||
format: "org.matrix.custom.html",
|
||||
formatted_body: `<span data-mx-spoiler=""><strong>beatrice</strong></span>`
|
||||
}])
|
||||
})
|
||||
|
||||
test("message2event: very large attachment is linked instead of being uploaded", async t => {
|
||||
const events = await messageToEvent({
|
||||
content: "hey",
|
||||
|
||||
Reference in New Issue
Block a user