Merge branch 'steffen'

This commit is contained in:
Mika Bostrom 2010-08-26 23:09:00 +03:00
commit af1ac8316b
19 changed files with 4956 additions and 1431 deletions

2
.gitattributes vendored Normal file
View File

@ -0,0 +1,2 @@
pyfpdb/HUD_config.xml.example -crlf

View File

@ -17,44 +17,49 @@ SLOT="0"
KEYWORDS="~amd64 ~x86"
#note: this should work on other architectures too, please send me your experiences
IUSE="graph mysql postgres sqlite"
IUSE="graph mysql postgres sqlite linguas_hu"
RDEPEND="
mysql? ( virtual/mysql
dev-python/mysql-python )
postgres? ( dev-db/postgresql-server
dev-python/psycopg )
sqlite? ( dev-lang/python[sqlite]
dev-python/numpy )
>=x11-libs/gtk+-2.10
dev-python/pygtk
graph? ( dev-python/numpy
dev-python/matplotlib[gtk] )
dev-python/python-xlib
dev-python/pytz"
mysql? ( virtual/mysql
dev-python/mysql-python )
postgres? ( dev-db/postgresql-server
dev-python/psycopg )
sqlite? ( dev-lang/python[sqlite]
dev-python/numpy )
>=x11-libs/gtk+-2.10
dev-python/pygtk
graph? ( dev-python/numpy
dev-python/matplotlib[gtk] )
dev-python/python-xlib
dev-python/pytz"
DEPEND="${RDEPEND}"
src_install() {
insinto "${GAMES_DATADIR}"/${PN}
doins -r gfx
doins -r pyfpdb
doins readme.txt
insinto "${GAMES_DATADIR}"/${PN}
doins -r gfx
doins -r pyfpdb
exeinto "${GAMES_DATADIR}"/${PN}
doexe run_fpdb.py
if use linguas_hu; then
dosym "${GAMES_DATADIR}"/${PN}/pyfpdb/locale/hu/LC_MESSAGES/${PN}.mo /usr/share/locale/hu/LC_MESSAGES/${PN}.mo
fi
dodir "${GAMES_BINDIR}"
dosym "${GAMES_DATADIR}"/${PN}/run_fpdb.py "${GAMES_BINDIR}"/${PN}
doins readme.txt
newicon gfx/fpdb-icon.png ${PN}.png
make_desktop_entry ${PN}
exeinto "${GAMES_DATADIR}"/${PN}
doexe run_fpdb.py
chmod +x "${D}/${GAMES_DATADIR}"/${PN}/pyfpdb/*.pyw
prepgamesdirs
dodir "${GAMES_BINDIR}"
dosym "${GAMES_DATADIR}"/${PN}/run_fpdb.py "${GAMES_BINDIR}"/${PN}
newicon gfx/fpdb-icon.png ${PN}.png
make_desktop_entry ${PN}
chmod +x "${D}/${GAMES_DATADIR}"/${PN}/pyfpdb/*.pyw
prepgamesdirs
}
pkg_postinst() {
games_pkg_postinst
elog "Note that if you really want to use mysql or postgresql you will have to create"
elog "the database and user yourself and enter it into the fpdb config."
elog "You can find the instructions on the project's website."
games_pkg_postinst
elog "Note that if you really want to use mysql or postgresql you will have to create"
elog "the database and user yourself and enter it into the fpdb config."
elog "You can find the instructions on the project's website."
}

View File

@ -18,48 +18,53 @@ SLOT="0"
KEYWORDS=""
#note: this should work on other architectures too, please send me your experiences
IUSE="graph mysql postgres sqlite"
IUSE="graph mysql postgres sqlite linguas_hu"
RDEPEND="
mysql? ( virtual/mysql
dev-python/mysql-python )
postgres? ( dev-db/postgresql-server
dev-python/psycopg )
sqlite? ( dev-lang/python[sqlite]
dev-python/numpy )
>=x11-libs/gtk+-2.10
dev-python/pygtk
graph? ( dev-python/numpy
dev-python/matplotlib[gtk] )
dev-python/python-xlib
dev-python/pytz"
mysql? ( virtual/mysql
dev-python/mysql-python )
postgres? ( dev-db/postgresql-server
dev-python/psycopg )
sqlite? ( dev-lang/python[sqlite]
dev-python/numpy )
>=x11-libs/gtk+-2.10
dev-python/pygtk
graph? ( dev-python/numpy
dev-python/matplotlib[gtk] )
dev-python/python-xlib
dev-python/pytz"
DEPEND="${RDEPEND}"
src_unpack() {
git_src_unpack
git_src_unpack
}
src_install() {
insinto "${GAMES_DATADIR}"/${PN}
doins -r gfx
doins -r pyfpdb
doins readme.txt
insinto "${GAMES_DATADIR}"/${PN}
doins -r gfx
doins -r pyfpdb
exeinto "${GAMES_DATADIR}"/${PN}
doexe run_fpdb.py
if use linguas_hu; then
dosym "${GAMES_DATADIR}"/${PN}/pyfpdb/locale/hu/LC_MESSAGES/${PN}.mo /usr/share/locale/hu/LC_MESSAGES/${PN}.mo
fi
dodir "${GAMES_BINDIR}"
dosym "${GAMES_DATADIR}"/${PN}/run_fpdb.py "${GAMES_BINDIR}"/${PN}
doins readme.txt
newicon gfx/fpdb-icon.png ${PN}.png
make_desktop_entry ${PN}
exeinto "${GAMES_DATADIR}"/${PN}
doexe run_fpdb.py
chmod +x "${D}/${GAMES_DATADIR}"/${PN}/pyfpdb/*.pyw
prepgamesdirs
dodir "${GAMES_BINDIR}"
dosym "${GAMES_DATADIR}"/${PN}/run_fpdb.py "${GAMES_BINDIR}"/${PN}
newicon gfx/fpdb-icon.png ${PN}.png
make_desktop_entry ${PN}
chmod +x "${D}/${GAMES_DATADIR}"/${PN}/pyfpdb/*.pyw
prepgamesdirs
}
pkg_postinst() {
games_pkg_postinst
elog "Note that if you really want to use mysql or postgresql you will have to create"
elog "the database and user yourself and enter it into the fpdb config."
elog "You can find the instructions on the project's website."
games_pkg_postinst
elog "Note that if you really want to use mysql or postgresql you will have to create"
elog "the database and user yourself and enter it into the fpdb config."
elog "You can find the instructions on the project's website."
}

View File

@ -525,12 +525,12 @@ class General(dict):
except KeyError:
self["version"]=0
self["ui_language"]="system"
self["config_difficuly"]="expert"
self["config_difficulty"]="expert"
def get_defaults(self):
self["version"]=0
self["ui_language"]="system"
self["config_difficuly"]="expert"
self["config_difficulty"]="expert"
self["config_wrap_len"]="-1"
self["day_start"]="5"

View File

@ -261,7 +261,7 @@ class Fulltilt(HandHistoryConverter):
if special == "KO":
hand.isKO = True
if special == "Head's Up" or special == "Heads Up":
hand.maxSeats = 2
hand.maxseats = 2
if re.search("Matrix", special):
hand.isMatrix = True
if special == "Shootout":

File diff suppressed because it is too large Load Diff

View File

@ -58,7 +58,7 @@ class Hand(object):
LCS = {'H':'h', 'D':'d', 'C':'c', 'S':'s'}
SYMBOL = {'USD': '$', 'EUR': u'$', 'T$': '', 'play': ''}
MS = {'horse' : 'HORSE', '8game' : '8-Game', 'hose' : 'HOSE', 'ha': 'HA'}
SITEIDS = {'Fulltilt':1, 'PokerStars':2, 'Everleaf':3, 'Win2day':4, 'OnGame':5, 'UltimateBet':6, 'Betfair':7, 'Absolute':8, 'PartyPoker':9, 'Partouche':10, 'Carbon':11 }
SITEIDS = {'Fulltilt':1, 'PokerStars':2, 'Everleaf':3, 'Win2day':4, 'OnGame':5, 'UltimateBet':6, 'Betfair':7, 'Absolute':8, 'PartyPoker':9, 'Partouche':10, 'Carbon':11, 'PKR':12 }
def __init__(self, config, sitename, gametype, handText, builtFrom = "HHC"):
@ -77,7 +77,7 @@ class Hand(object):
self.dbid_gt = 0
self.tablename = ""
self.hero = ""
self.maxseats = 0
self.maxseats = None
self.counted_seats = 0
self.buttonpos = 0

390
pyfpdb/PkrToFpdb.py Executable file
View File

@ -0,0 +1,390 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright 2010, Carl Gherardi
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
########################################################################
import sys
from HandHistoryConverter import *
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
class Pkr(HandHistoryConverter):
# Class Variables
sitename = "PKR"
filetype = "text"
codepage = ("utf8", "cp1252")
siteId = 12 # Needs to match id entry in Sites database
mixes = { 'HORSE': 'horse', '8-Game': '8game', 'HOSE': 'hose'} # Legal mixed games
sym = {'USD': "\$"} # ADD Euro, Sterling, etc HERE
substitutions = {
'LEGAL_ISO' : "USD", # legal ISO currency codes
'LS' : "\$|" # legal currency symbols - Euro(cp1252, utf-8)
}
limits = { 'NO LIMIT':'nl', 'POT LIMIT':'pl', 'LIMIT':'fl' }
games = { # base, category
"HOLD'EM" : ('hold','holdem'),
'FIXMEOmaha' : ('hold','omahahi'),
'FIXMEOmaha Hi/Lo' : ('hold','omahahilo'),
'FIXME5 Card Draw' : ('draw','fivedraw')
}
currencies = { u'':'EUR', '$':'USD', '':'T$' }
# Static regexes
re_GameInfo = re.compile(u"""
Table\s\#\d+\s\-\s(?P<TABLE>[a-zA-Z\ \d]+)\s
Starting\sHand\s\#(?P<HID>[0-9]+)\s
Start\stime\sof\shand:\s(?P<DATETIME>.*)\s
Last\sHand\s\#[0-9]+\s
Game\sType:\s(?P<GAME>HOLD'EM|5\sCard\sDraw)\s
Limit\sType:\s(?P<LIMIT>NO\sLIMIT|LIMIT|POT\sLIMIT)\s
Table\sType\:\sRING\s
Money\sType:\sREAL\sMONEY\s
Blinds\sare\snow\s(?P<CURRENCY>%(LS)s|)?
(?P<SB>[.0-9]+)/(%(LS)s)?
(?P<BB>[.0-9]+)
""" % substitutions, re.MULTILINE|re.VERBOSE)
re_PlayerInfo = re.compile(u"""
^Seat\s(?P<SEAT>[0-9]+):\s
(?P<PNAME>.*)\s-\s
(%(LS)s)?(?P<CASH>[.0-9]+)
""" % substitutions, re.MULTILINE|re.VERBOSE)
re_HandInfo = re.compile("""
^Table\s\'(?P<TABLE>[-\ a-zA-Z\d]+)\'\s
((?P<MAX>\d+)-max\s)?
(?P<PLAY>\(Play\sMoney\)\s)?
(Seat\s\#(?P<BUTTON>\d+)\sis\sthe\sbutton)?""",
re.MULTILINE|re.VERBOSE)
re_SplitHands = re.compile('\n\n+')
re_TailSplitHands = re.compile('(\n\n\n+)')
re_Button = re.compile('Seat #(?P<BUTTON>\d+) is the button', re.MULTILINE)
re_Board = re.compile(r"\[(?P<CARDS>.+)\]")
# self.re_setHandInfoRegex('.*#(?P<HID>[0-9]+): Table (?P<TABLE>[ a-zA-Z]+) - \$?(?P<SB>[.0-9]+)/\$?(?P<BB>[.0-9]+) - (?P<GAMETYPE>.*) - (?P<HR>[0-9]+):(?P<MIN>[0-9]+) ET - (?P<YEAR>[0-9]+)/(?P<MON>[0-9]+)/(?P<DAY>[0-9]+)Table (?P<TABLE>[ a-zA-Z]+)\nSeat (?P<BUTTON>[0-9]+)')
re_DateTime = re.compile("""(?P<Y>[0-9]{4})\/(?P<M>[0-9]{2})\/(?P<D>[0-9]{2})[\- ]+(?P<H>[0-9]+):(?P<MIN>[0-9]+):(?P<S>[0-9]+)""", re.MULTILINE)
def compilePlayerRegexs(self, hand):
players = set([player[1] for player in hand.players])
if not players <= self.compiledPlayers: # x <= y means 'x is subset of y'
# we need to recompile the player regexs.
self.compiledPlayers = players
player_re = "(?P<PNAME>" + "|".join(map(re.escape, players)) + ")"
subst = {'PLYR': player_re, 'CUR': self.sym[hand.gametype['currency']]}
log.debug("player_re: " + player_re)
self.re_PostSB = re.compile(r"^%(PLYR)s posts small blind %(CUR)s(?P<SB>[.0-9]+)" % subst, re.MULTILINE)
# FIXME: Sionel posts $0.04 is a second big blind in a different format.
self.re_PostBB = re.compile(r"^%(PLYR)s posts big blind %(CUR)s(?P<BB>[.0-9]+)" % subst, re.MULTILINE)
self.re_Antes = re.compile(r"^%(PLYR)s: posts the ante %(CUR)s(?P<ANTE>[.0-9]+)" % subst, re.MULTILINE)
self.re_BringIn = re.compile(r"^%(PLYR)s: brings[- ]in( low|) for %(CUR)s(?P<BRINGIN>[.0-9]+)" % subst, re.MULTILINE)
self.re_PostBoth = re.compile(r"^%(PLYR)s: posts small \& big blinds %(CUR)s(?P<SBBB>[.0-9]+)" % subst, re.MULTILINE)
self.re_HeroCards = re.compile(r"^Dealing( \[(?P<OLDCARDS>.+?)\])?( \[(?P<NEWCARDS>.+?)\]) to %(PLYR)s" % subst, re.MULTILINE)
self.re_Action = re.compile(r"""
^%(PLYR)s(?P<ATYPE>\sbets|\schecks|\sraises|\scalls|\sfolds)(\sto)?
(\s(%(CUR)s)?(?P<BET>[.\d]+))?
""" % subst, re.MULTILINE|re.VERBOSE)
self.re_ShowdownAction = re.compile(r"^%s: shows \[(?P<CARDS>.*)\]" % player_re, re.MULTILINE)
self.re_CollectPot = re.compile(r"Seat (?P<SEAT>[0-9]+): %(PLYR)s (\(button\) |\(small blind\) |\(big blind\) |\(button\) \(small blind\) )?(collected|showed \[.*\] and won) \(%(CUR)s(?P<POT>[.\d]+)\)(, mucked| with.*|)" % subst, re.MULTILINE)
self.re_sitsOut = re.compile("^%s sits out" % player_re, re.MULTILINE)
self.re_ShownCards = re.compile("^Seat (?P<SEAT>[0-9]+): %s (\(.*\) )?(?P<SHOWED>showed|mucked) \[(?P<CARDS>.*)\].*" % player_re, re.MULTILINE)
def readSupportedGames(self):
return [["ring", "hold", "nl"],
["ring", "hold", "pl"],
["ring", "hold", "fl"],
["ring", "stud", "fl"],
["ring", "draw", "fl"],
["tour", "hold", "nl"],
["tour", "hold", "pl"],
["tour", "hold", "fl"],
["tour", "stud", "fl"],
]
def determineGameType(self, handText):
info = {}
m = self.re_GameInfo.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)
mg = m.groupdict()
#print "DEBUG: %s" % mg
if 'LIMIT' in mg:
info['limitType'] = self.limits[mg['LIMIT']]
if 'GAME' in mg:
(info['base'], info['category']) = self.games[mg['GAME']]
if 'SB' in mg:
info['sb'] = mg['SB']
if 'BB' in mg:
info['bb'] = mg['BB']
if 'CURRENCY' in mg:
info['currency'] = self.currencies[mg['CURRENCY']]
if 'TOURNO' in mg and mg['TOURNO'] is None:
info['type'] = 'ring'
else:
info['type'] = 'tour'
if info['limitType'] == 'fl' and info['bb'] is not None and info['type'] == 'ring' and info['base'] != 'stud':
try:
info['sb'] = self.Lim_Blinds[mg['BB']][0]
info['bb'] = self.Lim_Blinds[mg['BB']][1]
except KeyError:
log.error(_("determineGameType: Lim_Blinds has no lookup for '%s'" % mg['BB']))
log.error(_("determineGameType: Raising FpdbParseError"))
raise FpdbParseError(_("Lim_Blinds has no lookup for '%s'") % mg['BB'])
return info
def readHandInfo(self, hand):
info = {}
m = self.re_HandInfo.search(hand.handText,re.DOTALL)
if m:
info.update(m.groupdict())
# hand.maxseats = int(m2.group(1))
else:
pass # throw an exception here, eh?
m = self.re_GameInfo.search(hand.handText)
if m:
info.update(m.groupdict())
# m = self.re_Button.search(hand.handText)
# if m: info.update(m.groupdict())
# TODO : I rather like the idea of just having this dict as hand.info
log.debug("readHandInfo: %s" % info)
for key in info:
if key == 'DATETIME':
#2008/11/12 10:00:48 CET [2008/11/12 4:00:48 ET]
#2008/08/17 - 01:14:43 (ET)
#2008/09/07 06:23:14 ET
m1 = self.re_DateTime.finditer(info[key])
datetimestr = "2000/01/01 00:00:00" # default used if time not found
for a in m1:
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'))
hand.startTime = datetime.datetime.strptime(datetimestr, "%Y/%m/%d %H:%M:%S")
if key == 'HID':
hand.handid = info[key]
if key == 'TOURNO':
hand.tourNo = info[key]
if key == 'BUYIN':
if info[key] == 'Freeroll':
hand.buyin = '$0+$0'
else:
#FIXME: The key looks like: '€0.82+€0.18 EUR'
# This should be parsed properly and used
hand.buyin = info[key]
if key == 'LEVEL':
hand.level = info[key]
if key == 'TABLE':
if hand.tourNo != None:
hand.tablename = re.split(" ", info[key])[1]
else:
hand.tablename = info[key]
if key == 'BUTTON':
hand.buttonpos = info[key]
if key == 'MAX':
hand.maxseats = int(info[key])
if key == 'MIXED':
hand.mixed = self.mixes[info[key]] if info[key] is not None else None
if key == 'PLAY' and info['PLAY'] is not None:
# hand.currency = 'play' # overrides previously set value
hand.gametype['currency'] = 'play'
def readButton(self, hand):
m = self.re_Button.search(hand.handText)
if m:
hand.buttonpos = int(m.group('BUTTON'))
else:
log.info('readButton: not found')
def readPlayerStacks(self, hand):
log.debug("readPlayerStacks")
m = self.re_PlayerInfo.finditer(hand.handText)
for a in m:
hand.addPlayer(int(a.group('SEAT')), a.group('PNAME'), a.group('CASH'))
def markStreets(self, hand):
# PREFLOP = ** Dealing down cards **
# This re fails if, say, river is missing; then we don't get the ** that starts the river.
if hand.gametype['base'] in ("hold"):
m = re.search(r"Dealing Cards(?P<PREFLOP>.+(?=Dealing Flop)|.+)"
r"(Dealing Flop(?P<FLOP> \[\S\S \S\S \S\S\].+(?=Dealing Turn)|.+))?"
r"(Dealing Turn (?P<TURN>\[\S\S\].+(?=Dealing River)|.+))?"
r"(Dealing River (?P<RIVER>\[\S\S\].+))?", hand.handText,re.DOTALL)
elif hand.gametype['base'] in ("stud"):
m = re.search(r"(?P<ANTES>.+(?=\*\*\* 3rd STREET \*\*\*)|.+)"
r"(\*\*\* 3rd STREET \*\*\*(?P<THIRD>.+(?=\*\*\* 4th STREET \*\*\*)|.+))?"
r"(\*\*\* 4th STREET \*\*\*(?P<FOURTH>.+(?=\*\*\* 5th STREET \*\*\*)|.+))?"
r"(\*\*\* 5th STREET \*\*\*(?P<FIFTH>.+(?=\*\*\* 6th STREET \*\*\*)|.+))?"
r"(\*\*\* 6th STREET \*\*\*(?P<SIXTH>.+(?=\*\*\* RIVER \*\*\*)|.+))?"
r"(\*\*\* RIVER \*\*\*(?P<SEVENTH>.+))?", hand.handText,re.DOTALL)
elif hand.gametype['base'] in ("draw"):
m = re.search(r"(?P<PREDEAL>.+(?=\*\*\* DEALING HANDS \*\*\*)|.+)"
r"(\*\*\* DEALING HANDS \*\*\*(?P<DEAL>.+(?=\*\*\* FIRST DRAW \*\*\*)|.+))?"
r"(\*\*\* FIRST DRAW \*\*\*(?P<DRAWONE>.+(?=\*\*\* SECOND DRAW \*\*\*)|.+))?"
r"(\*\*\* SECOND DRAW \*\*\*(?P<DRAWTWO>.+(?=\*\*\* THIRD DRAW \*\*\*)|.+))?"
r"(\*\*\* THIRD DRAW \*\*\*(?P<DRAWTHREE>.+))?", hand.handText,re.DOTALL)
hand.addStreets(m)
def readCommunityCards(self, hand, street): # street has been matched by markStreets, so exists in this hand
if street in ('FLOP','TURN','RIVER'): # a list of streets which get dealt community cards (i.e. all but PREFLOP)
#print "DEBUG readCommunityCards:", street, hand.streets.group(street)
m = self.re_Board.search(hand.streets[street])
hand.setCommunityCards(street, m.group('CARDS').split(' '))
def readAntes(self, hand):
log.debug("reading antes")
m = self.re_Antes.finditer(hand.handText)
for player in m:
#~ logging.debug("hand.addAnte(%s,%s)" %(player.group('PNAME'), player.group('ANTE')))
hand.addAnte(player.group('PNAME'), player.group('ANTE'))
def readBringIn(self, hand):
m = self.re_BringIn.search(hand.handText,re.DOTALL)
if m:
#~ logging.debug("readBringIn: %s for %s" %(m.group('PNAME'), m.group('BRINGIN')))
hand.addBringIn(m.group('PNAME'), m.group('BRINGIN'))
def readBlinds(self, hand):
try:
m = self.re_PostSB.search(hand.handText)
hand.addBlind(m.group('PNAME'), 'small blind', m.group('SB'))
except: # no small blind
hand.addBlind(None, None, None)
for a in self.re_PostBB.finditer(hand.handText):
hand.addBlind(a.group('PNAME'), 'big blind', a.group('BB'))
for a in self.re_PostBoth.finditer(hand.handText):
hand.addBlind(a.group('PNAME'), 'both', a.group('SBBB'))
def readHeroCards(self, hand):
# streets PREFLOP, PREDRAW, and THIRD are special cases beacause
# we need to grab hero's cards
for street in ('PREFLOP', 'DEAL'):
if street in hand.streets.keys():
m = self.re_HeroCards.finditer(hand.streets[street])
for found in m:
# if m == None:
# hand.involved = False
# else:
hand.hero = found.group('PNAME')
newcards = found.group('NEWCARDS').split(' ')
hand.addHoleCards(street, hand.hero, closed=newcards, shown=False, mucked=False, dealt=True)
for street, text in hand.streets.iteritems():
if not text or street in ('PREFLOP', 'DEAL'): continue # already done these
m = self.re_HeroCards.finditer(hand.streets[street])
for found in m:
player = found.group('PNAME')
if found.group('NEWCARDS') is None:
newcards = []
else:
newcards = found.group('NEWCARDS').split(' ')
if found.group('OLDCARDS') is None:
oldcards = []
else:
oldcards = found.group('OLDCARDS').split(' ')
if street == 'THIRD' and len(newcards) == 3: # hero in stud game
hand.hero = player
hand.dealt.add(player) # need this for stud??
hand.addHoleCards(street, player, closed=newcards[0:2], open=[newcards[2]], shown=False, mucked=False, dealt=False)
else:
hand.addHoleCards(street, player, open=newcards, closed=oldcards, shown=False, mucked=False, dealt=False)
def readAction(self, hand, street):
m = self.re_Action.finditer(hand.streets[street])
for action in m:
acts = action.groupdict()
if action.group('ATYPE') == ' raises':
hand.addRaiseTo( street, action.group('PNAME'), action.group('BET') )
elif action.group('ATYPE') == ' calls':
hand.addCall( street, action.group('PNAME'), action.group('BET') )
elif action.group('ATYPE') == ' bets':
hand.addBet( street, action.group('PNAME'), action.group('BET') )
elif action.group('ATYPE') == ' folds':
hand.addFold( street, action.group('PNAME'))
elif action.group('ATYPE') == ' checks':
hand.addCheck( street, action.group('PNAME'))
elif action.group('ATYPE') == ' discards':
hand.addDiscard(street, action.group('PNAME'), action.group('BET'), action.group('DISCARDED'))
elif action.group('ATYPE') == ' stands pat':
hand.addStandsPat( street, action.group('PNAME'))
else:
print "DEBUG: unimplemented readAction: '%s' '%s'" %(action.group('PNAME'),action.group('ATYPE'),)
def readShowdownActions(self, hand):
# TODO: pick up mucks also??
for shows in self.re_ShowdownAction.finditer(hand.handText):
cards = shows.group('CARDS').split(' ')
hand.addShownCards(cards, shows.group('PNAME'))
def readCollectPot(self,hand):
for m in self.re_CollectPot.finditer(hand.handText):
hand.addCollectPot(player=m.group('PNAME'),pot=m.group('POT'))
def readShownCards(self,hand):
for m in self.re_ShownCards.finditer(hand.handText):
if m.group('CARDS') is not None:
cards = m.group('CARDS')
cards = cards.split(' ') # needs to be a list, not a set--stud needs the order
(shown, mucked) = (False, False)
if m.group('SHOWED') == "showed": shown = True
elif m.group('SHOWED') == "mucked": mucked = True
hand.addShownCards(cards=cards, player=m.group('PNAME'), shown=shown, mucked=mucked)
if __name__ == "__main__":
parser = OptionParser()
parser.add_option("-i", "--input", dest="ipath", help="parse input hand history", default="regression-test-files/stars/horse/HH20090226 Natalie V - $0.10-$0.20 - HORSE.txt")
parser.add_option("-o", "--output", dest="opath", help="output translation to", default="-")
parser.add_option("-f", "--follow", dest="follow", help="follow (tail -f) the input", action="store_true", default=False)
#parser.add_option("-q", "--quiet", action="store_const", const=logging.CRITICAL, dest="verbosity", default=logging.INFO)
#parser.add_option("-v", "--verbose", action="store_const", const=logging.INFO, dest="verbosity")
#parser.add_option("--vv", action="store_const", const=logging.DEBUG, dest="verbosity")
(options, args) = parser.parse_args()
e = PokerStars(in_path = options.ipath, out_path = options.opath, follow = options.follow)

View File

@ -129,7 +129,7 @@ import Configuration
import Exceptions
import Stats
VERSION = "0.20.905"
VERSION = "0.20.905 plus git"
class fpdb:
@ -264,7 +264,8 @@ class fpdb:
, ('numpy', numpy_version)
, ('sqlite3', sqlite3_version)
, ('sqlite', sqlite_version)
, ('database', self.settings['db-server'] + db_version)
, ('fpdb version', VERSION)
, ('database used', self.settings['db-server'])
]
versions = gtk.TextBuffer()
w = 20 # width used for module names and version numbers
@ -786,7 +787,6 @@ class fpdb:
<menuitem action="Quit"/>
</menu>
<menu action="import">
<menuitem action="sethharchive"/>
<menuitem action="bulkimp"/>
<menuitem action="imapimport"/>
<menuitem action="autoimp"/>
@ -828,7 +828,6 @@ class fpdb:
('SaveProf', None, _('_Save Profile (todo)'), _('<control>S'), 'Save your profile', self.dia_save_profile),
('Preferences', None, _('Pre_ferences'), _('<control>F'), 'Edit your preferences', self.dia_preferences),
('import', None, _('_Import')),
('sethharchive', None, _('_Set HandHistory Archive Directory'), None, 'Set HandHistory Archive Directory', self.select_hhArchiveBase),
('bulkimp', None, _('_Bulk Import'), _('<control>B'), 'Bulk Import', self.tab_bulk_import),
('imapimport', None, _('_Import through eMail/IMAP'), _('<control>I'), 'Import through eMail/IMAP', self.tab_imap_import),
('viewers', None, _('_Viewers')),
@ -1252,16 +1251,6 @@ You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt an
elif response == gtk.RESPONSE_NO:
self.select_hhArchiveBase()
def select_hhArchiveBase(self, widget=None):
fc = gtk.FileChooserDialog(title=_("Select HH Output Directory"), parent=None, action=gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, buttons=(gtk.STOCK_OPEN,gtk.RESPONSE_OK), backend=None)
fc.run()
# TODO: We need to put in a Cancel button, and handle if the user presses that or the "Close" box without selecting anything as a cancel, and return to the prior setting
#self.warning_box("You selected %s" % fc.get_filename())
self.config.set_hhArchiveBase(fc.get_filename())
self.config.save()
self.load_profile() # we can't do this at the end of this func because load_profile calls this func
fc.destroy() # TODO: loop this to make sure we get valid data back from it, because the open directory thing in GTK lets you select files and not select things and other stupid bullshit
def main(self):
gtk.main()
return 0

View File

@ -1,3 +1,4 @@
cd ..
python /usr/share/doc/python-2.7/examples/Tools/i18n/msgfmt.py --output-file=locale/hu/LC_MESSAGES/fpdb.mo locale/fpdb-hu_HU.po
python /usr/share/doc/python-2.7/examples/Tools/i18n/msgfmt.py --output-file=locale/de/LC_MESSAGES/fpdb.mo locale/fpdb-de_DE.po

Binary file not shown.

3102
pyfpdb/locale/fpdb-de_DE.po Normal file

File diff suppressed because it is too large Load Diff

View File

@ -5,12 +5,12 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2010-08-23 05:27+CEST\n"
"POT-Creation-Date: 2010-08-26 18:52+CEST\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: ENCODING\n"
"Generated-By: pygettext.py 1.5\n"
@ -23,31 +23,31 @@ msgstr ""
msgid "Output being written to"
msgstr ""
#: BetfairToFpdb.py:84
#: BetfairToFpdb.py:83
msgid "GameInfo regex did not match"
msgstr ""
#: BetfairToFpdb.py:115
#: BetfairToFpdb.py:114
msgid "Didn't match re_HandInfo"
msgstr ""
#: BetfairToFpdb.py:171
#: BetfairToFpdb.py:170
msgid "No bringin found"
msgstr ""
#: BetfairToFpdb.py:207 OnGameToFpdb.py:328 PokerStarsToFpdb.py:440
#: BetfairToFpdb.py:206 OnGameToFpdb.py:308 PokerStarsToFpdb.py:440
msgid "DEBUG: unimplemented readAction: '%s' '%s'"
msgstr ""
#: BetfairToFpdb.py:230 PartyPokerToFpdb.py:522 PokerStarsToFpdb.py:467
#: BetfairToFpdb.py:229 PartyPokerToFpdb.py:522 PokerStarsToFpdb.py:467
msgid "parse input hand history"
msgstr ""
#: BetfairToFpdb.py:231 PartyPokerToFpdb.py:523 PokerStarsToFpdb.py:468
#: BetfairToFpdb.py:230 PartyPokerToFpdb.py:523 PokerStarsToFpdb.py:468
msgid "output translation to"
msgstr ""
#: BetfairToFpdb.py:232 PartyPokerToFpdb.py:524 PokerStarsToFpdb.py:469
#: BetfairToFpdb.py:231 PartyPokerToFpdb.py:524 PokerStarsToFpdb.py:469
msgid "follow (tail -f) the input"
msgstr ""
@ -581,11 +581,11 @@ msgstr ""
msgid " Clear Dates "
msgstr ""
#: Filters.py:940 fpdb.pyw:721
#: Filters.py:940 fpdb.pyw:722
msgid "Pick a date"
msgstr ""
#: Filters.py:946 fpdb.pyw:727
#: Filters.py:946 fpdb.pyw:728
msgid "Done"
msgstr ""
@ -709,7 +709,7 @@ msgstr ""
msgid "auto"
msgstr ""
#: GuiBulkImport.py:239 GuiBulkImport.py:289 GuiBulkImport.py:399
#: GuiBulkImport.py:239 GuiBulkImport.py:289 GuiBulkImport.py:398
msgid "don't drop"
msgstr ""
@ -729,7 +729,7 @@ msgstr ""
msgid "Drop HudCache:"
msgstr ""
#: GuiBulkImport.py:297 fpdb.pyw:832
#: GuiBulkImport.py:297 fpdb.pyw:831
msgid "_Bulk Import"
msgstr ""
@ -793,11 +793,11 @@ msgstr ""
msgid "PartyPoker converter: ./GuiBulkImport.py -c PartyPoker -f filename"
msgstr ""
#: GuiBulkImport.py:386
#: GuiBulkImport.py:385
msgid "-q is deprecated. Just use \"-f filename\" instead"
msgstr ""
#: GuiBulkImport.py:410
#: GuiBulkImport.py:409
msgid "GuiBulkImport done: Stored: %d \tDuplicates: %d \tPartial: %d \tErrors: %d in %s seconds - %.0f/sec"
msgstr ""
@ -853,7 +853,7 @@ msgstr ""
msgid " not connected but no exception"
msgstr ""
#: GuiDatabase.py:293 fpdb.pyw:905
#: GuiDatabase.py:293 fpdb.pyw:904
msgid "MySQL Server reports: Access denied. Are your permissions set correctly?"
msgstr ""
@ -861,7 +861,7 @@ msgstr ""
msgid "MySQL client reports: 2002 or 2003 error. Unable to connect - Please check that the MySQL service has been started"
msgstr ""
#: GuiDatabase.py:301 fpdb.pyw:910
#: GuiDatabase.py:301 fpdb.pyw:909
msgid "Postgres Server reports: Access denied. Are your permissions set correctly?"
msgstr ""
@ -905,22 +905,22 @@ msgid ""
" and HUD are NOT affected by this problem."
msgstr ""
#: GuiGraphViewer.py:141 GuiGraphViewer.py:255 GuiSessionViewer.py:355
#: GuiGraphViewer.py:141 GuiGraphViewer.py:255 GuiSessionViewer.py:354
msgid "***Error: "
msgstr ""
#: GuiGraphViewer.py:171 GuiPositionalStats.py:178 GuiRingPlayerStats.py:252
#: GuiSessionViewer.py:204 GuiTourneyPlayerStats.py:277
#: GuiGraphViewer.py:171 GuiPositionalStats.py:177 GuiRingPlayerStats.py:251
#: GuiSessionViewer.py:203 GuiTourneyPlayerStats.py:277
msgid "No sites selected - defaulting to PokerStars"
msgstr ""
#: GuiGraphViewer.py:176 GuiPositionalStats.py:181 GuiRingPlayerStats.py:255
#: GuiSessionViewer.py:207 GuiTourneyPlayerStats.py:280
#: GuiGraphViewer.py:176 GuiPositionalStats.py:180 GuiRingPlayerStats.py:254
#: GuiSessionViewer.py:206 GuiTourneyPlayerStats.py:280
msgid "No player ids found"
msgstr ""
#: GuiGraphViewer.py:181 GuiPositionalStats.py:184 GuiRingPlayerStats.py:258
#: GuiSessionViewer.py:210
#: GuiGraphViewer.py:181 GuiPositionalStats.py:183 GuiRingPlayerStats.py:257
#: GuiSessionViewer.py:209
msgid "No limits found"
msgstr ""
@ -1030,11 +1030,11 @@ msgstr ""
msgid "Log Messages"
msgstr ""
#: GuiPositionalStats.py:147
#: GuiPositionalStats.py:146
msgid "DEBUG: activesite set to %s"
msgstr ""
#: GuiPositionalStats.py:333
#: GuiPositionalStats.py:332
msgid "Positional Stats page displayed in %4.2f seconds"
msgstr ""
@ -1050,36 +1050,36 @@ msgstr ""
msgid "Test Preferences Dialog"
msgstr ""
#: GuiPrefs.py:192 fpdb.pyw:296
#: GuiPrefs.py:192 fpdb.pyw:297
msgid "Preferences"
msgstr ""
#: GuiRingPlayerStats.py:323 GuiSessionViewer.py:249
#: GuiRingPlayerStats.py:322 GuiSessionViewer.py:248
#: GuiTourneyPlayerStats.py:252
msgid "Stats page displayed in %4.2f seconds"
msgstr ""
#: GuiRingPlayerStats.py:370
#: GuiRingPlayerStats.py:369
msgid "***sortnums error: "
msgstr ""
#: GuiRingPlayerStats.py:392
#: GuiRingPlayerStats.py:391
msgid "***sortcols error: "
msgstr ""
#: GuiRingPlayerStats.py:683
#: GuiRingPlayerStats.py:682
msgid "Detailed Filters"
msgstr ""
#: GuiRingPlayerStats.py:692
#: GuiRingPlayerStats.py:691
msgid "Hand Filters:"
msgstr ""
#: GuiRingPlayerStats.py:705
#: GuiRingPlayerStats.py:704
msgid "between"
msgstr ""
#: GuiRingPlayerStats.py:706
#: GuiRingPlayerStats.py:705
msgid "and"
msgstr ""
@ -1091,15 +1091,15 @@ msgstr ""
msgid "ImportError: %s"
msgstr ""
#: GuiSessionViewer.py:90
#: GuiSessionViewer.py:89
msgid "Hand Breakdown for all levels listed above"
msgstr ""
#: GuiSessionViewer.py:376
#: GuiSessionViewer.py:375
msgid "Session candlestick graph"
msgstr ""
#: GuiSessionViewer.py:379
#: GuiSessionViewer.py:378
msgid "Sessions"
msgstr ""
@ -1154,7 +1154,7 @@ msgid ""
"Note: error output is being diverted to:\n"
msgstr ""
#: HUD_main.pyw:96 fpdb.pyw:1139
#: HUD_main.pyw:96 fpdb.pyw:1138
msgid ""
"\n"
"Any major error will be reported there _only_.\n"
@ -1837,15 +1837,16 @@ msgstr ""
msgid "No Name"
msgstr ""
#: OnGameToFpdb.py:153 PokerStarsToFpdb.py:189
#: OnGameToFpdb.py:153 PkrToFpdb.py:144 PokerStarsToFpdb.py:189
msgid "determineGameType: Unable to recognise gametype from: '%s'"
msgstr ""
#: OnGameToFpdb.py:154 PokerStarsToFpdb.py:190 PokerStarsToFpdb.py:220
#: OnGameToFpdb.py:154 PkrToFpdb.py:145 PkrToFpdb.py:173
#: PokerStarsToFpdb.py:190 PokerStarsToFpdb.py:220
msgid "determineGameType: Raising FpdbParseError"
msgstr ""
#: OnGameToFpdb.py:155 PokerStarsToFpdb.py:191
#: OnGameToFpdb.py:155 PkrToFpdb.py:146 PokerStarsToFpdb.py:191
msgid "Unable to recognise gametype from: '%s'"
msgstr ""
@ -1937,6 +1938,10 @@ msgstr ""
msgid "Unimplemented readAction: '%s' '%s'"
msgstr ""
#: PkrToFpdb.py:174 PokerStarsToFpdb.py:221
msgid "Lim_Blinds has no lookup for '%s'"
msgstr ""
#: PokerStarsSummary.py:72
msgid "didn't recognise buyin currency in:"
msgstr ""
@ -1945,10 +1950,6 @@ msgstr ""
msgid "in not result starttime"
msgstr ""
#: PokerStarsToFpdb.py:221
msgid "Lim_Blinds has no lookup for '%s'"
msgstr ""
#: PokerStarsToFpdb.py:273
msgid "failed to detect currency"
msgstr ""
@ -2428,161 +2429,161 @@ msgstr ""
msgid "Operating System"
msgstr ""
#: fpdb.pyw:279
#: fpdb.pyw:280
msgid "Your config file is: "
msgstr ""
#: fpdb.pyw:284
#: fpdb.pyw:285
msgid "Version Information:"
msgstr ""
#: fpdb.pyw:291
#: fpdb.pyw:292
msgid "Threads: "
msgstr ""
#: fpdb.pyw:314
#: fpdb.pyw:315
msgid "Updated preferences have not been loaded because windows are open. Re-start fpdb to load them."
msgstr ""
#: fpdb.pyw:324
#: fpdb.pyw:325
msgid "Maintain Databases"
msgstr ""
#: fpdb.pyw:334
#: fpdb.pyw:335
msgid "saving updated db data"
msgstr ""
#: fpdb.pyw:341
#: fpdb.pyw:342
msgid "guidb response was "
msgstr ""
#: fpdb.pyw:347
#: fpdb.pyw:348
msgid "Cannot open Database Maintenance window because other windows have been opened. Re-start fpdb to use this option."
msgstr ""
#: fpdb.pyw:350
msgid "Number of Hands: "
msgstr ""
#: fpdb.pyw:351
msgid ""
"\n"
"Number of Tourneys: "
msgid "Number of Hands: "
msgstr ""
#: fpdb.pyw:352
msgid ""
"\n"
"Number of TourneyTypes: "
"Number of Tourneys: "
msgstr ""
#: fpdb.pyw:353
msgid ""
"\n"
"Number of TourneyTypes: "
msgstr ""
#: fpdb.pyw:354
msgid "Database Statistics"
msgstr ""
#: fpdb.pyw:362
#: fpdb.pyw:363
msgid "HUD Configurator - choose category"
msgstr ""
#: fpdb.pyw:368
#: fpdb.pyw:369
msgid "Please select the game category for which you want to configure HUD stats:"
msgstr ""
#: fpdb.pyw:420
#: fpdb.pyw:421
msgid "HUD Configurator - please choose your stats"
msgstr ""
#: fpdb.pyw:426
#: fpdb.pyw:427
msgid "Please choose the stats you wish to use in the below table."
msgstr ""
#: fpdb.pyw:430
#: fpdb.pyw:431
msgid "Note that you may not select any stat more than once or it will crash."
msgstr ""
#: fpdb.pyw:434
#: fpdb.pyw:435
msgid "It is not currently possible to select \"empty\" or anything else to that end."
msgstr ""
#: fpdb.pyw:438
#: fpdb.pyw:439
msgid "To configure things like colouring you will still have to manually edit your HUD_config.xml."
msgstr ""
#: fpdb.pyw:545
#: fpdb.pyw:546
msgid "Confirm deleting and recreating tables"
msgstr ""
#: fpdb.pyw:546
#: fpdb.pyw:547
msgid "Please confirm that you want to (re-)create the tables. If there already are tables in the database "
msgstr ""
#: fpdb.pyw:547
#: fpdb.pyw:548
msgid ""
" they will be deleted.\n"
"This may take a while."
msgstr ""
#: fpdb.pyw:572
#: fpdb.pyw:573
msgid "User cancelled recreating tables"
msgstr ""
#: fpdb.pyw:579
#: fpdb.pyw:580
msgid "Please confirm that you want to re-create the HUD cache."
msgstr ""
#: fpdb.pyw:587
#: fpdb.pyw:588
msgid " Hero's cache starts: "
msgstr ""
#: fpdb.pyw:601
#: fpdb.pyw:602
msgid " Villains' cache starts: "
msgstr ""
#: fpdb.pyw:614
#: fpdb.pyw:615
msgid " Rebuilding HUD Cache ... "
msgstr ""
#: fpdb.pyw:622
#: fpdb.pyw:623
msgid "User cancelled rebuilding hud cache"
msgstr ""
#: fpdb.pyw:634
#: fpdb.pyw:635
msgid "Confirm rebuilding database indexes"
msgstr ""
#: fpdb.pyw:635
#: fpdb.pyw:636
msgid "Please confirm that you want to rebuild the database indexes."
msgstr ""
#: fpdb.pyw:643
#: fpdb.pyw:644
msgid " Rebuilding Indexes ... "
msgstr ""
#: fpdb.pyw:650
#: fpdb.pyw:651
msgid " Cleaning Database ... "
msgstr ""
#: fpdb.pyw:655
#: fpdb.pyw:656
msgid " Analyzing Database ... "
msgstr ""
#: fpdb.pyw:660
#: fpdb.pyw:661
msgid "User cancelled rebuilding db indexes"
msgstr ""
#: fpdb.pyw:755
#: fpdb.pyw:756
msgid "Unimplemented: Save Profile (try saving a HUD layout, that should do it)"
msgstr ""
#: fpdb.pyw:758
#: fpdb.pyw:759
msgid "Fatal Error - Config File Missing"
msgstr ""
#: fpdb.pyw:760
#: fpdb.pyw:761
msgid "Please copy the config file from the docs folder to:"
msgstr ""
#: fpdb.pyw:768
#: fpdb.pyw:769
msgid "and edit it according to the install documentation at http://fpdb.sourceforge.net"
msgstr ""
@ -2590,7 +2591,7 @@ msgstr ""
msgid "_Main"
msgstr ""
#: fpdb.pyw:826 fpdb.pyw:854
#: fpdb.pyw:826 fpdb.pyw:853
msgid "_Quit"
msgstr ""
@ -2623,250 +2624,246 @@ msgid "_Import"
msgstr ""
#: fpdb.pyw:831
msgid "_Set HandHistory Archive Directory"
msgstr ""
#: fpdb.pyw:832
msgid "<control>B"
msgstr ""
#: fpdb.pyw:833
#: fpdb.pyw:832
msgid "<control>I"
msgstr ""
#: fpdb.pyw:833
#: fpdb.pyw:832
msgid "_Import through eMail/IMAP"
msgstr ""
#: fpdb.pyw:834
#: fpdb.pyw:833
msgid "_Viewers"
msgstr ""
#: fpdb.pyw:835
#: fpdb.pyw:834
msgid "<control>A"
msgstr ""
#: fpdb.pyw:835
#: fpdb.pyw:834
msgid "_Auto Import and HUD"
msgstr ""
#: fpdb.pyw:836
#: fpdb.pyw:835
msgid "<control>H"
msgstr ""
#: fpdb.pyw:836
#: fpdb.pyw:835
msgid "_HUD Configurator"
msgstr ""
#: fpdb.pyw:837
#: fpdb.pyw:836
msgid "<control>G"
msgstr ""
#: fpdb.pyw:837
#: fpdb.pyw:836
msgid "_Graphs"
msgstr ""
#: fpdb.pyw:838
#: fpdb.pyw:837
msgid "<control>P"
msgstr ""
#: fpdb.pyw:838
msgid "Ring _Player Stats (tabulated view)"
#: fpdb.pyw:837
msgid "Ring _Player Stats (tabulated view, not on pgsql)"
msgstr ""
#: fpdb.pyw:839
#: fpdb.pyw:838
msgid "<control>T"
msgstr ""
#: fpdb.pyw:839
msgid "_Tourney Player Stats (tabulated view)"
#: fpdb.pyw:838
msgid "_Tourney Player Stats (tabulated view, not on pgsql)"
msgstr ""
#: fpdb.pyw:840
#: fpdb.pyw:839
msgid "Tourney _Viewer"
msgstr ""
#: fpdb.pyw:841
#: fpdb.pyw:840
msgid "<control>O"
msgstr ""
#: fpdb.pyw:841
#: fpdb.pyw:840
msgid "P_ositional Stats (tabulated view, not on sqlite)"
msgstr ""
#: fpdb.pyw:842 fpdb.pyw:1058
#: fpdb.pyw:841 fpdb.pyw:1057
msgid "Session Stats"
msgstr ""
#: fpdb.pyw:843
#: fpdb.pyw:842
msgid "_Database"
msgstr ""
#: fpdb.pyw:844
#: fpdb.pyw:843
msgid "_Maintain Databases"
msgstr ""
#: fpdb.pyw:845
#: fpdb.pyw:844
msgid "Create or Recreate _Tables"
msgstr ""
#: fpdb.pyw:846
#: fpdb.pyw:845
msgid "Rebuild HUD Cache"
msgstr ""
#: fpdb.pyw:847
#: fpdb.pyw:846
msgid "Rebuild DB Indexes"
msgstr ""
#: fpdb.pyw:848
#: fpdb.pyw:847
msgid "_Statistics"
msgstr ""
#: fpdb.pyw:849
#: fpdb.pyw:848
msgid "Dump Database to Textfile (takes ALOT of time)"
msgstr ""
#: fpdb.pyw:850
#: fpdb.pyw:849
msgid "_Help"
msgstr ""
#: fpdb.pyw:851
#: fpdb.pyw:850
msgid "_Log Messages"
msgstr ""
#: fpdb.pyw:852
#: fpdb.pyw:851
msgid "A_bout, License, Copying"
msgstr ""
#: fpdb.pyw:870
#: fpdb.pyw:869
msgid ""
"There is an error in your config file\n"
msgstr ""
#: fpdb.pyw:871
#: fpdb.pyw:870
msgid ""
"\n"
"\n"
"Error is: "
msgstr ""
#: fpdb.pyw:872
#: fpdb.pyw:871
msgid "CONFIG FILE ERROR"
msgstr ""
#: fpdb.pyw:876
#: fpdb.pyw:875
msgid ""
"Logfile is %s\n"
msgstr ""
#: fpdb.pyw:878
#: fpdb.pyw:877
msgid "Config file"
msgstr ""
#: fpdb.pyw:879
#: fpdb.pyw:878
msgid ""
"has been created at:\n"
"%s.\n"
msgstr ""
#: fpdb.pyw:880
#: fpdb.pyw:879
msgid "Edit your screen_name and hand history path in the supported_sites "
msgstr ""
#: fpdb.pyw:881
#: fpdb.pyw:880
msgid "section of the Preferences window (Main menu) before trying to import hands."
msgstr ""
#: fpdb.pyw:903
#: fpdb.pyw:902
msgid "Connected to SQLite: %s"
msgstr ""
#: fpdb.pyw:907
#: fpdb.pyw:906
msgid "MySQL client reports: 2002 or 2003 error. Unable to connect - "
msgstr ""
#: fpdb.pyw:908
#: fpdb.pyw:907
msgid "Please check that the MySQL service has been started"
msgstr ""
#: fpdb.pyw:912
#: fpdb.pyw:911
msgid "Postgres client reports: Unable to connect - "
msgstr ""
#: fpdb.pyw:913
#: fpdb.pyw:912
msgid "Please check that the Postgres service has been started"
msgstr ""
#: fpdb.pyw:937
#: fpdb.pyw:936
msgid "Strong Warning - Invalid database version"
msgstr ""
#: fpdb.pyw:939
#: fpdb.pyw:938
msgid "An invalid DB version or missing tables have been detected."
msgstr ""
#: fpdb.pyw:943
#: fpdb.pyw:942
msgid "This error is not necessarily fatal but it is strongly recommended that you recreate the tables by using the Database menu."
msgstr ""
#: fpdb.pyw:947
#: fpdb.pyw:946
msgid "Not doing this will likely lead to misbehaviour including fpdb crashes, corrupt data etc."
msgstr ""
#: fpdb.pyw:960
#: fpdb.pyw:959
msgid "Status: Connected to %s database named %s on host %s"
msgstr ""
#: fpdb.pyw:970
#: fpdb.pyw:969
msgid ""
"\n"
"Global lock taken by"
msgstr ""
#: fpdb.pyw:973
#: fpdb.pyw:972
msgid ""
"\n"
"Failed to get global lock, it is currently held by"
msgstr ""
#: fpdb.pyw:983
#: fpdb.pyw:982
msgid "Quitting normally"
msgstr ""
#: fpdb.pyw:1007
#: fpdb.pyw:1006
msgid ""
"Global lock released.\n"
msgstr ""
#: fpdb.pyw:1014
#: fpdb.pyw:1013
msgid "Auto Import"
msgstr ""
#: fpdb.pyw:1021
#: fpdb.pyw:1020
msgid "Bulk Import"
msgstr ""
#: fpdb.pyw:1027
#: fpdb.pyw:1026
msgid "eMail Import"
msgstr ""
#: fpdb.pyw:1034
#: fpdb.pyw:1033
msgid "Ring Player Stats"
msgstr ""
#: fpdb.pyw:1040
#: fpdb.pyw:1039
msgid "Tourney Player Stats"
msgstr ""
#: fpdb.pyw:1046
#: fpdb.pyw:1045
msgid "Tourney Viewer"
msgstr ""
#: fpdb.pyw:1052
#: fpdb.pyw:1051
msgid "Positional Stats"
msgstr ""
#: fpdb.pyw:1062
#: fpdb.pyw:1061
msgid ""
"Fpdb needs translators!\n"
"If you speak another language and have a few minutes or more to spare get in touch by emailing steffen@schaumburger.info\n"
@ -2887,43 +2884,39 @@ msgid ""
"You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt and mit.txt in the fpdb installation directory."
msgstr ""
#: fpdb.pyw:1079
#: fpdb.pyw:1078
msgid "Help"
msgstr ""
#: fpdb.pyw:1086
#: fpdb.pyw:1085
msgid "Graphs"
msgstr ""
#: fpdb.pyw:1138
#: fpdb.pyw:1137
msgid ""
"\n"
"Note: error output is being diverted to fpdb-errors.txt and HUD-errors.txt in:\n"
msgstr ""
#: fpdb.pyw:1167
#: fpdb.pyw:1166
msgid "fpdb starting ..."
msgstr ""
#: fpdb.pyw:1224
#: fpdb.pyw:1223
msgid "FPDB WARNING"
msgstr ""
#: fpdb.pyw:1243
#: fpdb.pyw:1242
msgid ""
"WARNING: Unable to find output hh directory %s\n"
"\n"
" Press YES to create this directory, or NO to select a new one."
msgstr ""
#: fpdb.pyw:1251
#: fpdb.pyw:1250
msgid "WARNING: Unable to create hand output directory. Importing is not likely to work until this is fixed."
msgstr ""
#: fpdb.pyw:1256
msgid "Select HH Output Directory"
msgstr ""
#: fpdb_import.py:60
msgid "Import database module: MySQLdb not found"
msgstr ""
@ -3016,7 +3009,7 @@ msgstr ""
msgid "CLI for fpdb_import is now available as CliFpdb.py"
msgstr ""
#: interlocks.py:49
#: interlocks.py:61
msgid "lock already held by:"
msgstr ""

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -1,2 +1,3 @@
msgmerge --update fpdb-hu_HU.po fpdb-en_GB.po
msgmerge --update fpdb-de_DE.po fpdb-en_GB.po

View File

@ -0,0 +1,33 @@
Game #9485557849 starts.
#Game No : 9485557849
***** Hand History for Game 9485557849 *****
$0.80 USD NL Texas Hold'em - Saturday, July 31, 13:52:16 EDT 2010
Table 20BB Min Speed #1770998 (Real Money)
Seat 1 is the button
Total number of players : 4/9
Seat 3: Player1 ( $1.64 USD )
Seat 5: Player2 ( $0.01 USD )
Seat 9: Player3 ( $1.02 USD )
Seat 1: Player4 ( $1.20 USD )
Player1 posts small blind [$0.01 USD].
Player2 posts big blind [$0.01 USD].
** Dealing down cards **
Dealt to Player1 [ 8h Kc ]
Player3 folds
Player4 calls [$0.02 USD]
Player1 calls [$0.01 USD]
** Dealing Flop ** [ Td, 7c, 9h ]
Player1 checks
Player4 checks
** Dealing Turn ** [ 3h ]
Player1 checks
Player4 checks
** Dealing River ** [ Jc ]
Player1 bets [$0.04 USD]
Player4 folds
Player1 shows [ 8h, Kc ]a straight, Seven to Jack.
Player2 doesn't show [ Ts, Jd ]two pairs, Jacks and Tens.
Player1 wins $0.06 USD from the side pot 1 with a straight, Seven to Jack.
Player1 wins $0.03 USD from the main pot with a straight, Seven to Jack.
Player2 has left the table.

View File

@ -1,63 +0,0 @@
Game #9485557849 starts.
#Game No : 9485557849
***** Hand History for Game 9485557849 *****
$0.80 USD NL Texas Hold'em - Saturday, July 31, 13:52:16 EDT 2010
Table 20BB Min Speed #1770998 (Real Money)
Seat 1 is the button
Total number of players : 4/9
Seat 3: FErki84 ( $1.64 USD )
Seat 5: Vandercasses ( $0.01 USD )
Seat 9: jeremyho888 ( $1.02 USD )
Seat 1: sergeodem ( $1.20 USD )
FErki84 posts small blind [$0.01 USD].
Vandercasses posts big blind [$0.01 USD].
** Dealing down cards **
Dealt to FErki84 [ 8h Kc ]
jeremyho888 folds
sergeodem calls [$0.02 USD]
FErki84 calls [$0.01 USD]
** Dealing Flop ** [ Td, 7c, 9h ]
FErki84 checks
sergeodem checks
** Dealing Turn ** [ 3h ]
FErki84 checks
sergeodem checks
** Dealing River ** [ Jc ]
FErki84 bets [$0.04 USD]
sergeodem folds
FErki84 shows [ 8h, Kc ]a straight, Seven to Jack.
Vandercasses doesn't show [ Ts, Jd ]two pairs, Jacks and Tens.
FErki84 wins $0.06 USD from the side pot 1 with a straight, Seven to Jack.
FErki84 wins $0.03 USD from the main pot with a straight, Seven to Jack.
Vandercasses has left the table.
Game #9498788316 starts.
#Game No : 9498788316
***** Hand History for Game 9498788316 *****
$1.60 USD NL Texas Hold'em - Wednesday, August 04, 15:02:33 EDT 2010
Table 20BB Min #1847547 (No DP) (Real Money)
Seat 2 is the button
Total number of players : 5/6
Seat 5: CepguTbIu999 ( $1.60 USD )
Seat 1: Daytona_955 ( $2.45 USD )
Seat 4: FErki84 ( $2.18 USD )
Seat 2: anjl2009 ( $2.80 USD )
Seat 3: lukeman2 ( $0.01 USD )
lukeman2 posts small blind [$0.01 USD].
FErki84 posts big blind [$0.04 USD].
** Dealing down cards **
Dealt to FErki84 [ 6s 2c ]
CepguTbIu999 folds
Daytona_955 folds
anjl2009 folds
** Dealing Flop ** [ 9d, Ah, 3h ]
** Dealing Turn ** [ Js ]
** Dealing River ** [ Kc ]
lukeman2 shows [ 5h, 5s ]a pair of Fives.
FErki84 shows [ 6s, 2c ]high card Ace.
FErki84 wins $0.03 USD from the side pot 1 with high card, Ace.
lukeman2 wins $0.02 USD from the main pot with a pair of Fives.
lukeman2 has left the table.

View File

@ -0,0 +1,28 @@
Game #9498788316 starts.
#Game No : 9498788316
***** Hand History for Game 9498788316 *****
$1.60 USD NL Texas Hold'em - Wednesday, August 04, 15:02:33 EDT 2010
Table 20BB Min #1847547 (No DP) (Real Money)
Seat 2 is the button
Total number of players : 5/6
Seat 5: Player1 ( $1.60 USD )
Seat 1: Player2 ( $2.45 USD )
Seat 4: Player3 ( $2.18 USD )
Seat 2: Player4 ( $2.80 USD )
Seat 3: Player5 ( $0.01 USD )
Player5 posts small blind [$0.01 USD].
Player3 posts big blind [$0.04 USD].
** Dealing down cards **
Dealt to Player3 [ 6s 2c ]
Player1 folds
Player2 folds
Player4 folds
** Dealing Flop ** [ 9d, Ah, 3h ]
** Dealing Turn ** [ Js ]
** Dealing River ** [ Kc ]
Player5 shows [ 5h, 5s ]a pair of Fives.
Player3 shows [ 6s, 2c ]high card Ace.
Player3 wins $0.03 USD from the side pot 1 with high card, Ace.
Player5 wins $0.02 USD from the main pot with a pair of Fives.
Player5 has left the table.