Commit 3d3a86f54fca8342e524ea7391649057d09df306

Authored by Adhidarma Hadiwinoto
0 parents
Exists in master

first commit

Showing 5 changed files with 180 additions and 0 deletions Side-by-side Diff

... ... @@ -0,0 +1,2 @@
  1 +node_modules/
  2 +logs/log.*
... ... @@ -0,0 +1 @@
  1 +YM Center for ST24
... ... @@ -0,0 +1,144 @@
  1 +var http = require('http');
  2 +var url = require('url');
  3 +var winston = require('winston');
  4 +var strftime = require('strftime');
  5 +var strptime = require('micro-strptime').strptime;
  6 +var request = require('request');
  7 +var striptags = require('striptags');
  8 +var fs = require('fs');
  9 +var ini = require('ini');
  10 +
  11 +var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8'));
  12 +
  13 +var keepalive_interval = 60 * 1000;
  14 +var last_message_hash = '';
  15 +var log_level = 'info';
  16 +
  17 +if (config.globals.log_level) {
  18 + log_level = config.globals.log_level;
  19 +}
  20 +
  21 +var logger = new (winston.Logger)({
  22 + transports: [
  23 + new (winston.transports.Console)({
  24 + timestamp: function() {
  25 + return strftime('%F %T', new Date());
  26 + },
  27 + level: log_level
  28 + }),
  29 + new (winston.transports.DailyRotateFile)({
  30 + filename: __dirname + '/logs/log',
  31 + timestamp: function() {
  32 + return strftime('%F %T', new Date());
  33 + },
  34 + level: log_level
  35 + })
  36 + ]
  37 +});
  38 +
  39 +
  40 +var ym = require('yahoomessenger');
  41 +ym.newInstance();
  42 +
  43 +function onReady(){
  44 + ym.login(config.globals.username, config.globals.password);
  45 +}
  46 +
  47 +function onLoginSuccessful(data) {
  48 + logger.info('Login successful as ' + data.firstname + ' ' + data.lastname + ' (' + data.user_id + ')', {data: data});
  49 +}
  50 +
  51 +function sendIgnoreResponse(destination, message) {
  52 + ym.sendPM(destination, "Pesan anda diabaikan, silahkan diulang beberapa saat lagi jika diperlukan: " + message);
  53 +}
  54 +
  55 +function onPm(data) {
  56 + logger.info('onPM()', {data: data});
  57 +
  58 + var message = striptags(data.message);
  59 +
  60 + var message_hash = data.sender + ': ' + data.message;
  61 + if (message_hash == last_message_hash) {
  62 + logger.info('Ignoring duplicate message', {data: data});
  63 + return;
  64 + }
  65 + last_message_hash = message_hash;
  66 +
  67 + var greeting_prefix = "Pesan anda telah diterima dan akan segera diproses:";
  68 + if (config.globals.greeting_prefix) {
  69 + greeting_prefix = config.globals.greeting_prefix;
  70 + }
  71 +
  72 + ym.sendPM(data.sender, greeting_prefix + ' ' + message);
  73 +
  74 + forwardMessageToAAA(data.sender, message);
  75 +}
  76 +
  77 +function onOfflinePM(data) {
  78 + logger.verbose('onOfflinePM()', {data: data});
  79 + sendIgnoreResponse(data.sender, data.message);
  80 +}
  81 +
  82 +function onBuddyAddRequest(data) {
  83 + logger.info('onBuddyAddRequest()', {data: data});
  84 + ym.acceptAddBuddy(data.username);
  85 + logger.info('Accept buddy add request: ' + data.username, {data: data});
  86 +}
  87 +
  88 +function onHttpIncomingMessage(request, response) {
  89 + var qs = url.parse(request.url, true).query;
  90 + logger.info("onHttpIncomingMessage()", {qs: qs});
  91 + response.end('OK');
  92 +
  93 + logger.info('Sending message to ' + qs.PhoneNumber + ': ' + qs.text);
  94 + ym.sendPM(qs.to, qs.msg);
  95 +
  96 +}
  97 +
  98 +function formatTimestamp(ts) {
  99 + var _ts = strptime(ts, '%A %b %d %Y %H:%M:%S GMT%z');
  100 + return strftime('%F %T', _ts);
  101 +}
  102 +
  103 +function forwardMessageToAAA(sender, message) {
  104 + var request_opts = {
  105 + url: config.globals.aaa,
  106 + qs: {
  107 + PhoneNumber: sender,
  108 + Text: message,
  109 + Res_Port: config.globals.listen_port,
  110 + SMSCID: config.globals.smscid
  111 + }
  112 + };
  113 +
  114 + request(request_opts, function(err, response, body) {
  115 + if (err) {
  116 + logger.info('Request error: ' + err);
  117 + return;
  118 + }
  119 +
  120 + logger.info('Response: ' + response);
  121 + logger.info('Body: ' + body);
  122 +
  123 + });
  124 +}
  125 +
  126 +function createHttpServer() {
  127 + logger.verbose('createHttpServer()');
  128 +
  129 + var httpServer = http.createServer(onHttpIncomingMessage);
  130 + httpServer.listen(config.globals.listen_port, function(){
  131 + logger.info("HTTP server listening on " + config.globals.listen_port);
  132 + });
  133 +}
  134 +
  135 +createHttpServer();
  136 +ym.on('ready', onReady);
  137 +ym.on('loginSuccessful', onLoginSuccessful);
  138 +ym.on('pm', onPm);
  139 +ym.on('buddyAddRequest', onBuddyAddRequest);
  140 +
  141 +setInterval(function() {
  142 + logger.info('Sending keepalive packet');
  143 + ym.keepAlive();
  144 +}, keepalive_interval);
... ... @@ -0,0 +1,33 @@
  1 +{
  2 + "name": "evo-ym-center",
  3 + "version": "0.0.1",
  4 + "description": "EVO YM Center",
  5 + "main": "index.js",
  6 + "scripts": {
  7 + "test": "mocha test"
  8 + },
  9 + "repository": {
  10 + "type": "git",
  11 + "url": "http://gitlab.kodesumber.com/adhisimon/evo-ym-center.git"
  12 + },
  13 + "keywords": [
  14 + "evo",
  15 + "guchi",
  16 + "gentong",
  17 + "yahoo",
  18 + "ym",
  19 + "ppob"
  20 + ],
  21 + "author": "Adhidarma Hadiwinoto <gua@adhisimon.org>",
  22 + "license": "BSD",
  23 + "dependencies": {
  24 + "ini": "~1.3.4",
  25 + "yahoomessenger": "~0.1.3-Beta",
  26 + "url": "~0.11.0",
  27 + "winston": "~1.1.1",
  28 + "strftime": "~0.9.2",
  29 + "micro-strptime": "~0.2.2",
  30 + "request": "~2.65.0",
  31 + "striptags": "~2.0.4"
  32 + }
  33 +}