From 9d7c370449f62dfef40b6c9f7978bec827fb1c3e Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 3 Jul 2009 18:59:50 -0400 Subject: [PATCH] Get mucked cards from Stars flop games. __str__ method for Hand. --- pyfpdb/Hand.py | 56 ++++++++++++++++++++++++++++++++++---- pyfpdb/PokerStarsToFpdb.py | 12 ++++++-- 2 files changed, 60 insertions(+), 8 deletions(-) diff --git a/pyfpdb/Hand.py b/pyfpdb/Hand.py index a0c1537c..fa472b03 100644 --- a/pyfpdb/Hand.py +++ b/pyfpdb/Hand.py @@ -26,6 +26,7 @@ import operator import time,datetime from copy import deepcopy from Exceptions import * +import pprint import DerivedStats import Card @@ -74,6 +75,7 @@ class Hand: self.folded = set() self.dealt = set() # 'dealt to' line to be printed self.shown = set() # cards were shown + self.mucked = set() # cards were mucked at showdown # self.action = [] # Things to do with money @@ -83,8 +85,49 @@ class Hand: self.rake = None def __str__(self): + vars = ( ("BB", self.bb), + ("SB", self.sb), + ("BUTTONPOS", self.buttonpos), + ("HAND NO.", self.handid), + ("SITE", self.sitename), + ("TABLE NAME", self.tablename), + ("HERO", self.hero), + ("MAXSEATS", self.maxseats), + ("LASTBET", self.lastBet), + ("ACTION STREETS", self.actionStreets), + ("STREETS", self.streets), + ("ALL STREETS", self.allStreets), + ("COMMUNITY STREETS", self.communityStreets), + ("HOLE STREETS", self.holeStreets), + ("COUNTED SEATS", self.counted_seats), + ("DEALT", self.dealt), + ("SHOWN", self.shown), + ("MUCKED", self.mucked), + ("TOTAL POT", self.totalpot), + ("TOTAL COLLECTED", self.totalcollected), + ("RAKE", self.rake), + ("START TIME", self.starttime), + ) + + structs = ( ("PLAYERS", self.players), + ("STACKS", self.stacks), + ("POSTED", self.posted), + ("POT", self.pot), + ("SEATING", self.seating), + ("GAMETYPE", self.gametype), + ("ACTION", self.actions), + ("COLLECTEES", self.collectees), + ("BETS", self.bets), + ("BOARD", self.board), + ("DISCARDS", self.discards), + ("HOLECARDS", self.holecards), + ) str = '' - str = str + "Hand Object for %s at %s" % (self.handid, self.sitename) + for (name, var) in vars: + str = str + "\n%s = " % name + pprint.pformat(var) + + for (name, struct) in structs: + str = str + "\n%s =\n" % name + pprint.pformat(struct, 4) return str def insert(self, db): @@ -494,12 +537,13 @@ class HoldemOmahaHand(Hand): pass - def addHoleCards(self, cards, player, shown=False, dealt=False): + 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 """ logging.debug("addHoleCards %s %s" % (cards, player)) @@ -516,23 +560,25 @@ dealt whether they were seen in a 'dealt to' line self.dealt.add(player) if shown: self.shown.add(player) + if mucked: + self.mucked.add(player) if player in self.holecards['PREFLOP']: self.holecards['PREFLOP'][player].update(cardset) else: self.holecards['PREFLOP'][player] = cardset - def addShownCards(self, cards, player, holeandboard=None): + 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=True) + 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=True) + self.addHoleCards(holeandboard.difference(board),player,shown, mucked) def writeHTMLHand(self, fh=sys.__stdout__): diff --git a/pyfpdb/PokerStarsToFpdb.py b/pyfpdb/PokerStarsToFpdb.py index 5350713c..154d2b9d 100755 --- a/pyfpdb/PokerStarsToFpdb.py +++ b/pyfpdb/PokerStarsToFpdb.py @@ -66,7 +66,7 @@ follow : whether to tail -f the input""" self.re_ShowdownAction = re.compile(r"^%s: shows \[(?P.*)\]" % player_re, re.MULTILINE) self.re_CollectPot = re.compile(r"Seat (?P[0-9]+): %s (\(button\) |\(small blind\) |\(big blind\) )?(collected|showed \[.*\] and won) \(\$(?P[.\d]+)\)(, mucked| with.*|)" % player_re, re.MULTILINE) self.re_sitsOut = re.compile("^%s sits out" % player_re, re.MULTILINE) - self.re_ShownCards = re.compile("^Seat (?P[0-9]+): %s \(.*\) showed \[(?P.*)\].*" % player_re, re.MULTILINE) + self.re_ShownCards = re.compile("^Seat (?P[0-9]+): %s \(.*\) (?Pshowed|mucked) \[(?P.*)\].*" % player_re, re.MULTILINE) def readSupportedGames(self): @@ -222,7 +222,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')) + hand.addHoleCards(cards, m.group('PNAME'), shown=False, mucked=False) def readDrawCards(self, hand, street): logging.debug("readDrawCards") @@ -314,9 +314,15 @@ follow : whether to tail -f the input""" def readShownCards(self,hand): for m in self.re_ShownCards.finditer(hand.handText): if m.group('CARDS') is not None: + print "SHOWED", m.group('SHOWED') cards = m.group('CARDS') cards = set(cards.split(' ')) - hand.addShownCards(cards=cards, player=m.group('PNAME')) + + (shown, mucked) = (False, False) + if m.group('SHOWED') == "showed": shown = True + elif m.group('SHOWED') == "mucked": mucked = True + + hand.addShownCards(cards=cards, player=m.group('PNAME'), shown=shown, mucked=mucked) if __name__ == "__main__": parser = OptionParser()