// General includes const irc = require('irc'); const fs = require('fs'); const winston = require('winston'); require('winston-daily-rotate-file'); const path = require('path'); // Load config const config = require('./config'); const cron = require('node-cron'); // Load new plugins const PluginManager = require('./plugins/pluginManager.js'); const pluginManager = new PluginManager(config); pluginManager.loadAllPlugins(); // Configure logger // create a write stream (in append mode) const 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; } var isConnected = false // Start client var client = new irc.Client(config.irc.server, config.irc.nick, { debug: false, channels: config.irc.channels, //floodProtection: true, //sasl: true, millisecondsOfSilenceBeforePingSent: 60000, }); 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]); } }, function(error) { logger.error('Plugin error: ', error); }); var res = null; // 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); } }; 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(typeof result.host !== 'undefined' && typeof result.user !== 'undefined') { 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); } } }); } } } }); for (let i = 0; i < config.cron.length; i++) { let row = config.cron[i] let that = this; cron.schedule(row.cron, () => { if (client.conn !== null) { for (let c = 0; c < config.irc.channels.length; c++) { handleMessage('BOT', config.irc.channels[c] , row.command); } } }); }