New PluginManager introduced. getKernel converted to the new plugin system
This commit is contained in:
parent
a6ad04074c
commit
37e182667b
69
app.js
69
app.js
|
@ -27,6 +27,13 @@ var iconCodeToText = {
|
||||||
// Load config
|
// Load config
|
||||||
var config = require('./config');
|
var config = require('./config');
|
||||||
|
|
||||||
|
|
||||||
|
// Load new plugins
|
||||||
|
var PluginManager = require('./plugins/pluginManager.js');
|
||||||
|
var pluginManager = new PluginManager(config);
|
||||||
|
pluginManager.loadAllPlugins();
|
||||||
|
|
||||||
|
|
||||||
// Load plugins
|
// Load plugins
|
||||||
var googletin = require('./googleapi.js')(config);
|
var googletin = require('./googleapi.js')(config);
|
||||||
var owmapi = require('./owmapi')(config);
|
var owmapi = require('./owmapi')(config);
|
||||||
|
@ -37,7 +44,6 @@ var getDiceString = require('./plugins/getDice')();
|
||||||
var getUrlString = require('./plugins/getUrl')();
|
var getUrlString = require('./plugins/getUrl')();
|
||||||
var getTweet = require('./plugins/getTweet')(config);
|
var getTweet = require('./plugins/getTweet')(config);
|
||||||
var getInstantAnswer = require('./plugins/getInstantAnswer')(config);
|
var getInstantAnswer = require('./plugins/getInstantAnswer')(config);
|
||||||
var getKernelData = require('./plugins/getKernel')();
|
|
||||||
|
|
||||||
// Configure logger
|
// Configure logger
|
||||||
// create a write stream (in append mode)
|
// create a write stream (in append mode)
|
||||||
|
@ -58,6 +64,12 @@ var logger = new (winston.Logger)({
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if(!config.irc.connect) {
|
||||||
|
logger.info('Not connecting to IRC. Exit');
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Start client
|
// Start client
|
||||||
var client = new irc.Client(config.irc.server, config.irc.nick, {
|
var client = new irc.Client(config.irc.server, config.irc.nick, {
|
||||||
debug: true,
|
debug: true,
|
||||||
|
@ -67,6 +79,13 @@ var client = new irc.Client(config.irc.server, config.irc.nick, {
|
||||||
|
|
||||||
var handleMessage = function(from, to, message) {
|
var handleMessage = function(from, to, message) {
|
||||||
logger.info(from + ' => ' + to + ': ' + message);
|
logger.info(from + ' => ' + to + ': ' + message);
|
||||||
|
|
||||||
|
pluginManager.testPlugins(message).then(function(results) {
|
||||||
|
for(var i = 0; i < results.length; i++) {
|
||||||
|
client.say(to, results[i]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
//if (to.match(/^[#&]/)) {
|
//if (to.match(/^[#&]/)) {
|
||||||
// channel message
|
// channel message
|
||||||
if (message.match(/^\.sää$/i) || message.match(/^\.saa$/i)) {
|
if (message.match(/^\.sää$/i) || message.match(/^\.saa$/i)) {
|
||||||
|
@ -127,53 +146,6 @@ var handleMessage = function(from, to, message) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Kernel version
|
|
||||||
if (res = message.match(/^\.kernel( (.+))?/i)) {
|
|
||||||
console.log('Search kernel version ' + res[2]);
|
|
||||||
var version = res[2];
|
|
||||||
getKernelData().then(function(data) {
|
|
||||||
var text = 'kernel: ';
|
|
||||||
|
|
||||||
// Store current versions!
|
|
||||||
var releaseToVersion = {};
|
|
||||||
data.releases.forEach(function(val) {
|
|
||||||
var regex = /([0-9]+?)(\.([0-9]+))?(\.([0-9]+))?/;
|
|
||||||
var result = val.version.match(regex);
|
|
||||||
|
|
||||||
var major = result[1];
|
|
||||||
var minor = result[3];
|
|
||||||
|
|
||||||
if(typeof major !== 'undefined' && typeof minor !== 'undefined') {
|
|
||||||
var releaseWithVersion = val.moniker + '-' + major + '-' + minor;
|
|
||||||
var release = val.moniker + '';
|
|
||||||
|
|
||||||
if(typeof releaseToVersion[releaseWithVersion] !== 'undefined') {
|
|
||||||
if(releaseToVersion[releaseWithVersion] !== val.version) {
|
|
||||||
// new release
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(typeof releaseToVersion[release] === 'undefined') {
|
|
||||||
releaseToVersion[release] = val.version;
|
|
||||||
}
|
|
||||||
|
|
||||||
releaseToVersion[releaseWithVersion] = val.version;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if(typeof releaseToVersion[version] !== 'undefined') {
|
|
||||||
text += 'Viimeisin versio on ' + releaseToVersion[version] + ' (' + version + ')';
|
|
||||||
} else {
|
|
||||||
|
|
||||||
text += 'Viimeisin vakaa versio on ' + data.latest_stable.version;
|
|
||||||
}
|
|
||||||
console.log(text);
|
|
||||||
|
|
||||||
client.say(to, text);
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Throw dice
|
// Throw dice
|
||||||
if (res = message.match(/^\.heit(a|ä) ([0-9]+)d([0-9]+)$/i)) {
|
if (res = message.match(/^\.heit(a|ä) ([0-9]+)d([0-9]+)$/i)) {
|
||||||
var th = getDiceString(res[2], res[3]);
|
var th = getDiceString(res[2], res[3]);
|
||||||
|
@ -200,7 +172,6 @@ var handleMessage = function(from, to, message) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Url specific handling
|
// Url specific handling
|
||||||
//if (res = message.match(/http(s)?:\/\/(www\.)?((youtu\.be\/([a-zA-Z0-9_-]*))|(youtube\.com\/watch\?v=([a-zA-Z0-9_-]*)))/)) {
|
|
||||||
if(res = message.match(/http(s)?:\/\/(www\.)?((youtu\.be\/([a-zA-Z0-9_-]*))|(youtube\.com\/watch\?([a-zA-Z0-9_=#-]+&)*v=([a-zA-Z0-9_-]+)))/)) {
|
if(res = message.match(/http(s)?:\/\/(www\.)?((youtu\.be\/([a-zA-Z0-9_-]*))|(youtube\.com\/watch\?([a-zA-Z0-9_=#-]+&)*v=([a-zA-Z0-9_-]+)))/)) {
|
||||||
console.log(res);
|
console.log(res);
|
||||||
var id = res[7];
|
var id = res[7];
|
||||||
|
|
17
plugins/base.js
Normal file
17
plugins/base.js
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
|
||||||
|
class BasePlugin {
|
||||||
|
constructor(config) {
|
||||||
|
this.name = 'BasePlugin';
|
||||||
|
}
|
||||||
|
|
||||||
|
test(input) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
result(input) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// export default BasePlugin;
|
||||||
|
module.exports = BasePlugin;
|
|
@ -1,6 +1,7 @@
|
||||||
var request = require('request');
|
var request = require('request');
|
||||||
var Promise = require('promise');
|
var Promise = require('promise');
|
||||||
var requestPromise = function(url, urlArgs) {
|
|
||||||
|
function RequestPromise(url, urlArgs) {
|
||||||
var promise = new Promise(function(resolve, reject) {
|
var promise = new Promise(function(resolve, reject) {
|
||||||
request({
|
request({
|
||||||
url: url,
|
url: url,
|
||||||
|
@ -17,17 +18,4 @@ var requestPromise = function(url, urlArgs) {
|
||||||
return promise;
|
return promise;
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = function(config) {
|
module.exports = RequestPromise;
|
||||||
'use strict';
|
|
||||||
var getKernelData = function(queryText) {
|
|
||||||
var urlArgs = {};
|
|
||||||
var url = 'https://www.kernel.org/releases.json';
|
|
||||||
|
|
||||||
var promise = requestPromise(url, urlArgs);
|
|
||||||
|
|
||||||
return promise;
|
|
||||||
};
|
|
||||||
|
|
||||||
return getKernelData;
|
|
||||||
};
|
|
||||||
|
|
88
plugins/kernel.js
Normal file
88
plugins/kernel.js
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
var Promise = require('promise');
|
||||||
|
var requestPromise = require('./helpers/requestPromise.js');
|
||||||
|
var BasePlugin = require('./base.js');
|
||||||
|
var logger = require('winston');
|
||||||
|
|
||||||
|
class Kernel extends BasePlugin {
|
||||||
|
constructor(config) {
|
||||||
|
super(config);
|
||||||
|
this.name = 'Kernel';
|
||||||
|
}
|
||||||
|
getKernelData(queryText) {
|
||||||
|
var urlArgs = {};
|
||||||
|
var url = 'https://www.kernel.org/releases.json';
|
||||||
|
|
||||||
|
var promise = requestPromise(url, urlArgs);
|
||||||
|
|
||||||
|
return promise;
|
||||||
|
}
|
||||||
|
|
||||||
|
test(input) {
|
||||||
|
// Kernel version
|
||||||
|
var res = null;
|
||||||
|
if (res = input.match(/^\.kernel( (.+))?/i)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
result(input) {
|
||||||
|
var that = this;
|
||||||
|
var resultPromise = new Promise(function(resultResolve, resultReject) {
|
||||||
|
var res = null;
|
||||||
|
if (res = input.match(/^\.kernel( (.+))?/i)) {
|
||||||
|
var version = res[2];
|
||||||
|
logger.info('Search kernel version ' + res[2]);
|
||||||
|
|
||||||
|
that.getKernelData().then(function(data) {
|
||||||
|
var text = 'kernel: ';
|
||||||
|
|
||||||
|
// Store current versions!
|
||||||
|
var releaseToVersion = {};
|
||||||
|
data.releases.forEach(function(val) {
|
||||||
|
var regex = /([0-9]+?)(\.([0-9]+))?(\.([0-9]+))?/;
|
||||||
|
var result = val.version.match(regex);
|
||||||
|
|
||||||
|
var major = result[1];
|
||||||
|
var minor = result[3];
|
||||||
|
|
||||||
|
if(typeof major !== 'undefined' && typeof minor !== 'undefined') {
|
||||||
|
var releaseWithVersion = val.moniker + '-' + major + '-' + minor;
|
||||||
|
var release = val.moniker + '';
|
||||||
|
|
||||||
|
if(typeof releaseToVersion[releaseWithVersion] !== 'undefined') {
|
||||||
|
if(releaseToVersion[releaseWithVersion] !== val.version) {
|
||||||
|
// new release
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(typeof releaseToVersion[release] === 'undefined') {
|
||||||
|
releaseToVersion[release] = val.version;
|
||||||
|
}
|
||||||
|
|
||||||
|
releaseToVersion[releaseWithVersion] = val.version;
|
||||||
|
}
|
||||||
|
}, function(error) {
|
||||||
|
resultReject(error);
|
||||||
|
});
|
||||||
|
|
||||||
|
if(typeof releaseToVersion[version] !== 'undefined') {
|
||||||
|
text += 'Viimeisin versio on ' + releaseToVersion[version] + ' (' + version + ')';
|
||||||
|
} else {
|
||||||
|
|
||||||
|
text += 'Viimeisin vakaa versio on ' + data.latest_stable.version;
|
||||||
|
}
|
||||||
|
|
||||||
|
resultResolve(text);
|
||||||
|
}, function(error) {
|
||||||
|
resultReject(error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return resultPromise;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = Kernel;
|
51
plugins/pluginManager.js
Normal file
51
plugins/pluginManager.js
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
var logger = require('winston');
|
||||||
|
var fs = require('fs');
|
||||||
|
var Promise = require('promise');
|
||||||
|
|
||||||
|
class PluginManager {
|
||||||
|
constructor(config) {
|
||||||
|
this.enabledPlugins = [];
|
||||||
|
this.plugins = [];
|
||||||
|
this.config = config;
|
||||||
|
|
||||||
|
var that = this;
|
||||||
|
|
||||||
|
config.plugins.forEach(function(pluginName) {
|
||||||
|
logger.info('checking ' + pluginName + '...');
|
||||||
|
|
||||||
|
if(fs.existsSync('./plugins/'+pluginName.toLowerCase()+'.js')) {
|
||||||
|
logger.info('* Exists. Enabling...');
|
||||||
|
that.enabledPlugins.push(pluginName.toLowerCase());
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
loadAllPlugins() {
|
||||||
|
var that = this;
|
||||||
|
this.enabledPlugins.forEach(function(pluginName) {
|
||||||
|
var Plugin = require('./' + pluginName + '.js');
|
||||||
|
|
||||||
|
var plugin = new Plugin(that.config);
|
||||||
|
that.plugins.push(plugin);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
testPlugins(input) {
|
||||||
|
var promises = [];
|
||||||
|
for(let i = 0; i < this.plugins.length; i++) {
|
||||||
|
var plugin = this.plugins[i];
|
||||||
|
|
||||||
|
if(plugin.test(input)) {
|
||||||
|
logger.info('* Plugin ' + plugin.name + ' reported hit');
|
||||||
|
|
||||||
|
promises.push(plugin.result(input));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Promise.all(promises);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// export default BasePlugin;
|
||||||
|
module.exports = PluginManager;
|
Loading…
Reference in New Issue
Block a user