2015-09-01 22:44:55 +03:00
|
|
|
// General includes
|
2018-04-29 17:37:07 +03:00
|
|
|
const irc = require('irc');
|
|
|
|
const fs = require('fs');
|
|
|
|
const winston = require('winston');
|
2017-03-16 21:05:41 +02:00
|
|
|
require('winston-daily-rotate-file');
|
2018-04-29 17:37:07 +03:00
|
|
|
const path = require('path');
|
|
|
|
|
2015-09-01 22:44:55 +03:00
|
|
|
// Load config
|
2018-04-29 17:37:07 +03:00
|
|
|
const config = require('./config');
|
2015-06-20 15:08:25 +03:00
|
|
|
|
2017-03-12 18:36:32 +02:00
|
|
|
|
|
|
|
// Load new plugins
|
2018-04-29 17:37:07 +03:00
|
|
|
const PluginManager = require('./plugins/pluginManager.js');
|
|
|
|
const pluginManager = new PluginManager(config);
|
2017-03-12 18:36:32 +02:00
|
|
|
pluginManager.loadAllPlugins();
|
|
|
|
|
2015-09-02 21:13:39 +03:00
|
|
|
// Configure logger
|
|
|
|
// create a write stream (in append mode)
|
2018-04-29 17:37:07 +03:00
|
|
|
const logDirectory = __dirname + '/log';
|
2015-09-02 21:13:39 +03:00
|
|
|
// ensure log directory exists
|
|
|
|
if(!fs.existsSync(logDirectory)) {
|
2018-04-29 17:37:07 +03:00
|
|
|
fs.mkdirSync(logDirectory);
|
2015-09-02 21:13:39 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
var logger = new (winston.Logger)({
|
2018-04-29 17:37:07 +03:00
|
|
|
transports: [
|
|
|
|
new (winston.transports.Console)(),
|
|
|
|
new (winston.transports.DailyRotateFile)({
|
|
|
|
filename: logDirectory + '/ircbot.log',
|
|
|
|
datePattern: '.yyyy-MM-dd',
|
|
|
|
maxsize: 20000
|
|
|
|
})
|
|
|
|
]
|
2015-09-02 21:13:39 +03:00
|
|
|
});
|
|
|
|
|
2017-03-12 18:36:32 +02:00
|
|
|
if(!config.irc.connect) {
|
2018-04-29 17:37:07 +03:00
|
|
|
logger.info('Not connecting to IRC. Exit');
|
|
|
|
return;
|
2017-03-12 18:36:32 +02:00
|
|
|
}
|
|
|
|
|
2015-09-01 22:44:55 +03:00
|
|
|
// Start client
|
|
|
|
var client = new irc.Client(config.irc.server, config.irc.nick, {
|
2018-04-29 17:37:07 +03:00
|
|
|
debug: true,
|
|
|
|
channels: config.irc.channels,
|
|
|
|
//floodProtection: true,
|
|
|
|
//sasl: true,
|
|
|
|
millisecondsOfSilenceBeforePingSent: 60000,
|
2015-09-01 22:44:55 +03:00
|
|
|
});
|
2015-07-17 01:12:59 +03:00
|
|
|
|
|
|
|
|
2015-09-01 22:44:55 +03:00
|
|
|
var handleMessage = function(from, to, message) {
|
2018-04-29 17:37:07 +03:00
|
|
|
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);
|
|
|
|
}
|
2015-09-01 22:44:55 +03:00
|
|
|
};
|
2015-07-17 01:12:59 +03:00
|
|
|
|
|
|
|
|
2015-09-01 22:44:55 +03:00
|
|
|
client.addListener('message', function (from, to, message) {
|
2018-04-29 17:37:07 +03:00
|
|
|
if(String(from) !== String(config.irc.nick)) {
|
|
|
|
handleMessage(from, to, message);
|
|
|
|
}
|
2015-09-01 22:44:55 +03:00
|
|
|
});
|
2015-07-17 01:12:59 +03:00
|
|
|
|
2015-09-01 22:44:55 +03:00
|
|
|
client.addListener('pm', function (from, message) {
|
2018-04-29 17:37:07 +03:00
|
|
|
if(String(from) !== String(config.irc.nick)) {
|
|
|
|
handleMessage(from, from, message);
|
|
|
|
}
|
2015-06-20 03:04:20 +03:00
|
|
|
});
|
2015-06-20 15:08:25 +03:00
|
|
|
|
2015-06-20 03:04:20 +03:00
|
|
|
client.addListener('join', function(channel, who) {
|
2018-04-29 17:37:07 +03:00
|
|
|
client.whois(who, function(result) {
|
|
|
|
console.log(result);
|
2015-06-20 15:08:25 +03:00
|
|
|
|
2018-04-29 17:37:07 +03:00
|
|
|
var members = config.members;
|
|
|
|
for(var memberNick in members) {
|
|
|
|
var member = members[memberNick];
|
2015-06-20 15:08:25 +03:00
|
|
|
|
2018-04-29 17:37:07 +03:00
|
|
|
if(result.host.match(member.host) && result.user.match(member.user)) {
|
|
|
|
client.send('MODE', channel, '+o', result.nick);
|
|
|
|
}
|
2015-06-20 15:08:25 +03:00
|
|
|
|
2018-04-29 17:37:07 +03:00
|
|
|
}
|
2015-06-20 15:08:25 +03:00
|
|
|
|
2018-04-29 17:37:07 +03:00
|
|
|
});
|
2015-06-20 03:04:20 +03:00
|
|
|
});
|
|
|
|
|
2015-06-20 15:08:25 +03:00
|
|
|
client.addListener('error', function(message) {
|
2018-04-29 17:37:07 +03:00
|
|
|
console.log('error: ', message);
|
2015-06-20 15:08:25 +03:00
|
|
|
});
|
|
|
|
|
|
|
|
client.addListener('names', function(channel, nicks) {
|
2018-04-29 17:37:07 +03:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-06-20 15:08:25 +03:00
|
|
|
});
|