From f323447313ddcc3efe8bdafbe775e0914787647c Mon Sep 17 00:00:00 2001 From: Ray Date: Sat, 4 Jul 2009 14:35:20 -0400 Subject: [PATCH 1/7] Get shown and mucked cards for stud games. --- pyfpdb/Hand.py | 61 ++++++++++++++++++++++++++++---------- pyfpdb/PokerStarsToFpdb.py | 2 +- 2 files changed, 47 insertions(+), 16 deletions(-) diff --git a/pyfpdb/Hand.py b/pyfpdb/Hand.py index fa472b03..237b609a 100644 --- a/pyfpdb/Hand.py +++ b/pyfpdb/Hand.py @@ -410,6 +410,20 @@ Add a raise on [street] by [player] to [amountTo] self.collectees[player] += Decimal(pot) + def addShownCards(self, cards, player, holeandboard=None, shown=True, mucked=False): + """\ +For when a player shows cards for any reason (for showdown or out of choice). +Card ranks will be uppercased +""" + logging.debug("addShownCards %s hole=%s all=%s" % (player, cards, holeandboard)) + if cards is not None: + self.addHoleCards(cards,player,shown, mucked) + elif holeandboard is not None: + holeandboard = set([self.card(c) for c in holeandboard]) + board = set([c for s in self.board.values() for c in s]) + self.addHoleCards(holeandboard.difference(board),player,shown, mucked) + + def totalPot(self): """If all bets and blinds have been added, totals up the total pot size""" @@ -567,20 +581,6 @@ dealt whether they were seen in a 'dealt to' line else: self.holecards['PREFLOP'][player] = cardset - def addShownCards(self, cards, player, holeandboard=None, shown=True, mucked=False): - """\ -For when a player shows cards for any reason (for showdown or out of choice). -Card ranks will be uppercased -""" - logging.debug("addShownCards %s hole=%s all=%s" % (player, cards, holeandboard)) - if cards is not None: - self.addHoleCards(cards,player,shown, mucked) - elif holeandboard is not None: - holeandboard = set([self.card(c) for c in holeandboard]) - board = set([c for s in self.board.values() for c in s]) - self.addHoleCards(holeandboard.difference(board),player,shown, mucked) - - def writeHTMLHand(self, fh=sys.__stdout__): from nevow import tags as T from nevow import flat @@ -991,7 +991,7 @@ class StudHand(Hand): hhc.readStudPlayerCards(self, street) hhc.readAction(self, street) hhc.readCollectPot(self) - #hhc.readShownCards(self) # not done yet + hhc.readShownCards(self) # not done yet self.totalPot() # finalise it (total the pot) hhc.getRake(self) elif builtFrom == "DB": @@ -1014,6 +1014,36 @@ closed likewise, but known only to player except FpdbParseError, e: print "[ERROR] Tried to add holecards for unknown player: %s" % (player,) + def addHoleCards(self, cards, player, shown, mucked, dealt=False): + """\ +Assigns observed holecards to a player. +cards list of card bigrams e.g. ['2h','Jc'] +player (string) name of player +shown whether they were revealed at showdown +mucked whether they were mucked at showdown +dealt whether they were seen in a 'dealt to' line +""" +# +# For stud games we just need to do the routine setting of shown/mucked/etc +# and then update the cards 'THIRD' and 'SEVENTH' + logging.debug("addHoleCards %s %s" % (cards, player)) + try: + self.checkPlayerExists(player) + except FpdbParseError, e: + print "[ERROR] Tried to add holecards for unknown player: %s" % (player,) + return + + if dealt: + self.dealt.add(player) + if shown: + self.shown.add(player) + if mucked: + self.mucked.add(player) + if len(cards) > 2: + self.holecards['THIRD'][player] = (cards[0:3], None) + if len(cards) > 6: + self.holecards['SEVENTH'][player] = (cards[6], None) + # TODO: def addComplete(self, player, amount): def addComplete(self, street, player, amountTo): # assert street=='THIRD' @@ -1045,6 +1075,7 @@ Add a complete on [street] by [player] to [amountTo] self.actions['THIRD'].append(act) self.lastBet['THIRD'] = Decimal(bringin) self.pot.addMoney(player, Decimal(bringin)) + def writeHand(self, fh=sys.__stdout__): # PokerStars format. diff --git a/pyfpdb/PokerStarsToFpdb.py b/pyfpdb/PokerStarsToFpdb.py index 75609001..2181b7cc 100755 --- a/pyfpdb/PokerStarsToFpdb.py +++ b/pyfpdb/PokerStarsToFpdb.py @@ -317,7 +317,7 @@ follow : whether to tail -f the input""" for m in self.re_ShownCards.finditer(hand.handText): if m.group('CARDS') is not None: cards = m.group('CARDS') - cards = set(cards.split(' ')) + cards = cards.split(' ') # needs to be a list, not a set--stud needs the order (shown, mucked) = (False, False) if m.group('SHOWED') == "showed": shown = True From a35b1a8b3c48924fc1141a4f39a9bed26b1b1caf Mon Sep 17 00:00:00 2001 From: Ray Date: Sat, 4 Jul 2009 15:19:46 -0400 Subject: [PATCH 2/7] Make WriteHand for stud report mucked hand. --- pyfpdb/Hand.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/pyfpdb/Hand.py b/pyfpdb/Hand.py index 237b609a..bf2b1ab2 100644 --- a/pyfpdb/Hand.py +++ b/pyfpdb/Hand.py @@ -1042,7 +1042,7 @@ dealt whether they were seen in a 'dealt to' line if len(cards) > 2: self.holecards['THIRD'][player] = (cards[0:3], None) if len(cards) > 6: - self.holecards['SEVENTH'][player] = (cards[6], None) + self.holecards['SEVENTH'][player] = ([cards[6]], None) # TODO: def addComplete(self, player, amount): def addComplete(self, street, player, amountTo): @@ -1212,11 +1212,13 @@ Add a complete on [street] by [player] to [amountTo] seatnum = player[0] name = player[1] if name in self.collectees and name in self.shown: - print >>fh, _("Seat %d: %s showed [%s] and won ($%s)" % (seatnum, name, " ".join(self.holecards[name]), self.collectees[name])) + print >>fh, _("Seat %d: %s showed [%s] and won ($%s)" % (seatnum, name, self.join_holecards(name), self.collectees[name])) elif name in self.collectees: print >>fh, _("Seat %d: %s collected ($%s)" % (seatnum, name, self.collectees[name])) elif name in self.shown: - print >>fh, _("Seat %d: %s showed [%s]" % (seatnum, name, " ".join(self.holecards[name]))) + print >>fh, _("Seat %d: %s showed [%s]" % (seatnum, name, self.join_holecards(name))) + elif name in self.mucked: + print >>fh, _("Seat %d: %s mucked [%s]" % (seatnum, name, self.join_holecards(name))) elif name in self.folded: print >>fh, _("Seat %d: %s folded" % (seatnum, name)) else: @@ -1225,6 +1227,12 @@ Add a complete on [street] by [player] to [amountTo] print >>fh, "\n\n" + def join_holecards(self, player): + holecards = [] + for street in self.holeStreets: + if self.holecards[street].has_key(player): + holecards = holecards + self.holecards[street][player][0] + return " ".join(holecards) class Pot(object): From c4cc6bd1aa066a91fec77c089327a5c6c8ec5140 Mon Sep 17 00:00:00 2001 From: Ray Date: Sat, 4 Jul 2009 15:28:20 -0400 Subject: [PATCH 3/7] Make WriteHand for holdem report mucked cards. --- pyfpdb/Hand.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pyfpdb/Hand.py b/pyfpdb/Hand.py index bf2b1ab2..2a5c671d 100644 --- a/pyfpdb/Hand.py +++ b/pyfpdb/Hand.py @@ -772,6 +772,8 @@ dealt whether they were seen in a 'dealt to' line else: if name in self.shown: print >>fh, ("Seat %d: %s showed [%s] and lost with..." % (seatnum, name, " ".join(self.holecards['PREFLOP'][name]))) + elif name in self.mucked: + print >>fh, ("Seat %d: %s mucked [%s] " % (seatnum, name, " ".join(self.holecards['PREFLOP'][name]))) else: print >>fh, ("Seat %d: %s mucked" % (seatnum, name)) From 8f2350f86198fd8da88c22a9401855f1f4c18844 Mon Sep 17 00:00:00 2001 From: Ray Date: Sun, 5 Jul 2009 11:47:18 -0400 Subject: [PATCH 4/7] Set dealt flag when reading holdem hero cards. --- pyfpdb/PokerStarsToFpdb.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyfpdb/PokerStarsToFpdb.py b/pyfpdb/PokerStarsToFpdb.py index 2181b7cc..6cb81081 100755 --- a/pyfpdb/PokerStarsToFpdb.py +++ b/pyfpdb/PokerStarsToFpdb.py @@ -224,7 +224,7 @@ follow : whether to tail -f the input""" # Also works with Omaha hands. cards = m.group('NEWCARDS') cards = set(cards.split(' ')) - hand.addHoleCards(cards, m.group('PNAME'), shown=False, mucked=False) + hand.addHoleCards(cards, m.group('PNAME'), shown=False, mucked=False, dealt=True) def readDrawCards(self, hand, street): logging.debug("readDrawCards") From 799aa41c1ed8c2571ffef3cf92caf7d1c90c3c02 Mon Sep 17 00:00:00 2001 From: Ray Date: Sun, 5 Jul 2009 23:44:53 -0400 Subject: [PATCH 5/7] Correct handling of open/closed stud hole cards. --- pyfpdb/Hand.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/pyfpdb/Hand.py b/pyfpdb/Hand.py index 2a5c671d..db1d1197 100644 --- a/pyfpdb/Hand.py +++ b/pyfpdb/Hand.py @@ -1041,10 +1041,16 @@ dealt whether they were seen in a 'dealt to' line self.shown.add(player) if mucked: self.mucked.add(player) - if len(cards) > 2: - self.holecards['THIRD'][player] = (cards[0:3], None) - if len(cards) > 6: - self.holecards['SEVENTH'][player] = ([cards[6]], None) + if player == self.hero: + if len(cards) > 2: + self.holecards['THIRD'][player] = ([cards[0:3]], []) + if len(cards) > 6: + self.holecards['SEVENTH'][player] = ([cards[6]], []) + else: + if len(cards) > 2: + self.holecards['THIRD'][player] = ([cards[0]], cards[1:3]) + if len(cards) > 6: + self.holecards['SEVENTH'][player] = ([], [cards[6]]) # TODO: def addComplete(self, player, amount): def addComplete(self, street, player, amountTo): From 4ae8b123ce1561a0bba727a9aec39ac3ec15e396 Mon Sep 17 00:00:00 2001 From: Ray Date: Mon, 6 Jul 2009 12:00:16 -0400 Subject: [PATCH 6/7] Fix game type for non-Mixed games. --- pyfpdb/PokerStarsToFpdb.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyfpdb/PokerStarsToFpdb.py b/pyfpdb/PokerStarsToFpdb.py index 6cb81081..45306281 100755 --- a/pyfpdb/PokerStarsToFpdb.py +++ b/pyfpdb/PokerStarsToFpdb.py @@ -109,7 +109,7 @@ follow : whether to tail -f the input""" info['bb'] = mg['BB'] if 'CURRENCY' in mg: info['currency'] = currencies[mg['CURRENCY']] - if 'MIXED' in mg: + if 'MIXED' in mg and mg['MIXED'] != None: info['mixedType'] = mixes[mg['MIXED']] # NB: SB, BB must be interpreted as blinds or bets depending on limit type. From 21d227667966b844fcaff561133eebc3075f24d3 Mon Sep 17 00:00:00 2001 From: Ray Date: Mon, 6 Jul 2009 12:01:39 -0400 Subject: [PATCH 7/7] Get rid of intermediate hand obj print. --- pyfpdb/HandHistoryConverter.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pyfpdb/HandHistoryConverter.py b/pyfpdb/HandHistoryConverter.py index f5c4c2a5..fc6567f0 100644 --- a/pyfpdb/HandHistoryConverter.py +++ b/pyfpdb/HandHistoryConverter.py @@ -238,6 +238,7 @@ which it expects to find at self.re_TailSplitHands -- see for e.g. Everleaf.py. logging.info("Unsupported game type: %s" % gametype) if hand: +# print hand hand.writeHand(self.out_fh) else: logging.info("Unsupported game type: %s" % gametype)