diff --git a/d2m/converters/message-to-event.js b/d2m/converters/message-to-event.js
index fd8078f..2a50d62 100644
--- a/d2m/converters/message-to-event.js
+++ b/d2m/converters/message-to-event.js
@@ -42,10 +42,9 @@ function getDiscordParseCallbacks(message, useHTML) {
emoji: node => {
if (useHTML) {
const mxc = select("emoji", "mxc_url", "WHERE id = ?").pluck().get(node.id)
- // TODO: upload and register the emoji so it can be added no matter what
if (mxc) {
return ``
- } else {
+ } else { // We shouldn't get here since all emojis should have been added ahead of time in the messageToEvent function.
return ``
}
} else {
@@ -185,6 +184,26 @@ 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.
+ // 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,20}):([0-9]+)>/g)]
+ const emojiDownloads = []
+ for (const match of emojiMatches) {
+ const id = match[3]
+ const name = match[2]
+ const animated = +!!match[1]
+ const row = select("emoji", "id", "WHERE id = ?").pluck().get(id)
+ if (!row) {
+ // 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)
+
// Star * prefix for fallback edits
if (options.includeEditFallbackStar) {
body = "* " + body