Fix emoji_id references and add tests
This commit is contained in:
parent
9fbef15ad1
commit
e3b2c844d8
8 changed files with 77 additions and 19 deletions
|
@ -14,7 +14,7 @@ async function emojiToKey(emoji) {
|
||||||
let key
|
let key
|
||||||
if (emoji.id) {
|
if (emoji.id) {
|
||||||
// Custom emoji
|
// Custom emoji
|
||||||
const mxc = select("emoji", "mxc_url", {emoji_id: emoji.id}).pluck().get(emoji.id)
|
const mxc = select("emoji", "mxc_url", {emoji_id: emoji.id}).pluck().get()
|
||||||
if (mxc) {
|
if (mxc) {
|
||||||
// The custom emoji is registered and we should send it
|
// The custom emoji is registered and we should send it
|
||||||
key = mxc
|
key = mxc
|
||||||
|
@ -22,7 +22,7 @@ async function emojiToKey(emoji) {
|
||||||
// The custom emoji is not registered. We will register it and then add it.
|
// The custom emoji is not registered. We will register it and then add it.
|
||||||
assert(emoji.name) // The docs say: "name may be null when custom emoji data is not available, for example, if it was deleted from the guild"
|
assert(emoji.name) // The docs say: "name may be null when custom emoji data is not available, for example, if it was deleted from the guild"
|
||||||
const mxc = await file.uploadDiscordFileToMxc(file.emoji(emoji.id, emoji.animated))
|
const mxc = await file.uploadDiscordFileToMxc(file.emoji(emoji.id, emoji.animated))
|
||||||
db.prepare("INSERT OR IGNORE INTO emoji (id, name, animated, mxc_url) VALUES (?, ?, ?, ?)").run(emoji.id, emoji.name, +!!emoji.animated, mxc)
|
db.prepare("INSERT OR IGNORE INTO emoji (emoji_id, name, animated, mxc_url) VALUES (?, ?, ?, ?)").run(emoji.id, emoji.name, +!!emoji.animated, mxc)
|
||||||
key = mxc
|
key = mxc
|
||||||
// TODO: what happens if the matrix user also tries adding this reaction? the bridge bot isn't able to use that emoji...
|
// TODO: what happens if the matrix user also tries adding this reaction? the bridge bot isn't able to use that emoji...
|
||||||
}
|
}
|
||||||
|
|
21
d2m/converters/emoji-to-key.test.js
Normal file
21
d2m/converters/emoji-to-key.test.js
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
// @ts-check
|
||||||
|
|
||||||
|
const {test} = require("supertape")
|
||||||
|
const {emojiToKey} = require("./emoji-to-key")
|
||||||
|
const data = require("../../test/data")
|
||||||
|
const Ty = require("../../types")
|
||||||
|
|
||||||
|
test("emoji2key: unicode emoji works", async t => {
|
||||||
|
const result = await emojiToKey({id: null, name: "🐈"})
|
||||||
|
t.equal(result, "🐈")
|
||||||
|
})
|
||||||
|
|
||||||
|
test("emoji2key: custom emoji works", async t => {
|
||||||
|
const result = await emojiToKey({id: "230201364309868544", name: "hippo", animated: false})
|
||||||
|
t.equal(result, "mxc://cadence.moe/qWmbXeRspZRLPcjseyLmeyXC")
|
||||||
|
})
|
||||||
|
|
||||||
|
test("emoji2key: custom animated emoji works", async t => {
|
||||||
|
const result = await emojiToKey({id: "393635038903926784", name: "hipposcope", animated: true})
|
||||||
|
t.equal(result, "mxc://cadence.moe/WbYqNlACRuicynBfdnPYtmvc")
|
||||||
|
})
|
|
@ -29,7 +29,7 @@ async function emojisToState(emojis) {
|
||||||
},
|
},
|
||||||
url
|
url
|
||||||
}
|
}
|
||||||
db.prepare("INSERT OR IGNORE INTO emoji (id, name, animated, mxc_url) VALUES (?, ?, ?, ?)").run(emoji.id, emoji.name, +!!emoji.animated, url)
|
db.prepare("INSERT OR IGNORE INTO emoji (emoji_id, name, animated, mxc_url) VALUES (?, ?, ?, ?)").run(emoji.id, emoji.name, +!!emoji.animated, url)
|
||||||
}).catch(e => {
|
}).catch(e => {
|
||||||
if (e.data.errcode === "M_TOO_LARGE") { // Very unlikely to happen. Only possible for 3x-series emojis uploaded shortly after animated emojis were introduced, when there was no 256 KB size limit.
|
if (e.data.errcode === "M_TOO_LARGE") { // Very unlikely to happen. Only possible for 3x-series emojis uploaded shortly after animated emojis were introduced, when there was no 256 KB size limit.
|
||||||
return
|
return
|
||||||
|
|
|
@ -9,6 +9,8 @@ const passthrough = require("../../passthrough")
|
||||||
const {sync, db, discord, select, from} = passthrough
|
const {sync, db, discord, select, from} = passthrough
|
||||||
/** @type {import("../../matrix/file")} */
|
/** @type {import("../../matrix/file")} */
|
||||||
const file = sync.require("../../matrix/file")
|
const file = sync.require("../../matrix/file")
|
||||||
|
/** @type {import("./emoji-to-key")} */
|
||||||
|
const emojiToKey = sync.require("./emoji-to-key")
|
||||||
/** @type {import("./lottie")} */
|
/** @type {import("./lottie")} */
|
||||||
const lottie = sync.require("./lottie")
|
const lottie = sync.require("./lottie")
|
||||||
const reg = require("../../matrix/read-registration")
|
const reg = require("../../matrix/read-registration")
|
||||||
|
@ -150,22 +152,12 @@ async function messageToEvent(message, guild, options = {}, di) {
|
||||||
// Handling emojis that we don't know about. The emoji has to be present in the DB for it to be picked up in the emoji markdown converter.
|
// Handling emojis that we don't know about. The emoji has to be present in the DB for it to be picked up in the emoji markdown converter.
|
||||||
// So we scan the message ahead of time for all its emojis and ensure they are in the DB.
|
// So we scan the message ahead of time for all its emojis and ensure they are in the DB.
|
||||||
const emojiMatches = [...content.matchAll(/<(a?):([^:>]{2,64}):([0-9]+)>/g)]
|
const emojiMatches = [...content.matchAll(/<(a?):([^:>]{2,64}):([0-9]+)>/g)]
|
||||||
const emojiDownloads = []
|
await Promise.all(emojiMatches.map(match => {
|
||||||
for (const match of emojiMatches) {
|
|
||||||
const id = match[3]
|
const id = match[3]
|
||||||
const name = match[2]
|
const name = match[2]
|
||||||
const animated = +!!match[1]
|
const animated = match[1]
|
||||||
const exists = select("emoji", "emoji_id", {emoji_id: id}).pluck().get()
|
return emojiToKey.emojiToKey({id, name, animated}) // Register the custom emoji if needed
|
||||||
if (!exists) {
|
}))
|
||||||
// The custom emoji is not registered. We will register it and then add it.
|
|
||||||
emojiDownloads.push(
|
|
||||||
file.uploadDiscordFileToMxc(file.emoji(id, animated)).then(mxc => {
|
|
||||||
db.prepare("INSERT OR IGNORE INTO emoji (id, name, animated, mxc_url) VALUES (?, ?, ?, ?)").run(id, name, animated, mxc)
|
|
||||||
})
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
await Promise.all(emojiDownloads)
|
|
||||||
|
|
||||||
let html = markdown.toHTML(content, {
|
let html = markdown.toHTML(content, {
|
||||||
discordCallback: getDiscordParseCallbacks(message, true)
|
discordCallback: getDiscordParseCallbacks(message, true)
|
||||||
|
|
|
@ -464,6 +464,18 @@ test("message2event: mid-message small bridged emoji", async t => {
|
||||||
}])
|
}])
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test("message2event: emoji that hasn't been registered yet", async t => {
|
||||||
|
const events = await messageToEvent(data.message.not_been_registered_emoji, data.guild.general, {})
|
||||||
|
t.deepEqual(events, [{
|
||||||
|
$type: "m.room.message",
|
||||||
|
"m.mentions": {},
|
||||||
|
msgtype: "m.text",
|
||||||
|
body: ":Yeah:",
|
||||||
|
format: "org.matrix.custom.html",
|
||||||
|
formatted_body: '<img data-mx-emoticon height="32" src="mxc://cadence.moe/pgdGTxAyEltccRgZKxdqzHHP" title=":Yeah:" alt=":Yeah:">'
|
||||||
|
}])
|
||||||
|
})
|
||||||
|
|
||||||
test("message2event: emoji triple long name", async t => {
|
test("message2event: emoji triple long name", async t => {
|
||||||
const events = await messageToEvent(data.message.emoji_triple_long_name, data.guild.general, {})
|
const events = await messageToEvent(data.message.emoji_triple_long_name, data.guild.general, {})
|
||||||
t.deepEqual(events, [{
|
t.deepEqual(events, [{
|
||||||
|
|
31
test/data.js
31
test/data.js
|
@ -1089,6 +1089,37 @@ module.exports = {
|
||||||
flags: 0,
|
flags: 0,
|
||||||
components: []
|
components: []
|
||||||
},
|
},
|
||||||
|
not_been_registered_emoji: {
|
||||||
|
id: "1126733830494093453",
|
||||||
|
type: 0,
|
||||||
|
content: "<:Yeah:1125827250609201255>",
|
||||||
|
channel_id: "112760669178241024",
|
||||||
|
author: {
|
||||||
|
id: "111604486476181504",
|
||||||
|
username: "kyuugryphon",
|
||||||
|
avatar: "e4ce31267ca524d19be80e684d4cafa1",
|
||||||
|
discriminator: "0",
|
||||||
|
public_flags: 0,
|
||||||
|
flags: 0,
|
||||||
|
banner: null,
|
||||||
|
accent_color: null,
|
||||||
|
global_name: "KyuuGryphon",
|
||||||
|
avatar_decoration: null,
|
||||||
|
display_name: "KyuuGryphon",
|
||||||
|
banner_color: null
|
||||||
|
},
|
||||||
|
attachments: [],
|
||||||
|
embeds: [],
|
||||||
|
mentions: [],
|
||||||
|
mention_roles: [],
|
||||||
|
pinned: false,
|
||||||
|
mention_everyone: false,
|
||||||
|
tts: false,
|
||||||
|
timestamp: "2023-07-07T04:37:58.892000+00:00",
|
||||||
|
edited_timestamp: null,
|
||||||
|
flags: 0,
|
||||||
|
components: []
|
||||||
|
},
|
||||||
emoji_triple_long_name: {
|
emoji_triple_long_name: {
|
||||||
id: "1156394116540805170",
|
id: "1156394116540805170",
|
||||||
type: 0,
|
type: 0,
|
||||||
|
|
|
@ -71,7 +71,8 @@ INSERT INTO file (discord_url, mxc_url) VALUES
|
||||||
('https://cdn.discordapp.com/avatars/113340068197859328/b48302623a12bc7c59a71328f72ccb39.png?size=1024', 'mxc://cadence.moe/UpAeIqeclhKfeiZNdIWNcXXL'),
|
('https://cdn.discordapp.com/avatars/113340068197859328/b48302623a12bc7c59a71328f72ccb39.png?size=1024', 'mxc://cadence.moe/UpAeIqeclhKfeiZNdIWNcXXL'),
|
||||||
('https://cdn.discordapp.com/emojis/230201364309868544.png', 'mxc://cadence.moe/qWmbXeRspZRLPcjseyLmeyXC'),
|
('https://cdn.discordapp.com/emojis/230201364309868544.png', 'mxc://cadence.moe/qWmbXeRspZRLPcjseyLmeyXC'),
|
||||||
('https://cdn.discordapp.com/emojis/393635038903926784.gif', 'mxc://cadence.moe/WbYqNlACRuicynBfdnPYtmvc'),
|
('https://cdn.discordapp.com/emojis/393635038903926784.gif', 'mxc://cadence.moe/WbYqNlACRuicynBfdnPYtmvc'),
|
||||||
('https://cdn.discordapp.com/attachments/176333891320283136/1157854643037163610/Screenshot_20231001_034036.jpg', 'mxc://cadence.moe/zAXdQriaJuLZohDDmacwWWDR');
|
('https://cdn.discordapp.com/attachments/176333891320283136/1157854643037163610/Screenshot_20231001_034036.jpg', 'mxc://cadence.moe/zAXdQriaJuLZohDDmacwWWDR'),
|
||||||
|
('https://cdn.discordapp.com/emojis/1125827250609201255.png', 'mxc://cadence.moe/pgdGTxAyEltccRgZKxdqzHHP');
|
||||||
|
|
||||||
INSERT INTO emoji (emoji_id, name, animated, mxc_url) VALUES
|
INSERT INTO emoji (emoji_id, name, animated, mxc_url) VALUES
|
||||||
('230201364309868544', 'hippo', 0, 'mxc://cadence.moe/qWmbXeRspZRLPcjseyLmeyXC'),
|
('230201364309868544', 'hippo', 0, 'mxc://cadence.moe/qWmbXeRspZRLPcjseyLmeyXC'),
|
||||||
|
|
|
@ -50,8 +50,9 @@ file._actuallyUploadDiscordFileToMxc = function(url, res) { throw new Error(`Not
|
||||||
require("../d2m/converters/message-to-event.embeds.test")
|
require("../d2m/converters/message-to-event.embeds.test")
|
||||||
require("../d2m/converters/edit-to-changes.test")
|
require("../d2m/converters/edit-to-changes.test")
|
||||||
require("../d2m/converters/thread-to-announcement.test")
|
require("../d2m/converters/thread-to-announcement.test")
|
||||||
require("../d2m/actions/create-room.test")
|
|
||||||
require("../d2m/converters/user-to-mxid.test")
|
require("../d2m/converters/user-to-mxid.test")
|
||||||
|
require("../d2m/converters/emoji-to-key.test")
|
||||||
|
require("../d2m/actions/create-room.test")
|
||||||
require("../d2m/actions/register-user.test")
|
require("../d2m/actions/register-user.test")
|
||||||
require("../m2d/converters/event-to-message.test")
|
require("../m2d/converters/event-to-message.test")
|
||||||
require("../m2d/converters/utils.test")
|
require("../m2d/converters/utils.test")
|
||||||
|
|
Loading…
Reference in a new issue