Last active
April 28, 2017 18:17
-
-
Save arthurbarros/8378735 to your computer and use it in GitHub Desktop.
PoC: how your wallet reacts on panic buy/sell on litecoin currency
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var WebSocket = require('ws'), | |
Entities = require('html-entities').XmlEntities, | |
http = require('https'); | |
var TransportHelper = function(){} | |
TransportHelper.prototype.parse = function(data) | |
{ | |
data = JSON.parse(JSON.parse(data).data); | |
if(typeof data == 'string'){ | |
return JSON.parse(data); | |
} | |
return false; | |
} | |
TransportHelper.message = function(data, callback) | |
{ | |
if(data = this.parse(data)){ | |
callback(data); | |
} | |
} | |
var Wallet = function() | |
{ | |
this.ltc; | |
this.dollar; | |
} | |
Wallet.prototype.currentSituation = function(action, price) | |
{ | |
console.log('############################'); | |
console.log('Act:', action + ' Price: ' + price); | |
console.log('LTC ', number_format(this.ltc,8)); | |
console.log('USD ', number_format(this.dollar,2,'.',',')); | |
console.log('############################'); | |
} | |
var Dict = function(){ | |
this.buy = ['buy','buying','rise','up','pump','moon','gree','cny','CNY','spike']; | |
this.sell = ['sell','selling','crash','down','dump','earth core','red','boom']; | |
this.ltc = ['ltc','LTC','Ltc','litecoin','Litecoin', 'chikun','Chikun','CHIKUN']; | |
} | |
Dict.prototype.typeOrder = function(message) | |
{ | |
var buy = 0; | |
var sell = 0; | |
for(var index in this.buy){ | |
word = this.buy[index]; | |
buy += (message.split(word).length-1); | |
} | |
for(var index in this.sell){ | |
word = this.sell[index]; | |
sell += (message.split(word).length-1); | |
} | |
if(buy > sell){ | |
return 'buy'; | |
}else if(buy < sell){ | |
return 'sell'; | |
}else{ | |
return false; | |
} | |
} | |
Dict.prototype.ocurrLtc = function(message) | |
{ | |
var occur = 0; | |
for(var index in this.ltc){ | |
word = this.ltc[index] | |
occur += (message.split(word).length-1); | |
} | |
return occur; | |
} | |
var Trader = function() | |
{ | |
this.wallet; | |
this.dict; | |
} | |
Trader.prototype.act = function(action) | |
{ | |
if((act = this.dict.typeOrder(action)) && this.dict.ocurrLtc(action)){ | |
if(act == 'buy'){ | |
this.buyLtc(0.1); | |
}else{ | |
this.sellLtc(0.1); | |
} | |
} | |
} | |
Trader.prototype.setDict = function(dict) | |
{ | |
this.dict = dict; | |
} | |
Trader.prototype.setWallet = function(wallet) | |
{ | |
this.wallet = wallet; | |
} | |
Trader.prototype.getWallet = function() | |
{ | |
return this.wallet; | |
} | |
Trader.prototype.sellLtc = function(amount) | |
{ | |
var self = this; | |
self.getPrice(function(price){ | |
if(self.wallet.ltc >= amount){ | |
self.wallet.dollar += (price*amount)*0.98; | |
self.wallet.ltc -= amount; | |
} | |
self.wallet.currentSituation('SELL', number_format(price,2,'.',',')); | |
}); | |
} | |
Trader.prototype.buyLtc = function(amount) | |
{ | |
var self = this; | |
this.getPrice(function(price){ | |
if(self.wallet.dollar >= (price*amount)*1.02){ | |
self.wallet.dollar -= (price*amount)*1.02; | |
self.wallet.ltc += amount; | |
} | |
self.wallet.currentSituation('BUY', number_format(price,2,'.',',')); | |
}); | |
} | |
Trader.prototype.getPrice = function(callback) | |
{ | |
var request = http.get('https://btc-e.com/api/2/ltc_usd/ticker', function(res){ | |
var data = ''; | |
res.on('data', function(chunck){ | |
data += chunck; | |
}); | |
res.on('end', function(){ | |
data = JSON.parse(data); | |
callback(data.ticker.last); | |
}); | |
}); | |
request.on('error', function(e){ | |
console.log(e.message); | |
}); | |
request.end(); | |
} | |
var ws = new WebSocket('wss://ws.pusherapp.com/app/4e0ebd7a8b66fa3554a4?protocol=6&client=js&version=2.0.0&flash=false'); | |
var entities = new Entities(); | |
var wallet = new Wallet(); | |
wallet.dollar = 100; | |
wallet.ltc = 0; | |
var trader = new Trader(); | |
trader.setWallet(wallet); | |
var dict = new Dict(); | |
trader.setDict(dict); | |
var transportHelper = new TransportHelper(); | |
//Webscoket Open | |
ws.on('open', function() { | |
try{ | |
ws.send('{"event":"pusher:subscribe","data":{"channel":"chat_en"}}'); | |
}catch (e){ | |
console.log(e); | |
} | |
}); | |
ws.on('message', function(data){ | |
if(data = transportHelper.parse(data)){ | |
if(data.msg){ | |
trader.act(data.msg.toLowerCase()); | |
} | |
} | |
}); | |
function number_format(number, decimals, dec_point, thousands_sep) { | |
number = (number + '').replace(/[^0-9+\-Ee.]/g, ''); | |
var n = !isFinite(+number) ? 0 : +number, | |
prec = !isFinite(+decimals) ? 0 : Math.abs(decimals), | |
sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep, | |
dec = (typeof dec_point === 'undefined') ? '.' : dec_point, | |
s = '', | |
toFixedFix = function (n, prec) { | |
var k = Math.pow(10, prec); | |
return '' + Math.round(n * k) / k; | |
}; | |
// Fix for IE parseFloat(0.55).toFixed(0) = 0; | |
s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.'); | |
if (s[0].length > 3) { | |
s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep); | |
} | |
if ((s[1] || '').length < prec) { | |
s[1] = s[1] || ''; | |
s[1] += new Array(prec - s[1].length + 1).join('0'); | |
} | |
return s.join(dec); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment