diff --git a/pyfpdb/Database.py b/pyfpdb/Database.py index 0480e9f3..748ca454 100644 --- a/pyfpdb/Database.py +++ b/pyfpdb/Database.py @@ -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) diff --git a/pyfpdb/DerivedStats.py b/pyfpdb/DerivedStats.py index 7f77e80c..250e58ff 100644 --- a/pyfpdb/DerivedStats.py +++ b/pyfpdb/DerivedStats.py @@ -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) diff --git a/pyfpdb/Filters.py b/pyfpdb/Filters.py index 75737ae2..f19774c7 100644 --- a/pyfpdb/Filters.py +++ b/pyfpdb/Filters.py @@ -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") diff --git a/pyfpdb/Hand.py b/pyfpdb/Hand.py index db6b0620..727ca00d 100644 --- a/pyfpdb/Hand.py +++ b/pyfpdb/Hand.py @@ -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 diff --git a/pyfpdb/TableWindow.py b/pyfpdb/TableWindow.py index 4cab43ad..72151d13 100644 --- a/pyfpdb/TableWindow.py +++ b/pyfpdb/TableWindow.py @@ -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() diff --git a/pyfpdb/regression-test-files/tour/FTP/Stud/Razz-USD-HUSNG-2-201102.Villain.allin.on.bringing.txt b/pyfpdb/regression-test-files/tour/FTP/Stud/Razz-USD-HUSNG-2-201102.Villain.allin.on.bringing.txt new file mode 100644 index 00000000..035e0542 Binary files /dev/null and b/pyfpdb/regression-test-files/tour/FTP/Stud/Razz-USD-HUSNG-2-201102.Villain.allin.on.bringing.txt differ diff --git a/pyfpdb/regression-test-files/tour/FTP/Stud/Razz-USD-HUSNG-2-201102.Villain.allin.on.bringing.txt.gt b/pyfpdb/regression-test-files/tour/FTP/Stud/Razz-USD-HUSNG-2-201102.Villain.allin.on.bringing.txt.gt new file mode 100644 index 00000000..fba7545b --- /dev/null +++ b/pyfpdb/regression-test-files/tour/FTP/Stud/Razz-USD-HUSNG-2-201102.Villain.allin.on.bringing.txt.gt @@ -0,0 +1 @@ +(1, 'T$', 'tour', 'stud', 'razz', 'fl', 'l', 8000, 16000, 16000, 32000) diff --git a/pyfpdb/regression-test-files/tour/FTP/Stud/Razz-USD-HUSNG-2-201102.Villain.allin.on.bringing.txt.hands b/pyfpdb/regression-test-files/tour/FTP/Stud/Razz-USD-HUSNG-2-201102.Villain.allin.on.bringing.txt.hands new file mode 100644 index 00000000..315dc468 --- /dev/null +++ b/pyfpdb/regression-test-files/tour/FTP/Stud/Razz-USD-HUSNG-2-201102.Villain.allin.on.bringing.txt.hands @@ -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} diff --git a/pyfpdb/regression-test-files/tour/FTP/Stud/Razz-USD-HUSNG-2-201102.Villain.allin.on.bringing.txt.hp b/pyfpdb/regression-test-files/tour/FTP/Stud/Razz-USD-HUSNG-2-201102.Villain.allin.on.bringing.txt.hp new file mode 100644 index 00000000..b5f7f2a3 --- /dev/null +++ b/pyfpdb/regression-test-files/tour/FTP/Stud/Razz-USD-HUSNG-2-201102.Villain.allin.on.bringing.txt.hp @@ -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}}