Match old and new formats of reply rep

This commit is contained in:
Cadence Ember 2024-08-16 12:04:09 +12:00
parent 0cf1d26764
commit 2c93ff1e6d
4 changed files with 265 additions and 6 deletions

View file

@ -58,7 +58,7 @@ function getDiscordParseCallbacks(message, guild, useHTML) {
emoji: node => { emoji: node => {
if (useHTML) { if (useHTML) {
const mxc = select("emoji", "mxc_url", {emoji_id: node.id}).pluck().get() const mxc = select("emoji", "mxc_url", {emoji_id: node.id}).pluck().get()
assert(mxc) // All emojis should have been added ahead of time in the messageToEvent function. assert(mxc, `Emoji consistency assertion failed for ${node.name}:${node.id}`) // All emojis should have been added ahead of time in the messageToEvent function.
return `<img data-mx-emoticon height="32" src="${mxc}" title=":${node.name}:" alt=":${node.name}:">` return `<img data-mx-emoticon height="32" src="${mxc}" title=":${node.name}:" alt=":${node.name}:">`
} else { } else {
return `:${node.name}:` return `:${node.name}:`
@ -430,10 +430,12 @@ async function messageToEvent(message, guild, options = {}, di) {
repliedToUserHtml = repliedToDisplayName repliedToUserHtml = repliedToDisplayName
} }
let repliedToContent = message.referenced_message?.content let repliedToContent = message.referenced_message?.content
if (repliedToContent?.startsWith("> <:L1:")) { if (repliedToContent?.match(/^(-# )?> (-# )?<:L1:/)) {
// If the Discord user is replying to a Matrix user's reply, the fallback is going to contain the emojis and stuff from the bridged rep of the Matrix user's reply quote. // If the Discord user is replying to a Matrix user's reply, the fallback is going to contain the emojis and stuff from the bridged rep of the Matrix user's reply quote.
// Need to remove that previous reply rep from this fallback body. The fallbody body should only contain the Matrix user's actual message. // Need to remove that previous reply rep from this fallback body. The fallbody body should only contain the Matrix user's actual message.
repliedToContent = repliedToContent.split("\n").slice(2).join("\n") // ┌──────A─────┐ A reply rep starting with >quote or -#smalltext >quote. Match until the end of the line.
// ┆ ┆┌─B─┐ There may be up to 2 reply rep lines in a row if it was created in the old format. Match all lines.
repliedToContent = repliedToContent.replace(/^((-# )?> .*\n){1,2}/, "")
} }
if (repliedToContent == "") repliedToContent = "[Media]" if (repliedToContent == "") repliedToContent = "[Media]"
else if (!repliedToContent) repliedToContent = "[Replied-to message content wasn't provided by Discord]" else if (!repliedToContent) repliedToContent = "[Replied-to message content wasn't provided by Discord]"

View file

@ -559,6 +559,84 @@ test("message2event: simple reply in thread to a matrix user's reply", async t =
}]) }])
}) })
test("message2event: infinidoge's reply to ami's matrix smalltext reply to infinidoge", async t => {
const events = await messageToEvent(data.message.infinidoge_reply_to_ami_matrix_smalltext_reply_to_infinidoge, data.guild.general, {}, {
api: {
getEvent: mockGetEvent(t, "!BnKuBPCvyfOkhcUjEu:cadence.moe", "$W1nsDhNIojWrcQOdnOD9RaEvrz2qyZErQoNhPRs1nK4", {
type: "m.room.message",
sender: "@ami:the-apothecary.club",
content: {
msgtype: "m.text",
body: `> <@_ooye_infinidoge:cadence.moe> Neat that they thought of that\n\nlet me guess they got a lot of bug reports like "empty chest with no loot?"`,
format: "org.matrix.custom.html",
formatted_body: `<mx-reply><blockquote><a href="https://matrix.to/#/!BnKuBPCvyfOkhcUjEu:cadence.moe/$baby?via=cadence.moe">In reply to</a> <a href="https://matrix.to/#/@_ooye_infinidoge:cadence.moe">@_ooye_infinidoge:cadence.moe</a><br>Neat that they thought of that</blockquote></mx-reply>let me guess they got a lot of bug reports like "empty chest with no loot?"`,
"m.relates_to": {
"m.in_reply_to": {
event_id: "$baby"
}
}
},
event_id: "$W1nsDhNIojWrcQOdnOD9RaEvrz2qyZErQoNhPRs1nK4",
room_id: "!BnKuBPCvyfOkhcUjEu:cadence.moe"
})
}
})
t.deepEqual(events, [{
$type: "m.room.message",
"m.relates_to": {
"m.in_reply_to": {
event_id: "$W1nsDhNIojWrcQOdnOD9RaEvrz2qyZErQoNhPRs1nK4"
}
},
"m.mentions": {
user_ids: ["@ami:the-apothecary.club"]
},
msgtype: "m.text",
body: `> Ami (she/her): let me guess they got a lot of bug reports like "empty chest with no loot?"\n\nMost likely`,
format: "org.matrix.custom.html",
formatted_body: `<mx-reply><blockquote><a href="https://matrix.to/#/!BnKuBPCvyfOkhcUjEu:cadence.moe/$W1nsDhNIojWrcQOdnOD9RaEvrz2qyZErQoNhPRs1nK4">In reply to</a> <a href="https://matrix.to/#/@ami:the-apothecary.club">Ami (she/her)</a><br>let me guess they got a lot of bug reports like "empty chest with no loot?"</blockquote></mx-reply>Most likely`,
}])
})
test("message2event: infinidoge's reply to ami's matrix smalltext singleline reply to infinidoge", async t => {
const events = await messageToEvent(data.message.infinidoge_reply_to_ami_matrix_smalltext_singleline_reply_to_infinidoge, data.guild.general, {}, {
api: {
getEvent: mockGetEvent(t, "!BnKuBPCvyfOkhcUjEu:cadence.moe", "$W1nsDhNIojWrcQOdnOD9RaEvrz2qyZErQoNhPRs1nK4", {
type: "m.room.message",
sender: "@ami:the-apothecary.club",
content: {
msgtype: "m.text",
body: `> <@_ooye_infinidoge:cadence.moe> Neat that they thought of that\n\nlet me guess they got a lot of bug reports like "empty chest with no loot?"`,
format: "org.matrix.custom.html",
formatted_body: `<mx-reply><blockquote><a href="https://matrix.to/#/!BnKuBPCvyfOkhcUjEu:cadence.moe/$baby?via=cadence.moe">In reply to</a> <a href="https://matrix.to/#/@_ooye_infinidoge:cadence.moe">@_ooye_infinidoge:cadence.moe</a><br>Neat that they thought of that</blockquote></mx-reply>let me guess they got a lot of bug reports like "empty chest with no loot?"`,
"m.relates_to": {
"m.in_reply_to": {
event_id: "$baby"
}
}
},
event_id: "$W1nsDhNIojWrcQOdnOD9RaEvrz2qyZErQoNhPRs1nK4",
room_id: "!BnKuBPCvyfOkhcUjEu:cadence.moe"
})
}
})
t.deepEqual(events, [{
$type: "m.room.message",
"m.relates_to": {
"m.in_reply_to": {
event_id: "$W1nsDhNIojWrcQOdnOD9RaEvrz2qyZErQoNhPRs1nK4"
}
},
"m.mentions": {
user_ids: ["@ami:the-apothecary.club"]
},
msgtype: "m.text",
body: `> Ami (she/her): let me guess they got a lot of bug reports like "empty chest with no loot?"\n\nMost likely`,
format: "org.matrix.custom.html",
formatted_body: `<mx-reply><blockquote><a href="https://matrix.to/#/!BnKuBPCvyfOkhcUjEu:cadence.moe/$W1nsDhNIojWrcQOdnOD9RaEvrz2qyZErQoNhPRs1nK4">In reply to</a> <a href="https://matrix.to/#/@ami:the-apothecary.club">Ami (she/her)</a><br>let me guess they got a lot of bug reports like "empty chest with no loot?"</blockquote></mx-reply>Most likely`,
}])
})
test("message2event: simple written @mention for matrix user", async t => { test("message2event: simple written @mention for matrix user", async t => {
const events = await messageToEvent(data.message.simple_written_at_mention_for_matrix, data.guild.general, {}, { const events = await messageToEvent(data.message.simple_written_at_mention_for_matrix, data.guild.general, {}, {
api: { api: {

View file

@ -1562,6 +1562,182 @@ module.exports = {
attachments: [], attachments: [],
guild_id: "1100319549670301727" guild_id: "1100319549670301727"
}, },
infinidoge_reply_to_ami_matrix_smalltext_reply_to_infinidoge: {
type: 19,
tts: false,
timestamp: "2024-08-15T20:45:20.697000+00:00",
referenced_message: {
webhook_id: "1179987856631017473",
type: 0,
tts: false,
timestamp: "2024-08-15T20:43:42.705000+00:00",
pinned: false,
mentions: [
{
username: "infinidoge1337",
public_flags: 768,
id: "197126718400626689",
global_name: "Infinidoge",
discriminator: "0",
clan: null,
avatar_decoration_data: null,
avatar: "89c59de97fdb5f90999d86fed01f23fe"
}
],
mention_roles: [],
mention_everyone: false,
id: "1273743950028607530",
flags: 0,
embeds: [],
edited_timestamp: null,
content: "> -# <:L1:1144820033948762203><:L2:1144820084079087647>https://discord.com/channels/813954820460642336/1100319550446252084/1273733346005880925 <@197126718400626689>:\n" +
"> -# Neat that they thought of that\n" +
'let me guess they got a lot of bug reports like "empty chest with no loot?"',
components: [],
channel_id: "1100319550446252084",
author: {
username: "Ami (she/her)",
id: "1179987856631017473",
global_name: null,
discriminator: "0000",
bot: true,
avatar: "8b2ca50a10b39f4f908f536cd82d7953"
},
attachments: [],
application_id: "684280192553844747"
},
pinned: false,
nonce: "1273744360743108608",
message_reference: {
type: 0,
message_id: "1273743950028607530",
guild_id: "813954820460642336",
channel_id: "1100319550446252084"
},
mentions: [],
mention_roles: [],
mention_everyone: false,
member: {
roles: [ "832496260219928577" ],
premium_since: null,
pending: false,
nick: null,
mute: false,
joined_at: "2021-05-05T21:22:36.181000+00:00",
flags: 0,
deaf: false,
communication_disabled_until: null,
banner: null,
avatar: null
},
id: "1273744361036841061",
flags: 0,
embeds: [],
edited_timestamp: null,
content: "Most likely",
components: [],
channel_id: "1100319550446252084",
author: {
username: "infinidoge1337",
public_flags: 768,
id: "197126718400626689",
global_name: "Infinidoge",
discriminator: "0",
clan: null,
avatar_decoration_data: null,
avatar: "89c59de97fdb5f90999d86fed01f23fe"
},
attachments: [],
guild_id: "813954820460642336"
},
infinidoge_reply_to_ami_matrix_smalltext_singleline_reply_to_infinidoge: {
type: 19,
tts: false,
timestamp: "2024-08-15T20:45:20.697000+00:00",
referenced_message: {
webhook_id: "1179987856631017473",
type: 0,
tts: false,
timestamp: "2024-08-15T20:43:42.705000+00:00",
pinned: false,
mentions: [
{
username: "infinidoge1337",
public_flags: 768,
id: "197126718400626689",
global_name: "Infinidoge",
discriminator: "0",
clan: null,
avatar_decoration_data: null,
avatar: "89c59de97fdb5f90999d86fed01f23fe"
}
],
mention_roles: [],
mention_everyone: false,
id: "1273743950028607530",
flags: 0,
embeds: [],
edited_timestamp: null,
content: "> -# <:L1:1144820033948762203><:L2:1144820084079087647>https://discord.com/channels/813954820460642336/1100319550446252084/1273733346005880925 <@197126718400626689>:" +
" Neat that they thought of that\n" +
'let me guess they got a lot of bug reports like "empty chest with no loot?"',
components: [],
channel_id: "1100319550446252084",
author: {
username: "Ami (she/her)",
id: "1179987856631017473",
global_name: null,
discriminator: "0000",
bot: true,
avatar: "8b2ca50a10b39f4f908f536cd82d7953"
},
attachments: [],
application_id: "684280192553844747"
},
pinned: false,
nonce: "1273744360743108608",
message_reference: {
type: 0,
message_id: "1273743950028607530",
guild_id: "813954820460642336",
channel_id: "1100319550446252084"
},
mentions: [],
mention_roles: [],
mention_everyone: false,
member: {
roles: [ "832496260219928577" ],
premium_since: null,
pending: false,
nick: null,
mute: false,
joined_at: "2021-05-05T21:22:36.181000+00:00",
flags: 0,
deaf: false,
communication_disabled_until: null,
banner: null,
avatar: null
},
id: "1273744361036841061",
flags: 0,
embeds: [],
edited_timestamp: null,
content: "Most likely",
components: [],
channel_id: "1100319550446252084",
author: {
username: "infinidoge1337",
public_flags: 768,
id: "197126718400626689",
global_name: "Infinidoge",
discriminator: "0",
clan: null,
avatar_decoration_data: null,
avatar: "89c59de97fdb5f90999d86fed01f23fe"
},
attachments: [],
guild_id: "813954820460642336"
},
sticker: { sticker: {
id: "1106366167788044450", id: "1106366167788044450",
type: 0, type: 0,

View file

@ -55,7 +55,8 @@ INSERT INTO message_channel (message_id, channel_id) VALUES
('1202543413652881428', '1160894080998461480'), ('1202543413652881428', '1160894080998461480'),
('1207486471489986620', '1160894080998461480'), ('1207486471489986620', '1160894080998461480'),
('1210387798297682020', '112760669178241024'), ('1210387798297682020', '112760669178241024'),
('1273204543739396116', '687028734322147344'); ('1273204543739396116', '687028734322147344'),
('1273743950028607530', '1100319550446252084');
INSERT INTO event_message (event_id, event_type, event_subtype, message_id, part, reaction_part, source) VALUES INSERT INTO event_message (event_id, event_type, event_subtype, message_id, part, reaction_part, source) VALUES
('$X16nfVks1wsrhq4E9SSLiqrf2N8KD0erD0scZG7U5xg', 'm.room.message', 'm.text', '1126786462646550579', 0, 0, 1), ('$X16nfVks1wsrhq4E9SSLiqrf2N8KD0erD0scZG7U5xg', 'm.room.message', 'm.text', '1126786462646550579', 0, 0, 1),
@ -91,7 +92,8 @@ INSERT INTO event_message (event_id, event_type, event_subtype, message_id, part
('$NB6nPgO2tfXyIwwDSF0Ga0BUrsgX1S-0Xl-jAvI8ucU', 'm.room.message', 'm.text', '1202543413652881428', 0, 0, 0), ('$NB6nPgO2tfXyIwwDSF0Ga0BUrsgX1S-0Xl-jAvI8ucU', 'm.room.message', 'm.text', '1202543413652881428', 0, 0, 0),
('$OEEK-Wam2FTh6J-6kVnnJ6KnLA_lLRnLTHatKKL62-Y', 'm.room.message', 'm.image', '1207486471489986620', 0, 0, 0), ('$OEEK-Wam2FTh6J-6kVnnJ6KnLA_lLRnLTHatKKL62-Y', 'm.room.message', 'm.image', '1207486471489986620', 0, 0, 0),
('$mPSzglkCu-6cZHbYro0RW2u5mHvbH9aXDjO5FCzosc0', 'm.room.message', 'm.text', '1210387798297682020', 0, 0, 1), ('$mPSzglkCu-6cZHbYro0RW2u5mHvbH9aXDjO5FCzosc0', 'm.room.message', 'm.text', '1210387798297682020', 0, 0, 1),
('$qmyjr-ISJtnOM5WTWLI0fT7uSlqRLgpyin2d2NCglCU', 'm.room.message', 'm.text', '1273204543739396116', 0, 0, 0); ('$qmyjr-ISJtnOM5WTWLI0fT7uSlqRLgpyin2d2NCglCU', 'm.room.message', 'm.text', '1273204543739396116', 0, 0, 0),
('$W1nsDhNIojWrcQOdnOD9RaEvrz2qyZErQoNhPRs1nK4', 'm.room.message', 'm.text', '1273743950028607530', 0, 0, 0);
INSERT INTO file (discord_url, mxc_url) VALUES INSERT INTO file (discord_url, mxc_url) VALUES
('https://cdn.discordapp.com/attachments/497161332244742154/1124628646431297546/image.png', 'mxc://cadence.moe/qXoZktDqNtEGuOCZEADAMvhM'), ('https://cdn.discordapp.com/attachments/497161332244742154/1124628646431297546/image.png', 'mxc://cadence.moe/qXoZktDqNtEGuOCZEADAMvhM'),
@ -134,7 +136,8 @@ INSERT INTO member_cache (room_id, mxid, displayname, avatar_url) VALUES
('!cBxtVRxDlZvSVhJXVK:cadence.moe', '@Milan:tchncs.de', 'Milan', NULL), ('!cBxtVRxDlZvSVhJXVK:cadence.moe', '@Milan:tchncs.de', 'Milan', NULL),
('!TqlyQmifxGUggEmdBN:cadence.moe', '@ampflower:matrix.org', 'Ampflower 🌺', 'mxc://cadence.moe/PRfhXYBTOalvgQYtmCLeUXko'), ('!TqlyQmifxGUggEmdBN:cadence.moe', '@ampflower:matrix.org', 'Ampflower 🌺', 'mxc://cadence.moe/PRfhXYBTOalvgQYtmCLeUXko'),
('!TqlyQmifxGUggEmdBN:cadence.moe', '@aflower:syndicated.gay', 'Rose', 'mxc://syndicated.gay/ZkBUPXCiXTjdJvONpLJmcbKP'), ('!TqlyQmifxGUggEmdBN:cadence.moe', '@aflower:syndicated.gay', 'Rose', 'mxc://syndicated.gay/ZkBUPXCiXTjdJvONpLJmcbKP'),
('!TqlyQmifxGUggEmdBN:cadence.moe', '@cadence:cadence.moe', 'cadence [they]', NULL); ('!TqlyQmifxGUggEmdBN:cadence.moe', '@cadence:cadence.moe', 'cadence [they]', NULL),
('!BnKuBPCvyfOkhcUjEu:cadence.moe', '@ami:the-apothecary.club', 'Ami (she/her)', NULL);
INSERT INTO lottie (sticker_id, mxc_url) VALUES INSERT INTO lottie (sticker_id, mxc_url) VALUES
('860171525772279849', 'mxc://cadence.moe/ZtvvVbwMIdUZeovWVyGVFCeR'); ('860171525772279849', 'mxc://cadence.moe/ZtvvVbwMIdUZeovWVyGVFCeR');