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):