Packed content loading
This commit is contained in:
parent
5c160d75a6
commit
2913a85368
|
@ -8,13 +8,16 @@
|
||||||
* LICENSE file in the root directory of this source tree.
|
* LICENSE file in the root directory of this source tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import asar from 'asar';
|
||||||
|
import path, { dirname } from 'path';
|
||||||
|
import rimraf from 'rimraf';
|
||||||
|
|
||||||
import Content from './content';
|
import Content from './content';
|
||||||
import Globals from './globals';
|
import Globals from './globals';
|
||||||
import Database from './database';
|
import Database from './database';
|
||||||
import { Utils, FileUtils, ClientLogger as Logger } from 'common';
|
import { Utils, FileUtils, ClientLogger as Logger } from 'common';
|
||||||
import { SettingsSet, ErrorEvent } from 'structs';
|
import { SettingsSet, ErrorEvent } from 'structs';
|
||||||
import { Modals } from 'ui';
|
import { Modals } from 'ui';
|
||||||
import path from 'path';
|
|
||||||
import Combokeys from 'combokeys';
|
import Combokeys from 'combokeys';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -77,12 +80,20 @@ export default class {
|
||||||
const directories = await FileUtils.listDirectory(this.contentPath);
|
const directories = await FileUtils.listDirectory(this.contentPath);
|
||||||
|
|
||||||
for (const dir of directories) {
|
for (const dir of directories) {
|
||||||
|
const packed = dir.endsWith('.bd');
|
||||||
|
|
||||||
|
if (!packed) {
|
||||||
try {
|
try {
|
||||||
await FileUtils.directoryExists(path.join(this.contentPath, dir));
|
await FileUtils.directoryExists(path.join(this.contentPath, dir));
|
||||||
} catch (err) { continue; }
|
} catch (err) { continue; }
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
if (packed) {
|
||||||
|
await this.preloadPackedContent(dir);
|
||||||
|
} else {
|
||||||
await this.preloadContent(dir);
|
await this.preloadContent(dir);
|
||||||
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
this.errors.push(new ErrorEvent({
|
this.errors.push(new ErrorEvent({
|
||||||
module: this.moduleName,
|
module: this.moduleName,
|
||||||
|
@ -173,6 +184,33 @@ export default class {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async preloadPackedContent(pkg, reload = false, index) {
|
||||||
|
try {
|
||||||
|
const packagePath = path.join(this.contentPath, pkg);
|
||||||
|
await FileUtils.fileExists(packagePath);
|
||||||
|
|
||||||
|
const config = JSON.parse(asar.extractFile(packagePath, 'config.json').toString());
|
||||||
|
const unpackedPath = path.join(Globals.getPath('tmp'), config.info.name);
|
||||||
|
|
||||||
|
asar.extractAll(packagePath, unpackedPath);
|
||||||
|
const content = await this.preloadContent({
|
||||||
|
config,
|
||||||
|
contentPath: unpackedPath,
|
||||||
|
packagePath: packagePath,
|
||||||
|
pkg,
|
||||||
|
packed: true
|
||||||
|
}, reload, index);
|
||||||
|
|
||||||
|
rimraf(unpackedPath, err => {
|
||||||
|
if (err) throw err;
|
||||||
|
});
|
||||||
|
|
||||||
|
return content;
|
||||||
|
} catch (err) {
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Common loading procedure for loading content before passing it to the actual loader
|
* Common loading procedure for loading content before passing it to the actual loader
|
||||||
* @param {any} dirName Base directory for content
|
* @param {any} dirName Base directory for content
|
||||||
|
@ -181,7 +219,8 @@ export default class {
|
||||||
*/
|
*/
|
||||||
static async preloadContent(dirName, reload = false, index) {
|
static async preloadContent(dirName, reload = false, index) {
|
||||||
try {
|
try {
|
||||||
const contentPath = path.join(this.contentPath, dirName);
|
const packed = typeof dirName === 'object' && dirName.packed;
|
||||||
|
const contentPath = packed ? dirName.contentPath : path.join(this.contentPath, dirName);
|
||||||
|
|
||||||
await FileUtils.directoryExists(contentPath);
|
await FileUtils.directoryExists(contentPath);
|
||||||
|
|
||||||
|
@ -189,7 +228,7 @@ export default class {
|
||||||
throw { 'message': `Attempted to load already loaded user content: ${path}` };
|
throw { 'message': `Attempted to load already loaded user content: ${path}` };
|
||||||
|
|
||||||
const configPath = path.resolve(contentPath, 'config.json');
|
const configPath = path.resolve(contentPath, 'config.json');
|
||||||
const readConfig = await FileUtils.readJsonFromFile(configPath);
|
const readConfig = packed ? dirName.config : await FileUtils.readJsonFromFile(configPath);
|
||||||
const mainPath = path.join(contentPath, readConfig.main || 'index.js');
|
const mainPath = path.join(contentPath, readConfig.main || 'index.js');
|
||||||
|
|
||||||
const defaultConfig = new SettingsSet({
|
const defaultConfig = new SettingsSet({
|
||||||
|
@ -213,7 +252,7 @@ export default class {
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
// We don't care if this fails it either means that user config doesn't exist or there's something wrong with it so we revert to default config
|
// We don't care if this fails it either means that user config doesn't exist or there's something wrong with it so we revert to default config
|
||||||
Logger.warn(this.moduleName, [`Failed reading config for ${this.contentType} ${readConfig.info.name} in ${dirName}`, err]);
|
Logger.warn(this.moduleName, [`Failed reading config for ${this.contentType} ${readConfig.info.name} in ${packed ? dirName.pkg : dirName}`, err]);
|
||||||
}
|
}
|
||||||
|
|
||||||
userConfig.config = defaultConfig.clone({ settings: userConfig.config });
|
userConfig.config = defaultConfig.clone({ settings: userConfig.config });
|
||||||
|
@ -243,7 +282,7 @@ export default class {
|
||||||
mainPath
|
mainPath
|
||||||
};
|
};
|
||||||
|
|
||||||
const content = await this.loadContent(paths, configs, readConfig.info, readConfig.main, readConfig.dependencies, readConfig.permissions, readConfig.mainExport);
|
const content = await this.loadContent(paths, configs, readConfig.info, readConfig.main, readConfig.dependencies, readConfig.permissions, readConfig.mainExport, packed ? dirName : false);
|
||||||
if (!content) return undefined;
|
if (!content) return undefined;
|
||||||
if (!reload && this.getContentById(content.id))
|
if (!reload && this.getContentById(content.id))
|
||||||
throw {message: `A ${this.contentType} with the ID ${content.id} already exists.`};
|
throw {message: `A ${this.contentType} with the ID ${content.id} already exists.`};
|
||||||
|
@ -310,7 +349,15 @@ export default class {
|
||||||
if (this.unloadContentHook) this.unloadContentHook(content);
|
if (this.unloadContentHook) this.unloadContentHook(content);
|
||||||
|
|
||||||
if (reload) {
|
if (reload) {
|
||||||
const newcontent = await this.preloadContent(content.dirName, true, index);
|
let newcontent;
|
||||||
|
if (content.packed) {
|
||||||
|
newcontent = await this.preloadPackedContent(content.packed.pkg, true, index);
|
||||||
|
} else {
|
||||||
|
newcontent = await this.preloadContent(content.dirName, true, index);
|
||||||
|
}
|
||||||
|
console.debug('enwcontent', newcontent);
|
||||||
|
//const newcontent = await (content.packed ? this.preloadPackedContent(content.packed.pkg, true, index) : this.preloadContent(content.dirName, true, index));
|
||||||
|
|
||||||
if (newcontent.enabled) {
|
if (newcontent.enabled) {
|
||||||
newcontent.userConfig.enabled = false;
|
newcontent.userConfig.enabled = false;
|
||||||
newcontent.start(false);
|
newcontent.start(false);
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
* LICENSE file in the root directory of this source tree.
|
* LICENSE file in the root directory of this source tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import path from 'path';
|
||||||
import sparkplug from 'sparkplug';
|
import sparkplug from 'sparkplug';
|
||||||
import { ClientIPC } from 'common';
|
import { ClientIPC } from 'common';
|
||||||
import Module from './module';
|
import Module from './module';
|
||||||
|
@ -35,6 +36,10 @@ export default new class extends Module {
|
||||||
|
|
||||||
async first() {
|
async first() {
|
||||||
const config = await ClientIPC.send('getConfig');
|
const config = await ClientIPC.send('getConfig');
|
||||||
|
config.paths.push({
|
||||||
|
id: 'tmp',
|
||||||
|
path: path.join(config.paths.find(p => p.id === 'base').path, 'tmp')
|
||||||
|
});
|
||||||
this.setState({ config });
|
this.setState({ config });
|
||||||
|
|
||||||
// This is for Discord to stop error reporting :3
|
// This is for Discord to stop error reporting :3
|
||||||
|
|
|
@ -74,7 +74,7 @@ export default class extends ContentManager {
|
||||||
static get refreshPlugins() { return this.refreshContent }
|
static get refreshPlugins() { return this.refreshContent }
|
||||||
|
|
||||||
static get loadContent() { return this.loadPlugin }
|
static get loadContent() { return this.loadPlugin }
|
||||||
static async loadPlugin(paths, configs, info, main, dependencies, permissions, mainExport) {
|
static async loadPlugin(paths, configs, info, main, dependencies, permissions, mainExport, packed = false) {
|
||||||
if (permissions && permissions.length > 0) {
|
if (permissions && permissions.length > 0) {
|
||||||
for (const perm of permissions) {
|
for (const perm of permissions) {
|
||||||
Logger.log(this.moduleName, `Permission: ${Permissions.permissionText(perm).HEADER} - ${Permissions.permissionText(perm).BODY}`);
|
Logger.log(this.moduleName, `Permission: ${Permissions.permissionText(perm).HEADER} - ${Permissions.permissionText(perm).BODY}`);
|
||||||
|
@ -117,6 +117,11 @@ export default class extends ContentManager {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (packed) instance.packed = {
|
||||||
|
packagePath: packed.packagePath,
|
||||||
|
pkg: packed.pkg
|
||||||
|
};
|
||||||
|
|
||||||
if (instance.enabled && this.loaded) {
|
if (instance.enabled && this.loaded) {
|
||||||
instance.userConfig.enabled = false;
|
instance.userConfig.enabled = false;
|
||||||
instance.start(false);
|
instance.start(false);
|
||||||
|
|
Loading…
Reference in New Issue