UNPKG

la-cosa-nostra

Version:

A Mafia bot designed to run in Discord - beware the traitors and the lies!

143 lines (96 loc) 4.5 kB
var auxils = require("./auxils.js"); var config = require("./config_handler.js")(); var fs = require("fs"); var expansion_directories = process.directories.expansions; var expansions = getExpansions(config.playing.expansions); module.exports = expansions; function getExpansions (identifiers, scanned=new Array()) { var ret = new Array(); for (var i = 0; i < identifiers.length; i++) { var identifier = identifiers[i].toLowerCase(); if (identifier === "lcn") { throw new Error("Cannot have an expansion named \"lcn\"!"); }; if (scanned.some(x => x.identifier === identifier)) { // To prevent scanning twice return new Array(); }; var viable_directories = new Array(); for (var j = 0; j < expansion_directories.length; j++) { var expansion_directory = expansion_directories[j] + identifier; if (fs.existsSync(expansion_directory) && fs.lstatSync(expansion_directory).isDirectory()) { viable_directories.push(expansion_directory); }; }; if (viable_directories.length < 1) { throw new Error("Expansion \"" + identifier + "\" does not exist."); }; if (viable_directories.length > 1) { throw new Error("Multiple instances of expansion \"" + identifier + "\" [" + viable_directories.join(", ") + "] have been found - can only load one!"); }; var directory = viable_directories[0]; // Read information JSON var expansion = JSON.parse(fs.readFileSync(directory + "/expansion.json")); ret = ret.concat(getExpansions(expansion.dependencies, ret)); // Add custom commands var command_types = attemptReaddir(directory + "/commands"); var commands = new Object(); for (var j = 0; j < command_types.length; j++) { var sub_directory = directory + "/commands/" + command_types[j]; if (!commands[command_types[j]]) { commands[command_types[j]] = new Array(); }; commands[command_types[j]] = commands[command_types[j]].concat(attemptReaddir(sub_directory)); }; if (expansion["compatibility"]) { var compatible = auxils.compareVersion(process.version_info.version, expansion["compatibility"]); if (!compatible) { var err = new Error("Incompatible expansion pack \"" + identifier + "\" - expansion version is for " + expansion["compatibility"] + " however LCN is on " + process.version_info.version + "."); throw err; }; }; // Add information ret.push({expansion_directory: directory, identifier: identifier, expansion: expansion, additions: { assets: attemptReaddir(directory + "/assets"), roles: attemptReaddir(directory + "/roles"), flavours: attemptReaddir(directory + "/flavours"), role_win_conditions: attemptReaddir(directory + "/role_win_conditions"), attributes: attemptReaddir(directory + "/attributes"), commands: commands }, scripts: { // Handles configuration on LOAD start: attemptRequiring(directory + "/scripts/start.js"), // Runs script when a game is primed game_prime: attemptRequiring(directory + "/scripts/game_primed.js"), // Runs script when a game is started game_start: attemptRequiring(directory + "/scripts/game_start.js"), // Runs script when a game is started, after all chats are assigned game_secondary_start: attemptRequiring(directory + "/scripts/game_secondary_start.js"), // Runs script BEFORE a prime (usually to determine setup, return config) game_assign: attemptRequiring(directory + "/scripts/game_assign.js"), // Runs script on initialisation of the game object (same as prime, but before Mafia chat creation) game_init: attemptRequiring(directory + "/scripts/game_init.js"), // Runs script every cycle cycle: attemptRequiring(directory + "/scripts/cycle.js") }}); }; return ret; }; function attemptReaddir (directory) { if (!fs.existsSync(directory)) { return new Array(); }; return fs.readdirSync(directory); }; function attemptRequiring (directory) { var available = fs.existsSync(directory); if (available) { return require(directory); } else { return undefined; }; };