UNPKG

@yamabuki/koishi-plugin-pjsk-stamp-maker

Version:

koishi-plugin-pjsk-stamp-maker改版,使用skia-canvas替代koishi-plugin-canvas

130 lines (126 loc) 5.6 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Config = exports.usage = exports.name = void 0; exports.apply = apply; const koishi_1 = require("koishi"); const utils_1 = require("./utils"); const draw_1 = require("./draw"); const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); exports.name = 'pjsk-stamp-maker'; const logger = new koishi_1.Logger('pjskstampMaker'); //language=markdown exports.usage = `## 🎮 使用 ### 步骤 1. 在 Koishi 默认根目录下,安装 ./data/pjsk/fonts 文件夹内的两个字体。 2. 启动插件,并使用 pjsk.baseImageList 指令生成表情包 ID 列表。 ### 补充机制 - 可以使用 文本.jpg、文本.jpeg 或 文本.png 来触发绘制,例如:喵喵喵.jpg。 - 当底图设置为 -1 时,将会随机挑选底图进行绘制。 `; exports.Config = koishi_1.Schema.object({}); function apply(context, config) { //拓展user表 context.model.extend('user', { 'pjskStampId': { type: 'integer', initial: -1 } }); const dependencyPjskDir = path_1.default.join(__dirname, '..', 'pjsk'); const pluginDataDir = path_1.default.join(context.baseDir, 'data', 'pjsk'); let baseImages = []; //初始化 async function copyFile() { // 将资源文件存到data目录下 fs_1.default.cp(dependencyPjskDir, pluginDataDir, { recursive: true, force: false }, (err) => { if (err) { logger.error('复制 pjsk 文件夹出错:' + err.message); } }); } copyFile().then(() => { baseImages = (0, utils_1.loadBaseImage)(path_1.default.join(pluginDataDir, 'baseImage.json')); }); // 底图目录命令 context.command('pjsk.baseImage [baseImageId:integer]', '切换表情包底图ID') .userFields(['pjskStampId']) .alias('底图') .example(`'底图 52' 切换使用底52号底图绘制表情包\n底图列表请使用指令 '底图目录'或'底图列表'`) .action(async ({ session }, baseImageId) => { // 检查底图ID是否在有效范围内 const isValidBaseImage = baseImageId >= -1 && baseImageId < baseImages.length; if (!isValidBaseImage) { await session.send('底图ID无效,请输入有效的底图ID'); return; } session.user.pjskStampId = baseImageId; await session.send(`已将底图ID设置为 ${baseImageId}`); }); // 绘制图像密令 context.command('pjsk.draw <inputText:text>', '绘制表情包') .shortcut(/^([\s\S]+)\.jpg$/gm, { args: ['$1'] }) .shortcut(/^([\s\S]+)\.jpeg$/gm, { args: ['$1'] }) .shortcut(/^([\s\S]+)\.png$/gm, { args: ['$1'] }) .example(`'Wonderhoi!.jpg' 或 'pjsk draw Wonderhoi!.jpg'`) .userFields(['pjskStampId']) .action(async ({ session }, inputText) => { if (inputText === undefined) { session.send('参数输入无效。'); return; } //如果imputText包括'http',则直接返回 if (inputText.includes('http')) { return; } //将inputText的'_'替换为' ' inputText = inputText.replace(/_/g, ' '); logger.info(inputText); let baseImageId = session.user.pjskStampId; // 如果是-1,则随机选择一个表情包 if (baseImageId === -1) { baseImageId = koishi_1.Random.int(0, baseImages.length - 1); } const buffer = await (0, draw_1.draw)(context, baseImages, inputText, baseImageId); await session.send(koishi_1.h.image(buffer, 'image/png')); }); context.command('pjsk.baseImageList', '绘制表情包可用底图列表') .alias('底图目录') .alias('底图列表') .action(async ({ session }) => { //检查是否有缓存 if (fs_1.default.existsSync(path_1.default.join(pluginDataDir, 'baseImageList.png'))) { await session.send(koishi_1.h.image(fs_1.default.readFileSync(path_1.default.join(pluginDataDir, 'baseImageList.png')), 'image/png')); return; } else { const buffer = await (0, draw_1.drawBaseImageList)(context, baseImages); fs_1.default.writeFileSync(path_1.default.join(pluginDataDir, 'baseImageList.png'), buffer); await session.send(koishi_1.h.image(buffer, 'image/png')); return; } }); // context // .command('test') // .option('fontfamily', '-f <font:text>') // .action(async ({ session, options }) => { // const canvas = new context.skia.Canvas(100, 100) // const ctx1 = canvas.getContext('2d') // ctx1.fillStyle = '#ffffff' // ctx1.fillRect(0, 0, 100, 100) // ctx1.fillStyle = '#000000' // ctx1.font = `20px ${options.fontfamily || 'sans-serif'}` // ctx1.textBaseline = 'top' // ctx1.fillText('aaaaa', 0, 50) // logger.info('绘制', options.fontfamily || 'sans-serif') // return h.image(await canvas.toBuffer('png'), 'image/png') // }) // context.command('fonts [str:text]').action(async (args, str) => { // let fonts = context.skia.FontLibrary.families // if (str) { // fonts = fonts.filter(font => font.includes(str)) // } // logger.info('Available fonts:', fonts) // return JSON.stringify(fonts) // }) }