From 3234f89aad45f36928fa1113c19d35140b5a15aa Mon Sep 17 00:00:00 2001 From: Ray Date: Sun, 12 Jul 2009 16:01:02 -0400 Subject: [PATCH] Rationalized hole card format for flop games. Also updated writehand() so flop hands are written OK. This breaks stud and draw--fixing them now. --- pyfpdb/Hand.py | 69 +++++++++++++++++++------------------- pyfpdb/PokerStarsToFpdb.py | 50 ++++++++++++++++++++------- 2 files changed, 72 insertions(+), 47 deletions(-) diff --git a/pyfpdb/Hand.py b/pyfpdb/Hand.py index cc1dfd5a..a9d6d49d 100644 --- a/pyfpdb/Hand.py +++ b/pyfpdb/Hand.py @@ -138,6 +138,29 @@ class Hand: str = str + "\n%s =\n" % name + pprint.pformat(struct, 4) return str + def addHoleCards(self, street, player, open=[], closed=[], shown=False, mucked=False, 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" % (open + closed, 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) + + print "stuff =", street, player, open, closed + self.holecards[street][player] = [open, closed] + def insert(self, db): """ Function to insert Hand into database Should not commit, and do minimal selects. Callers may want to cache commits @@ -559,35 +582,13 @@ class HoldemOmahaHand(Hand): pass - 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)) - try: - self.checkPlayerExists(player) - except FpdbParseError, e: - print "[ERROR] Tried to add holecards for unknown player: %s" % (player,) - return - - cardset = set((self.card(c) for c in cards)) - if len(cardset) == 0: - return - if dealt: - 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) + def addShownCards(self, cards, player, shown=True, mucked=False, dealt=False): + if player == self.hero: # we have hero's cards just update shown/mucked + if shown: self.shown.add(player) + if mucked: self.mucked.add(player) else: - self.holecards['PREFLOP'][player] = cardset + self.addHoleCards('PREFLOP', player, open=[], closed=cards, shown=shown, mucked=mucked, dealt=dealt) + def writeHTMLHand(self, fh=sys.__stdout__): from nevow import tags as T @@ -701,10 +702,10 @@ dealt whether they were seen in a 'dealt to' line print >>fh, ("*** HOLE CARDS ***") for player in self.dealt: - print >>fh, ("Dealt to %s [%s]" %(player, " ".join(self.holecards['PREFLOP'][player]))) + print >>fh, ("Dealt to %s [%s]" %(player, " ".join(self.holecards['PREFLOP'][player][1]))) if self.hero == "": for player in self.shown.difference(self.dealt): - print >>fh, ("Dealt to %s [%s]" %(player, " ".join(self.holecards['PREFLOP'][player]))) + print >>fh, ("Dealt to %s [%s]" %(player, " ".join(self.holecards['PREFLOP'][player][1]))) if self.actions['PREFLOP']: for act in self.actions['PREFLOP']: @@ -743,7 +744,7 @@ dealt whether they were seen in a 'dealt to' line elif self.gametype['category'] in ('holdem'): numOfHoleCardsNeeded = 2 if len(self.holecards['PREFLOP'][name]) == numOfHoleCardsNeeded: - print >>fh, ("%s shows [%s] (a hand...)" % (name, " ".join(self.holecards['PREFLOP'][name]))) + print >>fh, ("%s shows [%s] (a hand...)" % (name, " ".join(self.holecards['PREFLOP'][name][1]))) # Current PS format has the lines: # Uncalled bet ($111.25) returned to s0rrow @@ -770,7 +771,7 @@ dealt whether they were seen in a 'dealt to' line 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['PREFLOP'][name]), self.collectees[name])) + print >>fh, ("Seat %d: %s showed [%s] and won ($%s)" % (seatnum, name, " ".join(self.holecards['PREFLOP'][name][1]), 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: @@ -779,9 +780,9 @@ dealt whether they were seen in a 'dealt to' line print >>fh, ("Seat %d: %s folded" % (seatnum, name)) else: if name in self.shown: - print >>fh, ("Seat %d: %s showed [%s] and lost with..." % (seatnum, name, " ".join(self.holecards['PREFLOP'][name]))) + print >>fh, ("Seat %d: %s showed [%s] and lost with..." % (seatnum, name, " ".join(self.holecards['PREFLOP'][name][1]))) elif name in self.mucked: - print >>fh, ("Seat %d: %s mucked [%s] " % (seatnum, name, " ".join(self.holecards['PREFLOP'][name]))) + print >>fh, ("Seat %d: %s mucked [%s] " % (seatnum, name, " ".join(self.holecards['PREFLOP'][name][1]))) else: print >>fh, ("Seat %d: %s mucked" % (seatnum, name)) diff --git a/pyfpdb/PokerStarsToFpdb.py b/pyfpdb/PokerStarsToFpdb.py index a16e0cef..1be2f767 100755 --- a/pyfpdb/PokerStarsToFpdb.py +++ b/pyfpdb/PokerStarsToFpdb.py @@ -80,6 +80,7 @@ follow : whether to tail -f the input""" self.re_BringIn = re.compile(r"^%s: brings[- ]in( low|) for \$?(?P[.0-9]+)" % player_re, re.MULTILINE) self.re_PostBoth = re.compile(r"^%s: posts small \& big blinds \[\$? (?P[.0-9]+)" % player_re, re.MULTILINE) self.re_HeroCards = re.compile(r"^Dealt to %s(?: \[(?P.+?)\])?( \[(?P.+?)\])" % player_re, re.MULTILINE) +# self.re_DealToCards = re.compile(r"^Dealt to %s(?: \[(?P.+?)\])?( \[(?P.+?)\])" % player_re, re.MULTILINE) # self.re_Action = re.compile(r"^%s:(?P bets| checks| raises| calls| folds| discards| stands pat)( \$?(?P[.\d]+))?( to \$?(?P[.\d]+))?( (?P\d) cards?( \[(?P.+?)\])?)?" % player_re, re.MULTILINE) self.re_Action = re.compile(r"""^%s:(?P\sbets|\schecks|\sraises|\scalls|\sfolds|\sdiscards|\sstands\spat) (\s\$?(?P[.\d]+))?(\sto\s\$?(?P[.\d]+))? # the number discarded goes in @@ -265,18 +266,41 @@ follow : whether to tail -f the input""" for a in self.re_PostBoth.finditer(hand.handText): hand.addBlind(a.group('PNAME'), 'both', a.group('SBBB')) +# def readHeroCards(self, hand): +# m = self.re_HeroCards.search(hand.handText) +# if(m == None): +# #Not involved in hand +# hand.involved = False +# else: +# hand.hero = m.group('PNAME') +# # "2c, qh" -> set(["2c","qc"]) +# # Also works with Omaha hands. +# cards = m.group('NEWCARDS') +# cards = set(cards.split(' ')) +# hand.addHoleCards(cards, m.group('PNAME'), shown=False, mucked=False, dealt=True) + def readHeroCards(self, hand): - m = self.re_HeroCards.search(hand.handText) - if(m == None): - #Not involved in hand - hand.involved = False - else: - hand.hero = m.group('PNAME') - # "2c, qh" -> set(["2c","qc"]) - # Also works with Omaha hands. - cards = m.group('NEWCARDS') - cards = set(cards.split(' ')) - hand.addHoleCards(cards, m.group('PNAME'), shown=False, mucked=False, dealt=True) +# streets PREFLOP, PREDRAW, and THIRD are special cases + for street in ('PREFLOP', 'PREDRAW'): + if street in hand.streets.keys(): + print "text =", hand.streets[street] + m = self.re_HeroCards.search(hand.streets[street]) + if m == None: + hand.involved = False + else: + hand.hero = m.group('PNAME') + newcards = m.group('NEWCARDS').split(' ') + hand.addHoleCards(street, hand.hero, closed=newcards, shown=False, mucked=False, dealt=True) + +# def readHeroCards(self, hand): +# for street, text in hand.streets.iteritems(): +# m = self.re_HeroCards.search(hand.handText) +# if(m == None): +# #Not involved in hand +# hand.involved = False +# else: + + def readDrawCards(self, hand, street): logging.debug("readDrawCards") @@ -357,9 +381,9 @@ follow : whether to tail -f the input""" def readShowdownActions(self, hand): +# TODO: pick up mucks also for shows in self.re_ShowdownAction.finditer(hand.handText): - cards = shows.group('CARDS') - cards = set(cards.split(' ')) + cards = shows.group('CARDS').split(' ') hand.addShownCards(cards, shows.group('PNAME')) def readCollectPot(self,hand):