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.
- package/lib/gl/index.d.ts +36 -55
- package/lib/gl/index.js +4 -6
- package/lib/gl/queqiao.adapter.d.ts +11 -0
- package/lib/gl/queqiao.adapter.js +41 -0
- package/lib/mcsManager/api.d.ts +1 -0
- package/lib/mcsManager/api.js +13 -1
- package/lib/mcsManager/bot.d.ts +2 -2
- package/lib/mcsManager/bot.js +1 -0
- package/lib/mcsManager/commands/index.d.ts +1 -0
- package/lib/mcsManager/commands/index.js +3 -1
- package/lib/mcsManager/commands/mc/health.d.ts +16 -0
- package/lib/mcsManager/commands/mc/health.js +46 -0
- package/lib/mcsManager/commands/mc/list.d.ts +1 -0
- package/lib/mcsManager/commands/mc/list.js +21 -6
- package/lib/mcsManager/commands/mc/online.d.ts +6 -1
- package/lib/mcsManager/commands/mc/online.js +49 -12
- package/lib/mcsManager/config.d.ts +39 -0
- package/lib/mcsManager/config.js +21 -0
- package/lib/mcsManager/index.d.ts +32 -1
- package/lib/mcsManager/index.js +4 -1
- package/lib/mcsManager/type.d.ts +2 -0
- package/lib/queQiao/index.d.ts +47 -38
- package/lib/queQiao/index.js +82 -47
- package/lib/queQiao/locale/zh-CN.json +1 -1
- package/lib/queQiao/locale/zh-CN.yml +4 -4
- package/lib/queQiao/mcwss.d.ts +12 -9
- package/lib/queQiao/mcwss.js +34 -2
- package/lib/queQiao/values.js +2 -2
- package/lib/utils/game.mc.js +5 -4
- package/package.json +1 -1
- package/lib/constants/env.d.ts +0 -0
- package/lib/constants/env.js +0 -0
- package/lib/gl/index.type.d.ts +0 -0
- package/lib/gl/index.type.js +0 -0
- package/lib/mcsManager/commands/create.d.ts +0 -16
- package/lib/mcsManager/commands/create.js +0 -135
- package/lib/mcsManager/commands/list copy.d.ts +0 -13
- package/lib/mcsManager/commands/list copy.js +0 -34
- package/lib/mcsManager/commands/list.d.ts +0 -14
- package/lib/mcsManager/commands/list.js +0 -35
- package/lib/mcsManager/commands/mc/restart copy.d.ts +0 -15
- package/lib/mcsManager/commands/mc/restart copy.js +0 -62
- package/lib/mcsManager/commands/mc copy/create.d.ts +0 -16
- package/lib/mcsManager/commands/mc copy/create.js +0 -135
- package/lib/mcsManager/commands/mc copy/list.d.ts +0 -14
- package/lib/mcsManager/commands/mc copy/list.js +0 -35
- package/lib/mcsManager/commands/mc copy/restart.d.ts +0 -15
- package/lib/mcsManager/commands/mc copy/restart.js +0 -62
- package/lib/mcsManager/commands/mc copy/start.d.ts +0 -15
- package/lib/mcsManager/commands/mc copy/start.js +0 -54
- package/lib/mcsManager/commands/mc copy/stop.d.ts +0 -15
- package/lib/mcsManager/commands/mc copy/stop.js +0 -54
- package/lib/mcsManager/commands/restart.d.ts +0 -15
- package/lib/mcsManager/commands/restart.js +0 -62
- package/lib/mcsManager/commands/start copy.d.ts +0 -14
- package/lib/mcsManager/commands/start copy.js +0 -53
- package/lib/mcsManager/commands/start.d.ts +0 -15
- package/lib/mcsManager/commands/start.js +0 -54
- package/lib/mcsManager/commands/stop.d.ts +0 -15
- package/lib/mcsManager/commands/stop.js +0 -54
- package/lib/utils/file.download.d.ts +0 -47
- package/lib/utils/file.download.js +0 -142
- package/lib/utils/file.examples.d.ts +0 -12
- package/lib/utils/file.examples.js +0 -73
- package/lib/utils/napcat.file.d.ts +0 -63
- package/lib/utils/napcat.file.js +0 -133
package/lib/mcsManager/type.d.ts
CHANGED
|
@@ -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
|
}
|
package/lib/queQiao/index.d.ts
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
|
-
import { Context, Schema } from 'koishi';
|
|
2
|
-
import {
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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<{
|
package/lib/queQiao/index.js
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
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(
|
|
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(
|
|
60
|
+
logger.info(`[${this.serverName}] 已连接到RCON服务器`);
|
|
57
61
|
}
|
|
58
62
|
catch (err) {
|
|
59
|
-
logger.error(
|
|
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(
|
|
66
|
-
|
|
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(
|
|
95
|
-
if (!this.config.hideConnect) {
|
|
96
|
-
|
|
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?.
|
|
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
|
-
[
|
|
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[
|
|
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[
|
|
207
|
-
onlineTimeJSON.mc[
|
|
239
|
+
if (!onlineTimeJSON.mc[playerId]) {
|
|
240
|
+
onlineTimeJSON.mc[playerId] = 0;
|
|
208
241
|
}
|
|
209
|
-
onlineTimeJSON.mc[
|
|
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
|
-
|
|
225
|
-
}
|
|
226
|
-
|
|
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
|
-
|
|
236
|
-
}
|
|
237
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
328
|
+
logger.info(`[${this.serverName}] WebSocket 再次断开,将继续尝试重连...`);
|
|
293
329
|
}
|
|
294
330
|
});
|
|
295
331
|
}
|
|
296
332
|
catch (err) {
|
|
297
|
-
logger.error(
|
|
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(
|
|
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
|
|
458
|
+
const match = input?.match(regex) ?? [];
|
|
420
459
|
if (match) {
|
|
421
460
|
const color = match[1];
|
|
422
|
-
const output = input
|
|
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
|
-
|
|
431
|
-
|
|
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":"[
|
|
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: "[
|
|
7
|
-
PlayerQuitEvent: "{0} 离开了服务器!"
|
|
5
|
+
PlayerDeathEvent: "[{0}] {1} 与山长眠!"
|
|
6
|
+
AsyncPlayerChatEvent: "[{0}] {1}: {2}"
|
|
7
|
+
PlayerQuitEvent: "[{0}] {1} 离开了服务器!"
|
|
8
8
|
message:
|
|
9
9
|
MCReceivePrefix: "({0})[{1}]"
|
package/lib/queQiao/mcwss.d.ts
CHANGED
|
@@ -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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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;
|
package/lib/queQiao/mcwss.js
CHANGED
|
@@ -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(
|
|
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',
|
package/lib/queQiao/values.js
CHANGED
|
@@ -94,8 +94,8 @@ exports.eventList = [
|
|
|
94
94
|
// 事件映射
|
|
95
95
|
function getSubscribedEvents(binaryInput) {
|
|
96
96
|
const subscribedEvents = [];
|
|
97
|
-
const eventValues = Object.values(mcEvent)
|
|
98
|
-
const eventNames = Object.keys(mcEvent)
|
|
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]);
|
package/lib/utils/game.mc.js
CHANGED
|
@@ -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, `@[${
|
|
26
|
-
|
|
27
|
-
|
|
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
package/lib/constants/env.d.ts
DELETED
|
File without changes
|
package/lib/constants/env.js
DELETED
|
File without changes
|
package/lib/gl/index.type.d.ts
DELETED
|
File without changes
|
package/lib/gl/index.type.js
DELETED
|
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
|
-
}
|