koishi-plugin-game-mini 0.3.3 → 0.3.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 +0 -2
- package/lib/index.js +89 -13
- package/package.json +1 -1
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -77,8 +77,6 @@ const defaultMessages = {
|
|
|
77
77
|
wrong: "接龙失败!",
|
|
78
78
|
roundEnd: "第 {0} 回合结束!剩余回合:{1}",
|
|
79
79
|
gameEnd: "🎉 成语接龙比赛结束!🎉",
|
|
80
|
-
rankTitle: "🏆 本局排行榜 🏆",
|
|
81
|
-
rankEmpty: "暂无参与记录~",
|
|
82
80
|
disabled: "成语接龙功能已关闭,请联系管理员开启",
|
|
83
81
|
autoStop: "太久没人玩啦,比赛自动结束~"
|
|
84
82
|
},
|
|
@@ -235,7 +233,7 @@ exports.Config = koishi_1.Schema.intersect([
|
|
|
235
233
|
koishi_1.Schema.object({
|
|
236
234
|
chengyuJielong: koishi_1.Schema.object({
|
|
237
235
|
totalRounds: koishi_1.Schema.number().min(1).default(10).description('总回合数'),
|
|
238
|
-
showRank: koishi_1.Schema.boolean().default(
|
|
236
|
+
showRank: koishi_1.Schema.boolean().default(false).description('游戏结束后显示本局排行榜'),
|
|
239
237
|
autoPlayDelay: koishi_1.Schema.number().min(0).default(10).description('机器人自动操作延迟(秒)'),
|
|
240
238
|
autoPlayMaxCount: koishi_1.Schema.number().min(1).default(5).description('机器人最大自动操作次数'),
|
|
241
239
|
autoStopInactiveTime: koishi_1.Schema.number().min(0).default(60).description('游戏无操作自动停止时间(秒)'),
|
|
@@ -255,8 +253,6 @@ exports.Config = koishi_1.Schema.intersect([
|
|
|
255
253
|
wrong: koishi_1.Schema.string().default(defaultMessages.chengyuJielong.wrong).description('接龙失败提示'),
|
|
256
254
|
roundEnd: koishi_1.Schema.string().default(defaultMessages.chengyuJielong.roundEnd).description('回合结束提示\n{0}-当前回合, {1}-剩余回合'),
|
|
257
255
|
gameEnd: koishi_1.Schema.string().default(defaultMessages.chengyuJielong.gameEnd).description('游戏结束提示'),
|
|
258
|
-
rankTitle: koishi_1.Schema.string().default(defaultMessages.chengyuJielong.rankTitle).description('本局排行榜标题'),
|
|
259
|
-
rankEmpty: koishi_1.Schema.string().default(defaultMessages.chengyuJielong.rankEmpty).description('本局排行榜为空提示'),
|
|
260
256
|
disabled: koishi_1.Schema.string().default(defaultMessages.chengyuJielong.disabled).description('功能禁用提示'),
|
|
261
257
|
autoStop: koishi_1.Schema.string().default(defaultMessages.chengyuJielong.autoStop).description('自动停止提示'),
|
|
262
258
|
}).description('💬 成语接龙消息配置'),
|
|
@@ -528,7 +524,8 @@ async function apply(ctx, cfg) {
|
|
|
528
524
|
target: 0,
|
|
529
525
|
currentMin: cfg.guessNumber.min,
|
|
530
526
|
currentMax: cfg.guessNumber.max,
|
|
531
|
-
botGuess: []
|
|
527
|
+
botGuess: [],
|
|
528
|
+
autoPlayCount: 0
|
|
532
529
|
},
|
|
533
530
|
wzHero: {
|
|
534
531
|
started: false,
|
|
@@ -697,6 +694,63 @@ async function apply(ctx, cfg) {
|
|
|
697
694
|
const refreshActive = (st) => {
|
|
698
695
|
st.chengyuJielong.lastActiveTime = Date.now();
|
|
699
696
|
};
|
|
697
|
+
const doGuessNumberAutoPlay = async (session, key, st) => {
|
|
698
|
+
if (!st.guessNumber.started)
|
|
699
|
+
return;
|
|
700
|
+
if (st.guessNumber.autoPlayCount >= cfg.guessNumber.autoPlayMaxCount)
|
|
701
|
+
return;
|
|
702
|
+
st.guessNumber.autoPlayCount += 1;
|
|
703
|
+
const guess = koishi_1.Random.int(st.guessNumber.currentMin, st.guessNumber.currentMax + 1);
|
|
704
|
+
await session.send(`机器人猜:${guess}`);
|
|
705
|
+
if (guess === st.guessNumber.target) {
|
|
706
|
+
st.guessNumber.players['bot'] = st.guessNumber.players['bot'] || {
|
|
707
|
+
platform: 'bot',
|
|
708
|
+
userId: 'bot',
|
|
709
|
+
name: '机器人',
|
|
710
|
+
score: 0,
|
|
711
|
+
correctCount: 0,
|
|
712
|
+
playCount: 0,
|
|
713
|
+
lastGameTime: 0
|
|
714
|
+
};
|
|
715
|
+
st.guessNumber.players['bot'].score += cfg.guessNumber.penaltyScore;
|
|
716
|
+
let message = d.guessNumber.correct;
|
|
717
|
+
if (cfg.guessNumber.enablePenalty) {
|
|
718
|
+
Object.keys(st.guessNumber.players).forEach(key => {
|
|
719
|
+
if (key !== 'bot') {
|
|
720
|
+
st.guessNumber.players[key].score += cfg.guessNumber.rewardScore;
|
|
721
|
+
}
|
|
722
|
+
});
|
|
723
|
+
message += `\n猜中者被扣 ${-cfg.guessNumber.penaltyScore} 分,其他玩家各加 ${cfg.guessNumber.rewardScore} 分`;
|
|
724
|
+
}
|
|
725
|
+
await session.send(message);
|
|
726
|
+
st.guessNumber.currentRound += 1;
|
|
727
|
+
if (st.guessNumber.currentRound > st.guessNumber.totalRounds) {
|
|
728
|
+
st.guessNumber.started = false;
|
|
729
|
+
clearAllTimers(st);
|
|
730
|
+
await session.send(d.guessNumber.gameEnd);
|
|
731
|
+
if (cfg.guessNumber.showRank && !isPrivate(session)) {
|
|
732
|
+
const rankText = generateGameRankText(st.guessNumber.players, d.guessNumber.rankTitle, d.guessNumber.rankEmpty);
|
|
733
|
+
await session.send(rankText);
|
|
734
|
+
}
|
|
735
|
+
clearGameData(st.guessNumber);
|
|
736
|
+
}
|
|
737
|
+
else {
|
|
738
|
+
st.guessNumber.target = koishi_1.Random.int(st.guessNumber.currentMin, st.guessNumber.currentMax);
|
|
739
|
+
await session.send(d.guessNumber.roundEnd.replace('{0}', st.guessNumber.currentRound.toString()).replace('{1}', (st.guessNumber.totalRounds - st.guessNumber.currentRound).toString()));
|
|
740
|
+
await session.send(`新回合开始!猜数字范围:${st.guessNumber.currentMin} - ${st.guessNumber.currentMax}`);
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
else if (guess < st.guessNumber.target) {
|
|
744
|
+
st.guessNumber.currentMin = guess + 1;
|
|
745
|
+
await session.send(d.guessNumber.tooSmall.replace('{0}', st.guessNumber.currentMin.toString()).replace('{1}', st.guessNumber.currentMax.toString()));
|
|
746
|
+
}
|
|
747
|
+
else {
|
|
748
|
+
st.guessNumber.currentMax = guess - 1;
|
|
749
|
+
await session.send(d.guessNumber.tooBig.replace('{0}', st.guessNumber.currentMin.toString()).replace('{1}', st.guessNumber.currentMax.toString()));
|
|
750
|
+
}
|
|
751
|
+
gameStates.set(key, st);
|
|
752
|
+
setupAutoStop(session, st.guessNumber, 'guessNumber', d.guessNumber.autoStop, cfg.guessNumber.showRank, d.guessNumber.rankTitle, d.guessNumber.rankEmpty);
|
|
753
|
+
};
|
|
700
754
|
const doAutoPlay = async (session, key, st) => {
|
|
701
755
|
if (!st.chengyuJielong.started)
|
|
702
756
|
return;
|
|
@@ -745,7 +799,7 @@ async function apply(ctx, cfg) {
|
|
|
745
799
|
await session.send(d.chengyuJielong.apiError);
|
|
746
800
|
}
|
|
747
801
|
gameStates.set(key, st);
|
|
748
|
-
setupAutoStop(session, st.chengyuJielong, 'chengyuJielong', d.chengyuJielong.autoStop, cfg.chengyuJielong.showRank,
|
|
802
|
+
setupAutoStop(session, st.chengyuJielong, 'chengyuJielong', d.chengyuJielong.autoStop, cfg.chengyuJielong.showRank, undefined, undefined);
|
|
749
803
|
};
|
|
750
804
|
ctx.middleware(async (session, next) => {
|
|
751
805
|
if (!session.content)
|
|
@@ -780,12 +834,12 @@ async function apply(ctx, cfg) {
|
|
|
780
834
|
}
|
|
781
835
|
if (st.chengyuJielong.botTurn) {
|
|
782
836
|
await session.send('现在是机器人的回合,请稍候...');
|
|
783
|
-
setupAutoStop(session, st.chengyuJielong, 'chengyuJielong', d.chengyuJielong.autoStop, cfg.chengyuJielong.showRank,
|
|
837
|
+
setupAutoStop(session, st.chengyuJielong, 'chengyuJielong', d.chengyuJielong.autoStop, cfg.chengyuJielong.showRank, undefined, undefined);
|
|
784
838
|
return;
|
|
785
839
|
}
|
|
786
840
|
if (!isFourCharIdiom(content)) {
|
|
787
841
|
await session.send(d.chengyuJielong.notIdiom);
|
|
788
|
-
setupAutoStop(session, st.chengyuJielong, 'chengyuJielong', d.chengyuJielong.autoStop, cfg.chengyuJielong.showRank,
|
|
842
|
+
setupAutoStop(session, st.chengyuJielong, 'chengyuJielong', d.chengyuJielong.autoStop, cfg.chengyuJielong.showRank, undefined, undefined);
|
|
789
843
|
return;
|
|
790
844
|
}
|
|
791
845
|
try {
|
|
@@ -848,7 +902,7 @@ async function apply(ctx, cfg) {
|
|
|
848
902
|
logError(`[成语接龙玩家] API调用失败: ${err.message}`, err);
|
|
849
903
|
await session.send(d.chengyuJielong.apiError);
|
|
850
904
|
}
|
|
851
|
-
setupAutoStop(session, st.chengyuJielong, 'chengyuJielong', d.chengyuJielong.autoStop, cfg.chengyuJielong.showRank,
|
|
905
|
+
setupAutoStop(session, st.chengyuJielong, 'chengyuJielong', d.chengyuJielong.autoStop, cfg.chengyuJielong.showRank, undefined, undefined);
|
|
852
906
|
gameStates.set(key, st);
|
|
853
907
|
return;
|
|
854
908
|
}
|
|
@@ -911,7 +965,8 @@ async function apply(ctx, cfg) {
|
|
|
911
965
|
const dt = r.data;
|
|
912
966
|
if (dt.success) {
|
|
913
967
|
let reply = '';
|
|
914
|
-
|
|
968
|
+
const isCorrect = dt.data?.result === 'correct';
|
|
969
|
+
if (isCorrect) {
|
|
915
970
|
st.chengyuImage.players[playerKey].score += cfg.chengyuImage.rewardScore;
|
|
916
971
|
st.chengyuImage.players[playerKey].correctCount += 1;
|
|
917
972
|
await savePlayerData(session, st.chengyuImage.players[playerKey]);
|
|
@@ -1087,11 +1142,21 @@ async function apply(ctx, cfg) {
|
|
|
1087
1142
|
const num = parseInt(content);
|
|
1088
1143
|
if (isNaN(num)) {
|
|
1089
1144
|
setupAutoStop(session, st.guessNumber, 'guessNumber', d.guessNumber.autoStop, cfg.guessNumber.showRank, d.guessNumber.rankTitle, d.guessNumber.rankEmpty);
|
|
1145
|
+
if (cfg.guessNumber.botParticipateInGroup && !isPrivate(session) && st.guessNumber.autoPlayCount < cfg.guessNumber.autoPlayMaxCount) {
|
|
1146
|
+
setTimeout(() => {
|
|
1147
|
+
doGuessNumberAutoPlay(session, key, st);
|
|
1148
|
+
}, cfg.guessNumber.autoPlayDelay * 1000);
|
|
1149
|
+
}
|
|
1090
1150
|
return next();
|
|
1091
1151
|
}
|
|
1092
1152
|
if (num < st.guessNumber.currentMin || num > st.guessNumber.currentMax) {
|
|
1093
1153
|
await session.send(d.guessNumber.outOfRange.replace('{0}', st.guessNumber.currentMin.toString()).replace('{1}', st.guessNumber.currentMax.toString()));
|
|
1094
1154
|
setupAutoStop(session, st.guessNumber, 'guessNumber', d.guessNumber.autoStop, cfg.guessNumber.showRank, d.guessNumber.rankTitle, d.guessNumber.rankEmpty);
|
|
1155
|
+
if (cfg.guessNumber.botParticipateInGroup && !isPrivate(session) && st.guessNumber.autoPlayCount < cfg.guessNumber.autoPlayMaxCount) {
|
|
1156
|
+
setTimeout(() => {
|
|
1157
|
+
doGuessNumberAutoPlay(session, key, st);
|
|
1158
|
+
}, cfg.guessNumber.autoPlayDelay * 1000);
|
|
1159
|
+
}
|
|
1095
1160
|
return;
|
|
1096
1161
|
}
|
|
1097
1162
|
if (num === st.guessNumber.target) {
|
|
@@ -1134,6 +1199,11 @@ async function apply(ctx, cfg) {
|
|
|
1134
1199
|
await session.send(d.guessNumber.tooBig.replace('{0}', st.guessNumber.currentMin.toString()).replace('{1}', st.guessNumber.currentMax.toString()));
|
|
1135
1200
|
}
|
|
1136
1201
|
setupAutoStop(session, st.guessNumber, 'guessNumber', d.guessNumber.autoStop, cfg.guessNumber.showRank, d.guessNumber.rankTitle, d.guessNumber.rankEmpty);
|
|
1202
|
+
if (cfg.guessNumber.botParticipateInGroup && !isPrivate(session) && st.guessNumber.autoPlayCount < cfg.guessNumber.autoPlayMaxCount) {
|
|
1203
|
+
setTimeout(() => {
|
|
1204
|
+
doGuessNumberAutoPlay(session, key, st);
|
|
1205
|
+
}, cfg.guessNumber.autoPlayDelay * 1000);
|
|
1206
|
+
}
|
|
1137
1207
|
gameStates.set(key, st);
|
|
1138
1208
|
return;
|
|
1139
1209
|
}
|
|
@@ -1228,10 +1298,16 @@ async function apply(ctx, cfg) {
|
|
|
1228
1298
|
st.guessNumber.currentMin = cfg.guessNumber.min;
|
|
1229
1299
|
st.guessNumber.currentMax = cfg.guessNumber.max;
|
|
1230
1300
|
st.guessNumber.currentRound = 1;
|
|
1301
|
+
st.guessNumber.autoPlayCount = 0;
|
|
1231
1302
|
await session.send(d.guessNumber.start.replace('{0}', st.guessNumber.totalRounds.toString()));
|
|
1232
1303
|
await session.send(`猜数字范围:${st.guessNumber.currentMin} - ${st.guessNumber.currentMax}`);
|
|
1233
1304
|
gameStates.set(key, st);
|
|
1234
1305
|
setupAutoStop(session, st.guessNumber, 'guessNumber', d.guessNumber.autoStop, cfg.guessNumber.showRank, d.guessNumber.rankTitle, d.guessNumber.rankEmpty);
|
|
1306
|
+
if (cfg.guessNumber.botParticipateInGroup && !isPrivate(session)) {
|
|
1307
|
+
setTimeout(() => {
|
|
1308
|
+
doGuessNumberAutoPlay(session, key, st);
|
|
1309
|
+
}, cfg.guessNumber.autoPlayDelay * 1000);
|
|
1310
|
+
}
|
|
1235
1311
|
}
|
|
1236
1312
|
else if (action === '结束') {
|
|
1237
1313
|
clearGameData(st.guessNumber, cfg.guessNumber.showRank && !isPrivate(session), session, d.guessNumber.rankTitle, d.guessNumber.rankEmpty);
|
|
@@ -1379,10 +1455,10 @@ async function apply(ctx, cfg) {
|
|
|
1379
1455
|
doAutoPlay(session, key, st);
|
|
1380
1456
|
}, 100);
|
|
1381
1457
|
gameStates.set(key, st);
|
|
1382
|
-
setupAutoStop(session, st.chengyuJielong, 'chengyuJielong', d.chengyuJielong.autoStop, cfg.chengyuJielong.showRank,
|
|
1458
|
+
setupAutoStop(session, st.chengyuJielong, 'chengyuJielong', d.chengyuJielong.autoStop, cfg.chengyuJielong.showRank, undefined, undefined);
|
|
1383
1459
|
}
|
|
1384
1460
|
else if (action === '结束') {
|
|
1385
|
-
clearGameData(st.chengyuJielong, cfg.chengyuJielong.showRank && !isPrivate(session), session,
|
|
1461
|
+
clearGameData(st.chengyuJielong, cfg.chengyuJielong.showRank && !isPrivate(session), session, undefined, undefined);
|
|
1386
1462
|
await session.send(d.chengyuJielong.stop);
|
|
1387
1463
|
gameStates.set(key, st);
|
|
1388
1464
|
}
|