import define from "../../../define.js"; import { Emojis } from "../../../../../models/index.js"; import { genId } from "../../../../../misc/gen-id.js"; import { ApiError } from "../../../error.js"; import { uploadFromUrl } from "../../../../../services/drive/upload-from-url.js"; import { publishBroadcastStream } from "../../../../../services/stream.js"; import { db } from "../../../../../db/postgre.js"; import { getEmojiSize } from "../../../../../misc/emoji-meta.js"; export const meta = { tags: [ "admin" ], requireCredential: true, requireModerator: true, errors: { noSuchEmoji: { message: "No such emoji.", code: "NO_SUCH_EMOJI", id: "e2785b66-dca3-4087-9cac-b93c541cc425" } }, res: { type: "object", optional: false, nullable: false, properties: { id: { type: "string", optional: false, nullable: false, format: "id" } } } }; export const paramDef = { type: "object", properties: { emojiId: { type: "string", format: "misskey:id" } }, required: [ "emojiId" ] }; export default define(meta, paramDef, async (ps, me)=>{ const emoji = await Emojis.findOneBy({ id: ps.emojiId }); if (emoji == null) { throw new ApiError(meta.errors.noSuchEmoji); } let driveFile; try { // Create file driveFile = await uploadFromUrl({ url: emoji.originalUrl, user: null, force: true }); } catch (e) { throw new ApiError(); } const size = await getEmojiSize(driveFile.url); const copied = await Emojis.insert({ id: genId(), updatedAt: new Date(), name: emoji.name, host: null, aliases: [], originalUrl: driveFile.url, publicUrl: driveFile.webpublicUrl ?? driveFile.url, type: driveFile.webpublicType ?? driveFile.type, license: emoji.license, glyph: emoji.glyph, width: size.width || null, height: size.height || null }).then((x)=>Emojis.findOneByOrFail(x.identifiers[0])); await db.queryResultCache.remove([ "meta_emojis" ]); publishBroadcastStream("emojiAdded", { emoji: await Emojis.pack(copied.id) }); return { id: copied.id }; });