ircgrampp
Version:
IRCGram++ is a complexly simple Telegram <-> IRC Gateway
267 lines (203 loc) • 7.39 kB
JavaScript
;
/**
* @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;