Packed content loading

This commit is contained in:
Jiiks 2018-08-27 19:16:30 +03:00
parent 5c160d75a6
commit 2913a85368
3 changed files with 68 additions and 11 deletions

View File

@ -8,13 +8,16 @@
* 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 Globals from './globals';
import Database from './database';
import { Utils, FileUtils, ClientLogger as Logger } from 'common';
import { SettingsSet, ErrorEvent } from 'structs';
import { Modals } from 'ui';
import path from 'path';
import Combokeys from 'combokeys';
/**
@ -77,12 +80,20 @@ export default class {
const directories = await FileUtils.listDirectory(this.contentPath);
for (const dir of directories) {
try {
await FileUtils.directoryExists(path.join(this.contentPath, dir));
} catch (err) { continue; }
const packed = dir.endsWith('.bd');
if (!packed) {
try {
await FileUtils.directoryExists(path.join(this.contentPath, dir));
} catch (err) { continue; }
}
try {
await this.preloadContent(dir);
if (packed) {
await this.preloadPackedContent(dir);
} else {
await this.preloadContent(dir);
}
} catch (err) {
this.errors.push(new ErrorEvent({
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
* @param {any} dirName Base directory for content
@ -181,7 +219,8 @@ export default class {
*/
static async preloadContent(dirName, reload = false, index) {
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);
@ -189,7 +228,7 @@ export default class {
throw { 'message': `Attempted to load already loaded user content: ${path}` };
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 defaultConfig = new SettingsSet({
@ -213,7 +252,7 @@ export default class {
}
} 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
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 });
@ -243,7 +282,7 @@ export default class {
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 (!reload && this.getContentById(content.id))
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 (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) {
newcontent.userConfig.enabled = false;
newcontent.start(false);

View File

@ -8,6 +8,7 @@
* LICENSE file in the root directory of this source tree.
*/
import path from 'path';
import sparkplug from 'sparkplug';
import { ClientIPC } from 'common';
import Module from './module';
@ -35,6 +36,10 @@ export default new class extends Module {
async first() {
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 is for Discord to stop error reporting :3

View File

@ -74,7 +74,7 @@ export default class extends ContentManager {
static get refreshPlugins() { return this.refreshContent }
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) {
for (const perm of permissions) {
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) {
instance.userConfig.enabled = false;
instance.start(false);