import define from "../../../define.js"; import { Emojis, DriveFiles } from "../../../../../models/index.js"; import { genId } from "../../../../../misc/gen-id.js"; import { insertModerationLog } from "../../../../../services/insert-moderation-log.js"; import { ApiError } from "../../../error.js"; import rndstr from "rndstr"; 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: { noSuchFile: { message: "No such file.", code: "MO_SUCH_FILE", id: "fc46b5a4-6b92-4c33-ac66-b806659bb5cf" } } }; export const paramDef = { type: "object", properties: { fileId: { type: "string", format: "misskey:id" } }, required: [ "fileId" ] }; export default define(meta, paramDef, async (ps, me)=>{ const file = await DriveFiles.findOneBy({ id: ps.fileId }); if (file == null) throw new ApiError(meta.errors.noSuchFile); const name = file.name.split(".")[0].match(/^[a-z0-9_]+$/) ? file.name.split(".")[0] : `_${rndstr("a-z0-9", 8)}_`; const size = await getEmojiSize(file.url); const emoji = await Emojis.insert({ id: genId(), updatedAt: new Date(), name: name, category: null, host: null, aliases: [], originalUrl: file.url, publicUrl: file.webpublicUrl ?? file.url, type: file.webpublicType ?? file.type, license: null, glyph: file.type === "image/svg+xml", 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(emoji.id) }); insertModerationLog(me, "addEmoji", { emojiId: emoji.id }); return { id: emoji.id }; });