diff options
| author | Adam Soltys <[email protected]> | 2016-11-11 23:20:40 -0800 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2016-12-26 14:22:39 -0800 |
| commit | e92783c613fa4266b69f5d56257cf919c86182b7 (patch) | |
| tree | a4454197f19142d2774e7c478c403de16e1a5dbb | |
| parent | a3cc882cee6afcfa4b278e653b3927b0cf79df9a (diff) | |
| download | coinos-server-e92783c613fa4266b69f5d56257cf919c86182b7.tar.gz coinos-server-e92783c613fa4266b69f5d56257cf919c86182b7.zip | |
Use bcoin to watch all m/0/1 addresses and send email/sms notifications (fixes #49 #59)
| -rw-r--r-- | app.js | 10 | ||||
| -rw-r--r-- | bcoin.js | 98 | ||||
| -rw-r--r-- | package.json | 5 | ||||
| -rw-r--r-- | src/app.coffee | 6 | ||||
| -rw-r--r-- | src/bcoin.coffee | 81 | ||||
| -rw-r--r-- | views/payment.html | 1 |
6 files changed, 162 insertions, 39 deletions
@@ -1,5 +1,5 @@ (function() { - var RedisStore, app, authorize, bodyParser, cache, config, cookieParser, express, fetchRates, fs, passport, path, proxy, proxyContext, proxyMiddleware, proxyOptions, request, session, sessionStore, sessions, startBcoin, transactions, users, + var RedisStore, app, authorize, bodyParser, cache, config, cookieParser, express, fetchRates, fs, passport, path, proxy, proxyContext, proxyMiddleware, proxyOptions, request, session, sessionStore, sessions, transactions, twilio, users, indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; request = require('request'); @@ -24,6 +24,8 @@ transactions = require("./routes/transactions"); + twilio = require('twilio'); + users = require("./routes/users")(sessions); session = require('express-session'); @@ -85,7 +87,7 @@ cookie: { maxAge: 1209600000 }, - key: 'vanbtc.sid' + key: 'coinos.sid' })); app.use(passport.initialize()); @@ -123,9 +125,7 @@ return setTimeout(fetchRates, 120000); })(); - (startBcoin = function() { - return require('./bcoin').init(); - })(); + require('./bcoin').init(app); app.get('/', cache, sessions["new"]); @@ -1,41 +1,107 @@ (function() { - var bcoin, db; + var bcoin, config, db, twilio; bcoin = require('bcoin'); + config = require('./config'); + db = require('./redis'); + twilio = require('twilio'); + module.exports = { - init: function() { - var addresses, chain, pool; - addresses = {}; + init: function(app) { + var chain, pool, users; + users = {}; chain = new bcoin.chain({ db: 'leveldb', - location: __dirname + 'mainchain/mainchain.db', + name: 'spvchain', + location: __dirname + '/db/spvchain', spv: true }); pool = new bcoin.pool({ chain: chain, - spv: true + spv: true, + size: 1, + maxPeers: 1, + seeds: ['dctrl.ca'] }); - return pool.open(function(err) { - db.keys("user:*", function(err, users) { - return users.map(function(key) { - return db.hgetall(key, function(err, user) { - addresses[user.address] = user.username; - pool.watchAddress(user.address); - return console.log(user.address); + pool.logger.level = 4; + return pool.open().then(function() { + db.keysAsync("user:*").then(function(keys) { + return Promise.all(keys.map(function(key) { + return db.hgetallAsync(key).then(function(user) { + console.log(key); + console.log(user); + if (user.address) { + pool.watchAddress(user.address); + return users[user.address] = { + email: user.email, + currency: user.currency, + symbol: user.symbol, + phone: user.phone + }; + } }); - }); + })); }); pool.connect(); pool.startSync(); pool.on('error', function(err) { - debugger; return console.log(err); }); return pool.on('tx', function(tx) { - return console.log(tx); + var address, client, i, len, output, ref, results, value; + console.log(tx); + ref = tx.outputs; + results = []; + for (i = 0, len = ref.length; i < len; i++) { + output = ref[i]; + value = (output.value / 100000000).toFixed(8); + address = output.getAddress().toBase58(); + if (Object.keys(users).includes(address)) { + app.render('payment', { + value: value, + address: address + }, function(err, html) { + debugger; + var content, from_email, helper, mail, request, sg, subject, to_email; + console.log(users[address]); + helper = require('sendgrid').mail; + from_email = new helper.Email('[email protected]'); + to_email = new helper.Email(users[address].email); + subject = 'Received Payment'; + content = new helper.Content('text/html', html); + mail = new helper.Mail(from_email, subject, to_email, content); + sg = require('sendgrid')(config.sendgrid_token); + request = sg.emptyRequest({ + method: 'POST', + path: '/v3/mail/send', + body: mail.toJSON() + }); + return sg.API(request, function(error, response) { + console.log(response.statusCode); + console.log(response.body); + return console.log(response.headers); + }); + }); + if (users[address].phone) { + client = new twilio.RestClient(config.twilio_sid, config.twilio_token); + results.push(client.messages.create({ + to: user.phone, + from: config.twilio_number, + body: "You received a payment of " + value + " BTC" + }, function(err, message) { + return console.log(message.sid); + })); + } else { + results.push(void 0); + } + } else { + results.push(void 0); + } + } + return results; }); }); } diff --git a/package.json b/package.json index 160a298b..f732d985 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ }, "dependencies": { "async": "2.1.1", - "bcoin": "git+https://github.com/bcoin-org/bcoin.git#0ca843e3cabd4920546a9947f15954e2b7ede195", + "bcoin": "git+https://github.com/bcoin-org/bcoin.git#master", "bcryptjs": "^2.3.0", "bip39": "^2.2.0", "bitcoinjs-lib": "^2.3.0", @@ -31,7 +31,8 @@ "passport-local": "1.0.0", "redis": "2.6.2", "request": "~2.75.0", - "sendgrid": "^4.3.0" + "sendgrid": "^4.3.0", + "twilio": "^2.11.0" }, "devDependencies": { "bower": "^1.8.0", diff --git a/src/app.coffee b/src/app.coffee index d51eaa99..75b182ec 100644 --- a/src/app.coffee +++ b/src/app.coffee @@ -9,6 +9,7 @@ fs = require('fs') proxyMiddleware = require('http-proxy-middleware') sessions = require("./routes/sessions")(passport) transactions = require("./routes/transactions") +twilio = require('twilio') users = require("./routes/users")(sessions) session = require('express-session') @@ -45,7 +46,7 @@ app.use(session( secret: config.secret store: sessionStore cookie: maxAge: 1209600000 - key: 'vanbtc.sid' + key: 'coinos.sid' )) app.use(passport.initialize()) app.use(passport.session()) @@ -75,8 +76,7 @@ do fetchRates = -> ) setTimeout(fetchRates, 120000) -do startBcoin = -> - require('./bcoin').init() +require('./bcoin').init(app) app.get('/', cache, sessions.new) diff --git a/src/bcoin.coffee b/src/bcoin.coffee index 31bd7ca1..5cc303d0 100644 --- a/src/bcoin.coffee +++ b/src/bcoin.coffee @@ -1,38 +1,93 @@ bcoin = require('bcoin') +config = require('./config') db = require('./redis') +twilio = require('twilio') module.exports = - init: -> - addresses = {} + init: (app) -> + users = {} chain = new bcoin.chain( db: 'leveldb' - location: __dirname + 'mainchain/mainchain.db' + name: 'spvchain' + location: __dirname + '/db/spvchain' spv: true ) pool = new bcoin.pool( chain: chain spv: true + size: 1 + maxPeers: 1 + seeds: ['dctrl.ca'] ) - pool.open((err) -> - db.keys("user:*", (err, users) -> - users.map((key) -> - db.hgetall(key, (err, user) -> - addresses[user.address] = user.username - pool.watchAddress(user.address) - console.log(user.address) + pool.logger.level = 4 + + pool.open().then(-> + db.keysAsync("user:*").then((keys) -> + Promise.all(keys.map((key) -> + db.hgetallAsync(key).then((user) -> + console.log(key) + console.log(user) + if user.address + pool.watchAddress(user.address) + users[user.address] = + email: user.email + currency: user.currency + symbol: user.symbol + phone: user.phone ) - ) + )) ) pool.connect() pool.startSync() pool.on('error', (err) -> - debugger console.log(err) ) - pool.on('tx', (tx) -> console.log(tx)) + + pool.on('tx', (tx) -> + console.log(tx) + + for output in tx.outputs + value = (output.value / 100000000).toFixed(8) + address = output.getAddress().toBase58() + if Object.keys(users).includes(address) + app.render('payment', { value: value, address: address }, (err, html) -> + debugger + console.log(users[address]) + helper = require('sendgrid').mail + from_email = new helper.Email('[email protected]') + to_email = new helper.Email(users[address].email) + subject = 'Received Payment' + content = new helper.Content('text/html', html) + mail = new helper.Mail(from_email, subject, to_email, content) + + sg = require('sendgrid')(config.sendgrid_token) + request = sg.emptyRequest( + method: 'POST' + path: '/v3/mail/send' + body: mail.toJSON() + ) + + sg.API(request, (error, response) -> + console.log(response.statusCode) + console.log(response.body) + console.log(response.headers) + ) + ) + + if users[address].phone + client = new twilio.RestClient(config.twilio_sid, config.twilio_token) + + client.messages.create( + to: user.phone + from: config.twilio_number + body: "You received a payment of #{value} BTC" + , (err, message) -> + console.log(message.sid) + ) + ) ) diff --git a/views/payment.html b/views/payment.html new file mode 100644 index 00000000..c18f0a13 --- /dev/null +++ b/views/payment.html @@ -0,0 +1 @@ +You received a payment of {{value}} BTC |
