From 29a360eb6635af3c10c8ae8e77e83f888b7b33ac Mon Sep 17 00:00:00 2001
From: Adhidarma Hadiwinoto <me@adhisimon.org>
Date: Thu, 11 Aug 2016 09:57:05 +0700
Subject: [PATCH] delay dan isOnline

---
 config.ini |  9 +++++++++
 index.js   | 68 +++++++++++++++++++++++++++++++++++++-------------------------
 2 files changed, 50 insertions(+), 27 deletions(-)
 create mode 100644 config.ini

diff --git a/config.ini b/config.ini
new file mode 100644
index 0000000..3c9f85a
--- /dev/null
+++ b/config.ini
@@ -0,0 +1,9 @@
+[globals]
+smsc=YAHOOIN0
+username=jkt_trx02
+password=payungselandi5880
+evo_url=http://ip-evo:9192/report/im_direct.jsp
+listen_port=24232
+msisdn_suffix=@yahoo.com
+greeting_prefix=Pesan anda telah diterima dan akan segera diproses:
+log_level=verbose
diff --git a/index.js b/index.js
index 322944e..3127b3f 100644
--- a/index.js
+++ b/index.js
@@ -1,3 +1,4 @@
+var ym = require('yahoomessenger');
 var http = require('http');
 var url = require('url');
 var winston = require('winston');
@@ -15,6 +16,7 @@ var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8'));
 var keepalive_interval = 60 * 1000;
 var last_message_hash = '';
 var log_level = 'info';
+var isOnline = false;
 
 if (config.globals.log_level) {
     log_level = config.globals.log_level;
@@ -38,21 +40,28 @@ var logger = new (winston.Logger)({
   ]
 });
 
-
-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});
+    isOnline = true;
 }
 
 function sendMessage(destination, message) {
-    logger.info('Sending YM message', {from: config.globals.username, to: destination, message: message});
-    ym.sendPM(destination, message);
+    if (isOnline) {
+        logger.info('Sending YM message', {from: config.globals.username, to: destination, message: message});
+        ym.sendPM(destination, message);
+    }
+    else {
+        logger.warn('YM is not online yet, retrying to send message in 2 secs', {to: destination, msg: message});
+        setTimeout(
+            sendMessage,
+            2000,
+            destination, message
+        )
+    }
 }
 
 function sendIgnoreResponse(destination, message) {
@@ -62,21 +71,21 @@ function sendIgnoreResponse(destination, message) {
 function onPm(data) {
     logger.info('Incoming message via YM', {data: data});
     var message = striptags(data.message);
-    
+
     var message_hash = data.sender + ': ' + data.message;
     if (message_hash == last_message_hash) {
         logger.warn('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);
-    
+
     forwardMessageToEvo(data.sender, message, formatTimestamp(data.time));
 }
 
@@ -94,12 +103,12 @@ function onBuddyAddRequest(data) {
 function onHttpIncomingMessage(request, response) {
     var qs = url.parse(request.url, true).query;
     logger.verbose("onHttpIncomingMessage()", {qs: qs});
-    
+
     // abaikan balikan ping
     if (qs.to == config.globals.ping_ym_id) {
         return;
     }
-    
+
     var destination = qs.to.replace(config.globals.msisdn_suffix, '');
     logger.info('Sending YM message from ' + config.globals.username + ' to ' + destination + ': ' + qs.msg);
     sendMessage(destination, qs.msg);
@@ -125,43 +134,43 @@ function forwardMessageToEvo(sender, message, ts) {
             ts: ts
         }
     };
-    
+
     logger.verbose("Forwarding message to evo", {request_opts: opts});
     request(opts, function(err, response, body) {
         if (err) {
             logger.warn('Error forwarding to evo: ' + err);
             return;
         }
-        
+
         if (response.statusCode != 200) {
             logger.warn('HTTP Status from evo: ' + response.statusCode, {status: response.statusCode, body: body});
             return;
         }
-        
+
         logger.verbose('Got response from evo', {body: body});
-        
+
         xmlparser(body, function(xmlerr, parsedResponse) {
             if (xmlerr) {
                 logger.verbose('Evo response not in xml format');
                 return;
             }
-            
-            return; 
-            
+
+            return;
+
             logger.info('Evo response in xml format', {response: parsedResponse});
             if (parsedResponse.response.text) {
                 sendMessage(sender, parsedResponse.response.text[0].trim());
             }
         });
-        
-        
+
+
     });
-    
-    
+
+
     // kirim ping 1 detik setelah pesan agar segera diproses
     if (config.globals.send_ping_to_evo == '1') {
         setTimeout(function() {
-            
+
             var pingOpts = {
                 url: config.globals.evo_url,
                 qs: {
@@ -171,9 +180,9 @@ function forwardMessageToEvo(sender, message, ts) {
                     ts: strftime('%F %T')
                 }
             };
-            
+
             logger.verbose('Sending ping message', {opts: pingOpts});
-            
+
             request(pingOpts, function(err, response, body) {
                 if (err) {
                     logger.warn('Error send PING to evo: ' + err);
@@ -186,7 +195,7 @@ function forwardMessageToEvo(sender, message, ts) {
 
 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);
@@ -199,7 +208,12 @@ ym.on('loginSuccessful', onLoginSuccessful);
 ym.on('pm', onPm);
 ym.on('buddyAddRequest', onBuddyAddRequest);
 
-setInterval(function() { 
+setTimeout(function() {
+    ym.newInstance,
+    3000
+})
+
+setInterval(function() {
     logger.verbose('Sending keepalive packet');
     ym.keepAlive();
 }, keepalive_interval);
-- 
1.9.0