Merge branch 'master' of git://git.assembla.com/fpdb

Conflicts:
	pyfpdb/DerivedStats.py
This commit is contained in:
DoNoBaN 2011-02-25 18:14:20 +01:00
commit 37fcca55b9
9 changed files with 376 additions and 82 deletions

View File

@ -38,7 +38,12 @@ import sys
import traceback
from datetime import datetime, date, time, timedelta
from time import time, strftime, sleep
from decimal import Decimal
try:
from cdecimal import *
except ImportError:
from decimal import *
import string
import re
import Queue
@ -454,7 +459,7 @@ class Database:
self.connection = sqlite3.connect(self.db_path, detect_types=sqlite3.PARSE_DECLTYPES )
self.__connected = True
sqlite3.register_converter("bool", lambda x: bool(int(x)))
sqlite3.register_adapter(bool, lambda x: "1" if x else "0")
sqlite3.register_adapter(bool, lambda x: 1 if x else 0)
self.connection.create_function("floor", 1, math.floor)
tmp = sqlitemath()
self.connection.create_function("mod", 2, tmp.mod)

View File

@ -30,73 +30,78 @@ class DerivedStats():
self.hands = {}
self.handsplayers = {}
self.handsactions = {}
self._initStats = DerivedStats._buildStatsInitializer()
@staticmethod
def _buildStatsInitializer():
init = {}
#Init vars that may not be used, but still need to be inserted.
# All stud street4 need this when importing holdem
init['winnings'] = 0
init['rake'] = 0
init['totalProfit'] = 0
init['street4Aggr'] = False
init['wonWhenSeenStreet1'] = 0.0
init['sawShowdown'] = False
init['wonAtSD'] = 0.0
init['startCards'] = 0
init['position'] = 2
init['street0_3BChance'] = False
init['street0_3BDone'] = False
init['street0_4BChance'] = False
init['street0_4BDone'] = False
init['street0_C4BChance'] = False
init['street0_C4BDone'] = False
init['street0_FoldTo3BChance']= False
init['street0_FoldTo3BDone']= False
init['street0_FoldTo4BChance']= False
init['street0_FoldTo4BDone']= False
init['street0_SqueezeChance']= False
init['street0_SqueezeDone'] = False
init['success_Steal'] = False
init['raiseToStealChance'] = False
init['raiseToStealDone'] = False
init['raiseFirstInChance'] = False
init['raisedFirstIn'] = False
init['foldBbToStealChance'] = False
init['foldSbToStealChance'] = False
init['foldedSbToSteal'] = False
init['foldedBbToSteal'] = False
init['tourneyTypeId'] = None
init['street1Seen'] = False
init['street2Seen'] = False
init['street3Seen'] = False
init['street4Seen'] = False
for i in range(5):
init['street%dCalls' % i] = 0
init['street%dBets' % i] = 0
init['street%dRaises' % i] = 0
for i in range(1,5):
init['street%dCBChance' %i] = False
init['street%dCBDone' %i] = False
init['street%dCheckCallRaiseChance' %i] = False
init['street%dCheckCallRaiseDone' %i] = False
init['otherRaisedStreet%d' %i] = False
init['foldToOtherRaisedStreet%d' %i] = False
#FIXME - Everything below this point is incomplete.
init['other3BStreet0'] = False
init['other4BStreet0'] = False
init['otherRaisedStreet0'] = False
init['foldToOtherRaisedStreet0'] = False
for i in range(1,5):
init['foldToStreet%dCBChance' %i] = False
init['foldToStreet%dCBDone' %i] = False
init['wonWhenSeenStreet2'] = 0.0
init['wonWhenSeenStreet3'] = 0.0
init['wonWhenSeenStreet4'] = 0.0
return init
def getStats(self, hand):
for player in hand.players:
self.handsplayers[player[1]] = {}
#Init vars that may not be used, but still need to be inserted.
# All stud street4 need this when importing holdem
self.handsplayers[player[1]]['winnings'] = 0
self.handsplayers[player[1]]['rake'] = 0
self.handsplayers[player[1]]['totalProfit'] = 0
self.handsplayers[player[1]]['street4Aggr'] = False
self.handsplayers[player[1]]['wonWhenSeenStreet1'] = 0.0
self.handsplayers[player[1]]['sawShowdown'] = False
self.handsplayers[player[1]]['wonAtSD'] = 0.0
self.handsplayers[player[1]]['startCards'] = 0
self.handsplayers[player[1]]['position'] = 2
self.handsplayers[player[1]]['street0_3BChance'] = False
self.handsplayers[player[1]]['street0_3BDone'] = False
self.handsplayers[player[1]]['street0_4BChance'] = False
self.handsplayers[player[1]]['street0_4BDone'] = False
self.handsplayers[player[1]]['street0_C4BChance'] = False
self.handsplayers[player[1]]['street0_C4BDone'] = False
self.handsplayers[player[1]]['street0_FoldTo3BChance']= False
self.handsplayers[player[1]]['street0_FoldTo3BDone']= False
self.handsplayers[player[1]]['street0_FoldTo4BChance']= False
self.handsplayers[player[1]]['street0_FoldTo4BDone']= False
self.handsplayers[player[1]]['street0_SqueezeChance']= False
self.handsplayers[player[1]]['street0_SqueezeDone'] = False
self.handsplayers[player[1]]['raiseToStealChance'] = False
self.handsplayers[player[1]]['raiseToStealDone'] = False
self.handsplayers[player[1]]['success_Steal'] = False
self.handsplayers[player[1]]['raiseFirstInChance'] = False
self.handsplayers[player[1]]['raisedFirstIn'] = False
self.handsplayers[player[1]]['foldBbToStealChance'] = False
self.handsplayers[player[1]]['foldSbToStealChance'] = False
self.handsplayers[player[1]]['foldedSbToSteal'] = False
self.handsplayers[player[1]]['foldedBbToSteal'] = False
self.handsplayers[player[1]]['tourneyTypeId'] = None
self.handsplayers[player[1]]['street1Seen'] = False
self.handsplayers[player[1]]['street2Seen'] = False
self.handsplayers[player[1]]['street3Seen'] = False
self.handsplayers[player[1]]['street4Seen'] = False
for i in range(5):
self.handsplayers[player[1]]['street%dCalls' % i] = 0
self.handsplayers[player[1]]['street%dBets' % i] = 0
self.handsplayers[player[1]]['street%dRaises' % i] = 0
for i in range(1,5):
self.handsplayers[player[1]]['street%dCBChance' %i] = False
self.handsplayers[player[1]]['street%dCBDone' %i] = False
self.handsplayers[player[1]]['street%dCheckCallRaiseChance' %i] = False
self.handsplayers[player[1]]['street%dCheckCallRaiseDone' %i] = False
self.handsplayers[player[1]]['otherRaisedStreet%d' %i] = False
self.handsplayers[player[1]]['foldToOtherRaisedStreet%d' %i] = False
#FIXME - Everything below this point is incomplete.
self.handsplayers[player[1]]['other3BStreet0'] = False
self.handsplayers[player[1]]['other4BStreet0'] = False
self.handsplayers[player[1]]['otherRaisedStreet0'] = False
self.handsplayers[player[1]]['foldToOtherRaisedStreet0'] = False
for i in range(1,5):
self.handsplayers[player[1]]['foldToStreet%dCBChance' %i] = False
self.handsplayers[player[1]]['foldToStreet%dCBDone' %i] = False
self.handsplayers[player[1]]['wonWhenSeenStreet2'] = 0.0
self.handsplayers[player[1]]['wonWhenSeenStreet3'] = 0.0
self.handsplayers[player[1]]['wonWhenSeenStreet4'] = 0.0
self.handsplayers[player[1]] = self._initStats.copy()
self.assembleHands(self.hand)
self.assembleHandsPlayers(self.hand)

View File

@ -57,7 +57,7 @@ class Filters(threading.Thread):
,'groupstitle':_('Grouping:'), 'posnshow':_('Show Position Stats')
,'datestitle':_('Date:')
,'groupsall':_('All Players')
,'limitsFL':'FL', 'limitsNL':'NL', 'limitsPL':'PL', 'ring':_('Ring'), 'tour':_('Tourney')
,'limitsFL':'FL', 'limitsNL':'NL', 'limitsPL':'PL', 'limitsCN':'CAP', 'ring':_('Ring'), 'tour':_('Tourney')
}
gen = self.conf.get_general_params()
@ -79,7 +79,7 @@ class Filters(threading.Thread):
self.sw.show()
print _("DEBUG: New packing box created!")
self.found = {'nl':False, 'fl':False, 'pl':False, 'ring':False, 'tour':False}
self.found = {'nl':False, 'fl':False, 'pl':False, 'cn':False, 'ring':False, 'tour':False}
self.label = {}
self.callback = {}
@ -154,9 +154,11 @@ class Filters(threading.Thread):
self.cbFL = None
self.cbNL = None
self.cbPL = None
self.cbCN = None
self.rb = {} # radio buttons for ring/tour
self.type = None # ring/tour
self.types = {} # list of all ring/tour values
self.num_limit_types = 0
self.num_limit_types = 0
self.fillLimitsFrame(vbox, self.display)
@ -430,7 +432,7 @@ class Filters(threading.Thread):
#print "__set_limit_select: limit =", limit, w.get_active()
self.limits[limit] = w.get_active()
log.debug(_("self.limit[%s] set to %s") %(limit, self.limits[limit]))
if limit.isdigit() or (len(limit) > 2 and (limit[-2:] == 'nl' or limit[-2:] == 'fl' or limit[-2:] == 'pl')):
if limit.isdigit() or (len(limit) > 2 and (limit[-2:] == 'nl' or limit[-2:] == 'fl' or limit[-2:] == 'pl' or limit[-2:] == 'cn')):
# turning a leaf limit on with 'None' checked turns 'None' off
if self.limits[limit]:
if self.cbNoLimits is not None:
@ -439,7 +441,7 @@ class Filters(threading.Thread):
else:
if self.cbAllLimits is not None:
self.cbAllLimits.set_active(False)
# turning off a leaf limit turns off the corresponding fl. nl, or pl
# turning off a leaf limit turns off the corresponding fl. nl, cn or pl
if not self.limits[limit]:
if limit.isdigit():
if self.cbFL is not None:
@ -447,6 +449,9 @@ class Filters(threading.Thread):
elif (len(limit) > 2 and (limit[-2:] == 'nl')):
if self.cbNL is not None:
self.cbNL.set_active(False)
elif (len(limit) > 2 and (limit[-2:] == 'cn')):
if self.cbCN is not None:
self.cbCN.set_active(False)
else:
if self.cbPL is not None:
self.cbPL.set_active(False)
@ -462,18 +467,26 @@ class Filters(threading.Thread):
self.cbNL.set_active(True)
if self.cbPL is not None:
self.cbPL.set_active(True)
if self.cbCN is not None:
self.cbCN.set_active(True)
elif limit == "none":
if self.limits[limit]:
if self.num_limit_types == 1:
for cb in self.cbLimits.values():
cb.set_active(False)
else:
if self.num_limit_types > 1:
if self.cbNL is not None:
self.cbNL.set_active(False)
if self.cbFL is not None:
self.cbFL.set_active(False)
if self.cbPL is not None:
self.cbPL.set_active(False)
if self.cbCN is not None:
self.cbCN.set_active(False)
#
# Finally, clean-up all individual limit checkboxes
# needed because the overall limit checkbox may
# not be set, or num_limit_types == 1
#
for cb in self.cbLimits.values():
cb.set_active(False)
elif limit == "fl":
if not self.limits[limit]:
# only toggle all fl limits off if they are all currently on
@ -553,6 +566,29 @@ class Filters(threading.Thread):
elif self.type == 'tour':
if 'ring' in self.rb:
self.rb['ring'].set_active(True)
elif limit == "cn":
if not self.limits[limit]:
all_cn_on = True
for cb in self.cbLimits.values():
t = cb.get_children()[0].get_text()
if "cn" in t and len(t) > 2:
if not cb.get_active():
all_cn_on = False
found = {'ring':False, 'tour':False}
for cb in self.cbLimits.values():
t = cb.get_children()[0].get_text()
if "cn" in t and len(t) > 2:
if self.limits[limit] or all_cn_on:
cb.set_active(self.limits[limit])
found[self.types[t]] = True
if self.limits[limit]:
if not found[self.type]:
if self.type == 'ring':
if 'tour' in self.rb:
self.rb['tour'].set_active(True)
elif self.type == 'tour':
if 'ring' in self.rb:
self.rb['ring'].set_active(True)
elif limit == "ring":
log.debug("set", limit, "to", self.limits[limit])
if self.limits[limit]:
@ -726,15 +762,16 @@ class Filters(threading.Thread):
showb = gtk.Button(label="hide", stock=None, use_underline=True)
showb.set_alignment(xalign=1.0, yalign=0.5)
showb.connect('clicked', self.__toggle_box, 'limits')
top_hbox.pack_start(showb, expand=False, padding=1)
vbox1 = gtk.VBox(False, 0)
vbox1 = gtk.VBox(False, 15)
vbox.pack_start(vbox1, False, False, 0)
self.boxes['limits'] = vbox1
self.cursor.execute(self.sql.query['getCashLimits'])
# selects limitType, bigBlind
result = self.db.cursor.fetchall()
self.found = {'nl':False, 'fl':False, 'pl':False, 'ring':False, 'tour':False}
self.found = {'nl':False, 'fl':False, 'pl':False, 'cn':False, 'ring':False, 'tour':False}
if len(result) >= 1:
hbox = gtk.HBox(True, 0)
@ -759,6 +796,9 @@ class Filters(threading.Thread):
elif line[1] == 'pl':
name = str(line[2])+line[1]
self.found['pl'] = True
elif line[1] == 'cn':
name = str(line[2])+line[1]
self.found['cn'] = True
else:
name = str(line[2])+line[1]
self.found['nl'] = True
@ -787,6 +827,7 @@ class Filters(threading.Thread):
if self.found['fl']: self.num_limit_types = self.num_limit_types + 1
if self.found['pl']: self.num_limit_types = self.num_limit_types + 1
if self.found['nl']: self.num_limit_types = self.num_limit_types + 1
if self.found['cn']: self.num_limit_types = self.num_limit_types + 1
if self.num_limit_types > 1:
if self.found['fl']:
hbox = gtk.HBox(False, 0)
@ -800,6 +841,10 @@ class Filters(threading.Thread):
hbox = gtk.HBox(False, 0)
vbox3.pack_start(hbox, False, False, 0)
self.cbPL = self.createLimitLine(hbox, 'pl', self.filterText['limitsPL'])
if self.found['cn']:
hbox = gtk.HBox(False, 0)
vbox3.pack_start(hbox, False, False, 0)
self.cbCN = self.createLimitLine(hbox, 'cn', self.filterText['limitsCN'])
dest = vbox2 # for ring/tour buttons
else:
print _("INFO: No games returned from database")

View File

@ -490,7 +490,7 @@ For sites (currently only Carbon Poker) which record "all in" as a special actio
amount = amount.replace(u',', u'') #some sites have commas
Ai = Decimal(amount)
Bp = self.lastBet[street]
Bc = reduce(operator.add, self.bets[street][player], 0)
Bc = sum(self.bets[street][player])
C = Bp - Bc
if Ai <= C:
self.addCall(street, player, amount)
@ -592,7 +592,7 @@ Add a raise by amountBy on [street] by [player]
self.checkPlayerExists(player)
Rb = Decimal(amountBy)
Bp = self.lastBet[street]
Bc = reduce(operator.add, self.bets[street][player], 0)
Bc = sum(self.bets[street][player])
C = Bp - Bc
Rt = Bp + Rb
@ -609,7 +609,7 @@ For sites which by "raises x" mean "calls and raises putting a total of x in the
amount = amount.replace(u',', u'') #some sites have commas
CRb = Decimal(amount)
Bp = self.lastBet[street]
Bc = reduce(operator.add, self.bets[street][player], 0)
Bc = sum(self.bets[street][player])
C = Bp - Bc
Rb = CRb - C
Rt = Bp + Rb
@ -624,7 +624,7 @@ Add a raise on [street] by [player] to [amountTo]
self.checkPlayerExists(player)
amountTo = amountTo.replace(u',', u'') #some sites have commas
Bp = self.lastBet[street]
Bc = reduce(operator.add, self.bets[street][player], 0)
Bc = sum(self.bets[street][player])
Rt = Decimal(amountTo)
C = Bp - Bc
Rb = Rt - C - Bc
@ -1386,7 +1386,7 @@ Add a complete on [street] by [player] to [amountTo]
amountTo = amountTo.replace(u',', u'') #some sites have commas
self.checkPlayerExists(player)
Bp = self.lastBet['THIRD']
Bc = reduce(operator.add, self.bets[street][player], 0)
Bc = sum(self.bets[street][player])
Rt = Decimal(amountTo)
C = Bp - Bc
Rb = Rt - C
@ -1401,6 +1401,7 @@ Add a complete on [street] by [player] to [amountTo]
def addBringIn(self, player, bringin):
if player is not None:
log.debug(_("Bringin: %s, %s") % (player , bringin))
bringin = bringin.replace(u',', u'') #some sites have commas
bringin = Decimal(bringin)
self.bets['THIRD'][player].append(bringin)
self.stacks[player] -= bringin

View File

@ -142,7 +142,7 @@ class Table_Window(object):
if self.number is not None: break
trys += 1
if trys > 4:
log.error("Can't find table %s" % table_name)
log.error(_("Can't find table %s") % table_name)
return None
geo = self.get_geometry()

View File

@ -0,0 +1 @@
(1, 'T$', 'tour', 'stud', 'razz', 'fl', 'l', 8000, 16000, 16000, 32000)

View File

@ -0,0 +1,31 @@
{ 'boardcard1': 0,
'boardcard2': 0,
'boardcard3': 0,
'boardcard4': 0,
'boardcard5': 0,
'gametypeId': 1,
'importTime': None,
'maxSeats': 2,
'playersAtShowdown': 2,
'playersAtStreet1': 2,
'playersAtStreet2': 2,
'playersAtStreet3': 2,
'playersAtStreet4': 2,
'playersVpi': 1,
'seats': 2,
'sessionId': None,
'showdownPot': 0,
'siteHandNo': u'28333847000',
'startTime': datetime.datetime(2011, 2, 19, 10, 46, tzinfo=pytz.utc),
'street0Raises': 0,
'street1Pot': 0,
'street1Raises': 0,
'street2Pot': 0,
'street2Raises': 0,
'street3Pot': 0,
'street3Raises': 0,
'street4Pot': 0,
'street4Raises': 0,
'tableName': u'220338000 1',
'texture': None,
'tourneyId': 1}

View File

@ -0,0 +1,206 @@
{ u'Hero': { 'card1': 17,
'card2': 44,
'card3': 40,
'card4': 22,
'card5': 10,
'card6': 1,
'card7': 37,
'foldBbToStealChance': False,
'foldSbToStealChance': False,
'foldToOtherRaisedStreet0': False,
'foldToOtherRaisedStreet1': False,
'foldToOtherRaisedStreet2': False,
'foldToOtherRaisedStreet3': False,
'foldToOtherRaisedStreet4': False,
'foldToStreet1CBChance': False,
'foldToStreet1CBDone': False,
'foldToStreet2CBChance': False,
'foldToStreet2CBDone': False,
'foldToStreet3CBChance': False,
'foldToStreet3CBDone': False,
'foldToStreet4CBChance': False,
'foldToStreet4CBDone': False,
'foldedBbToSteal': False,
'foldedSbToSteal': False,
'other3BStreet0': False,
'other4BStreet0': False,
'otherRaisedStreet0': False,
'otherRaisedStreet1': False,
'otherRaisedStreet2': False,
'otherRaisedStreet3': False,
'otherRaisedStreet4': False,
'position': 0,
'raiseFirstInChance': True,
'raisedFirstIn': False,
'rake': 0,
'sawShowdown': True,
'seatNo': 2,
'sitout': False,
'startCards': 52,
'startCash': 97600,
'street0Aggr': False,
'street0Bets': 0,
'street0Calls': 1,
'street0Raises': 0,
'street0VPI': True,
'street0_3BChance': False,
'street0_3BDone': False,
'street0_4BChance': False,
'street0_4BDone': False,
'street0_C4BChance': False,
'street0_C4BDone': False,
'street0_FoldTo3BChance': False,
'street0_FoldTo3BDone': False,
'street0_FoldTo4BChance': False,
'street0_FoldTo4BDone': False,
'street0_SqueezeChance': False,
'street0_SqueezeDone': False,
'street1Aggr': False,
'street1Bets': 0,
'street1CBChance': False,
'street1CBDone': False,
'street1Calls': 0,
'street1CheckCallRaiseChance': False,
'street1CheckCallRaiseDone': False,
'street1Raises': 0,
'street1Seen': True,
'street2Aggr': False,
'street2Bets': 0,
'street2CBChance': False,
'street2CBDone': False,
'street2Calls': 0,
'street2CheckCallRaiseChance': False,
'street2CheckCallRaiseDone': False,
'street2Raises': 0,
'street2Seen': True,
'street3Aggr': False,
'street3Bets': 0,
'street3CBChance': False,
'street3CBDone': False,
'street3Calls': 0,
'street3CheckCallRaiseChance': False,
'street3CheckCallRaiseDone': False,
'street3Raises': 0,
'street3Seen': True,
'street4Aggr': False,
'street4Bets': 0,
'street4CBChance': False,
'street4CBDone': False,
'street4Calls': 0,
'street4CheckCallRaiseChance': False,
'street4CheckCallRaiseDone': False,
'street4Raises': 0,
'street4Seen': True,
'success_Steal': False,
'totalProfit': 2400,
'tourneyTypeId': 1,
'tourneysPlayersIds': 2,
'winnings': 4800,
'wonAtSD': 1.0,
'wonWhenSeenStreet1': 1.0,
'wonWhenSeenStreet2': 1.0,
'wonWhenSeenStreet3': 1.0,
'wonWhenSeenStreet4': 1.0},
u'Villain': { 'card1': 52,
'card2': 32,
'card3': 38,
'card4': 49,
'card5': 42,
'card6': 19,
'card7': 35,
'foldBbToStealChance': False,
'foldSbToStealChance': False,
'foldToOtherRaisedStreet0': False,
'foldToOtherRaisedStreet1': False,
'foldToOtherRaisedStreet2': False,
'foldToOtherRaisedStreet3': False,
'foldToOtherRaisedStreet4': False,
'foldToStreet1CBChance': False,
'foldToStreet1CBDone': False,
'foldToStreet2CBChance': False,
'foldToStreet2CBDone': False,
'foldToStreet3CBChance': False,
'foldToStreet3CBDone': False,
'foldToStreet4CBChance': False,
'foldToStreet4CBDone': False,
'foldedBbToSteal': False,
'foldedSbToSteal': False,
'other3BStreet0': False,
'other4BStreet0': False,
'otherRaisedStreet0': False,
'otherRaisedStreet1': False,
'otherRaisedStreet2': False,
'otherRaisedStreet3': False,
'otherRaisedStreet4': False,
'position': 'S',
'raiseFirstInChance': False,
'raisedFirstIn': False,
'rake': 0,
'sawShowdown': True,
'seatNo': 1,
'sitout': False,
'startCards': 708,
'startCash': 2400,
'street0Aggr': False,
'street0Bets': 0,
'street0Calls': 0,
'street0Raises': 0,
'street0VPI': False,
'street0_3BChance': False,
'street0_3BDone': False,
'street0_4BChance': False,
'street0_4BDone': False,
'street0_C4BChance': False,
'street0_C4BDone': False,
'street0_FoldTo3BChance': False,
'street0_FoldTo3BDone': False,
'street0_FoldTo4BChance': False,
'street0_FoldTo4BDone': False,
'street0_SqueezeChance': False,
'street0_SqueezeDone': False,
'street1Aggr': False,
'street1Bets': 0,
'street1CBChance': False,
'street1CBDone': False,
'street1Calls': 0,
'street1CheckCallRaiseChance': False,
'street1CheckCallRaiseDone': False,
'street1Raises': 0,
'street1Seen': True,
'street2Aggr': False,
'street2Bets': 0,
'street2CBChance': False,
'street2CBDone': False,
'street2Calls': 0,
'street2CheckCallRaiseChance': False,
'street2CheckCallRaiseDone': False,
'street2Raises': 0,
'street2Seen': True,
'street3Aggr': False,
'street3Bets': 0,
'street3CBChance': False,
'street3CBDone': False,
'street3Calls': 0,
'street3CheckCallRaiseChance': False,
'street3CheckCallRaiseDone': False,
'street3Raises': 0,
'street3Seen': True,
'street4Aggr': False,
'street4Bets': 0,
'street4CBChance': False,
'street4CBDone': False,
'street4Calls': 0,
'street4CheckCallRaiseChance': False,
'street4CheckCallRaiseDone': False,
'street4Raises': 0,
'street4Seen': True,
'success_Steal': False,
'totalProfit': -2400,
'tourneyTypeId': 1,
'tourneysPlayersIds': 1,
'winnings': 0,
'wonAtSD': 0.0,
'wonWhenSeenStreet1': 0.0,
'wonWhenSeenStreet2': 0.0,
'wonWhenSeenStreet3': 0.0,
'wonWhenSeenStreet4': 0.0}}