Merge branch 'master' of git://git.assembla.com/fpdboz into carl

This commit is contained in:
steffen123 2010-09-09 10:30:12 +02:00
commit 5cfd693668
8 changed files with 203 additions and 8 deletions

BIN
gfx/Table.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

View File

@ -84,7 +84,7 @@ class Fulltilt(HandHistoryConverter):
(\s\((?P<TURBO>Turbo)\))?)|(?P<UNREADABLE_INFO>.+)) (\s\((?P<TURBO>Turbo)\))?)|(?P<UNREADABLE_INFO>.+))
''' % substitutions, re.VERBOSE) ''' % substitutions, re.VERBOSE)
re_Button = re.compile('^The button is in seat #(?P<BUTTON>\d+)', re.MULTILINE) re_Button = re.compile('^The button is in seat #(?P<BUTTON>\d+)', re.MULTILINE)
re_PlayerInfo = re.compile('Seat (?P<SEAT>[0-9]+): (?P<PNAME>.{2,15}) \([%(LS)s](?P<CASH>[,.0-9]+)\)$' % substitutions, re.MULTILINE) re_PlayerInfo = re.compile('Seat (?P<SEAT>[0-9]+): (?P<PNAME>.{2,15}) \([%(LS)s](?P<CASH>[,.0-9]+)\)(, is sitting out)?$' % substitutions, re.MULTILINE)
re_TourneysPlayerInfo = re.compile('Seat (?P<SEAT>[0-9]+): (?P<PNAME>.{2,15}) \([%(LS)s]?(?P<CASH>[,.0-9]+)\)(, is sitting out)?$' % substitutions, re.MULTILINE) re_TourneysPlayerInfo = re.compile('Seat (?P<SEAT>[0-9]+): (?P<PNAME>.{2,15}) \([%(LS)s]?(?P<CASH>[,.0-9]+)\)(, is sitting out)?$' % substitutions, re.MULTILINE)
re_Board = re.compile(r"\[(?P<CARDS>.+)\]") re_Board = re.compile(r"\[(?P<CARDS>.+)\]")

68
pyfpdb/HHReplayer.py Normal file
View File

@ -0,0 +1,68 @@
#!/usr/bin/env python
import os, pygame
import time
from pygame.locals import *
from pygame.compat import geterror
main_dir = os.path.split(os.path.abspath(__file__))[0]
data_dir = os.path.join(main_dir, '.')
def load_image(name, colorkey=None):
fullname = os.path.join(data_dir, name)
try:
image = pygame.image.load(fullname)
except pygame.error:
print ('Cannot load image:', fullname)
print "data_dir: '%s' name: '%s'" %( data_dir, name)
raise SystemExit(str(geterror()))
image = image.convert()
if colorkey is not None:
if colorkey is -1:
colorkey = image.get_at((0,0))
image.set_colorkey(colorkey, RLEACCEL)
return image, image.get_rect()
def main():
#Initialize Everything
pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode((640, 480))
table_string = "Tournament 2010090009 Table %s - Blinds $600/$1200 Anto $150"
table_no = 1
table_title = "Nongoma V - $200/$400 USD - Limit Holdem"
pygame.display.set_caption(table_title)
pygame.mouse.set_visible(0)
# Load background image
bgimage, rect = load_image('../gfx/Table.png')
background = pygame.Surface(screen.get_size())
background.blit(bgimage, (0, 0))
#Put Text On The Background, Centered
if pygame.font:
font = pygame.font.Font(None, 24)
text = font.render("FPDB Replayer Table", 1, (10, 10, 10))
textpos = text.get_rect(centerx=background.get_width()/2)
background.blit(text, textpos)
#Display The Background
screen.blit(background, (0, 0))
pygame.display.flip()
going = True
while going:
clock.tick(6000)
# Draw
screen.blit(background, (0, 0))
# Change table #
#table_no += 1
#table_title = "Tournament 2010090009 Table %s - Blinds $600/$1200 Anto $150" % table_no
#pygame.display.set_caption(table_title)
time.sleep(10)
if __name__ == '__main__':
main()

View File

@ -1224,6 +1224,7 @@ class StudHand(Hand):
self.addHoleCards('FOURTH', player, open=[cards[3]], closed=[cards[2]], shown=shown, mucked=mucked) self.addHoleCards('FOURTH', player, open=[cards[3]], closed=[cards[2]], shown=shown, mucked=mucked)
self.addHoleCards('FIFTH', player, open=[cards[4]], closed=cards[2:4], shown=shown, mucked=mucked) self.addHoleCards('FIFTH', player, open=[cards[4]], closed=cards[2:4], shown=shown, mucked=mucked)
self.addHoleCards('SIXTH', player, open=[cards[5]], closed=cards[2:5], shown=shown, mucked=mucked) self.addHoleCards('SIXTH', player, open=[cards[5]], closed=cards[2:5], shown=shown, mucked=mucked)
if len(cards) > 6:
self.addHoleCards('SEVENTH', player, open=[], closed=[cards[6]], shown=shown, mucked=mucked) self.addHoleCards('SEVENTH', player, open=[], closed=[cards[6]], shown=shown, mucked=mucked)

View File

@ -289,6 +289,7 @@ which it expects to find at self.re_TailSplitHands -- see for e.g. Everleaf.py.
base = gametype['base'] base = gametype['base']
limit = gametype['limitType'] limit = gametype['limitType']
l = [type] + [base] + [limit] l = [type] + [base] + [limit]
if l in self.readSupportedGames(): if l in self.readSupportedGames():
if gametype['base'] == 'hold': if gametype['base'] == 'hold':
log.debug("hand = Hand.HoldemOmahaHand(self, self.sitename, gametype, handtext)") log.debug("hand = Hand.HoldemOmahaHand(self, self.sitename, gametype, handtext)")
@ -299,14 +300,14 @@ which it expects to find at self.re_TailSplitHands -- see for e.g. Everleaf.py.
hand = Hand.DrawHand(self.config, self, self.sitename, gametype, handText) hand = Hand.DrawHand(self.config, self, self.sitename, gametype, handText)
else: else:
log.info(_("Unsupported game type: %s" % gametype)) log.info(_("Unsupported game type: %s" % gametype))
raise FpdbParseError(_("Unsupported game type: %s" % gametype))
if hand: if hand:
#hand.writeHand(self.out_fh) #hand.writeHand(self.out_fh)
return hand return hand
else: else:
log.info(_("Unsupported game type: %s" % gametype)) log.error(_("Unsupported game type: %s" % gametype))
# TODO: pity we don't know the HID at this stage. Log the entire hand? # TODO: pity we don't know the HID at this stage. Log the entire hand?
# From the log we can deduce that it is the hand after the one before :)
# These functions are parse actions that may be overridden by the inheriting class # These functions are parse actions that may be overridden by the inheriting class

View File

@ -111,7 +111,7 @@ class OnGame(HandHistoryConverter):
re_DateTime = re.compile(""" re_DateTime = re.compile("""
[a-zA-Z]{3}\s [a-zA-Z]{3}\s
(?P<M>[a-zA-Z]{3})\s (?P<M>[a-zA-Z]{3})\s
(?P<D>[0-9]{2})\s (?P<D>[0-9]+)\s
(?P<H>[0-9]+):(?P<MIN>[0-9]+):(?P<S>[0-9]+)\s (?P<H>[0-9]+):(?P<MIN>[0-9]+):(?P<S>[0-9]+)\s
(?P<OFFSET>\w+[-+]\d+)\s (?P<OFFSET>\w+[-+]\d+)\s
(?P<Y>[0-9]{4}) (?P<Y>[0-9]{4})
@ -216,15 +216,22 @@ class OnGame(HandHistoryConverter):
#hand.startTime = time.strptime(m.group('DATETIME'), "%a %b %d %H:%M:%S GMT%z %Y") #hand.startTime = time.strptime(m.group('DATETIME'), "%a %b %d %H:%M:%S GMT%z %Y")
# Stupid library doesn't seem to support %z (http://docs.python.org/library/time.html?highlight=strptime#time.strptime) # Stupid library doesn't seem to support %z (http://docs.python.org/library/time.html?highlight=strptime#time.strptime)
# So we need to re-interpret te string to be useful # So we need to re-interpret te string to be useful
m1 = self.re_DateTime.finditer(info[key]) a = self.re_DateTime.search(info[key])
for a in m1: if a:
datetimestr = "%s/%s/%s %s:%s:%s" % (a.group('Y'),a.group('M'), a.group('D'), a.group('H'),a.group('MIN'),a.group('S')) datetimestr = "%s/%s/%s %s:%s:%s" % (a.group('Y'),a.group('M'), a.group('D'), a.group('H'),a.group('MIN'),a.group('S'))
tzoffset = a.group('OFFSET') tzoffset = a.group('OFFSET')
else:
datetimestr = "2010/Jan/01 01:01:01"
log.error(_("readHandInfo: DATETIME not matched: '%s'" % info[key]))
print "DEBUG: readHandInfo: DATETIME not matched: '%s'" % info[key]
# TODO: Manually adjust time against OFFSET # TODO: Manually adjust time against OFFSET
hand.startTime = datetime.datetime.strptime(datetimestr, "%Y/%b/%d %H:%M:%S") # also timezone at end, e.g. " ET" hand.startTime = datetime.datetime.strptime(datetimestr, "%Y/%b/%d %H:%M:%S") # also timezone at end, e.g. " ET"
hand.startTime = HandHistoryConverter.changeTimezone(hand.startTime, tzoffset, "UTC") hand.startTime = HandHistoryConverter.changeTimezone(hand.startTime, tzoffset, "UTC")
if key == 'HID': if key == 'HID':
hand.handid = info[key] hand.handid = info[key]
# Need to remove non-alphanumerics for MySQL
hand.handid = hand.handid.replace('R','')
hand.handid = hand.handid.replace('-','')
if key == 'TABLE': if key == 'TABLE':
hand.tablename = info[key] hand.tablename = info[key]

View File

@ -454,6 +454,7 @@ class PokerStars(HandHistoryConverter):
if m.group('SHOWED') == "showed": shown = True if m.group('SHOWED') == "showed": shown = True
elif m.group('SHOWED') == "mucked": mucked = True elif m.group('SHOWED') == "mucked": mucked = True
#print "DEBUG: hand.addShownCards(%s, %s, %s, %s)" %(cards, m.group('PNAME'), shown, mucked)
hand.addShownCards(cards=cards, player=m.group('PNAME'), shown=shown, mucked=mucked) hand.addShownCards(cards=cards, player=m.group('PNAME'), shown=shown, mucked=mucked)
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -0,0 +1,117 @@
PokerStars Game #30506593746: 7 Card Stud Limit ($0.04/$0.08) - 2009/07/16 2:36:31 CET [2009/07/15 20:36:31 ET]
Table 'Laomedon' 8-max
Seat 1: Player1 ($1.81 in chips)
Seat 2: Player2 ($2.46 in chips)
Seat 3: Player3 ($1.67 in chips)
Seat 4: Player4 ($0.35 in chips)
Seat 5: Player5 ($1.75 in chips)
Seat 6: Player6 ($2.92 in chips)
Seat 7: Player7 ($1.54 in chips)
Seat 8: Player8 ($0.71 in chips)
Player1: posts the ante $0.01
Player2: posts the ante $0.01
Player3: posts the ante $0.01
Player4: posts the ante $0.01
Player5: posts the ante $0.01
Player6: posts the ante $0.01
Player7: posts the ante $0.01
Player8: posts the ante $0.01
*** 3rd STREET ***
Dealt to Player1 [Ac Kc 8c]
Dealt to Player2 [Tc]
Dealt to Player3 [6c]
Dealt to Player4 [Js]
Dealt to Player5 [Jd]
Dealt to Player6 [2d]
Dealt to Player7 [Jh]
Dealt to Player8 [Kh]
Player6: brings in for $0.02
Player7: calls $0.02
Player8: calls $0.02
Player1: calls $0.02
Player2: calls $0.02
Player3: calls $0.02
Player4: calls $0.02
Player5: calls $0.02
*** 4th STREET ***
Dealt to Player1 [Ac Kc 8c] [9c]
Dealt to Player2 [Tc] [7d]
Dealt to Player3 [6c] [7h]
Dealt to Player4 [Js] [2c]
Dealt to Player5 [Jd] [4h]
Dealt to Player6 [2d] [7c]
Dealt to Player7 [Jh] [4c]
Dealt to Player8 [Kh] [3d]
Player8: checks
Player1: checks
Player2: checks
Player3: checks
Player4: checks
Player5: checks
Player6: checks
Player7: checks
*** 5th STREET ***
Dealt to Player1 [Ac Kc 8c 9c] [9d]
Dealt to Player2 [Tc 7d] [8d]
Dealt to Player3 [6c 7h] [3s]
Dealt to Player4 [Js 2c] [9s]
Dealt to Player5 [Jd 4h] [9h]
Dealt to Player6 [2d 7c] [6d]
Dealt to Player7 [Jh 4c] [5d]
Dealt to Player8 [Kh 3d] [8s]
Player1: checks
Player2: checks
Player3: checks
Player4: checks
Player5: checks
Player6: checks
Player7: checks
Player8: checks
*** 6th STREET ***
Dealt to Player1 [Ac Kc 8c 9c 9d] [Th]
Dealt to Player2 [Tc 7d 8d] [3c]
Dealt to Player3 [6c 7h 3s] [Qh]
Dealt to Player4 [Js 2c 9s] [8h]
Dealt to Player5 [Jd 4h 9h] [2s]
Dealt to Player6 [2d 7c 6d] [5h]
Dealt to Player7 [Jh 4c 5d] [Td]
Dealt to Player8 [Kh 3d 8s] [6s]
Player1: checks
Player2: checks
Player3: checks
Player4: checks
Player5: checks
Player6: checks
Player7: checks
Player8: checks
*** RIVER *** [6h]
Player1: checks
Player2: checks
Player3: bets $0.08
Player4: folds
Player5: calls $0.08
Player6: calls $0.08
Player7: folds
Player8: calls $0.08
Player1: folds
Player2: folds
*** SHOW DOWN ***
Player3: shows [7s Qs 6c 7h 3s Qh] (two pair, Queens and Sevens)
Player5: mucks hand
Player6: mucks hand
Player8: mucks hand
Player3 collected $0.54 from pot
*** SUMMARY ***
Total pot $0.56 | Rake $0.02
Board [6h]
Seat 1: Player1 folded on the River
Seat 2: Player2 folded on the River
Seat 3: Player3 showed [7s Qs 6c 7h 3s Qh] and won ($0.54) with two pair, Queens and Sevens
Seat 4: Player4 folded on the River
Seat 5: Player5 mucked [Kd Ks Jd 4h 9h 2s]
Seat 6: Player6 mucked [5s Ah 2d 7c 6d 5h]
Seat 7: Player7 folded on the River
Seat 8: Player8 mucked [Jc 3h Kh 3d 8s 6s]