koishi-plugin-prism-neo 0.0.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.
Files changed (3) hide show
  1. package/lib/index.js +548 -0
  2. package/package.json +19 -0
  3. package/readme.md +5 -0
package/lib/index.js ADDED
@@ -0,0 +1,548 @@
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
+
30
+ // src/service.ts
31
+ function makeUrl(baseUrl, endpoint) {
32
+ return `${baseUrl.trimEnd().replace(/\/+$/, "")}/api/${endpoint.trimStart().replace(/^\/+/, "")}`;
33
+ }
34
+ __name(makeUrl, "makeUrl");
35
+ async function register({ ctx, config }, userId) {
36
+ return await ctx.http.post(
37
+ makeUrl(config.url, "/users"),
38
+ [
39
+ {
40
+ "binds": [
41
+ {
42
+ "type": "QQ",
43
+ "bid": userId
44
+ }
45
+ ]
46
+ }
47
+ ]
48
+ );
49
+ }
50
+ __name(register, "register");
51
+ async function login({ ctx, config }, userId) {
52
+ return await ctx.http.post(
53
+ makeUrl(config.url, `/users/QQ:${userId}/login`)
54
+ );
55
+ }
56
+ __name(login, "login");
57
+ async function logout({ ctx, config }, userId) {
58
+ return await ctx.http.post(
59
+ makeUrl(config.url, `/users/QQ:${userId}/logout`)
60
+ );
61
+ }
62
+ __name(logout, "logout");
63
+ async function billing({ ctx, config }, userId) {
64
+ return await ctx.http.get(
65
+ makeUrl(config.url, `/users/QQ:${userId}/billing`)
66
+ );
67
+ }
68
+ __name(billing, "billing");
69
+ async function list({ ctx, config }) {
70
+ return await ctx.http.get(
71
+ makeUrl(config.url, `/users/logined?binds=true&sessions=true`)
72
+ );
73
+ }
74
+ __name(list, "list");
75
+ async function wallet({ ctx, config }, userId) {
76
+ return await ctx.http.get(
77
+ makeUrl(config.url, `/users/QQ:${userId}/wallet?details=true`)
78
+ );
79
+ }
80
+ __name(wallet, "wallet");
81
+ async function assets({ ctx, config }, userId) {
82
+ return await ctx.http.get(
83
+ makeUrl(config.url, `/users/QQ:${userId}/assets?details=true`)
84
+ );
85
+ }
86
+ __name(assets, "assets");
87
+ async function getLock({ ctx, config }, userId) {
88
+ return await ctx.http.get(
89
+ makeUrl(config.url, `/users/QQ:${userId}/door-password`)
90
+ );
91
+ }
92
+ __name(getLock, "getLock");
93
+ async function machinePowerOn({ ctx, config }, machineName, userId) {
94
+ return await ctx.http.post(
95
+ makeUrl(config.url, `/machine/power`),
96
+ {
97
+ machineName,
98
+ "powerState": true,
99
+ userId: `QQ:${userId}`
100
+ }
101
+ );
102
+ }
103
+ __name(machinePowerOn, "machinePowerOn");
104
+ async function machinePowerOff({ ctx, config }, machineName, userId) {
105
+ return await ctx.http.post(
106
+ makeUrl(config.url, `/machine/power`),
107
+ {
108
+ machineName,
109
+ "powerState": false,
110
+ userId: `QQ:${userId}`
111
+ }
112
+ );
113
+ }
114
+ __name(machinePowerOff, "machinePowerOff");
115
+ async function getAllMachinePower({ ctx, config, session }) {
116
+ return await ctx.http.get(
117
+ makeUrl(config.url, `/machine/power`)
118
+ );
119
+ }
120
+ __name(getAllMachinePower, "getAllMachinePower");
121
+ async function getMachinePower({ ctx, config, session }, machineName) {
122
+ return await ctx.http.get(
123
+ makeUrl(config.url, `/machine/power?name=${machineName}`)
124
+ );
125
+ }
126
+ __name(getMachinePower, "getMachinePower");
127
+ async function walletAdd({ ctx, config }, amount, userId) {
128
+ return await ctx.http.post(
129
+ makeUrl(config.url, `/users/QQ:${userId}/wallet`),
130
+ {
131
+ type: "free",
132
+ action: amount,
133
+ comment: "管理员添加"
134
+ }
135
+ );
136
+ }
137
+ __name(walletAdd, "walletAdd");
138
+ async function walletDel({ ctx, config }, amount, userId) {
139
+ return await ctx.http.post(
140
+ makeUrl(config.url, `/users/QQ:${userId}/wallet`),
141
+ {
142
+ type: "free",
143
+ action: -amount,
144
+ comment: "管理员扣除"
145
+ }
146
+ );
147
+ }
148
+ __name(walletDel, "walletDel");
149
+ async function costOverwrite({ ctx, config }, amount, userId) {
150
+ return await ctx.http.post(
151
+ makeUrl(config.url, `/users/QQ:${userId}/billing-overwrite`),
152
+ {
153
+ cost: parseInt(amount)
154
+ }
155
+ );
156
+ }
157
+ __name(costOverwrite, "costOverwrite");
158
+ async function redeem({ ctx, config }, code, userId) {
159
+ return await ctx.http.post(
160
+ makeUrl(config.url, `/users/QQ:${userId}/redeem`),
161
+ {
162
+ code
163
+ }
164
+ );
165
+ }
166
+ __name(redeem, "redeem");
167
+
168
+ // src/index.ts
169
+ var name = "prism-neo";
170
+ var kv = /* @__PURE__ */ new Map();
171
+ var Config = import_koishi.Schema.object({
172
+ url: import_koishi.Schema.string().required(),
173
+ admin: import_koishi.Schema.string().default("authority:3")
174
+ });
175
+ var handleAction = /* @__PURE__ */ __name((action) => {
176
+ return async (argv, ...args) => {
177
+ let message;
178
+ try {
179
+ message = await action(argv, ...args);
180
+ } catch (e) {
181
+ console.error(e);
182
+ const apiMessage = e?.response?.data?.message;
183
+ if (apiMessage) {
184
+ message = apiMessage;
185
+ } else {
186
+ message = "操作失败,发生了未知错误。";
187
+ }
188
+ }
189
+ if (argv.session?.messageId) {
190
+ message = (0, import_koishi.h)("quote", { id: argv.session.messageId }) + message;
191
+ }
192
+ return message;
193
+ };
194
+ }, "handleAction");
195
+ var formatDateTime = /* @__PURE__ */ __name((dateStr) => {
196
+ if (!dateStr) return "永不过期";
197
+ const date = new Date(dateStr);
198
+ const y = date.getFullYear();
199
+ const m = (date.getMonth() + 1).toString().padStart(2, "0");
200
+ const d = date.getDate().toString().padStart(2, "0");
201
+ const h2 = date.getHours().toString().padStart(2, "0");
202
+ const min = date.getMinutes().toString().padStart(2, "0");
203
+ const s = date.getSeconds().toString().padStart(2, "0");
204
+ return `${y}/${m}/${d} ${h2}:${min}:${s}`;
205
+ }, "formatDateTime");
206
+ var formatBilling = /* @__PURE__ */ __name((res) => {
207
+ const message = [];
208
+ message.push("--- 账单详情 ---");
209
+ message.push(`入场: ${formatDateTime(res.session.createdAt)}`);
210
+ message.push(`结算: ${formatDateTime(res.billing.endTime)}`);
211
+ message.push("---");
212
+ const originalCost = res.discount ? res.discount.originalCost : res.billing.totalCost;
213
+ let finalCost = res.discount ? res.discount.finalCost : res.billing.totalCost;
214
+ if (res.session.costOverwrite) {
215
+ finalCost = res.session.costOverwrite;
216
+ }
217
+ message.push(`计费价: ${originalCost} 月饼`);
218
+ if (res.discount && res.discount.appliedLogs.length > 0) {
219
+ res.discount.appliedLogs.forEach((log) => {
220
+ message.push(` -「${log.asset}」: -${log.saved} 月饼`);
221
+ });
222
+ }
223
+ message.push(`结算价: ${finalCost} 月饼`);
224
+ message.push("---");
225
+ const currentBalance = res.wallet.total.available;
226
+ const finalBalance = currentBalance - finalCost;
227
+ message.push(`当前余额: ${currentBalance} 月饼`);
228
+ message.push(`扣款后: ${finalBalance} 月饼`);
229
+ message.push("---");
230
+ message.push("计费区间:");
231
+ if (res.billing.segments.length > 0) {
232
+ res.billing.segments.forEach((seg) => {
233
+ if (seg.cost >= 0) {
234
+ const start = new Date(seg.startTime);
235
+ const end = new Date(seg.endTime);
236
+ const timeOnlyOptions = {
237
+ hour: "2-digit",
238
+ minute: "2-digit",
239
+ second: "2-digit",
240
+ hour12: false
241
+ };
242
+ const formatTime = /* @__PURE__ */ __name((d) => d.toLocaleTimeString("en-GB", timeOnlyOptions), "formatTime");
243
+ const formatDate = /* @__PURE__ */ __name((d) => `${d.getMonth() + 1}/${d.getDate()}`, "formatDate");
244
+ let timeString;
245
+ if (start.toLocaleDateString() === end.toLocaleDateString()) {
246
+ timeString = `${formatTime(start)} - ${formatTime(end)}`;
247
+ } else {
248
+ timeString = `${formatDate(start)} ${formatTime(start)} - ${formatDate(end)} ${formatTime(end)}`;
249
+ }
250
+ message.push(`- ${seg.ruleName}`);
251
+ message.push(` 时段: ${timeString}`);
252
+ message.push(` 费用: ${seg.cost} 月饼 ${seg.isCapped ? "(已封顶)" : ""}`);
253
+ }
254
+ });
255
+ } else {
256
+ message.push(" (无)");
257
+ }
258
+ const monthlyPass = res.wallet.passes?.details?.available?.[0];
259
+ if (monthlyPass && monthlyPass.expireAt) {
260
+ message.push("---");
261
+ message.push(`您的月卡将于 ${formatDateTime(monthlyPass.expireAt)} 到期。`);
262
+ }
263
+ return message.join("\n");
264
+ }, "formatBilling");
265
+ async function getTargetUserId(context, user) {
266
+ if (user) {
267
+ if (!await context.ctx.permissions.check(context.config.admin, context.session)) {
268
+ return { error: "权限不足" };
269
+ }
270
+ return { userId: user.split(":")[1] };
271
+ }
272
+ return { userId: context.session.userId };
273
+ }
274
+ __name(getTargetUserId, "getTargetUserId");
275
+ async function handleRegisterCmd(context, user) {
276
+ const { error, userId } = await getTargetUserId(context, user);
277
+ if (error) return error;
278
+ await register(context, userId);
279
+ return user ? `为用户 ${userId} 注册成功` : "注册成功";
280
+ }
281
+ __name(handleRegisterCmd, "handleRegisterCmd");
282
+ async function handleLoginCmd(context, user) {
283
+ const { error, userId } = await getTargetUserId(context, user);
284
+ if (error) return error;
285
+ await login(context, userId);
286
+ const pwd = await getLock(context, userId);
287
+ if (user) {
288
+ return `✅ 已为用户 ${userId} 入场,该用户的门锁密码是: ${pwd.password}
289
+ 注意! 门锁密码有效期为三分钟`;
290
+ }
291
+ return `✅ 入场成功,你的门锁密码是: ${pwd.password}
292
+ 注意! 门锁密码有效期为三分钟`;
293
+ }
294
+ __name(handleLoginCmd, "handleLoginCmd");
295
+ async function handleLogoutCmd(context, user) {
296
+ const { error, userId: targetUserId } = await getTargetUserId(context, user);
297
+ if (error) return error;
298
+ const pendingLogout = kv.get(targetUserId);
299
+ const now = Date.now();
300
+ if (pendingLogout && now - pendingLogout < 60 * 1e3) {
301
+ kv.delete(targetUserId);
302
+ const res = await logout(context, targetUserId);
303
+ const messagePrefix = user ? `✅ 已为用户 ${targetUserId} 退场` : "✅ 退场成功";
304
+ return [
305
+ messagePrefix,
306
+ `入场时间: ${formatDateTime(res.session.createdAt)}`,
307
+ `离场时间: ${formatDateTime(res.session.closedAt)}`,
308
+ `消费: ${res.billing.totalCost} 月饼`
309
+ ].join("\n");
310
+ } else {
311
+ const billingRes = await billing(context, targetUserId);
312
+ const billingMessage = formatBilling(billingRes);
313
+ kv.set(targetUserId, now);
314
+ if (user) {
315
+ return `以下是用户 ${targetUserId} 的账单预览:
316
+
317
+ ${billingMessage}
318
+
319
+ ---
320
+ ⚠️ 请在60秒内再次输入 /logout ${user} 以确认登出。`;
321
+ }
322
+ return `${billingMessage}
323
+
324
+ ---
325
+ ⚠️ 这是您的账单预览。请在60秒内再次输入 /logout 以确认登出。`;
326
+ }
327
+ }
328
+ __name(handleLogoutCmd, "handleLogoutCmd");
329
+ async function handleListCmd(context, user) {
330
+ const users = await list(context);
331
+ if (!users || users.length === 0) {
332
+ return "窝里目前没有玩家呢";
333
+ }
334
+ const userReports = users.map((user2) => {
335
+ const qqBind = user2.binds.find((bind) => bind.type === "QQ");
336
+ const name2 = qqBind ? qqBind.bid : "匿名玩家";
337
+ const entryDate = formatDateTime(user2.sessions[0].createdAt);
338
+ return `玩家: ${name2}
339
+ 入场时间: ${entryDate}`;
340
+ });
341
+ return `窝里目前共有 ${users.length} 人
342
+
343
+ ${userReports.join("\n\n")}`;
344
+ }
345
+ __name(handleListCmd, "handleListCmd");
346
+ async function handleWalletCmd(context, user) {
347
+ const { error, userId } = await getTargetUserId(context, user);
348
+ if (error) return error;
349
+ const res = await wallet(context, userId);
350
+ const message = [];
351
+ const targetUserId = user ? userId : void 0;
352
+ message.push(targetUserId ? `--- 用户 ${targetUserId} 的钱包余额 ---` : "--- 钱包余额 ---");
353
+ message.push(
354
+ `可用: ${res.total.available} 月饼 (共 ${res.total.all})`,
355
+ ` - 付费: ${res.paid.available}`,
356
+ ` - 免费: ${res.free.available}`
357
+ );
358
+ const unavailable = res.total.all - res.total.available;
359
+ if (unavailable > 0) {
360
+ message.push(`
361
+ 您还有 ${unavailable} 月饼未到可用时间。`);
362
+ }
363
+ const expiringFreeAssets = res.free.details?.available?.filter((asset) => asset.expireAt) || [];
364
+ if (expiringFreeAssets.length > 0) {
365
+ expiringFreeAssets.sort((a, b) => new Date(a.expireAt).getTime() - new Date(b.expireAt).getTime());
366
+ const soonestToExpire = expiringFreeAssets[0];
367
+ message.push(`
368
+ 注意:您有 ${soonestToExpire.count} 免费月饼将于 ${formatDateTime(soonestToExpire.expireAt)} 过期。`);
369
+ }
370
+ const availablePasses = res.passes?.details?.available || [];
371
+ if (availablePasses.length > 0) {
372
+ message.push(`
373
+ --- 可用月卡 (${availablePasses.length}) ---`);
374
+ availablePasses.forEach((pass) => {
375
+ message.push(`- ${pass.asset.name}`);
376
+ message.push(` 到期: ${formatDateTime(pass.expireAt)}`);
377
+ });
378
+ }
379
+ const availableTickets = res.tickets?.details?.available || [];
380
+ if (availableTickets.length > 0) {
381
+ message.push(`
382
+ --- 可用优惠券 (${availableTickets.length}) ---`);
383
+ availableTickets.forEach((ticket) => {
384
+ message.push(`- ${ticket.asset.name} (x${ticket.count})`);
385
+ message.push(` 到期: ${formatDateTime(ticket.expireAt)}`);
386
+ });
387
+ }
388
+ return message.join("\n");
389
+ }
390
+ __name(handleWalletCmd, "handleWalletCmd");
391
+ async function handleBillingCmd(context, user) {
392
+ const { error, userId } = await getTargetUserId(context, user);
393
+ if (error) return error;
394
+ const res = await billing(context, userId);
395
+ const billingMessage = formatBilling(res);
396
+ if (user) {
397
+ return `用户 ${userId} 的账单:
398
+
399
+ ${billingMessage}`;
400
+ }
401
+ return billingMessage;
402
+ }
403
+ __name(handleBillingCmd, "handleBillingCmd");
404
+ async function handleLockCmd(context) {
405
+ const res = await getLock(context, context.session.userId);
406
+ return [
407
+ "获取密码成功",
408
+ `你的门锁密码是: ${res.password}`,
409
+ "注意! 门锁密码有效期为三分钟"
410
+ ].join("\n");
411
+ }
412
+ __name(handleLockCmd, "handleLockCmd");
413
+ async function handleItemsCmd(context, user) {
414
+ const { error, userId } = await getTargetUserId(context, user);
415
+ if (error) return error;
416
+ const userAssets = await assets(context, userId);
417
+ if (!userAssets || userAssets.length === 0) {
418
+ return user ? `用户 ${userId} 没有任何物品。` : "您当前没有任何物品。";
419
+ }
420
+ const header = user ? `--- 用户 ${userId} 拥有的物品 ---` : "--- 您拥有的物品 ---";
421
+ const itemsList = userAssets.map((asset) => {
422
+ let line = `- ${asset.asset.name} (x${asset.count})`;
423
+ if (asset.expireAt) {
424
+ line += `
425
+ 到期: ${formatDateTime(asset.expireAt)}`;
426
+ }
427
+ return line;
428
+ });
429
+ return [
430
+ header,
431
+ ...itemsList
432
+ ].join("\n");
433
+ }
434
+ __name(handleItemsCmd, "handleItemsCmd");
435
+ async function handleMachineOn(context, alias) {
436
+ if (!alias) return "请输入设备名";
437
+ const res = await machinePowerOn(context, alias, context.session.userId);
438
+ return `${res.machine} 启动成功`;
439
+ }
440
+ __name(handleMachineOn, "handleMachineOn");
441
+ async function handleMachineOff(context, alias) {
442
+ if (!alias) return "请输入设备名";
443
+ const res = await machinePowerOff(context, alias, context.session.userId);
444
+ return `${res.machine} 关闭成功`;
445
+ }
446
+ __name(handleMachineOff, "handleMachineOff");
447
+ async function handleMachineShow(context, alias) {
448
+ if (alias) {
449
+ const res = await getMachinePower(context, alias);
450
+ return `${res.machine}: ${res.state.state}`;
451
+ } else {
452
+ const res = await getAllMachinePower(context);
453
+ return res.map(
454
+ (e) => {
455
+ return `${e.machine}: ${e.state.state}`;
456
+ }
457
+ ).join("\n");
458
+ }
459
+ }
460
+ __name(handleMachineShow, "handleMachineShow");
461
+ async function handleWalletAdd(context, user, amount) {
462
+ const { error, userId } = await getTargetUserId(context, user);
463
+ if (error) return error;
464
+ if (!amount) return "请输入数量";
465
+ const res = await walletAdd(context, parseInt(amount), userId);
466
+ return [
467
+ `为用户 ${userId} 增加月饼成功`,
468
+ `增加前: ${res.originalBalance}`,
469
+ `增加后: ${res.finalBalance}`
470
+ ].join("\n");
471
+ }
472
+ __name(handleWalletAdd, "handleWalletAdd");
473
+ async function handleWalletDeduct(context, user, amount) {
474
+ const { error, userId } = await getTargetUserId(context, user);
475
+ if (error) return error;
476
+ if (!amount) return "请输入数量";
477
+ const res = await walletDel(context, parseInt(amount), userId);
478
+ return [
479
+ `为用户 ${userId} 扣除月饼成功`,
480
+ `扣款前: ${res.originalBalance}`,
481
+ `扣款后: ${res.finalBalance}`
482
+ ].join("\n");
483
+ }
484
+ __name(handleWalletDeduct, "handleWalletDeduct");
485
+ async function handleCostOverwrite(context, user, amount) {
486
+ const { error, userId } = await getTargetUserId(context, user);
487
+ if (error) return error;
488
+ if (!amount) return "请输入数量";
489
+ await costOverwrite(context, amount, userId);
490
+ return `为用户 ${userId} 调价成功`;
491
+ }
492
+ __name(handleCostOverwrite, "handleCostOverwrite");
493
+ async function handleRedeem(context, code) {
494
+ const { error, userId } = await getTargetUserId(context, null);
495
+ if (error) return error;
496
+ if (!code) return "请输入兑换码";
497
+ const res = await redeem(context, code, userId);
498
+ const items = res;
499
+ if (!items || items.length === 0) {
500
+ return "兑换成功,但没有获得任何物品。";
501
+ }
502
+ const message = ["✅ 兑换成功!您获得了以下物品:"];
503
+ items.forEach((item) => {
504
+ let itemName = item.name;
505
+ if (item.assetType === "PASS" && item.durationMs) {
506
+ const days = Math.floor(item.durationMs / (1e3 * 60 * 60 * 24));
507
+ if (days > 0) itemName += ` (${days}天)`;
508
+ }
509
+ message.push(`- ${itemName} x${item.count}`);
510
+ });
511
+ return message.join("\n");
512
+ }
513
+ __name(handleRedeem, "handleRedeem");
514
+ function apply(ctx, config) {
515
+ const createAction = /* @__PURE__ */ __name((handler) => {
516
+ const actionFn = /* @__PURE__ */ __name((argv, ...args) => {
517
+ const context = {
518
+ ctx,
519
+ config,
520
+ session: argv.session
521
+ };
522
+ return handler(context, ...args);
523
+ }, "actionFn");
524
+ return handleAction(actionFn);
525
+ }, "createAction");
526
+ ctx.command("register [user:user]").action(createAction(handleRegisterCmd));
527
+ ctx.command("login [user:user]").action(createAction(handleLoginCmd));
528
+ ctx.command("logout [user:user]").action(createAction(handleLogoutCmd));
529
+ ctx.command("list").action(createAction(handleListCmd));
530
+ ctx.command("wallet [user:user]").action(createAction(handleWalletCmd));
531
+ ctx.command("billing [user:user]").action(createAction(handleBillingCmd));
532
+ ctx.command("lock").action(createAction(handleLockCmd));
533
+ ctx.command("items [user:user]").action(createAction(handleItemsCmd));
534
+ ctx.command("show [alias]").action(createAction(handleMachineShow));
535
+ ctx.command("on <alias>").action(createAction(handleMachineOn));
536
+ ctx.command("off <alias>").action(createAction(handleMachineOff));
537
+ ctx.command("redeem <code>").action(createAction(handleRedeem));
538
+ ctx.command("add <user:user> <amount>").action(createAction(handleWalletAdd));
539
+ ctx.command("del <user:user> <amount>").action(createAction(handleWalletDeduct));
540
+ ctx.command("overwrite <user:user> <amount>").action(createAction(handleCostOverwrite));
541
+ }
542
+ __name(apply, "apply");
543
+ // Annotate the CommonJS export names for ESM import in node:
544
+ 0 && (module.exports = {
545
+ Config,
546
+ apply,
547
+ name
548
+ });
package/package.json ADDED
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "koishi-plugin-prism-neo",
3
+ "description": "prism koishi前端",
4
+ "version": "0.0.3",
5
+ "main": "lib/index.js",
6
+ "files": [
7
+ "lib",
8
+ "dist"
9
+ ],
10
+ "license": "MIT",
11
+ "keywords": [
12
+ "chatbot",
13
+ "koishi",
14
+ "plugin"
15
+ ],
16
+ "peerDependencies": {
17
+ "koishi": "^4.18.7"
18
+ }
19
+ }
package/readme.md ADDED
@@ -0,0 +1,5 @@
1
+ # koishi-plugin-prism-neo
2
+
3
+ [![npm](https://img.shields.io/npm/v/koishi-plugin-prism-neo?style=flat-square)](https://www.npmjs.com/package/koishi-plugin-prism-neo)
4
+
5
+ prism koishi前端