diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cb75afc --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +config.json +node_modules/ diff --git a/config.sample.json b/config.sample.json new file mode 100644 index 0000000..239e555 --- /dev/null +++ b/config.sample.json @@ -0,0 +1,25 @@ +{ + "ym_account": { + "userid": "changeme", + "password": "changeme" + }, + "interval_in_seconds": 180, + "partners": [ + { + "name": "CHANGEME", + "ym_ids": [ + "ym0", + "ym1", + "ym2" + ], + "command": "s.1234", + "regex_pattern": "Rp\\.(\\d+)\\.", + "regex_match_index": 1 + } + ], + "redis": { + "host": "127.0.0.1", + "port": "6379" + }, + "test": 1 +} diff --git a/index.js b/index.js new file mode 100644 index 0000000..81160a0 --- /dev/null +++ b/index.js @@ -0,0 +1,114 @@ +var config = require("./config.json"); +var ym = require("yahoomessenger"); +var redis = require('redis'); + +var redisClient; + +function sendPM(destination, message) { + console.log("SEND " + destination + ": " + message); + if (!config.test) { + ym.sendPM(destination, message); + } + +} + +function parseBalance(partner, message) { + try { + var re = new RegExp(partner.regex_pattern); + var match = message.match(re); + return match[partner.regex_match_index]; + } + catch(err) { + console.log("Exception on parseBalance: " + err); + return; + } +} + +function onPM(data) { + console.log("RECEIVE " + data.sender + ': ' + data.message); + + var partner = getPartnerFromMessage(data.sender); + if (!partner) { + console.log('Invalid sender'); + return; + } + + console.log("Message is from known sender: " + data.sender + "(" + partner.name + ")"); + var balance = parseBalance(partner, data.message); + if (balance) { + console.log("Balance di " + partner.name + ": " + balance); + saveBalanceToRedis(partner, balance); + } +} + +function saveBalanceToRedis(partner, balance) { + var key = 'balance.gw:' + partner.name; + redisClient.set(key, Number(balance)); + redisClient.expire(key, 3600*24*7); +} + +function getPartnerFromMessage(sender) { + var partner_count = config.partners.length; + + for (var i = 0; i < partner_count; i++) { + var partner = config.partners[i]; + var ym_ids = partner.ym_ids; + var ym_count = ym_ids.length; + + for (var j = 0; j < ym_count; j++) { + if (sender == ym_ids[j]) { + return partner; + } + } + + } + + return; + +} + +function checkAllBalance() { + var count = config.partners.length; + for (var i = 0; i < count; i++) { + var partner = config.partners[i]; + + console.log("Checking balance for " + partner.name); + + var ym_idx = Math.round(Math.random() * (partner.ym_ids.length - 1)); + sendPM(partner.ym_ids[ym_idx], partner.command); + } +} + + +try { + redisClient = redis.createClient(config.redis.port, config.redis.host); +} catch(err) { + logger.info("Error creating redis client"); +} + + +ym.newInstance(); + +ym.on("ready", function() { + ym.login(config.ym_account.userid, config.ym_account.password); +}); + +ym.on('loginSuccessful', function(data) { + console.log("Login successful as: " + data.firstname + " " + data.lastname + " (" + data.user_id + ")"); + + + checkAllBalance(); + + var sleepTime = config.interval_in_seconds * 1000; + if (config.test) { + sleepTime = 1000; + } + setInterval(checkAllBalance, sleepTime); +}); + +ym.on('buddyAddRequest', function(data) { + ym.acceptAddBuddy(data.username); + console.log("Add budy: " + data.username); +}); + +ym.on('pm', onPM); diff --git a/package.json b/package.json new file mode 100644 index 0000000..0a301fd --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "sate24-ym-balance", + "version": "1.0.0", + "description": "Tools tuk check balance via YM", + "main": "index.js", + "scripts": { + "test": "mocha" + }, + "repository": { + "type": "git", + "url": "git@gitlab.kodesumber.com:reload97/sate24-ym-balance.git" + }, + "keywords": [ + "st24", + "ppob", + "reload97", + "r97", + "ym", + "yahoo", + "yahoomessenger" + ], + "author": "Adhidarma Hadiwinoto <me@adhisimon.org>", + "license": "ISC", + "dependencies": { + "redis": "^2.6.0-2", + "yahoomessenger": "^0.1.3-Beta" + } +}