koishi-plugin-mcdle 0.1.2 → 0.1.4

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
@@ -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
@@ -15608,19 +15608,39 @@ var Config = import_koishi.Schema.object({
15608
15608
  allowRepeatedGuesses: import_koishi.Schema.boolean().default(false).description("允许重复猜测已猜过的词语(防止撤回时历史不可见)"),
15609
15609
  disableImages: import_koishi.Schema.boolean().default(false).description("不发送图片,全部改用文本(解决网络问题导致的图片下载失败)")
15610
15610
  });
15611
+ var FORMAT_VERSION = 2;
15612
+ var guessesField = {
15613
+ type: "text",
15614
+ initial: [],
15615
+ dump(value) {
15616
+ return JSON.stringify(Array.isArray(value) ? value : []);
15617
+ },
15618
+ load(value) {
15619
+ if (Array.isArray(value)) return value;
15620
+ if (!value) return [];
15621
+ try {
15622
+ const parsed = JSON.parse(value);
15623
+ return Array.isArray(parsed) ? parsed : [];
15624
+ } catch {
15625
+ return [];
15626
+ }
15627
+ }
15628
+ };
15611
15629
  function apply(ctx, cfg) {
15612
15630
  ctx.model.extend(
15613
15631
  "mcdle",
15614
15632
  {
15615
15633
  channelId: "string",
15616
15634
  answer: { type: "json", initial: null },
15617
- guesses: { type: "list", initial: [] },
15635
+ guesses: guessesField,
15618
15636
  historyChineseTitles: { type: "list", initial: [] },
15619
15637
  guessedChineseTitles: { type: "list", initial: [] },
15620
15638
  dailyPlayedToday: { type: "unsigned", initial: 0 },
15621
15639
  gameEnded: { type: "boolean", initial: true },
15622
15640
  lastGameStartTime: { type: "timestamp", initial: /* @__PURE__ */ new Date(0) },
15623
- gameMode: { type: "string", initial: null }
15641
+ gameMode: { type: "string", initial: null },
15642
+ // 猜测记录的写入格式:靠这一列识别需要重建或回退的旧局面。
15643
+ formatVersion: { type: "unsigned", initial: 0 }
15624
15644
  },
15625
15645
  {
15626
15646
  primary: "channelId"
@@ -15911,6 +15931,33 @@ ${words.join(" ")}`).join("\n\n")
15911
15931
  const record = await ensureRecord(session);
15912
15932
  const now = /* @__PURE__ */ new Date();
15913
15933
  await resetDailyIfNeeded(session, record, now);
15934
+ if (!record.gameEnded && record.formatVersion !== FORMAT_VERSION) {
15935
+ if (record.guessedChineseTitles.length) {
15936
+ const restored = restoreGuessHistory(record);
15937
+ if (restored) {
15938
+ await ctx.database.set(
15939
+ "mcdle",
15940
+ { channelId: session.channelId },
15941
+ { guesses: restored, formatVersion: FORMAT_VERSION }
15942
+ );
15943
+ record.guesses = restored;
15944
+ record.formatVersion = FORMAT_VERSION;
15945
+ } else {
15946
+ await rollbackLegacyGame(session, record, guess, now);
15947
+ return;
15948
+ }
15949
+ } else if (record.guesses.length) {
15950
+ await rollbackLegacyGame(session, record, guess, now);
15951
+ return;
15952
+ } else {
15953
+ await ctx.database.set(
15954
+ "mcdle",
15955
+ { channelId: session.channelId },
15956
+ { formatVersion: FORMAT_VERSION }
15957
+ );
15958
+ record.formatVersion = FORMAT_VERSION;
15959
+ }
15960
+ }
15914
15961
  if (record.gameEnded) {
15915
15962
  await startNewGame(session, record, guess, now);
15916
15963
  } else {
@@ -15918,6 +15965,57 @@ ${words.join(" ")}`).join("\n\n")
15918
15965
  }
15919
15966
  }
15920
15967
  __name(c, "c");
15968
+ function restoreGuessHistory(record) {
15969
+ const mode = record.gameMode;
15970
+ if (!mode || !MODES[mode] || !record.answer) return null;
15971
+ const entries = record.guessedChineseTitles.map(
15972
+ (title) => POOLS[mode].find((entry) => entry.chinese_title === title)
15973
+ );
15974
+ if (entries.some((entry) => !entry)) return null;
15975
+ return entries.map((entry) => compareData(entry, record.answer));
15976
+ }
15977
+ __name(restoreGuessHistory, "restoreGuessHistory");
15978
+ async function rollbackLegacyGame(session, record, guess, now) {
15979
+ const answerTitle = record.answer?.chinese_title;
15980
+ const history = answerTitle ? record.historyChineseTitles.filter((title) => title !== answerTitle) : record.historyChineseTitles;
15981
+ const refunded = Math.max(0, record.dailyPlayedToday - 1);
15982
+ await ctx.database.set(
15983
+ "mcdle",
15984
+ { channelId: session.channelId },
15985
+ {
15986
+ gameEnded: true,
15987
+ answer: null,
15988
+ guesses: [],
15989
+ guessedChineseTitles: [],
15990
+ gameMode: null,
15991
+ historyChineseTitles: history,
15992
+ dailyPlayedToday: refunded,
15993
+ formatVersion: FORMAT_VERSION
15994
+ }
15995
+ );
15996
+ await sendMsg(
15997
+ session,
15998
+ textCard(
15999
+ "检测到旧版本遗留的一局",
16000
+ "这局是在旧版本下开始的,已有的猜测记录没法用新版图片牌面渲染。",
16001
+ answerTitle ? `「${answerTitle}」已退回词库,之后仍有机会被抽到。` : null,
16002
+ "这一局已作废并退还今日额度,马上为你重新开一局。"
16003
+ )
16004
+ );
16005
+ await startNewGame(
16006
+ session,
16007
+ {
16008
+ ...record,
16009
+ historyChineseTitles: history,
16010
+ dailyPlayedToday: refunded,
16011
+ gameEnded: true,
16012
+ formatVersion: FORMAT_VERSION
16013
+ },
16014
+ guess,
16015
+ now
16016
+ );
16017
+ }
16018
+ __name(rollbackLegacyGame, "rollbackLegacyGame");
15921
16019
  async function startNewGame(session, record, guess, now) {
15922
16020
  if (record.dailyPlayedToday >= cfg.dailyPlayLimit) {
15923
16021
  await sendMsg(
@@ -15945,7 +16043,8 @@ ${words.join(" ")}`).join("\n\n")
15945
16043
  lastGameStartTime: now,
15946
16044
  dailyPlayedToday: played,
15947
16045
  historyChineseTitles: [...record.historyChineseTitles, answer.chinese_title],
15948
- gameMode: mode
16046
+ gameMode: mode,
16047
+ formatVersion: FORMAT_VERSION
15949
16048
  }
15950
16049
  );
15951
16050
  await sendCard(session, startCard(mode, played, cfg.dailyPlayLimit), startText(mode, played));
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.2",
3
+ "description": "Koishi 的 Minecraft 猜词游戏插件。",
4
+ "version": "0.1.4",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [