103 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import {System} from "./config.js";
 | 
						|
 | 
						|
export class DataLoader {
 | 
						|
 | 
						|
    /**
 | 
						|
     * Loads JSON data from a filepath
 | 
						|
     * @param filepath
 | 
						|
     * @returns {Promise<any>}
 | 
						|
     */
 | 
						|
    static async loadJson(filepath) {
 | 
						|
        // Load an external JSON data file which contains data for import
 | 
						|
        const response = await fetch(filepath);
 | 
						|
        return await response.json();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get a pack from a packName
 | 
						|
     * @param filepath
 | 
						|
     * @returns {Promise<any>}
 | 
						|
     */
 | 
						|
    static findPack(packName) {
 | 
						|
        // Reference a Compendium pack by it's collection ID
 | 
						|
        console.log(`${System.name}.${packName}`);
 | 
						|
        return game.packs.find(p => p.collection === `${System.name}.${packName}`);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Clears data from a given pack
 | 
						|
     * @param pack
 | 
						|
     * @returns {Promise<boolean>}
 | 
						|
     */
 | 
						|
    static async clearPack(pack) {
 | 
						|
        const packItems = await pack.getDocuments();
 | 
						|
        try {
 | 
						|
            // Delete all current compendium entries
 | 
						|
            for (let item of packItems) {
 | 
						|
                let options = {};
 | 
						|
                const document = await pack.getDocument(id);
 | 
						|
                options.pack = pack.collection;
 | 
						|
                return document.delete(options);
 | 
						|
                // await pack.deleteEntity(item.id);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        catch (ex) {
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Loads data from a JSON file into pack.
 | 
						|
     * JSON file should be located inside the System.dataPath folder and its name should the same as the pack name.
 | 
						|
     * @param packName
 | 
						|
     * @returns {Promise<void>}
 | 
						|
     */
 | 
						|
    static async loadData(packName) {
 | 
						|
        console.info(`Importing ${packName}...`);
 | 
						|
        // Find pack from his pack name
 | 
						|
        let pack = this.findPack(packName);
 | 
						|
 | 
						|
        // Get entity type to populate the proper collection
 | 
						|
        console.log(pack);
 | 
						|
        const entity = pack.metadata.entity;
 | 
						|
 | 
						|
        // Unlock the pack
 | 
						|
        // pack.locked = false;
 | 
						|
 | 
						|
        // Clear the current pack
 | 
						|
        await this.clearPack(pack);
 | 
						|
 | 
						|
        // Load data from JSON files
 | 
						|
        const filepath = `${System.dataPath}/fr/json/${packName}.json`;
 | 
						|
        const content = await this.loadJson(filepath);
 | 
						|
        /* Import databases to compendiums */
 | 
						|
        switch(entity){
 | 
						|
            case "Item" : {
 | 
						|
                // Create temporary items from JSON
 | 
						|
                let newItems = await Item.create(content);
 | 
						|
                // Make sure items are iteratable
 | 
						|
                newItems = newItems instanceof Array ? newItems : [newItems];
 | 
						|
                for (let item of newItems) {
 | 
						|
                    // Import into compendium
 | 
						|
                    await pack.importDocument(item);
 | 
						|
                }
 | 
						|
                // pack.locked = true;
 | 
						|
                break;
 | 
						|
            }
 | 
						|
            case "Actor" : {
 | 
						|
                // Create temporary items from JSON
 | 
						|
                let newActors = await Actor.create(content);
 | 
						|
                // Make sure items are iteratable
 | 
						|
                newActors = newActors instanceof Array ? newActors : [newActors];
 | 
						|
                for (let actor of newActors) {
 | 
						|
                    // Import into compendium
 | 
						|
                    await pack.importDocument(actor);
 | 
						|
                }
 | 
						|
                pack.locked = true;
 | 
						|
                break;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        console.info(`${packName} imported.`);
 | 
						|
    }
 | 
						|
} |