pot total and rake

This commit is contained in:
Matt Turnbull 2008-12-06 14:13:38 +00:00
parent 47e2fd053a
commit 95f43dfd74
2 changed files with 72 additions and 49 deletions

View File

@ -58,6 +58,9 @@ from HandHistoryConverter import *
# smaragdar calls [$ 34.50 USD] # smaragdar calls [$ 34.50 USD]
# ** Dealing Turn ** [ 2d ] # ** Dealing Turn ** [ 2d ]
# ** Dealing River ** [ 6c ] # ** Dealing River ** [ 6c ]
# dogge shows [ 9h, 9c ]a pair of nines
# spicybum shows [ 5d, 6d ]a straight, eight high
# harrydebeng does not show cards
# smaragdar wins $ 102 USD from main pot with a pair of aces [ ad, ah, qs, 8h, 6c ] # smaragdar wins $ 102 USD from main pot with a pair of aces [ ad, ah, qs, 8h, 6c ]
class Everleaf(HandHistoryConverter): class Everleaf(HandHistoryConverter):
@ -116,9 +119,7 @@ class Everleaf(HandHistoryConverter):
for a in m: for a in m:
hand.addPlayer(a.group('SEAT'), a.group('PNAME'), a.group('CASH')) hand.addPlayer(a.group('SEAT'), a.group('PNAME'), a.group('CASH'))
#players = players + [[a.group('SEAT'), a.group('PNAME'), a.group('CASH')]]
#hand.players = players
def markStreets(self, hand): def markStreets(self, hand):
# PREFLOP = ** Dealing down cards ** # PREFLOP = ** Dealing down cards **
@ -159,14 +160,14 @@ class Everleaf(HandHistoryConverter):
hand.addCall( street, action.group('PNAME'), action.group('BET') ) hand.addCall( street, action.group('PNAME'), action.group('BET') )
elif action.group('ATYPE') == 'bets': elif action.group('ATYPE') == 'bets':
hand.addBet( street, action.group('PNAME'), action.group('BET') ) hand.addBet( street, action.group('PNAME'), action.group('BET') )
# mct: do we need to keep bet distinct from raise?
# hand.actions[street] += [[action.group('PNAME'), action.group('ATYPE'), action.group('BET')]]
else: else:
print "DEBUG: unimplemented readAction: %s %s" %(action.group('PNAME'),action.group('ATYPE'),) print "DEBUG: unimplemented readAction: %s %s" %(action.group('PNAME'),action.group('ATYPE'),)
hand.actions[street] += [[action.group('PNAME'), action.group('ATYPE')]] hand.actions[street] += [[action.group('PNAME'), action.group('ATYPE')]]
#print "DEBUG: readAction: %s " %(hand.actions)
def getRake(self, hand):
hand.rake = hand.totalpot * Decimal('0.05') # probably not quite right
if __name__ == "__main__": if __name__ == "__main__":
c = Configuration.Config() c = Configuration.Config()
e = Everleaf(c, "Speed_Kuala.txt") e = Everleaf(c, "Speed_Kuala.txt")

View File

@ -74,13 +74,20 @@ class HandHistoryConverter:
for street in hand.streets.groupdict(): for street in hand.streets.groupdict():
self.readAction(hand, street) self.readAction(hand, street)
# finalise it (total the pot)
hand.totalPot()
self.getRake(hand)
if(hand.involved == True): if(hand.involved == True):
#self.writeHand("output file", hand) #self.writeHand("output file", hand)
hand.printHand() hand.printHand()
else: else:
pass #Don't write out observed hands pass #Don't write out observed hands
# Functions to be implemented in the inheriting class #####
# These functions are parse actions that may be overridden by the inheriting class
#
def readSupportedGames(self): abstract def readSupportedGames(self): abstract
# should return a list # should return a list
@ -89,7 +96,14 @@ class HandHistoryConverter:
# Valid types specified in docs/tabledesign.html in Gametypes # Valid types specified in docs/tabledesign.html in Gametypes
def determineGameType(self): abstract def determineGameType(self): abstract
#TODO: Comment # Read any of:
# HID HandID
# TABLE Table name
# SB small blind
# BB big blind
# GAMETYPE gametype
# YEAR MON DAY HR MIN SEC datetime
# BUTTON button seat number
def readHandInfo(self, hand): abstract def readHandInfo(self, hand): abstract
# Needs to return a list of lists in the format # Needs to return a list of lists in the format
@ -97,6 +111,7 @@ class HandHistoryConverter:
def readPlayerStacks(self, hand): abstract def readPlayerStacks(self, hand): abstract
# Needs to return a MatchObject with group names identifying the streets into the Hand object # Needs to return a MatchObject with group names identifying the streets into the Hand object
# that is, pulls the chunks of preflop, flop, turn and river text into hand.streets MatchObject.
def markStreets(self, hand): abstract def markStreets(self, hand): abstract
#Needs to return a list in the format #Needs to return a list in the format
@ -105,7 +120,11 @@ class HandHistoryConverter:
def readBlinds(self, hand): abstract def readBlinds(self, hand): abstract
def readHeroCards(self, hand): abstract def readHeroCards(self, hand): abstract
def readAction(self, hand, street): abstract def readAction(self, hand, street): abstract
# Some sites don't report the rake. This will be called at the end of the hand after the pot total has been calculated
# so that an inheriting class can calculate it for the specific site if need be.
def getRake(self, hand): abstract
def sanityCheck(self): def sanityCheck(self):
sane = True sane = True
base_w = False base_w = False
@ -265,12 +284,11 @@ class Hand:
self.hero = "Hiro" self.hero = "Hiro"
self.holecards = "Xx Xx" self.holecards = "Xx Xx"
self.action = [] self.action = []
self.totalpot = None
self.rake = 0 self.rake = None
self.bets = {} self.bets = {}
self.lastBet = {} self.lastBet = {}
self.orderedBets = {}
for street in self.STREETS: for street in self.STREETS:
self.bets[street] = {} self.bets[street] = {}
self.lastBet[street] = 0 self.lastBet[street] = 0
@ -285,7 +303,7 @@ class Hand:
#self.endChips[name] = chips #self.endChips[name] = chips
#self.winners[name] = 0 #self.winners[name] = 0
for street in self.STREETS: for street in self.STREETS:
self.bets[street][name] = [0] self.bets[street][name] = []
def addHoleCards(self,h1,h2,seat=None): # generalise to add hole cards for a specific seat or player def addHoleCards(self,h1,h2,seat=None): # generalise to add hole cards for a specific seat or player
@ -300,36 +318,53 @@ class Hand:
return c return c
def addBlind(self, player, amount): def addBlind(self, player, amount):
#self.bets['BLINDS'][player].append(Decimal(amount)) # if player is None, it's a missing small blind.
if player is not None:
self.bets['PREFLOP'][player].append(Decimal(amount))
self.lastBet['PREFLOP'] = Decimal(amount) self.lastBet['PREFLOP'] = Decimal(amount)
self.posted += [player] self.posted += [player]
def addCall(self, street, player=None, amount=0): def addCall(self, street, player=None, amount=None):
self.bets[street][player].append(Decimal(amount)) # Potentially calculate the amount of the call if not supplied
#self.lastBet[street] = Decimal(amount) # corner cases include if player would be all in
self.actions[street] += [[player, 'calls', amount]] if amount is not None:
self.bets[street][player].append(Decimal(amount))
#self.lastBet[street] = Decimal(amount)
self.actions[street] += [[player, 'calls', amount]]
def addRaiseTo(self, street, player, amountTo): def addRaiseTo(self, street, player, amountTo):
# amount is the amount raised to, not the amount raised.by # Given only the amount raised to, the amount of the raise can be calculated by
# working out how much this player has already in the pot
# (which is the sum of self.bets[street][player])
# and how much he needs to call to match the previous player
# (which is tracked by self.lastBet)
committedThisStreet = reduce(operator.add, self.bets[street][player], 0) committedThisStreet = reduce(operator.add, self.bets[street][player], 0)
amountToCall = self.lastBet[street] - committedThisStreet amountToCall = self.lastBet[street] - committedThisStreet
self.lastBet[street] = Decimal(amountTo) self.lastBet[street] = Decimal(amountTo)
amountBy = Decimal(amountTo) - amountToCall amountBy = Decimal(amountTo) - amountToCall
self.bets[street][player].append(amountBy) self.bets[street][player].append(amountBy+amountToCall)
self.actions[street] += [[player, 'raises', amountBy, amountTo]] self.actions[street] += [[player, 'raises', amountBy, amountTo]]
#def addRaiseTo(self, street, player=None, amountTo=None):
#self.amounts[street] += Decimal(amountTo)
def addBet(self, street, player=None, amount=0): def addBet(self, street, player=None, amount=0):
self.bets[street][name].append(Decimal(amount)) self.bets[street][name].append(Decimal(amount))
self.orderedBets[street].append(Decimal(amount)) self.orderedBets[street].append(Decimal(amount))
self.actions[street] += [[player, 'bets', amount]] self.actions[street] += [[player, 'bets', amount]]
def totalPot(self):
if self.totalpot is None:
self.totalpot = 0
# player names:
# print [x[1] for x in self.players]
for player in [x[1] for x in self.players]:
for street in self.STREETS:
print street, self.bets[street][player]
self.totalpot += reduce(operator.add, self.bets[street][player], 0)
def printHand(self): def printHand(self):
# PokerStars format. # PokerStars format.
print "### DEBUG ###" print "### DEBUG ###"
@ -370,31 +405,18 @@ class Hand:
print "*** RIVER *** [%s %s %s %s] [%s]" %(self.streets.group("FLOP1"), self.streets.group("FLOP2"), self.streets.group("FLOP3"), self.streets.group("TURN1"), self.streets.group("RIVER1")) print "*** RIVER *** [%s %s %s %s] [%s]" %(self.streets.group("FLOP1"), self.streets.group("FLOP2"), self.streets.group("FLOP3"), self.streets.group("TURN1"), self.streets.group("RIVER1"))
for act in self.actions['RIVER']: for act in self.actions['RIVER']:
self.printActionLine(act) self.printActionLine(act)
print "*** SUMMARY ***"
print "XXXXXXXXXXXX Need sumary info XXXXXXXXXXX" #Some sites don't have a showdown section so we have to figure out if there should be one
# print "Total pot $%s | Rake $%s)" %(hand.totalpot $" + hand.rake) # The logic for a showdown is: at the end of river action there are at least two players in the hand
# print "Board [" + boardcards + "]" if 'SHOWDOWN' in self.actions:
# print "*** SHOW DOWN ***"
# SUMMARY STUFF print "what do they show"
#print self.sitename print "*** SUMMARY ***"
#print self.gametype print "Total pot $%s | Rake $%s)" % (self.totalpot, self.rake)
#print self.string print "Board [%s %s %s %s %s]" % (self.streets.group("FLOP1"), self.streets.group("FLOP2"), self.streets.group("FLOP3"), self.streets.group("TURN1"), self.streets.group("RIVER1"))
#print self.handid
#print self.sb
#print self.bb
#print self.tablename
#print self.maxseats
#print self.counted_seats
#print self.buttonpos
#print self.seating
#print self.players
#print self.posted
#print self.action
#print self.involved
#print self.hero
def printActionLine(self, act): def printActionLine(self, act):
if act[1] == 'folds' or act[1] == 'checks': if act[1] == 'folds' or act[1] == 'checks':