Files
2026-07-26 18:25:37 +09:00

91 lines
2.4 KiB
JavaScript

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
};
});