var http = require('http'); var url = require('url'); var winston = require('winston'); var strftime = require('strftime'); var strptime = require('micro-strptime').strptime; var request = require('request'); var striptags = require('striptags'); var fs = require('fs'); var ini = require('ini'); var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8')); var last_message_hash; var logger = new (winston.Logger)({ transports: [ new (winston.transports.Console)({ timestamp: function() { return strftime('%F %T', new Date()); } }), new (winston.transports.DailyRotateFile)({ filename: __dirname + '/logs/log', timestamp: function() { return strftime('%F %T', new Date()); } }) ] }); var ym = require('yahoomessenger'); ym.newInstance(); function onReady(){ ym.login(config.globals.username, config.globals.password); } function onLoginSuccessful(data) { logger.info('Login successful as ' + data.firstname + ' ' + data.lastname + ' (' + data.user_id + ')', {data: data}); } function sendIgnoreResponse(destination, message) { ym.sendPM(destination, "Pesan anda diabaikan, silahkan diulang beberapa saat lagi jika diperlukan: " + message); } function onPm(data) { logger.info('onPM()', {data: data}); var message = striptags(data.message); var new_message_hash = data.sender + ': ' + message; if (last_message_hash == new_message_hash) { return; } last_message_hash = new_message_hash; ym.sendPM(data.sender, "Pesan anda telah diterima dan akan segera diproses: " + message); forwardMessageToEvo(data.sender, message, formatTimestamp(data.time)); } function onOfflinePM(data) { logger.info('onOfflinePM()', {data: data}); sendIgnoreResponse(data.sender, data.message); } function onBuddyAddRequest(data) { logger.info('onBuddyAddRequest()', {data: data}); ym.acceptAddBuddy(data.username); logger.info('Accept buddy add request: ' + data.username, {data: data}); } function onHttpIncomingMessage(request, response) { var qs = url.parse(request.url, true).query; logger.info("onHttpIncomingMessage()", {qs: qs}); var destination = qs.to.replace(config.globals.msisdn_suffix, ''); ym.sendPM(destination, qs.msg); response.end('OK'); } function formatTimestamp(ts) { var _ts = strptime(ts, '%A %b %d %Y %H:%M:%S GMT%z'); return strftime('%F %T', _ts); } function forwardMessageToEvo(sender, message, ts) { var msisdn = sender + config.globals.msisdn_suffix; var opts = { url: config.globals.evo_url, qs: { msg: message, msisdn: msisdn, smsc: config.globals.smsc, ts: ts } }; logger.info("Forwarding message to evo", {request_opts: opts}); request(opts, function(err, response, body) { if (err) { logger.warn('Error forwarding to evo: ' + err); return; } }); } function createHttpServer() { logger.verbose('createHttpServer()'); var httpServer = http.createServer(onHttpIncomingMessage); httpServer.listen(config.globals.listen_port, function(){ logger.info("HTTP server listening on " + config.globals.listen_port); }); } ym.on('ready', onReady); ym.on('loginSuccessful', onLoginSuccessful); ym.on('pm', onPm); ym.on('buddyAddRequest', onBuddyAddRequest);