reciple 9.4.1 → 9.5.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 +11 -13
- package/dist/bin.js +2 -132
- package/dist/bin.js.map +1 -1
- package/dist/classes/CLI.d.ts +54 -0
- package/dist/classes/CLI.js +188 -0
- package/dist/classes/CLI.js.map +1 -0
- package/dist/classes/Config.d.ts +21 -51
- package/dist/classes/Config.js +54 -56
- package/dist/classes/Config.js.map +1 -1
- package/dist/classes/EventHandlers.d.ts +9 -0
- package/dist/classes/EventHandlers.js +71 -0
- package/dist/classes/EventHandlers.js.map +1 -0
- package/dist/classes/ModuleLoader.d.ts +25 -0
- package/dist/classes/ModuleLoader.js +95 -0
- package/dist/classes/ModuleLoader.js.map +1 -0
- package/dist/commands/init.d.ts +7 -0
- package/dist/commands/init.js +10 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/shard.d.ts +9 -0
- package/dist/commands/shard.js +101 -0
- package/dist/commands/shard.js.map +1 -0
- package/dist/commands/start.d.ts +9 -0
- package/dist/commands/start.js +94 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/exports.d.ts +5 -9
- package/dist/exports.js +5 -3
- package/dist/exports.js.map +1 -1
- package/dist/index.d.ts +6 -4
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/types/constants.d.ts +6 -0
- package/dist/types/constants.js +29 -0
- package/dist/types/constants.js.map +1 -0
- package/dist/types/structures.d.ts +36 -0
- package/dist/types/structures.js +2 -0
- package/dist/types/structures.js.map +1 -0
- package/package.json +9 -5
- package/static/config.d.mts +3 -1
- package/static/config.mjs +7 -0
- package/dist/utils/cli.d.ts +0 -60
- package/dist/utils/cli.js +0 -80
- package/dist/utils/cli.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -31
- package/dist/utils/logger.js +0 -87
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/modules.d.ts +0 -10
- package/dist/utils/modules.js +0 -44
- package/dist/utils/modules.js.map +0 -1
package/dist/classes/Config.js
CHANGED
|
@@ -1,75 +1,73 @@
|
|
|
1
|
-
import { Logger, RecipleError } from '@reciple/core';
|
|
2
|
-
import { recursiveDefaults, existsAsync } from '@reciple/utils';
|
|
3
|
-
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
4
|
-
import { kleur } from 'fallout-utility/strings';
|
|
5
|
-
import { cliVersion } from '../utils/cli.js';
|
|
6
|
-
import { fileURLToPath } from 'node:url';
|
|
7
1
|
import path from 'node:path';
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Reads the default configuration data, processes it, and returns the resulting configuration string.
|
|
20
|
-
*
|
|
21
|
-
* @return {Promise<string>} The default configuration data as a string.
|
|
22
|
-
*/
|
|
2
|
+
import { CLI } from './CLI.js';
|
|
3
|
+
import { existsAsync, recursiveDefaults } from '@reciple/utils';
|
|
4
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
5
|
+
import { cliVersion } from '../types/constants.js';
|
|
6
|
+
import { FileWriteStreamMode, Logger, RecipleError } from '@reciple/core';
|
|
7
|
+
import { kleur } from 'fallout-utility';
|
|
8
|
+
export class Config {
|
|
9
|
+
constructor() { }
|
|
10
|
+
static defaultConfigFile = path.join(CLI.root, './static/config.mjs');
|
|
23
11
|
static async getDefaultConfigData() {
|
|
24
|
-
|
|
12
|
+
return recursiveDefaults(await import('file://' + Config.defaultConfigFile));
|
|
13
|
+
}
|
|
14
|
+
static async getDefaultConfigContent() {
|
|
15
|
+
let defaultConfig = (await readFile(Config.defaultConfigFile, 'utf-8')).replaceAll('\r\n', '\n');
|
|
25
16
|
defaultConfig = defaultConfig.replace(`import { cliVersion } from 'reciple';\n`, '');
|
|
26
17
|
defaultConfig = defaultConfig.replace('version: `^${cliVersion}`', 'version: `^' + cliVersion + '`');
|
|
27
18
|
return defaultConfig;
|
|
28
19
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
* @return {Promise<RecipleConfigJS|null>} A promise that resolves to the contents of the configuration file as a `RecipleConfigJS` object, or `null` if the file does not exist and `createIfNotExists` is `false`.
|
|
36
|
-
* @throws {RecipleError} If the configuration file does not contain valid data.
|
|
37
|
-
*/
|
|
38
|
-
static async readConfigJS(config, createIfNotExists = true) {
|
|
39
|
-
if (typeof config !== 'string') {
|
|
40
|
-
let data = null;
|
|
41
|
-
for (const file of config.paths) {
|
|
42
|
-
data = await this.readConfigJS(file, false);
|
|
43
|
-
if (data)
|
|
44
|
-
break;
|
|
45
|
-
}
|
|
46
|
-
return data ?? this.readConfigJS(config.default ?? config.paths[0], createIfNotExists);
|
|
47
|
-
}
|
|
48
|
-
const file = path.resolve(config);
|
|
49
|
-
const isFile = path.isAbsolute(config) || await existsAsync(file) || ['reciple.js', 'reciple.mjs'].includes(config);
|
|
50
|
-
if (isFile && !await existsAsync(file)) {
|
|
51
|
-
if (!createIfNotExists)
|
|
20
|
+
static async readConfigFile(options) {
|
|
21
|
+
const file = path.resolve(options.path);
|
|
22
|
+
const fileExists = await existsAsync(file);
|
|
23
|
+
const isFile = path.isAbsolute(options.path) || fileExists || options.path.startsWith('.') || ['reciple.js', 'reciple.mjs'].includes(options.path);
|
|
24
|
+
if (isFile && !fileExists) {
|
|
25
|
+
if (!options.createIfNotExists)
|
|
52
26
|
return null;
|
|
53
|
-
await
|
|
27
|
+
await Config.createConfigFile(file);
|
|
54
28
|
}
|
|
55
|
-
const data = recursiveDefaults(await import(isFile ? ('file://' + file) :
|
|
29
|
+
const data = recursiveDefaults(await import(isFile ? ('file://' + file) : options.path));
|
|
56
30
|
if (!data || !('config' in data))
|
|
57
31
|
throw new RecipleError(`Invalid config data in ${kleur.yellow("'" + file) + "'"}`);
|
|
58
32
|
return data;
|
|
59
33
|
}
|
|
60
|
-
|
|
61
|
-
* Creates a configuration file if it doesn't exist and returns the file path.
|
|
62
|
-
*
|
|
63
|
-
* @param {string} file - The path to the configuration file.
|
|
64
|
-
* @return {Promise<string>} The path of the created or existing configuration file.
|
|
65
|
-
*/
|
|
66
|
-
static async createConfigJS(file) {
|
|
34
|
+
static async createConfigFile(file) {
|
|
67
35
|
if (await existsAsync(file))
|
|
68
36
|
return file;
|
|
69
|
-
const defaultConfig = await
|
|
37
|
+
const defaultConfig = await Config.getDefaultConfigContent();
|
|
70
38
|
await mkdir(path.dirname(file), { recursive: true });
|
|
71
|
-
await writeFile(file, defaultConfig);
|
|
39
|
+
await writeFile(file, defaultConfig, 'utf-8');
|
|
72
40
|
return file;
|
|
73
41
|
}
|
|
42
|
+
static async createLoggerOptions(config, options, cli) {
|
|
43
|
+
const loggerConfig = !(config.logger instanceof Logger) ? config.logger : undefined;
|
|
44
|
+
let file = loggerConfig?.logToFile.enabled && loggerConfig?.logToFile.logsFolder && loggerConfig?.logToFile.file
|
|
45
|
+
? path.join(loggerConfig?.logToFile.logsFolder, loggerConfig?.logToFile.file)
|
|
46
|
+
: undefined;
|
|
47
|
+
if (CLI.shardMode && loggerConfig?.logToFile.enabled) {
|
|
48
|
+
const folder = CLI.shardLogsFolder ?? loggerConfig?.logToFile.logsFolder;
|
|
49
|
+
file = path.join(folder, `${(process.env.SHARDS ? process.env.SHARDS + '-' : '') + (CLI.threadId !== null ? (CLI.threadId + '-') : '') + process.pid}.log`);
|
|
50
|
+
}
|
|
51
|
+
if (cli && file)
|
|
52
|
+
cli.logPath = file;
|
|
53
|
+
const data = {
|
|
54
|
+
...options,
|
|
55
|
+
debugmode: {
|
|
56
|
+
...options?.debugmode,
|
|
57
|
+
enabled: options?.debugmode?.enabled ?? (typeof loggerConfig?.debugmode === 'boolean'
|
|
58
|
+
? loggerConfig?.debugmode
|
|
59
|
+
: undefined)
|
|
60
|
+
},
|
|
61
|
+
writeStream: loggerConfig?.logToFile.enabled && file
|
|
62
|
+
? await Logger.createFileWriteStream({
|
|
63
|
+
mode: FileWriteStreamMode.Rename,
|
|
64
|
+
path: file
|
|
65
|
+
})
|
|
66
|
+
: undefined,
|
|
67
|
+
label: (cli?.shardMode ? `Shards ${process.env.SHARDS ?? CLI.threadId}` : null) || options?.label
|
|
68
|
+
};
|
|
69
|
+
logger.debug(`Created logger options:`, data);
|
|
70
|
+
return data;
|
|
71
|
+
}
|
|
74
72
|
}
|
|
75
73
|
//# sourceMappingURL=Config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Config.js","sourceRoot":"","sources":["../../src/classes/Config.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"Config.js","sourceRoot":"","sources":["../../src/classes/Config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type RecipleClient } from '../index.js';
|
|
2
|
+
export declare class EventHandlers {
|
|
3
|
+
private constructor();
|
|
4
|
+
static addClientEvents(client: RecipleClient): void;
|
|
5
|
+
static addCommandExecuteHandlers(client: RecipleClient): void;
|
|
6
|
+
private static quoteString;
|
|
7
|
+
static addExitListener(listener: (signal: NodeJS.Signals) => any, once?: boolean): void;
|
|
8
|
+
static removeExitListener(listener: (signal: NodeJS.Signals) => any): void;
|
|
9
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import {} from '../index.js';
|
|
2
|
+
import { RecipleModule } from '@reciple/core';
|
|
3
|
+
import { kleur } from 'fallout-utility';
|
|
4
|
+
export class EventHandlers {
|
|
5
|
+
constructor() { }
|
|
6
|
+
static addClientEvents(client) {
|
|
7
|
+
client.on('recipleDebug', debug => client.logger?.debug(debug));
|
|
8
|
+
client.modules.on('resolveModuleFileError', (file, error) => client.logger?.error(`Failed to resolve module ${kleur.yellow(EventHandlers.quoteString(file))}:`, error));
|
|
9
|
+
client.modules.on('preStartModule', (m) => {
|
|
10
|
+
if (!RecipleModule.getModuleRoot(m))
|
|
11
|
+
Reflect.set(m, 'root', cli.cwd);
|
|
12
|
+
client.logger?.debug(`Starting module ${kleur.cyan(EventHandlers.quoteString(m.displayName))}`);
|
|
13
|
+
});
|
|
14
|
+
client.modules.on('postStartModule', (m) => client.logger?.log(`Started module ${kleur.cyan(EventHandlers.quoteString(m.displayName))}`));
|
|
15
|
+
client.modules.on('startModuleError', (m, err) => client.logger?.error(`Failed to start module ${kleur.yellow(EventHandlers.quoteString(m.displayName))}:`, err));
|
|
16
|
+
client.modules.on('preLoadModule', (m) => client.logger?.debug(`Loading module ${kleur.cyan(EventHandlers.quoteString(m.displayName))}`));
|
|
17
|
+
client.modules.on('postLoadModule', (m) => client.logger?.log(`Loaded module ${kleur.cyan(EventHandlers.quoteString(m.displayName))}`));
|
|
18
|
+
client.modules.on('loadModuleError', (m, err) => client.logger?.error(`Failed to load module ${kleur.yellow(EventHandlers.quoteString(m.displayName))}:`, err));
|
|
19
|
+
client.modules.on('preUnloadModule', (m) => client.logger?.debug(`Unloading module ${kleur.cyan(EventHandlers.quoteString(m.displayName))}`));
|
|
20
|
+
client.modules.on('postUnloadModule', (m) => client.logger?.log(`Unloaded module ${kleur.cyan(EventHandlers.quoteString(m.displayName))}`));
|
|
21
|
+
client.modules.on('unloadModuleError', (m, err) => client.logger?.error(`Failed to unload module ${kleur.yellow(EventHandlers.quoteString(m.displayName))}:`, err));
|
|
22
|
+
client.on('recipleRegisterApplicationCommands', (commands, guild) => client.logger?.log(`Registered (${commands?.size || 0}) application commands ${guild ? 'to ' + guild : 'globally'}`));
|
|
23
|
+
}
|
|
24
|
+
static addCommandExecuteHandlers(client) {
|
|
25
|
+
client.on('interactionCreate', async (interaction) => {
|
|
26
|
+
if (interaction.isChatInputCommand())
|
|
27
|
+
await client.commands?.execute(interaction);
|
|
28
|
+
if (interaction.isContextMenuCommand())
|
|
29
|
+
await client.commands?.execute(interaction);
|
|
30
|
+
});
|
|
31
|
+
client.on('messageCreate', async (message) => {
|
|
32
|
+
await client.commands?.execute(message);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
static quoteString(string, quote = "'") {
|
|
36
|
+
return `${quote}${string}${quote}`;
|
|
37
|
+
}
|
|
38
|
+
static addExitListener(listener, once) {
|
|
39
|
+
if (!once) {
|
|
40
|
+
process.on('SIGHUP', listener);
|
|
41
|
+
process.on('SIGINT', listener);
|
|
42
|
+
process.on('SIGQUIT', listener);
|
|
43
|
+
process.on('SIGABRT', listener);
|
|
44
|
+
process.on('SIGALRM', listener);
|
|
45
|
+
process.on('SIGTERM', listener);
|
|
46
|
+
process.on('SIGBREAK', listener);
|
|
47
|
+
process.on('SIGUSR2', listener);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
process.once('SIGHUP', listener);
|
|
51
|
+
process.once('SIGINT', listener);
|
|
52
|
+
process.once('SIGQUIT', listener);
|
|
53
|
+
process.once('SIGABRT', listener);
|
|
54
|
+
process.once('SIGALRM', listener);
|
|
55
|
+
process.once('SIGTERM', listener);
|
|
56
|
+
process.once('SIGBREAK', listener);
|
|
57
|
+
process.once('SIGUSR2', listener);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
static removeExitListener(listener) {
|
|
61
|
+
process.removeListener('SIGHUP', listener);
|
|
62
|
+
process.removeListener('SIGINT', listener);
|
|
63
|
+
process.removeListener('SIGQUIT', listener);
|
|
64
|
+
process.removeListener('SIGABRT', listener);
|
|
65
|
+
process.removeListener('SIGALRM', listener);
|
|
66
|
+
process.removeListener('SIGTERM', listener);
|
|
67
|
+
process.removeListener('SIGBREAK', listener);
|
|
68
|
+
process.removeListener('SIGUSR2', listener);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=EventHandlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventHandlers.js","sourceRoot":"","sources":["../../src/classes/EventHandlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type Awaitable } from 'fallout-utility';
|
|
2
|
+
import type { RecipleConfig } from '../types/structures.js';
|
|
3
|
+
import type { RecipleModule } from '@reciple/core';
|
|
4
|
+
import type { RecipleClient } from '../index.js';
|
|
5
|
+
export interface ModuleLoaderGetModulePathsOptions {
|
|
6
|
+
config: Exclude<RecipleConfig['modules'], undefined>;
|
|
7
|
+
filter?: (file: string) => Awaitable<boolean>;
|
|
8
|
+
cwd?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface ModuleLoaderActionData {
|
|
11
|
+
success: RecipleModule[];
|
|
12
|
+
failed: RecipleModule[];
|
|
13
|
+
}
|
|
14
|
+
export declare class ModuleLoader {
|
|
15
|
+
static globby?: typeof import('globby');
|
|
16
|
+
static stopping: boolean;
|
|
17
|
+
private constructor();
|
|
18
|
+
static getModulePaths(options: ModuleLoaderGetModulePathsOptions): Promise<string[]>;
|
|
19
|
+
static startModules(client: RecipleClient, modules: RecipleModule[]): Promise<ModuleLoaderActionData>;
|
|
20
|
+
static loadModules(client: RecipleClient, modules: RecipleModule[]): Promise<ModuleLoaderActionData>;
|
|
21
|
+
static unloadModules(client: RecipleClient, modules: RecipleModule[]): Promise<ModuleLoaderActionData>;
|
|
22
|
+
static processExitHandleModuleUnload(client: RecipleClient, signal: NodeJS.Signals): Promise<void>;
|
|
23
|
+
static defaultModulePathsFilter(file: string): Awaitable<boolean>;
|
|
24
|
+
static getGlobby(): Promise<typeof import('globby')>;
|
|
25
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { kleur } from 'fallout-utility';
|
|
2
|
+
import micromatch from 'micromatch';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { existsAsync } from '@reciple/utils';
|
|
5
|
+
import { lstat, mkdir, readdir } from 'node:fs/promises';
|
|
6
|
+
import { setTimeout as sleep } from 'node:timers/promises';
|
|
7
|
+
export class ModuleLoader {
|
|
8
|
+
static globby;
|
|
9
|
+
static stopping = false;
|
|
10
|
+
constructor() { }
|
|
11
|
+
static async getModulePaths(options) {
|
|
12
|
+
const paths = [];
|
|
13
|
+
const { globby, isDynamicPattern } = await ModuleLoader.getGlobby();
|
|
14
|
+
const cwd = options?.cwd ?? process.cwd();
|
|
15
|
+
for (const folder of options.config.dirs) {
|
|
16
|
+
const folderPath = path.isAbsolute(folder) ? folder : path.join(cwd, folder);
|
|
17
|
+
if (isDynamicPattern(folder, { cwd })) {
|
|
18
|
+
let dirs = await globby(folder, {
|
|
19
|
+
cwd: process.cwd(),
|
|
20
|
+
onlyDirectories: true,
|
|
21
|
+
absolute: true
|
|
22
|
+
});
|
|
23
|
+
if (options.config?.exclude?.length) {
|
|
24
|
+
dirs = dirs.filter(f => !micromatch.isMatch(path.basename(f), options.config.exclude));
|
|
25
|
+
}
|
|
26
|
+
paths.push(...await ModuleLoader.getModulePaths({
|
|
27
|
+
...options,
|
|
28
|
+
config: {
|
|
29
|
+
...options.config,
|
|
30
|
+
dirs
|
|
31
|
+
}
|
|
32
|
+
}));
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (!await existsAsync(folderPath))
|
|
36
|
+
await mkdir(folderPath, { recursive: true });
|
|
37
|
+
if (!(await lstat(folderPath)).isDirectory())
|
|
38
|
+
continue;
|
|
39
|
+
const files = (await readdir(folderPath))
|
|
40
|
+
.map(file => path
|
|
41
|
+
.join(folderPath, file))
|
|
42
|
+
.filter(f => !options.config?.exclude?.length || !micromatch.isMatch(path.basename(f), options.config.exclude))
|
|
43
|
+
.filter(file => (options.filter ? options.filter(file) : ModuleLoader.defaultModulePathsFilter(file)));
|
|
44
|
+
await Promise.all(files.map(async (f) => {
|
|
45
|
+
if (options.config.filter) {
|
|
46
|
+
const allowed = !!await Promise.resolve(options.config.filter(f));
|
|
47
|
+
if (!allowed)
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (!await existsAsync(f))
|
|
51
|
+
return;
|
|
52
|
+
paths.push(f);
|
|
53
|
+
}));
|
|
54
|
+
}
|
|
55
|
+
if (options.config?.sort)
|
|
56
|
+
paths.sort(options.config.sort);
|
|
57
|
+
return paths;
|
|
58
|
+
}
|
|
59
|
+
static async startModules(client, modules) {
|
|
60
|
+
const success = await client.modules.startModules({ modules });
|
|
61
|
+
const failed = modules.filter(m => !success.some(s => s.id === m.id));
|
|
62
|
+
return { success, failed };
|
|
63
|
+
}
|
|
64
|
+
static async loadModules(client, modules) {
|
|
65
|
+
const success = await client.modules.loadModules({ modules });
|
|
66
|
+
const failed = modules.filter(m => !success.some(s => s.id === m.id));
|
|
67
|
+
return { success, failed };
|
|
68
|
+
}
|
|
69
|
+
static async unloadModules(client, modules) {
|
|
70
|
+
const success = await client.modules.unloadModules({ modules });
|
|
71
|
+
const failed = modules.filter(m => !success.some(s => s.id === m.id));
|
|
72
|
+
return { success, failed };
|
|
73
|
+
}
|
|
74
|
+
static async processExitHandleModuleUnload(client, signal) {
|
|
75
|
+
if (ModuleLoader.stopping)
|
|
76
|
+
return;
|
|
77
|
+
ModuleLoader.stopping = true;
|
|
78
|
+
client.logger?.warn(`Received exit signal: ${signal}`);
|
|
79
|
+
await client.destroy(true);
|
|
80
|
+
const signalString = signal === 'SIGINT' ? 'keyboard interrupt' : signal === 'SIGTERM' ? 'terminate' : String(signal);
|
|
81
|
+
await sleep(10);
|
|
82
|
+
client.logger?.warn(`Process exited: ${kleur.yellow(signalString)}`);
|
|
83
|
+
client.logger?.closeFileWriteStream();
|
|
84
|
+
process.exit(0);
|
|
85
|
+
}
|
|
86
|
+
static defaultModulePathsFilter(file) {
|
|
87
|
+
return file.endsWith('.js') || file.endsWith('.mjs');
|
|
88
|
+
}
|
|
89
|
+
static async getGlobby() {
|
|
90
|
+
if (ModuleLoader.globby)
|
|
91
|
+
return ModuleLoader.globby;
|
|
92
|
+
return (ModuleLoader.globby = await import('globby'));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=ModuleLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModuleLoader.js","sourceRoot":"","sources":["../../src/classes/ModuleLoader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Config } from '../classes/Config.js';
|
|
2
|
+
export default (command, cli) => command
|
|
3
|
+
.command('init')
|
|
4
|
+
.option('-c, --config <file>', 'Set the config file path', 'reciple.mjs')
|
|
5
|
+
.description('Initializes the config file')
|
|
6
|
+
.action(async () => {
|
|
7
|
+
const flags = cli.getFlags('init');
|
|
8
|
+
await Config.readConfigFile({ path: flags.config, createIfNotExists: true });
|
|
9
|
+
});
|
|
10
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAM9C,eAAe,CAAC,OAAgB,EAAE,GAAQ,EAAE,EAAE,CAAC,OAAO;KACjD,OAAO,CAAC,MAAM,CAAC;KACf,MAAM,CAAC,qBAAqB,EAAE,0BAA0B,EAAE,aAAa,CAAC;KACxE,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,KAAK,IAAI,EAAE;IACf,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAe,MAAM,CAAE,CAAC;IAElD,MAAM,MAAM,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;AACjF,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import { CLI } from '../classes/CLI.js';
|
|
3
|
+
import type { CLIStartFlags } from './start.js';
|
|
4
|
+
import { ShardingManager } from 'discord.js';
|
|
5
|
+
export interface CLIShardFlags extends CLIStartFlags {
|
|
6
|
+
}
|
|
7
|
+
declare const _default: (command: Command, cli: CLI) => Command;
|
|
8
|
+
export default _default;
|
|
9
|
+
export declare function stopShardsProcess(shards: ShardingManager): void;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { CLI } from '../classes/CLI.js';
|
|
2
|
+
import { Config } from '../classes/Config.js';
|
|
3
|
+
import { FileWriteStreamMode, Logger } from 'prtyprnt';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import { ShardingManager } from 'discord.js';
|
|
6
|
+
import { resolveEnvProtocol } from '@reciple/utils';
|
|
7
|
+
import { EventHandlers } from '../index.js';
|
|
8
|
+
import { createReadStream } from 'fs';
|
|
9
|
+
import { kleur } from 'fallout-utility';
|
|
10
|
+
export default (command, cli) => command
|
|
11
|
+
.command('shard')
|
|
12
|
+
.description('Starts in sharding mode')
|
|
13
|
+
.option('-t, --token <DiscordToken>', 'Set your Discord Bot token')
|
|
14
|
+
.option('-c, --config <file>', 'Set the config file path', 'reciple.mjs')
|
|
15
|
+
.action(async () => {
|
|
16
|
+
let logger = cli.logger ?? null;
|
|
17
|
+
const startFlags = CLI.stringifyFlags(cli.getFlags('shard'), cli.getCommand('shard'));
|
|
18
|
+
const recipleFlags = CLI.stringifyFlags(cli.getFlags(), cli.getCommand(), ['cwd']);
|
|
19
|
+
const processFlags = [...startFlags, ...recipleFlags];
|
|
20
|
+
const processErrorLogger = (err) => {
|
|
21
|
+
logger?.error(err);
|
|
22
|
+
process.exit(1);
|
|
23
|
+
};
|
|
24
|
+
process.once('uncaughtException', processErrorLogger);
|
|
25
|
+
process.once('unhandledRejection', processErrorLogger);
|
|
26
|
+
const flags = cli.getFlags('start', true);
|
|
27
|
+
const { config, sharding: shardingConfig } = await Config.readConfigFile({ path: flags.config, createIfNotExists: false }).then(data => data ?? ({ config: null, sharding: null }));
|
|
28
|
+
if (!config && !shardingConfig) {
|
|
29
|
+
logger?.error(`No config file found! Run ${kleur.green(`reciple init`)} to create one`);
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
let logFile = null;
|
|
33
|
+
let logsFolder = null;
|
|
34
|
+
process.env.SHARDS_DEPLOY_COMMANDS = '1';
|
|
35
|
+
if (!(config.logger instanceof Logger) && config.logger?.logToFile.enabled) {
|
|
36
|
+
logsFolder = path.resolve(path.join(config.logger?.logToFile?.logsFolder, 'sharder', process.pid.toString()));
|
|
37
|
+
logFile = path.join(logsFolder, config.logger?.logToFile?.file);
|
|
38
|
+
process.env.SHARDS_LOGS_FOLDER = logsFolder;
|
|
39
|
+
logger?.log(`Logs folder is at '${kleur.cyan(logsFolder)}'`);
|
|
40
|
+
}
|
|
41
|
+
logger = config.logger instanceof Logger
|
|
42
|
+
? config.logger
|
|
43
|
+
: config.logger?.enabled
|
|
44
|
+
? cli.logger?.clone({
|
|
45
|
+
label: 'Main',
|
|
46
|
+
writeStream: logFile ? await Logger.createFileWriteStream({
|
|
47
|
+
mode: FileWriteStreamMode.Rename,
|
|
48
|
+
path: logFile
|
|
49
|
+
}) : undefined
|
|
50
|
+
}) || null
|
|
51
|
+
: null;
|
|
52
|
+
config.token = flags.token ? resolveEnvProtocol(flags.token) ?? '' : config.token;
|
|
53
|
+
const manager = new ShardingManager(cli.binPath, {
|
|
54
|
+
...shardingConfig,
|
|
55
|
+
token: config.token,
|
|
56
|
+
shardArgs: processFlags,
|
|
57
|
+
});
|
|
58
|
+
EventHandlers.addExitListener(() => stopShardsProcess(manager));
|
|
59
|
+
manager.on('shardCreate', shard => {
|
|
60
|
+
let logs;
|
|
61
|
+
let readStream;
|
|
62
|
+
logger?.log(`Creating shard ${shard.id}...`);
|
|
63
|
+
shard.on('ready', () => {
|
|
64
|
+
logger?.log(`Shard ${shard.id} is ready!`);
|
|
65
|
+
if (!logs)
|
|
66
|
+
return;
|
|
67
|
+
logger?.log(`Logs for shards ${shard.id} is located at '${kleur.yellow(logs)}'`);
|
|
68
|
+
readStream = createReadStream(logs, 'utf-8');
|
|
69
|
+
if (logger?.writeStream)
|
|
70
|
+
readStream.pipe(logger.writeStream);
|
|
71
|
+
});
|
|
72
|
+
shard.on('reconnecting', () => logger?.log(`Shard ${shard.id} is reconnecting!`));
|
|
73
|
+
shard.on('disconnect', () => logger?.log(`Shard ${shard.id} disconnected!`));
|
|
74
|
+
shard.on('death', () => logger?.log(`Shard ${shard.id} died!`));
|
|
75
|
+
shard.on('error', err => logger?.log(`Shard ${shard.id} encountered an error!\n`, err));
|
|
76
|
+
shard.on('message', data => {
|
|
77
|
+
if (!('type' in data) || data.type !== 'ProcessInfo')
|
|
78
|
+
return;
|
|
79
|
+
logs = data.log;
|
|
80
|
+
if (process.env.SHARDS_DEPLOY_COMMANDS) {
|
|
81
|
+
delete process.env.SHARDS_DEPLOY_COMMANDS;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
logger?.log(`Starting ${manager.totalShards} shards...`);
|
|
86
|
+
await manager.spawn();
|
|
87
|
+
});
|
|
88
|
+
export function stopShardsProcess(shards) {
|
|
89
|
+
shards.shards.map(c => {
|
|
90
|
+
logger.log(`Killed ${c.id}`);
|
|
91
|
+
if (c.process) {
|
|
92
|
+
c.process?.kill('SIGINT');
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
c.kill();
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
logger.log(`Exitting process!`);
|
|
99
|
+
setTimeout(() => process.exit(0), 500);
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=shard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shard.js","sourceRoot":"","sources":["../../src/commands/shard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import { CLI } from '../classes/CLI.js';
|
|
3
|
+
export interface CLIStartFlags {
|
|
4
|
+
token?: string;
|
|
5
|
+
config: string;
|
|
6
|
+
production?: boolean;
|
|
7
|
+
}
|
|
8
|
+
declare const _default: (command: Command, cli: CLI) => Command;
|
|
9
|
+
export default _default;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { CLI } from '../classes/CLI.js';
|
|
2
|
+
import { Config } from '../classes/Config.js';
|
|
3
|
+
import { Logger } from 'prtyprnt';
|
|
4
|
+
import { resolveEnvProtocol } from '@reciple/utils';
|
|
5
|
+
import semver from 'semver';
|
|
6
|
+
import { cliBuildVersion, cliVersion } from '../types/constants.js';
|
|
7
|
+
import { RecipleClient } from '../index.js';
|
|
8
|
+
import { buildVersion } from '@reciple/core';
|
|
9
|
+
import { EventHandlers } from '../classes/EventHandlers.js';
|
|
10
|
+
import { ModuleLoader } from '../classes/ModuleLoader.js';
|
|
11
|
+
import { kleur } from 'fallout-utility';
|
|
12
|
+
export default (command, cli) => command
|
|
13
|
+
.command('start', { isDefault: true })
|
|
14
|
+
.description('Starts the bot')
|
|
15
|
+
.option('-t, --token <DiscordToken>', 'Set your Discord Bot token')
|
|
16
|
+
.option('-c, --config <file>', 'Set the config file path', 'reciple.mjs')
|
|
17
|
+
.allowUnknownOption(true)
|
|
18
|
+
.action(async () => {
|
|
19
|
+
let logger = cli.logger ?? null;
|
|
20
|
+
const processErrorLogger = (err) => {
|
|
21
|
+
logger?.error(err);
|
|
22
|
+
process.exit(1);
|
|
23
|
+
};
|
|
24
|
+
process.once('uncaughtException', processErrorLogger);
|
|
25
|
+
process.once('unhandledRejection', processErrorLogger);
|
|
26
|
+
process.on('warning', warn => logger?.warn(warn));
|
|
27
|
+
const flags = cli.getFlags('start', true);
|
|
28
|
+
const config = await Config.readConfigFile({ path: flags.config, createIfNotExists: false }).then(config => config?.config);
|
|
29
|
+
if (!config) {
|
|
30
|
+
logger?.error(`No config file found! Run ${kleur.green(`reciple init`)} to create one`);
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
logger = config.logger instanceof Logger
|
|
34
|
+
? config.logger
|
|
35
|
+
: config.logger?.enabled
|
|
36
|
+
? cli.logger?.clone(await Config.createLoggerOptions(config, { ...cli.logger.toJSON(), label: 'Reciple' }, cli)) || null
|
|
37
|
+
: null;
|
|
38
|
+
logger?.log(`Starting ${kleur.green('reciple@' + kleur.dim(cliBuildVersion) + ' @reciple/client@' + kleur.dim(buildVersion))} - ${kleur.dim(new Date().toISOString())}`);
|
|
39
|
+
if (!cli.shardDeployCommands) {
|
|
40
|
+
config.applicationCommandRegister = { ...config.applicationCommandRegister, enabled: false };
|
|
41
|
+
}
|
|
42
|
+
if (cli.shardMode)
|
|
43
|
+
await cli.sendProcessInfo();
|
|
44
|
+
config.token = flags.token ? resolveEnvProtocol(flags.token) ?? '' : config.token;
|
|
45
|
+
if (config.version && !semver.satisfies(cliVersion, config.version)) {
|
|
46
|
+
logger?.error(`Your config version doesn't support Reciple CLI v${cliVersion}`);
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
const client = new RecipleClient(config);
|
|
50
|
+
global.reciple = client;
|
|
51
|
+
if (logger)
|
|
52
|
+
global.logger = logger;
|
|
53
|
+
client.setLogger(logger);
|
|
54
|
+
EventHandlers.addClientEvents(client);
|
|
55
|
+
const modules = config.modules
|
|
56
|
+
? await client.modules.resolveModuleFiles({
|
|
57
|
+
files: await ModuleLoader.getModulePaths({
|
|
58
|
+
config: config.modules,
|
|
59
|
+
cwd: cli.cwd,
|
|
60
|
+
filter: ModuleLoader.defaultModulePathsFilter
|
|
61
|
+
}),
|
|
62
|
+
disableVersionCheck: config.modules?.disableModuleVersionCheck
|
|
63
|
+
})
|
|
64
|
+
: [];
|
|
65
|
+
const startData = await ModuleLoader.startModules(client, modules);
|
|
66
|
+
if (startData.failed.length)
|
|
67
|
+
logger?.error(`Failed to start ${startData.failed.length} module(s):\n ${startData.failed.map(m => m.displayName).join('\n ')}`);
|
|
68
|
+
client.on('ready', async () => {
|
|
69
|
+
if (!client.isReady())
|
|
70
|
+
return;
|
|
71
|
+
logger?.debug(`Client is ready!`);
|
|
72
|
+
process.removeListener('uncaughtException', processErrorLogger);
|
|
73
|
+
process.removeListener('unhandledRejection', processErrorLogger);
|
|
74
|
+
const loadData = await ModuleLoader.loadModules(client, modules);
|
|
75
|
+
if (loadData.failed.length)
|
|
76
|
+
logger?.error(`Failed to load ${loadData.failed.length} module(s):\n ${loadData.failed.map(m => m.displayName).join('\n ')}`);
|
|
77
|
+
process.stdin.resume();
|
|
78
|
+
EventHandlers.addExitListener((signal) => ModuleLoader.processExitHandleModuleUnload(client, signal));
|
|
79
|
+
EventHandlers.addCommandExecuteHandlers(client);
|
|
80
|
+
if (config.applicationCommandRegister?.enabled !== false)
|
|
81
|
+
await client.commands.registerApplicationCommands();
|
|
82
|
+
logger?.warn(`Logged in as ${kleur.bold().cyan(client.user.tag)} ${kleur.magenta('(' + client.user.id + ')')}`);
|
|
83
|
+
logger?.log(`Loaded ${client.commands.contextMenuCommands.size} context menu command(s)`);
|
|
84
|
+
logger?.log(`Loaded ${client.commands.messageCommands.size} message command(s)`);
|
|
85
|
+
logger?.log(`Loaded ${client.commands.slashCommands.size} slash command(s)`);
|
|
86
|
+
logger?.log(`Loaded ${client.commands.preconditions.size} global command precondition(s)`);
|
|
87
|
+
logger?.log(`Loaded ${client.commands.halts.size} global command halt(s)`);
|
|
88
|
+
if (!config.checkForUpdates)
|
|
89
|
+
cli.updateChecker?.stopCheckInterval();
|
|
90
|
+
});
|
|
91
|
+
logger?.debug(`Logging in...`);
|
|
92
|
+
await client.login().then(() => logger?.debug(`Login successful`));
|
|
93
|
+
});
|
|
94
|
+
//# sourceMappingURL=start.js.map
|