From b1a1ace0ac8675aa76aefffca84399bad040160d Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 14 Mar 2025 23:58:42 -0500 Subject: [PATCH] Refactor getCustomEmojis function, support emoji categories --- .../ditto/routes/customEmojisRoute.test.ts | 2 + packages/ditto/routes/customEmojisRoute.ts | 51 +++++++++++++------ 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/packages/ditto/routes/customEmojisRoute.test.ts b/packages/ditto/routes/customEmojisRoute.test.ts index 6feac4cc..4d52540a 100644 --- a/packages/ditto/routes/customEmojisRoute.test.ts +++ b/packages/ditto/routes/customEmojisRoute.test.ts @@ -57,11 +57,13 @@ Deno.test('customEmojisRoute', async (t) => { url: 'https://soapbox.pub/favicon.ico', static_url: 'https://soapbox.pub/favicon.ico', visible_in_picker: true, + category: 'soapbox', }, { shortcode: 'ditto', url: 'https://ditto.pub/favicon.ico', static_url: 'https://ditto.pub/favicon.ico', visible_in_picker: true, + category: 'soapbox', }]); }); }); diff --git a/packages/ditto/routes/customEmojisRoute.ts b/packages/ditto/routes/customEmojisRoute.ts index 32c7a3d0..997c9a45 100644 --- a/packages/ditto/routes/customEmojisRoute.ts +++ b/packages/ditto/routes/customEmojisRoute.ts @@ -1,6 +1,6 @@ import { userMiddleware } from '@ditto/mastoapi/middleware'; import { DittoRoute } from '@ditto/mastoapi/router'; -import { NostrFilter } from '@nostrify/nostrify'; +import { NostrFilter, NRelay } from '@nostrify/nostrify'; const route = new DittoRoute(); @@ -13,18 +13,42 @@ interface MastodonCustomEmoji { } route.get('/', userMiddleware(), async (c) => { - const { relay, user, signal } = c.var; + const { user } = c.var; const pubkey = await user.signer.getPublicKey(); + const emojis = await getCustomEmojis(pubkey, c.var); + + return c.json([...emojis.entries()].map(([shortcode, data]): MastodonCustomEmoji => { + return { + shortcode, + url: data.url.toString(), + static_url: data.url.toString(), + visible_in_picker: true, + category: data.category, + }; + })); +}); + +interface GetCustomEmojisOpts { + relay: NRelay; + signal?: AbortSignal; +} + +async function getCustomEmojis( + pubkey: string, + opts: GetCustomEmojisOpts, +): Promise> { + const { relay, signal } = opts; + + const emojis = new Map(); const [emojiList] = await relay.query([{ kinds: [10030], authors: [pubkey] }], { signal }); if (!emojiList) { - return c.json([]); + return emojis; } const a = new Set(); - const emojis = new Map(); for (const tag of emojiList.tags) { if (tag[0] === 'emoji') { @@ -32,7 +56,7 @@ route.get('/', userMiddleware(), async (c) => { if (!emojis.has(shortcode)) { try { - emojis.set(shortcode, new URL(url)); + emojis.set(shortcode, { url: new URL(url) }); } catch { // continue } @@ -56,15 +80,17 @@ route.get('/', userMiddleware(), async (c) => { } if (!filters.length) { - return c.json([]); + return new Map(); } for (const event of await relay.query(filters, { signal })) { + const d = event.tags.find(([name]) => name === 'd')?.[1]; + for (const [t, shortcode, url] of event.tags) { if (t === 'emoji') { if (!emojis.has(shortcode)) { try { - emojis.set(shortcode, new URL(url)); + emojis.set(shortcode, { url: new URL(url), category: d }); } catch { // continue } @@ -73,14 +99,7 @@ route.get('/', userMiddleware(), async (c) => { } } - return c.json([...emojis.entries()].map(([shortcode, url]): MastodonCustomEmoji => { - return { - shortcode, - url: url.toString(), - static_url: url.toString(), - visible_in_picker: true, - }; - })); -}); + return emojis; +} export default route;