koishi-plugin-yesimbot-extension-sticker-manager
Version:
YesImBot 表情包管理扩展
309 lines (308 loc) • 17.9 kB
JavaScript
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var __decorateClass = (decorators, target, key, kind) => {
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
for (var i = decorators.length - 1, decorator; i >= 0; i--)
if (decorator = decorators[i])
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
if (kind && result) __defProp(target, key, result);
return result;
};
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
var index_exports = {};
__export(index_exports, {
default: () => StickerTools
});
module.exports = __toCommonJS(index_exports);
var import_promises = require("fs/promises");
var import_koishi = require("koishi");
var import_services = require("koishi-plugin-yesimbot/services");
var import_shared = require("koishi-plugin-yesimbot/shared");
var import_service = require("./service");
let StickerTools = class {
constructor(ctx, config) {
this.ctx = ctx;
this.config = config;
if (!StickerTools.serviceInstance) {
StickerTools.serviceInstance = new import_service.StickerService(ctx, config);
}
this.assetService = ctx[import_shared.Services.Asset];
this.stickerService = StickerTools.serviceInstance;
ctx.on("ready", async () => {
await this.stickerService.whenReady();
try {
if (!this.initialized) {
this.initialized = true;
this.stickerService.logger.info("\u63D2\u4EF6\u5DF2\u6210\u529F\u542F\u52A8");
this.registerSnippets();
}
} catch (error) {
this.stickerService.logger.warn("\u63D2\u4EF6\u521D\u59CB\u5316\u5931\u8D25\uFF01");
this.stickerService.logger.error(error);
}
});
ctx.command("sticker.import.emojihub <category> <filePath>", "\u5BFC\u5165 emojihub-bili \u683C\u5F0F\u7684 TXT \u6587\u4EF6", { authority: 3 }).option("prefix", "-p [prefix:string] \u81EA\u5B9A\u4E49 URL \u524D\u7F00").action(async ({ session, options }, category, filePath) => {
if (!category) return "\u8BF7\u6307\u5B9A\u5206\u7C7B\u540D\u79F0";
if (!filePath) return "\u8BF7\u6307\u5B9A TXT \u6587\u4EF6\u8DEF\u5F84";
try {
const stats = await this.stickerService.importEmojiHubTxt(filePath, category, session);
let message = `\u5BFC\u5165\u5B8C\u6210!
`;
message += `\u{1F4C1} \u5206\u7C7B: ${category}
`;
message += `\u{1F4DD} \u6587\u4EF6: ${filePath}
`;
message += `\u2705 \u603B\u6570: ${stats.total}
`;
message += `\u2705 \u6210\u529F\u5BFC\u5165: ${stats.success}
`;
message += `\u274C \u5931\u8D25: ${stats.failed}
`;
if (stats.failedUrls.length > 0) {
message += `
\u5931\u8D25 URL \u5217\u8868:
`;
stats.failedUrls.slice(0, 5).forEach((item, index) => {
message += `${index + 1}. ${item.url} (${item.error})
`;
});
if (stats.failedUrls.length > 5) {
message += `...\u7B49 ${stats.failedUrls.length} \u4E2A\u5931\u8D25\u9879`;
}
}
return message;
} catch (error) {
return `\u5BFC\u5165\u5931\u8D25: ${error.message}`;
}
});
ctx.command(
"sticker.import <sourceDir>",
"\u4ECE\u5916\u90E8\u6587\u4EF6\u5939\u5BFC\u5165\u8868\u60C5\u5305\u3002\u8BE5\u6587\u4EF6\u5939\u987B\u5305\u542B\u82E5\u5E72\u5B50\u6587\u4EF6\u5939\u4F5C\u4E3A\u5206\u7C7B\uFF0C\u5B50\u6587\u4EF6\u5939\u4E0B\u662F\u8868\u60C5\u5305\u7684\u56FE\u7247\u6587\u4EF6\u3002",
{ authority: 3 }
).option("force", "-f \u5F3A\u5236\u8986\u76D6\u5DF2\u5B58\u5728\u7684\u8868\u60C5\u5305").action(async ({ session, options }, sourceDir) => {
if (!sourceDir) return "\u8BF7\u6307\u5B9A\u6E90\u6587\u4EF6\u5939\u8DEF\u5F84";
try {
const stats = await this.stickerService.importFromDirectory(sourceDir, session);
let message = `\u5BFC\u5165\u5B8C\u6210!
`;
message += `\u2705 \u603B\u6570: ${stats.total}
`;
message += `\u2705 \u6210\u529F\u5BFC\u5165: ${stats.success}
`;
message += `\u26A0\uFE0F \u8DF3\u8FC7\u91CD\u590D: ${stats.skipped}
`;
message += `\u274C \u5931\u8D25: ${stats.failed}
`;
if (stats.failedFiles.length > 0) {
message += `
\u5931\u8D25\u6587\u4EF6\u5217\u8868:
${stats.failedFiles.slice(0, 10).join("\n")}`;
if (stats.failedFiles.length > 10) {
message += `
...\u7B49 ${stats.failedFiles.length} \u4E2A\u6587\u4EF6`;
}
}
return message;
} catch (error) {
return `\u5BFC\u5165\u5931\u8D25: ${error.message}`;
}
});
ctx.command("sticker.list", "\u5217\u51FA\u8868\u60C5\u5305\u5206\u7C7B", { authority: 3 }).alias("\u8868\u60C5\u5206\u7C7B").action(async ({ session }) => {
const categories = await this.stickerService.getCategories();
if (categories.length === 0) {
return "\u6682\u65E0\u8868\u60C5\u5305\u5206\u7C7B";
}
const categoryWithCounts = await Promise.all(
categories.map(async (c) => {
const count = await this.stickerService.getStickerCount(c);
return `- ${c} (${count} \u4E2A\u8868\u60C5\u5305)`;
})
);
return `\u{1F4C1} \u8868\u60C5\u5305\u5206\u7C7B\u5217\u8868:
${categoryWithCounts.join("\n")}`;
});
ctx.command("sticker.rename <oldName> <newName>", "\u91CD\u547D\u540D\u8868\u60C5\u5305\u5206\u7C7B", { authority: 3 }).alias("\u8868\u60C5\u91CD\u547D\u540D").action(async ({ session }, oldName, newName) => {
if (!oldName || !newName) return "\u8BF7\u63D0\u4F9B\u539F\u5206\u7C7B\u540D\u548C\u65B0\u5206\u7C7B\u540D";
if (oldName === newName) return "\u65B0\u5206\u7C7B\u540D\u4E0D\u80FD\u4E0E\u539F\u5206\u7C7B\u540D\u76F8\u540C";
try {
const count = await this.stickerService.renameCategory(oldName, newName);
return `\u2705 \u5DF2\u5C06\u5206\u7C7B "${oldName}" \u91CD\u547D\u540D\u4E3A "${newName}"\uFF0C\u5171\u66F4\u65B0 ${count} \u4E2A\u8868\u60C5\u5305`;
} catch (error) {
return `\u274C \u91CD\u547D\u540D\u5931\u8D25: ${error.message}`;
}
});
ctx.command("sticker.delete <category>", "\u5220\u9664\u8868\u60C5\u5305\u5206\u7C7B", { authority: 3 }).alias("\u5220\u9664\u5206\u7C7B").option("force", "-f \u5F3A\u5236\u5220\u9664\uFF0C\u4E0D\u786E\u8BA4").action(async ({ session, options }, category) => {
if (!category) return "\u8BF7\u63D0\u4F9B\u8981\u5220\u9664\u7684\u5206\u7C7B\u540D";
const count = await this.stickerService.getStickerCount(category);
if (count === 0) {
return `\u5206\u7C7B "${category}" \u4E2D\u6CA1\u6709\u4EFB\u4F55\u8868\u60C5\u5305`;
}
if (!options.force) {
const messageId = await session.sendQueued(
`\u26A0\uFE0F \u786E\u5B9A\u8981\u5220\u9664\u5206\u7C7B "${category}" \u5417\uFF1F\u8BE5\u5206\u7C7B\u4E0B\u6709 ${count} \u4E2A\u8868\u60C5\u5305\uFF01
\u56DE\u590D "\u786E\u8BA4\u5220\u9664" \u6765\u786E\u8BA4\u64CD\u4F5C\uFF0C\u6216\u56DE\u590D "\u53D6\u6D88" \u53D6\u6D88\u64CD\u4F5C\u3002`
);
const response = await session.prompt(6e4);
if (response !== "\u786E\u8BA4\u5220\u9664") {
return "\u64CD\u4F5C\u5DF2\u53D6\u6D88";
}
}
try {
const deletedCount = await this.stickerService.deleteCategory(category);
return `\u2705 \u5DF2\u5220\u9664\u5206\u7C7B "${category}"\uFF0C\u5171\u79FB\u9664 ${deletedCount} \u4E2A\u8868\u60C5\u5305`;
} catch (error) {
return `\u274C \u5220\u9664\u5931\u8D25: ${error.message}`;
}
});
ctx.command("sticker.merge <sourceCategory> <targetCategory>", "\u5408\u5E76\u4E24\u4E2A\u8868\u60C5\u5305\u5206\u7C7B", { authority: 3 }).alias("\u5408\u5E76\u5206\u7C7B").action(async ({ session }, sourceCategory, targetCategory) => {
if (!sourceCategory || !targetCategory) return "\u8BF7\u63D0\u4F9B\u6E90\u5206\u7C7B\u548C\u76EE\u6807\u5206\u7C7B";
if (sourceCategory === targetCategory) return "\u6E90\u5206\u7C7B\u548C\u76EE\u6807\u5206\u7C7B\u4E0D\u80FD\u76F8\u540C";
try {
const movedCount = await this.stickerService.mergeCategories(sourceCategory, targetCategory);
return `\u2705 \u5DF2\u5C06\u5206\u7C7B "${sourceCategory}" \u5408\u5E76\u5230 "${targetCategory}"\uFF0C\u5171\u79FB\u52A8 ${movedCount} \u4E2A\u8868\u60C5\u5305`;
} catch (error) {
return `\u274C \u5408\u5E76\u5931\u8D25: ${error.message}`;
}
});
ctx.command("sticker.move <stickerId> <newCategory>", "\u79FB\u52A8\u8868\u60C5\u5305\u5230\u65B0\u5206\u7C7B", { authority: 3 }).alias("\u79FB\u52A8\u8868\u60C5").action(async ({ session }, stickerId, newCategory) => {
if (!stickerId || !newCategory) return "\u8BF7\u63D0\u4F9B\u8868\u60C5\u5305ID\u548C\u76EE\u6807\u5206\u7C7B";
try {
await this.stickerService.moveSticker(stickerId, newCategory);
return `\u2705 \u5DF2\u5C06\u8868\u60C5\u5305 ${stickerId} \u79FB\u52A8\u5230\u5206\u7C7B "${newCategory}"`;
} catch (error) {
return `\u274C \u79FB\u52A8\u5931\u8D25: ${error.message}`;
}
});
ctx.command("sticker.get <category> [index:posint]", "\u83B7\u53D6\u6307\u5B9A\u5206\u7C7B\u7684\u8868\u60C5\u5305").option("all", "-a \u53D1\u9001\u8BE5\u5206\u7C7B\u4E0B\u6240\u6709\u8868\u60C5\u5305").option("delay", "-d [delay:posint] \u53D1\u9001\u6240\u6709\u8868\u60C5\u5305\u65F6\u7684\u5EF6\u65F6 (\u6BEB\u79D2), \u9ED8\u8BA4\u4E3A 500 \u6BEB\u79D2").action(async ({ session, options }, category, index) => {
if (!category) return "\u8BF7\u63D0\u4F9B\u5206\u7C7B\u540D\u79F0";
const stickers = await this.stickerService.getStickersByCategory(category);
if (!stickers.length) return `\u5206\u7C7B "${category}" \u4E2D\u6CA1\u6709\u8868\u60C5\u5305`;
let targetSticker;
if (options.all) {
const delay = options.delay || 500;
for (const sticker of stickers) {
const ext2 = sticker.filePath.split(".").pop();
const b642 = await (0, import_promises.readFile)(sticker.filePath, "base64");
const base64Data2 = `data:image/${ext2};base64,${b642}`;
await session.sendQueued(import_koishi.h.image(base64Data2));
await new Promise((resolve) => setTimeout(resolve, delay));
}
return `\u2705 \u5DF2\u53D1\u9001\u5206\u7C7B "${category}" \u4E0B\u6240\u6709 ${stickers.length} \u4E2A\u8868\u60C5\u5305\u3002`;
} else if (index) {
targetSticker = stickers[index - 1];
if (!targetSticker) return `\u65E0\u6548\u5E8F\u53F7\uFF0C\u8BE5\u5206\u7C7B\u5171\u6709 ${stickers.length} \u4E2A\u8868\u60C5\u5305`;
} else {
targetSticker = stickers[Math.floor(Math.random() * stickers.length)];
}
const ext = targetSticker.filePath.split(".").pop();
const b64 = await (0, import_promises.readFile)(targetSticker.filePath, "base64");
const base64Data = `data:image/${ext};base64,${b64}`;
await session.sendQueued(import_koishi.h.image(base64Data));
return `\u{1F194} ID: ${targetSticker.id}
\u{1F4C1} \u5206\u7C7B: ${category}`;
});
ctx.command("sticker.info <category>", "\u67E5\u770B\u5206\u7C7B\u8BE6\u60C5", { authority: 3 }).action(async ({ session }, category) => {
const stickers = await this.stickerService.getStickersByCategory(category);
if (!stickers.length) return `\u5206\u7C7B "${category}" \u4E2D\u6CA1\u6709\u8868\u60C5\u5305`;
return `\u{1F4C1} \u5206\u7C7B: ${category}
\u{1F4CA} \u6570\u91CF: ${stickers.length}
\u{1F552} \u6700\u65B0: ${stickers[0].createdAt.toLocaleDateString()}
\u{1F446} \u4F7F\u7528: sticker.get ${category} [1-${stickers.length}]`;
});
ctx.command("sticker.cleanup", "\u6E05\u7406\u672A\u4F7F\u7528\u7684\u8868\u60C5\u5305").alias("\u6E05\u7406\u8868\u60C5").action(async ({ session }) => {
try {
const deletedCount = await this.stickerService.cleanupUnreferenced();
return `\u2705 \u5DF2\u6E05\u7406 ${deletedCount} \u4E2A\u672A\u4F7F\u7528\u7684\u8868\u60C5\u5305`;
} catch (error) {
return `\u274C \u6E05\u7406\u5931\u8D25: ${error.message}`;
}
});
}
assetService;
stickerService;
initialized = false;
registerSnippets() {
const promptService = this.ctx[import_shared.Services.Prompt];
promptService.registerSnippet("sticker.categories", async () => {
const categories = await this.stickerService.getCategories();
return categories.join(", ") || "\u6682\u65E0\u5206\u7C7B\uFF0C\u8BF7\u5148\u6536\u85CF\u8868\u60C5\u5305";
});
}
async stealSticker({ image_id, session }) {
try {
const record = await this.stickerService.stealSticker(image_id, session);
return (0, import_services.Success)({
id: record.id,
category: record.category,
message: `\u5DF2\u5077\u53D6\u8868\u60C5\u5305\u5230\u5206\u7C7B: ${record.category}`
});
} catch (error) {
return (0, import_services.Failed)(`\u5077\u53D6\u5931\u8D25: ${error.message}`);
}
}
async sendRandomSticker({ session, category }) {
try {
const sticker = await this.stickerService.getRandomSticker(category);
if (!sticker) return (0, import_services.Failed)(`\u5206\u7C7B "${category}" \u4E2D\u6CA1\u6709\u8868\u60C5\u5305`);
await session.sendQueued(sticker);
return (0, import_services.Success)({
message: `\u5DF2\u53D1\u9001 ${category} \u5206\u7C7B\u7684\u8868\u60C5\u5305`
});
} catch (error) {
return (0, import_services.Failed)(`\u53D1\u9001\u5931\u8D25: ${error.message}`);
}
}
};
__publicField(StickerTools, "inject", ["database", import_shared.Services.Asset, import_shared.Services.Model, import_shared.Services.Prompt, import_shared.Services.Tool]);
__publicField(StickerTools, "Config", import_koishi.Schema.object({
storagePath: import_koishi.Schema.path({ allowCreate: true, filters: ["directory"] }).default("data/yesimbot/sticker").description("\u8868\u60C5\u5305\u5B58\u50A8\u8DEF\u5F84"),
classifiModel: import_koishi.Schema.dynamic("modelService.selectableModels").description("\u7528\u4E8E\u8868\u60C5\u5206\u7C7B\u7684\u591A\u6A21\u6001\u6A21\u578B"),
classificationPrompt: import_koishi.Schema.string().role("textarea", { rows: [2, 4] }).default(
"\u8BF7\u5BF9\u4EE5\u4E0B\u8868\u60C5\u5305\u8FDB\u884C\u5206\u7C7B\uFF0C\u5DF2\u6709\u5206\u7C7B\uFF1A[{{categories}}]\u3002\u9009\u62E9\u6700\u5339\u914D\u7684\u5206\u7C7B\u6216\u521B\u5EFA\u65B0\u7C7B\u522B\u3002\u53EA\u8FD4\u56DE\u5206\u7C7B\u540D\u79F0\u3002\u5206\u7C7B\u5E94\u57FA\u4E8E\u53EF\u80FD\u7684\u4F7F\u7528\u8BED\u5883\uFF08\u4F8B\u5982\uFF1A\u5DE5\u4F5C\u3001\u4F11\u95F2\u3001\u8282\u65E5\uFF09\uFF0C\u907F\u514D\u6A21\u7CCA\u4E0D\u6E05\u7684\u540D\u79F0\uFF08\u5982\u201C\u8868\u60C5\u5305\u201D\uFF09\u3002\u5C3D\u53EF\u80FD\u8BE6\u7EC6\u5206\u7C7B\uFF08\u5982\u201C\u5E86\u795D\u6210\u529F\u201D\u800C\u975E\u201C\u5FEB\u4E50\u201D\uFF09\u3002\u82E5\u4E0D\u786E\u5B9A\uFF0C\u8BF7\u601D\u8003\u6B64\u8868\u60C5\u5305\u7684\u5177\u4F53\u4F7F\u7528\u573A\u666F\uFF08\u4F8B\u5982\uFF1A\u6211\u5E94\u8BE5\u5728\u4EC0\u4E48\u65F6\u5019\u7528\u5B83\uFF1F\uFF09\u6765\u5E2E\u52A9\u786E\u5B9A\u3002"
).description("\u591A\u6A21\u6001\u5206\u7C7B\u63D0\u793A\u8BCD\u6A21\u677F\uFF0C\u53EF\u4F7F\u7528 {{categories}} \u5360\u4F4D\u7B26\u52A8\u6001\u63D2\u5165\u5206\u7C7B\u5217\u8868")
}));
__publicField(StickerTools, "serviceInstance", null);
__decorateClass([
(0, import_services.Tool)({
name: "steal_sticker",
description: "\u6536\u85CF\u4E00\u4E2A\u8868\u60C5\u5305\u3002\u5F53\u7528\u6237\u53D1\u9001\u8868\u60C5\u5305\u65F6\uFF0C\u8C03\u7528\u6B64\u5DE5\u5177\u5C06\u8868\u60C5\u5305\u4FDD\u5B58\u5230\u672C\u5730\u5E76\u5206\u7C7B\u3002\u5206\u7C7B\u540E\u4F60\u4E5F\u53EF\u4EE5\u4F7F\u7528\u8FD9\u4E9B\u8868\u60C5\u5305\u3002",
parameters: import_koishi.Schema.object({
image_id: import_koishi.Schema.string().required().description("\u8981\u5077\u53D6\u7684\u8868\u60C5\u56FE\u7247ID")
})
})
], StickerTools.prototype, "stealSticker", 1);
__decorateClass([
(0, import_services.Tool)({
name: "send_sticker",
description: "\u53D1\u9001\u4E00\u4E2A\u8868\u60C5\u5305\uFF0C\u7528\u4E8E\u8F85\u52A9\u8868\u8FBE\u60C5\u611F\uFF0C\u7ED3\u5408\u8BED\u5883\u914C\u60C5\u4F7F\u7528\u3002",
parameters: import_koishi.Schema.object({
category: import_koishi.Schema.string().required().description("\u8868\u60C5\u5305\u5206\u7C7B\u540D\u79F0\u3002\u5F53\u524D\u53EF\u7528\u5206\u7C7B: {{ sticker.categories }}")
})
})
], StickerTools.prototype, "sendRandomSticker", 1);
StickerTools = __decorateClass([
(0, import_services.Extension)({
name: "sticker-manager",
display: "\u8868\u60C5\u5305\u7BA1\u7406",
description: "\u7528\u4E8E\u5077\u53D6\u548C\u53D1\u9001\u8868\u60C5\u5305",
author: "HydroGest",
version: "1.0.0"
})
], StickerTools);
//# sourceMappingURL=index.js.map