UNPKG

ircgrampp

Version:

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

207 lines (167 loc) 5.37 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.installPlugin = exports.listPlugins = exports.syncPlugins = exports.searchPlugin = void 0; var _requestPromise = _interopRequireDefault(require("request-promise")); var _package = _interopRequireDefault(require("../../package.json")); var _config = require("../config"); var _npmwrapper = require("../npmwrapper"); var _db = _interopRequireDefault(require("./db")); var _interface = _interopRequireDefault(require("./interface")); var _debug = _interopRequireDefault(require("debug")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } let Promise = require('bluebird'); const debug = (0, _debug.default)("plugins.manager"); const PREFIX_REGX = new RegExp(`^${_package.default.name}-plugin-`, 'i'); const PREFIX_SEARCH_REGX = new RegExp(`^${_package.default.name}(:?-plugin-?)?`, 'i'); const parsePackage = function (packRecord) { let pack = packRecord['package']; return { name: pack.name.replace(/^ircgrampp-plugin-/i, ''), latest: pack.version, description: pack.description || "", web: pack.homepage || "", author: pack.author }; }; const plainText = function (text) { return text.replace(PREFIX_SEARCH_REGX, '').replace(/[\t\s\v]+/, ' ').toLowerCase(); }; const searchPlugin = function (pattern, max = 100) { const db = _db.default.getInstance(); pattern = plainText(pattern); return db.reduce((results, pack) => { let raiting = 0; let { name, description } = pack; name = plainText(name); description = plainText(description); if (name === pattern) { raiting = 100; } else if (name.indexOf(pattern) !== -1) { raiting = 50; } if (description.indexOf(pattern) !== -1) { raiting += 50; } let words = pattern.split(/[\s\t\n\-]+/g); raiting = words.reduce((total, word) => { if (name.indexOf(word) !== -1) { total += parseInt(70 / words.length); } if (description.indexOf(word) !== -1) { total += parseInt(40 / words.length); } return total; }, raiting); if (raiting) { results.push(Object.assign({}, pack, { score: raiting })); } return results; }, []).sort((a, b) => a.score > b.score ? -1 : 1).slice(0, max); }; exports.searchPlugin = searchPlugin; const syncPlugins = function () { debug("Sync db"); const db = _db.default.getInstance(); let lastOffset = 0; const reqOptions = { uri: 'https://api.npms.io/v2/search', qs: { q: `${_package.default.name}-plugin-`, size: 250 }, json: true }; debug("Making first request with ", reqOptions); return (0, _requestPromise.default)(reqOptions).then(({ total, results }) => { if (total > 250) { debug(`A lot of results (${total}), get pages`); let promises = []; lastOffset = 250; while (lastOffset < total) { debug(`Get packages with offset ${lastOffset}`); let rops = Object.assign({}, reqOptions, { qs: Object.assign({}, reqOptions.qs, { from: lastOffset }) }); debug(rops); promises.push((0, _requestPromise.default)(rops).then(({ results }) => { return results.filter(p => p['package'].name.match(PREFIX_REGX)).map(parsePackage); })); lastOffset += 250; } promises.push(Promise.resolve(results.map(parsePackage))); return Promise.all(promises); } else { debug('Less tan 250 results'); return [results.filter(p => { return p['package'].name.match(PREFIX_REGX); }).map(parsePackage)]; } }).then(results => { if (results && results.length) { debug('Saving results'); db.clear(); results.forEach(res => { db.push(res, false); }); debug(`Complete, there are ${db.length} plugins`); return db.length; } else { debug('No results'); return 0; } }).catch(e => { debug('error making search:', e); throw e; }); }; exports.syncPlugins = syncPlugins; const listPlugins = function () { let db = _db.default.getInstance(); return db._data; }; exports.listPlugins = listPlugins; const installPlugin = function (query, enable = false) { let name, ver, finalQuery; debug('Go to install package', query); query = query.replace(PREFIX_SEARCH_REGX, ''); let parts = query.match(/^([^@]+)(@[.]+)?$/g); debug("parts", parts); if (!parts) { return Promise.reject(new Error('Invalid query')); } name = parts[0]; if (parts.length > 1) { ver = parts[1]; } finalQuery = `${_package.default.name}-plugin-${name}@${ver || "latest"}`; debug("Final query is", finalQuery); return (0, _npmwrapper.installPackage)(finalQuery).then(() => { debug('Installed, getting defult config'); let pluginClass = _interface.default.getClass(name); let options = pluginClass.getDefaultOptions(); debug('Check config dir'); (0, _config.checkConfigDir)(true); debug('Saving config', options); return (0, _config.savePluginConfig)(Object.assign({}, options, { name, enable })); }).then(() => { debug('Plugin installed and configured'); }); }; exports.installPlugin = installPlugin;