@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.
@@ -5,16 +5,20 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.Server = void 0;
7
7
  const core_1 = require("@kotori-bot/core");
8
+ const node_http_1 = require("node:http");
9
+ const path_to_regexp_1 = require("path-to-regexp");
8
10
  const express_1 = __importDefault(require("express"));
9
11
  const ws_1 = __importDefault(require("ws"));
10
12
  class Server extends core_1.Service {
11
13
  app;
12
14
  server;
13
15
  wsServer;
16
+ wsRouters = new Map();
14
17
  constructor(ctx, config) {
15
18
  super(ctx, config, 'server');
16
19
  this.app = (0, express_1.default)();
17
- this.app.use('/', (_, res, next) => {
20
+ this.app.use(express_1.default.json());
21
+ this.app.use('/', (req, res, next) => {
18
22
  let isWebui = false;
19
23
  ctx[core_1.Symbols.modules].forEach((module) => {
20
24
  if (isWebui)
@@ -22,11 +26,12 @@ class Server extends core_1.Service {
22
26
  if (module[0].pkg.name === '@kotori-bot/kotori-plugin-webui')
23
27
  isWebui = true;
24
28
  });
25
- if (!isWebui) {
26
- res.setHeader('Content-type', 'text/html');
27
- res.send(/* html */ `<h1>Welcome to kotori!</h1>`);
29
+ if (isWebui || req.url !== '/') {
30
+ next();
31
+ return;
28
32
  }
29
- next();
33
+ res.setHeader('Content-type', 'text/html');
34
+ res.send(/* html */ `<h1>Welcome to kotori!</h1>`);
30
35
  });
31
36
  this.get = this.app.get.bind(this.app);
32
37
  this.post = this.app.post.bind(this.app);
@@ -35,23 +40,39 @@ class Server extends core_1.Service {
35
40
  this.delete = this.app.delete.bind(this.app);
36
41
  this.use = this.app.use.bind(this.app);
37
42
  this.all = this.app.all.bind(this.app);
43
+ this.server = (0, node_http_1.createServer)(this.app);
44
+ this.wsServer = new ws_1.default.Server({ noServer: true });
45
+ this.server.on('upgrade', (req, socket, head) => {
46
+ this.wsServer.handleUpgrade(req, socket, head, (ws) => {
47
+ this.wsServer.emit('connection', ws, req);
48
+ });
49
+ });
50
+ this.wsServer.on('connection', (ws, req) => {
51
+ let triggered = false;
52
+ /* eslint-disable no-restricted-syntax,no-continue */
53
+ for (const [template, callback] of this.wsRouters.entries()) {
54
+ if (!req.url)
55
+ continue;
56
+ const result = (0, path_to_regexp_1.match)(template, { decode: decodeURIComponent })(req.url);
57
+ if (!result)
58
+ continue;
59
+ if (!triggered)
60
+ triggered = true;
61
+ callback(ws, Object.assign(req, { params: result.params }));
62
+ }
63
+ /* eslint-enable no-restricted-syntax,no-continue */
64
+ if (!triggered)
65
+ ws.close(1002);
66
+ });
38
67
  }
39
68
  start() {
40
- if (!this.server) {
41
- this.server = this.app.listen(this.config.port);
69
+ this.server.listen(this.config.port, () => {
42
70
  this.ctx.logger.label('server').info(`http server start at http://127.0.0.1:${this.config.port}`);
43
- }
44
- if (!this.wsServer) {
45
- const port = this.config.port + 1;
46
- this.wsServer = new ws_1.default.Server({ port });
47
- this.ctx.logger.label('server').info(`websocket server start at ws://127.0.0.1:${port}`);
48
- }
71
+ });
49
72
  }
50
73
  stop() {
51
- if (this.server)
52
- this.server.close();
53
- if (this.wsServer)
54
- this.wsServer.close();
74
+ this.wsServer.close();
75
+ this.server.close();
55
76
  }
56
77
  get;
57
78
  post;
@@ -63,31 +84,9 @@ class Server extends core_1.Service {
63
84
  router = express_1.default.Router;
64
85
  json = express_1.default.json;
65
86
  static = express_1.default.static;
66
- wss(path) {
67
- if (!this.wsServer)
68
- return undefined;
69
- if (!path)
70
- return this.wsServer;
71
- const eventEmiter = new Proxy(this.wsServer.on, {
72
- apply: (target, thisArg, argArray) => {
73
- const [event, callback] = argArray;
74
- if (event !== 'connection')
75
- return Reflect.apply(target, thisArg, argArray);
76
- return this.wsServer.on(event, (ws, req) => {
77
- if (req.url !== path && path)
78
- return;
79
- callback(ws, req);
80
- this.ctx.logger.label('server').info(`websocket connection from ${req.url}`);
81
- });
82
- }
83
- });
84
- return new Proxy(this.wsServer, {
85
- get: (target, p, receiver) => {
86
- if (p !== 'on')
87
- return Reflect.get(target, p, receiver);
88
- return eventEmiter;
89
- }
90
- });
87
+ urlencoded = express_1.default.urlencoded;
88
+ wss(path, callback) {
89
+ this.wsRouters.set(path, callback);
91
90
  }
92
91
  }
93
92
  exports.Server = Server;
package/lib/utils/log.js CHANGED
@@ -3,13 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.loadInfo = void 0;
4
4
  function loadInfo(info, ctx) {
5
5
  process.stdout.write('Kotori Bot is loading...');
6
- process.stdout.write(`
7
- ██╗ ██╗ ██████╗ ████████╗ ██████╗ ██████╗ ██╗
8
- ██║ ██╔╝██╔═══██╗╚══██╔══╝██╔═══██╗██╔══██╗██║
9
- █████╔╝ ██║ ██║ ██║ ██║ ██║██████╔╝██║
10
- ██╔═██╗ ██║ ██║ ██║ ██║ ██║██╔══██╗██║
11
- ██║ ██╗╚██████╔╝ ██║ ╚██████╔╝██║ ██║██║
12
- ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝
6
+ process.stdout.write(`
7
+ ██╗ ██╗ ██████╗ ████████╗ ██████╗ ██████╗ ██╗
8
+ ██║ ██╔╝██╔═══██╗╚══██╔══╝██╔═══██╗██╔══██╗██║
9
+ █████╔╝ ██║ ██║ ██║ ██║ ██║██████╔╝██║
10
+ ██╔═██╗ ██║ ██║ ██║ ██║ ██║██╔══██╗██║
11
+ ██║ ██╗╚██████╔╝ ██║ ╚██████╔╝██║ ██║██║
12
+ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝
13
13
  `);
14
14
  ctx.logger.info('loader base dir:', ctx.baseDir.root);
15
15
  ctx.logger.info(`Kotori Bot Version: ${info.version} License: ${info.license}`);
@@ -0,0 +1,28 @@
1
+ {
2
+ "loader.debug.info": "run info: develop with debugging...",
3
+ "loader.debug.reload": "file happen changed, module {0} is reloading...",
4
+ "loader.tips.update.failed": "get update failed, please check your network",
5
+ "loader.tips.update.latest": "kotori is currently the latest version",
6
+ "loader.tips.update.available": "the current version of Kotori is {0}, and the latest version is {1}. please go to {2} to update",
7
+ "loader.bots.connect": "connect server to {0}",
8
+ "loader.bots.reconnect": "reconnect server to {0}",
9
+ "loader.bots.start": "server start at {0}",
10
+ "loader.bots.restart": "server restart at {0}",
11
+ "loader.bots.ready": "ready completed about {0}",
12
+ "loader.bots.disconnect": "disconnect server from {0}",
13
+ "loader.bots.disconnect.error": "disconnect server from {0} unexpectedly",
14
+ "loader.bots.stop": "server stop at {0}",
15
+ "loader.bots.stop.error": "server stop at {0} unexpectedly",
16
+ "loader.bots.dispose": "dispose completed about {0}",
17
+ "loader.modules.load": "loaded module {0} version: {1} authors: {2}",
18
+ "loader.modules.incomplete": "incomplete supported module version: {0}",
19
+ "loader.modules.unsupported": "unsupported module version: {0}",
20
+ "loader.modules.all": "loaded {0} modules successfully",
21
+ "loader.modules.all.failed": "loaded {0} modules successfully, failed to load {0} modules",
22
+ "loader.adapters.notfound": "cannot find adapter {0} for {1} bot",
23
+ "error.dev.package.illegal": "illegal package.json {0}",
24
+ "error.dev.package.missing": "package.json format error {0}: {1}",
25
+ "error.dev.main_file": "cannot find main file {0}",
26
+ "error.module.config": "config format of module {0} is error: {1}",
27
+ "error.module.config_bot": "config format of bot {0} is error: {1}"
28
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kotori-bot/loader",
3
- "version": "1.5.0",
3
+ "version": "1.5.2-beta.1",
4
4
  "description": "Loader For KotoriBot",
5
5
  "license": "GPL-3.0",
6
6
  "main": "lib/index.js",
@@ -11,6 +11,7 @@
11
11
  "loader"
12
12
  ],
13
13
  "files": [
14
+ "locales",
14
15
  "lib",
15
16
  "LICENSE",
16
17
  "README.md"
@@ -24,18 +25,15 @@
24
25
  },
25
26
  "homepage": "https://kotori.js.org",
26
27
  "dependencies": {
27
- "@types/ws": "^8.5.8",
28
28
  "express": "^4.18.2",
29
29
  "knex": "^3.1.0",
30
+ "path-to-regexp": "^6.2.2",
30
31
  "ws": "^8.14.2",
31
- "@kotori-bot/core": "^1.4.0",
32
- "@kotori-bot/logger": "^1.2.0"
32
+ "@kotori-bot/core": "^1.4.2-beta.1",
33
+ "@kotori-bot/logger": "^1.2.1"
33
34
  },
34
35
  "devDependencies": {
35
- "@types/body-parser": "^1.19.5",
36
- "@types/connect": "^3.4.38",
37
36
  "@types/express": "^4.17.21",
38
- "@types/express-serve-static-core": "^4.17.43",
39
- "@types/serve-static": "^1.15.5"
37
+ "@types/ws": "^8.5.8"
40
38
  }
41
39
  }
package/lib/consts.d.ts DELETED
@@ -1,8 +0,0 @@
1
- export declare const DEV_FILE = ".ts";
2
- export declare const BUILD_FILE = ".js";
3
- export declare const DEV_CODE_DIRS = "./src/";
4
- export declare const DEV_IMPORT = "./src/index.ts";
5
- export declare const BUILD_CONFIG_NAME = "kotori.yml";
6
- export declare const DEV_CONFIG_NAME = "kotori.dev.yml";
7
- export declare const SUPPORTS_VERSION: RegExp;
8
- export declare const SUPPORTS_HALF_VERSION: RegExp;
package/lib/consts.js DELETED
@@ -1,11 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SUPPORTS_HALF_VERSION = exports.SUPPORTS_VERSION = exports.DEV_CONFIG_NAME = exports.BUILD_CONFIG_NAME = exports.DEV_IMPORT = exports.DEV_CODE_DIRS = exports.BUILD_FILE = exports.DEV_FILE = void 0;
4
- exports.DEV_FILE = '.ts';
5
- exports.BUILD_FILE = '.js';
6
- exports.DEV_CODE_DIRS = './src/';
7
- exports.DEV_IMPORT = `${exports.DEV_CODE_DIRS}index.ts`;
8
- exports.BUILD_CONFIG_NAME = 'kotori.yml';
9
- exports.DEV_CONFIG_NAME = 'kotori.dev.yml';
10
- exports.SUPPORTS_VERSION = /(1\.1\.0)|(1\.2\.0)|(1\.3\.(.*?))/;
11
- exports.SUPPORTS_HALF_VERSION = /(x\.x\.(.*?))/;
package/lib/loader.d.ts DELETED
@@ -1,40 +0,0 @@
1
- import { Container, Symbols } from '@kotori-bot/core';
2
- import Logger from '@kotori-bot/logger';
3
- import Runner from './runner';
4
- import Server from './service/server';
5
- import type Database from './service/database';
6
- import File from './service/file';
7
- declare module '@kotori-bot/core' {
8
- interface Context {
9
- readonly baseDir: Runner['baseDir'];
10
- readonly options: Runner['options'];
11
- readonly [Symbols.modules]: Runner[typeof Symbols.modules];
12
- loadAll(): void;
13
- watcher(): void;
14
- logger: Logger;
15
- server: Server;
16
- db: Database;
17
- file: File;
18
- }
19
- interface GlobalConfig {
20
- dirs: string[];
21
- port: number;
22
- }
23
- }
24
- export declare class Loader extends Container {
25
- private ctx;
26
- private loadCount;
27
- constructor(options?: {
28
- dir?: string;
29
- mode?: string;
30
- });
31
- run(): void;
32
- private handleError;
33
- private catchError;
34
- private listenMessage;
35
- private setPreService;
36
- private loadAllModules;
37
- private loadAllAdapter;
38
- private checkUpdate;
39
- }
40
- export default Loader;
package/lib/loader.js DELETED
@@ -1,260 +0,0 @@
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 (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
- Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.Loader = void 0;
30
- /*
31
- * @Author: hotaru biyuehuya@gmail.com
32
- * @Blog: https://hotaru.icu
33
- * @Date: 2023-06-24 15:12:55
34
- * @LastEditors: Hotaru biyuehuya@gmail.com
35
- * @LastEditTime: 2024-05-01 22:06:58
36
- */
37
- const core_1 = require("@kotori-bot/core");
38
- const path_1 = __importDefault(require("path"));
39
- const fs_1 = __importDefault(require("fs"));
40
- const logger_1 = __importDefault(require("@kotori-bot/logger"));
41
- const runner_1 = __importStar(require("./runner"));
42
- const log_1 = __importDefault(require("./log"));
43
- const constants_1 = require("./constants");
44
- const server_1 = __importDefault(require("./service/server"));
45
- const file_1 = __importDefault(require("./service/file"));
46
- function getRunnerConfig(file, dir) {
47
- const handle = (root) => {
48
- const baseDir = {
49
- root,
50
- modules: path_1.default.join(root, 'modules'),
51
- data: path_1.default.join(root, 'data'),
52
- logs: path_1.default.join(root, 'logs')
53
- };
54
- Object.values(baseDir).forEach((val) => {
55
- if (!fs_1.default.existsSync(val))
56
- fs_1.default.mkdirSync(val);
57
- });
58
- return baseDir;
59
- };
60
- const options = {
61
- mode: file === constants_1.DEV_CONFIG_NAME ? 'dev' : 'build'
62
- };
63
- if (dir)
64
- return { baseDir: handle(path_1.default.resolve(dir)), options };
65
- let root = path_1.default.resolve(__dirname, '..').replace('loader', 'kotori');
66
- let count = 0;
67
- while (!fs_1.default.existsSync(path_1.default.join(root, file))) {
68
- if (count > 5) {
69
- logger_1.default.fatal(`cannot find file ${file} `);
70
- process.exit();
71
- }
72
- root = path_1.default.join(root, '..');
73
- count += 1;
74
- }
75
- return { baseDir: handle(root), options };
76
- }
77
- /* eslint consistent-return: 0 */
78
- function getCoreConfig(file, baseDir) {
79
- try {
80
- const result1 = core_1.Tsu.Object({
81
- global: core_1.Tsu.Object({
82
- dirs: core_1.Tsu.Array(core_1.Tsu.String()).default([]),
83
- port: core_1.Tsu.Number().default(core_1.DEFAULT_PORT),
84
- lang: runner_1.localeTypeSchema.default(core_1.DEFAULT_CORE_CONFIG.global.lang),
85
- 'command-prefix': core_1.Tsu.String().default(core_1.DEFAULT_CORE_CONFIG.global['command-prefix'])
86
- }),
87
- plugin: core_1.Tsu.Object({})
88
- .index(core_1.Tsu.Object({
89
- filter: core_1.Tsu.Object({}).default({})
90
- }).default({ filter: {} }))
91
- .default(core_1.DEFAULT_CORE_CONFIG.plugin)
92
- })
93
- .default({ global: Object.assign(core_1.DEFAULT_CORE_CONFIG.global), plugin: core_1.DEFAULT_CORE_CONFIG.plugin })
94
- .parse((0, core_1.loadConfig)(path_1.default.join(baseDir.root, file), 'yaml'));
95
- return core_1.Tsu.Object({
96
- adapter: core_1.Tsu.Object({})
97
- .index(core_1.Tsu.Object({
98
- extends: core_1.Tsu.String(),
99
- master: core_1.Tsu.Union([core_1.Tsu.Number(), core_1.Tsu.String()]),
100
- lang: runner_1.localeTypeSchema.default(result1.global.lang),
101
- 'command-prefix': core_1.Tsu.String().default(result1.global['command-prefix'])
102
- }))
103
- .default(core_1.DEFAULT_CORE_CONFIG.adapter)
104
- }).parse(result1);
105
- }
106
- catch (err) {
107
- if (!(err instanceof core_1.TsuError))
108
- throw err;
109
- logger_1.default.fatal(`file ${file} format error: ${err.message}`);
110
- process.exit();
111
- }
112
- }
113
- class Loader extends core_1.Container {
114
- ctx;
115
- loadCount = 0;
116
- constructor(options) {
117
- super();
118
- const file = options && options.mode === 'dev' ? constants_1.DEV_CONFIG_NAME : constants_1.BUILD_CONFIG_NAME;
119
- const runnerConfig = getRunnerConfig(file, options?.dir);
120
- const ctx = new core_1.Core(getCoreConfig(file, runnerConfig.baseDir));
121
- ctx.provide('runner', new runner_1.default(ctx, runnerConfig));
122
- ctx.mixin('runner', ['baseDir', 'options']);
123
- core_1.Container.setInstance(ctx);
124
- this.ctx = core_1.Container.getInstance();
125
- }
126
- run() {
127
- (0, log_1.default)(this.ctx.pkg, this.ctx);
128
- this.catchError();
129
- this.listenMessage();
130
- this.setPreService();
131
- this.loadAllModules();
132
- this.checkUpdate();
133
- }
134
- handleError(err, prefix) {
135
- if (!(err instanceof core_1.KotoriError)) {
136
- if (err instanceof Error) {
137
- this.ctx.logger.label(prefix).error(err.message, err.stack);
138
- }
139
- else {
140
- this.ctx.logger.label(prefix).error(err);
141
- }
142
- return;
143
- }
144
- const list = {
145
- ServiceError: () => this.ctx.logger.label('service').warn,
146
- ModuleError: () => this.ctx.logger.label('module').error,
147
- UnknownError: () => this.ctx.logger.error,
148
- DevError: () => this.ctx.logger.label('error').debug
149
- };
150
- list[err.name]().bind(this.ctx.logger)(err.message, err.stack);
151
- }
152
- catchError() {
153
- process.on('uncaughtExceptionMonitor', (err) => this.handleError(err, 'sync'));
154
- process.on('unhandledRejection', (err) => this.handleError(err, 'async'));
155
- process.on('SIGINT', () => process.exit());
156
- this.ctx.logger.debug('run info: develop with debuing...');
157
- }
158
- listenMessage() {
159
- this.ctx.on('connect', (data) => {
160
- const { type, mode, normal, address, adapter } = data;
161
- let msg;
162
- if (type === 'connect') {
163
- switch (mode) {
164
- case 'ws':
165
- msg = `${normal ? 'Connect' : 'Reconnect'} server to ${address}`;
166
- break;
167
- case 'ws-reverse':
168
- msg = `server ${normal ? 'start' : 'restart'} at ${address}`;
169
- break;
170
- default:
171
- msg = `ready completed about ${address}`;
172
- }
173
- }
174
- else {
175
- switch (mode) {
176
- case 'ws':
177
- msg = `disconnect server from ${address}${normal ? '' : ' unexpectedly'}`;
178
- break;
179
- case 'ws-reverse':
180
- msg = `server stop at ${address}${normal ? '' : ' unexpectedly'}`;
181
- break;
182
- default:
183
- msg = `dispose completed about ${address}`;
184
- }
185
- }
186
- adapter.ctx.logger[normal ? 'info' : 'warn'](msg);
187
- });
188
- this.ctx.on('status', (data) => {
189
- const { status, adapter } = data;
190
- adapter.ctx.logger.info(status);
191
- });
192
- this.ctx.on('ready_module', (data) => {
193
- if (typeof data.instance !== 'object')
194
- return;
195
- const pkg = data.instance.name
196
- ? this.ctx.get('runner')[core_1.Symbols.modules].get(data.instance.name)
197
- : undefined;
198
- if (!pkg)
199
- return;
200
- this.loadCount += 1;
201
- const { name, version, author, peerDependencies } = pkg[0].pkg;
202
- this.ctx.logger.info(`loaded module ${name} version: ${version} ${Array.isArray(author) ? `authors: ${author.join(',')}` : `author: ${author}`}`);
203
- const requiredVersion = peerDependencies['kotori-bot'];
204
- if (!requiredVersion.includes('workspace') &&
205
- (!constants_1.SUPPORTS_VERSION.exec(requiredVersion) || requiredVersion !== this.ctx.pkg.version)) {
206
- if (constants_1.SUPPORTS_HALF_VERSION.exec(requiredVersion)) {
207
- this.ctx.logger.warn(`incomplete supported module version: ${requiredVersion}`);
208
- }
209
- else {
210
- this.ctx.logger.error(`unsupported module version: ${requiredVersion}`);
211
- }
212
- }
213
- });
214
- }
215
- setPreService() {
216
- this.ctx.service('server', new server_1.default(this.ctx.extends(), { port: this.ctx.config.global.port }));
217
- this.ctx.service('file', new file_1.default(this.ctx.extends()));
218
- }
219
- loadAllModules() {
220
- this.ctx.get('runner').loadAll();
221
- const failLoadCount = this.ctx.get('runner')[core_1.Symbols.modules].size - this.loadCount;
222
- this.ctx.logger.info(`loaded ${this.loadCount} modules successfully${failLoadCount > 0 ? `, failed to load ${failLoadCount} modules` : ''} `);
223
- this.loadAllAdapter();
224
- this.ctx.emit('ready');
225
- }
226
- loadAllAdapter() {
227
- const adapters = this.ctx[core_1.Symbols.adapter];
228
- Object.keys(this.ctx.config.adapter).forEach((botName) => {
229
- const botConfig = this.ctx.config.adapter[botName];
230
- const array = adapters.get(botConfig.extends);
231
- if (!array) {
232
- this.ctx.logger.warn(`cannot find adapter '${botConfig.extends}' for ${botName}`);
233
- return;
234
- }
235
- const result = array[1]?.parseSafe(botConfig);
236
- if (result && !result.value)
237
- throw new core_1.ModuleError(`Config format of adapter ${botName} is error: ${result.error.message}`);
238
- const bot = new array[0](this.ctx.extends({}, `${botConfig.extends}/${botName}`), result ? result.data : botConfig, botName);
239
- this.ctx.on('ready', () => bot.start());
240
- this.ctx.on('dispose', () => bot.stop());
241
- });
242
- }
243
- async checkUpdate() {
244
- const { version } = this.ctx.pkg;
245
- const res = await this.ctx.http
246
- .get("https://hotaru.icu/api/agent/?url=https://raw.githubusercontent.com/kotorijs/kotori/master/packages/core/package.json" /* GLOBAL.UPDATE */)
247
- .catch(() => this.ctx.logger.error('get update failed, please check your network'));
248
- if (!res || !core_1.Tsu.Object({ version: core_1.Tsu.String() }).check(res)) {
249
- this.ctx.logger.warn(`detection update failed`);
250
- }
251
- else if (version === res.version) {
252
- this.ctx.logger.info('kotori is currently the latest version');
253
- }
254
- else {
255
- this.ctx.logger.warn(`the current version of Kotori is ${version}, and the latest version is ${res.version}. please go to ${"https://github.com/kotorijs/kotori" /* GLOBAL.REPO */} to update`);
256
- }
257
- }
258
- }
259
- exports.Loader = Loader;
260
- exports.default = Loader;
package/lib/log.d.ts DELETED
@@ -1,3 +0,0 @@
1
- import type { Context } from '@kotori-bot/core';
2
- export declare function loadInfo(info: Context['pkg'], ctx: Context): void;
3
- export default loadInfo;
package/lib/log.js DELETED
@@ -1,20 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.loadInfo = void 0;
4
- function loadInfo(info, ctx) {
5
- process.stdout.write('Kotori Bot is loading...');
6
- process.stdout.write(`
7
- ██╗ ██╗ ██████╗ ████████╗ ██████╗ ██████╗ ██╗
8
- ██║ ██╔╝██╔═══██╗╚══██╔══╝██╔═══██╗██╔══██╗██║
9
- █████╔╝ ██║ ██║ ██║ ██║ ██║██████╔╝██║
10
- ██╔═██╗ ██║ ██║ ██║ ██║ ██║██╔══██╗██║
11
- ██║ ██╗╚██████╔╝ ██║ ╚██████╔╝██║ ██║██║
12
- ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝
13
- `);
14
- ctx.logger.info('loader base dir:', ctx.baseDir.root);
15
- ctx.logger.info(`Kotori Bot Version: ${info.version} License: ${info.license}`);
16
- ctx.logger.info(`Kotori Bot By ${info.author}`);
17
- ctx.logger.info(`Copyright © 2023 - 2024 ${info.author} All rights reserved`);
18
- }
19
- exports.loadInfo = loadInfo;
20
- exports.default = loadInfo;
package/lib/runner.d.ts DELETED
@@ -1,55 +0,0 @@
1
- import { Context, LocaleType, ModuleConfig, Symbols } from '@kotori-bot/core';
2
- interface BaseDir {
3
- root: string;
4
- modules: string;
5
- data: string;
6
- logs: string;
7
- }
8
- interface Options {
9
- mode: 'dev' | 'build';
10
- }
11
- interface RunnerConfig {
12
- baseDir: BaseDir;
13
- options: Options;
14
- }
15
- interface ModulePackage {
16
- name: string;
17
- version: string;
18
- description: string;
19
- main: string;
20
- keywords: string[];
21
- license: 'GPL-3.0';
22
- author: string | string[];
23
- peerDependencies: {
24
- 'kotori-bot': string;
25
- [propName: string]: string;
26
- };
27
- kotori: {
28
- enforce?: 'pre' | 'post';
29
- meta: {
30
- language: LocaleType[];
31
- };
32
- };
33
- }
34
- interface ModuleMeta {
35
- pkg: ModulePackage;
36
- files: string[];
37
- main: string;
38
- }
39
- export declare const localeTypeSchema: import("@kotori-bot/core").UnionParser<[import("@kotori-bot/core").UnionParser<[import("@kotori-bot/core").LiteralParser<"en_US">, import("@kotori-bot/core").LiteralParser<"ja_JP">]>, import("@kotori-bot/core").UnionParser<[import("@kotori-bot/core").LiteralParser<"zh_TW">, import("@kotori-bot/core").AnyParser<any>]>]>;
40
- export declare class Runner {
41
- readonly baseDir: BaseDir;
42
- readonly options: Options;
43
- private ctx;
44
- private isDev;
45
- readonly [Symbols.modules]: Map<string, [ModuleMeta, ModuleConfig]>;
46
- constructor(ctx: Context, config: RunnerConfig);
47
- private getDirFiles;
48
- private getModuleRootDir;
49
- private getModuleList;
50
- private loadEx;
51
- private unloadEx;
52
- loadAll(): void;
53
- watcher(): void;
54
- }
55
- export default Runner;