@ -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 } ) ;
// clear flood requests
__self . bets_flood = [ ] ;
}
// 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 ;
}
} else {
if ( amount >= 1 && amount !== 0 ) {
__self . bets_viewers . push ( { viewer : caller , bet : bet , amount : amount } ) ;
__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 ( ) { } ) ;
}
console . log ( __self . bets_viewers ) ;
} ;
Currency . prototype . bets_deduct_bets = 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 ) {