@kotori-bot/loader 1.5.0 → 1.5.2-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -27
- package/lib/class/loader.d.ts +3 -1
- package/lib/class/loader.js +43 -44
- package/lib/class/runner.d.ts +1 -0
- package/lib/class/runner.js +46 -28
- package/lib/decorators/index.js +3 -3
- package/lib/decorators/utils.js +2 -2
- package/lib/index.js +1 -1
- package/lib/service/file.js +3 -3
- package/lib/service/server.d.ts +12 -10
- package/lib/service/server.js +41 -42
- package/lib/utils/log.js +7 -7
- package/locales/common.json +28 -0
- package/package.json +6 -8
- package/lib/consts.d.ts +0 -8
- package/lib/consts.js +0 -11
- package/lib/loader.d.ts +0 -40
- package/lib/loader.js +0 -260
- package/lib/log.d.ts +0 -3
- package/lib/log.js +0 -20
- package/lib/runner.d.ts +0 -55
- package/lib/runner.js +0 -205
package/README.md
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
# @kotori-bot/core
|
|
2
|
-
|
|
3
|
-
```typescript
|
|
4
|
-
interface Context {
|
|
5
|
-
readonly baseDir: Runner['baseDir'];
|
|
6
|
-
readonly options: Runner['options'];
|
|
7
|
-
readonly [Symbols.modules]: Runner[typeof Symbols.modules];
|
|
8
|
-
loadAll(): void;
|
|
9
|
-
watcher(): void;
|
|
10
|
-
logger: Logger;
|
|
11
|
-
/* Service */
|
|
12
|
-
server: Server;
|
|
13
|
-
db: Database;
|
|
14
|
-
file: File;
|
|
15
|
-
}
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
- Loader
|
|
19
|
-
- Runner
|
|
20
|
-
- Server
|
|
21
|
-
- Database
|
|
22
|
-
- File
|
|
23
|
-
- log
|
|
24
|
-
|
|
25
|
-
## Reference
|
|
26
|
-
|
|
27
|
-
- [Kotori Docs](https://kotori.js.org/)
|
|
1
|
+
# @kotori-bot/core
|
|
2
|
+
|
|
3
|
+
```typescript
|
|
4
|
+
interface Context {
|
|
5
|
+
readonly baseDir: Runner['baseDir'];
|
|
6
|
+
readonly options: Runner['options'];
|
|
7
|
+
readonly [Symbols.modules]: Runner[typeof Symbols.modules];
|
|
8
|
+
loadAll(): void;
|
|
9
|
+
watcher(): void;
|
|
10
|
+
logger: Logger;
|
|
11
|
+
/* Service */
|
|
12
|
+
server: Server;
|
|
13
|
+
db: Database;
|
|
14
|
+
file: File;
|
|
15
|
+
}
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
- Loader
|
|
19
|
+
- Runner
|
|
20
|
+
- Server
|
|
21
|
+
- Database
|
|
22
|
+
- File
|
|
23
|
+
- log
|
|
24
|
+
|
|
25
|
+
## Reference
|
|
26
|
+
|
|
27
|
+
- [Kotori Docs](https://kotori.js.org/)
|
package/lib/class/loader.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Container, Symbols } from '@kotori-bot/core';
|
|
1
|
+
import { Container, Symbols, formatFactory } from '@kotori-bot/core';
|
|
2
2
|
import Logger from '@kotori-bot/logger';
|
|
3
3
|
import Runner from './runner';
|
|
4
4
|
import Server from '../service/server';
|
|
@@ -15,6 +15,8 @@ declare module '@kotori-bot/core' {
|
|
|
15
15
|
server: Server;
|
|
16
16
|
db: Database;
|
|
17
17
|
file: File;
|
|
18
|
+
format: ReturnType<typeof formatFactory>;
|
|
19
|
+
locale: Context['i18n']['locale'];
|
|
18
20
|
}
|
|
19
21
|
interface GlobalConfig {
|
|
20
22
|
dirs: string[];
|
package/lib/class/loader.js
CHANGED
|
@@ -32,11 +32,11 @@ exports.Loader = void 0;
|
|
|
32
32
|
* @Blog: https://hotaru.icu
|
|
33
33
|
* @Date: 2023-06-24 15:12:55
|
|
34
34
|
* @LastEditors: Hotaru biyuehuya@gmail.com
|
|
35
|
-
* @LastEditTime: 2024-05-
|
|
35
|
+
* @LastEditTime: 2024-05-12 16:24:15
|
|
36
36
|
*/
|
|
37
37
|
const core_1 = require("@kotori-bot/core");
|
|
38
|
-
const
|
|
39
|
-
const
|
|
38
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
39
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
40
40
|
const logger_1 = __importStar(require("@kotori-bot/logger"));
|
|
41
41
|
const runner_1 = __importStar(require("./runner"));
|
|
42
42
|
const log_1 = __importDefault(require("../utils/log"));
|
|
@@ -47,26 +47,26 @@ function getBaseDir(file, dir) {
|
|
|
47
47
|
const handle = (root) => {
|
|
48
48
|
const baseDir = {
|
|
49
49
|
root,
|
|
50
|
-
modules:
|
|
51
|
-
data:
|
|
52
|
-
logs:
|
|
50
|
+
modules: node_path_1.default.join(root, 'modules'),
|
|
51
|
+
data: node_path_1.default.join(root, 'data'),
|
|
52
|
+
logs: node_path_1.default.join(root, 'logs')
|
|
53
53
|
};
|
|
54
54
|
Object.values(baseDir).forEach((val) => {
|
|
55
|
-
if (!
|
|
56
|
-
|
|
55
|
+
if (!node_fs_1.default.existsSync(val))
|
|
56
|
+
node_fs_1.default.mkdirSync(val);
|
|
57
57
|
});
|
|
58
58
|
return baseDir;
|
|
59
59
|
};
|
|
60
60
|
if (dir)
|
|
61
|
-
return handle(
|
|
62
|
-
let root =
|
|
61
|
+
return handle(node_path_1.default.resolve(dir));
|
|
62
|
+
let root = node_path_1.default.resolve(__dirname, '..').replace('loader', 'kotori');
|
|
63
63
|
let count = 0;
|
|
64
|
-
while (!
|
|
64
|
+
while (!node_fs_1.default.existsSync(node_path_1.default.join(root, file))) {
|
|
65
65
|
if (count > 5) {
|
|
66
66
|
logger_1.default.fatal(`cannot find file ${file} `);
|
|
67
67
|
process.exit();
|
|
68
68
|
}
|
|
69
|
-
root =
|
|
69
|
+
root = node_path_1.default.join(root, '..');
|
|
70
70
|
count += 1;
|
|
71
71
|
}
|
|
72
72
|
return handle(root);
|
|
@@ -88,7 +88,7 @@ function getCoreConfig(file, baseDir) {
|
|
|
88
88
|
.default(core_1.DEFAULT_CORE_CONFIG.plugin)
|
|
89
89
|
})
|
|
90
90
|
.default({ global: Object.assign(core_1.DEFAULT_CORE_CONFIG.global), plugin: core_1.DEFAULT_CORE_CONFIG.plugin })
|
|
91
|
-
.parse((0, core_1.loadConfig)(
|
|
91
|
+
.parse((0, core_1.loadConfig)(node_path_1.default.join(baseDir.root, file), 'yaml'));
|
|
92
92
|
return core_1.Tsu.Object({
|
|
93
93
|
adapter: core_1.Tsu.Object({})
|
|
94
94
|
.index(core_1.Tsu.Object({
|
|
@@ -122,6 +122,9 @@ class Loader extends core_1.Container {
|
|
|
122
122
|
ctx.provide('runner', new runner_1.default(ctx, runnerConfig));
|
|
123
123
|
ctx.mixin('runner', ['baseDir', 'options']);
|
|
124
124
|
core_1.Container.setInstance(ctx);
|
|
125
|
+
ctx.provide('loader-tools', { format: (0, core_1.formatFactory)(ctx.i18n), locale: ctx.i18n.locale.bind(ctx.i18n) });
|
|
126
|
+
ctx.mixin('loader-tools', ['locale', 'format']);
|
|
127
|
+
ctx.i18n.use(node_path_1.default.resolve(__dirname, '../../locales'));
|
|
125
128
|
this.ctx = core_1.Container.getInstance();
|
|
126
129
|
this.ctx.logger.trace(`options:`, options);
|
|
127
130
|
this.ctx.logger.trace(`runnerConfig:`, runnerConfig);
|
|
@@ -161,42 +164,39 @@ class Loader extends core_1.Container {
|
|
|
161
164
|
process.on('uncaughtExceptionMonitor', (err) => this.handleError(err, 'sync'));
|
|
162
165
|
process.on('unhandledRejection', (err) => this.handleError(err, 'async'));
|
|
163
166
|
process.on('SIGINT', () => process.exit());
|
|
164
|
-
this.ctx.logger.debug('
|
|
167
|
+
this.ctx.logger.debug(this.ctx.locale('loader.debug.info'));
|
|
165
168
|
}
|
|
166
169
|
listenMessage() {
|
|
167
170
|
this.ctx.on('connect', (data) => {
|
|
168
|
-
const { type, mode, normal, address, adapter } = data;
|
|
171
|
+
const { type, mode, normal, address: addr, adapter } = data;
|
|
169
172
|
let msg;
|
|
170
173
|
if (type === 'connect') {
|
|
171
174
|
switch (mode) {
|
|
172
175
|
case 'ws':
|
|
173
|
-
msg =
|
|
176
|
+
msg = this.ctx.format(`loader.bots.${normal ? 'connect' : 'reconnect'}`, [addr]);
|
|
174
177
|
break;
|
|
175
178
|
case 'ws-reverse':
|
|
176
|
-
msg = `
|
|
179
|
+
msg = this.ctx.format(`loader.bots.${normal ? 'start' : 'restart'}`, [addr]);
|
|
177
180
|
break;
|
|
178
181
|
default:
|
|
179
|
-
msg =
|
|
182
|
+
msg = this.ctx.format('loader.bots.ready', [addr]);
|
|
180
183
|
}
|
|
181
184
|
}
|
|
182
185
|
else {
|
|
183
186
|
switch (mode) {
|
|
184
187
|
case 'ws':
|
|
185
|
-
msg = `disconnect
|
|
188
|
+
msg = this.ctx.format(`loader.bots.disconnect${normal ? '' : '.error'}`, [addr]);
|
|
186
189
|
break;
|
|
187
190
|
case 'ws-reverse':
|
|
188
|
-
msg = `
|
|
191
|
+
msg = this.ctx.format(`loader.bots.stop${normal ? '' : '.error'}`, [addr]);
|
|
189
192
|
break;
|
|
190
193
|
default:
|
|
191
|
-
msg =
|
|
194
|
+
msg = this.ctx.format('loader.bots.dispose', [addr]);
|
|
192
195
|
}
|
|
193
196
|
}
|
|
194
197
|
adapter.ctx.logger[normal ? 'info' : 'warn'](msg);
|
|
195
198
|
});
|
|
196
|
-
this.ctx.on('status', (
|
|
197
|
-
const { status, adapter } = data;
|
|
198
|
-
adapter.ctx.logger.info(status);
|
|
199
|
-
});
|
|
199
|
+
this.ctx.on('status', ({ status, adapter }) => adapter.ctx.logger.info(status));
|
|
200
200
|
this.ctx.on('ready_module', (data) => {
|
|
201
201
|
if (typeof data.instance !== 'object')
|
|
202
202
|
return;
|
|
@@ -207,16 +207,17 @@ class Loader extends core_1.Container {
|
|
|
207
207
|
return;
|
|
208
208
|
this.loadCount += 1;
|
|
209
209
|
const { name, version, author, peerDependencies } = pkg[0].pkg;
|
|
210
|
-
this.ctx.logger.info(
|
|
210
|
+
this.ctx.logger.info(this.ctx.format('loader.modules.load', [name, version, Array.isArray(author) ? author.join(',') : author]));
|
|
211
211
|
const requiredVersion = peerDependencies['kotori-bot'];
|
|
212
|
-
if (
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
212
|
+
if (requiredVersion.includes('workspace') ||
|
|
213
|
+
constants_1.SUPPORTS_VERSION.exec(requiredVersion) ||
|
|
214
|
+
requiredVersion.includes(this.ctx.pkg.version))
|
|
215
|
+
return;
|
|
216
|
+
if (constants_1.SUPPORTS_HALF_VERSION.exec(requiredVersion)) {
|
|
217
|
+
this.ctx.logger.warn(this.ctx.format('loader.modules.incomplete', [requiredVersion]));
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
this.ctx.logger.error(this.ctx.format('loader.modules.unsupported', [requiredVersion]));
|
|
220
221
|
}
|
|
221
222
|
});
|
|
222
223
|
}
|
|
@@ -227,7 +228,7 @@ class Loader extends core_1.Container {
|
|
|
227
228
|
loadAllModules() {
|
|
228
229
|
this.ctx.get('runner').loadAll();
|
|
229
230
|
const failLoadCount = this.ctx.get('runner')[core_1.Symbols.modules].size - this.loadCount;
|
|
230
|
-
this.ctx.logger.info(
|
|
231
|
+
this.ctx.logger.info(this.ctx.format(`loader.modules.all${failLoadCount > 0 ? '.fail' : ''}`, [this.loadCount, failLoadCount]));
|
|
231
232
|
this.loadAllAdapter();
|
|
232
233
|
this.ctx.emit('ready');
|
|
233
234
|
}
|
|
@@ -236,13 +237,11 @@ class Loader extends core_1.Container {
|
|
|
236
237
|
Object.keys(this.ctx.config.adapter).forEach((botName) => {
|
|
237
238
|
const botConfig = this.ctx.config.adapter[botName];
|
|
238
239
|
const array = adapters.get(botConfig.extends);
|
|
239
|
-
if (!array)
|
|
240
|
-
this.ctx.logger.warn(
|
|
241
|
-
return;
|
|
242
|
-
}
|
|
240
|
+
if (!array)
|
|
241
|
+
return this.ctx.logger.warn(this.ctx.format('loader.adapter.notfound', [botConfig.extends, botName]));
|
|
243
242
|
const result = array[1]?.parseSafe(botConfig);
|
|
244
243
|
if (result && !result.value)
|
|
245
|
-
throw new core_1.ModuleError(
|
|
244
|
+
throw new core_1.ModuleError(this.ctx.format('error.module.config_bot', [botName, result.error.message]));
|
|
246
245
|
const bot = new array[0](this.ctx.extends({}, `${botConfig.extends}/${botName}`), result ? result.data : botConfig, botName);
|
|
247
246
|
this.ctx.on('ready', () => bot.start());
|
|
248
247
|
this.ctx.on('dispose', () => bot.stop());
|
|
@@ -252,15 +251,15 @@ class Loader extends core_1.Container {
|
|
|
252
251
|
const { version } = this.ctx.pkg;
|
|
253
252
|
const res = await this.ctx.http
|
|
254
253
|
.get("https://hotaru.icu/api/agent/?url=https://raw.githubusercontent.com/kotorijs/kotori/master/packages/core/package.json" /* GLOBAL.UPDATE */)
|
|
255
|
-
.catch(() => this.ctx.logger.error('
|
|
254
|
+
.catch(() => this.ctx.logger.error(this.ctx.locale('loader.tips.update.failed')));
|
|
256
255
|
if (!res || !core_1.Tsu.Object({ version: core_1.Tsu.String() }).check(res)) {
|
|
257
|
-
this.ctx.logger.warn(
|
|
256
|
+
this.ctx.logger.warn(this.ctx.locale('loader.tips.update.failed'));
|
|
258
257
|
}
|
|
259
258
|
else if (version === res.version) {
|
|
260
|
-
this.ctx.logger.info('
|
|
259
|
+
this.ctx.logger.info(this.ctx.locale('loader.tips.update.latest'));
|
|
261
260
|
}
|
|
262
261
|
else {
|
|
263
|
-
this.ctx.logger.warn(
|
|
262
|
+
this.ctx.logger.warn(this.ctx.format('loader.tips.update.available', [version, res.version, "https://github.com/kotorijs/kotori" /* GLOBAL.REPO */]));
|
|
264
263
|
}
|
|
265
264
|
}
|
|
266
265
|
}
|
package/lib/class/runner.d.ts
CHANGED
package/lib/class/runner.js
CHANGED
|
@@ -27,12 +27,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
29
|
exports.Runner = exports.localeTypeSchema = void 0;
|
|
30
|
-
const
|
|
31
|
-
const
|
|
30
|
+
const node_fs_1 = __importStar(require("node:fs"));
|
|
31
|
+
const node_path_1 = __importStar(require("node:path"));
|
|
32
32
|
const core_1 = require("@kotori-bot/core");
|
|
33
33
|
const logger_1 = require("@kotori-bot/logger");
|
|
34
34
|
const constants_1 = require("../constants");
|
|
35
35
|
const logger_2 = __importDefault(require("../utils/logger"));
|
|
36
|
+
require("./loader");
|
|
36
37
|
exports.localeTypeSchema = core_1.Tsu.Union([
|
|
37
38
|
core_1.Tsu.Union([core_1.Tsu.Literal('en_US'), core_1.Tsu.Literal('ja_JP')]),
|
|
38
39
|
core_1.Tsu.Union([core_1.Tsu.Literal('zh_TW'), core_1.Tsu.Any()])
|
|
@@ -88,7 +89,24 @@ class Runner {
|
|
|
88
89
|
level: this.ctx.config.global.level ?? config.level,
|
|
89
90
|
label: [],
|
|
90
91
|
transports: [
|
|
91
|
-
new logger_1.ConsoleTransport(
|
|
92
|
+
new logger_1.ConsoleTransport({
|
|
93
|
+
template: '%time% %type% %label%%msg%',
|
|
94
|
+
label: '[%name%] ',
|
|
95
|
+
labelColor: 'cyan',
|
|
96
|
+
time: 'M/D H:m:s',
|
|
97
|
+
timeColor: 'blue',
|
|
98
|
+
pidColor: 'bold',
|
|
99
|
+
useColor: true,
|
|
100
|
+
detail: {
|
|
101
|
+
FATAL: ['FATAL', 'redBright', 'redBright'],
|
|
102
|
+
ERROR: ['ERROR', 'red', 'red'],
|
|
103
|
+
WARN: ['WARN', 'yellowBright', 'yellowBright'],
|
|
104
|
+
INFO: ['INFO', 'green'],
|
|
105
|
+
DEBUG: ['DEBUG', 'magenta', 'magentaBright'],
|
|
106
|
+
TRACE: ['TRACE', 'gray', 'gray']
|
|
107
|
+
},
|
|
108
|
+
indent: 2
|
|
109
|
+
}),
|
|
92
110
|
new logger_1.FileTransport({ dir: this.baseDir.logs, filter: (data) => data.level >= logger_1.LoggerLevel.WARN })
|
|
93
111
|
]
|
|
94
112
|
};
|
|
@@ -96,59 +114,59 @@ class Runner {
|
|
|
96
114
|
ctx.inject('logger');
|
|
97
115
|
}
|
|
98
116
|
getDirFiles(rootDir) {
|
|
99
|
-
const files =
|
|
117
|
+
const files = node_fs_1.default.readdirSync(rootDir);
|
|
100
118
|
const list = [];
|
|
101
119
|
files.forEach((fileName) => {
|
|
102
|
-
const file =
|
|
103
|
-
if (
|
|
120
|
+
const file = node_path_1.default.join(rootDir, fileName);
|
|
121
|
+
if (node_fs_1.default.statSync(file).isDirectory()) {
|
|
104
122
|
list.push(...this.getDirFiles(file));
|
|
105
123
|
}
|
|
106
|
-
if (
|
|
124
|
+
if (node_path_1.default.parse(file).ext !== (this.isSourceDev ? constants_1.DEV_FILE : constants_1.BUILD_FILE))
|
|
107
125
|
return;
|
|
108
|
-
list.push(
|
|
126
|
+
list.push(node_path_1.default.resolve(file));
|
|
109
127
|
});
|
|
110
128
|
return list;
|
|
111
129
|
}
|
|
112
130
|
getModuleRootDir() {
|
|
113
131
|
const moduleRootDir = [];
|
|
114
132
|
[
|
|
115
|
-
...this.ctx.config.global.dirs.map((dir) =>
|
|
133
|
+
...this.ctx.config.global.dirs.map((dir) => node_path_1.default.resolve(this.ctx.baseDir.root, dir)),
|
|
116
134
|
this.ctx.baseDir.modules
|
|
117
135
|
].forEach((dir) => {
|
|
118
|
-
if (
|
|
136
|
+
if (node_fs_1.default.existsSync(dir) && node_fs_1.default.statSync(dir).isDirectory())
|
|
119
137
|
moduleRootDir.push(dir);
|
|
120
138
|
});
|
|
121
139
|
return moduleRootDir;
|
|
122
140
|
}
|
|
123
141
|
async checkModuleFiles(rootDir, filename) {
|
|
124
|
-
const dir =
|
|
125
|
-
if (!
|
|
142
|
+
const dir = node_path_1.default.join(rootDir, filename);
|
|
143
|
+
if (!node_fs_1.default.statSync(dir).isDirectory())
|
|
126
144
|
return;
|
|
127
145
|
if (rootDir !== this.ctx.baseDir.modules && !filename.startsWith(core_1.PLUGIN_PREFIX))
|
|
128
146
|
return;
|
|
129
|
-
const packagePath =
|
|
147
|
+
const packagePath = node_path_1.default.join(dir, 'package.json');
|
|
130
148
|
let pkg;
|
|
131
|
-
if (!
|
|
149
|
+
if (!node_fs_1.default.existsSync(packagePath))
|
|
132
150
|
return;
|
|
133
151
|
try {
|
|
134
|
-
pkg = JSON.parse(
|
|
152
|
+
pkg = JSON.parse(node_fs_1.default.readFileSync(packagePath).toString());
|
|
135
153
|
}
|
|
136
154
|
catch {
|
|
137
|
-
throw new core_1.DevError(
|
|
155
|
+
throw new core_1.DevError(this.ctx.format('error.dev.package.illegal', [packagePath]));
|
|
138
156
|
}
|
|
139
157
|
const result = modulePackageSchema.parseSafe(pkg);
|
|
140
158
|
if (!result.value) {
|
|
141
159
|
if (rootDir !== this.ctx.baseDir.modules)
|
|
142
160
|
return;
|
|
143
|
-
throw new core_1.DevError(
|
|
161
|
+
throw new core_1.DevError(this.ctx.format('error.dev.package.missing', [packagePath, result.error.message]));
|
|
144
162
|
}
|
|
145
163
|
pkg = result.data;
|
|
146
|
-
const devMode = this.isSourceDev && (0,
|
|
147
|
-
const main =
|
|
148
|
-
if (!
|
|
149
|
-
throw new core_1.DevError(
|
|
150
|
-
const dirs =
|
|
151
|
-
const files =
|
|
164
|
+
const devMode = this.isSourceDev && (0, node_fs_1.existsSync)(node_path_1.default.resolve(dir, constants_1.DEV_IMPORT));
|
|
165
|
+
const main = node_path_1.default.resolve(dir, devMode ? constants_1.DEV_IMPORT : pkg.main);
|
|
166
|
+
if (!node_fs_1.default.existsSync(main))
|
|
167
|
+
throw new core_1.DevError(this.ctx.format('error.dev.main_file', [main]));
|
|
168
|
+
const dirs = node_path_1.default.join(dir, devMode ? constants_1.DEV_CODE_DIRS : node_path_1.default.dirname(pkg.main));
|
|
169
|
+
const files = node_fs_1.default.statSync(dirs).isDirectory() ? this.getDirFiles(dirs) : [];
|
|
152
170
|
this[core_1.Symbols.modules].set(pkg.name, [
|
|
153
171
|
{ pkg, files, main },
|
|
154
172
|
this.ctx.config.plugin[(0, core_1.stringRightSplit)(pkg.name, core_1.PLUGIN_PREFIX)] || {}
|
|
@@ -156,20 +174,20 @@ class Runner {
|
|
|
156
174
|
}
|
|
157
175
|
getModuleList(rootDir) {
|
|
158
176
|
this.ctx.logger.trace('load dirs:', rootDir);
|
|
159
|
-
|
|
177
|
+
node_fs_1.default.readdirSync(rootDir).forEach(async (filename) => {
|
|
160
178
|
await this.checkModuleFiles(rootDir, filename);
|
|
161
179
|
});
|
|
162
180
|
}
|
|
163
181
|
loadLang(lang) {
|
|
164
182
|
if (lang)
|
|
165
|
-
this.ctx.i18n.use((0,
|
|
183
|
+
this.ctx.i18n.use((0, node_path_1.resolve)(...(Array.isArray(lang) ? lang : [lang])));
|
|
166
184
|
}
|
|
167
185
|
loadEx(instance, origin) {
|
|
168
186
|
this.ctx.logger.trace('module:', instance, origin);
|
|
169
187
|
const parsed = (schema) => {
|
|
170
188
|
const result = schema.parseSafe(config);
|
|
171
189
|
if (!result.value)
|
|
172
|
-
throw new core_1.ModuleError(
|
|
190
|
+
throw new core_1.ModuleError(this.ctx.format('error.module.config', [pkg.name, result.error.message]));
|
|
173
191
|
return result.data;
|
|
174
192
|
};
|
|
175
193
|
const { main, pkg } = instance;
|
|
@@ -222,8 +240,8 @@ class Runner {
|
|
|
222
240
|
this.watcher();
|
|
223
241
|
}
|
|
224
242
|
watcher() {
|
|
225
|
-
this[core_1.Symbols.modules].forEach((data) => data[0].files.forEach((file) =>
|
|
226
|
-
this.ctx.logger.debug(
|
|
243
|
+
this[core_1.Symbols.modules].forEach((data) => data[0].files.forEach((file) => node_fs_1.default.watchFile(file, async () => {
|
|
244
|
+
this.ctx.logger.debug(this.ctx.format('loader.debug.reload', [data[0].pkg.name]));
|
|
227
245
|
this.unloadEx(data[0]);
|
|
228
246
|
this.loadEx(...data);
|
|
229
247
|
})));
|
package/lib/decorators/index.js
CHANGED
|
@@ -4,8 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.plugins = void 0;
|
|
7
|
-
const
|
|
8
|
-
const
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
const node_path_1 = require("node:path");
|
|
9
9
|
const core_1 = require("@kotori-bot/core");
|
|
10
10
|
const utils_1 = __importDefault(require("./utils"));
|
|
11
11
|
function plugins(plugin) {
|
|
@@ -14,7 +14,7 @@ function plugins(plugin) {
|
|
|
14
14
|
pkgName = plugin.name;
|
|
15
15
|
}
|
|
16
16
|
else {
|
|
17
|
-
pkgName = JSON.parse((0,
|
|
17
|
+
pkgName = JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.resolve)(...(Array.isArray(plugin) ? plugin : [plugin]), 'package.json')).toString()).name;
|
|
18
18
|
}
|
|
19
19
|
const pluginName = pkgName.split(core_1.PLUGIN_PREFIX)[1] ?? pkgName;
|
|
20
20
|
const ctx = core_1.Container.getInstance().extends(undefined, pluginName);
|
package/lib/decorators/utils.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Decorators = void 0;
|
|
4
|
-
const
|
|
4
|
+
const node_path_1 = require("node:path");
|
|
5
5
|
const core_1 = require("@kotori-bot/core");
|
|
6
6
|
class Decorators {
|
|
7
7
|
ctx;
|
|
@@ -32,7 +32,7 @@ class Decorators {
|
|
|
32
32
|
lang = (target, property) => {
|
|
33
33
|
this.register(() => {
|
|
34
34
|
const lang = target[property];
|
|
35
|
-
this.ctx.parent.i18n.use((0,
|
|
35
|
+
this.ctx.parent.i18n.use((0, node_path_1.resolve)(...(Array.isArray(lang) ? lang : [lang])));
|
|
36
36
|
})();
|
|
37
37
|
};
|
|
38
38
|
inject = (target, property) => {
|
package/lib/index.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* @Blog: https://hotaru.icu
|
|
5
5
|
* @Date: 2023-10-29 16:20:51
|
|
6
6
|
* @LastEditors: Hotaru biyuehuya@gmail.com
|
|
7
|
-
* @LastEditTime: 2024-05-
|
|
7
|
+
* @LastEditTime: 2024-05-19 14:13:19
|
|
8
8
|
*/
|
|
9
9
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
10
|
if (k2 === undefined) k2 = k;
|
package/lib/service/file.js
CHANGED
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.File = void 0;
|
|
4
4
|
const core_1 = require("@kotori-bot/core");
|
|
5
|
-
const
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
6
6
|
class File extends core_1.Service {
|
|
7
7
|
constructor(ctx) {
|
|
8
8
|
super(ctx, {}, 'file');
|
|
9
9
|
}
|
|
10
10
|
getDir() {
|
|
11
|
-
return (0,
|
|
11
|
+
return (0, node_path_1.join)(this.ctx.baseDir.data, ...(this.ctx.identity ? this.ctx.identity.split('/') : []));
|
|
12
12
|
}
|
|
13
13
|
getFile(filename) {
|
|
14
|
-
return (0,
|
|
14
|
+
return (0, node_path_1.join)(this.getDir(), filename);
|
|
15
15
|
}
|
|
16
16
|
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
|
17
17
|
load(filename, type, init) {
|
package/lib/service/server.d.ts
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
|
-
/// <reference types="body-parser" />
|
|
2
|
-
/// <reference types="connect" />
|
|
3
|
-
/// <reference types="serve-static" />
|
|
4
1
|
/// <reference types="node" />
|
|
5
2
|
import { Context, Service } from '@kotori-bot/core';
|
|
3
|
+
import { IncomingMessage } from 'node:http';
|
|
6
4
|
import express from 'express';
|
|
7
|
-
import
|
|
8
|
-
import ws from 'ws';
|
|
5
|
+
import Ws from 'ws';
|
|
9
6
|
interface ServerConfig {
|
|
10
7
|
port: number;
|
|
11
8
|
}
|
|
9
|
+
type wsRouterCallback = (ws: Ws, req: IncomingMessage & {
|
|
10
|
+
params: object;
|
|
11
|
+
}) => void;
|
|
12
12
|
export declare class Server extends Service<ServerConfig> {
|
|
13
13
|
private app;
|
|
14
|
-
private server
|
|
15
|
-
private wsServer
|
|
14
|
+
private server;
|
|
15
|
+
private wsServer;
|
|
16
|
+
private wsRouters;
|
|
16
17
|
constructor(ctx: Context, config: ServerConfig);
|
|
17
18
|
start(): void;
|
|
18
19
|
stop(): void;
|
|
@@ -24,8 +25,9 @@ export declare class Server extends Service<ServerConfig> {
|
|
|
24
25
|
all: Server['app']['all'];
|
|
25
26
|
use: Server['app']['use'];
|
|
26
27
|
router: typeof express.Router;
|
|
27
|
-
json: (options?:
|
|
28
|
-
static:
|
|
29
|
-
|
|
28
|
+
json: (options?: object) => () => unknown;
|
|
29
|
+
static: (path: string) => () => unknown;
|
|
30
|
+
urlencoded: (options?: object) => () => unknown;
|
|
31
|
+
wss(path: string, callback: wsRouterCallback): void;
|
|
30
32
|
}
|
|
31
33
|
export default Server;
|