koishi-plugin-game-mini 0.1.9 → 0.2.1

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.js CHANGED
@@ -14,49 +14,130 @@ exports.name = 'game-mini';
14
14
  exports.using = ['i18n'];
15
15
  exports.inject = ['console'];
16
16
  exports.Config = koishi_1.Schema.object({
17
- enableNumberGuess: koishi_1.Schema.boolean().default(true),
18
- enableWzHero: koishi_1.Schema.boolean().default(true),
19
- enableChengyuImage: koishi_1.Schema.boolean().default(true),
20
- enableChengyuJielong: koishi_1.Schema.boolean().default(true),
21
- enablePrivateGame: koishi_1.Schema.boolean().default(true),
22
- autoPlayDelay: koishi_1.Schema.number().min(0).default(10),
23
- autoPlayMaxCount: koishi_1.Schema.number().min(1).default(5),
24
- autoStopInactiveTime: koishi_1.Schema.number().min(0).default(30),
17
+ enableNumberGuess: koishi_1.Schema.boolean().default(true)
18
+ .description('是否启用猜数字游戏')
19
+ .i18n({ 'zh-CN': '启用猜数字游戏' }),
20
+ enableWzHero: koishi_1.Schema.boolean().default(true)
21
+ .description('是否启用王者英雄猜谜游戏')
22
+ .i18n({ 'zh-CN': '启用王者英雄猜谜' }),
23
+ enableChengyuImage: koishi_1.Schema.boolean().default(true)
24
+ .description('是否启用看图猜成语游戏')
25
+ .i18n({ 'zh-CN': '启用看图猜成语' }),
26
+ enableChengyuJielong: koishi_1.Schema.boolean().default(true)
27
+ .description('是否启用成语接龙游戏')
28
+ .i18n({ 'zh-CN': '启用成语接龙' }),
29
+ enablePrivateGame: koishi_1.Schema.boolean().default(true)
30
+ .description('是否允许私聊玩游戏')
31
+ .i18n({ 'zh-CN': '允许私聊玩游戏' }),
32
+ autoPlayDelay: koishi_1.Schema.number().min(0).default(10)
33
+ .description('成语接龙机器人自动接龙延迟(秒)')
34
+ .i18n({ 'zh-CN': '机器人自动接龙延迟(秒)' }),
35
+ autoPlayMaxCount: koishi_1.Schema.number().min(1).default(5)
36
+ .description('成语接龙机器人最大自动接龙次数')
37
+ .i18n({ 'zh-CN': '机器人最大自动接龙次数' }),
38
+ autoStopInactiveTime: koishi_1.Schema.number().min(0).default(30)
39
+ .description('游戏无操作自动停止时间(秒)')
40
+ .i18n({ 'zh-CN': '无操作自动停止时间(秒)' }),
25
41
  guessNumber: koishi_1.Schema.object({
26
- min: koishi_1.Schema.number().min(0).default(0),
27
- max: koishi_1.Schema.number().min(1).default(100),
28
- botParticipateInGroup: koishi_1.Schema.boolean().default(true),
29
- totalRounds: koishi_1.Schema.number().min(1).default(10).description('猜数字比赛总回合数'),
30
- showRank: koishi_1.Schema.boolean().default(true).description('是否显示排行榜')
31
- }),
42
+ min: koishi_1.Schema.number().min(0).default(0)
43
+ .description('猜数字最小值')
44
+ .i18n({ 'zh-CN': '最小值' }),
45
+ max: koishi_1.Schema.number().min(1).default(100)
46
+ .description('猜数字最大值')
47
+ .i18n({ 'zh-CN': '最大值' }),
48
+ botParticipateInGroup: koishi_1.Schema.boolean().default(true)
49
+ .description('群聊中机器人是否参与猜数字')
50
+ .i18n({ 'zh-CN': '机器人参与群聊游戏' }),
51
+ totalRounds: koishi_1.Schema.number().min(1).default(10)
52
+ .description('猜数字总回合数')
53
+ .i18n({ 'zh-CN': '总回合数' }),
54
+ showRank: koishi_1.Schema.boolean().default(true)
55
+ .description('游戏结束后是否显示排行榜')
56
+ .i18n({ 'zh-CN': '显示排行榜' }),
57
+ }).description('猜数字游戏配置')
58
+ .i18n({ 'zh-CN': '猜数字游戏配置' }),
32
59
  wzHero: koishi_1.Schema.object({
33
- botParticipateInGroup: koishi_1.Schema.boolean().default(false),
34
- totalRounds: koishi_1.Schema.number().min(1).default(10).description('王者英雄猜谜比赛总回合数'),
35
- showRank: koishi_1.Schema.boolean().default(true).description('是否显示排行榜')
36
- }),
60
+ botParticipateInGroup: koishi_1.Schema.boolean().default(false)
61
+ .description('群聊中机器人是否参与王者英雄猜谜')
62
+ .i18n({ 'zh-CN': '机器人参与群聊游戏' }),
63
+ totalRounds: koishi_1.Schema.number().min(1).default(10)
64
+ .description('王者英雄猜谜总回合数')
65
+ .i18n({ 'zh-CN': '总回合数' }),
66
+ showRank: koishi_1.Schema.boolean().default(true)
67
+ .description('游戏结束后是否显示排行榜')
68
+ .i18n({ 'zh-CN': '显示排行榜' }),
69
+ }).description('王者英雄猜谜游戏配置')
70
+ .i18n({ 'zh-CN': '王者英雄猜谜配置' }),
37
71
  chengyuImage: koishi_1.Schema.object({
38
- botParticipateInGroup: koishi_1.Schema.boolean().default(false),
39
- totalRounds: koishi_1.Schema.number().min(1).default(10).description('看图猜成语比赛总回合数'),
40
- showRank: koishi_1.Schema.boolean().default(true).description('是否显示排行榜')
41
- }),
72
+ botParticipateInGroup: koishi_1.Schema.boolean().default(false)
73
+ .description('群聊中机器人是否参与看图猜成语')
74
+ .i18n({ 'zh-CN': '机器人参与群聊游戏' }),
75
+ totalRounds: koishi_1.Schema.number().min(1).default(10)
76
+ .description('看图猜成语总回合数')
77
+ .i18n({ 'zh-CN': '总回合数' }),
78
+ showRank: koishi_1.Schema.boolean().default(true)
79
+ .description('游戏结束后是否显示排行榜')
80
+ .i18n({ 'zh-CN': '显示排行榜' }),
81
+ }).description('看图猜成语游戏配置')
82
+ .i18n({ 'zh-CN': '看图猜成语配置' }),
42
83
  chengyuJielong: koishi_1.Schema.object({
43
- botParticipateInGroup: koishi_1.Schema.boolean().default(true),
44
- totalRounds: koishi_1.Schema.number().min(1).default(10).description('成语接龙比赛总回合数'),
45
- showRank: koishi_1.Schema.boolean().default(true).description('是否显示排行榜')
46
- }),
84
+ botParticipateInGroup: koishi_1.Schema.boolean().default(true)
85
+ .description('群聊中机器人是否参与成语接龙')
86
+ .i18n({ 'zh-CN': '机器人参与群聊游戏' }),
87
+ totalRounds: koishi_1.Schema.number().min(1).default(10)
88
+ .description('成语接龙总回合数')
89
+ .i18n({ 'zh-CN': '总回合数' }),
90
+ showRank: koishi_1.Schema.boolean().default(true)
91
+ .description('游戏结束后是否显示排行榜')
92
+ .i18n({ 'zh-CN': '显示排行榜' }),
93
+ }).description('成语接龙游戏配置')
94
+ .i18n({ 'zh-CN': '成语接龙配置' }),
47
95
  apiConfig: koishi_1.Schema.object({
48
- timeout: koishi_1.Schema.number().default(5000),
49
- }),
50
- }).i18n({ 'zh-CN': {} });
96
+ timeout: koishi_1.Schema.number().default(5000)
97
+ .description('API请求超时时间(毫秒)')
98
+ .i18n({ 'zh-CN': '请求超时时间(毫秒)' }),
99
+ }).description('API接口配置')
100
+ .i18n({ 'zh-CN': 'API接口配置' }),
101
+ }).i18n({
102
+ 'zh-CN': {
103
+ 'enableNumberGuess': '启用猜数字游戏',
104
+ 'enableWzHero': '启用王者英雄猜谜',
105
+ 'enableChengyuImage': '启用看图猜成语',
106
+ 'enableChengyuJielong': '启用成语接龙',
107
+ 'enablePrivateGame': '允许私聊玩游戏',
108
+ 'autoPlayDelay': '机器人自动接龙延迟(秒)',
109
+ 'autoPlayMaxCount': '机器人最大自动接龙次数',
110
+ 'autoStopInactiveTime': '无操作自动停止时间(秒)',
111
+ 'guessNumber': '猜数字游戏配置',
112
+ 'guessNumber.min': '最小值',
113
+ 'guessNumber.max': '最大值',
114
+ 'guessNumber.botParticipateInGroup': '机器人参与群聊游戏',
115
+ 'guessNumber.totalRounds': '总回合数',
116
+ 'guessNumber.showRank': '显示排行榜',
117
+ 'wzHero': '王者英雄猜谜配置',
118
+ 'wzHero.botParticipateInGroup': '机器人参与群聊游戏',
119
+ 'wzHero.totalRounds': '总回合数',
120
+ 'wzHero.showRank': '显示排行榜',
121
+ 'chengyuImage': '看图猜成语配置',
122
+ 'chengyuImage.botParticipateInGroup': '机器人参与群聊游戏',
123
+ 'chengyuImage.totalRounds': '总回合数',
124
+ 'chengyuImage.showRank': '显示排行榜',
125
+ 'chengyuJielong': '成语接龙配置',
126
+ 'chengyuJielong.botParticipateInGroup': '机器人参与群聊游戏',
127
+ 'chengyuJielong.totalRounds': '总回合数',
128
+ 'chengyuJielong.showRank': '显示排行榜',
129
+ 'apiConfig': 'API接口配置',
130
+ 'apiConfig.timeout': '请求超时时间(毫秒)'
131
+ }
132
+ });
51
133
  const logger = new koishi_1.Logger('game-mini');
52
134
  const gameStates = new Map();
53
135
  const getSessionKey = (s) => s.channelId ? `g:${s.channelId}` : `p:${s.userId}`;
54
- // 修复:处理userId可能为undefined的情况
55
- const getPlayerKey = (platform, userId) => {
56
- const safeUserId = userId || 'unknown_user';
57
- return `${platform}_${safeUserId}`;
136
+ const getIntUserId = (session) => {
137
+ const userIdStr = session.userId || '0';
138
+ const hash = userIdStr.split('').reduce((acc, char) => acc + char.charCodeAt(0), 0);
139
+ return hash || 1000000;
58
140
  };
59
- // 修复:确保返回的PlayerData中所有字段都是string类型
60
141
  const getPlayerData = (session) => {
61
142
  const safeUserId = session.userId || 'unknown_user';
62
143
  return {
@@ -166,7 +247,6 @@ const addScoreToOthers = (players, excludePlayerKey) => {
166
247
  });
167
248
  };
168
249
  function apply(ctx, cfg) {
169
- // 修复:为wzHero添加缺失的start属性
170
250
  const d = {
171
251
  guessNumber: {
172
252
  usage: "用法错误!正确用法:guess start/stop 或 直接输入数字",
@@ -183,7 +263,7 @@ function apply(ctx, cfg) {
183
263
  disabled: "猜数字功能已关闭,请联系管理员开启",
184
264
  },
185
265
  wzHero: {
186
- start: "王者英雄猜谜开始!本次共 {0} 回合~", // 新增缺失的start属性
266
+ start: "王者英雄猜谜开始!本次共 {0} 回合~",
187
267
  startUsage: "用法错误!正确用法:wzhero start [难度] 开始游戏",
188
268
  stop: "王者英雄猜谜比赛已停止",
189
269
  notStarted: "王者英雄猜谜比赛尚未开始,请输入 wzhero start [难度] 开始游戏",
@@ -298,9 +378,16 @@ function apply(ctx, cfg) {
298
378
  st.chengyuJielong.autoPlayCount += 1;
299
379
  gameStates.set(key, st);
300
380
  try {
301
- // 修复:传入可能为undefined的userId,函数内部已处理
381
+ const intUserId = getIntUserId(session);
302
382
  const r = await axios_1.default.get('https://api.suol.cc/v1/game_cyjl.php', {
303
- params: { id: getPlayerKey(session.platform, session.userId), msg: '我接' }, timeout: cfg.apiConfig.timeout
383
+ params: {
384
+ id: intUserId,
385
+ msg: '我接'
386
+ },
387
+ timeout: cfg.apiConfig.timeout,
388
+ headers: {
389
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
390
+ }
304
391
  });
305
392
  const dt = r.data;
306
393
  let m = '';
@@ -310,7 +397,7 @@ function apply(ctx, cfg) {
310
397
  st.chengyuJielong.lastChar = dt.data.current_char || '';
311
398
  }
312
399
  else {
313
- m = d.chengyuJielong.botWin;
400
+ m = dt.msg || d.chengyuJielong.botWin;
314
401
  st.chengyuJielong.currentRound += 1;
315
402
  if (st.chengyuJielong.currentRound > st.chengyuJielong.totalRounds) {
316
403
  st.chengyuJielong.started = false;
@@ -345,8 +432,7 @@ function apply(ctx, cfg) {
345
432
  if (isPrivate(session) && !cfg.enablePrivateGame)
346
433
  return next();
347
434
  const content = session.content.trim();
348
- // 修复:传入可能为undefined的userId,函数内部已处理
349
- const playerKey = getPlayerKey(session.platform, session.userId);
435
+ const playerKey = `${session.platform}_${session.userId || 'unknown'}`;
350
436
  if (cfg.enableChengyuJielong && st.chengyuJielong.started) {
351
437
  refreshActive(st);
352
438
  if (!st.chengyuJielong.players[playerKey]) {
@@ -358,14 +444,22 @@ function apply(ctx, cfg) {
358
444
  return next();
359
445
  }
360
446
  try {
447
+ const intUserId = getIntUserId(session);
361
448
  const r = await axios_1.default.get('https://api.suol.cc/v1/game_cyjl.php', {
362
- params: { id: playerKey, msg: `我接${content}` }, timeout: cfg.apiConfig.timeout
449
+ params: {
450
+ id: intUserId,
451
+ msg: `我接${content}`
452
+ },
453
+ timeout: cfg.apiConfig.timeout,
454
+ headers: {
455
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
456
+ }
363
457
  });
364
458
  const dt = r.data;
365
459
  let m = '';
366
460
  if (dt.code === 200) {
367
461
  m = dt.msg + '\n';
368
- if (dt.data.user) {
462
+ if (dt.data?.user) {
369
463
  st.chengyuJielong.players[playerKey].score += 1;
370
464
  st.chengyuJielong.players[playerKey].correctCount += 1;
371
465
  m += d.chengyuJielong.correct.replace('{0}', st.chengyuJielong.players[playerKey].score.toString()) + '\n';
@@ -375,7 +469,7 @@ function apply(ctx, cfg) {
375
469
  addScoreToOthers(st.chengyuJielong.players, playerKey);
376
470
  m += d.chengyuJielong.wrong.replace('{1}', st.chengyuJielong.players[playerKey].score.toString()) + '\n';
377
471
  }
378
- if (dt.data.system) {
472
+ if (dt.data?.system) {
379
473
  m += `我的接龙:${dt.data.system.idiom}(${dt.data.system.pinyin})\n释义:${dt.data.system.meaning}`;
380
474
  st.chengyuJielong.lastChar = dt.data.current_char || '';
381
475
  }
@@ -435,7 +529,6 @@ function apply(ctx, cfg) {
435
529
  }
436
530
  }
437
531
  catch (error) {
438
- logger.error(error);
439
532
  await session.send(d.chengyuImage.hintError);
440
533
  }
441
534
  return;
@@ -510,7 +603,6 @@ function apply(ctx, cfg) {
510
603
  }
511
604
  }
512
605
  catch (error) {
513
- logger.error(error);
514
606
  await session.send(d.chengyuImage.apiError);
515
607
  }
516
608
  gameStates.set(key, st);
@@ -523,7 +615,7 @@ function apply(ctx, cfg) {
523
615
  }
524
616
  try {
525
617
  const r = await axios_1.default.get('https://api.suol.cc/v1/game_wz.php', {
526
- params: { id: playerKey, msg: content }, timeout: cfg.apiConfig.timeout
618
+ params: { id: getIntUserId(session), msg: content }, timeout: cfg.apiConfig.timeout
527
619
  });
528
620
  const dt = r.data;
529
621
  if (dt.status === 'success') {
@@ -549,7 +641,7 @@ function apply(ctx, cfg) {
549
641
  else {
550
642
  text += '\n' + d.wzHero.roundEnd.replace('{0}', st.wzHero.currentRound.toString()).replace('{1}', (st.wzHero.totalRounds - st.wzHero.currentRound).toString());
551
643
  const nextR = await axios_1.default.get('https://api.suol.cc/v1/game_wz.php', {
552
- params: { id: playerKey, msg: `开始游戏${st.wzHero.difficulty}` }, timeout: cfg.apiConfig.timeout
644
+ params: { id: getIntUserId(session), msg: `开始游戏${st.wzHero.difficulty}` }, timeout: cfg.apiConfig.timeout
553
645
  });
554
646
  const nextDt = nextR.data;
555
647
  if (nextDt.status === 'success') {
@@ -639,15 +731,13 @@ function apply(ctx, cfg) {
639
731
  st.wzHero.participants = [];
640
732
  gameStates.set(key, st);
641
733
  try {
642
- // 修复:传入可能为undefined的userId,函数内部已处理
643
734
  const r = await axios_1.default.get('https://api.suol.cc/v1/game_wz.php', {
644
- params: { id: getPlayerKey(s.platform, s.userId), msg: `开始游戏${fd}` }, timeout: cfg.apiConfig.timeout
735
+ params: { id: getIntUserId(s), msg: `开始游戏${fd}` }, timeout: cfg.apiConfig.timeout
645
736
  });
646
737
  const dt = r.data;
647
738
  if (dt.status === 'success') {
648
739
  let t = `${dt.message}\n${dt.hint}\n剩余提示次数:${dt.remaining_hints}\n${dt.guide}`;
649
740
  t = t.replace(/\\n/g, '\n');
650
- // 现在d.wzHero.start已存在,不会报错
651
741
  t = d.wzHero.start.replace('{0}', cfg.wzHero.totalRounds.toString()) + '\n' + t;
652
742
  st.wzHero.currentAnswer = dt.hint || '';
653
743
  await s.send(t);
@@ -716,7 +806,6 @@ function apply(ctx, cfg) {
716
806
  }
717
807
  }
718
808
  catch (error) {
719
- logger.error(error);
720
809
  await s.send(d.chengyuImage.apiError);
721
810
  st.chengyuImage.started = false;
722
811
  }
@@ -763,9 +852,16 @@ function apply(ctx, cfg) {
763
852
  refreshActive(st);
764
853
  gameStates.set(key, st);
765
854
  try {
766
- // 修复:传入可能为undefined的userId,函数内部已处理
855
+ const intUserId = getIntUserId(s);
767
856
  const r = await axios_1.default.get('https://api.suol.cc/v1/game_cyjl.php', {
768
- params: { id: getPlayerKey(s.platform, s.userId), msg: '开始成语接龙' }, timeout: cfg.apiConfig.timeout
857
+ params: {
858
+ id: intUserId,
859
+ msg: '开始成语接龙'
860
+ },
861
+ timeout: cfg.apiConfig.timeout,
862
+ headers: {
863
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
864
+ }
769
865
  });
770
866
  const dt = r.data;
771
867
  let m = d.chengyuJielong.start.replace('{0}', cfg.chengyuJielong.totalRounds.toString());
@@ -1,3 +1,34 @@
1
+ config:
2
+ game-mini:
3
+ enableNumberGuess: 启用猜数字游戏
4
+ enableWzHero: 启用王者英雄猜谜
5
+ enableChengyuImage: 启用看图猜成语
6
+ enableChengyuJielong: 启用成语接龙
7
+ enablePrivateGame: 允许私聊玩游戏
8
+ autoPlayDelay: 机器人自动接龙延迟(秒)
9
+ autoPlayMaxCount: 机器人最大自动接龙次数
10
+ autoStopInactiveTime: 无操作自动停止时间(秒)
11
+ guessNumber: 猜数字游戏配置
12
+ guessNumber.min: 最小值
13
+ guessNumber.max: 最大值
14
+ guessNumber.botParticipateInGroup: 机器人参与群聊游戏
15
+ guessNumber.totalRounds: 总回合数
16
+ guessNumber.showRank: 显示排行榜
17
+ wzHero: 王者英雄猜谜配置
18
+ wzHero.botParticipateInGroup: 机器人参与群聊游戏
19
+ wzHero.totalRounds: 总回合数
20
+ wzHero.showRank: 显示排行榜
21
+ chengyuImage: 看图猜成语配置
22
+ chengyuImage.botParticipateInGroup: 机器人参与群聊游戏
23
+ chengyuImage.totalRounds: 总回合数
24
+ chengyuImage.showRank: 显示排行榜
25
+ chengyuJielong: 成语接龙配置
26
+ chengyuJielong.botParticipateInGroup: 机器人参与群聊游戏
27
+ chengyuJielong.totalRounds: 总回合数
28
+ chengyuJielong.showRank: 显示排行榜
29
+ apiConfig: API接口配置
30
+ apiConfig.timeout: 请求超时时间(毫秒)
31
+
1
32
  guessNumber:
2
33
  usage: "用法错误!正确用法:guess start/stop 或 直接输入数字"
3
34
  start: "猜数字比赛开始!本次共 {0} 回合~"
@@ -13,6 +44,7 @@ guessNumber:
13
44
  disabled: "猜数字功能已关闭,请联系管理员开启"
14
45
 
15
46
  wzHero:
47
+ start: "王者英雄猜谜开始!本次共 {0} 回合~"
16
48
  startUsage: "用法错误!正确用法:wzhero start [难度] 开始游戏"
17
49
  stop: "王者英雄猜谜比赛已停止"
18
50
  notStarted: "王者英雄猜谜比赛尚未开始,请输入 wzhero start [难度] 开始游戏"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "koishi-plugin-game-mini",
3
- "version": "0.1.9",
3
+ "version": "0.2.1",
4
4
  "description": "一款包含猜数字、猜王者英雄、看图猜成语、成语接龙的多功能小游戏插件",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",