From 2833225fe1b8021e6d1ba8b6cd6d722a5cf8dae9 Mon Sep 17 00:00:00 2001 From: Adhidarma Hadiwinoto <adhisimon@gmail.com> Date: Tue, 17 Mar 2015 00:31:07 +0700 Subject: [PATCH] initial files --- .gitignore | 1 + config.sample.ini | 17 +++++++ db.js | 22 +++++++++ httpserver.js | 20 ++++++++ index.js | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 202 insertions(+) create mode 100644 .gitignore create mode 100644 config.sample.ini create mode 100644 db.js create mode 100644 httpserver.js create mode 100644 index.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2fa7ce7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +config.ini diff --git a/config.sample.ini b/config.sample.ini new file mode 100644 index 0000000..22a5b08 --- /dev/null +++ b/config.sample.ini @@ -0,0 +1,17 @@ +[yahoomessenger] +username=PLEASE_CHANGE_ME +password=PLEASE_CHANGE_ME +admin=PLEASE_CHANGE_ME +report_to=PLEASE_CHANGE_ME +report_message=PLEASE_CHANGE_ME +status=PLEASE_CHANGE_ME + +[db] +host=PLEASE_CHANGE_ME +name=PLEASE_CHANGE_ME +username=PLEASE_CHANGE_ME +password=PLEASE_CHANGE_ME + + +[httpserver] +listen_port=18881 diff --git a/db.js b/db.js new file mode 100644 index 0000000..ee45c9d --- /dev/null +++ b/db.js @@ -0,0 +1,22 @@ +var mysql = require('mysql'); + +function start(db_host, db_user, db_pass, db_name, logger) { + var connection = mysql.createConnection({ + host: db_host, + user: db_user, + password: db_pass, + database: db_name + }); + + logger.info("Connecting to db"); + connection.connect(); + + connection.on('error', function(err) { + logger.error("DB error: " + err.code); // 'ER_BAD_DB_ERROR' + }); + + + return connection; +} + +exports.start = start diff --git a/httpserver.js b/httpserver.js new file mode 100644 index 0000000..826a5b2 --- /dev/null +++ b/httpserver.js @@ -0,0 +1,20 @@ +var http = require('http'); +var url = require('url'); + +function start() { + function onHttpRequest(request, response) { + var pathname = url.parse(request.url).pathname; + console.log('Request for ' + pathname + ' received'); + + console.log(url.parse(request.url, true)); + + response.writeHead(200, {"Content-Type": "text/html"}); + response.write("Hello"); + response.end(); + } + + http.createServer(onHttpRequest).listen(18881); + console.log("HTTP server started"); +} + +exports.start = start; diff --git a/index.js b/index.js new file mode 100644 index 0000000..728e266 --- /dev/null +++ b/index.js @@ -0,0 +1,142 @@ +var iniparser = require('iniparser'); +var config = iniparser.parseSync('./config.ini'); + +var strftime = require('strftime'); + +var POLLING_INTERVAL = 3600 * 1000; +var pollingTimer; + +var lastDataOnPM; + +var logger = require('winston'); +logger.remove(logger.transports.Console); +logger.add(logger.transports.Console, { timestamp: function() { return (strftime('%F %T')); }}); + +var db = require('./db.js'); +db_connection = db.start(config.db.host, config.db.username, config.db.password, config.db.name, logger); + +function absen() { + broadcast(config.yahoomessenger.report_message, config.yahoomessenger.report_to); +} + +function broadcast(destinations, message) { + var destinations = destinations.split(','); + var destinationCount = destinations.length; + + for (var i=0; i < destinationCount; i++) { + destination = destinations[i] + logger.info('Sending message to ' + destination); + YahooMessenger.sendPM(destination, message); + } +} + +var pollingLoop = function() { + logger.info('Polling loop'); + + absen(); + + pollingTimer = setTimeout(pollingLoop, POLLING_INTERVAL); +} + +function insertMessages(db_connection, logger_id, direction, partner, message, sentdate) { + + db_connection.query( + 'INSERT INTO messages SET ?', + { + transport: 'YAHOO', + logger: logger_id, + direction: direction, + partner: partner, + message: message, + sentdate: sentdate, + }, + + function(err) { + if (err != null) { + logger.error("Error on inserting messages to DB, error: " + err); + } + } + ); +} + +var striptags = require('striptags'); + +var YahooMessenger = require("yahoomessenger"); +YahooMessenger.newInstance(); + +YahooMessenger.on('ready', function onReady(){ + logger.info("Going to online on YM") + YahooMessenger.login(config.yahoomessenger.username, config.yahoomessenger.password); +}); + +YahooMessenger.on('loginSuccessful', function onLoginSuccessful(data){ + logger.info('Online on YM as ' + data.user_id + ' (' + data.firstname + ' ' + data.lastname + ')'); + + if (config.yahoomessenger.status) { + logger.info('Set status to: ' + config.yahoomessenger.status); + YahooMessenger.setCustomAwayStatus(config.yahoomessenger.status); + }; + + pollingLoop(); +}); + +YahooMessenger.on('pm', function(data){ + //console.log(data); + + if (lastDataOnPM != null) { + if ((lastDataOnPM.sender == data.sender) && (lastDataOnPM.message == data.message)) { + //logger.info('Ignoring duplicate message detected'); + return; + } + } + + lastDataOnPM = data; + + var message = striptags(data.message) + console.log("message: " + message); + + logger.info('New message received from ' + data.user_id + ': ' + message); + + var sentdate = Date.parse(data.time); + var strftime = require('strftime'); + sentdate = strftime('%Y-%m-%d %H:%M:%S', sentdate); + + insertMessages( + db_connection, + data.user_id, + 'IN', + data.sender, + message, + sentdate + ); + + broadcast(config.yahoomessenger.report_to, data.sender + '-> ' + message); + +}); + +YahooMessenger.on('buddyAddRequest', function(data) { + logger.info("Got request to add buddy from " + data.username); + YahooMessenger.acceptAddBuddy(data.username); +}); + +function isSenderIsAdmin(ym, data) { + +} + +var http = require('http'); +var url = require('url'); + +function onHttpRequest(request, response) { + var pathname = url.parse(request.url).pathname; + logger.info('Got HTTP request on ' + pathname); + + var queries = url.parse(request.url, true).query; + console.log(queries); + + response.writeHead(200, {"Content-Type": "text/html"}); + response.write("Hello"); + response.end(); +} + +http.createServer(onHttpRequest).listen(config.httpserver.listen_port); +logger.info("HTTP server listening on " + config.httpserver.listen_port); -- 1.9.0