autobounty/bot/index.js

96 lines
3.0 KiB
JavaScript
Raw Normal View History

2018-01-22 11:24:19 +00:00
const winston = require('winston');
2018-01-20 16:34:11 +00:00
const prices = require('./prices');
2018-01-20 16:32:11 +00:00
const config = require('../config');
2018-01-22 20:21:31 +00:00
const github = require('./github');
2018-01-22 11:24:19 +00:00
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: config.logPath + 'error.log', level: 'error' }),
new winston.transports.File({ filename: config.logPath + 'info.log', level: 'info'}),
new winston.transports.File({ filename: config.logPath + 'combined.log' })
2018-01-22 11:24:19 +00:00
]
});
2018-01-20 12:51:57 +00:00
const needsFunding = function(req) {
2018-01-23 13:39:12 +00:00
if (req.body.action !== 'created' || !req.body.hasOwnProperty('comment')) {
return false
2018-01-23 13:39:12 +00:00
} else if (req.body.comment.user.login !== 'status-open-bounty') {
return false
}
return true
}
const getAddress = function(req) {
2018-01-20 13:15:49 +00:00
let commentBody = req.body.comment.body;
return commentBody.substring(commentBody.search("Contract address:") + 18, commentBody.search("Contract address:") + 60)
}
2018-01-20 13:15:49 +00:00
const getLabel = function(req) {
2018-01-22 22:44:31 +00:00
return github.getLabels(req).then(labels => {
2018-01-22 16:05:42 +00:00
if (labels.length === 1) {
2018-01-22 20:21:31 +00:00
return labels[0];
2018-01-22 16:05:42 +00:00
} else {
2018-01-22 20:21:31 +00:00
error(req.body, 'More than 1 label found: ['+ labels.length + ']');
// reject(new Error('More than 1 label found: ['+ labels.length + ']'));
2018-01-22 16:05:42 +00:00
}
}).catch(err => {
2018-01-22 20:21:31 +00:00
error(req.body, 'Could not get label' + err);
// reject(new Error('Could not get label' + err));
2018-01-22 16:05:42 +00:00
});
}
const getAmount = function(req) {
2018-01-22 16:05:42 +00:00
return new Promise((resolve, reject) => {
2018-01-22 22:44:31 +00:00
let labelPromise = getLabels(req);
2018-01-22 16:05:42 +00:00
let tokenPricePromise = prices.getTokenPrice(config.token);
2018-01-22 20:21:31 +00:00
Promise.all([labelPromise, tokenPricePromise])
.then(function(values) {
let label = values[0];
let tokenPrice = values[1];
let amountToPayDollar = config.priceHour * config.bountyLabels[label];
resolve(config.amountToPayDollar/tokenPrice);
})
.catch(err => {
error(req.body, 'Failed to resolve label or token price: ' + err);
reject(new Error('Failed to resolve label or token price: ' + err));
2018-01-22 16:05:42 +00:00
});
});
}
// Logging functions
2018-01-22 16:08:23 +00:00
const logTransaction = function(txId, from, to, amount, gasPrice){
2018-01-22 20:21:31 +00:00
logger.info("[OK] Succesfully funded bounty with transaction " + txId);
logger.info(" * From: " + from);
logger.info(" * To: " + to);
logger.info(" * Amount: " + amount);
logger.info(" * Gas Price: " + gasPrice);
logger.info("====================================================");
}
2018-01-22 11:24:19 +00:00
const log = function(msg) {
logger.info(msg);
}
2018-01-22 16:08:23 +00:00
const error = function(requestInfo, errorMessage) {
2018-01-22 20:21:31 +00:00
logger.error("[ERROR] Request processing failed: " + errorMessage);
logger.error("[ERROR] Request: " + requestInfo);
}
module.exports = {
needsFunding: needsFunding,
getAddress: getAddress,
getAmount: getAmount,
2018-01-22 15:49:41 +00:00
getGasPrice: prices.getGasPrice,
2018-01-22 16:08:23 +00:00
log: log,
logTransaction: logTransaction,
error: error
}