diff --git a/.hgignore b/.hgignore index e6869d7..7d6f986 100644 --- a/.hgignore +++ b/.hgignore @@ -11,3 +11,4 @@ deploy backup/ .log config.js +.swp diff --git a/app.js b/app.js index f2c8d09..0e9bc4f 100644 --- a/app.js +++ b/app.js @@ -27,6 +27,13 @@ var iconCodeToText = { // Load config var config = require('./config'); + +// Load new plugins +var PluginManager = require('./plugins/pluginManager.js'); +var pluginManager = new PluginManager(config); +pluginManager.loadAllPlugins(); + + // Load plugins var googletin = require('./googleapi.js')(config); var owmapi = require('./owmapi')(config); @@ -37,7 +44,6 @@ var getDiceString = require('./plugins/getDice')(); var getUrlString = require('./plugins/getUrl')(); var getTweet = require('./plugins/getTweet')(config); var getInstantAnswer = require('./plugins/getInstantAnswer')(config); -var getKernelData = require('./plugins/getKernel')(); // Configure logger // 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 var client = new irc.Client(config.irc.server, config.irc.nick, { debug: true, @@ -67,6 +79,13 @@ var client = new irc.Client(config.irc.server, config.irc.nick, { var handleMessage = function(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(/^[#&]/)) { // channel message 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 if (res = message.match(/^\.heit(a|ä) ([0-9]+)d([0-9]+)$/i)) { var th = getDiceString(res[2], res[3]); @@ -200,7 +172,6 @@ var handleMessage = function(from, to, message) { } // 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_-]+)))/)) { console.log(res); var id = res[7]; diff --git a/plugins/base.js b/plugins/base.js new file mode 100644 index 0000000..dfd1706 --- /dev/null +++ b/plugins/base.js @@ -0,0 +1,17 @@ + +class BasePlugin { + constructor(config) { + this.name = 'BasePlugin'; + } + + test(input) { + + } + + result(input) { + + } +} + +// export default BasePlugin; +module.exports = BasePlugin; diff --git a/plugins/getKernel.js b/plugins/helpers/requestPromise.js similarity index 53% rename from plugins/getKernel.js rename to plugins/helpers/requestPromise.js index ca84e15..efe099d 100644 --- a/plugins/getKernel.js +++ b/plugins/helpers/requestPromise.js @@ -1,6 +1,7 @@ var request = require('request'); var Promise = require('promise'); -var requestPromise = function(url, urlArgs) { + +function RequestPromise(url, urlArgs) { var promise = new Promise(function(resolve, reject) { request({ url: url, @@ -17,17 +18,4 @@ var requestPromise = function(url, urlArgs) { return promise; }; -module.exports = function(config) { - '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; -}; - +module.exports = RequestPromise; diff --git a/plugins/kernel.js b/plugins/kernel.js new file mode 100644 index 0000000..74b41dc --- /dev/null +++ b/plugins/kernel.js @@ -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; diff --git a/plugins/pluginManager.js b/plugins/pluginManager.js new file mode 100644 index 0000000..5ba0fd9 --- /dev/null +++ b/plugins/pluginManager.js @@ -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;