koishi-plugin-cchess 1.0.4 → 1.0.5
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 -5
- package/lib/index.js +83 -93
- package/package.json +1 -5
- package/readme.md +17 -9
package/lib/index.d.ts
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import { Context, Schema } from 'koishi';
|
|
2
2
|
export declare const name = "cchess";
|
|
3
3
|
export declare const usage = "## \u4F7F\u7528\n\n1. \u5B89\u88C5 `puppeteer` \u670D\u52A1\u3002\n2. \u8BBE\u7F6E\u6307\u4EE4\u522B\u540D\u3002\n\n## Q&A\n\n1. \u5982\u4F55\u79FB\u52A8\u68CB\u5B50\uFF1F\n\n- \u7EB5\u7EBF\uFF08\u70AE\u4E8C\u5E73\u4E94/\u70AE8\u5E735\uFF09\u6216\u5B57\u6BCD\u5750\u6807\uFF08a0a1\uFF09\u3002\n- \u8BE6\u89C1 [\u4E2D\u56FD\u8C61\u68CB\u7740\u6CD5\u8868\u793A](https://www.xqbase.com/protocol/cchess_move.htm)\u3002\n\n## QQ \u7FA4\n\n- 956758505";
|
|
4
|
-
export declare const inject:
|
|
5
|
-
required: string[];
|
|
6
|
-
optional: string[];
|
|
7
|
-
};
|
|
4
|
+
export declare const inject: string[];
|
|
8
5
|
export interface Config {
|
|
9
6
|
boardSkin: string;
|
|
10
7
|
pieceSkin: string;
|
|
@@ -15,7 +12,6 @@ export interface Config {
|
|
|
15
12
|
isChessImageWithOutlineEnabled: boolean;
|
|
16
13
|
imgScale: number;
|
|
17
14
|
imageType: "png" | "jpeg" | "webp";
|
|
18
|
-
isTextToImageConversionEnabled: boolean;
|
|
19
15
|
}
|
|
20
16
|
export declare const Config: Schema<Config>;
|
|
21
17
|
declare module 'koishi' {
|
package/lib/index.js
CHANGED
|
@@ -56,10 +56,7 @@ var usage = `## 使用
|
|
|
56
56
|
## QQ 群
|
|
57
57
|
|
|
58
58
|
- 956758505`;
|
|
59
|
-
var inject =
|
|
60
|
-
required: ["database", "puppeteer", "canvas"],
|
|
61
|
-
optional: ["markdownToImage"]
|
|
62
|
-
};
|
|
59
|
+
var inject = ["database", "puppeteer", "canvas"];
|
|
63
60
|
var pieceSkins = ["棋弈无限图形棋子", "云库木制棋子", "刘炳森红黑牛角隶书棋子", "木制棋子", "本纹隶书棋子", "银灰将军体棋子", "棋弈无限红绿正棋子", "棋弈无限红绿棋子", "棋天大圣棋子", "棋者象棋棋子", "楷书玉石棋子", "水墨青瓷棋子", "牛皮纸华康金文棋子", "皮卡鱼棋子", "红蓝祥隶棋子", "红黑精典无阴影棋子", "红黑精典棋子", "行书玉石棋子", "象甲棋子", "金属棋子篆体棋子", "镌刻华彩棋子", "鹏飞红黑棋子", "鹏飞经典棋子", "鹏飞绿龙棋子", "龙腾四海棋子"];
|
|
64
61
|
var boardSkins = ["棋弈无限红绿棋盘", "一鸣惊人棋盘", "三星堆棋盘", "云库木制棋盘", "云心鹤眼棋盘", "兰亭集序无字棋盘", "兰亭集序棋盘", "凤舞九天棋盘", "卯兔添福棋盘", "叱咤风云棋盘", "君临天下棋盘", "壁画古梦棋盘", "大闹天宫棋盘", "天山共色棋盘", "女神之约棋盘", "小吕飞刀棋盘", "山海绘卷棋盘", "护眼绿棋盘", "星河璀璨棋盘", "木制棋盘", "本纹隶书白棋盘", "本纹隶书黑棋盘", "桃花源记棋盘", "棋天大圣棋盘", "棋天无大圣棋盘", "武侠江湖棋盘", "水墨青瓷棋盘", "清悠茶道棋盘", "游园惊梦棋盘", "牛转乾坤棋盘", "玉石太极棋盘", "皓月无痕棋盘", "皮卡鱼棋盘", "盲棋神迹棋盘", "空城计棋盘", "竹波烟雨棋盘", "经典木棋盘棋盘", "绿色棋盘", "象甲2023棋盘", "象甲征程棋盘", "象甲重燃棋盘", "金牛降世棋盘", "金虎贺岁棋盘", "金虎贺岁(王天一签名版)棋盘", "鎏金岁月棋盘", "霸王别姬棋盘", "鸿门宴棋盘", "鹏飞红黑棋盘", "鹏飞经典棋盘", "鹏飞绿龙棋盘", "龙腾天坛棋盘"];
|
|
65
62
|
var Config = import_koishi.Schema.object({
|
|
@@ -71,7 +68,6 @@ var Config = import_koishi.Schema.object({
|
|
|
71
68
|
retractDelay: import_koishi.Schema.number().min(0).default(0).description(`自动撤回等待的时间,单位是秒。值为 0 时不启用自动撤回功能。`),
|
|
72
69
|
imgScale: import_koishi.Schema.number().min(1).default(1).description(`图片分辨率倍率。`),
|
|
73
70
|
imageType: import_koishi.Schema.union(["png", "jpeg", "webp"]).default("png").description(`发送的图片类型。`),
|
|
74
|
-
isTextToImageConversionEnabled: import_koishi.Schema.boolean().default(false).description(`是否开启将文本转为图片的功能(可选),如需启用,需要启用 \`markdownToImage\` 服务。`),
|
|
75
71
|
isChessImageWithOutlineEnabled: import_koishi.Schema.boolean().default(true).description(`是否为象棋图片添加辅助外框,关闭后可以显著提升图片速度,但无辅助外框,玩起来可能会比较累。`)
|
|
76
72
|
});
|
|
77
73
|
function apply(ctx, config) {
|
|
@@ -213,7 +209,7 @@ function apply(ctx, config) {
|
|
|
213
209
|
if (gameRecord.isStarted) {
|
|
214
210
|
const buffer = await drawChessBoard(channelId);
|
|
215
211
|
const hImg = import_koishi.h.image(buffer, `image/${config.imageType}`);
|
|
216
|
-
return await sendMessage(session,
|
|
212
|
+
return await sendMessage(session, `【@${username}】
|
|
217
213
|
游戏已经开始啦!
|
|
218
214
|
${hImg}`);
|
|
219
215
|
}
|
|
@@ -224,7 +220,7 @@ ${hImg}`);
|
|
|
224
220
|
if (!choice) {
|
|
225
221
|
choice = Math.random() < 0.5 ? "红方" : "黑方";
|
|
226
222
|
} else if (choice.includes("红") && choice.includes("黑")) {
|
|
227
|
-
return await sendMessage(session,
|
|
223
|
+
return await sendMessage(session, `【@${username}】
|
|
228
224
|
一次只能选择一方哦!`);
|
|
229
225
|
} else if (choice.includes("红")) {
|
|
230
226
|
choice = "红方";
|
|
@@ -238,19 +234,19 @@ ${hImg}`);
|
|
|
238
234
|
const playersNum = getPlayerRecords.length;
|
|
239
235
|
if (getPlayerRecord.length === 0) {
|
|
240
236
|
await ctx.database.create("cchess_gaming_player_records", { channelId, userId, username, side: choice });
|
|
241
|
-
return await sendMessage(session,
|
|
237
|
+
return await sendMessage(session, `【@${username}】
|
|
242
238
|
您加入游戏啦!
|
|
243
|
-
|
|
244
|
-
|
|
239
|
+
您的队伍为:【${choice}】
|
|
240
|
+
当前玩家人数为:【${playersNum + 1}】
|
|
245
241
|
带“黑”或“红”加入游戏可以更换队伍哦~
|
|
246
242
|
例如:
|
|
247
243
|
- 加入指令 红
|
|
248
244
|
- 加入指令 黑`);
|
|
249
245
|
} else {
|
|
250
246
|
await ctx.database.set("cchess_gaming_player_records", { channelId, userId }, { side: choice });
|
|
251
|
-
return await sendMessage(session,
|
|
252
|
-
|
|
253
|
-
|
|
247
|
+
return await sendMessage(session, `【@${username}】
|
|
248
|
+
您已更换队伍为:【${choice}】
|
|
249
|
+
当前玩家人数为:【${playersNum}】`);
|
|
254
250
|
}
|
|
255
251
|
});
|
|
256
252
|
ctx.command("cchess.退出", "退出游戏").action(async ({ session }) => {
|
|
@@ -258,7 +254,7 @@ ${hImg}`);
|
|
|
258
254
|
await updateNameInPlayerRecord(userId, username);
|
|
259
255
|
const gameRecord = await getGameRecord(channelId);
|
|
260
256
|
if (gameRecord.isStarted) {
|
|
261
|
-
return await sendMessage(session,
|
|
257
|
+
return await sendMessage(session, `【@${username}】
|
|
262
258
|
游戏已经开始啦~
|
|
263
259
|
不许逃跑哦!`);
|
|
264
260
|
}
|
|
@@ -267,13 +263,13 @@ ${hImg}`);
|
|
|
267
263
|
const getPlayerRecords = await ctx.database.get("cchess_gaming_player_records", { channelId });
|
|
268
264
|
const playersNum = getPlayerRecords.length;
|
|
269
265
|
if (getPlayerRecord.length === 0) {
|
|
270
|
-
return await sendMessage(session,
|
|
266
|
+
return await sendMessage(session, `【@${username}】
|
|
271
267
|
您还未加入游戏呢!`);
|
|
272
268
|
} else {
|
|
273
269
|
await ctx.database.remove("cchess_gaming_player_records", { channelId, userId });
|
|
274
|
-
return await sendMessage(session,
|
|
270
|
+
return await sendMessage(session, `【@${username}】
|
|
275
271
|
您已退出游戏!
|
|
276
|
-
|
|
272
|
+
剩余玩家人数为:【${playersNum - 1}】`);
|
|
277
273
|
}
|
|
278
274
|
});
|
|
279
275
|
ctx.command("cchess.开始", "开始游戏指令帮助").action(async ({ session }) => {
|
|
@@ -284,7 +280,7 @@ ${hImg}`);
|
|
|
284
280
|
await updateNameInPlayerRecord(userId, username);
|
|
285
281
|
const gameRecord = await getGameRecord(channelId);
|
|
286
282
|
if (gameRecord.isStarted) {
|
|
287
|
-
return await sendMessage(session,
|
|
283
|
+
return await sendMessage(session, `【@${username}】
|
|
288
284
|
游戏已经开始啦!`);
|
|
289
285
|
}
|
|
290
286
|
await checkEngine(channelId);
|
|
@@ -294,18 +290,18 @@ ${hImg}`);
|
|
|
294
290
|
let blackPlayers = getPlayerRecords.filter((player) => player.side === "黑方");
|
|
295
291
|
let message = "";
|
|
296
292
|
if (playersNum < 2) {
|
|
297
|
-
return await sendMessage(session,
|
|
293
|
+
return await sendMessage(session, `【@${username}】
|
|
298
294
|
当前玩家人数不足 2 人,无法开始游戏!`);
|
|
299
295
|
} else {
|
|
300
296
|
if (redPlayers.length !== 1 || blackPlayers.length !== 1) {
|
|
301
297
|
const randomPlayer = getPlayerRecords[Math.floor(Math.random() * getPlayerRecords.length)];
|
|
302
298
|
if (redPlayers.length < 1) {
|
|
303
299
|
randomPlayer.side = "红方";
|
|
304
|
-
message +=
|
|
300
|
+
message += `【@${randomPlayer.username}】被自动分配到红方。
|
|
305
301
|
`;
|
|
306
302
|
} else {
|
|
307
303
|
randomPlayer.side = "黑方";
|
|
308
|
-
message +=
|
|
304
|
+
message += `【@${randomPlayer.username}】被自动分配到黑方。
|
|
309
305
|
`;
|
|
310
306
|
}
|
|
311
307
|
await ctx.database.set("cchess_gaming_player_records", {
|
|
@@ -316,11 +312,11 @@ ${hImg}`);
|
|
|
316
312
|
blackPlayers = getPlayerRecords.filter((player) => player.side === "黑方");
|
|
317
313
|
}
|
|
318
314
|
message += `红方玩家(${redPlayers.length}):
|
|
319
|
-
${redPlayers.map((player) =>
|
|
315
|
+
${redPlayers.map((player) => `【@${player.username}】`).join("\n")}
|
|
320
316
|
|
|
321
317
|
`;
|
|
322
318
|
message += `黑方玩家(${blackPlayers.length}):
|
|
323
|
-
${blackPlayers.map((player) =>
|
|
319
|
+
${blackPlayers.map((player) => `【@${player.username}】`).join("\n")}`;
|
|
324
320
|
await ctx.database.set("cchess_game_records", { channelId }, { isStarted: true });
|
|
325
321
|
const turn = gameRecord.turn;
|
|
326
322
|
const sideString = convertTurnToString(turn);
|
|
@@ -328,7 +324,7 @@ ${blackPlayers.map((player) => `**【@${player.username}】**`).join("\n")}`;
|
|
|
328
324
|
const hImg = import_koishi.h.image(buffer, `image/${config.imageType}`);
|
|
329
325
|
return await sendMessage(session, `### 游戏开始!
|
|
330
326
|
${message}
|
|
331
|
-
|
|
327
|
+
先手方为:【${sideString}】
|
|
332
328
|
${hImg}`);
|
|
333
329
|
}
|
|
334
330
|
});
|
|
@@ -337,7 +333,7 @@ ${hImg}`);
|
|
|
337
333
|
await updateNameInPlayerRecord(userId, username);
|
|
338
334
|
const gameRecord = await getGameRecord(channelId);
|
|
339
335
|
if (gameRecord.isStarted) {
|
|
340
|
-
return await sendMessage(session,
|
|
336
|
+
return await sendMessage(session, `【@${username}】
|
|
341
337
|
游戏已经开始啦!`);
|
|
342
338
|
}
|
|
343
339
|
await checkEngine(channelId);
|
|
@@ -348,26 +344,26 @@ ${hImg}`);
|
|
|
348
344
|
let message = "";
|
|
349
345
|
let AISide = "";
|
|
350
346
|
if (playersNum < 1 && !config.allowFreePieceMovementInHumanMachineMode) {
|
|
351
|
-
return await sendMessage(session,
|
|
347
|
+
return await sendMessage(session, `【@${username}】
|
|
352
348
|
当前玩家人数不足 1 人,无法开始游戏!`);
|
|
353
349
|
} else {
|
|
354
350
|
if (playersNum === 1) {
|
|
355
351
|
if (getPlayerRecords[0].side === "红方") {
|
|
356
352
|
await ctx.database.set("cchess_game_records", { channelId }, { isEnginePlayBlack: true });
|
|
357
353
|
AISide = "黑方";
|
|
358
|
-
message +=
|
|
354
|
+
message += `人类队伍为:【红方】
|
|
359
355
|
`;
|
|
360
356
|
} else {
|
|
361
357
|
await ctx.database.set("cchess_game_records", { channelId }, { isEnginePlayRed: true });
|
|
362
358
|
AISide = "红方";
|
|
363
|
-
message +=
|
|
359
|
+
message += `人类队伍为:【黑方】
|
|
364
360
|
`;
|
|
365
361
|
}
|
|
366
362
|
} else {
|
|
367
363
|
if (redPlayers.length > blackPlayers.length) {
|
|
368
364
|
await ctx.database.set("cchess_game_records", { channelId }, { isEnginePlayBlack: true });
|
|
369
365
|
AISide = "黑方";
|
|
370
|
-
message +=
|
|
366
|
+
message += `人类队伍为:【红方】
|
|
371
367
|
`;
|
|
372
368
|
for (const player of blackPlayers) {
|
|
373
369
|
await ctx.database.set("cchess_gaming_player_records", { channelId, userId: player.userId }, { side: "红方" });
|
|
@@ -375,7 +371,7 @@ ${hImg}`);
|
|
|
375
371
|
} else if (redPlayers.length < blackPlayers.length) {
|
|
376
372
|
await ctx.database.set("cchess_game_records", { channelId }, { isEnginePlayRed: true });
|
|
377
373
|
AISide = "红方";
|
|
378
|
-
message +=
|
|
374
|
+
message += `人类队伍为:【黑方】
|
|
379
375
|
`;
|
|
380
376
|
for (const player of redPlayers) {
|
|
381
377
|
await ctx.database.set("cchess_gaming_player_records", { channelId, userId: player.userId }, { side: "黑方" });
|
|
@@ -383,7 +379,7 @@ ${hImg}`);
|
|
|
383
379
|
}
|
|
384
380
|
if (redPlayers.length === blackPlayers.length) {
|
|
385
381
|
const side = Math.random() < 0.5 ? "红方" : "黑方";
|
|
386
|
-
message +=
|
|
382
|
+
message += `人类队伍为:【${side}】
|
|
387
383
|
`;
|
|
388
384
|
const computerSide = side === "红方" ? "黑方" : "红方";
|
|
389
385
|
AISide = computerSide;
|
|
@@ -412,7 +408,7 @@ ${hImg}`);
|
|
|
412
408
|
const hImg = import_koishi.h.image(buffer, `image/${config.imageType}`);
|
|
413
409
|
return await sendMessage(session, `### 游戏开始!
|
|
414
410
|
${message}
|
|
415
|
-
|
|
411
|
+
先手方为:【${sideString}】
|
|
416
412
|
${hImg}`);
|
|
417
413
|
}
|
|
418
414
|
});
|
|
@@ -422,12 +418,12 @@ ${hImg}`);
|
|
|
422
418
|
const gameRecord = await getGameRecord(channelId);
|
|
423
419
|
await checkEngine(channelId);
|
|
424
420
|
if (!gameRecord.isStarted) {
|
|
425
|
-
return await sendMessage(session,
|
|
421
|
+
return await sendMessage(session, `【@${username}】
|
|
426
422
|
游戏未开始哦!
|
|
427
423
|
完全没必要强制结束嘛~`);
|
|
428
424
|
} else {
|
|
429
425
|
await endGame(channelId);
|
|
430
|
-
return await sendMessage(session,
|
|
426
|
+
return await sendMessage(session, `【@${username}】
|
|
431
427
|
游戏已被强制结束!`);
|
|
432
428
|
}
|
|
433
429
|
});
|
|
@@ -435,16 +431,16 @@ ${hImg}`);
|
|
|
435
431
|
const { username, userId, channelId } = session;
|
|
436
432
|
await updateNameInPlayerRecord(userId, username);
|
|
437
433
|
if (!isMoveString(moveOperation) && !isValidFigureMoveName(moveOperation)) {
|
|
438
|
-
return await sendMessage(session,
|
|
434
|
+
return await sendMessage(session, `【@${username}】
|
|
439
435
|
无效的移动!`);
|
|
440
436
|
}
|
|
441
437
|
const gameRecord = await getGameRecord(channelId);
|
|
442
438
|
if (!gameRecord.isStarted) {
|
|
443
|
-
return await sendMessage(session,
|
|
439
|
+
return await sendMessage(session, `【@${username}】
|
|
444
440
|
游戏还未开始哦!`);
|
|
445
441
|
}
|
|
446
442
|
if (gameRecord.isRegretRequest) {
|
|
447
|
-
return await sendMessage(session,
|
|
443
|
+
return await sendMessage(session, `【@${username}】
|
|
448
444
|
正在请求悔棋,等待回应中...`);
|
|
449
445
|
}
|
|
450
446
|
const turn = gameRecord.turn;
|
|
@@ -460,14 +456,14 @@ ${hImg}`);
|
|
|
460
456
|
playerRecord = await ctx.database.get("cchess_gaming_player_records", { channelId, userId });
|
|
461
457
|
}
|
|
462
458
|
} else {
|
|
463
|
-
return await sendMessage(session,
|
|
459
|
+
return await sendMessage(session, `【@${username}】
|
|
464
460
|
您还未加入游戏呢!`);
|
|
465
461
|
}
|
|
466
462
|
}
|
|
467
463
|
if (playerRecord.length === 0 || playerRecord[0].side !== sideString) {
|
|
468
|
-
return await sendMessage(session,
|
|
464
|
+
return await sendMessage(session, `【@${username}】
|
|
469
465
|
还没轮到${sideString}走棋哦!
|
|
470
|
-
|
|
466
|
+
当前走棋方为:【${convertTurnToString(gameRecord.turn)}】`);
|
|
471
467
|
}
|
|
472
468
|
await checkEngine(channelId);
|
|
473
469
|
const board = gameRecord.board;
|
|
@@ -498,7 +494,7 @@ ${hImg}`);
|
|
|
498
494
|
}
|
|
499
495
|
const duplicateMoveInfo = findMoveInfo(moveInfoList, moveOperation);
|
|
500
496
|
if (!duplicateMoveInfo) {
|
|
501
|
-
return await sendMessage(session,
|
|
497
|
+
return await sendMessage(session, `【@${username}】
|
|
502
498
|
无效的移动!`);
|
|
503
499
|
} else {
|
|
504
500
|
[selectedPos, newPos] = duplicateMoveInfo.moveCord;
|
|
@@ -511,13 +507,13 @@ ${hImg}`);
|
|
|
511
507
|
const side = getSide(piece);
|
|
512
508
|
const type = getType(piece);
|
|
513
509
|
if (side !== gameRecord.turn) {
|
|
514
|
-
return await sendMessage(session,
|
|
510
|
+
return await sendMessage(session, `【@${username}】
|
|
515
511
|
还没轮到${convertTurnToString(side)}走棋哦!
|
|
516
|
-
|
|
512
|
+
当前走棋方为:【${convertTurnToString(gameRecord.turn)}】`);
|
|
517
513
|
}
|
|
518
514
|
const moveMap = getValidMoveMap(board, type, side, selectedPos);
|
|
519
515
|
if (moveMap[newRow][newCol] !== "go" && moveMap[newRow][newCol] !== "eat") {
|
|
520
|
-
return await sendMessage(session,
|
|
516
|
+
return await sendMessage(session, `【@${username}】
|
|
521
517
|
无效的移动!`);
|
|
522
518
|
}
|
|
523
519
|
await makeMove(channelId, selectedPos, newPos);
|
|
@@ -534,10 +530,10 @@ ${hImg}`);
|
|
|
534
530
|
const hImg2 = import_koishi.h.image(buffer2, `image/${config.imageType}`);
|
|
535
531
|
await updatePlayerRecords(channelId, newGameRecord.winSide, newGameRecord.loseSide);
|
|
536
532
|
await endGame(channelId);
|
|
537
|
-
return await sendMessage(session,
|
|
533
|
+
return await sendMessage(session, `【@${username}】
|
|
538
534
|
### 绝杀!
|
|
539
535
|
游戏结束!
|
|
540
|
-
|
|
536
|
+
获胜方为:【${convertTurnToString(newGameRecord.winSide)}】
|
|
541
537
|
${hImg2}`);
|
|
542
538
|
}
|
|
543
539
|
if (gameRecord.isEnginePlayRed || gameRecord.isEnginePlayBlack) {
|
|
@@ -557,10 +553,10 @@ ${hImg2}`);
|
|
|
557
553
|
const hImg2 = import_koishi.h.image(buffer2, `image/${config.imageType}`);
|
|
558
554
|
await updatePlayerRecords(channelId, engineResultRecord.winSide, engineResultRecord.loseSide);
|
|
559
555
|
await endGame(channelId);
|
|
560
|
-
return await sendMessage(session,
|
|
556
|
+
return await sendMessage(session, `【@${username}】
|
|
561
557
|
### 绝杀!
|
|
562
558
|
游戏结束!
|
|
563
|
-
|
|
559
|
+
获胜方为:【${convertTurnToString(engineResultRecord.winSide)}】
|
|
564
560
|
${hImg2}`);
|
|
565
561
|
}
|
|
566
562
|
}
|
|
@@ -576,27 +572,27 @@ ${hImg2}`);
|
|
|
576
572
|
await updateNameInPlayerRecord(userId, username);
|
|
577
573
|
const gameRecord = await getGameRecord(channelId);
|
|
578
574
|
if (!gameRecord.isStarted) {
|
|
579
|
-
return await sendMessage(session,
|
|
575
|
+
return await sendMessage(session, `【@${username}】
|
|
580
576
|
游戏还未开始哦!`);
|
|
581
577
|
}
|
|
582
578
|
await checkEngine(channelId);
|
|
583
579
|
if (gameRecord.isRegretRequest) {
|
|
584
|
-
return await sendMessage(session,
|
|
580
|
+
return await sendMessage(session, `【@${username}】
|
|
585
581
|
已经有悔棋请求了!`);
|
|
586
582
|
}
|
|
587
583
|
const playerRecord = await ctx.database.get("cchess_gaming_player_records", { channelId, userId });
|
|
588
584
|
if (playerRecord.length === 0) {
|
|
589
|
-
return await sendMessage(session,
|
|
585
|
+
return await sendMessage(session, `【@${username}】
|
|
590
586
|
您还未加入游戏呢!`);
|
|
591
587
|
}
|
|
592
588
|
const turn = gameRecord.turn;
|
|
593
589
|
const sideString = convertTurnToString(turn);
|
|
594
590
|
if (gameRecord.isAnalyzing) {
|
|
595
|
-
return await sendMessage(session,
|
|
591
|
+
return await sendMessage(session, `【@${username}】
|
|
596
592
|
对局分析中,请稍后再试!`);
|
|
597
593
|
}
|
|
598
594
|
if (gameRecord.moveList.length < 1) {
|
|
599
|
-
return await sendMessage(session,
|
|
595
|
+
return await sendMessage(session, `【@${username}】
|
|
600
596
|
当前无法悔棋!`);
|
|
601
597
|
}
|
|
602
598
|
if (gameRecord.isEnginePlayBlack || gameRecord.isEnginePlayRed) {
|
|
@@ -604,16 +600,16 @@ ${hImg2}`);
|
|
|
604
600
|
await undoMove(channelId);
|
|
605
601
|
const buffer = await drawChessBoard(channelId);
|
|
606
602
|
const hImg = import_koishi.h.image(buffer, `image/${config.imageType}`);
|
|
607
|
-
return await sendMessage(session,
|
|
603
|
+
return await sendMessage(session, `【@${username}】
|
|
608
604
|
悔棋成功!
|
|
609
605
|
${hImg}`);
|
|
610
606
|
} else {
|
|
611
607
|
if (playerRecord[0].side === sideString) {
|
|
612
|
-
return await sendMessage(session,
|
|
608
|
+
return await sendMessage(session, `【@${username}】
|
|
613
609
|
现在轮到你下棋,不可悔棋!`);
|
|
614
610
|
} else {
|
|
615
611
|
await ctx.database.set("cchess_game_records", { channelId }, { isRegretRequest: true });
|
|
616
|
-
return await sendMessage(session,
|
|
612
|
+
return await sendMessage(session, `【@${username}】
|
|
617
613
|
请求悔棋中...
|
|
618
614
|
请对方输入相关指令选择同意或拒绝!`);
|
|
619
615
|
}
|
|
@@ -624,34 +620,34 @@ ${hImg}`);
|
|
|
624
620
|
await updateNameInPlayerRecord(userId, username);
|
|
625
621
|
const gameRecord = await getGameRecord(channelId);
|
|
626
622
|
if (!gameRecord.isStarted) {
|
|
627
|
-
return await sendMessage(session,
|
|
623
|
+
return await sendMessage(session, `【@${username}】
|
|
628
624
|
游戏还未开始哦!`);
|
|
629
625
|
}
|
|
630
626
|
await checkEngine(channelId);
|
|
631
627
|
if (gameRecord.isAnalyzing) {
|
|
632
|
-
return await sendMessage(session,
|
|
628
|
+
return await sendMessage(session, `【@${username}】
|
|
633
629
|
对局分析中,请稍后再试!`);
|
|
634
630
|
}
|
|
635
631
|
if (!gameRecord.isRegretRequest) {
|
|
636
|
-
return await sendMessage(session,
|
|
632
|
+
return await sendMessage(session, `【@${username}】
|
|
637
633
|
当前无悔棋请求!`);
|
|
638
634
|
}
|
|
639
635
|
const playerRecord = await ctx.database.get("cchess_gaming_player_records", { channelId, userId });
|
|
640
636
|
if (playerRecord.length === 0) {
|
|
641
|
-
return await sendMessage(session,
|
|
637
|
+
return await sendMessage(session, `【@${username}】
|
|
642
638
|
您还未加入游戏呢!`);
|
|
643
639
|
}
|
|
644
640
|
const turn = gameRecord.turn;
|
|
645
641
|
const sideString = convertTurnToString(turn);
|
|
646
642
|
if (playerRecord[0].side !== sideString) {
|
|
647
|
-
return await sendMessage(session,
|
|
643
|
+
return await sendMessage(session, `【@${username}】
|
|
648
644
|
您所在的队伍不能做出选择!`);
|
|
649
645
|
} else {
|
|
650
646
|
await undoMove(channelId);
|
|
651
647
|
await ctx.database.set("cchess_game_records", { channelId }, { isRegretRequest: false });
|
|
652
648
|
const buffer = await drawChessBoard(channelId);
|
|
653
649
|
const hImg = import_koishi.h.image(buffer, `image/${config.imageType}`);
|
|
654
|
-
return await sendMessage(session,
|
|
650
|
+
return await sendMessage(session, `【@${username}】
|
|
655
651
|
由于您同意了对方的悔棋请求!
|
|
656
652
|
悔棋成功!
|
|
657
653
|
${hImg}`);
|
|
@@ -662,33 +658,33 @@ ${hImg}`);
|
|
|
662
658
|
await updateNameInPlayerRecord(userId, username);
|
|
663
659
|
const gameRecord = await getGameRecord(channelId);
|
|
664
660
|
if (!gameRecord.isStarted) {
|
|
665
|
-
return await sendMessage(session,
|
|
661
|
+
return await sendMessage(session, `【@${username}】
|
|
666
662
|
游戏还未开始哦!`);
|
|
667
663
|
}
|
|
668
664
|
await checkEngine(channelId);
|
|
669
665
|
if (gameRecord.isAnalyzing) {
|
|
670
|
-
return await sendMessage(session,
|
|
666
|
+
return await sendMessage(session, `【@${username}】
|
|
671
667
|
对局分析中,请稍后再试!`);
|
|
672
668
|
}
|
|
673
669
|
if (!gameRecord.isRegretRequest) {
|
|
674
|
-
return await sendMessage(session,
|
|
670
|
+
return await sendMessage(session, `【@${username}】
|
|
675
671
|
当前无悔棋请求!`);
|
|
676
672
|
}
|
|
677
673
|
const playerRecord = await ctx.database.get("cchess_gaming_player_records", { channelId, userId });
|
|
678
674
|
if (playerRecord.length === 0) {
|
|
679
|
-
return await sendMessage(session,
|
|
675
|
+
return await sendMessage(session, `【@${username}】
|
|
680
676
|
您还未加入游戏呢!`);
|
|
681
677
|
}
|
|
682
678
|
const turn = gameRecord.turn;
|
|
683
679
|
const sideString = convertTurnToString(turn);
|
|
684
680
|
if (playerRecord[0].side !== sideString) {
|
|
685
|
-
return await sendMessage(session,
|
|
681
|
+
return await sendMessage(session, `【@${username}】
|
|
686
682
|
您所在的队伍不能做出选择!`);
|
|
687
683
|
} else {
|
|
688
684
|
await ctx.database.set("cchess_game_records", { channelId }, { isRegretRequest: false });
|
|
689
685
|
const buffer = await drawChessBoard(channelId);
|
|
690
686
|
const hImg = import_koishi.h.image(buffer, `image/${config.imageType}`);
|
|
691
|
-
return await sendMessage(session,
|
|
687
|
+
return await sendMessage(session, `【@${username}】
|
|
692
688
|
由于您拒绝了对方的悔棋请求!
|
|
693
689
|
悔棋失败,游戏继续进行!
|
|
694
690
|
${hImg}`);
|
|
@@ -699,33 +695,33 @@ ${hImg}`);
|
|
|
699
695
|
await updateNameInPlayerRecord(userId, username);
|
|
700
696
|
const gameRecord = await getGameRecord(channelId);
|
|
701
697
|
if (!gameRecord.isStarted) {
|
|
702
|
-
return await sendMessage(session,
|
|
698
|
+
return await sendMessage(session, `【@${username}】
|
|
703
699
|
游戏还未开始哦!`);
|
|
704
700
|
}
|
|
705
701
|
await checkEngine(channelId);
|
|
706
702
|
if (gameRecord.isAnalyzing) {
|
|
707
|
-
return await sendMessage(session,
|
|
703
|
+
return await sendMessage(session, `【@${username}】
|
|
708
704
|
对局分析中,请稍后再试!`);
|
|
709
705
|
}
|
|
710
706
|
const playerRecord = await ctx.database.get("cchess_gaming_player_records", { channelId, userId });
|
|
711
707
|
if (playerRecord.length === 0) {
|
|
712
|
-
return await sendMessage(session,
|
|
708
|
+
return await sendMessage(session, `【@${username}】
|
|
713
709
|
您还未加入游戏呢!`);
|
|
714
710
|
}
|
|
715
711
|
const turn = gameRecord.turn;
|
|
716
712
|
const sideString = convertTurnToString(turn);
|
|
717
713
|
if (playerRecord[0].side !== sideString) {
|
|
718
|
-
return await sendMessage(session,
|
|
714
|
+
return await sendMessage(session, `【@${username}】
|
|
719
715
|
还没轮到${sideString}走棋哦!
|
|
720
|
-
|
|
716
|
+
当前走棋方为:【${convertTurnToString(gameRecord.turn)}】`);
|
|
721
717
|
}
|
|
722
718
|
const anotherSideString = convertTurnToString(turn === "w" ? "b" : "w");
|
|
723
719
|
await updatePlayerRecords(channelId, turn === "w" ? "b" : "w", turn);
|
|
724
720
|
await endGame(channelId);
|
|
725
|
-
return await sendMessage(session,
|
|
721
|
+
return await sendMessage(session, `【@${username}】
|
|
726
722
|
认输成功!
|
|
727
723
|
游戏结束!
|
|
728
|
-
|
|
724
|
+
获胜方为:【${anotherSideString}】`);
|
|
729
725
|
});
|
|
730
726
|
ctx.command("cchess.查看云库残局", "云库残局指令帮助").action(async ({ session }) => {
|
|
731
727
|
await session.execute(`cchess.查看云库残局 -h`);
|
|
@@ -734,14 +730,14 @@ ${hImg}`);
|
|
|
734
730
|
const { username, userId, channelId } = session;
|
|
735
731
|
await updateNameInPlayerRecord(userId, username);
|
|
736
732
|
await checkEngine(channelId);
|
|
737
|
-
return await sendMessage(session,
|
|
733
|
+
return await sendMessage(session, `【@${username}】
|
|
738
734
|
https://www.chessdb.cn/egtb_info_dtm.html`);
|
|
739
735
|
});
|
|
740
736
|
ctx.command("cchess.查看云库残局.DTC统计", "云库残局DTM统计").action(async ({ session }) => {
|
|
741
737
|
const { username, userId, channelId } = session;
|
|
742
738
|
await updateNameInPlayerRecord(userId, username);
|
|
743
739
|
await checkEngine(channelId);
|
|
744
|
-
return await sendMessage(session,
|
|
740
|
+
return await sendMessage(session, `【@${username}】
|
|
745
741
|
https://www.chessdb.cn/egtb_info.html`);
|
|
746
742
|
});
|
|
747
743
|
ctx.command("cchess.编辑棋盘", "编辑棋盘指令帮助").action(async ({ session }) => {
|
|
@@ -752,13 +748,13 @@ https://www.chessdb.cn/egtb_info.html`);
|
|
|
752
748
|
await updateNameInPlayerRecord(userId, username);
|
|
753
749
|
const gameRecord = await getGameRecord(channelId);
|
|
754
750
|
if (gameRecord.isStarted) {
|
|
755
|
-
return await sendMessage(session,
|
|
751
|
+
return await sendMessage(session, `【@${username}】
|
|
756
752
|
游戏已经开始啦~
|
|
757
753
|
不可编辑棋盘!`);
|
|
758
754
|
}
|
|
759
755
|
await checkEngine(channelId);
|
|
760
756
|
if (!fen || !isValidateFen(fen)) {
|
|
761
|
-
return await sendMessage(session,
|
|
757
|
+
return await sendMessage(session, `【@${username}】
|
|
762
758
|
无效的FEN串!`);
|
|
763
759
|
}
|
|
764
760
|
const t = fen;
|
|
@@ -778,7 +774,7 @@ https://www.chessdb.cn/egtb_info.html`);
|
|
|
778
774
|
startFen: newStartFen
|
|
779
775
|
});
|
|
780
776
|
await parseFen(channelId, t);
|
|
781
|
-
return await sendMessage(session,
|
|
777
|
+
return await sendMessage(session, `【@${username}】
|
|
782
778
|
棋盘编辑成功!`);
|
|
783
779
|
});
|
|
784
780
|
ctx.command("cchess.编辑棋盘.导出", "导出FEN串").action(async ({ session }) => {
|
|
@@ -786,23 +782,23 @@ https://www.chessdb.cn/egtb_info.html`);
|
|
|
786
782
|
await updateNameInPlayerRecord(userId, username);
|
|
787
783
|
const gameRecord = await getGameRecord(channelId);
|
|
788
784
|
if (!gameRecord.isStarted) {
|
|
789
|
-
return await sendMessage(session,
|
|
785
|
+
return await sendMessage(session, `【@${username}】
|
|
790
786
|
游戏还未开始哦!`);
|
|
791
787
|
}
|
|
792
788
|
if (gameRecord.isAnalyzing) {
|
|
793
|
-
return await sendMessage(session,
|
|
789
|
+
return await sendMessage(session, `【@${username}】
|
|
794
790
|
对局分析中,请稍后再试!`);
|
|
795
791
|
}
|
|
796
792
|
await checkEngine(channelId);
|
|
797
793
|
const fenWithFullMove = await getFenWithFullMove(channelId);
|
|
798
|
-
return await sendMessage(session,
|
|
794
|
+
return await sendMessage(session, `【@${username}】
|
|
799
795
|
${fenWithFullMove}`);
|
|
800
796
|
});
|
|
801
797
|
ctx.command("cchess.编辑棋盘.使用方法", "查看编辑棋盘的fen使用方法").action(async ({ session }) => {
|
|
802
798
|
const { username, userId, channelId } = session;
|
|
803
799
|
await updateNameInPlayerRecord(userId, username);
|
|
804
800
|
await checkEngine(channelId);
|
|
805
|
-
return await sendMessage(session,
|
|
801
|
+
return await sendMessage(session, `【@${username}】
|
|
806
802
|
https://www.xqbase.com/protocol/cchess_fen.htm`);
|
|
807
803
|
});
|
|
808
804
|
ctx.command("cchess.排行榜.总胜场 [number:number]", "查看玩家总胜场排行榜").action(async ({ session }, number = config.defaultMaxLeaderboardEntries) => {
|
|
@@ -839,12 +835,12 @@ https://www.xqbase.com/protocol/cchess_fen.htm`);
|
|
|
839
835
|
lose: 0,
|
|
840
836
|
win: 0
|
|
841
837
|
});
|
|
842
|
-
return sendMessage(session,
|
|
838
|
+
return sendMessage(session, `【@${session.username}】
|
|
843
839
|
查询对象:${username}
|
|
844
840
|
无任何游戏记录。`);
|
|
845
841
|
}
|
|
846
842
|
const { win, lose } = targetUserRecord[0];
|
|
847
|
-
return sendMessage(session,
|
|
843
|
+
return sendMessage(session, `【@${session.username}】
|
|
848
844
|
查询对象:${username}
|
|
849
845
|
总胜场次数为:${win} 次
|
|
850
846
|
总输场次数为:${lose} 次
|
|
@@ -1955,13 +1951,7 @@ https://www.xqbase.com/protocol/cchess_fen.htm`);
|
|
|
1955
1951
|
async function sendMessage(session, message) {
|
|
1956
1952
|
const { bot, channelId } = session;
|
|
1957
1953
|
let messageId;
|
|
1958
|
-
|
|
1959
|
-
const imageBuffer = await ctx.markdownToImage.convertToImage(message);
|
|
1960
|
-
[messageId] = await session.send(import_koishi.h.image(imageBuffer, `image/${config.imageType}`));
|
|
1961
|
-
} else {
|
|
1962
|
-
let plainText = message.replace(/\*\*(.*?)\*\*/g, "$1").replace(/^#+\s*/gm, "").replace(/\[([^\]]+)\]\([^\)]+\)/g, "$1");
|
|
1963
|
-
[messageId] = await session.send(plainText);
|
|
1964
|
-
}
|
|
1954
|
+
[messageId] = await session.send(message);
|
|
1965
1955
|
if (config.retractDelay === 0) return;
|
|
1966
1956
|
sentMessages.push(messageId);
|
|
1967
1957
|
if (sentMessages.length > 1) {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "koishi-plugin-cchess",
|
|
3
3
|
"description": "Koishi 的中国象棋插件。支持人人/人机对战。",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.5",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"typings": "lib/index.d.ts",
|
|
7
7
|
"files": [
|
|
@@ -14,9 +14,6 @@
|
|
|
14
14
|
"database",
|
|
15
15
|
"puppeteer",
|
|
16
16
|
"canvas"
|
|
17
|
-
],
|
|
18
|
-
"optional": [
|
|
19
|
-
"markdownToImage"
|
|
20
17
|
]
|
|
21
18
|
}
|
|
22
19
|
},
|
|
@@ -48,7 +45,6 @@
|
|
|
48
45
|
"koishi": "^4.18.9"
|
|
49
46
|
},
|
|
50
47
|
"devDependencies": {
|
|
51
|
-
"koishi-plugin-markdown-to-image-service": "^1.2.1",
|
|
52
48
|
"koishi-plugin-puppeteer": "^3.9.0"
|
|
53
49
|
}
|
|
54
50
|
}
|
package/readme.md
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
koishi-plugin-cchess
|
|
2
|
+
====================
|
|
2
3
|
|
|
3
|
-
[
|
|
4
|
-
[
|
|
5
|
-
|
|
6
|
-
## 简介
|
|
4
|
+
[<img alt="github" src="https://img.shields.io/badge/github-araea/cchess-8da0cb?style=for-the-badge&labelColor=555555&logo=github" height="20">](https://github.com/araea/koishi-plugin-cchess)
|
|
5
|
+
[<img alt="npm" src="https://img.shields.io/npm/v/koishi-plugin-cchess.svg?style=for-the-badge&color=fc8d62&logo=npm" height="20">](https://www.npmjs.com/package/koishi-plugin-cchess)
|
|
7
6
|
|
|
8
7
|
Koishi 的中国象棋插件。支持人人/人机对战。
|
|
9
8
|
|
|
@@ -31,10 +30,19 @@ Koishi 的中国象棋插件。支持人人/人机对战。
|
|
|
31
30
|
|
|
32
31
|
- 956758505
|
|
33
32
|
|
|
34
|
-
|
|
33
|
+
<br>
|
|
34
|
+
|
|
35
|
+
#### License
|
|
35
36
|
|
|
36
|
-
|
|
37
|
+
<sup>
|
|
38
|
+
Licensed under either of <a href="LICENSE-APACHE">Apache License, Version
|
|
39
|
+
2.0</a> or <a href="LICENSE-MIT">MIT license</a> at your option.
|
|
40
|
+
</sup>
|
|
37
41
|
|
|
38
|
-
|
|
42
|
+
<br>
|
|
39
43
|
|
|
40
|
-
|
|
44
|
+
<sub>
|
|
45
|
+
Unless you explicitly state otherwise, any contribution intentionally submitted
|
|
46
|
+
for inclusion in this crate by you, as defined in the Apache-2.0 license, shall
|
|
47
|
+
be dual licensed as above, without any additional terms or conditions.
|
|
48
|
+
</sub>
|