// General includes var irc = require('irc'); var fs = require('fs'); var winston = require('winston'); var path = require('path'); var iconCodeToText = { '01d': 'selkeää', '02d': 'puolipilvistä', '03d': 'pilvistä', '04d': 'pilvipeite rakoilee', '09d': 'sadekuuroja', '10d': 'vesisadetta', '11d': 'ukkostaa', '13d': 'lumisadetta', '50d': 'sumua', '01n': 'selkeää', '02n': 'puolipilvistä', '03n': 'pilvistä', '04n': 'pilvipeite rakoilee', '09n': 'sadekuuroja', '10n': 'vesisadetta', '11n': 'ukkostaa', '13n': 'lumisadetta', '50n': 'sumua' }; // 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); var getTemperatureString = require('./plugins/getWeather')(config); var getDnDCharacter = require('./plugins/getCharacter')(); var getDnDCharacter2 = require('./plugins/getCharacter2')(); var getDiceString = require('./plugins/getDice')(); var getUrlString = require('./plugins/getUrl')(); var getTweet = require('./plugins/getTweet')(config); var getInstantAnswer = require('./plugins/getInstantAnswer')(config); // Configure logger // create a write stream (in append mode) var logDirectory = __dirname + '/log'; // ensure log directory exists if(!fs.existsSync(logDirectory)) { fs.mkdirSync(logDirectory); } var logger = new (winston.Logger)({ transports: [ new (winston.transports.Console)(), new (winston.transports.DailyRotateFile)({ filename: logDirectory + '/ircbot.log', datePattern: '.yyyy-MM-dd', maxsize: 20000 }) ] }); 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, channels: config.irc.channels, }); 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)) { getTemperatureString(config.owmCityIds).then(function(str) { client.say(to, 'Sää: ' + str); }); } var res = null; // Weather if (res = message.match(/^\.s(ää|aa) ([^0-9]+)$/i)) { //console.log('kaupunki', res[1]); owmapi.getTemperature(res[2]).then(function(result) { //console.log(result); if(result.cod === '404') { //console.log('Eioo: ' + res[1]); client.say(to, 'Eioo: ' + res[2]); } else { var city = result.name; var country = result.sys.country; var temp = (result.main.temp-273.15).toFixed(1); var code = result.weather[0].icon; var sunriseDate = new Date(result.sys.sunrise*1000); var sunsetDate = new Date(result.sys.sunset*1000); var sunrise = sunriseDate.getHours() + '.' + sunriseDate.getMinutes(); var sunset = sunsetDate.getHours() + '.' + sunsetDate.getMinutes(); var humidity = result.main.humidity; var pressure = result.main.pressure; var windspeed = result.wind.speed; client.say(to, 'Sää: '+city+', '+country+' ('+temp+' °C, '+ iconCodeToText[code] +', ilmankosteus: '+humidity+' %, ilmanpaine: '+pressure+' hPa, tuulen nopeus: '+windspeed+' m/s)'); } }, function(error) { console.log('ERROR ',error); client.say(to, 'Oho! Tapahtui virhe. Yritä myöhemmin uudelleen...'); }); } // Create Character if (res = message.match(/^\.luohahmo$/i)) { var character = getDnDCharacter(); client.say(to, ''+character); } // Create Character if (res = message.match(/^\.luohahmo2$/i)) { var character = getDnDCharacter2(); client.say(to, ''+character); } // Instant Answer if (res = message.match(/^\.wtf (.+)$/i)) { getInstantAnswer(res[1]).then(function(answer) { client.say(to, '' + answer); }) } // Throw dice if (res = message.match(/^\.heit(a|ä) ([0-9]+)d([0-9]+)$/i)) { var th = getDiceString(res[2], res[3]); client.say(to, 'Heitettiin: '+th); } if (message.match(/^\.heit(a|ä) voltti homo$/i)) { client.say(to, 'steam://run/1250'); } // Op if (message.match(/^\.op$/i)) { client.send('NAMES', to); } // reload config if (message.match(/^\.paivita$/i)) { // Using require for config files is dangerous // Rewrite this in the future var filename = path.resolve('./config.js'); delete require.cache[filename]; config = require('./config'); client.say(to, 'Ladattiin asetustiedosto. ' + Object.keys(config.members).length + ' käyttäjäasetusta. Päivitetään operaattorioikeuksia...'); client.send('NAMES', to); } // Url specific handling 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]; if(typeof id === 'undefined') { id = res[5]; } if(typeof id !== 'undefined') { googletin.getYoutubeVideoById(id).then(function(result) { var resultString = 'Youtube: '; resultString += result.title; resultString += ', esittäjänä ' + result.channelTitle; var rotten = (Number(result.statistics.likeCount)/(Number(result.statistics.likeCount)+Number(result.statistics.dislikeCount))).toFixed(2); resultString += ' ('+result.duration+', '+ result.statistics.viewCount +' katselukertaa, '+rotten*100+'% tykätty, '+result.url+' )'; client.say(to, ''+resultString); }, function(err) { console.log('error', err); client.say(to, 'Youtube: jokin meni pieleen...'); }); } } else if (res = message.match(/^\.youtube (.+)$/i)) { console.log(res); googletin.getYoutubeVideo(res[1]).then(function(result) { var resultString = 'Youtube: '; resultString += result.title; resultString += ', esittäjänä ' + result.channelTitle; var rotten = (Number(result.statistics.likeCount)/(Number(result.statistics.likeCount)+Number(result.statistics.dislikeCount))).toFixed(2); //resultString += ' ('+result.duration+')'; resultString += ' ('+result.duration+', '+ result.statistics.viewCount +' katselukertaa, '+rotten*100+'% tykätty, '+result.url+' )'; //console.log(resultString); client.say(to, ''+resultString); }, function(err) { console.log('error'); client.say(to, 'Youtube: jokin meni pieleen...'); }); } else if (res = message.match(/http(s)?:\/\/(www\.)?((twitter\.com\/([a-zA-Z0-9_-]*)\/status\/([a-zA-Z0-9_-]*)))/)) { var status = res[6]; getTweet(status).then(function(tweet) { client.say(to, 'Twiitti: ' + tweet); }); } else if (res = message.match(/http(s)?:\/\/([^ ]*)/i)) { // Not liked. Disabled for now /*var url = res[0]; console.log('Get url: ' + url); getUrlString(url).then(function(str) { client.say(to, 'Otsikko: ' + str); });*/ } else { // Do nothing? :D } }; client.addListener('message', function (from, to, message) { if(String(from) !== String(config.irc.nick)) { handleMessage(from, to, message); } }); client.addListener('pm', function (from, message) { if(String(from) !== String(config.irc.nick)) { handleMessage(from, from, message); } }); client.addListener('join', function(channel, who) { client.whois(who, function(result) { console.log(result); var members = config.members; for(var memberNick in members) { var member = members[memberNick]; if(result.host.match(member.host) && result.user.match(member.user)) { client.send('MODE', channel, '+o', result.nick); } } }); }); client.addListener('error', function(message) { console.log('error: ', message); }); client.addListener('names', function(channel, nicks) { if(typeof nicks[config.irc.nick] !== 'undefined' && nicks[config.irc.nick] === '@') { // go through nicks for(var nick in nicks) { if(nicks[nick] !== '@') { client.whois(nick, function(result) { var members = config.members; for(var memberNick in members) { var member = members[memberNick]; if(result.host.match(member.host) && result.user.match(member.user)) { client.send('MODE', channel, '+o', result.nick); } } }); } } } });