Merge branch 'dev'
This commit is contained in:
commit
91990dcda5
252
lib/currency.js
252
lib/currency.js
@ -127,6 +127,11 @@ function Currency(irc, db, options) {
|
||||
__self.bets_board = [];
|
||||
__self.bets_viewers = [];
|
||||
__self.bets_payout = false;
|
||||
__self.bets_total = 0;
|
||||
__self.bets_flood = [];
|
||||
__self.bets_response = null;
|
||||
__self.bets_response_timer = 3000;
|
||||
__self.bets_response_reset = true;
|
||||
}
|
||||
|
||||
//-------- Methods ---------
|
||||
@ -138,7 +143,7 @@ Currency.prototype.start = function () {
|
||||
Currency.prototype.commands = function (data) {
|
||||
var __self = this,
|
||||
broadcaster_bot_initiated = __self.irc.caller(data[0]).toLowerCase() === __self.irc.config.broadcaster.toLowerCase() || __self.irc.caller(data[0]).toLowerCase() === __self.irc.config.name.toLowerCase(),
|
||||
moderator_initiated = __self.irc.mods.indexOf(__self.irc.caller(data[0])) > 0;
|
||||
moderator_initiated = __self.irc.mods.indexOf(__self.irc.caller(data[0])) >= 0;
|
||||
|
||||
// handle !<currency> commands
|
||||
if (data[3].slice(1) === '!' + __self.config.currency.toLowerCase()) {
|
||||
@ -184,6 +189,9 @@ Currency.prototype.commands = function (data) {
|
||||
case 'cancel':
|
||||
__self.auction('cancel');
|
||||
break;
|
||||
case 'help':
|
||||
__self.irc.emit('message', {message:__self.pre_text + '!' + __self.config.currency.toLowerCase() + ' auction open/close/cancel/draw'});
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -222,6 +230,9 @@ Currency.prototype.commands = function (data) {
|
||||
case 'restore':
|
||||
__self.raffle('restore');
|
||||
break;
|
||||
case 'help':
|
||||
__self.irc.emit('message', {message:__self.pre_text + '!' + __self.config.currency.toLowerCase() + ' raffle open <ticket cost> <tickets per user>/close/cancel/draw/restore'});
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -229,7 +240,7 @@ Currency.prototype.commands = function (data) {
|
||||
if (data[4] === 'bet') {
|
||||
switch (data[5]) {
|
||||
case 'open':
|
||||
if (data[5] && data[6]) {
|
||||
if (data[6] && data[7]) {
|
||||
__self.bets(true, data);
|
||||
} else {
|
||||
__self.irc.emit('message', {message:__self.pre_text + 'Unable to open betting, need at least two items to bet against'});
|
||||
@ -238,8 +249,17 @@ Currency.prototype.commands = function (data) {
|
||||
case 'close':
|
||||
__self.bets(false, null);
|
||||
break;
|
||||
case 'pool':
|
||||
__self.bets('pool', null);
|
||||
break;
|
||||
case 'winner':
|
||||
//__self.bets('winner');
|
||||
__self.bets('winner', data[6]);
|
||||
break;
|
||||
case 'cancel':
|
||||
__self.bets('cancel');
|
||||
break;
|
||||
case 'help':
|
||||
__self.irc.emit('message', {message:__self.pre_text + '!' + __self.config.currency.toLowerCase() + ' bet open <option A> <option B> <etc>/close/pool/winner <option>/cancel'});
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -379,7 +399,7 @@ Currency.prototype.commands = function (data) {
|
||||
// place a bet
|
||||
if (__self.bets_status === true) {
|
||||
for (var i = 0; i < __self.bets_board.length; i++) {
|
||||
if (data[3].slice(1) === '!' + __self.bets_board[i]) {
|
||||
if (data[3].slice(1) === '!' + __self.bets_board[i].name) {
|
||||
if (isNaN(parseInt(data[4], 10)) === false) {
|
||||
if (data[4] >= 0 && data[4] % 1 === 0) {
|
||||
__self.collect_bets(__self.irc.caller(data[0]), __self.bets_board[i], parseInt(data[4], 10));
|
||||
@ -1425,16 +1445,20 @@ Currency.prototype.bets = function(status, data) {
|
||||
// clear previous board / bets
|
||||
__self.bets_board = [];
|
||||
__self.bets_viewers = [];
|
||||
__self.bets_total = 0;
|
||||
|
||||
// create new betting board
|
||||
__self.bets_board = data.join().split(',').filter(function(n){return n}).slice(6);
|
||||
__self.bets_board = data.join().split(',').filter(function(n){return n}).slice(6).map(function(n){return {name: n, num: 0, total: 0};});
|
||||
for (var i = 0; i < __self.bets_board.length; i++) {
|
||||
__self.bets_board[i].idx = i;
|
||||
}
|
||||
|
||||
// create chat message on how to place a bet
|
||||
for (var i = 0; i < __self.bets_board.length; i++) {
|
||||
if (i !== __self.bets_board.length - 1) {
|
||||
wager_msg += '"!' + __self.bets_board[i] + '" / ';
|
||||
wager_msg += '"!' + __self.bets_board[i].name + '" / ';
|
||||
} else {
|
||||
wager_msg += '"!' + __self.bets_board[i] + '"';
|
||||
wager_msg += '"!' + __self.bets_board[i].name + '"';
|
||||
}
|
||||
}
|
||||
|
||||
@ -1464,20 +1488,81 @@ Currency.prototype.bets = function(status, data) {
|
||||
// close out bets
|
||||
__self.bets_status = false;
|
||||
|
||||
// deduct bets from viewers amounts
|
||||
__self.bets_deduct_bets();
|
||||
|
||||
// output to chat
|
||||
if (__self.bets_viewers.length > 0) {
|
||||
__self.irc.emit('message', {message:__self.pre_text + 'Betting is now closed'});
|
||||
for (var i = 0; i < __self.bets_board.length; i++) {
|
||||
__self.irc.emit('message', {message:'+ ' + __self.bets_board[i].name + ' with ' + __self.bets_board[i].num + ' bets totaling ' + __self.bets_board[i].total});
|
||||
}
|
||||
} else {
|
||||
__self.irc.emit('message', {message:__self.pre_text + 'Betting closed, no bets were placed'});
|
||||
}
|
||||
|
||||
// deduct bets from viewers amounts
|
||||
__self.bets_deduct_bets();
|
||||
}
|
||||
break;
|
||||
case 'pool':
|
||||
function do_work() {
|
||||
if (__self.bets_board.length > 0) {
|
||||
__self.irc.emit('message', {message:__self.pre_text + 'Current betting pool is:'});
|
||||
for (var i = 0; i < __self.bets_board.length; i++) {
|
||||
__self.irc.emit('message', {message:'+ ' + __self.bets_board[i].name + ' with ' + __self.bets_board[i].num + ' bets totaling ' + __self.bets_board[i].total});
|
||||
}
|
||||
} else {
|
||||
__self.irc.emit('message', {message:__self.pre_text + 'No current bet.'});
|
||||
}
|
||||
}
|
||||
if (__self.bets_response_reset) {
|
||||
__self.bets_response = setTimeout(function () {do_work();}, __self.bets_response_timer);
|
||||
} else {
|
||||
setTimeout(function () {do_work();}, __self.bets_response_timer);
|
||||
}
|
||||
break;
|
||||
case 'winner':
|
||||
// set payout to complete
|
||||
__self.bets_payout = false;
|
||||
if (!__self.bets_status) {
|
||||
if (__self.bets_payout) {
|
||||
for (var i = 0; i < __self.bets_board.length; i++) {
|
||||
if (data == __self.bets_board[i].name) {
|
||||
__self.bets_award_winner(__self.bets_board[i]);
|
||||
__self.irc.emit('message', {message:__self.pre_text + 'Betting payed out to ' + data});
|
||||
}
|
||||
}
|
||||
} else {
|
||||
__self.irc.emit('message', {message:__self.pre_text + 'Betting has already payed out'});
|
||||
}
|
||||
} else {
|
||||
__self.irc.emit('message', {message:__self.pre_text + 'Betting must be closed before you can have a winner'});
|
||||
}
|
||||
break;
|
||||
case 'cancel':
|
||||
if (!__self.bets_status) {
|
||||
// Return all the currency back to original owners
|
||||
if (__self.bets_payout) {
|
||||
sql = '';
|
||||
for (var i = 0; i < __self.bets_viewers.length; i++) {
|
||||
if (__self.bets_viewers[i].amount > 0) {
|
||||
if (sql.length > 0) {
|
||||
sql += '; ';
|
||||
}
|
||||
sql += 'UPDATE viewers ';
|
||||
sql += 'SET points = points + ' + __self.bets_viewers[i].amount + ' ';
|
||||
sql += 'WHERE user = \'' + __self.bets_viewers[i].viewer + '\'';
|
||||
}
|
||||
}
|
||||
__self.db.execute(sql, function() {
|
||||
__self.irc.emit('message', {message:__self.pre_text + 'Bet was canceled, all ' + __self.config.currency.toLowerCase() + ' returned.'});
|
||||
});
|
||||
__self.bets_payout = false;
|
||||
// Or just cancel the bets
|
||||
} else {
|
||||
__self.irc.emit('message', {message:__self.pre_text + 'No bet to cancel.'});
|
||||
}
|
||||
} else {
|
||||
__self.bets_status = false;
|
||||
__self.bets_payout = false;
|
||||
__self.irc.emit('message', {message:__self.pre_text + 'Current bet was canceled.'});
|
||||
}
|
||||
break;
|
||||
}
|
||||
};
|
||||
@ -1485,32 +1570,139 @@ Currency.prototype.bets = function(status, data) {
|
||||
Currency.prototype.collect_bets = function (caller, bet, amount) {
|
||||
var __self = this, has_bet = false;
|
||||
|
||||
if (__self.bets_viewers.length > 0) {
|
||||
for (var i = 0; i < __self.bets_viewers.length; i++) {
|
||||
if (__self.bets_viewers[i].viewer === caller) {
|
||||
has_bet = true;
|
||||
if (amount >= 1) {
|
||||
__self.bets_viewers[i].bet = bet;
|
||||
__self.bets_viewers[i].amount = amount;
|
||||
} else if (amount === 0 && bet === __self.bets_viewers[i].bet) {
|
||||
__self.bets_viewers.splice(i, 1);
|
||||
function do_work() {
|
||||
var multi_response = [];
|
||||
for (var i = 0; i < __self.bets_board.length; i++) {
|
||||
multi_response.push([]);
|
||||
}
|
||||
|
||||
if (__self.bets_flood.length > 0) {// send flood requests
|
||||
var bet;
|
||||
// setup bet response
|
||||
for (var i = 0; i < __self.bets_flood.length; i++) {
|
||||
bet = __self.bets_viewers[__self.bets_flood[i]];
|
||||
multi_response[bet.bet].push(bet.viewer + ' (' + bet.amount + ')');
|
||||
}
|
||||
for (var i = 0; i < __self.bets_board.length; i++) {
|
||||
if (multi_response[i].length > 0) {
|
||||
__self.irc.emit('message', {message:'New bets for ' + __self.bets_board[i].name + ': ' + multi_response[i].join(', '), timer: 1});
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!has_bet && amount >= 1 && amount !== 0) {
|
||||
__self.bets_viewers.push({viewer: caller, bet: bet, amount: amount});
|
||||
}
|
||||
} else {
|
||||
if (amount >= 1 && amount !== 0) {
|
||||
__self.bets_viewers.push({viewer: caller, bet: bet, amount: amount});
|
||||
}
|
||||
|
||||
// clear flood requests
|
||||
__self.bets_flood = [];
|
||||
}
|
||||
console.log(__self.bets_viewers);
|
||||
|
||||
// Bound amount by positive currency
|
||||
__self.query_coins(caller, function (rows) {
|
||||
for (var i = 0; i < rows.length; i++) {
|
||||
amount = Math.min(amount, rows[i].points);
|
||||
}
|
||||
if (__self.bets_viewers.length > 0) {
|
||||
for (var i = 0; i < __self.bets_viewers.length; i++) {
|
||||
if (__self.bets_viewers[i].viewer === caller) {
|
||||
has_bet = true;
|
||||
if (amount > __self.bets_viewers[i].amount) {
|
||||
__self.bets_board[__self.bets_viewers[i].bet].num -= 1;
|
||||
__self.bets_board[__self.bets_viewers[i].bet].total -= __self.bets_viewers[i].amount;
|
||||
__self.bets_viewers[i].bet = bet.idx;
|
||||
__self.bets_viewers[i].amount = amount;
|
||||
__self.bets_board[bet.idx].num += 1;
|
||||
__self.bets_board[bet.idx].total += amount;
|
||||
// add flood users to array
|
||||
if (__self.bets_flood.indexOf(i) < 0) {
|
||||
__self.bets_flood.push(i);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!has_bet && amount >= 1 && amount !== 0) {
|
||||
__self.bets_viewers.push({viewer: caller, bet: bet.idx, amount: amount});
|
||||
__self.bets_board[bet.idx].num += 1;
|
||||
__self.bets_board[bet.idx].total += amount;
|
||||
__self.bets_flood.push(__self.bets_viewers.length - 1);
|
||||
}
|
||||
} else {
|
||||
if (amount >= 1 && amount !== 0) {
|
||||
__self.bets_viewers.push({viewer: caller, bet: bet.idx, amount: amount});
|
||||
__self.bets_board[bet.idx].num += 1;
|
||||
__self.bets_board[bet.idx].total += amount;
|
||||
__self.bets_flood.push(__self.bets_viewers.length - 1);
|
||||
}
|
||||
}
|
||||
console.log(__self.bets_viewers);
|
||||
|
||||
// check if flood has a set amount of requests and output
|
||||
// if not, set the output timer
|
||||
if (__self.bets_flood.length === __self.max_requests) {
|
||||
do_work();
|
||||
} else {
|
||||
if (__self.bets_response_reset) {
|
||||
__self.bets_response = setTimeout(function () {do_work();}, __self.bets_response_timer);
|
||||
} else {
|
||||
setTimeout(function () {do_work();}, __self.bets_response_timer);
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
Currency.prototype.bets_deduct_bets = function () {
|
||||
var __self = this;
|
||||
|
||||
if (__self.bets_viewers.length > 0) {
|
||||
// Don't trust the on-the-fly numbers
|
||||
for (var i = 0; i < __self.bets_board.length; i++) {
|
||||
__self.bets_board[i].num = 0;
|
||||
__self.bets_board[i].total = 0;
|
||||
}
|
||||
__self.bets_total = 0;
|
||||
// Remove the points and add them to an escrow
|
||||
sql = '';
|
||||
for (var i = 0; i < __self.bets_viewers.length; i++) {
|
||||
if (__self.bets_viewers[i].amount > 0) {
|
||||
if (sql.length > 0) {
|
||||
sql += '; ';
|
||||
}
|
||||
sql += 'UPDATE viewers ';
|
||||
sql += 'SET points = points - ' + __self.bets_viewers[i].amount + ' ';
|
||||
sql += 'WHERE user = \'' + __self.bets_viewers[i].viewer + '\'';
|
||||
__self.bets_board[__self.bets_viewers[i].bet].num += 1;
|
||||
__self.bets_board[__self.bets_viewers[i].bet].total += __self.bets_viewers[i].amount;
|
||||
__self.bets_total += __self.bets_viewers[i].amount;
|
||||
}
|
||||
}
|
||||
__self.db.execute(sql, function() {});
|
||||
}
|
||||
};
|
||||
|
||||
Currency.prototype.bets_award_winner = function (winner) {
|
||||
var __self = this;
|
||||
|
||||
if (__self.bets_payout) {
|
||||
// set payout to complete
|
||||
__self.bets_payout = false;
|
||||
}
|
||||
// Payout the points
|
||||
if (__self.bets_viewers.length > 0) {
|
||||
sql = '';
|
||||
for (var i = 0; i < __self.bets_viewers.length; i++) {
|
||||
if (__self.bets_viewers[i].bet == winner.idx) {
|
||||
if (sql.length > 0) {
|
||||
sql += '; ';
|
||||
}
|
||||
sql += 'UPDATE viewers ';
|
||||
sql += 'SET points = points + ' + Math.ceil(__self.bets_total * __self.bets_viewers[i].amount / __self.bets_board[__self.bets_viewers[i].bet].total) + ' ';
|
||||
sql += 'WHERE user = \'' + __self.bets_viewers[i].viewer + '\'';
|
||||
}
|
||||
}
|
||||
__self.db.execute(sql, function() {});
|
||||
}
|
||||
// Clear the board
|
||||
__self.bets_board = [];
|
||||
__self.bets_viewers = [];
|
||||
__self.bets_total = 0;
|
||||
};
|
||||
|
||||
module.exports = function (irc, db, options) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user