koishi-plugin-gl-bot 0.0.9 → 0.0.11
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/constants/env.d.ts +0 -0
- package/lib/constants/env.js +0 -0
- package/lib/gl/index.d.ts +9 -0
- package/lib/gl/index.js +9 -2
- package/lib/gl/index.type.d.ts +0 -0
- package/lib/gl/index.type.js +0 -0
- package/lib/index.d.ts +0 -1
- package/lib/index.js +0 -2
- package/lib/mcsManager/api.d.ts +18 -3
- package/lib/mcsManager/api.js +157 -7
- package/lib/mcsManager/bot.d.ts +5 -3
- package/lib/mcsManager/bot.js +18 -10
- package/lib/mcsManager/commands/ark/create.d.ts +15 -0
- package/lib/mcsManager/commands/ark/create.js +66 -0
- package/lib/mcsManager/commands/ark/list.d.ts +14 -0
- package/lib/mcsManager/commands/ark/list.js +35 -0
- package/lib/mcsManager/commands/ark/restart.d.ts +15 -0
- package/lib/mcsManager/commands/ark/restart.js +62 -0
- package/lib/mcsManager/commands/ark/start.d.ts +15 -0
- package/lib/mcsManager/commands/ark/start.js +54 -0
- package/lib/mcsManager/commands/ark/stop.d.ts +15 -0
- package/lib/mcsManager/commands/ark/stop.js +54 -0
- package/lib/mcsManager/commands/base.d.ts +20 -1
- package/lib/mcsManager/commands/base.js +41 -3
- package/lib/mcsManager/commands/create.d.ts +16 -0
- package/lib/mcsManager/commands/create.js +135 -0
- package/lib/mcsManager/commands/index.d.ts +10 -7
- package/lib/mcsManager/commands/index.js +22 -11
- package/lib/mcsManager/commands/list copy.d.ts +13 -0
- package/lib/mcsManager/commands/list copy.js +34 -0
- package/lib/mcsManager/commands/list.d.ts +14 -0
- package/lib/mcsManager/commands/list.js +35 -0
- package/lib/mcsManager/commands/mc/create.d.ts +15 -0
- package/lib/mcsManager/commands/mc/create.js +79 -0
- package/lib/mcsManager/commands/mc/list.d.ts +14 -0
- package/lib/mcsManager/commands/mc/list.js +39 -0
- package/lib/mcsManager/commands/mc/online.d.ts +24 -0
- package/lib/mcsManager/commands/mc/online.js +112 -0
- package/lib/mcsManager/commands/mc/restart copy.d.ts +15 -0
- package/lib/mcsManager/commands/mc/restart copy.js +62 -0
- package/lib/mcsManager/commands/mc/restart.d.ts +15 -0
- package/lib/mcsManager/commands/mc/restart.js +62 -0
- package/lib/mcsManager/commands/mc/start.d.ts +15 -0
- package/lib/mcsManager/commands/mc/start.js +54 -0
- package/lib/mcsManager/commands/mc/stop.d.ts +15 -0
- package/lib/mcsManager/commands/mc/stop.js +54 -0
- package/lib/mcsManager/commands/mc copy/create.d.ts +16 -0
- package/lib/mcsManager/commands/mc copy/create.js +135 -0
- package/lib/mcsManager/commands/mc copy/list.d.ts +14 -0
- package/lib/mcsManager/commands/mc copy/list.js +35 -0
- package/lib/mcsManager/commands/mc copy/restart.d.ts +15 -0
- package/lib/mcsManager/commands/mc copy/restart.js +62 -0
- package/lib/mcsManager/commands/mc copy/start.d.ts +15 -0
- package/lib/mcsManager/commands/mc copy/start.js +54 -0
- package/lib/mcsManager/commands/mc copy/stop.d.ts +15 -0
- package/lib/mcsManager/commands/mc copy/stop.js +54 -0
- package/lib/mcsManager/commands/restart.d.ts +15 -0
- package/lib/mcsManager/commands/restart.js +62 -0
- package/lib/mcsManager/commands/start copy.d.ts +14 -0
- package/lib/mcsManager/commands/{reset.js → start copy.js } +23 -15
- package/lib/mcsManager/commands/start.d.ts +15 -0
- package/lib/mcsManager/commands/start.js +54 -0
- package/lib/mcsManager/commands/stop.d.ts +15 -0
- package/lib/mcsManager/commands/stop.js +54 -0
- package/lib/mcsManager/constants.d.ts +4 -0
- package/lib/mcsManager/constants.js +4 -0
- package/lib/mcsManager/index.d.ts +4 -3
- package/lib/mcsManager/index.js +5 -2
- package/lib/mcsManager/instance.d.ts +3 -1
- package/lib/mcsManager/instance.js +8 -2
- package/lib/mcsManager/json/createInstanceUpload.json +49 -0
- package/lib/mcsManager/panel.d.ts +1 -1
- package/lib/mcsManager/panel.js +7 -5
- package/lib/mcsManager/schedules/index.d.ts +8 -0
- package/lib/mcsManager/schedules/index.js +41 -0
- package/lib/mcsManager/schedules/mc.schedule.d.ts +11 -0
- package/lib/mcsManager/schedules/mc.schedule.js +15 -0
- package/lib/mcsManager/type.d.ts +102 -0
- package/lib/mcsManager/ws.js +6 -6
- package/lib/napCat/api.d.ts +21 -0
- package/lib/napCat/api.js +43 -0
- package/lib/napCat/config.d.ts +10 -0
- package/lib/napCat/config.js +16 -0
- package/lib/napCat/index.d.ts +16 -0
- package/lib/napCat/index.js +15 -0
- package/lib/queQiao/index.d.ts +1 -0
- package/lib/queQiao/index.js +70 -3
- package/lib/queQiao/locale/en-US.yml +9 -9
- package/lib/queQiao/locale/zh-CN.json +1 -1
- package/lib/queQiao/locale/zh-CN.yml +9 -9
- package/lib/utils/file.download.d.ts +47 -0
- package/lib/utils/file.download.js +142 -0
- package/lib/utils/file.examples.d.ts +12 -0
- package/lib/utils/file.examples.js +73 -0
- package/lib/utils/index.d.ts +7 -0
- package/lib/utils/index.js +58 -0
- package/lib/utils/napcat.file.d.ts +63 -0
- package/lib/utils/napcat.file.js +133 -0
- package/package.json +4 -3
- package/lib/mcsManager/commands/reset.d.ts +0 -12
package/lib/mcsManager/panel.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MCSManagerPanel = void 0;
|
|
4
4
|
const koishi_1 = require("koishi");
|
|
5
|
-
const
|
|
5
|
+
const lodash_1 = require("lodash");
|
|
6
6
|
const api_1 = require("./api");
|
|
7
7
|
const constants_1 = require("./constants");
|
|
8
8
|
const instance_1 = require("./instance");
|
|
@@ -17,7 +17,7 @@ class MCSManagerPanel {
|
|
|
17
17
|
this.remotes = [];
|
|
18
18
|
// 远程连接Map表
|
|
19
19
|
this.remoteConnectionsMap = new Map();
|
|
20
|
-
this.api = new api_1.MCSManagerAPI(ctx.http, config.mcManagerHost);
|
|
20
|
+
this.api = new api_1.MCSManagerAPI(ctx.http, config.mcManagerHost, config.mcManagerWs);
|
|
21
21
|
this.initialize();
|
|
22
22
|
}
|
|
23
23
|
async initialize() {
|
|
@@ -31,16 +31,18 @@ class MCSManagerPanel {
|
|
|
31
31
|
await this.handleRemoteServices();
|
|
32
32
|
await this.getAvailableRemoteInstance();
|
|
33
33
|
}
|
|
34
|
-
// 获取远程服务及其实例列表
|
|
34
|
+
// 获取远程服务及其实例列表 [全量]
|
|
35
35
|
async handleRemoteServices() {
|
|
36
36
|
const remoteList = await this.api.getServiceRemoteList();
|
|
37
|
+
const insertList = [];
|
|
37
38
|
for (const remote of remoteList) {
|
|
38
39
|
const instanceList = await this.api.getServiceRemoteInstanceList(remote.uuid);
|
|
39
|
-
|
|
40
|
+
insertList.push({
|
|
40
41
|
instances: instanceList.map(item => new instance_1.MCSManagerInstance(this.ctx, this.config, this.api, this, remote, item)),
|
|
41
42
|
...remote,
|
|
42
43
|
});
|
|
43
44
|
}
|
|
45
|
+
this.remotes = insertList;
|
|
44
46
|
logger.info(`已获取到 ${this.remotes.length} 个远程节点及其实例 ${this.remotes.reduce((acc, remote) => acc + remote.instances.length, 0)} 个`);
|
|
45
47
|
}
|
|
46
48
|
// 遍历所有远程节点 选择正在运行中的实力 建立远程连接
|
|
@@ -53,7 +55,7 @@ class MCSManagerPanel {
|
|
|
53
55
|
}
|
|
54
56
|
// 创建远程连接
|
|
55
57
|
async createMCSManagerConnection(remote, instance) {
|
|
56
|
-
if ((0,
|
|
58
|
+
if ((0, lodash_1.isEqual)(instance.status, constants_1.RemoteInstanceStatusEnum.RUNNING)) {
|
|
57
59
|
const uuid = instance.instanceUuid;
|
|
58
60
|
// 已存在的实例且连接中 直接返回
|
|
59
61
|
if (this.remoteConnectionsMap.has(uuid) &&
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.registerMcSchedule = void 0;
|
|
37
|
+
const McSchedule = __importStar(require("./mc.schedule"));
|
|
38
|
+
const registerMcSchedule = (ctx) => {
|
|
39
|
+
McSchedule.default(ctx);
|
|
40
|
+
};
|
|
41
|
+
exports.registerMcSchedule = registerMcSchedule;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = (ctx) => {
|
|
4
|
+
ctx.model.extend('mcUser', {
|
|
5
|
+
id: { type: 'unsigned', length: 8 },
|
|
6
|
+
nickname: 'string',
|
|
7
|
+
uuid: 'string',
|
|
8
|
+
lastTime: 'timestamp',
|
|
9
|
+
level: 'integer',
|
|
10
|
+
onlineTimeJSON: 'text',
|
|
11
|
+
}, {
|
|
12
|
+
primary: 'id',
|
|
13
|
+
autoInc: true,
|
|
14
|
+
});
|
|
15
|
+
};
|
package/lib/mcsManager/type.d.ts
CHANGED
|
@@ -113,3 +113,105 @@ export interface ServiceInstanceConnectAuth {
|
|
|
113
113
|
addr: string;
|
|
114
114
|
prefix: string;
|
|
115
115
|
}
|
|
116
|
+
export interface CreateInstanceData {
|
|
117
|
+
nickname?: string;
|
|
118
|
+
startCommand?: string;
|
|
119
|
+
stopCommand?: string;
|
|
120
|
+
cwd?: string;
|
|
121
|
+
ie?: string;
|
|
122
|
+
oe?: string;
|
|
123
|
+
processType?: string;
|
|
124
|
+
createDatetime?: string;
|
|
125
|
+
lastDatetime?: string;
|
|
126
|
+
type?: string;
|
|
127
|
+
tag?: string[];
|
|
128
|
+
maxSpace?: null;
|
|
129
|
+
endTime?: string;
|
|
130
|
+
docker?: {
|
|
131
|
+
containerName?: string;
|
|
132
|
+
image?: string;
|
|
133
|
+
ports?: string[];
|
|
134
|
+
extraVolumes?: string[];
|
|
135
|
+
networkMode?: 'bridge';
|
|
136
|
+
networkAliases?: string[];
|
|
137
|
+
cpusetCpus?: string;
|
|
138
|
+
workingDir?: '/data';
|
|
139
|
+
changeWorkdir?: false;
|
|
140
|
+
env?: [];
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
export type TerminalOption = {
|
|
144
|
+
haveColor: boolean;
|
|
145
|
+
pty: boolean;
|
|
146
|
+
ptyWindowCol: number;
|
|
147
|
+
ptyWindowRow: number;
|
|
148
|
+
};
|
|
149
|
+
export type EventTaskConfig = {
|
|
150
|
+
autoStart: boolean;
|
|
151
|
+
autoRestart: boolean;
|
|
152
|
+
autoRestartMaxTimes: number;
|
|
153
|
+
ignore: boolean;
|
|
154
|
+
};
|
|
155
|
+
export type DockerConfig = {
|
|
156
|
+
containerName: string;
|
|
157
|
+
image: string;
|
|
158
|
+
ports: unknown[];
|
|
159
|
+
extraVolumes: unknown[];
|
|
160
|
+
networkMode: string;
|
|
161
|
+
networkAliases: string[];
|
|
162
|
+
cpusetCpus: string;
|
|
163
|
+
workingDir: string;
|
|
164
|
+
env: unknown[];
|
|
165
|
+
changeWorkdir: boolean;
|
|
166
|
+
};
|
|
167
|
+
export type PingConfig = {
|
|
168
|
+
ip: string;
|
|
169
|
+
type: number;
|
|
170
|
+
};
|
|
171
|
+
export type ExtraServiceConfig = {
|
|
172
|
+
openFrpTunnelId: string;
|
|
173
|
+
openFrpToken: string;
|
|
174
|
+
};
|
|
175
|
+
export type CreateInstanceConfig = {
|
|
176
|
+
nickname: string;
|
|
177
|
+
startCommand: string;
|
|
178
|
+
stopCommand: string;
|
|
179
|
+
cwd: string;
|
|
180
|
+
ie: string;
|
|
181
|
+
oe: string;
|
|
182
|
+
createDatetime: number;
|
|
183
|
+
lastDatetime: number;
|
|
184
|
+
type: string;
|
|
185
|
+
tag: string[];
|
|
186
|
+
endTime: number;
|
|
187
|
+
fileCode: string;
|
|
188
|
+
processType: string;
|
|
189
|
+
updateCommand: string;
|
|
190
|
+
runAs: string;
|
|
191
|
+
actionCommandList: unknown[];
|
|
192
|
+
crlf: number;
|
|
193
|
+
category: number;
|
|
194
|
+
enableRcon: boolean;
|
|
195
|
+
rconPassword: string;
|
|
196
|
+
rconIp: string;
|
|
197
|
+
terminalOption: TerminalOption;
|
|
198
|
+
eventTask: EventTaskConfig;
|
|
199
|
+
docker: DockerConfig;
|
|
200
|
+
pingConfig: PingConfig;
|
|
201
|
+
extraServiceConfig: ExtraServiceConfig;
|
|
202
|
+
};
|
|
203
|
+
export interface McUser {
|
|
204
|
+
nickname: string;
|
|
205
|
+
uuid: string;
|
|
206
|
+
address: string;
|
|
207
|
+
health: number;
|
|
208
|
+
max_health: number;
|
|
209
|
+
experience_level: number;
|
|
210
|
+
experience_progress: number;
|
|
211
|
+
total_experience: number;
|
|
212
|
+
is_op: boolean;
|
|
213
|
+
walk_speed: number;
|
|
214
|
+
x: number;
|
|
215
|
+
y: number;
|
|
216
|
+
z: number;
|
|
217
|
+
}
|
package/lib/mcsManager/ws.js
CHANGED
|
@@ -36,7 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.MCSManagerWebSocketIO = void 0;
|
|
37
37
|
const io = __importStar(require("socket.io-client"));
|
|
38
38
|
const koishi_1 = require("koishi");
|
|
39
|
-
const
|
|
39
|
+
const lodash_1 = require("lodash");
|
|
40
40
|
const logger = new koishi_1.Logger('mcsmanager-ws');
|
|
41
41
|
class MCSManagerWebSocketIO {
|
|
42
42
|
constructor(ctx, config, api, remote, instance, auth) {
|
|
@@ -62,7 +62,7 @@ class MCSManagerWebSocketIO {
|
|
|
62
62
|
reconnectionAttempts: 2000,
|
|
63
63
|
});
|
|
64
64
|
this.bindEvents();
|
|
65
|
-
logger.
|
|
65
|
+
logger.debug(`正在连接到 MCSManager 实例服务器 [${this.remote.remarks}] - ${this.instance.config.nickname} ...`);
|
|
66
66
|
}
|
|
67
67
|
// 发送MC指令到远程实例
|
|
68
68
|
sendCommand(command) {
|
|
@@ -92,10 +92,10 @@ class MCSManagerWebSocketIO {
|
|
|
92
92
|
authenticate() {
|
|
93
93
|
this.connect.once('auth', ({ event, status }) => {
|
|
94
94
|
this.connect.once('stream/auth', pack => {
|
|
95
|
-
if ((0,
|
|
96
|
-
(0,
|
|
97
|
-
(0,
|
|
98
|
-
(0,
|
|
95
|
+
if ((0, lodash_1.isEqual)(event, 'auth') &&
|
|
96
|
+
(0, lodash_1.isEqual)(status, 200) &&
|
|
97
|
+
(0, lodash_1.isEqual)(pack.status, 200) &&
|
|
98
|
+
(0, lodash_1.isEqual)(pack.data, true)) {
|
|
99
99
|
logger.info(`已成功连接到 MCSManager 实例服务器 [${this.remote.remarks}] - ${this.instance.config.nickname} `);
|
|
100
100
|
this.isAuthenticated = true;
|
|
101
101
|
return pack;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { HTTP } from 'koishi';
|
|
2
|
+
export declare class NapCatApi {
|
|
3
|
+
private http;
|
|
4
|
+
private baseUrl;
|
|
5
|
+
private token;
|
|
6
|
+
get requestHeaders(): {
|
|
7
|
+
authorization: string;
|
|
8
|
+
};
|
|
9
|
+
constructor(http: HTTP, baseUrl: string, token: string);
|
|
10
|
+
/**
|
|
11
|
+
* 获取文件信息
|
|
12
|
+
* @param fileId 文件ID
|
|
13
|
+
* @returns 文件信息或false
|
|
14
|
+
*/
|
|
15
|
+
getFile(fileId: string): Promise<false | {
|
|
16
|
+
file: string;
|
|
17
|
+
url: string;
|
|
18
|
+
file_size: string;
|
|
19
|
+
file_name: string;
|
|
20
|
+
}>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NapCatApi = void 0;
|
|
4
|
+
class NapCatApi {
|
|
5
|
+
get requestHeaders() {
|
|
6
|
+
return {
|
|
7
|
+
authorization: this.token,
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
constructor(http, baseUrl, token) {
|
|
11
|
+
this.http = http;
|
|
12
|
+
this.baseUrl = baseUrl;
|
|
13
|
+
this.token = token;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 获取文件信息
|
|
17
|
+
* @param fileId 文件ID
|
|
18
|
+
* @returns 文件信息或false
|
|
19
|
+
*/
|
|
20
|
+
async getFile(fileId) {
|
|
21
|
+
console.log(`${this.baseUrl}/get_file`, {
|
|
22
|
+
file_id: fileId,
|
|
23
|
+
});
|
|
24
|
+
try {
|
|
25
|
+
const result = await this.http(`${this.baseUrl}/get_file`, {
|
|
26
|
+
method: 'POST',
|
|
27
|
+
headers: this.requestHeaders,
|
|
28
|
+
data: {
|
|
29
|
+
file_id: fileId,
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
console.log(result?.data);
|
|
33
|
+
if (result.status === 200 && result.data) {
|
|
34
|
+
return result.data.data;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
console.error('Error fetching file:', error);
|
|
39
|
+
}
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.NapCatApi = NapCatApi;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Schema } from 'koishi';
|
|
2
|
+
export declare class NapCatConfig {
|
|
3
|
+
static Base: Schema<Schemastery.ObjectS<{
|
|
4
|
+
napCatBaseUrl: Schema<string, string>;
|
|
5
|
+
napCatToken: Schema<string, string>;
|
|
6
|
+
}>, Schemastery.ObjectT<{
|
|
7
|
+
napCatBaseUrl: Schema<string, string>;
|
|
8
|
+
napCatToken: Schema<string, string>;
|
|
9
|
+
}>>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NapCatConfig = void 0;
|
|
4
|
+
const koishi_1 = require("koishi");
|
|
5
|
+
class NapCatConfig {
|
|
6
|
+
}
|
|
7
|
+
exports.NapCatConfig = NapCatConfig;
|
|
8
|
+
NapCatConfig.Base = koishi_1.Schema.object({
|
|
9
|
+
napCatBaseUrl: koishi_1.Schema.string()
|
|
10
|
+
.default('http://localhost:3000')
|
|
11
|
+
.description('地址'),
|
|
12
|
+
napCatToken: koishi_1.Schema.string()
|
|
13
|
+
.role('secret')
|
|
14
|
+
.default('admin')
|
|
15
|
+
.description('密码'),
|
|
16
|
+
}).description('NapCat 基础配置');
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Context, Schema } from 'koishi';
|
|
2
|
+
import { GLBotConfigType } from '../gl';
|
|
3
|
+
import { NapCatApi } from './api';
|
|
4
|
+
export declare class NapCat {
|
|
5
|
+
private readonly ctx;
|
|
6
|
+
private readonly config;
|
|
7
|
+
static Config: Schema<Schemastery.ObjectS<{
|
|
8
|
+
napCatBaseUrl: Schema<string, string>;
|
|
9
|
+
napCatToken: Schema<string, string>;
|
|
10
|
+
}>, {
|
|
11
|
+
napCatBaseUrl: string;
|
|
12
|
+
napCatToken: string;
|
|
13
|
+
} & import("cosmokit").Dict>;
|
|
14
|
+
readonly api: NapCatApi;
|
|
15
|
+
constructor(ctx: Context, config: GLBotConfigType);
|
|
16
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NapCat = void 0;
|
|
4
|
+
const koishi_1 = require("koishi");
|
|
5
|
+
const api_1 = require("./api");
|
|
6
|
+
const config_1 = require("./config");
|
|
7
|
+
class NapCat {
|
|
8
|
+
constructor(ctx, config) {
|
|
9
|
+
this.ctx = ctx;
|
|
10
|
+
this.config = config;
|
|
11
|
+
this.api = new api_1.NapCatApi(ctx.http, config.napCatBaseUrl, config.napCatToken);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.NapCat = NapCat;
|
|
15
|
+
NapCat.Config = koishi_1.Schema.intersect([config_1.NapCatConfig.Base]);
|
package/lib/queQiao/index.d.ts
CHANGED
package/lib/queQiao/index.js
CHANGED
|
@@ -5,10 +5,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.name = void 0;
|
|
7
7
|
const koishi_1 = require("koishi");
|
|
8
|
-
const
|
|
8
|
+
const lodash_1 = require("lodash");
|
|
9
9
|
const rcon_client_1 = require("rcon-client");
|
|
10
10
|
const ws_1 = require("ws");
|
|
11
11
|
const constants_1 = require("../constants");
|
|
12
|
+
const online_1 = require("../mcsManager/commands/mc/online");
|
|
12
13
|
const utils_1 = require("../utils");
|
|
13
14
|
const mcwss_1 = __importDefault(require("./mcwss"));
|
|
14
15
|
const values_1 = require("./values");
|
|
@@ -120,8 +121,11 @@ class MinecraftSyncMsg {
|
|
|
120
121
|
logger.error('Failed to parse WebSocket message:', err);
|
|
121
122
|
return;
|
|
122
123
|
}
|
|
124
|
+
// 在线时间逻辑
|
|
125
|
+
this.updatePlayerOnlineTime(data);
|
|
123
126
|
const eventName = data.event_name ? (0, values_1.getListeningEvent)(data.event_name) : '';
|
|
124
|
-
if (eventName
|
|
127
|
+
if (!eventName ||
|
|
128
|
+
['PlayerCommandPreprocessEvent', 'PlayerDeathEvent'].includes(eventName)) {
|
|
125
129
|
return;
|
|
126
130
|
}
|
|
127
131
|
// console.log(data);
|
|
@@ -149,6 +153,69 @@ class MinecraftSyncMsg {
|
|
|
149
153
|
this.broadcastToChannels(sendMsg);
|
|
150
154
|
}
|
|
151
155
|
}
|
|
156
|
+
async updatePlayerOnlineTime(data) {
|
|
157
|
+
if (data.player) {
|
|
158
|
+
online_1.MCBotGameOnline.list[data.player?.uuid] = data.player;
|
|
159
|
+
}
|
|
160
|
+
console.log(data);
|
|
161
|
+
if (!['PlayerJoinEvent', 'PlayerQuitEvent'].includes(data.event_name)) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
const user = await this.ctx.database.get('mcUser', {
|
|
165
|
+
uuid: data.player?.uuid,
|
|
166
|
+
});
|
|
167
|
+
online_1.MCBotGameOnline.list[data.player?.uuid] = data.player;
|
|
168
|
+
if (user.length === 0) {
|
|
169
|
+
await this.ctx.database.create('mcUser', {
|
|
170
|
+
nickname: data.player?.nickname,
|
|
171
|
+
uuid: data.player?.uuid,
|
|
172
|
+
lastTime: new Date(),
|
|
173
|
+
level: data.player?.level || 0,
|
|
174
|
+
onlineTimeJSON: JSON.stringify({
|
|
175
|
+
mc: {
|
|
176
|
+
[data.player?.uuid]: 0,
|
|
177
|
+
},
|
|
178
|
+
}),
|
|
179
|
+
});
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
if (data.event_name === 'PlayerJoinEvent') {
|
|
183
|
+
await this.ctx.database.set('mcUser', { uuid: data.player?.uuid }, {
|
|
184
|
+
nickname: data.player?.nickname,
|
|
185
|
+
level: data.player?.experience_level || 0,
|
|
186
|
+
lastTime: new Date(),
|
|
187
|
+
});
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
// 更新在线时间 (加入游戏时会更新lastTime,退出游戏时通过lastTime算出本次在线时间,加到onlineTimeJSON中)
|
|
191
|
+
if (data.event_name === 'PlayerQuitEvent') {
|
|
192
|
+
const lastTime = new Date(user[0].lastTime).getTime();
|
|
193
|
+
const nowTime = Date.now();
|
|
194
|
+
const onlineDuration = Math.floor((nowTime - lastTime) / 1000); // 在线时长,单位秒
|
|
195
|
+
delete online_1.MCBotGameOnline.list[user[0].uuid];
|
|
196
|
+
let onlineTimeJSON = {};
|
|
197
|
+
try {
|
|
198
|
+
onlineTimeJSON = JSON.parse(user[0].onlineTimeJSON);
|
|
199
|
+
}
|
|
200
|
+
catch (err) {
|
|
201
|
+
onlineTimeJSON = {};
|
|
202
|
+
}
|
|
203
|
+
if (!onlineTimeJSON.mc) {
|
|
204
|
+
onlineTimeJSON.mc = {};
|
|
205
|
+
}
|
|
206
|
+
if (!onlineTimeJSON.mc[data.player?.uuid]) {
|
|
207
|
+
onlineTimeJSON.mc[data.player?.uuid] = 0;
|
|
208
|
+
}
|
|
209
|
+
onlineTimeJSON.mc[data.player?.uuid] += onlineDuration;
|
|
210
|
+
await this.ctx.database.set('mcUser', { uuid: data.player?.uuid }, {
|
|
211
|
+
nickname: data.player?.nickname,
|
|
212
|
+
lastTime: new Date(),
|
|
213
|
+
level: data.player?.experience_level || 0,
|
|
214
|
+
onlineTimeJSON: JSON.stringify(onlineTimeJSON),
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
console.log({ user });
|
|
218
|
+
}
|
|
152
219
|
handleWsClose() {
|
|
153
220
|
if (this.isDisposing) {
|
|
154
221
|
return;
|
|
@@ -364,7 +431,7 @@ class MinecraftSyncMsg {
|
|
|
364
431
|
.map(str => str.replace(`${bot.platform}:`, ''));
|
|
365
432
|
console.log(this.config.sendToChannel);
|
|
366
433
|
if (process.env.NODE_ENV === 'development') {
|
|
367
|
-
logger.info((0,
|
|
434
|
+
logger.info((0, lodash_1.isString)(message)
|
|
368
435
|
? message
|
|
369
436
|
: message.map(el => el.attrs.content).join(''));
|
|
370
437
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
minecraft-sync-msg:
|
|
2
|
-
action:
|
|
3
|
-
PlayerJoinEvent:
|
|
4
|
-
PlayerCommandPreprocessEvent:
|
|
5
|
-
PlayerDeathEvent:
|
|
6
|
-
AsyncPlayerChatEvent:
|
|
7
|
-
PlayerQuitEvent:
|
|
8
|
-
message:
|
|
9
|
-
MCReceivePrefix:
|
|
1
|
+
minecraft-sync-msg:
|
|
2
|
+
action:
|
|
3
|
+
PlayerJoinEvent: '[join] Player {0} joined the game'
|
|
4
|
+
PlayerCommandPreprocessEvent: '[command] Player {0} executed command'
|
|
5
|
+
PlayerDeathEvent: '[death] Player {0} meet the god'
|
|
6
|
+
AsyncPlayerChatEvent: '[chat] Player {0} said: {1}'
|
|
7
|
+
PlayerQuitEvent: '[quit] Player {0} left the game'
|
|
8
|
+
message:
|
|
9
|
+
MCReceivePrefix: '({0})[{1}]'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"minecraft-sync-msg":{"action":{"PlayerJoinEvent":"
|
|
1
|
+
{"minecraft-sync-msg":{"action":{"PlayerJoinEvent":"{0} 加入了服务器!","PlayerCommandPreprocessEvent":"[指令]{0} 执行了指令","PlayerDeathEvent":"{0} 与山长眠!","AsyncPlayerChatEvent":"[MC] {0}: {1}","PlayerQuitEvent":"{0} 离开了服务器!"},"message":{"MCReceivePrefix":"({0})[{1}]"}}}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
minecraft-sync-msg:
|
|
2
|
-
action:
|
|
3
|
-
PlayerJoinEvent: "
|
|
4
|
-
PlayerCommandPreprocessEvent: "[指令]{0} 执行了指令"
|
|
5
|
-
PlayerDeathEvent: "
|
|
6
|
-
AsyncPlayerChatEvent: "[
|
|
7
|
-
PlayerQuitEvent: "
|
|
8
|
-
message:
|
|
9
|
-
MCReceivePrefix: "({0})[{1}]"
|
|
1
|
+
minecraft-sync-msg:
|
|
2
|
+
action:
|
|
3
|
+
PlayerJoinEvent: "{0} 加入了服务器!"
|
|
4
|
+
PlayerCommandPreprocessEvent: "[指令]{0} 执行了指令"
|
|
5
|
+
PlayerDeathEvent: "{0} 与山长眠!"
|
|
6
|
+
AsyncPlayerChatEvent: "[MC] {0}: {1}"
|
|
7
|
+
PlayerQuitEvent: "{0} 离开了服务器!"
|
|
8
|
+
message:
|
|
9
|
+
MCReceivePrefix: "({0})[{1}]"
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Context } from 'koishi';
|
|
2
|
+
/**
|
|
3
|
+
* 文件下载工具
|
|
4
|
+
*/
|
|
5
|
+
export declare class FileDownloader {
|
|
6
|
+
private ctx;
|
|
7
|
+
constructor(ctx: Context);
|
|
8
|
+
/**
|
|
9
|
+
* 从消息内容中提取文件元素
|
|
10
|
+
* @param content 消息内容
|
|
11
|
+
* @returns 文件元素数组
|
|
12
|
+
*/
|
|
13
|
+
extractFileElements(content: string): {
|
|
14
|
+
src: string;
|
|
15
|
+
fileId: string;
|
|
16
|
+
fileSize?: number;
|
|
17
|
+
fileName?: string;
|
|
18
|
+
}[];
|
|
19
|
+
/**
|
|
20
|
+
* 下载文件到本地
|
|
21
|
+
* @param fileId 文件ID
|
|
22
|
+
* @param fileName 文件名
|
|
23
|
+
* @param downloadDir 下载目录
|
|
24
|
+
* @param bot 机器人实例(可选,如果平台支持直接获取文件URL)
|
|
25
|
+
* @returns 下载的文件路径
|
|
26
|
+
*/
|
|
27
|
+
downloadFile(fileId: string, fileName: string, downloadDir?: string, bot?: any): Promise<string | null>;
|
|
28
|
+
/**
|
|
29
|
+
* 从URL下载文件
|
|
30
|
+
* @param url 文件URL
|
|
31
|
+
* @param filePath 保存路径
|
|
32
|
+
* @returns 文件路径或null
|
|
33
|
+
*/
|
|
34
|
+
private downloadFromUrl;
|
|
35
|
+
/**
|
|
36
|
+
* 根据文件ID构造可能的文件URL
|
|
37
|
+
* @param fileId 文件ID
|
|
38
|
+
* @returns 可能的URL数组
|
|
39
|
+
*/
|
|
40
|
+
private constructPossibleFileUrls;
|
|
41
|
+
/**
|
|
42
|
+
* 格式化文件大小
|
|
43
|
+
* @param bytes 字节数
|
|
44
|
+
* @returns 格式化的文件大小
|
|
45
|
+
*/
|
|
46
|
+
formatFileSize(bytes: number): string;
|
|
47
|
+
}
|