ircgrampp
Version:
IRCGram++ is a complexly simple Telegram <-> IRC Gateway
207 lines (167 loc) • 5.37 kB
JavaScript
;
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;