koishi-plugin-imgdraw-selfuse 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.js +54 -4
- package/package.json +2 -2
package/lib/index.js
CHANGED
|
@@ -440,6 +440,37 @@ async function apply(ctx, cfg) {
|
|
|
440
440
|
deleteAllCachedFiles(imageUrls);
|
|
441
441
|
}
|
|
442
442
|
}
|
|
443
|
+
// ==================== 新增:处理带图片的合并消息 ====================
|
|
444
|
+
async function processImg2ImgWithImages(session, prompt, images) {
|
|
445
|
+
const assets = ctx.assets;
|
|
446
|
+
if (!assets) {
|
|
447
|
+
await safeSend(session, cfg.messages.needAssets);
|
|
448
|
+
return;
|
|
449
|
+
}
|
|
450
|
+
// 上传所有图片
|
|
451
|
+
const uploadResults = await Promise.allSettled(images.map(img => assets.upload(img.attrs.src, 'ref_image.jpg')));
|
|
452
|
+
const imageUrls = [];
|
|
453
|
+
for (const res of uploadResults) {
|
|
454
|
+
if (res.status === 'fulfilled' && /^https?:\/\//.test(res.value)) {
|
|
455
|
+
imageUrls.push(res.value);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
if (imageUrls.length === 0) {
|
|
459
|
+
await safeSend(session, cfg.messages.needAssets);
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
// 限制图片数量
|
|
463
|
+
const finalUrls = imageUrls.slice(0, cfg.maxImages);
|
|
464
|
+
if (finalUrls.length < imageUrls.length) {
|
|
465
|
+
logger.warn(`图片数量超过限制,已截取前 ${cfg.maxImages} 张`);
|
|
466
|
+
}
|
|
467
|
+
// 构建 prompt
|
|
468
|
+
const finalPrompt = cfg.img2imgPrompt
|
|
469
|
+
.replace('{url}', finalUrls.join(', '))
|
|
470
|
+
.replace('{prompt}', prompt);
|
|
471
|
+
await safeSend(session, cfg.messages.generating);
|
|
472
|
+
await generateWithMultipleImages(session, finalPrompt, finalUrls, cfg.img2imgModel || cfg.model);
|
|
473
|
+
}
|
|
443
474
|
// ==================== 命令注册 ====================
|
|
444
475
|
const cmd = ctx.command(`${cfg.command} <raw:text>`, 'draw');
|
|
445
476
|
cfg.aliases.forEach((alias) => cmd.alias(alias));
|
|
@@ -464,8 +495,10 @@ async function apply(ctx, cfg) {
|
|
|
464
495
|
await safeSend(session, cfg.messages.fail);
|
|
465
496
|
}
|
|
466
497
|
});
|
|
498
|
+
// ==================== 修改:图生图命令支持合并消息 ====================
|
|
467
499
|
const imgCmd = ctx.command(`${cfg.img2imgCommand} <raw:text>`, 'imgdraw');
|
|
468
500
|
cfg.img2imgAliases.forEach((alias) => imgCmd.alias(alias));
|
|
501
|
+
// 修改 action 以支持检测消息中的图片
|
|
469
502
|
imgCmd.action(async ({ session }, raw) => {
|
|
470
503
|
try {
|
|
471
504
|
if (!session)
|
|
@@ -474,12 +507,28 @@ async function apply(ctx, cfg) {
|
|
|
474
507
|
return safeSend(session, cfg.messages.blacklisted);
|
|
475
508
|
if (!cfg.enableImg2Img)
|
|
476
509
|
return safeSend(session, cfg.messages.img2imgDisabled);
|
|
477
|
-
const assets = ctx.assets;
|
|
478
|
-
if (!assets)
|
|
479
|
-
return safeSend(session, cfg.messages.needAssets);
|
|
480
510
|
const prompt = cleanHtmlTags(raw || '');
|
|
511
|
+
// 检查消息中是否包含图片(QQ 合并消息)
|
|
512
|
+
const messageImages = session.elements ? koishi_1.h.select(session.elements, 'img') : [];
|
|
513
|
+
if (messageImages.length > 0) {
|
|
514
|
+
// 合并消息:同时包含文字和图片,直接处理
|
|
515
|
+
if (debug)
|
|
516
|
+
logger.info(`检测到合并消息,包含 ${messageImages.length} 张图片`);
|
|
517
|
+
if (!prompt) {
|
|
518
|
+
// 如果没有文字 prompt,使用默认提示
|
|
519
|
+
await processImg2ImgWithImages(session, '请根据图片内容进行编辑', messageImages);
|
|
520
|
+
}
|
|
521
|
+
else {
|
|
522
|
+
await processImg2ImgWithImages(session, prompt, messageImages);
|
|
523
|
+
}
|
|
524
|
+
return;
|
|
525
|
+
}
|
|
526
|
+
// 传统模式:只发送了文字,进入等待图片状态
|
|
481
527
|
if (!prompt)
|
|
482
528
|
return safeSend(session, cfg.messages.empty);
|
|
529
|
+
const assets = ctx.assets;
|
|
530
|
+
if (!assets)
|
|
531
|
+
return safeSend(session, cfg.messages.needAssets);
|
|
483
532
|
const key = `${session.guildId || 'private'}-${session.userId}`;
|
|
484
533
|
if (waitingMap.has(key)) {
|
|
485
534
|
return safeSend(session, cfg.messages.alreadyWaiting);
|
|
@@ -505,7 +554,7 @@ async function apply(ctx, cfg) {
|
|
|
505
554
|
await safeSend(session, cfg.messages.fail);
|
|
506
555
|
}
|
|
507
556
|
});
|
|
508
|
-
//
|
|
557
|
+
// ==================== 修改:消息监听支持追加图片 ====================
|
|
509
558
|
ctx.on('message', async (session) => {
|
|
510
559
|
try {
|
|
511
560
|
if (!session.elements)
|
|
@@ -514,6 +563,7 @@ async function apply(ctx, cfg) {
|
|
|
514
563
|
return;
|
|
515
564
|
const key = `${session.guildId || 'private'}-${session.userId}`;
|
|
516
565
|
const task = waitingMap.get(key);
|
|
566
|
+
// 如果没有等待任务,检查是否是新的合并消息(已在上面的 imgCmd action 中处理)
|
|
517
567
|
if (!task)
|
|
518
568
|
return;
|
|
519
569
|
const imgs = koishi_1.h.select(session.elements, 'img');
|
package/package.json
CHANGED