koishi-plugin-mcdle 0.3.1 → 0.4.0
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/README.md +1 -1
- package/lib/index.d.ts +2 -2
- package/lib/index.js +45 -33
- package/package.json +1 -1
package/README.md
CHANGED
package/lib/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Context, Schema, Session } from 'koishi';
|
|
2
2
|
import { MobData, BlockData, ItemData } from './data';
|
|
3
3
|
export declare const name = "mcdle";
|
|
4
|
-
export declare const usage = "## \u4F7F\u7528\n\n\u53D1\u9001 `mcdle` \u67E5\u770B\u73A9\u6CD5\u4E0E\u5168\u90E8\u6307\u4EE4\u3002`mcdle.\u731C [\u540D\u79F0]` \u7528\u6709\u6548\u8BCD\u6761\u5F00\u5C40\u6216\u731C\u6D4B\u3002\u9996\u6B21\u731C\u6D4B\u7684\u8BCD\u6761\u51B3\u5B9A\u751F\u7269\u3001\u7269\u54C1\u6216\u65B9\u5757\u6A21\u5F0F\uFF0C\u7CFB\u7EDF\u518D\u4ECE\u540C\u7C7B\u8BCD\u5E93\u4E2D\u62BD\u53D6\u7B54\u6848\u3002\n\n## \
|
|
4
|
+
export declare const usage = "## \u4F7F\u7528\n\n\u53D1\u9001 `mcdle` \u67E5\u770B\u73A9\u6CD5\u4E0E\u5168\u90E8\u6307\u4EE4\u3002`mcdle.\u731C [\u540D\u79F0]` \u7528\u6709\u6548\u8BCD\u6761\u5F00\u5C40\u6216\u731C\u6D4B\u3002\u9996\u6B21\u731C\u6D4B\u7684\u8BCD\u6761\u51B3\u5B9A\u751F\u7269\u3001\u7269\u54C1\u6216\u65B9\u5757\u6A21\u5F0F\uFF0C\u7CFB\u7EDF\u518D\u4ECE\u540C\u7C7B\u8BCD\u5E93\u4E2D\u62BD\u53D6\u7B54\u6848\u3002\n\n## \u6307\u4EE4\n\n| \u6307\u4EE4 | \u8BF4\u660E |\n| --- | --- |\n| `mcdle` | \u73A9\u6CD5\u4E0E\u6307\u4EE4\u8BF4\u660E |\n| `mcdle.\u731C [\u540D\u79F0]` | \u7528\u6709\u6548\u8BCD\u6761\u5F00\u5C40\u6216\u731C\u6D4B |\n| `mcdle.\u88F8\u731C [\u5F00/\u5173]` | \u5F00\u5173\u672C\u9891\u9053\u7684\u65E0\u524D\u7F00\u7EED\u731C |\n| `mcdle.\u6392\u884C\u699C` | \u7FA4\u5185\u6218\u7EE9 |\n| `mcdle.\u8BCD\u5E93` | \u5168\u90E8\u8BCD\u6761 |\n\n## \u63D0\u793A\n\n| \u7B26\u53F7 | \u542B\u4E49 |\n| --- | --- |\n| \uD83D\uDFE9 | \u5B8C\u5168\u5339\u914D |\n| \uD83D\uDFE8 | \u90E8\u5206\u5339\u914D |\n| \uD83D\uDFE5 | \u4E0D\u5339\u914D |\n| \uD83D\uDFE5\u2B06\uFE0F / \uD83D\uDFE5\u2B07\uFE0F | \u7B54\u6848\u66F4\u5927 / \u66F4\u5C0F |";
|
|
5
5
|
export declare const inject: {
|
|
6
6
|
required: string[];
|
|
7
7
|
optional: string[];
|
|
@@ -9,7 +9,7 @@ export declare const inject: {
|
|
|
9
9
|
export interface Config {
|
|
10
10
|
atReply: boolean;
|
|
11
11
|
quoteReply: boolean;
|
|
12
|
-
|
|
12
|
+
enableDirectInput: boolean;
|
|
13
13
|
addStatusTextAfterEmoji: boolean;
|
|
14
14
|
maxRank: number;
|
|
15
15
|
dailyPlayLimit: number;
|
package/lib/index.js
CHANGED
|
@@ -15869,7 +15869,7 @@ function winCard(o) {
|
|
|
15869
15869
|
<div class="sec-t"><span>答 案 档 案</span></div>
|
|
15870
15870
|
<div class="attrs">${attrs}</div>
|
|
15871
15871
|
</div>
|
|
15872
|
-
</div>` + noteRow("mcdle.排行榜
|
|
15872
|
+
</div>` + noteRow("mcdle.排行榜 查看累计战绩");
|
|
15873
15873
|
return shell(body, { accent: meta.accent, width: 720 });
|
|
15874
15874
|
}
|
|
15875
15875
|
__name(winCard, "winCard");
|
|
@@ -15921,14 +15921,14 @@ function helpCard(dailyLimit, allowRepeat, middleware) {
|
|
|
15921
15921
|
<div class="row"><span class="cmd">mcdle.猜 [名称]</span><span class="m">开始一局,或提交猜测</span></div>
|
|
15922
15922
|
<div class="row"><span class="cmd">mcdle.猜</span><span class="m">局中直接使用可回看当前棋盘</span></div>
|
|
15923
15923
|
<div class="row"><span class="cmd">mcdle.裸猜 [开/关]</span><span class="m">临时切换本频道的无前缀续猜</span></div>
|
|
15924
|
-
<div class="row"><span class="cmd">mcdle.排行榜</span><span class="m"
|
|
15924
|
+
<div class="row"><span class="cmd">mcdle.排行榜</span><span class="m">查看累计战绩</span></div>
|
|
15925
15925
|
<div class="row"><span class="cmd">mcdle.词库</span><span class="m">查阅全部候选词条</span></div>
|
|
15926
15926
|
</div></div>
|
|
15927
15927
|
</div>
|
|
15928
15928
|
<div class="sec">
|
|
15929
15929
|
<div class="sec-t"><span>规 则 细 则</span></div>
|
|
15930
15930
|
<div class="panel"><div class="rows">
|
|
15931
|
-
<div class="row"><span class="k">·</span><span
|
|
15931
|
+
<div class="row"><span class="k">·</span><span>每个频道每日可开始 <b>${dailyLimit}</b> 局,跨零点重置。</span></div>
|
|
15932
15932
|
<div class="row"><span class="k">·</span><span>${allowRepeat ? "允许重复提交已经猜过的词条。" : "同一局内不能重复提交已猜过的词条。"}</span></div>
|
|
15933
15933
|
<div class="row"><span class="k">·</span><span>${middleware ? "本频道裸猜已开启:只接受当前模式词库中的完整纯文本词条。" : "本频道裸猜已停用:续猜请用完整指令。"}</span></div>
|
|
15934
15934
|
<div class="row"><span class="k">·</span><span>空指令与词库外名称不会开启新局或消耗额度。</span></div>
|
|
@@ -15942,7 +15942,7 @@ __name(helpCard, "helpCard");
|
|
|
15942
15942
|
function rankCard(entries, shown) {
|
|
15943
15943
|
if (!entries.length) {
|
|
15944
15944
|
const body2 = header(null, "排行榜", { big: "0", cap: "上榜人数" }) + `<div class="pad"><div class="empty">${px("trophy", 44)}
|
|
15945
|
-
|
|
15945
|
+
排行榜还空着<br><span style="font-size:12px">用 <span class="cmd">mcdle.猜 苦力怕</span> 开出第一局,成为榜首</span></div></div>`;
|
|
15946
15946
|
return shell(body2, { accent: accentOf(90), width: 560 });
|
|
15947
15947
|
}
|
|
15948
15948
|
const max = Math.max(...entries.map((e) => e.total), 1);
|
|
@@ -15961,7 +15961,7 @@ function rankCard(entries, shown) {
|
|
|
15961
15961
|
<div class="tot"><div class="n">${e.total}</div><div class="c">猜 中</div></div>
|
|
15962
15962
|
</div>`;
|
|
15963
15963
|
}).join("");
|
|
15964
|
-
const body = header(null, "
|
|
15964
|
+
const body = header(null, "累计战绩 · 按累计猜中排序", { big: `${shown}`, cap: "上榜人数" }) + `<div class="pad"><div class="rank">${rows}</div></div>` + noteRow("每猜中一局记一分,按模式分别计数");
|
|
15965
15965
|
return shell(body, { accent: accentOf(90), width: 560 });
|
|
15966
15966
|
}
|
|
15967
15967
|
__name(rankCard, "rankCard");
|
|
@@ -15972,15 +15972,6 @@ var usage = `## 使用
|
|
|
15972
15972
|
|
|
15973
15973
|
发送 \`mcdle\` 查看玩法与全部指令。\`mcdle.猜 [名称]\` 用有效词条开局或猜测。首次猜测的词条决定生物、物品或方块模式,系统再从同类词库中抽取答案。
|
|
15974
15974
|
|
|
15975
|
-
## 提示
|
|
15976
|
-
|
|
15977
|
-
| 符号 | 含义 |
|
|
15978
|
-
| --- | --- |
|
|
15979
|
-
| 🟩 | 完全匹配 |
|
|
15980
|
-
| 🟨 | 部分匹配 |
|
|
15981
|
-
| 🟥 | 不匹配 |
|
|
15982
|
-
| 🟥⬆️ / 🟥⬇️ | 答案更大 / 更小 |
|
|
15983
|
-
|
|
15984
15975
|
## 指令
|
|
15985
15976
|
|
|
15986
15977
|
| 指令 | 说明 |
|
|
@@ -15989,12 +15980,21 @@ var usage = `## 使用
|
|
|
15989
15980
|
| \`mcdle.猜 [名称]\` | 用有效词条开局或猜测 |
|
|
15990
15981
|
| \`mcdle.裸猜 [开/关]\` | 开关本频道的无前缀续猜 |
|
|
15991
15982
|
| \`mcdle.排行榜\` | 群内战绩 |
|
|
15992
|
-
| \`mcdle.词库\` | 全部词条
|
|
15983
|
+
| \`mcdle.词库\` | 全部词条 |
|
|
15984
|
+
|
|
15985
|
+
## 提示
|
|
15986
|
+
|
|
15987
|
+
| 符号 | 含义 |
|
|
15988
|
+
| --- | --- |
|
|
15989
|
+
| 🟩 | 完全匹配 |
|
|
15990
|
+
| 🟨 | 部分匹配 |
|
|
15991
|
+
| 🟥 | 不匹配 |
|
|
15992
|
+
| 🟥⬆️ / 🟥⬇️ | 答案更大 / 更小 |`;
|
|
15993
15993
|
var inject = { required: ["database"], optional: ["puppeteer"] };
|
|
15994
15994
|
var Config = import_koishi.Schema.object({
|
|
15995
15995
|
atReply: import_koishi.Schema.boolean().default(false).description("回复时 @ 用户。"),
|
|
15996
15996
|
quoteReply: import_koishi.Schema.boolean().default(false).description("回复时引用消息。"),
|
|
15997
|
-
|
|
15997
|
+
enableDirectInput: import_koishi.Schema.boolean().default(false).description("对局中直接发送词条名称即可续猜,无需指令前缀。各频道可用「mcdle.裸猜」临时切换。"),
|
|
15998
15998
|
addStatusTextAfterEmoji: import_koishi.Schema.boolean().default(true).description("在状态方块后补一段文字说明。"),
|
|
15999
15999
|
maxRank: import_koishi.Schema.number().default(10).min(0).description("排行榜最多显示的人数。"),
|
|
16000
16000
|
dailyPlayLimit: import_koishi.Schema.number().default(1).min(1).description("每个频道每日可开始的局数,跨零点重置。"),
|
|
@@ -16108,7 +16108,7 @@ function apply(ctx, cfg) {
|
|
|
16108
16108
|
);
|
|
16109
16109
|
const logger = ctx.logger("mcdle");
|
|
16110
16110
|
const middlewareOverrides = /* @__PURE__ */ new Map();
|
|
16111
|
-
const middlewareOn = /* @__PURE__ */ __name((channelId) => channelId === void 0 ? cfg.
|
|
16111
|
+
const middlewareOn = /* @__PURE__ */ __name((channelId) => channelId === void 0 ? cfg.enableDirectInput : middlewareOverrides.get(channelId) ?? cfg.enableDirectInput, "middlewareOn");
|
|
16112
16112
|
ctx.middleware(async (session, next) => {
|
|
16113
16113
|
if (!session.channelId || !middlewareOn(session.channelId)) return await next();
|
|
16114
16114
|
const guess = getMiddlewareGuess(session);
|
|
@@ -16130,11 +16130,11 @@ function apply(ctx, cfg) {
|
|
|
16130
16130
|
ctx.command("mcdle.猜 [guess:string]", "开局或提交一次猜测").action(async ({ session }, guess) => {
|
|
16131
16131
|
await c(session, guess?.trim());
|
|
16132
16132
|
});
|
|
16133
|
-
ctx.command("mcdle.排行榜", "
|
|
16133
|
+
ctx.command("mcdle.排行榜", "查看累计猜中排行榜").action(async ({ session }) => phb(session));
|
|
16134
16134
|
ctx.command("mcdle.词库", "查阅全部候选词条").action(async ({ session }) => ck(session));
|
|
16135
16135
|
ctx.command("mcdle.裸猜 [state:string]", "开关本频道的无前缀续猜").usage("例:mcdle.裸猜(切换)· mcdle.裸猜 开 · mcdle.裸猜 关 · mcdle.裸猜 状态").action(async ({ session }, state) => {
|
|
16136
16136
|
const result = resolveMiddlewareSwitch(
|
|
16137
|
-
cfg.
|
|
16137
|
+
cfg.enableDirectInput,
|
|
16138
16138
|
session.channelId === void 0 ? void 0 : middlewareOverrides.get(session.channelId),
|
|
16139
16139
|
state
|
|
16140
16140
|
);
|
|
@@ -16150,10 +16150,9 @@ function apply(ctx, cfg) {
|
|
|
16150
16150
|
middlewareSwitchText(result.on, result.override !== void 0, result.reverted)
|
|
16151
16151
|
);
|
|
16152
16152
|
});
|
|
16153
|
-
const RULE = "────────────";
|
|
16154
16153
|
function textCard(title, ...sections) {
|
|
16155
16154
|
const body = sections.map((s) => Array.isArray(s) ? s.filter(Boolean).join("\n") : s).filter((s) => !!s && !!s.trim()).join("\n\n");
|
|
16156
|
-
return [`▍${title}`,
|
|
16155
|
+
return [`▍${title}`, body].filter(Boolean).join("\n");
|
|
16157
16156
|
}
|
|
16158
16157
|
__name(textCard, "textCard");
|
|
16159
16158
|
function modeName(mode) {
|
|
@@ -16216,7 +16215,7 @@ function apply(ctx, cfg) {
|
|
|
16216
16215
|
`${meta.tagline},从 ${meta.total} 个候选中锁定唯一答案。`,
|
|
16217
16216
|
`可推理属性:${FIELDS[mode].map((k) => keyMap[k] || k).join(" / ")}`,
|
|
16218
16217
|
[
|
|
16219
|
-
channelOn ? `直接发送词库中的${meta.name}
|
|
16218
|
+
channelOn ? `直接发送词库中的${meta.name}名称,或发送「mcdle.猜 [名称]」` : `mcdle.猜 [名称] 提交一次猜测`,
|
|
16220
16219
|
`今日进度 ${played}/${cfg.dailyPlayLimit}`
|
|
16221
16220
|
]
|
|
16222
16221
|
);
|
|
@@ -16228,7 +16227,7 @@ function apply(ctx, cfg) {
|
|
|
16228
16227
|
(k) => `${fieldLabel(k)} ${displayValues(k, o.answer[k]).map((v) => v.text).join("、")}`
|
|
16229
16228
|
).join(" · ");
|
|
16230
16229
|
return textCard(
|
|
16231
|
-
"猜中了",
|
|
16230
|
+
"🏆 猜中了",
|
|
16232
16231
|
wikiImage(o.answer),
|
|
16233
16232
|
`答案 ${o.answer.chinese_title}${o.answer.title ? ` ${o.answer.title}` : ""}`,
|
|
16234
16233
|
[
|
|
@@ -16284,13 +16283,13 @@ function apply(ctx, cfg) {
|
|
|
16284
16283
|
}
|
|
16285
16284
|
__name(mcdle, "mcdle");
|
|
16286
16285
|
function middlewareSwitchText(on, temporary, reverted) {
|
|
16287
|
-
const mark =
|
|
16286
|
+
const mark = "✅";
|
|
16288
16287
|
const state = on ? "开启" : "停用";
|
|
16289
|
-
const config = cfg.
|
|
16288
|
+
const config = cfg.enableDirectInput ? "开启" : "停用";
|
|
16290
16289
|
if (!temporary) {
|
|
16291
16290
|
return `${mark} 裸猜续局 · ${reverted ? "已复原," : ""}跟随插件配置(${state})`;
|
|
16292
16291
|
}
|
|
16293
|
-
const hint = on ? "仅在已有对局中,直接发送当前模式的完整词条名称才会响应" : "
|
|
16292
|
+
const hint = on ? "仅在已有对局中,直接发送当前模式的完整词条名称才会响应" : "续猜请发送「mcdle.猜 [名称]」";
|
|
16294
16293
|
return [
|
|
16295
16294
|
`${mark} 裸猜续局 · 本频道临时${state}(插件配置:${config})`,
|
|
16296
16295
|
`${hint};再次发送 mcdle.裸猜 可复原`
|
|
@@ -16306,7 +16305,6 @@ function apply(ctx, cfg) {
|
|
|
16306
16305
|
if (["red", "onebot"].includes(session.platform)) {
|
|
16307
16306
|
const allContentNodes = sections.map(
|
|
16308
16307
|
([title, words]) => (0, import_koishi.h)("message", { userId: session.userId }, `▍${title}
|
|
16309
|
-
${RULE}
|
|
16310
16308
|
${words.join(" ")}`)
|
|
16311
16309
|
);
|
|
16312
16310
|
try {
|
|
@@ -16319,7 +16317,6 @@ ${words.join(" ")}`)
|
|
|
16319
16317
|
await sendMsg(
|
|
16320
16318
|
session,
|
|
16321
16319
|
sections.map(([title, words]) => `▍${title}
|
|
16322
|
-
${RULE}
|
|
16323
16320
|
${words.join(" ")}`).join("\n\n")
|
|
16324
16321
|
);
|
|
16325
16322
|
}
|
|
@@ -16381,7 +16378,22 @@ ${words.join(" ")}`).join("\n\n")
|
|
|
16381
16378
|
return candidates[Math.floor(Math.random() * candidates.length)];
|
|
16382
16379
|
}
|
|
16383
16380
|
__name(pickAnswer, "pickAnswer");
|
|
16381
|
+
const busyChannels = /* @__PURE__ */ new Set();
|
|
16384
16382
|
async function c(session, guess, allowStart = true) {
|
|
16383
|
+
const channelId = session.channelId;
|
|
16384
|
+
if (channelId && busyChannels.has(channelId)) {
|
|
16385
|
+
await sendMsg(session, "⏳ 上一次猜测还在处理,稍等一下。");
|
|
16386
|
+
return true;
|
|
16387
|
+
}
|
|
16388
|
+
if (channelId) busyChannels.add(channelId);
|
|
16389
|
+
try {
|
|
16390
|
+
return await guessOnce(session, guess, allowStart);
|
|
16391
|
+
} finally {
|
|
16392
|
+
if (channelId) busyChannels.delete(channelId);
|
|
16393
|
+
}
|
|
16394
|
+
}
|
|
16395
|
+
__name(c, "c");
|
|
16396
|
+
async function guessOnce(session, guess, allowStart = true) {
|
|
16385
16397
|
const record = await ensureRecord(session);
|
|
16386
16398
|
const now = /* @__PURE__ */ new Date();
|
|
16387
16399
|
await resetDailyIfNeeded(session, record, now);
|
|
@@ -16420,7 +16432,7 @@ ${words.join(" ")}`).join("\n\n")
|
|
|
16420
16432
|
}
|
|
16421
16433
|
return true;
|
|
16422
16434
|
}
|
|
16423
|
-
__name(
|
|
16435
|
+
__name(guessOnce, "guessOnce");
|
|
16424
16436
|
function restoreGuessHistory(record) {
|
|
16425
16437
|
const mode = record.gameMode;
|
|
16426
16438
|
if (!mode || !MODES[mode] || !record.answer) return null;
|
|
@@ -16452,8 +16464,8 @@ ${words.join(" ")}`).join("\n\n")
|
|
|
16452
16464
|
await sendMsg(
|
|
16453
16465
|
session,
|
|
16454
16466
|
textCard(
|
|
16455
|
-
"检测到旧版本遗留的一局",
|
|
16456
|
-
"
|
|
16467
|
+
"❌ 检测到旧版本遗留的一局",
|
|
16468
|
+
"这一局是在旧版本下开始的,已有的猜测记录没法用新版图片牌面渲染。",
|
|
16457
16469
|
answerTitle ? `「${answerTitle}」已退回词库,之后仍有机会被抽到。` : null,
|
|
16458
16470
|
allowStart ? "这一局已作废并退还今日额度,马上按这次的完整指令重新开局。" : "这一局已作废并退还今日额度,发送「mcdle.猜 [名称]」重新开局。"
|
|
16459
16471
|
)
|
|
@@ -16551,7 +16563,7 @@ ${words.join(" ")}`).join("\n\n")
|
|
|
16551
16563
|
);
|
|
16552
16564
|
await sendMsg(
|
|
16553
16565
|
session,
|
|
16554
|
-
textCard("
|
|
16566
|
+
textCard("❌ 这一局的牌面已经无法还原", "已经把它收掉了。发送「mcdle.猜 [名称]」重新开一局。")
|
|
16555
16567
|
);
|
|
16556
16568
|
return;
|
|
16557
16569
|
}
|
|
@@ -16687,7 +16699,7 @@ ${words.join(" ")}`).join("\n\n")
|
|
|
16687
16699
|
"mcdle.词库 查阅全部候选词条"
|
|
16688
16700
|
],
|
|
16689
16701
|
[
|
|
16690
|
-
|
|
16702
|
+
`每个频道每日 ${cfg.dailyPlayLimit} 局,跨零点重置。`,
|
|
16691
16703
|
cfg.allowRepeatedGuesses ? "允许重复提交已经猜过的词条。" : "同一局内不能重复提交已猜过的词条。",
|
|
16692
16704
|
channelOn ? "本频道裸猜已开启:仅已有对局、纯文本完整词条、且符合当前模式时响应。" : "本频道裸猜已停用:续猜请用完整指令。",
|
|
16693
16705
|
"空指令和词库外名称不会开启新局或消耗额度。",
|