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 +2 -1
- package/lib/index.js +86 -32
- package/package.json +3 -3
- package/readme.md +15 -41
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 = "
|
|
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
|
|
22
|
-
__export(
|
|
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(
|
|
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 =
|
|
15575
|
+
var usage = `## 使用
|
|
15576
15576
|
|
|
15577
|
-
|
|
15577
|
+
\`mcdle.猜 [名称]\` 开局或猜测。系统随机选择生物、物品或方块,按属性颜色提示接近程度。
|
|
15578
15578
|
|
|
15579
|
-
##
|
|
15579
|
+
## 提示
|
|
15580
15580
|
|
|
15581
|
-
|
|
15582
|
-
|
|
15583
|
-
|
|
15581
|
+
| 符号 | 含义 |
|
|
15582
|
+
| --- | --- |
|
|
15583
|
+
| 🟩 | 完全匹配 |
|
|
15584
|
+
| 🟨 | 部分匹配 |
|
|
15585
|
+
| 🟥 | 不匹配 |
|
|
15586
|
+
| 🟥⬆️ / 🟥⬇️ | 答案更大 / 更小 |
|
|
15584
15587
|
|
|
15585
|
-
|
|
15586
|
-
|------|------|
|
|
15587
|
-
| 🟩 绿色 | 字段完全匹配 |
|
|
15588
|
-
| 🟨 黄色 | 部分匹配 |
|
|
15589
|
-
| 🟥 红色 | 不匹配 |
|
|
15590
|
-
| 🟥⬆️ | 答案更大 |
|
|
15591
|
-
| 🟥⬇️ | 答案更小 |
|
|
15588
|
+
## 指令
|
|
15592
15589
|
|
|
15593
|
-
|
|
15594
|
-
|
|
15595
|
-
|
|
15596
|
-
|
|
15597
|
-
|
|
15598
|
-
|
|
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
|
-
|
|
15983
|
+
`⚠️ 今日 ${cfg.dailyPlayLimit} 局已经用完`,
|
|
15931
15984
|
`跨零点后重置,还要等 ${untilReset(now)}。`,
|
|
15932
|
-
"
|
|
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("这一局的牌面已经无法还原", "
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
4
|
-
"version": "0.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.
|
|
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/
|
|
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
|
|
7
|
+
Koishi 的 Minecraft 猜词游戏插件。
|
|
8
8
|
|
|
9
9
|
## 使用
|
|
10
10
|
|
|
11
|
-
|
|
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
|
-
|
|
34
|
+
956758505
|
|
61
35
|
|
|
62
36
|
<br>
|
|
63
37
|
|