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 +1 -0
- package/lib/index.js +102 -3
- package/package.json +2 -2
package/lib/index.d.ts
CHANGED
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:
|
|
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
|
|
4
|
-
"version": "0.1.
|
|
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": [
|