koishi-plugin-mcdle 0.1.1 → 0.1.3

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.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { Context, Schema } from 'koishi';
2
2
  import { MobData, BlockData, ItemData } from './data';
3
3
  export declare const name = "mcdle";
4
- export declare const usage = "# MCDLE - \u6211\u7684\u4E16\u754C\u731C\u8C1C\u6E38\u620F\n\n\u7075\u611F\u6E90\u4E8E **Wordle** \u73A9\u6CD5\n\n## \u57FA\u672C\u73A9\u6CD5\n\n- **mcdle.\u731C [\u540D\u79F0]** - \u5F00\u59CB\u6E38\u620F\u6216\u8FDB\u884C\u731C\u6D4B\n- \u7CFB\u7EDF\u968F\u673A\u9009\u62E9**\u751F\u7269\u3001\u7269\u54C1\u6216\u65B9\u5757**\u4F5C\u4E3A\u7B54\u6848\n- \u901A\u8FC7**\u989C\u8272\u63D0\u793A**\u5224\u65AD\u63A5\u8FD1\u7A0B\u5EA6\uFF1A\n\n | \u7B26\u53F7 | \u542B\u4E49 |\n |------|------|\n | \uD83D\uDFE9 \u7EFF\u8272 | \u5B57\u6BB5\u5B8C\u5168\u5339\u914D |\n | \uD83D\uDFE8 \u9EC4\u8272 | \u90E8\u5206\u5339\u914D |\n | \uD83D\uDFE5 \u7EA2\u8272 | \u4E0D\u5339\u914D |\n | \uD83D\uDFE5\u2B06\uFE0F | \u7B54\u6848\u66F4\u5927 |\n | \uD83D\uDFE5\u2B07\uFE0F | \u7B54\u6848\u66F4\u5C0F |\n\n## \u56FE\u7247\n\n\u5B89\u88C5 `puppeteer` \u670D\u52A1\u540E\uFF0C\u68CB\u76D8\u3001\u5F00\u5C40\u3001\u63ED\u6653\u3001\u6392\u884C\u699C\u90FD\u4F1A\u6E32\u67D3\u6210\u50CF\u7D20\u98CE\u5361\u7247\uFF1B\n\u672A\u5B89\u88C5\u6216\u6E32\u67D3\u5931\u8D25\u65F6\u81EA\u52A8\u56DE\u9000\u4E3A\u7B49\u4EF7\u7684\u6587\u672C\uFF0C\u529F\u80FD\u4E0D\u53D7\u5F71\u54CD\u3002\n\n## QQ \u7FA4\n\n956758505";
4
+ export declare const usage = "## \u4F7F\u7528\n\n`mcdle.\u731C [\u540D\u79F0]` \u5F00\u5C40\u6216\u731C\u6D4B\u3002\u7CFB\u7EDF\u968F\u673A\u9009\u62E9\u751F\u7269\u3001\u7269\u54C1\u6216\u65B9\u5757\uFF0C\u6309\u5C5E\u6027\u989C\u8272\u63D0\u793A\u63A5\u8FD1\u7A0B\u5EA6\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` | \u67E5\u770B\u5E2E\u52A9 |\n| `mcdle.\u731C [\u540D\u79F0]` | \u5F00\u5C40\u6216\u731C\u6D4B |\n| `mcdle.\u5E2E\u52A9` | \u5B8C\u6574\u8BF4\u660E |\n| `mcdle.\u6392\u884C\u699C` | \u7FA4\u5185\u6218\u7EE9 |\n| `mcdle.\u8BCD\u5E93` | \u5168\u90E8\u8BCD\u6761 |";
5
5
  export declare const inject: {
6
6
  required: string[];
7
7
  optional: string[];
@@ -35,6 +35,7 @@ interface Mcdle {
35
35
  gameEnded: boolean;
36
36
  lastGameStartTime: Date;
37
37
  gameMode: 'mob' | 'item' | 'block' | null;
38
+ formatVersion: number;
38
39
  }
39
40
  interface McdleRank {
40
41
  id: number;
package/lib/index.js CHANGED
@@ -18,15 +18,15 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
 
20
20
  // src/index.ts
21
- var src_exports = {};
22
- __export(src_exports, {
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
23
  Config: () => Config,
24
24
  apply: () => apply,
25
25
  inject: () => inject,
26
26
  name: () => name,
27
27
  usage: () => usage
28
28
  });
29
- module.exports = __toCommonJS(src_exports);
29
+ module.exports = __toCommonJS(index_exports);
30
30
  var import_koishi = require("koishi");
31
31
 
32
32
  // src/data.ts
@@ -15572,32 +15572,28 @@ __name(rankCard, "rankCard");
15572
15572
 
15573
15573
  // src/index.ts
15574
15574
  var name = "mcdle";
15575
- var usage = `# MCDLE - 我的世界猜谜游戏
15575
+ var usage = `## 使用
15576
15576
 
15577
- 灵感源于 **Wordle** 玩法
15577
+ \`mcdle.猜 [名称]\` 开局或猜测。系统随机选择生物、物品或方块,按属性颜色提示接近程度。
15578
15578
 
15579
- ## 基本玩法
15579
+ ## 提示
15580
15580
 
15581
- - **mcdle.猜 [名称]** - 开始游戏或进行猜测
15582
- - 系统随机选择**生物、物品或方块**作为答案
15583
- - 通过**颜色提示**判断接近程度:
15581
+ | 符号 | 含义 |
15582
+ | --- | --- |
15583
+ | 🟩 | 完全匹配 |
15584
+ | 🟨 | 部分匹配 |
15585
+ | 🟥 | 不匹配 |
15586
+ | 🟥⬆️ / 🟥⬇️ | 答案更大 / 更小 |
15584
15587
 
15585
- | 符号 | 含义 |
15586
- |------|------|
15587
- | 🟩 绿色 | 字段完全匹配 |
15588
- | 🟨 黄色 | 部分匹配 |
15589
- | 🟥 红色 | 不匹配 |
15590
- | 🟥⬆️ | 答案更大 |
15591
- | 🟥⬇️ | 答案更小 |
15588
+ ## 指令
15592
15589
 
15593
- ## 图片
15594
-
15595
- 安装 \`puppeteer\` 服务后,棋盘、开局、揭晓、排行榜都会渲染成像素风卡片;
15596
- 未安装或渲染失败时自动回退为等价的文本,功能不受影响。
15597
-
15598
- ## QQ 群
15599
-
15600
- 956758505`;
15590
+ | 指令 | 说明 |
15591
+ | --- | --- |
15592
+ | \`mcdle\` | 查看帮助 |
15593
+ | \`mcdle.猜 [名称]\` | 开局或猜测 |
15594
+ | \`mcdle.帮助\` | 完整说明 |
15595
+ | \`mcdle.排行榜\` | 群内战绩 |
15596
+ | \`mcdle.词库\` | 全部词条 |`;
15601
15597
  var inject = { required: ["database"], optional: ["puppeteer"] };
15602
15598
  var Config = import_koishi.Schema.object({
15603
15599
  atReply: import_koishi.Schema.boolean().default(false).description("响应时@用户"),
@@ -15612,6 +15608,7 @@ var Config = import_koishi.Schema.object({
15612
15608
  allowRepeatedGuesses: import_koishi.Schema.boolean().default(false).description("允许重复猜测已猜过的词语(防止撤回时历史不可见)"),
15613
15609
  disableImages: import_koishi.Schema.boolean().default(false).description("不发送图片,全部改用文本(解决网络问题导致的图片下载失败)")
15614
15610
  });
15611
+ var FORMAT_VERSION = 1;
15615
15612
  function apply(ctx, cfg) {
15616
15613
  ctx.model.extend(
15617
15614
  "mcdle",
@@ -15624,7 +15621,10 @@ function apply(ctx, cfg) {
15624
15621
  dailyPlayedToday: { type: "unsigned", initial: 0 },
15625
15622
  gameEnded: { type: "boolean", initial: true },
15626
15623
  lastGameStartTime: { type: "timestamp", initial: /* @__PURE__ */ new Date(0) },
15627
- gameMode: { type: "string", initial: null }
15624
+ gameMode: { type: "string", initial: null },
15625
+ // 猜测记录的写入格式:旧版本留下的进行中一局无法用现在的图片牌面渲染,
15626
+ // 靠这一列把它们认出来(老行迁移后为 0/null)
15627
+ formatVersion: { type: "unsigned", initial: 0 }
15628
15628
  },
15629
15629
  {
15630
15630
  primary: "channelId"
@@ -15915,6 +15915,18 @@ ${words.join(" ")}`).join("\n\n")
15915
15915
  const record = await ensureRecord(session);
15916
15916
  const now = /* @__PURE__ */ new Date();
15917
15917
  await resetDailyIfNeeded(session, record, now);
15918
+ if (!record.gameEnded && record.formatVersion !== FORMAT_VERSION) {
15919
+ if (record.guesses.length) {
15920
+ await rollbackLegacyGame(session, record, guess, now);
15921
+ return;
15922
+ }
15923
+ await ctx.database.set(
15924
+ "mcdle",
15925
+ { channelId: session.channelId },
15926
+ { formatVersion: FORMAT_VERSION }
15927
+ );
15928
+ record.formatVersion = FORMAT_VERSION;
15929
+ }
15918
15930
  if (record.gameEnded) {
15919
15931
  await startNewGame(session, record, guess, now);
15920
15932
  } else {
@@ -15922,14 +15934,55 @@ ${words.join(" ")}`).join("\n\n")
15922
15934
  }
15923
15935
  }
15924
15936
  __name(c, "c");
15937
+ async function rollbackLegacyGame(session, record, guess, now) {
15938
+ const answerTitle = record.answer?.chinese_title;
15939
+ const history = answerTitle ? record.historyChineseTitles.filter((title) => title !== answerTitle) : record.historyChineseTitles;
15940
+ const refunded = Math.max(0, record.dailyPlayedToday - 1);
15941
+ await ctx.database.set(
15942
+ "mcdle",
15943
+ { channelId: session.channelId },
15944
+ {
15945
+ gameEnded: true,
15946
+ answer: null,
15947
+ guesses: [],
15948
+ guessedChineseTitles: [],
15949
+ gameMode: null,
15950
+ historyChineseTitles: history,
15951
+ dailyPlayedToday: refunded,
15952
+ formatVersion: FORMAT_VERSION
15953
+ }
15954
+ );
15955
+ await sendMsg(
15956
+ session,
15957
+ textCard(
15958
+ "检测到旧版本遗留的一局",
15959
+ "这局是在旧版本下开始的,已有的猜测记录没法用新版图片牌面渲染。",
15960
+ answerTitle ? `「${answerTitle}」已退回词库,之后仍有机会被抽到。` : null,
15961
+ "这一局已作废并退还今日额度,马上为你重新开一局。"
15962
+ )
15963
+ );
15964
+ await startNewGame(
15965
+ session,
15966
+ {
15967
+ ...record,
15968
+ historyChineseTitles: history,
15969
+ dailyPlayedToday: refunded,
15970
+ gameEnded: true,
15971
+ formatVersion: FORMAT_VERSION
15972
+ },
15973
+ guess,
15974
+ now
15975
+ );
15976
+ }
15977
+ __name(rollbackLegacyGame, "rollbackLegacyGame");
15925
15978
  async function startNewGame(session, record, guess, now) {
15926
15979
  if (record.dailyPlayedToday >= cfg.dailyPlayLimit) {
15927
15980
  await sendMsg(
15928
15981
  session,
15929
15982
  textCard(
15930
- `今日 ${cfg.dailyPlayLimit} 局已经用完`,
15983
+ `⚠️ 今日 ${cfg.dailyPlayLimit} 局已经用完`,
15931
15984
  `跨零点后重置,还要等 ${untilReset(now)}。`,
15932
- "在那之前可以逛逛 mcdle.排行榜 或 mcdle.词库。"
15985
+ "在那之前可以查看 mcdle.排行榜 或 mcdle.词库。"
15933
15986
  )
15934
15987
  );
15935
15988
  return;
@@ -15949,7 +16002,8 @@ ${words.join(" ")}`).join("\n\n")
15949
16002
  lastGameStartTime: now,
15950
16003
  dailyPlayedToday: played,
15951
16004
  historyChineseTitles: [...record.historyChineseTitles, answer.chinese_title],
15952
- gameMode: mode
16005
+ gameMode: mode,
16006
+ formatVersion: FORMAT_VERSION
15953
16007
  }
15954
16008
  );
15955
16009
  await sendCard(session, startCard(mode, played, cfg.dailyPlayLimit), startText(mode, played));
@@ -15972,7 +16026,7 @@ ${words.join(" ")}`).join("\n\n")
15972
16026
  );
15973
16027
  await sendMsg(
15974
16028
  session,
15975
- textCard("这一局的牌面已经无法还原", "已经把它收掉了,mcdle.猜 [名称] 可以重新开一局。")
16029
+ textCard("⚠️ 这一局的牌面已经无法还原", "已经把它收掉了。发送 mcdle.猜 [名称] 可以重新开一局。")
15976
16030
  );
15977
16031
  return;
15978
16032
  }
@@ -16007,7 +16061,7 @@ ${words.join(" ")}`).join("\n\n")
16007
16061
  await sendMsg(
16008
16062
  session,
16009
16063
  textCard(
16010
- `「${guess}」这一局已经猜过了`,
16064
+ `⚠️ 「${guess}」这一局已经猜过了`,
16011
16065
  `本局已猜 ${state.titles.length} 个:${state.titles.join(" › ")}`,
16012
16066
  "换一个还没试过的词条吧。"
16013
16067
  )
@@ -16020,7 +16074,7 @@ ${words.join(" ")}`).join("\n\n")
16020
16074
  await sendMsg(
16021
16075
  session,
16022
16076
  textCard(
16023
- `「${guess}」不在${modeName(mode)}词库里`,
16077
+ `⚠️ 「${guess}」不在${modeName(mode)}词库里`,
16024
16078
  near.length ? `是不是想猜:${near.join("、")}?` : null,
16025
16079
  `本局共有 ${MODES[mode].total} 个${modeName(mode)}候选,mcdle.词库 可以全部翻看。`
16026
16080
  )
@@ -16129,7 +16183,7 @@ ${words.join(" ")}`).join("\n\n")
16129
16183
  await sendCard(
16130
16184
  session,
16131
16185
  rankCard([], 0),
16132
- textCard("排行榜还空着", "用 mcdle.猜 开出第一局,这里的第一行就是你。")
16186
+ textCard("⚠️ 排行榜还空着", "用 mcdle.猜 开出第一局,这里的第一行就是你。")
16133
16187
  );
16134
16188
  return;
16135
16189
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-mcdle",
3
- "description": "Koishi 的 Minecraft 猜词游戏插件。根据 Minecraft 物品、生物和方块的属性特征,猜测正确的名称。",
4
- "version": "0.1.1",
3
+ "description": "Koishi 的 Minecraft 猜词游戏插件。",
4
+ "version": "0.1.3",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [
@@ -50,7 +50,7 @@
50
50
  "方块"
51
51
  ],
52
52
  "peerDependencies": {
53
- "koishi": "^4.18.9",
53
+ "koishi": "^4.18.11",
54
54
  "koishi-plugin-puppeteer": "^3.9.0"
55
55
  },
56
56
  "peerDependenciesMeta": {
package/readme.md CHANGED
@@ -1,63 +1,37 @@
1
1
  koishi-plugin-mcdle
2
2
  ===================
3
3
 
4
- [<img alt="github" src="https://img.shields.io/badge/github-araea/mcdle-8da0cb?style=for-the-badge&labelColor=555555&logo=github" height="20">](https://github.com/araea/koishi-plugin-mcdle)
4
+ [<img alt="github" src="https://img.shields.io/badge/github-araea/koishi__plugin__mcdle-8da0cb?style=for-the-badge&labelColor=555555&logo=github" height="20">](https://github.com/araea/koishi-plugin-mcdle)
5
5
  [<img alt="npm" src="https://img.shields.io/npm/v/koishi-plugin-mcdle.svg?style=for-the-badge&color=fc8d62&logo=npm" height="20">](https://www.npmjs.com/package/koishi-plugin-mcdle)
6
6
 
7
- Koishi 的 Minecraft 猜词游戏插件。根据 Minecraft 物品、生物和方块的属性特征,猜测正确的名称。
7
+ Koishi 的 Minecraft 猜词游戏插件。
8
8
 
9
9
  ## 使用
10
10
 
11
- 1. 设置指令别名。
12
- 2. 发送 `mcdle` 查看帮助。
11
+ `mcdle.猜 [名称]` 开局或猜测。系统随机选择生物、物品或方块,按属性颜色提示接近程度。
13
12
 
14
- ## 基本玩法
15
-
16
- - **mcdle.猜 [名称]** - 开始游戏或进行猜测
17
- - 系统随机选择**生物、物品或方块**作为答案
18
- - 通过**颜色提示**判断接近程度:
13
+ ## 提示
19
14
 
20
15
  | 符号 | 含义 |
21
- |------|------|
22
- | 🟩 绿色 | 字段完全匹配 |
23
- | 🟨 黄色 | 部分匹配 |
24
- | 🟥 红色 | 不匹配 |
25
- | 🟥⬆️ | 答案更大 |
26
- | 🟥⬇️ | 答案更小 |
27
-
28
- 部分匹配的字段里,**被点亮的那几个标签**就是与答案重合的值 —— 图片中高亮显示,
29
- 文本中用 `【】` 括起。
16
+ | --- | --- |
17
+ | 🟩 | 完全匹配 |
18
+ | 🟨 | 部分匹配 |
19
+ | 🟥 | 不匹配 |
20
+ | 🟥⬆️ / 🟥⬇️ | 答案更大 / 更小 |
30
21
 
31
22
  ## 指令
32
23
 
33
24
  | 指令 | 说明 |
34
- |------|------|
35
- | `mcdle` | 游戏简介与快速上手 |
36
- | `mcdle.猜 [名称]` | 开始一局,或提交一次猜测 |
37
- | `mcdle.猜` | 局中直接使用,回看当前棋盘 |
38
- | `mcdle.帮助` | 完整玩法说明 |
25
+ | --- | --- |
26
+ | `mcdle` | 查看帮助 |
27
+ | `mcdle.猜 [名称]` | 开局或猜测 |
28
+ | `mcdle.帮助` | 完整说明 |
39
29
  | `mcdle.排行榜` | 群内战绩 |
40
- | `mcdle.词库` | 全部候选词条 |
41
-
42
- ## 图片
43
-
44
- 安装 [puppeteer](https://www.npmjs.com/package/koishi-plugin-puppeteer) 服务后,
45
- 棋盘、开局、揭晓与排行榜都会渲染成像素风卡片:内联 SVG 像素图标、我的世界式的
46
- 方块斜角,不依赖任何外部字体或图片资源。
47
-
48
- puppeteer 是**可选**依赖。未安装、渲染超时或截图失败时,都会自动回退到等价的
49
- 文本形态,玩法与信息量不受影响;配置项 `disableImages` 可以强制只用文本。
50
-
51
- ## 致谢
52
-
53
- * [Koishi](https://koishi.chat/)
54
- * [MCDLE](https://www.mcdle.net/)
55
- * [Minecraft Wiki](https://minecraft.wiki/w/Minecraft_Wiki)
56
- * [@magisk317](https://github.com/magisk317)
30
+ | `mcdle.词库` | 全部词条 |
57
31
 
58
32
  ## QQ 群
59
33
 
60
- * 956758505
34
+ 956758505
61
35
 
62
36
  <br>
63
37