var YahooMessenger = require("yahoomessenger"); var striptags = require('striptags'); var db = require('./db.js'); var oldMessages = []; var config; var logger; 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); } } ); } function pm(destination, message) { logger.info("Sending to " + destination + ": " + message); YahooMessenger.sendPM(destination, message); } 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; } pm(destination, message); } } var keepAliveTimer; var _keepAliveLoop = function() { logger.info('Keep alive loop'); YahooMessenger.keepAlive(); keepAliveLoop(); } function isAdmin(user) { var admins = config.yahoomessenger.admin.split(','); return (admins.indexOf(user) >= 0); } function keepAliveLoop() { keepAliveTimer = setTimeout(_keepAliveLoop, config.yahoomessenger.keepalive_interval * 1000); } function login(){ logger.info("Login to YM as " + config.yahoomessenger.username) YahooMessenger.login(config.yahoomessenger.username, config.yahoomessenger.password); } function logout() { logger.info("Logout from YM"); clearTimeout(keepAliveTimer); YahooMessenger.logout(); } function relogin() { logout(); YahooMessenger.newInstance(); } function start(_config, _logger) { config = _config; logger = _logger; function onReady() { login(); } function onLoginSuccesful(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 onBuddyAddRequest(data) { logger.info("Got request to add buddy from " + data.username); YahooMessenger.acceptAddBuddy(data.username); } function onPM(data) { var direction = 'IN'; if (config.globals.debug == 1) { console.log(data); } // check duplicate message if (oldMessages.indexOf(data.message_id) >= 0) { return; } oldMessages.unshift(data.message_id); if (oldMessages.length > 30) { oldMessages = oldMessages.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); pm(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); pm(target, messageToForward); } } } db_connection = db.start(config.db.host, config.db.username, config.db.password, config.db.name, logger); YahooMessenger.newInstance(); YahooMessenger.on('ready', onReady); YahooMessenger.on('loginSuccessful', onLoginSuccesful); YahooMessenger.on('buddyAddRequest', onBuddyAddRequest); YahooMessenger.on('pm', onPM); return YahooMessenger; } exports.start = start; exports.broadcast = broadcast; exports.pm = pm; exports.logout = logout; exports.relogin = relogin;