From 16a777ad331427edf5f223c2fa59c44c2cd05bdf Mon Sep 17 00:00:00 2001 From: Niko Storni Date: Mon, 12 Jun 2017 02:03:31 +0200 Subject: [PATCH 1/2] added metadata to claims --- bots/claimbot.js | 239 +++++++++++++++++++++++------------------------ 1 file changed, 116 insertions(+), 123 deletions(-) diff --git a/bots/claimbot.js b/bots/claimbot.js index b877148..1cad5f0 100644 --- a/bots/claimbot.js +++ b/bots/claimbot.js @@ -5,6 +5,7 @@ var mongo; var slackbot; var channel; var moment = require('moment'); +const request = require("request"); module.exports = { init: init, @@ -12,24 +13,21 @@ module.exports = { function init(slackbot_, channel_, rpcuser, rpcpassword, mongodburl) { - if (lbry) - { + if (lbry) { throw new Error('init was already called once'); } slackbot = slackbot_; channel = channel_; - if (!channel_) - { + if (!channel_) { console.log('No claims channel, disabling claimbot'); return; } const MongoClient = require('mongodb').MongoClient; MongoClient.connect(mongodburl, function (err, db) { - if (err) - { + if (err) { throw err; } mongo = db; @@ -51,18 +49,15 @@ function init(slackbot_, channel_, rpcuser, rpcpassword, mongodburl) { }); } - function announceNewClaims() { - if (!mongo) - { - slackPost('Failed to connect to mongo', {icon_emoji: ':exclamation:'}); + if (!mongo) { + slackPost('Failed to connect to mongo', { icon_emoji: ':exclamation:' }); return; } - if (!lbry) - { - slackPost('Failed to connect to lbrycrd', {icon_emoji: ':exclamation:'}); + if (!lbry) { + slackPost('Failed to connect to lbrycrd', { icon_emoji: ':exclamation:' }); return; } @@ -72,16 +67,14 @@ function announceNewClaims() { // console.log('Checking for new blocks'); - if (lastProcessedBlock === null) - { + if (lastProcessedBlock === null) { console.log('First run. Setting last processed block to ' + currentHeight + ' and exiting.'); return setLastBlock(currentHeight); } const testBlock = false; - if (testBlock || lastProcessedBlock < currentHeight) - { + if (testBlock || lastProcessedBlock < currentHeight) { const firstBlockToProcess = testBlock || lastProcessedBlock + 1, lastBlockToProcess = testBlock || currentHeight; @@ -91,7 +84,7 @@ function announceNewClaims() { } }) .catch(function (err) { - slackPost(err.stack, {icon_emoji: ':exclamation:'}); + slackPost(err.stack, { icon_emoji: ':exclamation:' }); }); } @@ -118,108 +111,115 @@ function announceClaimsLoop(block, lastBlock, currentHeight) { }) .then(function () { const nextBlock = block + 1; - if (nextBlock <= lastBlock) - { + if (nextBlock <= lastBlock) { return announceClaimsLoop(nextBlock, lastBlock, currentHeight); } }); } function announceClaim(claim, claimBlockHeight, currentHeight) { + //console.log(claim); console.log('' + claimBlockHeight + ': New claim for ' + claim['name']); - return Promise.all([ - lbryCall('getvalueforname', claim['name']), - lbryCall('getclaimsforname', claim['name']), - ]) - .then(function ([currentWinningClaim, claimsForName]) { - let value; - try - { - value = JSON.parse(claim['value']); - } - catch (e) - { - } + var options = { + method: 'GET', + url: 'https://explorer.lbry.io/api/getclaimbyid/' + claim['claimId'] + //url: 'http://127.0.0.1:5000/claim_decode/' + claim['name'] + }; - const text = []; + request(options, function (error, response, body) { + if (error) throw new Error(error); + body = JSON.parse(body); + try { + let claimData = body.value.stream.metadata; + let channelName = (body.hasOwnProperty('channel_name') ? body['channel_name'] : null); + //claimData = JSON.parse(body).stream.metadata; + //console.log(JSON.stringify(claimData)); + return Promise.all([ + lbryCall('getvalueforname', claim['name']), + lbryCall('getclaimsforname', claim['name']), + ]) + .then(function ([currentWinningClaim, claimsForName]) { + //console.log(JSON.stringify(claimData)); + let value = claimData; - if (value) - { - if (value['author']) - { - text.push(value['author']); - } - if (value['description']) - { - text.push(value['description']); - } - // if (value['content_type']) - // { - // text.push("*Content Type:* " + value['content_type']); - // } - if (value['nsfw']) - { - text.push("*Warning: Adult Content*"); - } - if (value['fee']) - { - const fees = []; - for (var key in value['fee']) - { - fees.push(value['fee'][key]['amount'] + ' ' + key); + const text = []; + + if (value) { + if (channelName) { + text.push("Channel: lbry://" + channelName); + } + else if (value['author']) { + text.push("author: " + value['author']); + } + if (value['description']) { + text.push(value['description']); + } + // if (value['content_type']) + // { + // text.push("*Content Type:* " + value['content_type']); + // } + if (value['nsfw']) { + text.push("*Warning: Adult Content*"); + } + if (value['fee']) { + const fees = []; + for (var key in value['fee']) { + fees.push(value['fee'][key]['amount'] + ' ' + key); + } + text.push(fees.join(', ')); + } } - text.push(fees.join(', ')); - } - } - if (!claim['is controlling']) - { - // the following is based on https://lbry.io/faq/claimtrie-implementation - const lastTakeoverHeight = claimsForName['nLastTakeoverHeight'], - maxDelay = 4032, // 7 days of blocks at 2.5min per block - activationDelay = Math.min(maxDelay, Math.floor((claimBlockHeight - lastTakeoverHeight) / 32)), - takeoverHeight = claimBlockHeight + activationDelay, - secondsPerBlock = 161, // in theory this should be 150, but in practice its closer to 161 - takeoverTime = Date.now() + ((takeoverHeight - currentHeight) * secondsPerBlock * 1000); + if (!claim['is controlling']) { + // the following is based on https://lbry.io/faq/claimtrie-implementation + const lastTakeoverHeight = claimsForName['nLastTakeoverHeight'], + maxDelay = 4032, // 7 days of blocks at 2.5min per block + activationDelay = Math.min(maxDelay, Math.floor((claimBlockHeight - lastTakeoverHeight) / 32)), + takeoverHeight = claimBlockHeight + activationDelay, + secondsPerBlock = 161, // in theory this should be 150, but in practice its closer to 161 + takeoverTime = Date.now() + ((takeoverHeight - currentHeight) * secondsPerBlock * 1000); - text.push('Takes effect on approx. *' + moment(takeoverTime, 'x').format('MMMM Do [at] HH:mm [UTC]') + '* (block ' + takeoverHeight + ')'); - } + text.push('Takes effect on approx. *' + moment(takeoverTime, 'x').format('MMMM Do [at] HH:mm [UTC]') + '* (block ' + takeoverHeight + ')'); + } - const attachment = { - "fallback": "New claim for lbry://" + claim['name'], - "color": "#155b4a", - // "pretext": "New claim in block " + claimBlockHeight, - // "author_name": 'lbry://' + claim['name'], - // "author_link": 'lbry://' + claim['name'], - // "author_icon": "http://flickr.com/icons/bobby.jpg", - "title": "lbry://" + claim['name'], //escapeSlackHtml(value['title']), - "title_link": "lbry://" + claim['name'], - "text": escapeSlackHtml(text.join("\n")), - // "fields": [], - // "image_url": value['nsfw'] ? null : value['thumbnail'], - // "thumb_url": (!value || value['nsfw']) ? null : value['thumbnail'], - "unfurl_links": false, - "unfurl_media": false, - "link_names": false, - "parse": "none", - "footer": "Block " + claimBlockHeight + " • Claim ID " + claim['claimId'], - "mrkdwn_in": ['text'], - }; + const attachment = { + "fallback": "New claim for lbry://" + claim['name'], + "color": "#155b4a", + // "pretext": "New claim in block " + claimBlockHeight, + // "author_name": 'lbry://' + claim['name'], + // "author_link": 'lbry://' + claim['name'], + // "author_icon": "http://flickr.com/icons/bobby.jpg", + "title": "lbry://" + (channelName ? channelName + '/' : '') + claim['name'], //escapeSlackHtml(value['title']), + "title_link": "lbry://" + (channelName ? channelName + '/' : '') + claim['name'], + "text": escapeSlackHtml(text.join("\n")), + // "fields": [], + // "image_url": value['nsfw'] ? null : value['thumbnail'], + // "thumb_url": (!value || value['nsfw']) ? null : value['thumbnail'], + "unfurl_links": false, + "unfurl_media": false, + "link_names": false, + "parse": "none", + "footer": "Block " + claimBlockHeight + " • Claim ID " + claim['claimId'], + "mrkdwn_in": ['text'], + }; - if (value) - { - attachment['fallback'] += (': "' + value['title'] + '" by ' + value['author']); - attachment['author_name'] = 'lbry://' + claim['name']; - attachment['author_link'] = 'lbry://' + claim['name']; - attachment['title'] = escapeSlackHtml(value['title']); - if (!value['nsfw']) - { - attachment['thumb_url'] = value['thumbnail']; - } - } + if (value) { + attachment['fallback'] += (': "' + value['title'] + '" by ' + value['author']); + attachment['author_name'] = 'lbry://' + (channelName ? channelName + '/' : '') + claim['name']; + attachment['author_link'] = 'lbry://' + (channelName ? channelName + '/' : '') + claim['name']; + attachment['title'] = escapeSlackHtml(value['title']); + if (!value['nsfw']) { + attachment['thumb_url'] = value['thumbnail']; + } + } - slackPost('', {icon_emoji: ':bellhop_bell:', attachments: [attachment]}); - }); + slackPost('', { icon_emoji: ':bellhop_bell:', attachments: [attachment] }); + }); + } + catch (e) { + console.error(e); + } + }); } function escapeSlackHtml(txt) { @@ -238,17 +238,14 @@ function getClaimsForTxid(txid) { function getLastBlock() { return new Promise(function (resolve, reject) { mongo.collection('claimbot').findOne({}, function (err, obj) { - if (err) - { + if (err) { reject(err); } - else if (!obj) - { - mongo.collection('claimbot').createIndex({'last_block': 1}, {unique: true}); + else if (!obj) { + mongo.collection('claimbot').createIndex({ 'last_block': 1 }, { unique: true }); resolve(null); } - else - { + else { resolve(obj.last_block); } }); @@ -258,16 +255,14 @@ function getLastBlock() { function setLastBlock(block) { return new Promise(function (resolve, reject) { mongo.collection('claimbot').findOneAndUpdate( - {'last_block': {'$exists': true}}, - {'last_block': block}, - {'upsert': true, 'returnOriginal': false}, + { 'last_block': { '$exists': true } }, + { 'last_block': block }, + { 'upsert': true, 'returnOriginal': false }, function (err, obj) { - if (!err && obj && obj.value.last_block != block) - { + if (!err && obj && obj.value.last_block != block) { reject('Last value should be ' + block + ', but it is ' + obj.value.last_block); } - else - { + else { resolve(); } } @@ -284,12 +279,10 @@ function slackPost(text, params) { function lbryCall(...args) { return new Promise(function (resolve, reject) { lbry.cmd(...args, function (err, ...response) { - if (err) - { + if (err) { reject(new Error('JSONRPC call failed. Args: [' + args.join(', ') + ']')); } - else - { + else { resolve(...response); } }); From cdd03e68fe208cbb860508bc6eca956478dfcae1 Mon Sep 17 00:00:00 2001 From: Niko Storni Date: Mon, 12 Jun 2017 02:07:41 +0200 Subject: [PATCH 2/2] bump for package.json --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 307769c..5a8582d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hashbot", - "version": "1.0.0", + "version": "1.0.1", "description": "A bot for slack wich displays lbrys current hashrate via the open api.", "main": "app.js", "dependencies": { @@ -9,7 +9,7 @@ "moment": "^2.17.1", "mongodb": "^2.2.22", "needle": "^1.0.0", - "request": "^2.74.0", + "request": "^2.81.0", "slackbots": "^0.5.1", "xmlhttprequest": "1.8.0" },