koishi-plugin-gl-bot 0.0.11 → 0.0.12

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 (66) hide show
  1. package/lib/gl/index.d.ts +36 -55
  2. package/lib/gl/index.js +4 -6
  3. package/lib/gl/queqiao.adapter.d.ts +11 -0
  4. package/lib/gl/queqiao.adapter.js +41 -0
  5. package/lib/mcsManager/api.d.ts +1 -0
  6. package/lib/mcsManager/api.js +13 -1
  7. package/lib/mcsManager/bot.d.ts +2 -2
  8. package/lib/mcsManager/bot.js +1 -0
  9. package/lib/mcsManager/commands/index.d.ts +1 -0
  10. package/lib/mcsManager/commands/index.js +3 -1
  11. package/lib/mcsManager/commands/mc/health.d.ts +16 -0
  12. package/lib/mcsManager/commands/mc/health.js +46 -0
  13. package/lib/mcsManager/commands/mc/list.d.ts +1 -0
  14. package/lib/mcsManager/commands/mc/list.js +21 -6
  15. package/lib/mcsManager/commands/mc/online.d.ts +6 -1
  16. package/lib/mcsManager/commands/mc/online.js +49 -12
  17. package/lib/mcsManager/config.d.ts +39 -0
  18. package/lib/mcsManager/config.js +21 -0
  19. package/lib/mcsManager/index.d.ts +32 -1
  20. package/lib/mcsManager/index.js +4 -1
  21. package/lib/mcsManager/type.d.ts +2 -0
  22. package/lib/queQiao/index.d.ts +47 -38
  23. package/lib/queQiao/index.js +82 -47
  24. package/lib/queQiao/locale/zh-CN.json +1 -1
  25. package/lib/queQiao/locale/zh-CN.yml +4 -4
  26. package/lib/queQiao/mcwss.d.ts +12 -9
  27. package/lib/queQiao/mcwss.js +34 -2
  28. package/lib/queQiao/values.js +2 -2
  29. package/lib/utils/game.mc.js +5 -4
  30. package/package.json +1 -1
  31. package/lib/constants/env.d.ts +0 -0
  32. package/lib/constants/env.js +0 -0
  33. package/lib/gl/index.type.d.ts +0 -0
  34. package/lib/gl/index.type.js +0 -0
  35. package/lib/mcsManager/commands/create.d.ts +0 -16
  36. package/lib/mcsManager/commands/create.js +0 -135
  37. package/lib/mcsManager/commands/list copy.d.ts +0 -13
  38. package/lib/mcsManager/commands/list copy.js +0 -34
  39. package/lib/mcsManager/commands/list.d.ts +0 -14
  40. package/lib/mcsManager/commands/list.js +0 -35
  41. package/lib/mcsManager/commands/mc/restart copy.d.ts +0 -15
  42. package/lib/mcsManager/commands/mc/restart copy.js +0 -62
  43. package/lib/mcsManager/commands/mc copy/create.d.ts +0 -16
  44. package/lib/mcsManager/commands/mc copy/create.js +0 -135
  45. package/lib/mcsManager/commands/mc copy/list.d.ts +0 -14
  46. package/lib/mcsManager/commands/mc copy/list.js +0 -35
  47. package/lib/mcsManager/commands/mc copy/restart.d.ts +0 -15
  48. package/lib/mcsManager/commands/mc copy/restart.js +0 -62
  49. package/lib/mcsManager/commands/mc copy/start.d.ts +0 -15
  50. package/lib/mcsManager/commands/mc copy/start.js +0 -54
  51. package/lib/mcsManager/commands/mc copy/stop.d.ts +0 -15
  52. package/lib/mcsManager/commands/mc copy/stop.js +0 -54
  53. package/lib/mcsManager/commands/restart.d.ts +0 -15
  54. package/lib/mcsManager/commands/restart.js +0 -62
  55. package/lib/mcsManager/commands/start copy.d.ts +0 -14
  56. package/lib/mcsManager/commands/start copy.js +0 -53
  57. package/lib/mcsManager/commands/start.d.ts +0 -15
  58. package/lib/mcsManager/commands/start.js +0 -54
  59. package/lib/mcsManager/commands/stop.d.ts +0 -15
  60. package/lib/mcsManager/commands/stop.js +0 -54
  61. package/lib/utils/file.download.d.ts +0 -47
  62. package/lib/utils/file.download.js +0 -142
  63. package/lib/utils/file.examples.d.ts +0 -12
  64. package/lib/utils/file.examples.js +0 -73
  65. package/lib/utils/napcat.file.d.ts +0 -63
  66. package/lib/utils/napcat.file.js +0 -133
@@ -1,3 +1,4 @@
1
+ import MinecraftSyncMsg from '../queQiao';
1
2
  import { RemoteInstanceStatusEnum } from './constants';
2
3
  import { MCSManagerInstance } from './instance';
3
4
  export interface MCManagerPanelResponse<T> {
@@ -214,4 +215,5 @@ export interface McUser {
214
215
  x: number;
215
216
  y: number;
216
217
  z: number;
218
+ server?: Schemastery.TypeS<typeof MinecraftSyncMsg.Config>;
217
219
  }
@@ -1,6 +1,13 @@
1
- import { Context, Schema } from 'koishi';
2
- import { GLBotConfigType } from '../gl';
1
+ import { Context, Schema, h } from 'koishi';
2
+ import { Rcon } from 'rcon-client';
3
+ import { RawData, WebSocket } from 'ws';
4
+ import { GLQueQiaoAdapter } from '../gl/queqiao.adapter';
5
+ import McWss from './mcwss';
3
6
  export declare const name = "minecraft-sync-msg";
7
+ interface MessageColor {
8
+ output: string;
9
+ color: string;
10
+ }
4
11
  export interface WsMessageData {
5
12
  api: string;
6
13
  data: {
@@ -13,42 +20,44 @@ export interface WsMessageData {
13
20
  };
14
21
  }
15
22
  declare class MinecraftSyncMsg {
16
- private ctx;
17
- private config;
18
- private ws;
19
- private rcon;
20
- private isDisposing;
21
- private reconnectAttempts;
22
- private reconnectIntervalId;
23
- private plFork;
24
- private enUS;
25
- private zhCN;
26
- constructor(ctx: Context, config: GLBotConfigType);
27
- private initialize;
28
- private setupRcon;
29
- private connectToRcon;
30
- private setupWebSocket;
31
- private connectWebSocket;
32
- private bindWebSocketEvents;
33
- private handleWsOpen;
34
- private handleWsMessage;
35
- private updatePlayerOnlineTime;
36
- private handleWsClose;
37
- private handleWsError;
38
- private setupWatchChannel;
39
- private reconnectWebSocket;
40
- private clearReconnectInterval;
41
- private setupMessageHandler;
42
- private isValidChannel;
43
- private isMessageCommand;
44
- private isRconCommand;
45
- private handleMessageCommand;
46
- private handleRconCommand;
47
- private sendRconCommand;
48
- private extractAndRemoveColor;
49
- private broadcastToChannels;
50
- private setupDisposeHandler;
51
- private dispose;
23
+ ctx: Context;
24
+ adapter: GLQueQiaoAdapter;
25
+ config: Schemastery.TypeS<typeof MinecraftSyncMsg.Config>;
26
+ ws: WebSocket | undefined;
27
+ rcon: Rcon;
28
+ isDisposing: boolean;
29
+ reconnectAttempts: number;
30
+ reconnectIntervalId: NodeJS.Timeout | null;
31
+ plFork: McWss;
32
+ enUS: any;
33
+ zhCN: any;
34
+ get serverName(): any;
35
+ constructor(ctx: Context, adapter: GLQueQiaoAdapter, config: Schemastery.TypeS<typeof MinecraftSyncMsg.Config>);
36
+ initialize(): void;
37
+ setupRcon(): void;
38
+ connectToRcon(): Promise<void>;
39
+ setupWebSocket(): void;
40
+ connectWebSocket(): void;
41
+ bindWebSocketEvents(): void;
42
+ handleWsOpen(): void;
43
+ handleWsMessage(buffer: RawData): void;
44
+ updatePlayerOnlineTime(data: any): Promise<void>;
45
+ handleWsClose(): void;
46
+ handleWsError(err: Error): void;
47
+ setupWatchChannel(): void;
48
+ reconnectWebSocket(): Promise<void>;
49
+ clearReconnectInterval(): void;
50
+ setupMessageHandler(): void;
51
+ isValidChannel(session: any): boolean;
52
+ isMessageCommand(session: any): boolean;
53
+ isRconCommand(session: any): boolean;
54
+ handleMessageCommand(session: any): Promise<void>;
55
+ handleRconCommand(session: any): Promise<void>;
56
+ sendRconCommand(command: string): Promise<string>;
57
+ extractAndRemoveColor(input?: string): MessageColor;
58
+ broadcastToChannels(message: string | h[]): void;
59
+ setupDisposeHandler(): void;
60
+ dispose(): Promise<void>;
52
61
  }
53
62
  declare namespace MinecraftSyncMsg {
54
63
  const Config: Schema<Schemastery.ObjectS<{
@@ -20,8 +20,12 @@ const enUS = require('./locale/en-US.json');
20
20
  exports.name = 'minecraft-sync-msg';
21
21
  const logger = new koishi_1.Logger('minecraft-sync-msg');
22
22
  class MinecraftSyncMsg {
23
- constructor(ctx, config) {
23
+ get serverName() {
24
+ return this.config.serverName ?? '--';
25
+ }
26
+ constructor(ctx, adapter, config) {
24
27
  this.ctx = ctx;
28
+ this.adapter = adapter;
25
29
  this.config = config;
26
30
  this.isDisposing = false;
27
31
  this.reconnectAttempts = 0;
@@ -38,7 +42,7 @@ class MinecraftSyncMsg {
38
42
  this.ctx.i18n.define('en-US', enUS);
39
43
  }
40
44
  setupRcon() {
41
- if (!this.config.rconEnable) {
45
+ if (!this.config.rconServerHost) {
42
46
  return;
43
47
  }
44
48
  this.rcon = new rcon_client_1.Rcon({
@@ -47,23 +51,23 @@ class MinecraftSyncMsg {
47
51
  password: this.config.rconPassword,
48
52
  });
49
53
  this.connectToRcon().catch(err => {
50
- logger.error('RCON服务器连接失败:', err);
54
+ logger.error(`[${this.serverName}] RCON服务器连接失败:`, err);
51
55
  });
52
56
  }
53
57
  async connectToRcon() {
54
58
  try {
55
59
  await this.rcon.connect();
56
- logger.info('已连接到RCON服务器');
60
+ logger.info(`[${this.serverName}] 已连接到RCON服务器`);
57
61
  }
58
62
  catch (err) {
59
- logger.error('连接到RCON服务器时发生错误:', err);
63
+ logger.error(`[${this.serverName}] 连接到RCON服务器时发生错误:`, err);
60
64
  throw err;
61
65
  }
62
66
  }
63
67
  setupWebSocket() {
64
68
  if (this.config.wsServer === '服务端') {
65
- this.plFork = this.ctx.plugin(mcwss_1.default, this.config);
66
- // this.plFork = new McWss(this.ctx, this.config);
69
+ // this.plFork = this.ctx.plugin(McWss, this.adapter, this.config);
70
+ this.plFork = new mcwss_1.default(this.ctx, this.adapter, this.config);
67
71
  return;
68
72
  }
69
73
  else {
@@ -91,10 +95,10 @@ class MinecraftSyncMsg {
91
95
  this.ws.on('error', err => this.handleWsError(err));
92
96
  }
93
97
  handleWsOpen() {
94
- logger.info('成功连上websocket服务器');
95
- if (!this.config.hideConnect) {
96
- this.broadcastToChannels('Websocket服务器连接成功!');
97
- }
98
+ logger.info(`[${this.serverName}] 成功连上websocket服务器`);
99
+ // if (!this.config.hideConnect) {
100
+ // this.broadcastToChannels('Websocket服务器连接成功!');
101
+ // }
98
102
  if (!constants_1.IS_DEV) {
99
103
  const msgData = {
100
104
  api: 'broadcast',
@@ -148,23 +152,52 @@ class MinecraftSyncMsg {
148
152
  if (sendImage) {
149
153
  sendMsg = sendMsg.replace(sendImage, `<img src="${sendImage}" />`);
150
154
  }
151
- sendMsg = this.ctx.i18n.render([this.config.locale ? this.config.locale : 'zh-CN'], [`minecraft-sync-msg.action.${eventName}`], [data.player?.nickname, sendMsg]);
155
+ sendMsg = this.ctx.i18n.render([this.config.locale ? this.config.locale : 'zh-CN'], [`minecraft-sync-msg.action.${eventName}`], [this.config.serverName ?? 'MC', data.player?.nickname, sendMsg]);
156
+ /// 多服消息互通逻辑
157
+ // if (data.event_name && isEqual(eventName, 'AsyncPlayerChatEvent')) {
158
+ // Object.entries(this.adapter.servers).forEach(
159
+ // async ([serverName, server]) => {
160
+ // if (!isEqual(serverName, this.config.serverName)) {
161
+ // const msgData: WsMessageData = {
162
+ // api: 'broadcast',
163
+ // data: {
164
+ // message: [
165
+ // {
166
+ // text: `[${this.config.serverName}] <${data.player?.nickname}> ${clearSessionContentToMcMessage(data.message)}`,
167
+ // color:
168
+ // server.extractAndRemoveColor(server.config.joinMsg)
169
+ // .color || 'white',
170
+ // },
171
+ // ],
172
+ // },
173
+ // };
174
+ // server.ws?.send(JSON.stringify(msgData));
175
+ // }
176
+ // },
177
+ // );
178
+ // }
152
179
  if (data.server_name && sendMsg) {
153
180
  this.broadcastToChannels(sendMsg);
154
181
  }
155
182
  }
156
183
  async updatePlayerOnlineTime(data) {
184
+ if (!online_1.MCBotGameOnline.list[this.serverName]) {
185
+ online_1.MCBotGameOnline.list[this.serverName] = {
186
+ config: this.config,
187
+ list: {},
188
+ };
189
+ }
190
+ const playerId = data.player?.uuid + '|' + this.serverName;
157
191
  if (data.player) {
158
- online_1.MCBotGameOnline.list[data.player?.uuid] = data.player;
192
+ online_1.MCBotGameOnline.list[this.serverName].list[data.player?.nickname] =
193
+ data.player;
159
194
  }
160
- console.log(data);
161
195
  if (!['PlayerJoinEvent', 'PlayerQuitEvent'].includes(data.event_name)) {
162
196
  return;
163
197
  }
164
198
  const user = await this.ctx.database.get('mcUser', {
165
199
  uuid: data.player?.uuid,
166
200
  });
167
- online_1.MCBotGameOnline.list[data.player?.uuid] = data.player;
168
201
  if (user.length === 0) {
169
202
  await this.ctx.database.create('mcUser', {
170
203
  nickname: data.player?.nickname,
@@ -173,7 +206,7 @@ class MinecraftSyncMsg {
173
206
  level: data.player?.level || 0,
174
207
  onlineTimeJSON: JSON.stringify({
175
208
  mc: {
176
- [data.player?.uuid]: 0,
209
+ [playerId]: 0,
177
210
  },
178
211
  }),
179
212
  });
@@ -192,7 +225,7 @@ class MinecraftSyncMsg {
192
225
  const lastTime = new Date(user[0].lastTime).getTime();
193
226
  const nowTime = Date.now();
194
227
  const onlineDuration = Math.floor((nowTime - lastTime) / 1000); // 在线时长,单位秒
195
- delete online_1.MCBotGameOnline.list[user[0].uuid];
228
+ delete online_1.MCBotGameOnline.list[this.serverName].list[data.player?.nickname];
196
229
  let onlineTimeJSON = {};
197
230
  try {
198
231
  onlineTimeJSON = JSON.parse(user[0].onlineTimeJSON);
@@ -203,10 +236,10 @@ class MinecraftSyncMsg {
203
236
  if (!onlineTimeJSON.mc) {
204
237
  onlineTimeJSON.mc = {};
205
238
  }
206
- if (!onlineTimeJSON.mc[data.player?.uuid]) {
207
- onlineTimeJSON.mc[data.player?.uuid] = 0;
239
+ if (!onlineTimeJSON.mc[playerId]) {
240
+ onlineTimeJSON.mc[playerId] = 0;
208
241
  }
209
- onlineTimeJSON.mc[data.player?.uuid] += onlineDuration;
242
+ onlineTimeJSON.mc[playerId] += onlineDuration;
210
243
  await this.ctx.database.set('mcUser', { uuid: data.player?.uuid }, {
211
244
  nickname: data.player?.nickname,
212
245
  lastTime: new Date(),
@@ -214,16 +247,17 @@ class MinecraftSyncMsg {
214
247
  onlineTimeJSON: JSON.stringify(onlineTimeJSON),
215
248
  });
216
249
  }
217
- console.log({ user });
218
250
  }
219
251
  handleWsClose() {
220
252
  if (this.isDisposing) {
221
253
  return;
222
254
  }
223
- if (!this.config.hideConnect) {
224
- this.broadcastToChannels('与Websocket服务器断开连接!');
225
- }
226
- logger.error('非正常与Websocket服务器断开连接!');
255
+ // if (!this.config.hideConnect) {
256
+ // this.broadcastToChannels(
257
+ // `[${this.serverName}] 与Websocket服务器断开连接!`,
258
+ // );
259
+ // }
260
+ logger.error(`[${this.serverName}] 非正常与Websocket服务器断开连接!`);
227
261
  this.ws = undefined;
228
262
  this.reconnectWebSocket();
229
263
  }
@@ -231,10 +265,12 @@ class MinecraftSyncMsg {
231
265
  if (this.isDisposing) {
232
266
  return;
233
267
  }
234
- if (!this.config.hideConnect) {
235
- this.broadcastToChannels('与Websocket服务器断通信时发生错误!');
236
- }
237
- logger.error('与Websocket服务器断通信时发生错误:', err);
268
+ // if (!this.config.hideConnect) {
269
+ // this.broadcastToChannels(
270
+ // `[${this.serverName}] 与Websocket服务器断通信时发生错误!`,
271
+ // );
272
+ // }
273
+ logger.error(`[${this.serverName}] 与Websocket服务器断通信时发生错误:`, err);
238
274
  }
239
275
  setupWatchChannel() {
240
276
  this.ctx.on('message', async (session) => {
@@ -261,13 +297,13 @@ class MinecraftSyncMsg {
261
297
  async reconnectWebSocket() {
262
298
  this.clearReconnectInterval();
263
299
  this.reconnectIntervalId = setInterval(async () => {
264
- if (this.reconnectAttempts >= this.config.maxReconnectCount) {
265
- logger.error(`已达到最大重连次数 (${this.config.maxReconnectCount} 次),停止重连。`);
300
+ if (this.reconnectAttempts >= (this.config.maxReconnectCount || 3)) {
301
+ logger.error(`[${this.serverName}] 已达到最大重连次数 (${this.config.maxReconnectCount} 次),停止重连。`);
266
302
  this.clearReconnectInterval();
267
303
  return;
268
304
  }
269
305
  this.reconnectAttempts++;
270
- logger.info(`尝试第 ${this.reconnectAttempts} 次重连...`);
306
+ logger.info(`[${this.serverName}] 尝试第 ${this.reconnectAttempts} 次重连...`);
271
307
  try {
272
308
  const headers = {
273
309
  'x-self-name': encodeURIComponent(this.config.serverName),
@@ -278,24 +314,24 @@ class MinecraftSyncMsg {
278
314
  headers,
279
315
  });
280
316
  ws.on('open', () => {
281
- logger.info('WebSocket 重连成功');
317
+ logger.info(`[${this.serverName}] WebSocket 重连成功`);
282
318
  this.clearReconnectInterval();
283
319
  this.ws = ws;
284
320
  this.bindWebSocketEvents();
285
321
  });
286
322
  ws.on('error', err => {
287
- logger.error('重连时发生错误:', err);
323
+ logger.error(`[${this.serverName}] 重连时发生错误:`, err);
288
324
  ws.close();
289
325
  });
290
326
  ws.on('close', () => {
291
327
  if (!this.isDisposing) {
292
- logger.info('WebSocket 再次断开,将继续尝试重连...');
328
+ logger.info(`[${this.serverName}] WebSocket 再次断开,将继续尝试重连...`);
293
329
  }
294
330
  });
295
331
  }
296
332
  catch (err) {
297
- logger.error('创建WebSocket时发生错误:', err);
298
- if (this.reconnectAttempts >= this.config.maxReconnectCount) {
333
+ logger.error(`[${this.serverName}] 创建WebSocket时发生错误:`, err);
334
+ if (this.reconnectAttempts >= (this.config.maxReconnectCount || 3)) {
299
335
  this.clearReconnectInterval();
300
336
  }
301
337
  }
@@ -405,31 +441,33 @@ class MinecraftSyncMsg {
405
441
  session.send(response?.replaceAll(/§./g, '') || '');
406
442
  }
407
443
  async sendRconCommand(command) {
444
+ if (!this.rcon.authenticated) {
445
+ return '';
446
+ }
408
447
  try {
409
448
  const response = await this.rcon.send(command);
410
449
  return response;
411
450
  }
412
451
  catch (err) {
413
- logger.error('发送RCON命令时发生错误:', err);
452
+ logger.error(`[${this.serverName}] 发送RCON命令时发生错误:`, err);
414
453
  throw err;
415
454
  }
416
455
  }
417
456
  extractAndRemoveColor(input) {
418
457
  const regex = /&(\w+)&/;
419
- const match = input.match(regex);
458
+ const match = input?.match(regex) ?? [];
420
459
  if (match) {
421
460
  const color = match[1];
422
- const output = input.replace(regex, '');
461
+ const output = input?.replace(regex, '');
423
462
  return { output, color };
424
463
  }
425
- return { output: input, color: '' };
464
+ return { output: input ?? '', color: '' };
426
465
  }
427
466
  broadcastToChannels(message) {
428
467
  this.ctx.bots.forEach((bot) => {
429
468
  const channels = this.config.sendToChannel
430
- .filter(str => str.includes(`${bot.platform}`))
431
- .map(str => str.replace(`${bot.platform}:`, ''));
432
- console.log(this.config.sendToChannel);
469
+ ?.filter(str => str.includes(`${bot.platform}`))
470
+ ?.map(str => str.replace(`${bot.platform}:`, '')) ?? [];
433
471
  if (process.env.NODE_ENV === 'development') {
434
472
  logger.info((0, lodash_1.isString)(message)
435
473
  ? message
@@ -446,9 +484,6 @@ class MinecraftSyncMsg {
446
484
  });
447
485
  }
448
486
  async dispose() {
449
- if (this.plFork) {
450
- await this.plFork.dispose();
451
- }
452
487
  this.ctx.registry.delete(mcwss_1.default);
453
488
  if (this.ws) {
454
489
  this.ws.removeAllListeners();
@@ -1 +1 @@
1
- {"minecraft-sync-msg":{"action":{"PlayerJoinEvent":"{0} 加入了服务器!","PlayerCommandPreprocessEvent":"[指令]{0} 执行了指令","PlayerDeathEvent":"{0} 与山长眠!","AsyncPlayerChatEvent":"[MC] {0}: {1}","PlayerQuitEvent":"{0} 离开了服务器!"},"message":{"MCReceivePrefix":"({0})[{1}]"}}}
1
+ {"minecraft-sync-msg":{"action":{"PlayerJoinEvent":"[{0}] {1} 加入了服务器!","PlayerCommandPreprocessEvent":"[指令]{0} 执行了指令","PlayerDeathEvent":"[{0}] {1} 与山长眠!","AsyncPlayerChatEvent":"[{0}] {1}: {2}","PlayerQuitEvent":"[{0}] {1} 离开了服务器!"},"message":{"MCReceivePrefix":"({0})[{1}]"}}}
@@ -1,9 +1,9 @@
1
1
  minecraft-sync-msg:
2
2
  action:
3
- PlayerJoinEvent: "{0} 加入了服务器!"
3
+ PlayerJoinEvent: "[{0}] {1} 加入了服务器!"
4
4
  PlayerCommandPreprocessEvent: "[指令]{0} 执行了指令"
5
- PlayerDeathEvent: "{0} 与山长眠!"
6
- AsyncPlayerChatEvent: "[MC] {0}: {1}"
7
- PlayerQuitEvent: "{0} 离开了服务器!"
5
+ PlayerDeathEvent: "[{0}] {1} 与山长眠!"
6
+ AsyncPlayerChatEvent: "[{0}] {1}: {2}"
7
+ PlayerQuitEvent: "[{0}] {1} 离开了服务器!"
8
8
  message:
9
9
  MCReceivePrefix: "({0})[{1}]"
@@ -1,15 +1,18 @@
1
1
  import { IncomingMessage } from 'http';
2
- import { Context, Schema } from 'koishi';
2
+ import { Context, Logger, Schema } from 'koishi';
3
+ import { WebSocket, WebSocketServer } from 'ws';
4
+ import { GLQueQiaoAdapter } from '../gl/queqiao.adapter';
3
5
  import { WsConf } from './values';
4
6
  declare class McWss {
5
- private conf;
6
- private logger;
7
- private wss;
8
- private ctx;
9
- private connectedClients;
10
- constructor(ctx: Context, cfg: McWss.Config);
11
- private setupWebSocketHandlers;
12
- private setupMessageHandler;
7
+ adapter: GLQueQiaoAdapter;
8
+ conf: McWss.Config;
9
+ logger: Logger;
10
+ wss: WebSocketServer;
11
+ ctx: Context;
12
+ connectedClients: Set<WebSocket>;
13
+ constructor(ctx: Context, adapter: GLQueQiaoAdapter, cfg: McWss.Config);
14
+ setupWebSocketHandlers(): void;
15
+ setupMessageHandler(): void;
13
16
  verifyHeaders(headers: IncomingMessage['headers']): {
14
17
  valid: boolean;
15
18
  clientOrigin?: string;
@@ -9,7 +9,8 @@ const values_1 = require("./values");
9
9
  const zhCN = require('./locale/zh-CN.json');
10
10
  const enUS = require('./locale/en-US.json');
11
11
  class McWss {
12
- constructor(ctx, cfg) {
12
+ constructor(ctx, adapter, cfg) {
13
+ this.adapter = adapter;
13
14
  this.logger = new koishi_1.Logger('Minecraft-sync-msg-Wss');
14
15
  this.connectedClients = new Set();
15
16
  this.conf = cfg;
@@ -139,7 +140,9 @@ class McWss {
139
140
  setupMessageHandler() {
140
141
  let imgurl = '<unknown image url>';
141
142
  this.ctx.on('message', async (session) => {
142
- // this.ctx.logger.info(`收到聊天消息: ${session.content} 来自 ${session.platform}:${session.channelId}`);
143
+ // this.ctx.logger.info(
144
+ // `收到聊天消息: ${session.content} 来自 ${session.platform}:${session.channelId}`,
145
+ // );
143
146
  if (session.content.includes('<img') &&
144
147
  koishi_1.h.select(session.content, 'img')[0]?.type === 'img' &&
145
148
  koishi_1.h.select(session.content, 'img')[0]?.attrs?.src) {
@@ -160,6 +163,35 @@ class McWss {
160
163
  .replaceAll(/<at.*\/>/gi, `@[${koishi_1.h.select(session.content, 'at')[0]?.attrs?.name
161
164
  ? koishi_1.h.select(session.content, 'at')[0]?.attrs?.name
162
165
  : koishi_1.h.select(session.content, 'at')[0]?.attrs?.id}]`);
166
+ // console.log(this.adapter.servers);
167
+ // Object.entries(this.adapter.servers).forEach(
168
+ // async ([name, server]) => {
169
+ // console.log(
170
+ // name,
171
+ // this.conf.serverName,
172
+ // !isEqual(name, this.conf.serverName),
173
+ // );
174
+ // if (!isEqual(name, this.conf.serverName)) {
175
+ // console.log(
176
+ // `[${this.conf.serverName}] <${session.username}> ${clearSessionContentToMcMessage(session.content)}`,
177
+ // );
178
+ // const msgData: WsMessageData = {
179
+ // api: 'broadcast',
180
+ // data: {
181
+ // message: [
182
+ // {
183
+ // text: `[${this.conf.serverName}] <${session.username}> ${clearSessionContentToMcMessage(session.content)}`,
184
+ // color:
185
+ // server.extractAndRemoveColor(server.config.joinMsg)
186
+ // .color || 'white',
187
+ // },
188
+ // ],
189
+ // },
190
+ // };
191
+ // server.ws?.send(JSON.stringify(msgData));
192
+ // }
193
+ // },
194
+ // );
163
195
  if (this.connectedClients.size > 0) {
164
196
  const msgData = {
165
197
  api: 'broadcast',
@@ -94,8 +94,8 @@ exports.eventList = [
94
94
  // 事件映射
95
95
  function getSubscribedEvents(binaryInput) {
96
96
  const subscribedEvents = [];
97
- const eventValues = Object.values(mcEvent).filter(value => typeof value === 'number');
98
- const eventNames = Object.keys(mcEvent).filter(key => isNaN(Number(key)));
97
+ const eventValues = Object.values(mcEvent)?.filter(value => typeof value === 'number');
98
+ const eventNames = Object.keys(mcEvent)?.filter(key => isNaN(Number(key)));
99
99
  for (let i = 0; i < eventValues.length; i++) {
100
100
  if ((binaryInput & eventValues[i]) !== 0) {
101
101
  subscribedEvents.push(eventNames[i]);
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.clearSessionContentToMcMessage = void 0;
4
- const koishi_1 = require("koishi");
5
4
  /**
6
5
  * 清洗数据防止QQ脏数据发送到游戏内
7
6
  */
@@ -22,8 +21,10 @@ const clearSessionContentToMcMessage = (content) => {
22
21
  .replaceAll(/<video.*\/>/gi, '<视频消息>')
23
22
  .replaceAll(/<audio.*\/>/gi, '<音频消息>')
24
23
  // .replaceAll(/<img.*\/>/gi, `[[CICode,url=${imgurl}]]`)
25
- .replaceAll(/<at.*\/>/gi, `@[${koishi_1.h.select(content, 'at')[0]?.attrs?.name
26
- ? koishi_1.h.select(content, 'at')[0]?.attrs?.name
27
- : koishi_1.h.select(content, 'at')[0]?.attrs?.id}]`));
24
+ .replaceAll(/<at.*\/>/gi, `@[${
25
+ // h.select(content, 'at')[0]?.attrs?.name
26
+ // ? h.select(content, 'at')[0]?.attrs?.name
27
+ // : h.select(content, 'at')[0]?.attrs?.id
28
+ '神秘人'}]`));
28
29
  };
29
30
  exports.clearSessionContentToMcMessage = clearSessionContentToMcMessage;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-gl-bot",
3
3
  "description": "GleamSlime Koishi Rebot Plugins",
4
- "version": "0.0.11",
4
+ "version": "0.0.12",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "contributors": [
File without changes
File without changes
File without changes
File without changes
@@ -1,16 +0,0 @@
1
- import { Argv } from 'koishi';
2
- import { MCSManagerBot } from '../bot';
3
- import { MCBotCommandBase, MCBotCommandRole } from './base';
4
- /**
5
- * 服务器创建指令
6
- *
7
- * @example 服务器 创建
8
- */
9
- export declare class MCBotCreateCommand extends MCBotCommandBase {
10
- readonly bot: MCSManagerBot;
11
- command: string[];
12
- roles: MCBotCommandRole[];
13
- constructor(bot: MCSManagerBot);
14
- handle({ args, session, ...opt }: Argv, status?: string[]): Promise<string>;
15
- private downloadAndProcessFile;
16
- }