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