index.js 6.07 KB
var iniparser = require('iniparser');
var config = iniparser.parseSync('./config.ini');

if (config.yahoomessenger.keepalive_interval == null) {
  config.yahoomessenger.keepalive_interval = 60;
}

var strftime = require('strftime');

var loggedPM = [];

var logger = require('winston');
logger.remove(logger.transports.Console);
logger.add(logger.transports.Console, { timestamp: function() { return (strftime('%F %T'));  }});

var db = require('./db.js');
db_connection = db.start(config.db.host, config.db.username, config.db.password, config.db.name, logger);

function isAdmin(user) {
  var admins = config.yahoomessenger.admin.split(',');

  return (admins.indexOf(user) >= 0);
}

function sendPM(destination, message) {
    try {
        logger.info("Sending to " + destination + ": " + message);
        YahooMessenger.sendPM(destination, message);
    }
    catch (e) {
        logger.info("Something wrong");
        logger.info(e);
        logger.info("Try to reconnecting to yahoo messenger");
        YahooMessenger.login(config.yahoomessenger.username, config.yahoomessenger.password);
        return false;
    }

    return true;

}

function broadcast(destinations, message, exclude) {
    var destinations = destinations.split(',');
    var destinationCount = destinations.length;

    for (var i=0; i < destinationCount; i++) {
        destination = destinations[i];
        if (destination == exclude) {
            continue;
        }

        sendPM(destination, message);
    }
}

var _keepAliveLoop = function() {
    logger.info('Keep alive loop');

    try {
        YahooMessenger.keepAlive();
    }
    catch(e) {
        logger.info("Something wrong");
        logger.info(e);
        logger.info("Try to reconnecting to yahoo messenger");
        YahooMessenger.login(config.yahoomessenger.username, config.yahoomessenger.password);
        return;
    }

    keepAliveLoop();
}

function keepAliveLoop() {
    setTimeout(_keepAliveLoop, config.yahoomessenger.keepalive_interval * 1000);
}

function insertMessages(db_connection, logger_id, direction, partner, message, sentdate) {

    db_connection.query(
        'INSERT INTO messages SET ?',
        {
            transport: 'YAHOO',
            logger: logger_id,
            direction: direction,
            partner: partner,
            message: message,
            sentdate: sentdate,
        },

        function(err) {
            if (err != null) {
                logger.error("Error on inserting messages to DB, error: " + err);
            }
        }
    );
}

var striptags = require('striptags');

var YahooMessenger = require("yahoomessenger");
YahooMessenger.newInstance();

function onYmLoginSuccesful(data){
    logger.info('Online on YM as ' + data.user_id + ' (' + data.firstname + ' ' + data.lastname + ')');

    if (config.yahoomessenger.status) {
        logger.info('Set status to: ' + config.yahoomessenger.status);
        YahooMessenger.setCustomAwayStatus(config.yahoomessenger.status);
    };

    broadcast(config.yahoomessenger.report_to, config.yahoomessenger.report_message);

    keepAliveLoop();
}

function onYmPM(data) {
    var direction = 'IN';

    if (config.globals.debug == 1) {
      console.log(data);
    }

    // check duplicate message
    if (loggedPM.indexOf(data.message_id) >= 0) {
        return;
    }

    loggedPM.unshift(data.message_id);
    if (loggedPM.length > 30) {
        loggedPM = loggedPM.slice(0, 10);
    }

    partner = data.sender;
    if (partner == data.user_id) {
        partner = data.target_user;
        direction = 'OUT';
    }

    var message = striptags(data.message).trim();

    logger.info('New ' + direction + ' message from ' + data.sender + ' to ' +  data.target_user + ': ' + message);

    if (isAdmin(data.sender)) {
        logger.info('Sender (' + data.sender + ') is an admin');
    }

    var sentdate = Date.parse(data.time);
    var strftime = require('strftime');
    sentdate = strftime('%Y-%m-%d %H:%M:%S', sentdate);

    insertMessages(
        db_connection,
        data.user_id,
        direction,
        partner,
        message,
        sentdate
    );

    broadcast(config.yahoomessenger.report_to, '@' + data.sender + ': ' + message, partner);

    if ((direction == 'IN') && (isAdmin(partner))) {
        if (message.charAt(0) == '@') {
            target = message.split(' ', 1).join();
            target = target.slice(1);

            var messageToForward = message.replace('@' + target, '').trim();
            if (messageToForward == '') {
                return;
            }

            logger.info('Forward to ' + target + ': ' + messageToForward);
            sendPM(target, '@' + partner + ': ' + messageToForward);

        } else if (message.charAt(0) == '+') {
            target = message.split(' ', 1).join();
            target = target.slice(1);

            var messageToForward = message.replace('+' + target, '').trim();
            if (messageToForward == '') {
                return;
            }

            logger.info('Clean forward to ' + target + ': ' + messageToForward);
            sendPM(target, messageToForward);
        }

    }
}

function onYmBuddyAddRequest(data) {
    logger.info("Got request to add buddy from " + data.username);
    YahooMessenger.acceptAddBuddy(data.username);
}


function onYmReady(){
    logger.info("Going to online on YM")
    YahooMessenger.login(config.yahoomessenger.username, config.yahoomessenger.password);
}

YahooMessenger.on('ready', onYmReady);
YahooMessenger.on('loginSuccessful', onYmLoginSuccesful);
YahooMessenger.on('pm', onYmPM);
YahooMessenger.on('buddyAddRequest', onYmBuddyAddRequest);

var http = require('http');
var url = require('url');

function onHttpRequest(request, response) {
    var pathname = url.parse(request.url).pathname;
    logger.info('Got HTTP request on ' + pathname);

    var queries = url.parse(request.url, true).query;
    console.log(queries);

    response.writeHead(200, {"Content-Type": "text/html"});
    response.write("Hello");
    response.end();
}

http.createServer(onHttpRequest).listen(config.httpserver.listen_port);
logger.info("HTTP server listening on " + config.httpserver.listen_port);