diff --git a/pyfpdb/HUD_config.xml.example b/pyfpdb/HUD_config.xml.example index d7cd3a17..e95db1b8 100644 --- a/pyfpdb/HUD_config.xml.example +++ b/pyfpdb/HUD_config.xml.example @@ -670,6 +670,7 @@ Left-Drag to Move" + diff --git a/pyfpdb/OnGameToFpdb.py b/pyfpdb/OnGameToFpdb.py index 80d8d646..d9c069a7 100755 --- a/pyfpdb/OnGameToFpdb.py +++ b/pyfpdb/OnGameToFpdb.py @@ -21,107 +21,82 @@ import sys import Configuration from HandHistoryConverter import * +from decimal import Decimal + +import locale +lang=locale.getdefaultlocale()[0][0:2] +if lang=="en": + def _(string): return string +else: + import gettext + try: + trans = gettext.translation("fpdb", localedir="locale", languages=[lang]) + trans.install() + except IOError: + def _(string): return string # OnGame HH Format -#Texas Hold'em $.5-$1 NL (real money), hand #P4-76915775-797 -#Table Kuopio, 20 Sep 2008 11:59 PM - -#Seat 1: .Lucchess ($4.17 in chips) -#Seat 3: Gloff1 ($108 in chips) -#Seat 4: far a ($13.54 in chips) -#Seat 5: helander2222 ($49.77 in chips) -#Seat 6: lopllopl ($62.06 in chips) -#Seat 7: crazyhorse6 ($101.91 in chips) -#Seat 8: peeci ($25.02 in chips) -#Seat 9: Manuelhertz ($49 in chips) -#Seat 10: Eurolll ($58.25 in chips) -#ANTES/BLINDS -#helander2222 posts blind ($0.25), lopllopl posts blind ($0.50). - -#PRE-FLOP -#crazyhorse6 folds, peeci folds, Manuelhertz folds, Eurolll calls $0.50, .Lucchess calls $0.50, Gloff1 folds, far a folds, helander2222 folds, lopllopl checks. - -#FLOP [board cards AH,8H,KH ] -#lopllopl checks, Eurolll checks, .Lucchess checks. - -#TURN [board cards AH,8H,KH,6S ] -#lopllopl checks, Eurolll checks, .Lucchess checks. - -#RIVER [board cards AH,8H,KH,6S,8S ] -#lopllopl checks, Eurolll bets $1.25, .Lucchess folds, lopllopl folds. - -#SHOWDOWN -#Eurolll wins $2.92. - -#SUMMARY -#Dealer: far a -#Pot: $3, (including rake: $0.08) -#.Lucchess, loses $0.50 -#Gloff1, loses $0 -#far a, loses $0 -#helander2222, loses $0.25 -#lopllopl, loses $0.50 -#crazyhorse6, loses $0 -#peeci, loses $0 -#Manuelhertz, loses $0 -#Eurolll, bets $1.75, collects $2.92, net $1.17 - - class OnGame(HandHistoryConverter): - def __init__(self, config, file): - print "Initialising OnGame converter class" - HandHistoryConverter.__init__(self, config, file, sitename="OnGame") # Call super class init. - self.sitename = "OnGame" - self.setFileType("text", "cp1252") - self.siteId = 5 # Needs to match id entry in Sites database + sitename = "OnGame" + filetype = "text" + codepage = ("utf8", "cp1252") + siteId = 5 # Needs to match id entry in Sites database + #self.rexx.setGameInfoRegex('.*Blinds \$?(?P[.0-9]+)/\$?(?P[.0-9]+)') - self.rexx.setSplitHandRegex('\n\n\n+') + # Static regexes + re_SplitHands = re.compile('\n\n\n+') - #Texas Hold'em $.5-$1 NL (real money), hand #P4-76915775-797 - #Table Kuopio, 20 Sep 2008 11:59 PM - self.rexx.setHandInfoRegex(r"Texas Hold'em \$?(?P[.0-9]+)-\$?(?P[.0-9]+) NL \(real money\), hand #(?P[-A-Z\d]+)\nTable\ (?P[\' \w]+), (?P\d\d \w+ \d\d\d\d \d\d:\d\d (AM|PM))") - # SB BB HID TABLE DAY MON YEAR HR12 MIN AMPM + #Texas Hold'em $.5-$1 NL (real money), hand #P4-76915775-797 + #Table Kuopio, 20 Sep 2008 11:59 PM + re_HandInfo = re.compile(r"Texas Hold'em \$?(?P[.0-9]+)-\$?(?P[.0-9]+) NL \(real money\), hand #(?P[-A-Z\d]+)\nTable\ (?P
[\' \w]+), (?P\d\d \w+ \d\d\d\d \d\d:\d\d (AM|PM))") + # SB BB HID TABLE DAY MON YEAR HR12 MIN AMPM - self.rexx.button_re = re.compile('#SUMMARY\nDealer: (?P.*)\n') + # self.rexx.button_re = re.compile('#SUMMARY\nDealer: (?P.*)\n') - #Seat 1: .Lucchess ($4.17 in chips) - self.rexx.setPlayerInfoRegex('Seat (?P[0-9]+): (?P.*) \((\$(?P[.0-9]+) in chips)\)') + #Seat 1: .Lucchess ($4.17 in chips) + re_PlayerInfo = re.compile(u'Seat (?P[0-9]+): (?P.*) \((\$(?P[.0-9]+) in chips)\)') - #ANTES/BLINDS - #helander2222 posts blind ($0.25), lopllopl posts blind ($0.50). - self.rexx.setPostSbRegex('(?P.*) posts blind \(\$?(?P[.0-9]+)\), ') - self.rexx.setPostBbRegex('\), (?P.*) posts blind \(\$?(?P[.0-9]+)\).') - self.rexx.setPostBothRegex('.*\n(?P.*): posts small \& big blinds \[\$? (?P[.0-9]+)') - self.rexx.setHeroCardsRegex('.*\nDealt\sto\s(?P.*)\s\[ (?P.*) \]') + #ANTES/BLINDS + #helander2222 posts blind ($0.25), lopllopl posts blind ($0.50). + re_PostSB = re.compile('(?P.*) posts blind \(\$?(?P[.0-9]+)\), ') + re_PostBB = re.compile('\), (?P.*) posts blind \(\$?(?P[.0-9]+)\).') + re_PostBoth = re.compile('.*\n(?P.*): posts small \& big blinds \[\$? (?P[.0-9]+)') + re_HeroCards = re.compile('.*\nDealt\sto\s(?P.*)\s\[ (?P.*) \]') - #lopllopl checks, Eurolll checks, .Lucchess checks. - self.rexx.setActionStepRegex('(, )?(?P.*?)(?P bets| checks| raises| calls| folds)( \$(?P\d*\.?\d*))?( and is all-in)?') + #lopllopl checks, Eurolll checks, .Lucchess checks. + re_Action = re.compile('(, )?(?P.*?)(?P bets| checks| raises| calls| folds)( \$(?P\d*\.?\d*))?( and is all-in)?') + re_Board = re.compile(r"\[board cards (?P.+) \]") - #Uchilka shows [ KC,JD ] - self.rexx.setShowdownActionRegex('(?P.*) shows \[ (?P.+) \]') + #Uchilka shows [ KC,JD ] + re_ShowdownAction = re.compile('(?P.*) shows \[ (?P.+) \]') - # TODO: read SUMMARY correctly for collected pot stuff. - #Uchilka, bets $11.75, collects $23.04, net $11.29 - self.rexx.setCollectPotRegex('(?P.*), bets.+, collects \$(?P\d*\.?\d*), net.* ') - self.rexx.sits_out_re = re.compile('(?P.*) sits out') - self.rexx.compileRegexes() + # TODO: read SUMMARY correctly for collected pot stuff. + #Uchilka, bets $11.75, collects $23.04, net $11.29 + re_CollectPot = re.compile('(?P.*), bets.+, collects \$(?P\d*\.?\d*), net.* ') + re_sitsOut = re.compile('(?P.*) sits out') def readSupportedGames(self): pass - def determineGameType(self): + def determineGameType(self, handText): # Cheating with this regex, only support nlhe at the moment gametype = ["ring", "hold", "nl"] - m = self.rexx.hand_info_re.search(self.obs) + m = self.re_HandInfo.search(handText) + if not m: + tmp = handText[0:100] + log.error(_("determineGameType: Unable to recognise gametype from: '%s'") % tmp) + log.error(_("determineGameType: Raising FpdbParseError")) + raise FpdbParseError(_("Unable to recognise gametype from: '%s'") % tmp) + gametype = gametype + [m.group('SB')] gametype = gametype + [m.group('BB')] return gametype def readHandInfo(self, hand): - m = self.rexx.hand_info_re.search(hand.string) + m = self.re_HandInfo.search(hand.string) hand.handid = m.group('HID') hand.tablename = m.group('TABLE') #hand.buttonpos = self.rexx.button_re.search(hand.string).group('BUTTONPNAME') @@ -143,7 +118,7 @@ class OnGame(HandHistoryConverter): #int(m.group('HR')), int(m.group('MIN')), int(m.group('SEC'))) def readPlayerStacks(self, hand): - m = self.rexx.player_info_re.finditer(hand.string) + m = self.re_PlayerInf.finditer(hand.string) players = [] for a in m: hand.addPlayer(int(a.group('SEAT')), a.group('PNAME'), a.group('CASH')) @@ -162,25 +137,24 @@ class OnGame(HandHistoryConverter): def readCommunityCards(self, hand, street): - self.rexx.board_re = re.compile(r"\[board cards (?P.+) \]") print hand.streets.group(street) if street in ('FLOP','TURN','RIVER'): # a list of streets which get dealt community cards (i.e. all but PREFLOP) - m = self.rexx.board_re.search(hand.streets.group(street)) + m = self.re_Board.search(hand.streets.group(street)) hand.setCommunityCards(street, m.group('CARDS').split(',')) def readBlinds(self, hand): try: - m = self.rexx.small_blind_re.search(hand.string) + m = self.re_PostSB.search(hand.string) hand.addBlind(m.group('PNAME'), 'small blind', m.group('SB')) except: # no small blind hand.addBlind(None, None, None) - for a in self.rexx.big_blind_re.finditer(hand.string): + for a in self.re_PostBB.finditer(hand.string): hand.addBlind(a.group('PNAME'), 'big blind', a.group('BB')) - for a in self.rexx.both_blinds_re.finditer(hand.string): + for a in self.re_PostBoth.finditer(hand.string): hand.addBlind(a.group('PNAME'), 'small & big blinds', a.group('SBBB')) def readHeroCards(self, hand): - m = self.rexx.hero_cards_re.search(hand.string) + m = self.re_HeroCards.search(hand.string) if(m == None): #Not involved in hand hand.involved = False @@ -193,7 +167,7 @@ class OnGame(HandHistoryConverter): hand.addHoleCards(cards, m.group('PNAME')) def readAction(self, hand, street): - m = self.rexx.action_re.finditer(hand.streets.group(street)) + m = self.re_Action.finditer(hand.streets.group(street)) for action in m: if action.group('ATYPE') == ' raises': hand.addRaiseTo( street, action.group('PNAME'), action.group('BET') ) @@ -211,13 +185,13 @@ class OnGame(HandHistoryConverter): # TODO: Everleaf does not record uncalled bets. def readShowdownActions(self, hand): - for shows in self.rexx.showdown_action_re.finditer(hand.string): + for shows in self.re_ShowdownAction.finditer(hand.string): cards = shows.group('CARDS') cards = set(cards.split(',')) hand.addShownCards(cards, shows.group('PNAME')) def readCollectPot(self,hand): - for m in self.rexx.collect_pot_re.finditer(hand.string): + for m in self.re_CollectPot.finditer(hand.string): hand.addCollectPot(player=m.group('PNAME'),pot=m.group('POT')) def readShownCards(self,hand):