From 38e390c4180070f01c7afc3c8b093089c8bdcb6d Mon Sep 17 00:00:00 2001 From: Jesse Wierzbinski Date: Sat, 2 Dec 2023 20:50:20 -1000 Subject: [PATCH] feat: Add emoji importing and creation via CLI + support in posts --- bun.lockb | Bin 349144 -> 351344 bytes cli.ts | 392 +++++++++++++++++++++++++++++++++++- database/entities/Status.ts | 14 +- package.json | 1 + 4 files changed, 402 insertions(+), 5 deletions(-) diff --git a/bun.lockb b/bun.lockb index eda9a2f4b8f0397e42b323658663418e9c3ffefd..fca0ffb24e7a955e9396cda3e900bdd5d9345705 100755 GIT binary patch delta 66702 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 H@zVbSY0F(2 delta 65598 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 diff --git a/cli.ts b/cli.ts index ba0b7a72..be12b5ee 100644 --- a/cli.ts +++ b/cli.ts @@ -5,6 +5,10 @@ import { createNewLocalUser } from "~database/entities/User"; import Table from "cli-table"; import { rebuildSearchIndexes, MeiliIndexType } from "@meilisearch"; import { getConfig } from "@config"; +import { uploadFile } from "~classes/media"; +import { getUrl } from "~database/entities/Attachment"; +import { mkdir, exists } from "fs/promises"; +import extract from "extract-zip"; const args = process.argv; @@ -101,7 +105,39 @@ ${chalk.bold("Commands:")} )} Only rebuild the users index (optional) ${chalk.bold("Example:")} ${chalk.bgGray( `bun cli index rebuild --users 200` - )} + )} + ${alignDots(chalk.blue("emoji"), 24)} Manage custom emojis + ${alignDots(chalk.blue("add"))} Add a custom emoji + ${alignDotsSmall(chalk.green("name"))} Name of the emoji + ${alignDotsSmall(chalk.green("url"))} URL of the emoji + ${chalk.bold("Example:")} ${chalk.bgGray( + `bun cli emoji add bun https://bun.com/bun.png` + )} + ${alignDots(chalk.blue("delete"))} Delete a custom emoji + ${alignDotsSmall(chalk.green("name"))} Name of the emoji + ${chalk.bold("Example:")} ${chalk.bgGray( + `bun cli emoji delete bun` + )} + ${alignDots(chalk.blue("list"))} List all custom emojis + ${chalk.bold("Example:")} ${chalk.bgGray(`bun cli emoji list`)} + ${alignDots(chalk.blue("search"))} Search for a custom emoji + ${alignDotsSmall(chalk.green("query"))} Query to search for + ${alignDotsSmall( + chalk.yellow("--local") + )} Search in local emojis (optional, default) + ${alignDotsSmall( + chalk.yellow("--remote") + )} Search in remote emojis (optional) + ${alignDotsSmall(chalk.yellow("--json"))} Output as JSON (optional) + ${alignDotsSmall(chalk.yellow("--csv"))} Output as CSV (optional) + ${chalk.bold("Example:")} ${chalk.bgGray( + `bun cli emoji search bun` + )} + ${alignDots(chalk.blue("import"))} Import a Pleroma emoji pack + ${alignDotsSmall(chalk.green("url"))} URL of the emoji pack + ${chalk.bold("Example:")} ${chalk.bgGray( + `bun cli emoji import https://site.com/neofox/manifest.json` + )} `; if (args.length < 3) { @@ -597,6 +633,360 @@ switch (command) { } break; } + case "emoji": { + switch (args[3]) { + case "add": { + const name = args[4]; + const url = args[5]; + + if (!name || !url) { + console.log(`${chalk.red(`✗`)} Missing name or URL`); + process.exit(1); + } + + const content_type = `image/${url + .split(".") + .pop() + ?.replace("jpg", "jpeg")}}`; + + const emoji = await client.emoji.create({ + data: { + shortcode: name, + url: url, + visible_in_picker: true, + content_type: content_type, + }, + }); + + console.log( + `${chalk.green(`✓`)} Created emoji ${chalk.blue( + emoji.shortcode + )}` + ); + + break; + } + case "delete": { + const name = args[4]; + + if (!name) { + console.log(`${chalk.red(`✗`)} Missing name`); + process.exit(1); + } + + const emoji = await client.emoji.findFirst({ + where: { + shortcode: name, + }, + }); + + if (!emoji) { + console.log(`${chalk.red(`✗`)} Emoji not found`); + process.exit(1); + } + + await client.emoji.delete({ + where: { + id: emoji.id, + }, + }); + + console.log( + `${chalk.green(`✓`)} Deleted emoji ${chalk.blue( + emoji.shortcode + )}` + ); + + break; + } + case "list": { + const emojis = await client.emoji.findMany(); + + console.log( + `${chalk.green(`✓`)} Found ${chalk.blue( + emojis.length + )} emojis` + ); + + for (const emoji of emojis) { + console.log( + `\t${chalk.blue(emoji.shortcode)} ${chalk.gray( + emoji.url + )}` + ); + } + break; + } + case "search": { + const argsWithoutFlags = args.filter( + arg => !arg.startsWith("--") + ); + const query = argsWithoutFlags[4]; + + if (!query) { + console.log(`${chalk.red(`✗`)} Missing query`); + process.exit(1); + } + + const local = args.includes("--local"); + const remote = args.includes("--remote"); + const json = args.includes("--json"); + const csv = args.includes("--csv"); + + const queries: Prisma.EmojiWhereInput[] = []; + + if (local) { + queries.push({ + instanceId: null, + }); + } + + if (remote) { + queries.push({ + instanceId: { + not: null, + }, + }); + } + + const emojis = await client.emoji.findMany({ + where: { + AND: queries, + shortcode: { + contains: query, + mode: "insensitive", + }, + }, + take: 40, + include: { + instance: true, + }, + }); + + if (json || csv) { + if (json) { + console.log(JSON.stringify(emojis, null, 4)); + } + if (csv) { + // Convert the outputted JSON to CSV + + // Remove all object children from each object + const items = emojis.map(emoji => { + const item = { + ...emoji, + instance: undefined, + }; + return item; + }); + const replacer = (key: string, value: any): any => + value === null ? "" : value; // Null values are returned as empty strings + const header = Object.keys(items[0]); + const csv = [ + header.join(","), // header row first + ...items.map(row => + header + .map(fieldName => + // @ts-expect-error This is fine + JSON.stringify(row[fieldName], replacer) + ) + .join(",") + ), + ].join("\r\n"); + + console.log(csv); + } + } else { + console.log( + `${chalk.green(`✓`)} Found ${chalk.blue( + emojis.length + )} emojis` + ); + + const table = new Table({ + head: [ + chalk.white(chalk.bold("Shortcode")), + chalk.white(chalk.bold("Instance URL")), + chalk.white(chalk.bold("URL")), + ], + }); + + for (const emoji of emojis) { + table.push([ + chalk.yellow(`:${emoji.shortcode}:`), + chalk.blue( + emoji.instanceId + ? emoji.instance?.base_url + : "Local" + ), + chalk.gray(emoji.url), + ]); + } + + console.log(table.toString()); + } + + break; + } + case "import": { + const url = args[4]; + + if (!url) { + console.log(`${chalk.red(`✗`)} Missing URL`); + process.exit(1); + } + + const response = await fetch(url); + + if (!response.ok) { + console.log(`${chalk.red(`✗`)} Failed to fetch emoji pack`); + process.exit(1); + } + + const res = (await response.json()) as Record< + string, + { + description: string; + files: string; + homepage: string; + src: string; + src_sha256?: string; + license?: string; + } + >; + + const pack = Object.values(res)[0]; + + // Fetch emoji list from `files`, can be a relative URL + + if (!pack.files) { + console.log(`${chalk.red(`✗`)} Missing files`); + process.exit(1); + } + + let pack_url = pack.files; + + if (!pack.files.includes("http")) { + // Is relative URL to pack manifest URL + pack_url = + url.split("/").slice(0, -1).join("/") + + "/" + + pack.files; + } + + const zip = new File( + [await (await fetch(pack.src)).arrayBuffer()], + "emoji.zip", + { + type: "application/zip", + } + ); + + // Check if the SHA256 hash matches + const hasher = new Bun.SHA256(); + + hasher.update(await zip.arrayBuffer()); + + const hash = hasher.digest("hex"); + + if (pack.src_sha256 && pack.src_sha256 !== hash) { + console.log(`${chalk.red(`✗`)} SHA256 hash does not match`); + console.log( + `${chalk.red(`✗`)} Expected ${chalk.blue( + pack.src_sha256 + )}, got ${chalk.blue(hash)}` + ); + process.exit(1); + } + + // Store file in /tmp + const tempDirectory = `/tmp/lysand-${hash}`; + + if (!(await exists(tempDirectory))) { + await mkdir(tempDirectory); + } + + await Bun.write(`${tempDirectory}/emojis.zip`, zip); + + // Extract zip + await extract(`${tempDirectory}/emojis.zip`, { + dir: tempDirectory, + }); + + // In the format + // emoji_name: emoji_url + const pack_response = (await ( + await fetch(pack_url) + ).json()) as Record; + + let emojisCreated = 0; + + for (const [name, path] of Object.entries(pack_response)) { + // Get emoji URL, as it can be relative + + const emoji = Bun.file(`${tempDirectory}/${path}`); + + const content_type = emoji.type; + + const hash = await uploadFile(emoji as File, config); + + if (!hash) { + console.log( + `${chalk.red(`✗`)} Failed to upload emoji ${name}` + ); + process.exit(1); + } + + const finalUrl = getUrl(hash, config); + + // Check if emoji already exists + const existingEmoji = await client.emoji.findFirst({ + where: { + shortcode: name, + instanceId: null, + }, + }); + + if (existingEmoji) { + console.log( + `${chalk.red(`✗`)} Emoji ${chalk.blue( + name + )} already exists` + ); + continue; + } + + // Create emoji + await client.emoji.create({ + data: { + shortcode: name, + url: finalUrl, + visible_in_picker: true, + content_type: content_type, + }, + }); + + emojisCreated++; + + console.log( + `${chalk.green(`✓`)} Created emoji ${chalk.blue(name)}` + ); + } + + console.log( + `${chalk.green(`✓`)} Imported ${chalk.blue( + emojisCreated + )} emojis` + ); + + break; + } + default: + console.log(`Unknown command ${chalk.blue(command)}`); + break; + } + + break; + } default: console.log(`Unknown command ${chalk.blue(command)}`); break; diff --git a/database/entities/Status.ts b/database/entities/Status.ts index d025f4ea..25b36b7e 100644 --- a/database/entities/Status.ts +++ b/database/entities/Status.ts @@ -325,7 +325,10 @@ export const createNewStatus = async (data: { let mentions = data.mentions || []; - // TODO: Parse emojis + // Parse emojis + const emojis = await parseEmojis(data.content); + + data.emojis = data.emojis ? [...data.emojis, ...emojis] : emojis; // Get list of mentioned users if (mentions.length === 0) { @@ -371,7 +374,7 @@ export const createNewStatus = async (data: { sensitive: data.sensitive, spoilerText: data.spoiler_text, emojis: { - connect: data.emojis?.map(emoji => { + connect: data.emojis.map(emoji => { return { id: emoji.id, }; @@ -453,7 +456,10 @@ export const editStatus = async ( let mentions = data.mentions || []; - // TODO: Parse emojis + // Parse emojis + const emojis = await parseEmojis(data.content); + + data.emojis = data.emojis ? [...data.emojis, ...emojis] : emojis; // Get list of mentioned users if (mentions.length === 0) { @@ -500,7 +506,7 @@ export const editStatus = async ( sensitive: data.sensitive, spoilerText: data.spoiler_text, emojis: { - connect: data.emojis?.map(emoji => { + connect: data.emojis.map(emoji => { return { id: emoji.id, }; diff --git a/package.json b/package.json index d8ce8262..94687490 100644 --- a/package.json +++ b/package.json @@ -78,6 +78,7 @@ "chalk": "^5.3.0", "cli-table": "^0.3.11", "eventemitter3": "^5.0.1", + "extract-zip": "^2.0.1", "html-to-text": "^9.0.5", "ioredis": "^5.3.2", "ip-matching": "^2.1.2",