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 keepalive_interval = 60 * 1000; var last_message_hash = ''; var log_level = 'info'; if (config.globals.log_level) { log_level = config.globals.log_level; } var logger = new (winston.Logger)({ transports: [ new (winston.transports.Console)({ timestamp: function() { return strftime('%F %T', new Date()); }, level: log_level }), new (winston.transports.DailyRotateFile)({ filename: __dirname + '/logs/log', timestamp: function() { return strftime('%F %T', new Date()); }, level: log_level }) ] }); 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 onLoginError(data) { logger.warn('Login error', {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 message_hash = data.sender + ': ' + data.message; if (message_hash == last_message_hash) { logger.info('Ignoring duplicate message', {data: data}); return; } last_message_hash = message_hash; var greeting_prefix = "Pesan anda telah diterima dan akan segera diproses:"; if (config.globals.greeting_prefix) { greeting_prefix = config.globals.greeting_prefix; } ym.sendPM(data.sender, greeting_prefix + ' ' + message); forwardMessageToAAA(data.sender, message); } function onOfflinePM(data) { logger.verbose('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}); response.end('OK'); logger.info('Sending message to ' + qs.PhoneNumber + ': ' + qs.text); ym.sendPM(qs.to, qs.msg); } function formatTimestamp(ts) { var _ts = strptime(ts, '%A %b %d %Y %H:%M:%S GMT%z'); return strftime('%F %T', _ts); } function forwardMessageToAAA(sender, message) { var request_opts = { url: config.globals.aaa, qs: { PhoneNumber: sender, Text: message, Res_Port: config.globals.listen_port, SMSCID: config.globals.smscid } }; request(request_opts, function(err, response, body) { if (err) { logger.info('Request error: ' + err); return; } logger.info('Response: ' + response); logger.info('Body: ' + body); }); } 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); }); } createHttpServer(); ym.on('ready', onReady); ym.on('loginSuccessful', onLoginSuccessful); ym.on('loginError', onLoginError); ym.on('pm', onPm); ym.on('buddyAddRequest', onBuddyAddRequest); setInterval(function() { logger.info('Sending keepalive packet'); ym.keepAlive(); }, keepalive_interval);