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

View File

@ -30,73 +30,78 @@ class DerivedStats():
self.hands = {} self.hands = {}
self.handsplayers = {} self.handsplayers = {}
self.handsactions = {} 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): def getStats(self, hand):
for player in hand.players: for player in hand.players:
self.handsplayers[player[1]] = {} self.handsplayers[player[1]] = self._initStats.copy()
#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.assembleHands(self.hand) self.assembleHands(self.hand)
self.assembleHandsPlayers(self.hand) self.assembleHandsPlayers(self.hand)

View File

@ -57,7 +57,7 @@ class Filters(threading.Thread):
,'groupstitle':_('Grouping:'), 'posnshow':_('Show Position Stats') ,'groupstitle':_('Grouping:'), 'posnshow':_('Show Position Stats')
,'datestitle':_('Date:') ,'datestitle':_('Date:')
,'groupsall':_('All Players') ,'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() gen = self.conf.get_general_params()
@ -79,7 +79,7 @@ class Filters(threading.Thread):
self.sw.show() self.sw.show()
print _("DEBUG: New packing box created!") 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.label = {}
self.callback = {} self.callback = {}
@ -154,9 +154,11 @@ class Filters(threading.Thread):
self.cbFL = None self.cbFL = None
self.cbNL = None self.cbNL = None
self.cbPL = None self.cbPL = None
self.cbCN = None
self.rb = {} # radio buttons for ring/tour self.rb = {} # radio buttons for ring/tour
self.type = None # ring/tour self.type = None # ring/tour
self.types = {} # list of all ring/tour values self.types = {} # list of all ring/tour values
self.num_limit_types = 0
self.num_limit_types = 0 self.num_limit_types = 0
self.fillLimitsFrame(vbox, self.display) self.fillLimitsFrame(vbox, self.display)
@ -430,7 +432,7 @@ class Filters(threading.Thread):
#print "__set_limit_select: limit =", limit, w.get_active() #print "__set_limit_select: limit =", limit, w.get_active()
self.limits[limit] = w.get_active() self.limits[limit] = w.get_active()
log.debug(_("self.limit[%s] set to %s") %(limit, self.limits[limit])) 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 # turning a leaf limit on with 'None' checked turns 'None' off
if self.limits[limit]: if self.limits[limit]:
if self.cbNoLimits is not None: if self.cbNoLimits is not None:
@ -439,7 +441,7 @@ class Filters(threading.Thread):
else: else:
if self.cbAllLimits is not None: if self.cbAllLimits is not None:
self.cbAllLimits.set_active(False) 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 not self.limits[limit]:
if limit.isdigit(): if limit.isdigit():
if self.cbFL is not None: if self.cbFL is not None:
@ -447,6 +449,9 @@ class Filters(threading.Thread):
elif (len(limit) > 2 and (limit[-2:] == 'nl')): elif (len(limit) > 2 and (limit[-2:] == 'nl')):
if self.cbNL is not None: if self.cbNL is not None:
self.cbNL.set_active(False) 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: else:
if self.cbPL is not None: if self.cbPL is not None:
self.cbPL.set_active(False) self.cbPL.set_active(False)
@ -462,18 +467,26 @@ class Filters(threading.Thread):
self.cbNL.set_active(True) self.cbNL.set_active(True)
if self.cbPL is not None: if self.cbPL is not None:
self.cbPL.set_active(True) self.cbPL.set_active(True)
if self.cbCN is not None:
self.cbCN.set_active(True)
elif limit == "none": elif limit == "none":
if self.limits[limit]: if self.limits[limit]:
if self.num_limit_types == 1: if self.num_limit_types > 1:
for cb in self.cbLimits.values():
cb.set_active(False)
else:
if self.cbNL is not None: if self.cbNL is not None:
self.cbNL.set_active(False) self.cbNL.set_active(False)
if self.cbFL is not None: if self.cbFL is not None:
self.cbFL.set_active(False) self.cbFL.set_active(False)
if self.cbPL is not None: if self.cbPL is not None:
self.cbPL.set_active(False) 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": elif limit == "fl":
if not self.limits[limit]: if not self.limits[limit]:
# only toggle all fl limits off if they are all currently on # only toggle all fl limits off if they are all currently on
@ -553,6 +566,29 @@ class Filters(threading.Thread):
elif self.type == 'tour': elif self.type == 'tour':
if 'ring' in self.rb: if 'ring' in self.rb:
self.rb['ring'].set_active(True) 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": elif limit == "ring":
log.debug("set", limit, "to", self.limits[limit]) log.debug("set", limit, "to", self.limits[limit])
if 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 = gtk.Button(label="hide", stock=None, use_underline=True)
showb.set_alignment(xalign=1.0, yalign=0.5) showb.set_alignment(xalign=1.0, yalign=0.5)
showb.connect('clicked', self.__toggle_box, 'limits') 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) vbox.pack_start(vbox1, False, False, 0)
self.boxes['limits'] = vbox1 self.boxes['limits'] = vbox1
self.cursor.execute(self.sql.query['getCashLimits']) self.cursor.execute(self.sql.query['getCashLimits'])
# selects limitType, bigBlind # selects limitType, bigBlind
result = self.db.cursor.fetchall() 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: if len(result) >= 1:
hbox = gtk.HBox(True, 0) hbox = gtk.HBox(True, 0)
@ -759,6 +796,9 @@ class Filters(threading.Thread):
elif line[1] == 'pl': elif line[1] == 'pl':
name = str(line[2])+line[1] name = str(line[2])+line[1]
self.found['pl'] = True self.found['pl'] = True
elif line[1] == 'cn':
name = str(line[2])+line[1]
self.found['cn'] = True
else: else:
name = str(line[2])+line[1] name = str(line[2])+line[1]
self.found['nl'] = True 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['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['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['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.num_limit_types > 1:
if self.found['fl']: if self.found['fl']:
hbox = gtk.HBox(False, 0) hbox = gtk.HBox(False, 0)
@ -800,6 +841,10 @@ class Filters(threading.Thread):
hbox = gtk.HBox(False, 0) hbox = gtk.HBox(False, 0)
vbox3.pack_start(hbox, False, False, 0) vbox3.pack_start(hbox, False, False, 0)
self.cbPL = self.createLimitLine(hbox, 'pl', self.filterText['limitsPL']) 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 dest = vbox2 # for ring/tour buttons
else: else:
print _("INFO: No games returned from database") 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 amount = amount.replace(u',', u'') #some sites have commas
Ai = Decimal(amount) Ai = Decimal(amount)
Bp = self.lastBet[street] Bp = self.lastBet[street]
Bc = reduce(operator.add, self.bets[street][player], 0) Bc = sum(self.bets[street][player])
C = Bp - Bc C = Bp - Bc
if Ai <= C: if Ai <= C:
self.addCall(street, player, amount) self.addCall(street, player, amount)
@ -592,7 +592,7 @@ Add a raise by amountBy on [street] by [player]
self.checkPlayerExists(player) self.checkPlayerExists(player)
Rb = Decimal(amountBy) Rb = Decimal(amountBy)
Bp = self.lastBet[street] Bp = self.lastBet[street]
Bc = reduce(operator.add, self.bets[street][player], 0) Bc = sum(self.bets[street][player])
C = Bp - Bc C = Bp - Bc
Rt = Bp + Rb 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 amount = amount.replace(u',', u'') #some sites have commas
CRb = Decimal(amount) CRb = Decimal(amount)
Bp = self.lastBet[street] Bp = self.lastBet[street]
Bc = reduce(operator.add, self.bets[street][player], 0) Bc = sum(self.bets[street][player])
C = Bp - Bc C = Bp - Bc
Rb = CRb - C Rb = CRb - C
Rt = Bp + Rb Rt = Bp + Rb
@ -624,7 +624,7 @@ Add a raise on [street] by [player] to [amountTo]
self.checkPlayerExists(player) self.checkPlayerExists(player)
amountTo = amountTo.replace(u',', u'') #some sites have commas amountTo = amountTo.replace(u',', u'') #some sites have commas
Bp = self.lastBet[street] Bp = self.lastBet[street]
Bc = reduce(operator.add, self.bets[street][player], 0) Bc = sum(self.bets[street][player])
Rt = Decimal(amountTo) Rt = Decimal(amountTo)
C = Bp - Bc C = Bp - Bc
Rb = Rt - C - 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 amountTo = amountTo.replace(u',', u'') #some sites have commas
self.checkPlayerExists(player) self.checkPlayerExists(player)
Bp = self.lastBet['THIRD'] Bp = self.lastBet['THIRD']
Bc = reduce(operator.add, self.bets[street][player], 0) Bc = sum(self.bets[street][player])
Rt = Decimal(amountTo) Rt = Decimal(amountTo)
C = Bp - Bc C = Bp - Bc
Rb = Rt - C Rb = Rt - C
@ -1401,6 +1401,7 @@ Add a complete on [street] by [player] to [amountTo]
def addBringIn(self, player, bringin): def addBringIn(self, player, bringin):
if player is not None: if player is not None:
log.debug(_("Bringin: %s, %s") % (player , bringin)) log.debug(_("Bringin: %s, %s") % (player , bringin))
bringin = bringin.replace(u',', u'') #some sites have commas
bringin = Decimal(bringin) bringin = Decimal(bringin)
self.bets['THIRD'][player].append(bringin) self.bets['THIRD'][player].append(bringin)
self.stacks[player] -= bringin self.stacks[player] -= bringin

View File

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