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 CHANGED
@@ -18,7 +18,7 @@ yarn add koishi-plugin-mcdle
18
18
  | --- | --- |
19
19
  | `mcdle` | 玩法与指令说明 |
20
20
  | `mcdle.猜 [名称]` | 用有效词条开局或猜测 |
21
- | `mcdle.裸猜 [开/关]` | 切换本群无前缀续猜 |
21
+ | `mcdle.裸猜 [开/关]` | 切换本频道无前缀续猜 |
22
22
  | `mcdle.排行榜` | 群内战绩 |
23
23
  | `mcdle.词库` | 全部词条 |
24
24
 
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## \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 |\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 |";
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
- isEnableMiddleware: boolean;
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">查看群内战绩</span></div>
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>每个群每日可开始 <b>${dailyLimit}</b> 局,跨零点重置。</span></div>
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
- 榜单还空着<br><span style="font-size:12px">用 <span class="cmd">mcdle.猜 苦力怕</span> 开出第一局,成为榜首</span></div></div>`;
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, "群内战绩 · 按累计猜中排序", { big: `${shown}`, cap: "上榜人数" }) + `<div class="pad"><div class="rank">${rows}</div></div>` + noteRow("每猜中一局记一分,按模式分别计数");
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
- isEnableMiddleware: import_koishi.Schema.boolean().default(false).description("对局进行中时,直接发送词条名称即可续猜,无需指令前缀。各频道可用「mcdle.裸猜」临时切换。"),
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.isEnableMiddleware : middlewareOverrides.get(channelId) ?? cfg.isEnableMiddleware, "middlewareOn");
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.排行榜", "查看本频道战绩排行榜").action(async ({ session }) => phb(session));
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.isEnableMiddleware,
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}`, RULE, body].filter(Boolean).join("\n");
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}名称,或使用 mcdle.猜 [名称]` : `mcdle.猜 [名称] 提交一次猜测`,
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 = on ? "✅" : "⛔";
16286
+ const mark = "✅";
16288
16287
  const state = on ? "开启" : "停用";
16289
- const config = cfg.isEnableMiddleware ? "开启" : "停用";
16288
+ const config = cfg.enableDirectInput ? "开启" : "停用";
16290
16289
  if (!temporary) {
16291
16290
  return `${mark} 裸猜续局 · ${reverted ? "已复原," : ""}跟随插件配置(${state})`;
16292
16291
  }
16293
- const hint = on ? "仅在已有对局中,直接发送当前模式的完整词条名称才会响应" : "续猜请使用 mcdle.猜 [名称]";
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(c, "c");
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("⚠️ 这一局的牌面已经无法还原", "已经把它收掉了。发送「mcdle.猜 [名称]」重新开一局。")
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
- `每个群每日 ${cfg.dailyPlayLimit} 局,跨零点重置。`,
16702
+ `每个频道每日 ${cfg.dailyPlayLimit} 局,跨零点重置。`,
16691
16703
  cfg.allowRepeatedGuesses ? "允许重复提交已经猜过的词条。" : "同一局内不能重复提交已猜过的词条。",
16692
16704
  channelOn ? "本频道裸猜已开启:仅已有对局、纯文本完整词条、且符合当前模式时响应。" : "本频道裸猜已停用:续猜请用完整指令。",
16693
16705
  "空指令和词库外名称不会开启新局或消耗额度。",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-mcdle",
3
3
  "description": "Koishi 的 Minecraft 猜词游戏插件。",
4
- "version": "0.3.1",
4
+ "version": "0.4.0",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [