@yamabuki/koishi-plugin-pjsk-stamp-maker
Version:
koishi-plugin-pjsk-stamp-maker改版,使用skia-canvas替代koishi-plugin-canvas
130 lines (126 loc) • 5.6 kB
JavaScript
;
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)
// })
}