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
|
File without changes
|
|
File without changes
|
package/lib/gl/index.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { Context, Schema } from 'koishi';
|
|
2
|
+
import { NapCat } from '../napCat';
|
|
2
3
|
export declare class GLBot {
|
|
3
4
|
private ctx;
|
|
4
5
|
private config;
|
|
6
|
+
static inject: string[];
|
|
5
7
|
static Config: Schema<Schemastery.ObjectS<{
|
|
6
8
|
wsServer: Schema<"客户端" | "服务端", "客户端" | "服务端">;
|
|
7
9
|
wsHost: Schema<string, string>;
|
|
@@ -35,6 +37,9 @@ export declare class GLBot {
|
|
|
35
37
|
mcManagerHost: Schema<string, string>;
|
|
36
38
|
mcManagerWs: Schema<string, string>;
|
|
37
39
|
mcManagerMaxConnectWs: Schema<number, number>;
|
|
40
|
+
}> | Schemastery.ObjectS<{
|
|
41
|
+
napCatBaseUrl: Schema<string, string>;
|
|
42
|
+
napCatToken: Schema<string, string>;
|
|
38
43
|
}>, {
|
|
39
44
|
wsServer: "客户端" | "服务端";
|
|
40
45
|
wsHost: string;
|
|
@@ -68,9 +73,13 @@ export declare class GLBot {
|
|
|
68
73
|
mcManagerHost: string;
|
|
69
74
|
mcManagerWs: string;
|
|
70
75
|
mcManagerMaxConnectWs: number;
|
|
76
|
+
} & {
|
|
77
|
+
napCatBaseUrl: string;
|
|
78
|
+
napCatToken: string;
|
|
71
79
|
}>;
|
|
72
80
|
private mcSyncMsg;
|
|
73
81
|
private mcsManager;
|
|
82
|
+
napCat: NapCat;
|
|
74
83
|
constructor(ctx: Context, config: GLBotConfigType);
|
|
75
84
|
private initialize;
|
|
76
85
|
private globalCommand;
|
package/lib/gl/index.js
CHANGED
|
@@ -7,6 +7,7 @@ exports.GLBotBase = exports.GLBot = void 0;
|
|
|
7
7
|
const koishi_1 = require("koishi");
|
|
8
8
|
const constants_1 = require("../constants");
|
|
9
9
|
const mcsManager_1 = require("../mcsManager");
|
|
10
|
+
const napCat_1 = require("../napCat");
|
|
10
11
|
const queQiao_1 = __importDefault(require("../queQiao"));
|
|
11
12
|
const logger = new koishi_1.Logger('gl-bot');
|
|
12
13
|
class GLBot {
|
|
@@ -14,7 +15,8 @@ class GLBot {
|
|
|
14
15
|
this.ctx = ctx;
|
|
15
16
|
this.config = config;
|
|
16
17
|
this.mcSyncMsg = new queQiao_1.default(ctx, config);
|
|
17
|
-
this.mcsManager = new mcsManager_1.MCManager(ctx, config);
|
|
18
|
+
this.mcsManager = new mcsManager_1.MCManager(this, ctx, config);
|
|
19
|
+
this.napCat = new napCat_1.NapCat(ctx, config);
|
|
18
20
|
this.initialize();
|
|
19
21
|
}
|
|
20
22
|
initialize() {
|
|
@@ -41,7 +43,12 @@ class GLBot {
|
|
|
41
43
|
}
|
|
42
44
|
}
|
|
43
45
|
exports.GLBot = GLBot;
|
|
44
|
-
GLBot.
|
|
46
|
+
GLBot.inject = ['database'];
|
|
47
|
+
GLBot.Config = koishi_1.Schema.intersect([
|
|
48
|
+
queQiao_1.default.Config,
|
|
49
|
+
mcsManager_1.MCManager.Config,
|
|
50
|
+
napCat_1.NapCat.Config,
|
|
51
|
+
]);
|
|
45
52
|
class GLBotBase {
|
|
46
53
|
constructor(ctx, config) {
|
|
47
54
|
this.ctx = ctx;
|
|
File without changes
|
|
File without changes
|
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
package/lib/mcsManager/api.d.ts
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { HTTP } from 'koishi';
|
|
2
|
-
import { ServiceInstanceConnectAuth, ServiceRemoteInstanceItem, ServiceRemoteItem, UserInfo } from './type';
|
|
2
|
+
import { CreateInstanceConfig, CreateInstanceData, ServiceInstanceConnectAuth, ServiceRemoteInstanceItem, ServiceRemoteItem, UserInfo } from './type';
|
|
3
3
|
export declare class MCSManagerAPI {
|
|
4
4
|
private http;
|
|
5
5
|
private baseUrl;
|
|
6
|
+
private wsUrl;
|
|
6
7
|
private authCookie?;
|
|
7
8
|
userInfo: UserInfo;
|
|
8
9
|
get requestHeaders(): {
|
|
9
10
|
cookie: string;
|
|
10
11
|
'x-requested-with': string;
|
|
11
12
|
};
|
|
12
|
-
constructor(http: HTTP, baseUrl: string, authCookie?: string);
|
|
13
|
+
constructor(http: HTTP, baseUrl: string, wsUrl: string, authCookie?: string);
|
|
13
14
|
login(username: string, password: string): Promise<boolean>;
|
|
14
15
|
getUserInfo(): Promise<UserInfo>;
|
|
15
16
|
getServiceRemoteList(): Promise<ServiceRemoteItem[]>;
|
|
@@ -21,5 +22,19 @@ export declare class MCSManagerAPI {
|
|
|
21
22
|
page_size?: number;
|
|
22
23
|
}): Promise<ServiceRemoteInstanceItem[]>;
|
|
23
24
|
getServiceInstanceConnectAuth(remoteUUID: string, instanceId: string): Promise<ServiceInstanceConnectAuth | null>;
|
|
24
|
-
restartRemoteInstance(daemonId: string, instanceId: string): Promise<
|
|
25
|
+
restartRemoteInstance(daemonId: string, instanceId: string): Promise<boolean>;
|
|
26
|
+
stopRemoteInstance(daemonId: string, instanceId: string): Promise<boolean>;
|
|
27
|
+
startRemoteInstance(daemonId: string, instanceId: string): Promise<boolean>;
|
|
28
|
+
createInstance(daemonId: string, data: CreateInstanceData): Promise<boolean>;
|
|
29
|
+
instanceUploadByZip(daemonId: string, config: Partial<CreateInstanceConfig>, file: {
|
|
30
|
+
filename: string;
|
|
31
|
+
size: number;
|
|
32
|
+
path: string;
|
|
33
|
+
}, onProcessHandle?: (value: string) => void): Promise<{
|
|
34
|
+
addr: string;
|
|
35
|
+
instanceUuid: string;
|
|
36
|
+
password: string;
|
|
37
|
+
remoteMappings: string[];
|
|
38
|
+
}>;
|
|
39
|
+
uploadFileToRemoteInstance(daemonId: string, filePath: string): Promise<boolean>;
|
|
25
40
|
}
|
package/lib/mcsManager/api.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MCSManagerAPI = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const constants_1 = require("../constants");
|
|
6
|
+
const createInstanceUpload = require('./json/createInstanceUpload.json');
|
|
4
7
|
class MCSManagerAPI {
|
|
5
8
|
get requestHeaders() {
|
|
6
9
|
return {
|
|
@@ -8,9 +11,10 @@ class MCSManagerAPI {
|
|
|
8
11
|
'x-requested-with': 'XMLHttpRequest',
|
|
9
12
|
};
|
|
10
13
|
}
|
|
11
|
-
constructor(http, baseUrl, authCookie) {
|
|
14
|
+
constructor(http, baseUrl, wsUrl, authCookie) {
|
|
12
15
|
this.http = http;
|
|
13
16
|
this.baseUrl = baseUrl;
|
|
17
|
+
this.wsUrl = wsUrl;
|
|
14
18
|
this.authCookie = authCookie;
|
|
15
19
|
}
|
|
16
20
|
async login(username, password) {
|
|
@@ -72,19 +76,165 @@ class MCSManagerAPI {
|
|
|
72
76
|
})).data.data ?? null);
|
|
73
77
|
}
|
|
74
78
|
async restartRemoteInstance(daemonId, instanceId) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
79
|
+
return ((await this.http(`${this.baseUrl}/protected_instance/restart`, {
|
|
80
|
+
headers: this.requestHeaders,
|
|
81
|
+
params: {
|
|
82
|
+
daemonId,
|
|
83
|
+
uuid: instanceId,
|
|
84
|
+
token: this.userInfo.token,
|
|
85
|
+
},
|
|
86
|
+
})).data.data?.instanceUuid === instanceId);
|
|
87
|
+
}
|
|
88
|
+
async stopRemoteInstance(daemonId, instanceId) {
|
|
89
|
+
return ((await this.http(`${this.baseUrl}/protected_instance/stop`, {
|
|
81
90
|
headers: this.requestHeaders,
|
|
82
91
|
params: {
|
|
83
92
|
daemonId,
|
|
84
93
|
uuid: instanceId,
|
|
85
94
|
token: this.userInfo.token,
|
|
86
95
|
},
|
|
96
|
+
})).data.data?.instanceUuid === instanceId);
|
|
97
|
+
}
|
|
98
|
+
async startRemoteInstance(daemonId, instanceId) {
|
|
99
|
+
return ((await this.http(`${this.baseUrl}/protected_instance/open`, {
|
|
100
|
+
headers: this.requestHeaders,
|
|
101
|
+
params: {
|
|
102
|
+
daemonId,
|
|
103
|
+
uuid: instanceId,
|
|
104
|
+
token: this.userInfo.token,
|
|
105
|
+
},
|
|
106
|
+
})).data.data?.instanceUuid === instanceId);
|
|
107
|
+
}
|
|
108
|
+
// 创建实例
|
|
109
|
+
async createInstance(daemonId, data) {
|
|
110
|
+
const mergeConfig = Object.assign({}, data, {
|
|
111
|
+
nickname: '',
|
|
112
|
+
startCommand: '',
|
|
113
|
+
stopCommand: 'stop',
|
|
114
|
+
cwd: '.',
|
|
115
|
+
ie: 'utf-8',
|
|
116
|
+
oe: 'utf-8',
|
|
117
|
+
processType: 'general',
|
|
118
|
+
lastDatetime: '',
|
|
119
|
+
type: 'minecraft/java',
|
|
120
|
+
tag: [],
|
|
121
|
+
maxSpace: null,
|
|
122
|
+
endTime: '',
|
|
123
|
+
docker: {
|
|
124
|
+
containerName: '',
|
|
125
|
+
image: '',
|
|
126
|
+
ports: [],
|
|
127
|
+
extraVolumes: [],
|
|
128
|
+
networkMode: 'bridge',
|
|
129
|
+
networkAliases: [],
|
|
130
|
+
cpusetCpus: '',
|
|
131
|
+
workingDir: '/data',
|
|
132
|
+
changeWorkdir: false,
|
|
133
|
+
env: [],
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
const result = await this.http(`${this.baseUrl}/instance`, {
|
|
137
|
+
method: 'POST',
|
|
138
|
+
headers: this.requestHeaders,
|
|
139
|
+
params: {
|
|
140
|
+
daemonId,
|
|
141
|
+
token: this.userInfo.token,
|
|
142
|
+
},
|
|
143
|
+
data: mergeConfig,
|
|
144
|
+
});
|
|
145
|
+
if (result.status === 200) {
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
async instanceUploadByZip(daemonId, config, file, onProcessHandle) {
|
|
151
|
+
const mergeConfig = Object.assign({}, createInstanceUpload, config);
|
|
152
|
+
const uploadDir = '.';
|
|
153
|
+
const { status, data } = await this.http(`${this.baseUrl}/instance/upload`, {
|
|
154
|
+
method: 'POST',
|
|
155
|
+
headers: this.requestHeaders,
|
|
156
|
+
params: {
|
|
157
|
+
upload_dir: uploadDir,
|
|
158
|
+
daemonId,
|
|
159
|
+
token: this.userInfo.token,
|
|
160
|
+
},
|
|
161
|
+
data: mergeConfig,
|
|
162
|
+
});
|
|
163
|
+
if (status !== 200 && !data.data.instanceUuid) {
|
|
164
|
+
throw new Error('创建实例上传任务失败');
|
|
165
|
+
}
|
|
166
|
+
const newFile = await this.http(`${this.wsUrl}/upload-new/${data.data.password}`, {
|
|
167
|
+
headers: this.requestHeaders,
|
|
168
|
+
method: 'POST',
|
|
169
|
+
params: {
|
|
170
|
+
filename: file.filename,
|
|
171
|
+
size: file.size,
|
|
172
|
+
sum: '',
|
|
173
|
+
overwrite: false,
|
|
174
|
+
unzip: true,
|
|
175
|
+
code: 'gbk',
|
|
176
|
+
token: this.userInfo.token,
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
if (newFile.status !== 200 || !newFile.data.data.id) {
|
|
180
|
+
throw new Error('上传文件失败');
|
|
181
|
+
}
|
|
182
|
+
// 分片上传文件
|
|
183
|
+
const fileBuffer = (0, fs_1.readFileSync)(file.path);
|
|
184
|
+
const chunkSize = 2 * 1024 * 1024; // 2MB 每个分片
|
|
185
|
+
const totalSize = fileBuffer.length;
|
|
186
|
+
let offset = 0;
|
|
187
|
+
// console.log(
|
|
188
|
+
// `开始分片上传,文件大小: ${totalSize} bytes,分片大小: ${chunkSize} bytes`,
|
|
189
|
+
// );
|
|
190
|
+
onProcessHandle?.(`正在解压文件...`);
|
|
191
|
+
while (offset < totalSize) {
|
|
192
|
+
const end = Math.min(offset + chunkSize, totalSize);
|
|
193
|
+
const chunk = fileBuffer.slice(offset, end);
|
|
194
|
+
const chunkBlob = new Blob([chunk], {
|
|
195
|
+
type: 'application/octet-stream',
|
|
196
|
+
});
|
|
197
|
+
const formData = new FormData();
|
|
198
|
+
formData.append('file', chunkBlob, file.filename);
|
|
199
|
+
// const progress = ((end / totalSize) * 100).toFixed(0);
|
|
200
|
+
if (constants_1.IS_DEV) {
|
|
201
|
+
console.log(`上传分片: offset=${offset}, size=${chunk.length}, progress=${((end / totalSize) * 100).toFixed(1)}%`);
|
|
202
|
+
}
|
|
203
|
+
const response = await this.http(`${this.wsUrl}/upload-piece/${newFile.data.data.id}`, {
|
|
204
|
+
method: 'POST',
|
|
205
|
+
params: {
|
|
206
|
+
offset,
|
|
207
|
+
token: this.userInfo.token,
|
|
208
|
+
},
|
|
209
|
+
data: formData,
|
|
210
|
+
});
|
|
211
|
+
if (response.status !== 200) {
|
|
212
|
+
throw new Error(`分片上传失败,offset: ${offset}`);
|
|
213
|
+
}
|
|
214
|
+
offset = end;
|
|
215
|
+
}
|
|
216
|
+
return data.data;
|
|
217
|
+
}
|
|
218
|
+
// 上传文件至实例
|
|
219
|
+
async uploadFileToRemoteInstance(daemonId, filePath) {
|
|
220
|
+
const fileBuffer = (0, fs_1.readFileSync)(filePath);
|
|
221
|
+
const fileBlob = new Blob([fileBuffer], {
|
|
222
|
+
type: 'application/octet-stream',
|
|
223
|
+
});
|
|
224
|
+
const formData = new FormData();
|
|
225
|
+
formData.append('file', fileBlob);
|
|
226
|
+
const result = await this.http(`${this.baseUrl}/protected_instance/upload_file`, {
|
|
227
|
+
method: 'POST',
|
|
228
|
+
headers: {
|
|
229
|
+
...this.requestHeaders,
|
|
230
|
+
},
|
|
231
|
+
params: {
|
|
232
|
+
daemonId,
|
|
233
|
+
token: this.userInfo.token,
|
|
234
|
+
},
|
|
235
|
+
data: formData,
|
|
87
236
|
});
|
|
237
|
+
return result.status === 200;
|
|
88
238
|
}
|
|
89
239
|
}
|
|
90
240
|
exports.MCSManagerAPI = MCSManagerAPI;
|
package/lib/mcsManager/bot.d.ts
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { Context } from 'koishi';
|
|
2
|
+
import { MCManager } from '.';
|
|
2
3
|
import { GLBotConfigType } from '../gl';
|
|
3
|
-
import {
|
|
4
|
+
import { MCBotListCommand } from './commands';
|
|
4
5
|
import { MCSManagerPanel } from './panel';
|
|
5
6
|
export declare class MCSManagerBot {
|
|
7
|
+
readonly manager: MCManager;
|
|
6
8
|
readonly ctx: Context;
|
|
7
9
|
readonly config: GLBotConfigType;
|
|
8
10
|
readonly panel: MCSManagerPanel;
|
|
9
|
-
constructor(ctx: Context, config: GLBotConfigType, panel: MCSManagerPanel);
|
|
11
|
+
constructor(manager: MCManager, ctx: Context, config: GLBotConfigType, panel: MCSManagerPanel);
|
|
10
12
|
help(): string[];
|
|
11
|
-
commands(): (typeof
|
|
13
|
+
commands(): (typeof MCBotListCommand)[];
|
|
12
14
|
initialize(): Promise<void>;
|
|
13
15
|
private registerCommands;
|
|
14
16
|
}
|
package/lib/mcsManager/bot.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MCSManagerBot = void 0;
|
|
4
|
-
const
|
|
4
|
+
const commands_1 = require("./commands");
|
|
5
|
+
const create_1 = require("./commands/mc/create");
|
|
5
6
|
class MCSManagerBot {
|
|
6
|
-
constructor(ctx, config, panel) {
|
|
7
|
+
constructor(manager, ctx, config, panel) {
|
|
8
|
+
this.manager = manager;
|
|
7
9
|
this.ctx = ctx;
|
|
8
10
|
this.config = config;
|
|
9
11
|
this.panel = panel;
|
|
@@ -20,7 +22,19 @@ class MCSManagerBot {
|
|
|
20
22
|
];
|
|
21
23
|
}
|
|
22
24
|
commands() {
|
|
23
|
-
return [
|
|
25
|
+
return [
|
|
26
|
+
commands_1.MCBotRestartCommand,
|
|
27
|
+
commands_1.MCBotListCommand,
|
|
28
|
+
commands_1.MCBotStartCommand,
|
|
29
|
+
commands_1.MCBotStopCommand,
|
|
30
|
+
create_1.MCBotCreateCommand,
|
|
31
|
+
commands_1.MCBotOnlineTimeCommand,
|
|
32
|
+
commands_1.MCBotGameOnline,
|
|
33
|
+
commands_1.ARKBotListCommand,
|
|
34
|
+
commands_1.ARKBotRestartCommand,
|
|
35
|
+
commands_1.ARKBotStartCommand,
|
|
36
|
+
commands_1.ARKBotStopCommand,
|
|
37
|
+
];
|
|
24
38
|
}
|
|
25
39
|
async initialize() {
|
|
26
40
|
this.ctx.on('ready', async () => {
|
|
@@ -29,14 +43,8 @@ class MCSManagerBot {
|
|
|
29
43
|
}
|
|
30
44
|
registerCommands() {
|
|
31
45
|
for (const Command of this.commands()) {
|
|
32
|
-
new Command(this);
|
|
46
|
+
const _ = new Command(this);
|
|
33
47
|
}
|
|
34
|
-
// this.ctx
|
|
35
|
-
// .command('/服务器 <action> [...name]')
|
|
36
|
-
// .option('debug', '-d')
|
|
37
|
-
// .action(({ options }, action, ...name) => {
|
|
38
|
-
// return `收到指令:${action} ${name.join(' ')},调试模式:${options.debug}`;
|
|
39
|
-
// });
|
|
40
48
|
}
|
|
41
49
|
}
|
|
42
50
|
exports.MCSManagerBot = MCSManagerBot;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Argv } from 'koishi';
|
|
2
|
+
import { MCSManagerBot } from '../../bot';
|
|
3
|
+
import { BotCommandBase, BotCommandRole } from '../base';
|
|
4
|
+
/**
|
|
5
|
+
* 服务器创建指令
|
|
6
|
+
*
|
|
7
|
+
* @example 服务器 创建
|
|
8
|
+
*/
|
|
9
|
+
export declare class ARKBotCreateCommand extends BotCommandBase {
|
|
10
|
+
readonly bot: MCSManagerBot;
|
|
11
|
+
command: string[];
|
|
12
|
+
roles: BotCommandRole[];
|
|
13
|
+
constructor(bot: MCSManagerBot);
|
|
14
|
+
handle({ args, session, ...opt }: Argv, status?: string[]): Promise<string>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ARKBotCreateCommand = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const koishi_1 = require("koishi");
|
|
6
|
+
const base_1 = require("../base");
|
|
7
|
+
/**
|
|
8
|
+
* 服务器创建指令
|
|
9
|
+
*
|
|
10
|
+
* @example 服务器 创建
|
|
11
|
+
*/
|
|
12
|
+
class ARKBotCreateCommand extends base_1.BotCommandBase {
|
|
13
|
+
constructor(bot) {
|
|
14
|
+
super(bot);
|
|
15
|
+
this.bot = bot;
|
|
16
|
+
this.command = ['方舟.创建 <name...>', 'ARK.创建 <name...>'];
|
|
17
|
+
this.roles = [base_1.BotCommandRole.All];
|
|
18
|
+
this.initialize();
|
|
19
|
+
}
|
|
20
|
+
async handle({ args, session, ...opt }, status) {
|
|
21
|
+
const { elements } = session?.event?.message?.quote ?? {};
|
|
22
|
+
if (elements.length > 0) {
|
|
23
|
+
const fileElements = koishi_1.h.select(elements, 'file');
|
|
24
|
+
if (fileElements.length > 0) {
|
|
25
|
+
const results = [`检测到 ${fileElements.length} 个文件:`];
|
|
26
|
+
for (const [index, element] of fileElements.entries()) {
|
|
27
|
+
const fileInfo = {
|
|
28
|
+
src: element.attrs?.src,
|
|
29
|
+
fileName: element.attrs?.file || element.attrs?.src,
|
|
30
|
+
fileId: element.attrs?.['fileId'],
|
|
31
|
+
fileSize: element.attrs?.['fileSize'],
|
|
32
|
+
};
|
|
33
|
+
results.push(`\n文件 ${index + 1}:`);
|
|
34
|
+
results.push(` 名称: ${fileInfo.fileName}`);
|
|
35
|
+
results.push(` 文件ID: ${fileInfo.fileId}`);
|
|
36
|
+
if (fileInfo.fileSize) {
|
|
37
|
+
const sizeInMB = (parseInt(fileInfo.fileSize, 10) /
|
|
38
|
+
1024 /
|
|
39
|
+
1024).toFixed(2);
|
|
40
|
+
results.push(` 大小: ${sizeInMB} MB`);
|
|
41
|
+
}
|
|
42
|
+
results.push(`-> 开始尝试下载群文件...`);
|
|
43
|
+
session.send(results.join('\n'));
|
|
44
|
+
results.length = 0;
|
|
45
|
+
// 尝试下载文件
|
|
46
|
+
try {
|
|
47
|
+
const result = await this.bot.manager.gl.napCat.api.getFile(fileInfo.fileId);
|
|
48
|
+
const fileExists = result ? (0, fs_1.existsSync)(result?.file) : false;
|
|
49
|
+
if (result && fileExists) {
|
|
50
|
+
session.send('下载完毕,正在解压并创建服务器实例...');
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
results.push(`状态: 处理失败`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
results.push(` 状态: 处理失败 ${error}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return results.join('\n');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return `需要引用包含服务端压缩包的文件喵~`;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.ARKBotCreateCommand = ARKBotCreateCommand;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { MCSManagerBot } from '../../bot';
|
|
2
|
+
import { BotCommandBase, BotCommandRole } from '../base';
|
|
3
|
+
/**
|
|
4
|
+
* 服务器列表指令
|
|
5
|
+
*
|
|
6
|
+
* @example 服务器 列表
|
|
7
|
+
*/
|
|
8
|
+
export declare class ARKBotListCommand extends BotCommandBase {
|
|
9
|
+
readonly bot: MCSManagerBot;
|
|
10
|
+
command: string[];
|
|
11
|
+
roles: BotCommandRole[];
|
|
12
|
+
constructor(bot: MCSManagerBot);
|
|
13
|
+
handle(_: any, status?: string[]): Promise<string>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ARKBotListCommand = void 0;
|
|
4
|
+
const utils_1 = require("../../../utils");
|
|
5
|
+
const constants_1 = require("../../constants");
|
|
6
|
+
const base_1 = require("../base");
|
|
7
|
+
/**
|
|
8
|
+
* 服务器列表指令
|
|
9
|
+
*
|
|
10
|
+
* @example 服务器 列表
|
|
11
|
+
*/
|
|
12
|
+
class ARKBotListCommand extends base_1.BotCommandBase {
|
|
13
|
+
constructor(bot) {
|
|
14
|
+
super(bot);
|
|
15
|
+
this.bot = bot;
|
|
16
|
+
this.command = ['方舟.列表 <status>', 'ARK.列表 <status>'];
|
|
17
|
+
this.roles = [base_1.BotCommandRole.All];
|
|
18
|
+
this.initialize();
|
|
19
|
+
}
|
|
20
|
+
async handle(_, status) {
|
|
21
|
+
await this.bot.panel.handleRemoteServices();
|
|
22
|
+
const filteredStatus = status?.at(0);
|
|
23
|
+
const nameInstances = (await this.bot.panel.searchInstanceByName('')).filter(item => !filteredStatus ||
|
|
24
|
+
constants_1.RemoteInstanceStatusName[item.instance.cfg.status] === filteredStatus);
|
|
25
|
+
return `${'='.repeat(10)}服务器列表${'='.repeat(10)}\n${nameInstances
|
|
26
|
+
.map(item => {
|
|
27
|
+
const { cfg } = item.instance;
|
|
28
|
+
const duration = (0, utils_1.formatDuration)(cfg.config.lastDatetime -
|
|
29
|
+
new Date(cfg.config.createDatetime).getTime());
|
|
30
|
+
return `- [${constants_1.RemoteInstanceStatusName[cfg.status]}] ${cfg.config.nickname} 「${duration}」`;
|
|
31
|
+
})
|
|
32
|
+
.join('\n')}\n ${'='.repeat(28)} `;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.ARKBotListCommand = ARKBotListCommand;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Argv } from 'koishi';
|
|
2
|
+
import { MCSManagerBot } from '../../bot';
|
|
3
|
+
import { BotCommandBase, BotCommandRole } from '../base';
|
|
4
|
+
/**
|
|
5
|
+
* 服务器重启指令
|
|
6
|
+
*
|
|
7
|
+
* @example 服务器 重启 神话
|
|
8
|
+
*/
|
|
9
|
+
export declare class ARKBotRestartCommand extends BotCommandBase {
|
|
10
|
+
readonly bot: MCSManagerBot;
|
|
11
|
+
command: string[];
|
|
12
|
+
roles: BotCommandRole[];
|
|
13
|
+
constructor(bot: MCSManagerBot);
|
|
14
|
+
handle({ session }: Argv, args: string[]): Promise<string>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ARKBotRestartCommand = void 0;
|
|
4
|
+
const lodash_1 = require("lodash");
|
|
5
|
+
const constants_1 = require("../../constants");
|
|
6
|
+
const base_1 = require("../base");
|
|
7
|
+
const tempSelections = new Map();
|
|
8
|
+
/**
|
|
9
|
+
* 服务器重启指令
|
|
10
|
+
*
|
|
11
|
+
* @example 服务器 重启 神话
|
|
12
|
+
*/
|
|
13
|
+
class ARKBotRestartCommand extends base_1.BotCommandBase {
|
|
14
|
+
constructor(bot) {
|
|
15
|
+
super(bot);
|
|
16
|
+
this.bot = bot;
|
|
17
|
+
this.command = ['方舟.重启 <name...>', 'ARK.重启 <name...>'];
|
|
18
|
+
this.roles = [base_1.BotCommandRole.All];
|
|
19
|
+
this.initialize();
|
|
20
|
+
}
|
|
21
|
+
async handle({ session }, args) {
|
|
22
|
+
let name = (0, lodash_1.isString)(args) ? args : args.join(' ');
|
|
23
|
+
let selectIndex = -1;
|
|
24
|
+
const userId = Number(session.event.user.id);
|
|
25
|
+
// 溯源前搜索项
|
|
26
|
+
if (tempSelections.has(userId) && !isNaN(Number(name))) {
|
|
27
|
+
selectIndex = Number(name) - 1;
|
|
28
|
+
name = tempSelections.get(userId);
|
|
29
|
+
}
|
|
30
|
+
tempSelections.delete(userId);
|
|
31
|
+
const nameInstances = await this.bot.panel.searchInstanceByName(name);
|
|
32
|
+
if (nameInstances.length === 0) {
|
|
33
|
+
return `未找到名称包含 "${name}" 的服务器`;
|
|
34
|
+
}
|
|
35
|
+
if (nameInstances.length > 1 && selectIndex === -1) {
|
|
36
|
+
tempSelections.set(userId, name);
|
|
37
|
+
return `请输入序号以选择:\n\n${nameInstances
|
|
38
|
+
.map((item, index) => `${index + 1}. [${constants_1.RemoteInstanceStatusName[item.instance.cfg.status]}] ${item.instance.cfg.config.nickname}`)
|
|
39
|
+
.join('\n')}\n ==== 例如发送: (服务器 重启 1) ====`;
|
|
40
|
+
}
|
|
41
|
+
const targetInstance = selectIndex !== -1 ? nameInstances[selectIndex] : nameInstances[0];
|
|
42
|
+
if (!targetInstance || !targetInstance.instance) {
|
|
43
|
+
return `未找到名称包含 "${name}" 的服务器`;
|
|
44
|
+
}
|
|
45
|
+
const { cfg } = targetInstance.instance;
|
|
46
|
+
switch (cfg.status) {
|
|
47
|
+
// 关闭状态:启动
|
|
48
|
+
case constants_1.RemoteInstanceStatusEnum.RUNNING:
|
|
49
|
+
await targetInstance.instance.restartInstance();
|
|
50
|
+
this.bot.panel.handleRemoteServices();
|
|
51
|
+
return `已向服务器实例 "${cfg.config.nickname}" 发送重启操作`;
|
|
52
|
+
// 启动状态:重启
|
|
53
|
+
case constants_1.RemoteInstanceStatusEnum.STOPPED:
|
|
54
|
+
await targetInstance.instance.startInstance();
|
|
55
|
+
this.bot.panel.handleRemoteServices();
|
|
56
|
+
return `已向服务器实例 "${cfg.config.nickname}" 发送启动操作`;
|
|
57
|
+
default:
|
|
58
|
+
return `服务器实例 "${cfg.config.nickname}" 当前状态为 ${cfg.status},无法执行重启操作`;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.ARKBotRestartCommand = ARKBotRestartCommand;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Argv } from 'koishi';
|
|
2
|
+
import { MCSManagerBot } from '../../bot';
|
|
3
|
+
import { BotCommandBase, BotCommandRole } from '../base';
|
|
4
|
+
/**
|
|
5
|
+
* 服务器启动指令
|
|
6
|
+
*
|
|
7
|
+
* @example 服务器 启动 神话
|
|
8
|
+
*/
|
|
9
|
+
export declare class ARKBotStartCommand extends BotCommandBase {
|
|
10
|
+
readonly bot: MCSManagerBot;
|
|
11
|
+
command: string[];
|
|
12
|
+
roles: BotCommandRole[];
|
|
13
|
+
constructor(bot: MCSManagerBot);
|
|
14
|
+
handle({ session }: Argv, args: string[]): Promise<string>;
|
|
15
|
+
}
|