diff --git a/index.js b/index.js
index 7abb77a..4417550 100644
--- a/index.js
+++ b/index.js
@@ -6,6 +6,25 @@ 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 + '/log',
+      timestamp: function() {
+        return strftime('%F %T', new Date());
+      }
+    })
+  ]
+});
+
+
 var ym = require('yahoomessenger');
 ym.newInstance();
 
@@ -14,33 +33,48 @@ function onReady(){
 }
 
 function onLoginSuccessful(data) {
-    console.log('Login successful as ' + data.firstname + ' ' + data.lastname + ' (' + data.username + ')');
-    console.log(data);
+    logger.info('Login successful as ' + data.firstname + ' ' + data.lastname + ' (' + data.username + ')', {data: data});
+}
+
+function sendIgnoreResponse(destination, message) {
+    ym.sendPM(destination, "Pesan anda diabaikan, silahkan diulang beberapa saat lagi jika diperlukan: " + message);
 }
 
 function onPm(data) {
-    console.log('onPM()');
-    console.log(data);
+    logger.info('onPM()', {data: data});
+    
+    var new_message_hash = data.sender + ': ' + data.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: " + data.message);
 }
 
 function onOfflinePM(data) {
-    console.log('onOfflinePM()');
-    console.log(data);
+    logger.info('onOfflinePM()', {data: data});
+    sendIgnoreResponse(data.sender, data.message);
 }
 
 function onBuddyAddRequest(data) {
-    console.log('onBuddyAddRequest()');
-    console.log(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});
 }
 
 function createHttpServer() {
-    console.log('createHttpServer()');
+    logger.verbose('createHttpServer()');
     
-    var httpServer = http.createServer(function(request,response) {
-        var qs = url.parse(request.url, true).query;
-        
+    var httpServer = http.createServer(onHttpIncomingMessage);
+    httpServer.listen(config.globals.listen_port, function(){
+        logger.info("HTTP server listening on " + config.globals.listen_port);
     });
 }