koishi-plugin-echo-cave 1.29.11 → 1.29.12
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.cjs +84 -42
- package/package.json +3 -3
package/lib/index.cjs
CHANGED
|
@@ -34239,7 +34239,13 @@ async function mutateMessageContent(ctx, content, handler) {
|
|
|
34239
34239
|
}
|
|
34240
34240
|
async function processStoredMessageMedia(ctx, content, cfg, channelId, progressOptions) {
|
|
34241
34241
|
const rewritten = await mutateMessageContent(ctx, content, async (element) => {
|
|
34242
|
-
return await processMediaElement(
|
|
34242
|
+
return await processMediaElement(
|
|
34243
|
+
ctx,
|
|
34244
|
+
element,
|
|
34245
|
+
cfg,
|
|
34246
|
+
channelId,
|
|
34247
|
+
progressOptions
|
|
34248
|
+
);
|
|
34243
34249
|
});
|
|
34244
34250
|
return rewritten.content;
|
|
34245
34251
|
}
|
|
@@ -34298,7 +34304,9 @@ async function deleteCavesForOversizedMedia(ctx, caves, cfg) {
|
|
|
34298
34304
|
await removeCaveByEntryId(ctx, cave.entryId);
|
|
34299
34305
|
ctx.logger.info(`Deleted cave #${cave.id} because its media exceeded the size limit.`);
|
|
34300
34306
|
} catch (error2) {
|
|
34301
|
-
ctx.logger.warn(
|
|
34307
|
+
ctx.logger.warn(
|
|
34308
|
+
`Failed to delete cave #${cave.id} during oversized media cleanup: ${error2}`
|
|
34309
|
+
);
|
|
34302
34310
|
}
|
|
34303
34311
|
}
|
|
34304
34312
|
}
|
|
@@ -35534,7 +35542,9 @@ async function restoreReindexBackup(ctx, session, cfg, backupPathInput) {
|
|
|
35534
35542
|
}
|
|
35535
35543
|
async function runScheduledReindex(ctx, cfg) {
|
|
35536
35544
|
if (caveMaintenanceLock) {
|
|
35537
|
-
ctx.logger.warn(
|
|
35545
|
+
ctx.logger.warn(
|
|
35546
|
+
"Skipped scheduled cave reindex because another maintenance task is running."
|
|
35547
|
+
);
|
|
35538
35548
|
return;
|
|
35539
35549
|
}
|
|
35540
35550
|
const caves = (await getAllCaves(ctx)).sort((a5, b5) => a5.id - b5.id);
|
|
@@ -35594,7 +35604,13 @@ function registerAutoReindexScheduler(ctx, cfg) {
|
|
|
35594
35604
|
async function reconstructForwardMsg(ctx, session, message, cfg, processMedia = true) {
|
|
35595
35605
|
return Promise.all(
|
|
35596
35606
|
message.map(async (msg) => {
|
|
35597
|
-
const content = await processForwardMessageContent(
|
|
35607
|
+
const content = await processForwardMessageContent(
|
|
35608
|
+
ctx,
|
|
35609
|
+
session,
|
|
35610
|
+
msg,
|
|
35611
|
+
cfg,
|
|
35612
|
+
processMedia
|
|
35613
|
+
);
|
|
35598
35614
|
const senderNickname = msg.sender.nickname;
|
|
35599
35615
|
let senderUserId = msg.sender.user_id;
|
|
35600
35616
|
senderUserId = senderUserId === 1094950020 ? await getUserIdFromNickname(session, senderNickname, senderUserId) : senderUserId;
|
|
@@ -35677,13 +35693,7 @@ async function addCave(ctx, session, cfg, userIds) {
|
|
|
35677
35693
|
if (quote.elements[0].type === "forward") {
|
|
35678
35694
|
type = "forward";
|
|
35679
35695
|
rawForwardMessage = await session.onebot.getForwardMsg(messageId);
|
|
35680
|
-
const message = await reconstructForwardMsg(
|
|
35681
|
-
ctx,
|
|
35682
|
-
session,
|
|
35683
|
-
rawForwardMessage,
|
|
35684
|
-
cfg,
|
|
35685
|
-
false
|
|
35686
|
-
);
|
|
35696
|
+
const message = await reconstructForwardMsg(ctx, session, rawForwardMessage, cfg, false);
|
|
35687
35697
|
hasMedia = await messageContainsMedia(message);
|
|
35688
35698
|
needsDeferredMediaProcessing = true;
|
|
35689
35699
|
content = JSON.stringify(message);
|
|
@@ -35744,7 +35754,13 @@ async function addCave(ctx, session, cfg, userIds) {
|
|
|
35744
35754
|
session,
|
|
35745
35755
|
cfg,
|
|
35746
35756
|
hasMedia,
|
|
35747
|
-
async (progressOptions) => await processStoredMessageMedia(
|
|
35757
|
+
async (progressOptions) => await processStoredMessageMedia(
|
|
35758
|
+
ctx,
|
|
35759
|
+
content,
|
|
35760
|
+
cfg,
|
|
35761
|
+
channelId,
|
|
35762
|
+
progressOptions
|
|
35763
|
+
)
|
|
35748
35764
|
);
|
|
35749
35765
|
}
|
|
35750
35766
|
const finalParsedUserIds = selectedUsersWithNames.length !== 0 ? selectedUsersWithNames.map((user) => user.userId) : parsedUserIds;
|
|
@@ -35791,7 +35807,9 @@ async function formatRelatedUsers(ctx, session, selectedUsersWithNames, relatedU
|
|
|
35791
35807
|
}
|
|
35792
35808
|
if (relatedUserIds.length !== 0) {
|
|
35793
35809
|
const relatedUserNames = await Promise.all(
|
|
35794
|
-
relatedUserIds.map(
|
|
35810
|
+
relatedUserIds.map(
|
|
35811
|
+
async (relatedUserId) => await getUserName(ctx, session, relatedUserId)
|
|
35812
|
+
)
|
|
35795
35813
|
);
|
|
35796
35814
|
return relatedUserNames.join(", ");
|
|
35797
35815
|
}
|
|
@@ -35823,7 +35841,11 @@ async function markForwardSelectionGuideCompleted(ctx, userId) {
|
|
|
35823
35841
|
});
|
|
35824
35842
|
return;
|
|
35825
35843
|
}
|
|
35826
|
-
await ctx.database.set(
|
|
35844
|
+
await ctx.database.set(
|
|
35845
|
+
"echo_cave_user_state",
|
|
35846
|
+
{ userId },
|
|
35847
|
+
{ hasCompletedForwardSelection: true }
|
|
35848
|
+
);
|
|
35827
35849
|
}
|
|
35828
35850
|
async function selectRelatedUsers(ctx, session, cfg, forwardUsers) {
|
|
35829
35851
|
const hasCompletedGuide = await getForwardSelectionGuideCompleted(ctx, session.userId);
|
|
@@ -35859,7 +35881,9 @@ ${promptFooter}`;
|
|
|
35859
35881
|
selectedUsers = validIndices.map((index) => forwardUsers[index]);
|
|
35860
35882
|
} else {
|
|
35861
35883
|
sentMessageIds.push(
|
|
35862
|
-
...normalizeMessageIds(
|
|
35884
|
+
...normalizeMessageIds(
|
|
35885
|
+
await session.send(session.text(".invalidSelection"))
|
|
35886
|
+
)
|
|
35863
35887
|
);
|
|
35864
35888
|
return true;
|
|
35865
35889
|
}
|
|
@@ -35913,7 +35937,9 @@ async function confirmSpecialForwardStorage(ctx, session, previewMessage) {
|
|
|
35913
35937
|
return false;
|
|
35914
35938
|
}
|
|
35915
35939
|
sentMessageIds.push(
|
|
35916
|
-
...normalizeMessageIds(
|
|
35940
|
+
...normalizeMessageIds(
|
|
35941
|
+
await session.send(session.text(".specialForwardUserConfirmRetry"))
|
|
35942
|
+
)
|
|
35917
35943
|
);
|
|
35918
35944
|
return true;
|
|
35919
35945
|
},
|
|
@@ -36003,7 +36029,9 @@ async function deleteCaves(ctx, session, cfg, ids) {
|
|
|
36003
36029
|
}
|
|
36004
36030
|
const failedIds = [];
|
|
36005
36031
|
const actor = await getDeleteActor(ctx, session);
|
|
36006
|
-
const caves = (await getCavesByPublicIds(ctx, ids)).filter(
|
|
36032
|
+
const caves = (await getCavesByPublicIds(ctx, ids)).filter(
|
|
36033
|
+
(cave) => cave.channelId === session.channelId
|
|
36034
|
+
);
|
|
36007
36035
|
for (const cave of caves) {
|
|
36008
36036
|
const permissionFailure = await getDeletePermissionFailure(ctx, session, cfg, cave, actor);
|
|
36009
36037
|
if (permissionFailure) {
|
|
@@ -36080,7 +36108,9 @@ async function handleDailyReportOnFailure(ctx, session, caveMsg, cfg, errorMessa
|
|
|
36080
36108
|
});
|
|
36081
36109
|
} catch (recordError) {
|
|
36082
36110
|
const recordErrorMessage = normalizeErrorMessage(ctx, recordError);
|
|
36083
|
-
ctx.logger.error(
|
|
36111
|
+
ctx.logger.error(
|
|
36112
|
+
`Failed to record cave send failure for #${caveMsg.id}: ${recordErrorMessage}`
|
|
36113
|
+
);
|
|
36084
36114
|
return session.text("commands.cave.messages.sendFailedReportRecordFailed", {
|
|
36085
36115
|
id: caveMsg.id
|
|
36086
36116
|
});
|
|
@@ -36109,7 +36139,9 @@ function scheduleNextSendFailureSummary(ctx, cfg) {
|
|
|
36109
36139
|
try {
|
|
36110
36140
|
await flushSendFailureSummary(ctx, cfg);
|
|
36111
36141
|
} catch (error2) {
|
|
36112
|
-
ctx.logger.error(
|
|
36142
|
+
ctx.logger.error(
|
|
36143
|
+
`Failed to flush cave send failure summary: ${normalizeErrorMessage(ctx, error2)}`
|
|
36144
|
+
);
|
|
36113
36145
|
}
|
|
36114
36146
|
scheduleNextSendFailureSummary(ctx, cfg);
|
|
36115
36147
|
}, delay);
|
|
@@ -36117,7 +36149,9 @@ function scheduleNextSendFailureSummary(ctx, cfg) {
|
|
|
36117
36149
|
async function flushSendFailureSummary(ctx, cfg) {
|
|
36118
36150
|
const adminId = cfg.sendFailureSummaryAdminId?.trim();
|
|
36119
36151
|
if (!adminId) {
|
|
36120
|
-
ctx.logger.warn(
|
|
36152
|
+
ctx.logger.warn(
|
|
36153
|
+
"Skipped cave send failure summary because sendFailureSummaryAdminId is empty."
|
|
36154
|
+
);
|
|
36121
36155
|
return;
|
|
36122
36156
|
}
|
|
36123
36157
|
const failures = await ctx.database.get("echo_cave_send_failure", {});
|
|
@@ -36129,7 +36163,9 @@ async function flushSendFailureSummary(ctx, cfg) {
|
|
|
36129
36163
|
const [platform, selfId] = botKey.split(":");
|
|
36130
36164
|
const bot = ctx.bots.find((item) => item.platform === platform && item.selfId === selfId);
|
|
36131
36165
|
if (!bot) {
|
|
36132
|
-
ctx.logger.warn(
|
|
36166
|
+
ctx.logger.warn(
|
|
36167
|
+
`Skipped cave send failure summary because bot ${botKey} is unavailable.`
|
|
36168
|
+
);
|
|
36133
36169
|
continue;
|
|
36134
36170
|
}
|
|
36135
36171
|
const messages = buildSummaryMessages(ctx, entries);
|
|
@@ -36528,7 +36564,11 @@ async function getCave(ctx, session, cfg, target) {
|
|
|
36528
36564
|
if (parseResult.parsedUserIds.length === 0) {
|
|
36529
36565
|
return session.text("echo-cave.general.noMsgWithId");
|
|
36530
36566
|
}
|
|
36531
|
-
const targetedResult = await getTargetedUserCave(
|
|
36567
|
+
const targetedResult = await getTargetedUserCave(
|
|
36568
|
+
ctx,
|
|
36569
|
+
session,
|
|
36570
|
+
parseResult.parsedUserIds[0]
|
|
36571
|
+
);
|
|
36532
36572
|
if (!targetedResult) {
|
|
36533
36573
|
return session.text(".noMatchingUserCave");
|
|
36534
36574
|
}
|
|
@@ -36579,9 +36619,13 @@ async function bindUsersToCave(ctx, session, id, userIds) {
|
|
|
36579
36619
|
if (!isAllUsersInGroup) {
|
|
36580
36620
|
return session.text("echo-cave.user.userNotInGroup");
|
|
36581
36621
|
}
|
|
36582
|
-
await ctx.database.set(
|
|
36583
|
-
|
|
36584
|
-
|
|
36622
|
+
await ctx.database.set(
|
|
36623
|
+
ACTIVE_CAVE_TABLE,
|
|
36624
|
+
{ entryId: cave.entryId },
|
|
36625
|
+
{
|
|
36626
|
+
relatedUsers: parsedUserIds
|
|
36627
|
+
}
|
|
36628
|
+
);
|
|
36585
36629
|
return session.text(".userBoundSuccess", [id]);
|
|
36586
36630
|
}
|
|
36587
36631
|
|
|
@@ -37094,7 +37138,9 @@ var Config = import_koishi2.Schema.intersect([
|
|
|
37094
37138
|
enableForwardUserSelection: import_koishi2.Schema.boolean().default(true),
|
|
37095
37139
|
forwardSelectTimeout: import_koishi2.Schema.number().default(20),
|
|
37096
37140
|
autoBindSingleForwardUser: import_koishi2.Schema.boolean().default(false),
|
|
37097
|
-
forwardSpecialUserHandlingMode: import_koishi2.Schema.union(["ignore", "reject", "confirm"]).default(
|
|
37141
|
+
forwardSpecialUserHandlingMode: import_koishi2.Schema.union(["ignore", "reject", "confirm"]).default(
|
|
37142
|
+
"ignore"
|
|
37143
|
+
)
|
|
37098
37144
|
}).description("\u6D88\u606F\u884C\u4E3A"),
|
|
37099
37145
|
import_koishi2.Schema.object({
|
|
37100
37146
|
deleteMediaWhenDeletingMsg: import_koishi2.Schema.boolean().default(true),
|
|
@@ -37118,7 +37164,9 @@ var Config = import_koishi2.Schema.intersect([
|
|
|
37118
37164
|
s3PresignExpiresIn: import_koishi2.Schema.number().default(3600).min(60).max(604800)
|
|
37119
37165
|
}).description("\u5A92\u4F53\u5B58\u50A8"),
|
|
37120
37166
|
import_koishi2.Schema.object({
|
|
37121
|
-
sendFailureHandlingMode: import_koishi2.Schema.union(["auto-delete", "daily-report", "ignore"]).default(
|
|
37167
|
+
sendFailureHandlingMode: import_koishi2.Schema.union(["auto-delete", "daily-report", "ignore"]).default(
|
|
37168
|
+
"ignore"
|
|
37169
|
+
),
|
|
37122
37170
|
sendFailureSummaryAdminId: import_koishi2.Schema.string().default(""),
|
|
37123
37171
|
sendFailureSummaryTime: import_koishi2.Schema.string().default("09:00")
|
|
37124
37172
|
}).description("\u53D1\u9001\u5931\u8D25\u5904\u7406"),
|
|
@@ -37241,22 +37289,16 @@ function apply(ctx, cfg) {
|
|
|
37241
37289
|
await database.upsert("echo_cave_v2", data2);
|
|
37242
37290
|
}
|
|
37243
37291
|
);
|
|
37244
|
-
ctx.model.migrate(
|
|
37245
|
-
|
|
37246
|
-
{
|
|
37247
|
-
|
|
37248
|
-
},
|
|
37249
|
-
async (database) => {
|
|
37250
|
-
const existing = await database.get(ACTIVE_CAVE_TABLE, {});
|
|
37251
|
-
if (existing.length > 0) {
|
|
37252
|
-
return;
|
|
37253
|
-
}
|
|
37254
|
-
const data2 = (await database.get("echo_cave_v2", {})).sort((a5, b5) => a5.id - b5.id);
|
|
37255
|
-
for (const record of data2) {
|
|
37256
|
-
await database.create(ACTIVE_CAVE_TABLE, toV3Record(record));
|
|
37257
|
-
}
|
|
37292
|
+
ctx.model.migrate("echo_cave_v2", {}, async (database) => {
|
|
37293
|
+
const existing = await database.get(ACTIVE_CAVE_TABLE, {});
|
|
37294
|
+
if (existing.length > 0) {
|
|
37295
|
+
return;
|
|
37258
37296
|
}
|
|
37259
|
-
|
|
37297
|
+
const data2 = (await database.get("echo_cave_v2", {})).sort((a5, b5) => a5.id - b5.id);
|
|
37298
|
+
for (const record of data2) {
|
|
37299
|
+
await database.create(ACTIVE_CAVE_TABLE, toV3Record(record));
|
|
37300
|
+
}
|
|
37301
|
+
});
|
|
37260
37302
|
ctx.command("cave [target:text]").action(
|
|
37261
37303
|
async ({ session }, target) => await getCave(ctx, session, cfg, target)
|
|
37262
37304
|
);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "koishi-plugin-echo-cave",
|
|
3
3
|
"description": "Group echo cave",
|
|
4
|
-
"version": "1.29.
|
|
4
|
+
"version": "1.29.12",
|
|
5
5
|
"main": "lib/index.cjs",
|
|
6
6
|
"typings": "lib/index.d.ts",
|
|
7
7
|
"type": "module",
|
|
@@ -51,8 +51,8 @@
|
|
|
51
51
|
"@types/node": "^24.12.2",
|
|
52
52
|
"conventional-changelog-conventionalcommits": "^9.3.1",
|
|
53
53
|
"esbuild": "^0.28.0",
|
|
54
|
-
"oxfmt": "^0.
|
|
55
|
-
"oxlint": "^1.
|
|
54
|
+
"oxfmt": "^0.45.0",
|
|
55
|
+
"oxlint": "^1.60.0",
|
|
56
56
|
"semantic-release": "^25.0.3",
|
|
57
57
|
"typescript": "^6.0.2"
|
|
58
58
|
}
|