From efddc0f1c5822ac5a1f49441b340f198b17c30da Mon Sep 17 00:00:00 2001
From: Adhidarma Hadiwinoto <me@adhisimon.org>
Date: Wed, 20 Jul 2016 21:42:57 +0700
Subject: [PATCH] ready to test

---
 .gitignore   |   4 ++
 evo-im.js    | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 index.js     |  82 +++++++++++++++++++++++++++++++++++++++++
 logger.js    |  48 ++++++++++++++++++++++++
 logs/empty   |   0
 package.json |  30 +++++++++++++++
 6 files changed, 282 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 evo-im.js
 create mode 100644 logger.js
 create mode 100644 logs/empty
 create mode 100644 package.json

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..7a1d766
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+node_modules/
+logs/log*
+log.txt
+run.sh
diff --git a/evo-im.js b/evo-im.js
new file mode 100644
index 0000000..24fba13
--- /dev/null
+++ b/evo-im.js
@@ -0,0 +1,118 @@
+var strftime = require('strftime');
+var request = require('request');
+var xmlparser = require('xml2js').parseString;
+var http = require('http');
+var url = require('url');
+
+var config;
+var logger;
+
+function start(options) {
+    if (options && options.config) {
+        config = options.config;
+    }
+
+    if (options && options.logger) {
+        logger = options.logger;
+    }
+
+    createHttpServer();
+}
+
+function formatTimestamp(ms) {
+    return strftime('%F %T', new Date(ms));
+}
+
+function onMessage(sender, message, ts, sendMessage) {
+    var opts = {
+        url: config.globals.evo_url,
+        qs: {
+            msg: message,
+            msisdn: sender,
+            smsc: config.globals.smsc,
+            ts: formatTimestamp(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;
+
+            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: {
+                    msg: 'S.' + config.globals.ping_pin,
+                    msisdn: config.globals.ping_ym_id + config.globals.msisdn_suffix,
+                    smsc: config.globals.smsc,
+                    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);
+                    return;
+                }
+            });
+        }, 1000);
+    }
+}
+
+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);
+    response.end('OK');
+}
+
+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);
+    });
+}
+
+exports.start = start;
+exports.formatTimestamp = formatTimestamp;
+exports.onMessage = onMessage;
diff --git a/index.js b/index.js
index e69de29..0008e8a 100644
--- a/index.js
+++ b/index.js
@@ -0,0 +1,82 @@
+var telegram = require('node-telegram-bot-api');
+var logger = require('./logger.js').start();
+var evo = require('./evo-im.js');
+
+var config = require('./config.json');
+
+evo.start({
+    config: config,
+    logger: logger
+});
+
+var chat_ids = {};
+
+var options = {
+  webHook: {
+    port: config.globals.webhook_port,
+    key: __dirname+'/key.pem',
+    cert: __dirname+'/crt.pem'
+  }
+};
+
+var bot = new telegram(config.globals.token, options);
+bot.setWebHook(config.globals.webhook_prefix + config.globals.token, __dirname+'/crt.pem');
+
+function deleteChatId(from) {
+	delete chat_ids[from];
+}
+
+function sendMessage(destination, message) {
+	logger.info('Sending reply to ' + destination + ': ' + message);
+	var chat_id = chat_ids[destination];
+	bot.sendMessage(chat_id, message);
+}
+
+function createHttpResponseServer(){
+	var httpServer = http.createServer(function(request,response){
+		var qs = url.parse(request.url, true).query;
+		logger.info('Incoming request from SMSIN server:', {qs: qs})
+		//logger.info(qs);
+		response.end('OK');
+
+		sendMessage(qs.PhoneNumber, qs.text);
+	});
+	httpServer.listen(config.globals.listen_port, function(){
+		logger.info("listening on " + config.globals.listen_port);
+	})
+}
+createHttpResponseServer();
+
+bot.getMe().then(function (me) {
+  logger.info('Hi my name is %s!', me.username);
+});
+
+bot.on('text', function (msg) {
+	logger.info(msg);
+
+    var from = msg.from.username.toUpperCase() + config.globals.msisdn_suffix;
+
+	var now = Math.floor(new Date().getTime()/1000);
+
+	if (now - msg.date > config.globals.message_max_age){
+		var message = "Pesan anda diabaikan, silahkan diulang beberapa saat lagi jika diperlukan: " + msg.text;
+		logger.info(message, {msg: msg})
+		//bot.sendMessage(msg.chat.id, message);
+        sendMessage(from, message);
+		return;
+	}
+
+	chat_ids[from] = msg.chat.id;
+
+    var greeting_prefix = "Pesan anda telah diterima:";
+    if (config.globals.greeting_prefix) {
+        greeting_prefix = config.globals.greeting_prefix;
+    }
+
+	bot.sendMessage(msg.chat.id, greeting_prefix + ' ' + msg.text);
+    setTimeout(
+        evo.onMessage,
+        300,
+        from, msg.text, msg.date * 1000, sendMessage
+    );
+});
diff --git a/logger.js b/logger.js
new file mode 100644
index 0000000..59e20ec
--- /dev/null
+++ b/logger.js
@@ -0,0 +1,48 @@
+var strftime = require('strftime');
+var winston = require('winston');
+var fs = require('fs');
+
+var loggerTimestamp = function() {
+    return strftime('%F %T', new Date());
+}
+
+function start(options) {
+    var logDir = __dirname + '/logs'
+
+    var logLevel = 'debug';
+    if (options && options.logLevel) {
+        logLevel = options.logLevel;
+    }
+
+    if (!fs.existsSync(logDir)) {
+        fs.mkdirSync(logDir);
+    }
+
+    var logger = new winston.Logger({
+        transports: [
+            new (winston.transports.Console)({
+                timestamp: function() {
+                        return strftime('%F %T', new Date());
+                },
+                level: 'verbose',
+            }),
+
+            new(require('winston-daily-rotate-file')) ({
+                name: './log-file-txt',
+                filename: logDir + '/log.txt',
+                timestamp: loggerTimestamp,
+                formatter: function(options) {
+                    return options.timestamp()
+                        +' ' + options.level.toUpperCase()
+                        +' ' + (undefined !== options.message ? options.message : '')
+                        + (options.meta && Object.keys(options.meta).length ? '\n\t' + JSON.stringify(options.meta) : '' );
+                },
+                level: logLevel,
+            }),
+        ]
+    });
+
+    return logger;
+}
+
+exports.start = start;
diff --git a/logs/empty b/logs/empty
new file mode 100644
index 0000000..e69de29
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..b7406b1
--- /dev/null
+++ b/package.json
@@ -0,0 +1,30 @@
+{
+  "name": "evo-telegram-center",
+  "version": "1.0.0",
+  "description": "Telegram Center for EVO",
+  "main": "index.js",
+  "scripts": {
+    "test": "mocha"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git@gitlab.kodesumber.com:reload97/evo-telegram-center.git"
+  },
+  "keywords": [
+    "evo",
+    "telegram",
+    "ppob",
+    "reload97",
+    "r97"
+  ],
+  "author": "Adhidarma Hadiwinoto <me@adhisimon.org>",
+  "license": "ISC",
+  "dependencies": {
+    "node-telegram-bot-api": "^0.23.3",
+    "request": "^2.73.0",
+    "strftime": "^0.9.2",
+    "winston": "^2.2.0",
+    "winston-daily-rotate-file": "^1.1.5",
+    "xml2js": "^0.4.17"
+  }
+}
-- 
1.9.0