UNPKG

koishi-plugin-yesimbot-extension-sticker-manager

Version:
309 lines (308 loc) 17.9 kB
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