koishi-plugin-minecraft-versions-checker 1.1.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/lib/index.d.ts +16 -0
- package/lib/index.js +243 -0
- package/package.json +20 -0
- package/readme.md +5 -0
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Context, Schema } from 'koishi';
|
|
2
|
+
export declare const name = "minecraft-versions-checker";
|
|
3
|
+
export interface Config {
|
|
4
|
+
interval: number;
|
|
5
|
+
groups: string[];
|
|
6
|
+
enableRelease: boolean;
|
|
7
|
+
enableSnapshot: boolean;
|
|
8
|
+
enablePreRelease: boolean;
|
|
9
|
+
enableReleaseCandidate: boolean;
|
|
10
|
+
testVersion: string;
|
|
11
|
+
messageTemplate: string;
|
|
12
|
+
useProxy: boolean;
|
|
13
|
+
proxyUrl: string;
|
|
14
|
+
}
|
|
15
|
+
export declare const Config: Schema<Config>;
|
|
16
|
+
export declare function apply(ctx: Context, config: Config): void;
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name2 in all)
|
|
8
|
+
__defProp(target, name2, { get: all[name2], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var src_exports = {};
|
|
22
|
+
__export(src_exports, {
|
|
23
|
+
Config: () => Config,
|
|
24
|
+
apply: () => apply,
|
|
25
|
+
name: () => name
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(src_exports);
|
|
28
|
+
var import_koishi = require("koishi");
|
|
29
|
+
var name = "minecraft-versions-checker";
|
|
30
|
+
var Config = import_koishi.Schema.object({
|
|
31
|
+
interval: import_koishi.Schema.number().default(60),
|
|
32
|
+
groups: import_koishi.Schema.array(String).role("table"),
|
|
33
|
+
enableRelease: import_koishi.Schema.boolean().default(true),
|
|
34
|
+
enableSnapshot: import_koishi.Schema.boolean().default(true),
|
|
35
|
+
enablePreRelease: import_koishi.Schema.boolean().default(true),
|
|
36
|
+
enableReleaseCandidate: import_koishi.Schema.boolean().default(true),
|
|
37
|
+
testVersion: import_koishi.Schema.string().default(""),
|
|
38
|
+
messageTemplate: import_koishi.Schema.string().default("【MC更新】发现新的Minecraft{type}:{version}\n文章地址:{url}"),
|
|
39
|
+
useProxy: import_koishi.Schema.boolean().default(false),
|
|
40
|
+
proxyUrl: import_koishi.Schema.string().default("http://127.0.0.1:7890")
|
|
41
|
+
});
|
|
42
|
+
function apply(ctx, config) {
|
|
43
|
+
const logger = ctx.logger("minecraft-versions-checker");
|
|
44
|
+
let knownVersions = /* @__PURE__ */ new Set();
|
|
45
|
+
let isFirstRun = true;
|
|
46
|
+
const effectiveConfig = {
|
|
47
|
+
interval: config.interval || 60,
|
|
48
|
+
groups: config.groups || [],
|
|
49
|
+
enableRelease: config.enableRelease !== void 0 ? config.enableRelease : true,
|
|
50
|
+
enableSnapshot: config.enableSnapshot !== void 0 ? config.enableSnapshot : true,
|
|
51
|
+
enablePreRelease: config.enablePreRelease !== void 0 ? config.enablePreRelease : true,
|
|
52
|
+
enableReleaseCandidate: config.enableReleaseCandidate !== void 0 ? config.enableReleaseCandidate : true,
|
|
53
|
+
messageTemplate: config.messageTemplate || "【MC更新】发现新的Minecraft{type}:{version}\n文章地址:{url}",
|
|
54
|
+
useProxy: config.useProxy !== void 0 ? config.useProxy : false,
|
|
55
|
+
proxyUrl: config.proxyUrl || "http://127.0.0.1:7890"
|
|
56
|
+
};
|
|
57
|
+
function detectVersionType(versionId) {
|
|
58
|
+
const versionLower = versionId.toLowerCase();
|
|
59
|
+
if (versionLower.includes("pre")) return "pre-release";
|
|
60
|
+
if (versionLower.includes("rc")) return "release-candidate";
|
|
61
|
+
const snapshotPattern = /^\d+w\d+[a-z]$/;
|
|
62
|
+
if (snapshotPattern.test(versionLower)) return "snapshot";
|
|
63
|
+
const releasePattern = /^\d+\.\d+(\.\d+)?$/;
|
|
64
|
+
if (releasePattern.test(versionLower)) return "release";
|
|
65
|
+
return "unknown";
|
|
66
|
+
}
|
|
67
|
+
__name(detectVersionType, "detectVersionType");
|
|
68
|
+
function generateArticleUrl(versionInfo) {
|
|
69
|
+
const versionId = versionInfo.id;
|
|
70
|
+
const versionType = detectVersionType(versionId);
|
|
71
|
+
switch (versionType) {
|
|
72
|
+
case "release":
|
|
73
|
+
const versionSlug = versionId.replace(/\./g, "-");
|
|
74
|
+
return `https://www.minecraft.net/zh-hans/article/minecraft-java-edition-${versionSlug}`;
|
|
75
|
+
case "snapshot":
|
|
76
|
+
return `https://www.minecraft.net/zh-hans/article/minecraft-snapshot-${versionId}`;
|
|
77
|
+
case "pre-release":
|
|
78
|
+
if (versionId.includes("-")) {
|
|
79
|
+
const [basePart, prePart] = versionId.split("-", 2);
|
|
80
|
+
const baseSlug = basePart.replace(/\./g, "-");
|
|
81
|
+
const preNum = prePart.includes(".") ? prePart.split(".")[1] : "1";
|
|
82
|
+
return `https://www.minecraft.net/zh-hans/article/minecraft-${baseSlug}-pre-release-${preNum}`;
|
|
83
|
+
}
|
|
84
|
+
break;
|
|
85
|
+
case "release-candidate":
|
|
86
|
+
if (versionId.includes("-")) {
|
|
87
|
+
const [basePart, rcPart] = versionId.split("-", 2);
|
|
88
|
+
const baseSlug = basePart.replace(/\./g, "-");
|
|
89
|
+
const rcNum = rcPart.includes(".") ? rcPart.split(".")[1] : "1";
|
|
90
|
+
return `https://www.minecraft.net/zh-hans/article/minecraft-${baseSlug}-release-candidate-${rcNum}`;
|
|
91
|
+
}
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
return `未知版本类型: ${versionId}`;
|
|
95
|
+
}
|
|
96
|
+
__name(generateArticleUrl, "generateArticleUrl");
|
|
97
|
+
function getVersionTypeName(versionType) {
|
|
98
|
+
const typeMap = {
|
|
99
|
+
"release": "正式版",
|
|
100
|
+
"snapshot": "快照",
|
|
101
|
+
"pre-release": "预发布版",
|
|
102
|
+
"release-candidate": "发布候选"
|
|
103
|
+
};
|
|
104
|
+
return typeMap[versionType] || versionType;
|
|
105
|
+
}
|
|
106
|
+
__name(getVersionTypeName, "getVersionTypeName");
|
|
107
|
+
async function fetchVersionManifest() {
|
|
108
|
+
try {
|
|
109
|
+
const httpConfig = {
|
|
110
|
+
timeout: 1e4
|
|
111
|
+
};
|
|
112
|
+
if (effectiveConfig.useProxy && effectiveConfig.proxyUrl) {
|
|
113
|
+
httpConfig.proxy = {
|
|
114
|
+
protocol: "http",
|
|
115
|
+
host: effectiveConfig.proxyUrl.split("://")[1].split(":")[0],
|
|
116
|
+
port: parseInt(effectiveConfig.proxyUrl.split(":").pop() || "7890")
|
|
117
|
+
};
|
|
118
|
+
logger.info(`使用代理: ${effectiveConfig.proxyUrl}`);
|
|
119
|
+
}
|
|
120
|
+
const response = await ctx.http.get("https://piston-meta.mojang.com/mc/game/version_manifest_v2.json", httpConfig);
|
|
121
|
+
return response;
|
|
122
|
+
} catch (error) {
|
|
123
|
+
logger.error("获取版本清单失败:", error);
|
|
124
|
+
throw error;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
__name(fetchVersionManifest, "fetchVersionManifest");
|
|
128
|
+
function generateGroupMessage(versionInfo) {
|
|
129
|
+
const versionType = detectVersionType(versionInfo.id);
|
|
130
|
+
const versionTypeName = getVersionTypeName(versionType);
|
|
131
|
+
const articleUrl = generateArticleUrl(versionInfo);
|
|
132
|
+
const message = effectiveConfig.messageTemplate.replace(/{type}/g, versionTypeName).replace(/{version}/g, versionInfo.id).replace(/{url}/g, articleUrl);
|
|
133
|
+
return message;
|
|
134
|
+
}
|
|
135
|
+
__name(generateGroupMessage, "generateGroupMessage");
|
|
136
|
+
async function sendGroupMessage(versionInfo, isTest = false) {
|
|
137
|
+
const versionType = detectVersionType(versionInfo.id);
|
|
138
|
+
if (!isTest) {
|
|
139
|
+
if (versionType === "release" && !effectiveConfig.enableRelease || versionType === "snapshot" && !effectiveConfig.enableSnapshot || versionType === "pre-release" && !effectiveConfig.enablePreRelease || versionType === "release-candidate" && !effectiveConfig.enableReleaseCandidate) {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const message = generateGroupMessage(versionInfo);
|
|
144
|
+
for (const groupId of effectiveConfig.groups) {
|
|
145
|
+
try {
|
|
146
|
+
await ctx.broadcast([groupId], message);
|
|
147
|
+
} catch (error) {
|
|
148
|
+
logger.error(`向群 ${groupId} 发送消息失败:`, error);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
__name(sendGroupMessage, "sendGroupMessage");
|
|
153
|
+
async function checkForUpdates() {
|
|
154
|
+
try {
|
|
155
|
+
const manifest = await fetchVersionManifest();
|
|
156
|
+
if (isFirstRun) {
|
|
157
|
+
for (const version of manifest.versions) {
|
|
158
|
+
knownVersions.add(version.id);
|
|
159
|
+
}
|
|
160
|
+
isFirstRun = false;
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const newVersions = [];
|
|
164
|
+
for (const version of manifest.versions) {
|
|
165
|
+
if (!knownVersions.has(version.id)) {
|
|
166
|
+
newVersions.push(version);
|
|
167
|
+
knownVersions.add(version.id);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (newVersions.length > 0) {
|
|
171
|
+
logger.info(`发现 ${newVersions.length} 个新版本`);
|
|
172
|
+
newVersions.sort((a, b) => new Date(b.releaseTime).getTime() - new Date(a.releaseTime).getTime());
|
|
173
|
+
for (const version of newVersions) {
|
|
174
|
+
await sendGroupMessage(version);
|
|
175
|
+
await new Promise((resolve) => setTimeout(resolve, 1e3));
|
|
176
|
+
}
|
|
177
|
+
} else {
|
|
178
|
+
logger.debug("未发现新版本");
|
|
179
|
+
}
|
|
180
|
+
} catch (error) {
|
|
181
|
+
logger.error("检查更新失败:", error);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
__name(checkForUpdates, "checkForUpdates");
|
|
185
|
+
ctx.command("mc-check", "手动检查Minecraft版本更新").action(async ({ session }) => {
|
|
186
|
+
try {
|
|
187
|
+
const manifest = await fetchVersionManifest();
|
|
188
|
+
const latestRelease = manifest.versions.find((v) => v.id === manifest.latest.release);
|
|
189
|
+
const latestSnapshot = manifest.versions.find((v) => v.id === manifest.latest.snapshot);
|
|
190
|
+
let message = "当前最新版本:\n";
|
|
191
|
+
if (latestRelease) {
|
|
192
|
+
const releaseUrl = generateArticleUrl(latestRelease);
|
|
193
|
+
message += `正式版: ${latestRelease.id}
|
|
194
|
+
文章地址: ${releaseUrl}
|
|
195
|
+
`;
|
|
196
|
+
}
|
|
197
|
+
if (latestSnapshot) {
|
|
198
|
+
const snapshotUrl = generateArticleUrl(latestSnapshot);
|
|
199
|
+
message += `快照版: ${latestSnapshot.id}
|
|
200
|
+
文章地址: ${snapshotUrl}`;
|
|
201
|
+
}
|
|
202
|
+
await session.send(message);
|
|
203
|
+
} catch (error) {
|
|
204
|
+
await session.send("检查失败,请稍后重试");
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
ctx.command("mc-status", "查看Minecraft版本检查器状态").action(async ({ session }) => {
|
|
208
|
+
const status = {
|
|
209
|
+
"检查间隔": `${effectiveConfig.interval} 秒`,
|
|
210
|
+
"监控群组": effectiveConfig.groups.length > 0 ? effectiveConfig.groups.join(", ") : "无",
|
|
211
|
+
"已知版本数": knownVersions.size,
|
|
212
|
+
"通知类型": [
|
|
213
|
+
effectiveConfig.enableRelease && "正式版",
|
|
214
|
+
effectiveConfig.enableSnapshot && "快照",
|
|
215
|
+
effectiveConfig.enablePreRelease && "预发布版",
|
|
216
|
+
effectiveConfig.enableReleaseCandidate && "发布候选"
|
|
217
|
+
].filter(Boolean).join(", "),
|
|
218
|
+
"消息模板": effectiveConfig.messageTemplate,
|
|
219
|
+
"使用代理": effectiveConfig.useProxy ? "是" : "否",
|
|
220
|
+
"代理地址": effectiveConfig.useProxy ? effectiveConfig.proxyUrl : "未使用"
|
|
221
|
+
};
|
|
222
|
+
let message = "Minecraft版本检查器状态:\n";
|
|
223
|
+
for (const [key, value] of Object.entries(status)) {
|
|
224
|
+
message += `${key}: ${value}
|
|
225
|
+
`;
|
|
226
|
+
}
|
|
227
|
+
await session.send(message);
|
|
228
|
+
});
|
|
229
|
+
const timer = setInterval(checkForUpdates, effectiveConfig.interval * 1e3);
|
|
230
|
+
ctx.on("dispose", () => {
|
|
231
|
+
clearInterval(timer);
|
|
232
|
+
});
|
|
233
|
+
checkForUpdates().catch((error) => {
|
|
234
|
+
logger.error("初始检查失败:", error);
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
__name(apply, "apply");
|
|
238
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
239
|
+
0 && (module.exports = {
|
|
240
|
+
Config,
|
|
241
|
+
apply,
|
|
242
|
+
name
|
|
243
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "koishi-plugin-minecraft-versions-checker",
|
|
3
|
+
"description": "定期检查mc的版本更新,并群发到群聊",
|
|
4
|
+
"version": "1.1.0",
|
|
5
|
+
"main": "lib/index.js",
|
|
6
|
+
"typings": "lib/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"lib",
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"chatbot",
|
|
14
|
+
"koishi",
|
|
15
|
+
"plugin"
|
|
16
|
+
],
|
|
17
|
+
"peerDependencies": {
|
|
18
|
+
"koishi": "^4.18.7"
|
|
19
|
+
}
|
|
20
|
+
}
|