From 6d848e59a9d2e1d35357075c3abcc16965e3ff37 Mon Sep 17 00:00:00 2001 From: Pedro Pombeiro Date: Mon, 26 Mar 2018 10:29:50 +0200 Subject: [PATCH] Avoid funding issues which already have a value in the desired token. Fixes #14 --- bot/index.js | 28 ++++++++++++++++++++-------- test/test_bot.js | 16 +++++++++++++--- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/bot/index.js b/bot/index.js index f3b3a7a..70c84f3 100644 --- a/bot/index.js +++ b/bot/index.js @@ -7,9 +7,9 @@ const config = require('../config') const prices = require('./prices') const github = require('./github') -const winnerString = 'Winner:' -const contractAddressString = 'Contract address: ' -const paidString = 'Paid to:' +const winnerPrefix = 'Winner:' +const contractAddressPrefix = 'Contract address: ' +const paidPrefix = 'Paid to:' const logger = winston.createLogger({ level: 'info', @@ -37,6 +37,8 @@ function needsFunding (req) { return false } else if (!hasAddress(req)) { return false + } else if (isFunded(req)) { + return false } else if (hasWinner(req)) { return false } else if (isPaid(req)) { @@ -45,24 +47,34 @@ function needsFunding (req) { return true } +function isFunded (req) { + const prefix = `Tokens: ${config.token}: ` + const index = req.body.comment.body.search(prefix) + if (index === -1) { + return false + } + const value = Number.parseFloat(req.body.comment.body.substring(index + prefix.length)) + return value > 0 +} + function isPaid (req) { - return req.body.comment.body.search(paidString) !== -1 + return req.body.comment.body.search(paidPrefix) !== -1 } function hasWinner (req) { - return req.body.comment.body.search(winnerString) !== -1 + return req.body.comment.body.search(winnerPrefix) !== -1 } function hasAddress (req) { - return req.body.comment.body.search(contractAddressString) !== -1 + return req.body.comment.body.search(contractAddressPrefix) !== -1 } function getAddress (req) { const commentBody = req.body.comment.body - const index = commentBody.search(contractAddressString) + const index = commentBody.search(contractAddressPrefix) if (index === -1) { return undefined } - const addressIndex = index + contractAddressString.length + 1 + const addressIndex = index + contractAddressPrefix.length + 1 console.log('address: ', commentBody.substring(addressIndex, addressIndex + 42)) return commentBody.substring(addressIndex, addressIndex + 42) } diff --git a/test/test_bot.js b/test/test_bot.js index 4c5adbe..d08e464 100644 --- a/test/test_bot.js +++ b/test/test_bot.js @@ -4,8 +4,10 @@ const config = require('../config') const bot = require('../bot') // status-open-bounty comment from https://github.com/status-im/autobounty/issues/1 -const sobComment = 'Current balance: 0.000000 ETH\nTokens: SNT: 2500.00 ANT: 25.00\nContract address: [0x3645fe42b1a744ad98cc032c22472388806f86f9](https://etherscan.io/address/0x3645fe42b1a744ad98cc032c22472388806f86f9)\nNetwork: Mainnet\n To claim this bounty sign up at https://openbounty.status.im and make sure to update your Ethereum address in My Payment Details so that the bounty is correctly allocated.\nTo fund it, send ETH or ERC20/ERC223 tokens to the contract address.' -const sobCommentWithWinner = 'Balance: 0.000000 ETH\nContract address: [0xe02fbffb3422ddb8e2227c3495f710ba4f8e0c10](https://etherscan.io/address/0xe02fbffb3422ddb8e2227c3495f710ba4f8e0c10)\nNetwork: Mainnet\nStatus: Pending maintainer confirmation\nWinner: foopang\nVisit [https://openbounty.status.im](https://openbounty.status.im) to learn more.' +const sobComment = 'Current balance: 0.000000 ETH\nContract address: [0x3645fe42b1a744ad98cc032c22472388806f86f9](https://etherscan.io/address/0x3645fe42b1a744ad98cc032c22472388806f86f9)\nNetwork: Mainnet\n To claim this bounty sign up at https://openbounty.status.im and make sure to update your Ethereum address in My Payment Details so that the bounty is correctly allocated.\nTo fund it, send ETH or ERC20/ERC223 tokens to the contract address.' +const sobCommentWithWinner = 'Balance: 0.000000 ETH\nTokens: SNT: 2500.00 ANT: 25.00\nContract address: [0xe02fbffb3422ddb8e2227c3495f710ba4f8e0c10](https://etherscan.io/address/0xe02fbffb3422ddb8e2227c3495f710ba4f8e0c10)\nNetwork: Mainnet\nStatus: Pending maintainer confirmation\nWinner: foopang\nVisit [https://openbounty.status.im](https://openbounty.status.im) to learn more.' +const sobCommentForFundedBounty = 'Current balance: 0.000100 ETH\nTokens: SNT: 2500.00 ANT: 25.00\nContract address: [0x3645fe42b1a744ad98cc032c22472388806f86f9](https://etherscan.io/address/0x3645fe42b1a744ad98cc032c22472388806f86f9)\nNetwork: Mainnet\n To claim this bounty sign up at https://openbounty.status.im and make sure to update your Ethereum address in My Payment Details so that the bounty is correctly allocated.\nTo fund it, send ETH or ERC20/ERC223 tokens to the contract address.' +const sobCommentForUnfundedBounty = 'Current balance: 0.000100 ETH\nTokens: SNT: 0.00 ANT: 0.00\nContract address: [0x3645fe42b1a744ad98cc032c22472388806f86f9](https://etherscan.io/address/0x3645fe42b1a744ad98cc032c22472388806f86f9)\nNetwork: Mainnet\n To claim this bounty sign up at https://openbounty.status.im and make sure to update your Ethereum address in My Payment Details so that the bounty is correctly allocated.\nTo fund it, send ETH or ERC20/ERC223 tokens to the contract address.' // Fake requests const requests = [ @@ -14,6 +16,8 @@ const requests = [ { headers: {'x-github-event': 'issue_comment'}, body: { action: 'created', comment: { body: sobComment, user: { login: 'status-open-bounty' } } } }, { headers: {'x-github-event': 'issue_comment'}, body: { action: 'edited', repository: { owner: { login: 'status-im' }, name: 'autobounty' }, issue: { labels: ['bounty', 'bounty-xl'], number: 1 }, comment: { body: sobComment, user: { login: 'status-open-bounty' } } } }, { headers: {'x-github-event': 'issue_comment'}, body: { action: 'edited', repository: { owner: { login: 'status-im' }, name: 'autobounty' }, issue: { labels: ['bounty', 'bounty-xl'], number: 1 }, comment: { body: sobCommentWithWinner, user: { login: 'status-open-bounty' } } } }, + { headers: {'x-github-event': 'issue_comment'}, body: { action: 'edited', repository: { owner: { login: 'status-im' }, name: 'autobounty' }, issue: { labels: ['bounty', 'bounty-xl'], number: 1 }, comment: { body: sobCommentForFundedBounty, user: { login: 'status-open-bounty' } } } }, + { headers: {'x-github-event': 'issue_comment'}, body: { action: 'edited', repository: { owner: { login: 'status-im' }, name: 'autobounty' }, issue: { labels: ['bounty', 'bounty-xl'], number: 1 }, comment: { body: sobCommentForUnfundedBounty, user: { login: 'status-open-bounty' } } } }, { headers: {'x-github-event': 'labels'}, body: { action: 'created' } } ] @@ -34,9 +38,15 @@ describe('Bot behavior', function () { it('should return false because issue already has a winner', function () { assert.isFalse(bot.needsFunding(requests[4])) }) - it('should return false because the action is not related to issue comments', function () { + it('should return false because issue is already funded', function () { assert.isFalse(bot.needsFunding(requests[5])) }) + it('should return true because issue is not yet funded', function () { + assert.isTrue(bot.needsFunding(requests[6])) + }) + it('should return false because the action is not related to issue comments', function () { + assert.isFalse(bot.needsFunding(requests[7])) + }) }) describe('#getAddress', function () {