UNPKG

ircgrampp

Version:

IRCGram++ is a complexly simple Telegram <-> IRC Gateway

267 lines (203 loc) 7.39 kB
"use strict"; /** * @TODO: Add expire time for channel info storage */ Object.defineProperty(exports, "__esModule", { value: true }); exports.getConfInterface = exports.getPluginConfig = exports.getBridgeConfig = exports.getSubConfig = exports.default = exports.config = exports.plugins = exports.bridges = exports.deleteBridgeConfig = exports.savePluginConfig = exports.saveBridgeConfig = exports.saveSubConfigItem = exports.saveConfig = exports.renderConfigFile = exports.checkDataDir = exports.createConfigDir = exports.checkConfigDir = exports.checkDir = exports.createDir = void 0; var _package = _interopRequireDefault(require("../package.json")); var _fs = _interopRequireDefault(require("fs")); var _path = _interopRequireDefault(require("path")); var _os = require("os"); var _etc = _interopRequireDefault(require("etc")); var _etcYaml = _interopRequireDefault(require("etc-yaml")); var _prettyjson = _interopRequireDefault(require("prettyjson")); var _lodash = require("lodash"); var _debug = _interopRequireDefault(require("debug")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const debug = (0, _debug.default)("config"); const UID = process.getuid(); let etcDir; let varLibDir; let dataDir; let configDir; let homeDir; if (process.platform === 'win32') { varLibDir = process.env['ALLUSERSAPPDATA']; etcDir = varLibDir; } else { // Asume unix etcDir = '/etc'; varLibDir = '/var/lib'; } if (UID === 0) { configDir = _path.default.join(etcDir, _package.default.name); dataDir = _path.default.join(varLibDir, _package.default.name); } else { if (process.versions.node.match(/^6\./)) { if (process.platform === 'win32') { homeDir = process.env['USERPROFILE'] || process.env['HOMEPATH']; } else { homeDir = process.env['HOME']; } } else if (process.versions.node.match(/^(:?[789]|10|11|12)\./)) { let user = (0, _os.userInfo)(); homeDir = user.homedir; } else { throw new Error('Incompatible node version'); } configDir = _path.default.join(homeDir, `.${_package.default.name}`); dataDir = _path.default.join(homeDir, `.${_package.default.name}`); } if (process.env[`${_package.default.name.toUpperCase()}_CONFIG_DIR`]) { configDir = process.env[`${_package.default.name.toUpperCase()}_CONFIG_DIR`]; } if (process.env[`${_package.default.name.toUpperCase()}_DATA_DIR`]) { dataDir = process.env[`${_package.default.name.toUpperCase()}_DATA_DIR`]; } const confpath = _path.default.join(configDir, "config.yml"); const bridgespath = _path.default.join(configDir, "bridges"); const pluginspath = _path.default.join(configDir, "plugins"); const createDir = function (dir) { debug(`creating directory ${dir}`); _fs.default.mkdirSync(dir, 0o700); }; exports.createDir = createDir; const checkDir = function (dir, create = false) { let stats; debug(`Checking if dir exists ${dir}`); try { stats = _fs.default.lstatSync(dir); } catch (e) { debug(`Does not exist`); if (create) { return createDir(dir); } return false; } if (!stats.isDirectory(configDir)) { debug(`Exists but isn't a directory`); throw new Error(`${configDir} is not a directory`); } return true; }; exports.checkDir = checkDir; const checkConfigDir = function (create = false) { let res = 0; debug(`Check config directory ${configDir}`); res |= !checkDir(configDir, create); res |= !checkDir(bridgespath, create); res |= !checkDir(pluginspath, create); return !res; }; exports.checkConfigDir = checkConfigDir; const createConfigDir = function () { return checkConfigDir(true); }; exports.createConfigDir = createConfigDir; const checkDataDir = function (create = false) { let res = 0; debug(`Check data directory ${dataDir}`); res |= !checkDir(configDir, create); return !res; }; exports.checkDataDir = checkDataDir; const renderConfigFile = function (configJson = null, final = false) { if (!configJson) { configJson = config.toJSON(); } delete configJson.bridges; delete configJson.plugins; return _prettyjson.default.render(configJson, { noColor: final, indent: 2 }); }; exports.renderConfigFile = renderConfigFile; const saveConfig = function () { let data = new Buffer(`${renderConfigFile(null, true)}\n`, 'utf8'); return _fs.default.writeFileSync(confpath, data); }; exports.saveConfig = saveConfig; const saveSubConfigItem = function (subpath, bdata) { let data = new Buffer(`${renderConfigFile(bdata, true)}\n`, 'utf8'); let file = _path.default.join(subpath, `${bdata.name}.yml`); return _fs.default.writeFileSync(file, data); }; exports.saveSubConfigItem = saveSubConfigItem; const saveBridgeConfig = function (bdata) { return saveSubConfigItem(bridgespath, bdata); }; exports.saveBridgeConfig = saveBridgeConfig; const savePluginConfig = function (bdata) { return saveSubConfigItem(pluginspath, bdata); }; exports.savePluginConfig = savePluginConfig; const deleteBridgeConfig = function (name) { let file = _path.default.join(bridgespath, `${name}.yml`); _fs.default.unlinkSync(file); }; exports.deleteBridgeConfig = deleteBridgeConfig; const bridges = (0, _etc.default)().use(_etcYaml.default).folder(bridgespath); exports.bridges = bridges; const plugins = (0, _etc.default)().use(_etcYaml.default).folder(pluginspath); exports.plugins = plugins; const config = (0, _etc.default)().use(_etcYaml.default).file(confpath).add({ bridges: (0, _lodash.values)(bridges.toJSON()), plugins: (0, _lodash.values)(plugins.toJSON()) }).add({ db: _path.default.join(dataDir, "ircgrampp.dat"), pluginspath: _path.default.join(dataDir, "lib"), user: 'nobody', group: 'nobody' }); exports.config = config; var _default = config; exports.default = _default; const getSubConfig = function (subPart, name, defaults = {}, strict = false) { let items = config.get(subPart) || []; let item = items.find(x => x.name === name); debug(`Preparing config for ${subPart} ${name}`); if (!item && strict) { throw new Error(`Item ${subPart} ${name} does not exists`); } else if (!item) { item = {}; } item = (0, _lodash.assignIn)({}, defaults, item); for (let i in item) { if (typeof item[i] === "undefined") { delete item[i]; } } return item; }; exports.getSubConfig = getSubConfig; const getBridgeConfig = function (name) { let bridge = getSubConfig('bridges', name, { enable: true, prefix: config.get("prefix"), suffix: config.get("suffix"), oneConnectionByUser: config.get("oneConnectionByUser"), useIrcColors: true, showJoinLeft: config.get("showJoinLeft"), ircScapeCharacter: config.get("ircScapeCharacter") }, true); let ircConfig = config.get("irc"); let telegramConfig = config.get("telegram"); bridge.irc = (0, _lodash.assignIn)({}, ircConfig, bridge.irc || {}); bridge.telegram = (0, _lodash.assignIn)({}, telegramConfig, bridge.telegram || {}); return bridge; }; exports.getBridgeConfig = getBridgeConfig; const getPluginConfig = function (name) { return getSubConfig('plugins', name, { name: name, enable: false }); }; exports.getPluginConfig = getPluginConfig; const getConfInterface = function (obj, defaults = {}) { return (0, _etc.default)().add(obj).add(defaults); }; exports.getConfInterface = getConfInterface;