Browse Source

Merge branch 'master' of git://git.assembla.com/fpdb

master
Worros 13 years ago
parent
commit
da82c25b2f
  1. 112
      packaging/announce-0.22.txt
  2. 78
      packaging/announce-template.txt
  3. 12
      packaging/debian/changelog
  4. 42
      packaging/gentoo/current.ebuild
  5. 60
      packaging/gentoo/current_stable.ebuild
  6. 53
      packaging/gentoo/fpdb-9999.ebuild
  7. 4
      pyfpdb/AbsoluteToFpdb.py
  8. 134
      pyfpdb/AlchemyFacilities.py
  9. 485
      pyfpdb/AlchemyMappings.py
  10. 460
      pyfpdb/AlchemyTables.py
  11. 4
      pyfpdb/BetfairToFpdb.py
  12. 4
      pyfpdb/CarbonToFpdb.py
  13. 18
      pyfpdb/Charset.py
  14. 22
      pyfpdb/Configuration.py
  15. 73
      pyfpdb/Database.py
  16. 8
      pyfpdb/EverestToFpdb.py
  17. 56
      pyfpdb/EverleafToFpdb.py
  18. 8
      pyfpdb/FullTiltPokerSummary.py
  19. 25
      pyfpdb/FulltiltToFpdb.py
  20. 2
      pyfpdb/GuiImapFetcher.py
  21. 4
      pyfpdb/OnGameToFpdb.py
  22. 8
      pyfpdb/PacificPokerToFpdb.py
  23. 8
      pyfpdb/PartyPokerToFpdb.py
  24. 6
      pyfpdb/PkrToFpdb.py
  25. 8
      pyfpdb/PokerStarsSummary.py
  26. 10
      pyfpdb/PokerStarsToFpdb.py
  27. 2
      pyfpdb/RushNotesAux.py
  28. 4
      pyfpdb/SitenameSummary.py
  29. 6
      pyfpdb/TestHandsPlayers.py
  30. 4
      pyfpdb/Win2dayToFpdb.py
  31. 10
      pyfpdb/WinamaxToFpdb.py
  32. 18
      pyfpdb/fpdb.pyw
  33. 4
      pyfpdb/iPokerToFpdb.py
  34. BIN
      pyfpdb/locale/de/LC_MESSAGES/fpdb.mo
  35. BIN
      pyfpdb/locale/es/LC_MESSAGES/fpdb.mo
  36. 1325
      pyfpdb/locale/fpdb-de_DE.po
  37. 1090
      pyfpdb/locale/fpdb-en_GB.pot
  38. 2089
      pyfpdb/locale/fpdb-es_ES.po
  39. 1619
      pyfpdb/locale/fpdb-fr_FR.po
  40. 1282
      pyfpdb/locale/fpdb-hu_HU.po
  41. 4225
      pyfpdb/locale/fpdb-it_IT.po
  42. 1152
      pyfpdb/locale/fpdb-pl_PL.po
  43. 4026
      pyfpdb/locale/fpdb-pt_BR.po
  44. 1778
      pyfpdb/locale/fpdb-ru_RU.po
  45. 3992
      pyfpdb/locale/fpdb-zh_CN.po
  46. BIN
      pyfpdb/locale/fr/LC_MESSAGES/fpdb.mo
  47. BIN
      pyfpdb/locale/hu/LC_MESSAGES/fpdb.mo
  48. BIN
      pyfpdb/locale/it/LC_MESSAGES/fpdb.mo
  49. 28
      pyfpdb/locale/localise.sh
  50. BIN
      pyfpdb/locale/pl/LC_MESSAGES/fpdb.mo
  51. BIN
      pyfpdb/locale/pt/LC_MESSAGES/fpdb.mo
  52. BIN
      pyfpdb/locale/ru/LC_MESSAGES/fpdb.mo
  53. BIN
      pyfpdb/locale/zh/LC_MESSAGES/fpdb.mo
  54. 48
      pyfpdb/regression-test-files/cash/Everleaf/Flop/NLHE-EUR-0.01-0.02-20091027.partouche
  55. 1729
      pyfpdb/regression-test-files/cash/Stars/Flop/LHE-10max-USD-0.05-0.10-PF_all_fold_to_BB.txt.0001.sql
  56. 126
      pyfpdb/regression-test-files/empty_DB.0000.sql
  57. 19
      pyfpdb/regression-test-files/summaries/Stars/NLHE-Play-STT-20110405.txt
  58. 3674
      pyfpdb/regression-test-files/tour/Stars/Flop/LHE-USD-STT-5-20100607.allInPreflop.txt.0002.sql
  59. 381
      pyfpdb/regression-test-files/tour/Stars/Flop/NLHE-Play-STT-20110405.txt
  60. 288
      pyfpdb/regression-test-files/unsupported-sites/entraction/HandHistoryIndex.txt
  61. 1842
      pyfpdb/regression-test-files/unsupported-sites/entraction/Table_35124993.txt
  62. 258
      pyfpdb/regression-test-files/unsupported-sites/entraction/Table_35125878.txt
  63. 2236
      pyfpdb/regression-test-files/unsupported-sites/entraction/Table_35129644.txt
  64. 1399
      pyfpdb/regression-test-files/unsupported-sites/entraction/Table_35131702.txt
  65. 2046
      pyfpdb/regression-test-files/unsupported-sites/entraction/Table_35132513.txt
  66. 2481
      pyfpdb/regression-test-files/unsupported-sites/entraction/Table_35134072.txt
  67. 1950
      pyfpdb/regression-test-files/unsupported-sites/entraction/Table_35135862.txt
  68. 175
      regression-test/PrintHand.py
  69. 158
      regression-test/PrintPlayerHudData.py
  70. 80
      regression-test/fpdb_util_lib.py
  71. 271
      regression-test/known-broken/ftp-omaha-hi-pl-ring-001-005.txt
  72. 61
      regression-test/known-broken/ftp-stud-hilo-ring-001.txt
  73. 40
      regression-test/known-broken/ftp.6367428246.expected.txt
  74. 48
      regression-test/known-broken/ftp.6929537410.expected.txt
  75. 47
      regression-test/known-broken/ftp.6929553738.expected.txt
  76. 68
      regression-test/ps-flags-B-1hands.expected.txt
  77. 68
      regression-test/ps-flags-CBflop.expected.txt
  78. 68
      regression-test/ps-flags-M-2hands.expected.txt
  79. 68
      regression-test/ps-flags-studhilo.expected.txt
  80. 169
      regression-test/ps-lhe-ring-3hands.txt
  81. 62
      regression-test/ps-lhe-ring-call-3B-preflop-cb-no2b.txt
  82. 42
      regression-test/ps-lhe-ring-successful-steal-by-cutoff.txt
  83. 130
      regression-test/ps-studhilo-ring-showdown.txt
  84. 49
      regression-test/ps.14519394979.expected.txt
  85. 49
      regression-test/ps.14519420999.expected.txt
  86. 58
      regression-test/ps.14519433154.expected.txt
  87. 43
      regression-test/ps.15043388146.expected.txt
  88. 44
      regression-test/regression-test.sh

112
packaging/announce-0.22.txt

@ -0,0 +1,112 @@
Hello everyone,
The new fpdb release 0.22 is now available for download as source or as packages/installers for Debian, Gentoo, Ubuntu and Windows.
This version brings many improvements and bugfixes. A quick word on our version naming: We have decided to stop using the usual alpha/beta/rc release system as it doesn't suit fpdb's development style and resources. From now on all releases are created equal (ie. considered "testing"). If they proof themselves we declare them "stable" and make them the default download on sourceforge. If you wish to be notified of new releases or stabilisation please subscribe to the fpdb-announe mailing list (see Links further down). Since this version has been available for some time we consider it stable and recommend all users to update.
So... what is FPDB?
===================
FPDB (Free Poker Database) is a free/open source suite of steadily growing tools to track and analyse your online poker game. FPDB is able to import the hand histories that poker sites write to your computer and to store additional data from each hand in a database for use in later analysis.
FPDB is ambitious, intending to support all games. Currently we support flop based games (Hold’em, Omaha, Omaha Hi/Lo), stud games (7 Card Stud, 7 Card Stud Hi/Lo, and Razz) and draw games (Triple Draw Lowball, 5 Card Draw) on most major poker sites.
FPDB provides a Heads Up Display (HUD), Profit Grapher and Stats viewers with a list of features that is growing.
What's changed
==============
417 changesets (incl. merges) have gone in since 0.21-rc2. Some of the improvements are:
New stats:
Three bet: name="three_B" (note this stat was previously "three_B_0")
Four bet: name="four_B"
Cold four bet: name="cfour_B"
Squeeze bet preflop: name="squeeze"
Fold to three bet preflop: name="f_3bet"
Fold to four bet preflop: name="f_4bet"
Steal Success : name="s_steal"
Pokerstars Home Games now supported
Everest now supported
Winamax now supported
Translation progress:
Complete: English, Hungarian. If you notice an untranslated string in any output please let us know.
Partial: French (85%), German (32%), Polish (27%), Spanish (17%), Russian (6%).
Significant work on the underlying HUD code, including hud dragging and table closing
Problems where some stats became > 100% are now fixed
sqlite database performance improvements (sqlite is the default database for fpdb)
pokerstars.it tournament HUD now working
Cap games added to filter options
Initial work to support Rush poker - this will need further testing and improvement before we can release it. One or two testers would be welcome, please PM gimick if you want to help.
Various updates and fixes when importing Hand histories.
Party freeroll tournaments now recognised.
Stars 20/40 limit and FTP 1k/2k limit now recognised.
Initial work on a Stove function for holdem (see the viewers menu)
The windows exe has been upgraded from python 2.6 to python 2.7.
Where to get it
===============
Please note that you will have to either recreate your database or use a new one if you're updating from 0.21-rc2 or older. Fpdb will warn you if your database is incompatible and will not work unless you recreate or use a different one.
Config files from 0.20 and later should work. Please report if you have problems with config files from that version or later.
You can find checksums (MD5 and SHA512) in the download folder.
To download: http://sourceforge.net/projects/fpdb/files/fpdb/0.22/
Links
=====
To be notified by email of new versions you can subscribe to our announce mailing list here: https://lists.sourceforge.net/lists/listinfo/fpdb-announce
Link to fpdb website (wiki) http://fpdb.wiki.sourceforge.net/
Features page: http://sourceforge.net/apps/mediawiki/fpdb/index.php?title=Features
How to install&setup fpdb in 5 Minutes with the Windows installer: http://sf.net/projects/fpdb/files/fpdb/help/ Choose exe021install.avi (18mb, no sound)
Installation instructions are available from: http://sourceforge.net/apps/mediawiki/fpdb/index.php?title=Installation
Getting Started Instructions: http://sourceforge.net/apps/mediawiki/fpdb/index.php?title=Getting_Started
FAQ: http://sourceforge.net/apps/mediawiki/fpdb/index.php?title=FAQ
Screenshots: http://sourceforge.net/apps/mediawiki/fpdb/index.php?title=Screenshots
How to help
===========
Join us in IRC (see below) and say you want to do something :)
How to get help
===============
Please also see the "Bug reports" section below to enable us to help you.
These are listed in order of usefulness - the 2+2 thread in particular is rather chaotic so if we miss your post feel free to bring it up again
1) Chat/IRC
One of the developers is usually around, but it is IRC. Dont get discouraged because we didn't answer within 10 minutes, once we do you've probably got our full attention.
This link takes you to a website where you can talk to us directly: http://webchat.freenode.net/?channels=fpdb
Alternatively use can use any IRC client to connect to #fpdb on freenode.net
2) Mailing List
Visit http://lists.sourceforge.net/lists/listinfo/fpdb-main to subscribe to the development&support mailing list and send us an email
3) The monster 2+2 forum thread (registration required).
http://forumserver.twoplustwo.com/16...2009-a-273001/ Please dont let the size of the thread phase you. It is monitored and sends email notifications to some of the developers. (Note: If you play poker and don't frequent the 2+2 forums, you may want to become better acquainted. Its a bit daunting at first, but well worth the effort)
Bug reports
===========
When you do report issues, try to make it easier for us help you. We usually need at least the following information:
- Operating system and version (e.g. Ubuntu 10.10 or Windows XP)
- Database type (MySQL, SQLite, PostgreSQL)
- Install method (exe, tarball, deb, git, ebuild)
- Fpdb version
- Site name and gametype (e.g. $10 Pokerstars Razz SnG)
You can find most of these details for easy copy&paste in the Help menu under About.
Important known problems
========================
Hud will not work if using postgres database - fixed in 0.23
PKR is not working correctly
Special information for Windows installations
=============================================
First-time installs will need to download and install the C++ runtime executable from Microsoft.
Windows 7 and windows Vista users will need to set fpdb.exe and hud_main.exe to run as administrator (see http://sourceforge.net/apps/mediawiki/fpdb/index.php?title=Install_in_Windows)
Contributors
============
Code/translations: Worros, Donoban, Nutomatic, Steffen, Chaz Littlejohn, Scott Wolchok, tribumarchal, Erki Ferenc, Eric Blade, atinm, Mika Bostrom, Robert Wielinga, Chris Moore, Gerko de Roo, Gimick
Special shoutout to Eleatic Stranger who has written an initial converter for Carbon poker, without ever having played on the site!
Documentation: RSOAndrew, Buggernaut, ChazDazzle
Testers and everyone answering forum questions - xaviax, Dog, uncooper etc. You know who you are.
Hand History donations: Quite a few people on this list now. Every donation for alternate sites and various corner cases is appreciated.
And a particular thanks to all the libraries, interpreters etc. that we use to create fpdb!

78
packaging/announce-template.txt

@ -0,0 +1,78 @@
Replace all occurrences of XXX with the real values.
Remove or leave YYY(foobar)YYY sections as appropriate.
Hello everyone,
The new fpdb release XXX is now available for download as source or as packages/installers for Debian, Gentoo, Ubuntu and Windows.
This version brings many improvements and bugfixes. A quick word on our version naming: We have decided to stop using the usual alpha/beta/rc release system as it doesn't suit fpdb's development style and resources. From now on all releases are created equal (ie. considered "testing"). If they proof themselves we declare them "stable" and make them the default download on sourceforge. If you wish to be notified of new releases or stabilisation please subscribe to the fpdb-announe mailing list (see Links further down).
So... what is FPDB?
===================
FPDB (Free Poker Database) is a free/open source suite of steadily growing tools to track and analyse your online poker game. FPDB is able to import the hand histories that poker sites write to your computer and to store additional data from each hand in a database for use in later analysis.
FPDB is ambitious, intending to support all games. Currently we support flop based games (Hold’em, Omaha, Omaha Hi/Lo), stud games (7 Card Stud, 7 Card Stud Hi/Lo, and Razz) and draw games (Triple Draw Lowball, 5 Card Draw) on most major poker sites.
FPDB provides a Heads Up Display (HUD), Profit Grapher and Stats viewers with a list of features that is growing.
What's changed
==============
XXX changesets (incl. merges) have gone in since XXX. Some of the improvements are:
XXX
Where to get it
===============
Please note that you will have to either recreate your database or use a new one if you're updating from XXX or older. Fpdb will warn you if your database is incompatible and will not work unless you recreate or use a different one.
Config files from 0.20 and later should work. Please report if you have problems with config files from that version or later.
You can find checksums (MD5 and SHA512) in the download folder.
To download: http://sourceforge.net/projects/fpdb/files/fpdb/XXX/
Links
=====
To be notified by email of new versions you can subscribe to our announce mailing list here: https://lists.sourceforge.net/lists/listinfo/fpdb-announce
Link to fpdb website (wiki) http://fpdb.wiki.sourceforge.net/
Features page: http://sourceforge.net/apps/mediawiki/fpdb/index.php?title=Features
How to install&setup fpdb in 5 Minutes with the Windows installer: http://sf.net/projects/fpdb/files/fpdb/help/ Choose exe021install.avi (18mb, no sound)
Installation instructions are available from: http://sourceforge.net/apps/mediawiki/fpdb/index.php?title=Installation
Getting Started Instructions: http://sourceforge.net/apps/mediawiki/fpdb/index.php?title=Getting_Started
FAQ: http://sourceforge.net/apps/mediawiki/fpdb/index.php?title=FAQ
Screenshots: http://sourceforge.net/apps/mediawiki/fpdb/index.php?title=Screenshots
How to help
===========
Join us in IRC (see below) and say you want to do something :)
How to get help
===============
Please also see the "Bug reports" section below to enable us to help you.
These are listed in order of usefulness - the 2+2 thread in particular is rather chaotic so if we miss your post feel free to bring it up again
1) Chat/IRC
One of the developers is usually around, but it is IRC. Dont get discouraged because we didn't answer within 10 minutes, once we do you've probably got our full attention.
This link takes you to a website where you can talk to us directly: http://webchat.freenode.net/?channels=fpdb
Alternatively use can use any IRC client to connect to #fpdb on freenode.net
2) Mailing List
Visit http://lists.sourceforge.net/lists/listinfo/fpdb-main to subscribe to the development&support mailing list and send us an email
3) The monster 2+2 forum thread (registration required).
http://forumserver.twoplustwo.com/16...2009-a-273001/ Please dont let the size of the thread phase you. It is monitored and sends email notifications to some of the developers. (Note: If you play poker and don't frequent the 2+2 forums, you may want to become better acquainted. Its a bit daunting at first, but well worth the effort)
Bug reports
===========
When you do report issues, try to make it easier for us help you. We usually need at least the following information:
- Operating system and version (e.g. Ubuntu 10.10 or Windows XP)
- Database type (MySQL, SQLite, PostgreSQL)
- Install method (exe, tarball, deb, git, ebuild)
- Fpdb version
- Site name and gametype (e.g. $10 Pokerstars Razz SnG)
You can find most of these details for easy copy&paste in the Help menu under About.
Important known problems
========================
YYY(PKR is not working correctly)YYY
Special information for Windows installations
=============================================
YYY(First-time installs may need to download and install the C++ runtime executable from Microsoft.)YYY
YYY(Windows 7 and windows Vista users will need to set fpdb.exe and hud_main.exe to run as administrator (see http://sourceforge.net/apps/mediawiki/fpdb/index.php?title=Install_in_Windows))YYY
Contributors
============
For the latest list of contributors please see YYY(replace with link to git-web of contributors.txt)YYY

12
packaging/debian/changelog vendored

@ -1,3 +1,15 @@
free-poker-tools (0.22-1) unstable; urgency=low
* New release: 0.22
-- Mika Bostrom <bostik@iki.fi> Sun, 13 Mar 2011 05:15:24 +0200
free-poker-tools (0.21-1) unstable; urgency=low
* New release: 0.21
-- Mika Bostrom <bostik@iki.fi> Mon, 28 Feb 2011 04:09:57 +0200
free-poker-tools (0.21~rc2) unstable; urgency=low
* Second 0.21 release-candidate

42
packaging/gentoo/current_testing.ebuild → packaging/gentoo/current.ebuild

@ -10,14 +10,14 @@ inherit eutils games
DESCRIPTION="A free/open source tracker/HUD for use with online poker"
HOMEPAGE="http://fpdb.wiki.sourceforge.net/"
SRC_URI="mirror://sourceforge/${PN}/Snapshots/${P}.tar.bz2"
SRC_URI="mirror://sourceforge/${PN}/${PV}/${P}.tar.bz2"
LICENSE="AGPL-3"
SLOT="0"
KEYWORDS="~amd64 ~x86"
#note: this should work on other architectures too, please send me your experiences
#note: fpdb has only been tested on x86 and amd64, but should work on other arches, too
IUSE="graph mysql postgres sqlite linguas_de linguas_hu linguas_fr"
IUSE="graph mysql postgres sqlite linguas_de linguas_es linguas_fr linguas_hu linguas_it linguas_pl linguas_pt linguas_ru linguas_zh"
RDEPEND="
mysql? ( virtual/mysql
dev-python/mysql-python )
@ -39,8 +39,40 @@ src_install() {
doins -r gfx || die "failed to install gfx directory"
doins -r pyfpdb || die "failed to install pyfpdb directory"
if use linguas_de; then
msgfmt pyfpdb/locale/fpdb-de_DE.po -o pyfpdb/locale/de.mo || die "failed to create German mo file"
fi
if use linguas_es; then
msgfmt pyfpdb/locale/fpdb-es_ES.po -o pyfpdb/locale/es.mo || die "failed to create Spanish mo file"
fi
if use linguas_fr; then
msgfmt pyfpdb/locale/fpdb-fr_FR.po -o pyfpdb/locale/fr.mo || die "failed to create French mo file"
fi
if use linguas_hu; then
msgfmt pyfpdb/locale/fpdb-hu_HU.po -o pyfpdb/locale/hu.mo || die "failed to create hungarian mo file"
msgfmt pyfpdb/locale/fpdb-hu_HU.po -o pyfpdb/locale/hu.mo || die "failed to create Hungarian mo file"
fi
if use linguas_it; then
msgfmt pyfpdb/locale/fpdb-it_IT.po -o pyfpdb/locale/it.mo || die "failed to create Italian mo file"
fi
if use linguas_pl; then
msgfmt pyfpdb/locale/fpdb-pl_PL.po -o pyfpdb/locale/pl.mo || die "failed to create Polish mo file"
fi
if use linguas_pt; then
msgfmt pyfpdb/locale/fpdb-pt_BR.po -o pyfpdb/locale/pt.mo || die "failed to create Portuguese mo file"
fi
if use linguas_ru; then
msgfmt pyfpdb/locale/fpdb-ru_RU.po -o pyfpdb/locale/ru.mo || die "failed to create Russian mo file"
fi
if use linguas_zh; then
msgfmt pyfpdb/locale/fpdb-zh_CN.po -o pyfpdb/locale/zh.mo || die "failed to create Chinese mo file"
fi
domo pyfpdb/locale/*.mo || die "failed to install mo files"
@ -51,7 +83,7 @@ src_install() {
doexe run_fpdb.py || die "failed to install executable run_fpdb.py"
dodir "${GAMES_BINDIR}"
dosym "${GAMES_DATADIR}"/${PN}/run_fpdb.py "${GAMES_BINDIR}"/${PN} || die "failed to create symlink for starting fpdb"
dosym "${GAMES_DATADIR}"/${PN}/run_fpdb.py "${GAMES_BINDIR}"/${PN} || die "failed to create symlink for starting fpdb"
newicon gfx/fpdb-icon.png ${PN}.png || die "failed to install fpdb icon"
make_desktop_entry ${PN} || die "failed to create desktop entry"

60
packaging/gentoo/current_stable.ebuild

@ -1,60 +0,0 @@
# Copyright 1999-2011 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $
#TODO: Header, add cdecimal
EAPI="2"
inherit eutils games
DESCRIPTION="A free/open source tracker/HUD for use with online poker"
HOMEPAGE="http://fpdb.wiki.sourceforge.net/"
SRC_URI="mirror://sourceforge/${PN}/${PV}/${P}.tar.bz2"
LICENSE="AGPL-3"
SLOT="0"
KEYWORDS="~amd64 ~x86"
#note: this should work on other architectures too, please send me your experiences
IUSE="graph mysql postgres sqlite"
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"
DEPEND="${RDEPEND}"
src_install() {
insinto "${GAMES_DATADIR}"/${PN}
doins -r gfx
doins -r pyfpdb
doins readme.txt
exeinto "${GAMES_DATADIR}"/${PN}
doexe run_fpdb.py
dodir "${GAMES_BINDIR}"
dosym "${GAMES_DATADIR}"/${PN}/run_fpdb.py "${GAMES_BINDIR}"/${PN}
newicon gfx/fpdb-icon.png ${PN}.png
make_desktop_entry ${PN}
fperms +x "${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."
}

53
packaging/gentoo/fpdb-9999.ebuild

@ -15,8 +15,9 @@ EGIT_REPO_URI="git://git.assembla.com/fpdb.git"
LICENSE="AGPL-3"
SLOT="0"
KEYWORDS=""
#note: fpdb has only been tested on x86 and amd64, but should work on other arches, too
IUSE="graph mysql postgres sqlite linguas_de linguas_hu linguas_fr"
IUSE="graph mysql postgres sqlite linguas_de linguas_es linguas_fr linguas_hu linguas_it linguas_pl linguas_pt linguas_ru linguas_zh"
RDEPEND="
mysql? ( virtual/mysql
dev-python/mysql-python )
@ -29,7 +30,7 @@ RDEPEND="
graph? ( dev-python/numpy
dev-python/matplotlib[gtk] )
dev-python/python-xlib
dev-python/pytz"
x11-apps/xwininfo"
DEPEND="${RDEPEND}"
src_unpack() {
@ -38,29 +39,57 @@ src_unpack() {
src_install() {
insinto "${GAMES_DATADIR}"/${PN}
doins -r gfx
doins -r pyfpdb
doins -r gfx || die "failed to install gfx directory"
doins -r pyfpdb || die "failed to install pyfpdb directory"
if use linguas_de; then
msgfmt pyfpdb/locale/fpdb-de_DE.po -o pyfpdb/locale/de.mo
msgfmt pyfpdb/locale/fpdb-de_DE.po -o pyfpdb/locale/de.mo || die "failed to create German mo file"
fi
if use linguas_es; then
msgfmt pyfpdb/locale/fpdb-es_ES.po -o pyfpdb/locale/es.mo || die "failed to create Spanish mo file"
fi
if use linguas_fr; then
msgfmt pyfpdb/locale/fpdb-fr_FR.po -o pyfpdb/locale/fr.mo || die "failed to create French mo file"
fi
if use linguas_hu; then
msgfmt pyfpdb/locale/fpdb-hu_HU.po -o pyfpdb/locale/hu.mo
msgfmt pyfpdb/locale/fpdb-hu_HU.po -o pyfpdb/locale/hu.mo || die "failed to create Hungarian mo file"
fi
if use linguas_it; then
msgfmt pyfpdb/locale/fpdb-it_IT.po -o pyfpdb/locale/it.mo || die "failed to create Italian mo file"
fi
if use linguas_pl; then
msgfmt pyfpdb/locale/fpdb-pl_PL.po -o pyfpdb/locale/pl.mo || die "failed to create Polish mo file"
fi
if use linguas_pt; then
msgfmt pyfpdb/locale/fpdb-pt_BR.po -o pyfpdb/locale/pt.mo || die "failed to create Portuguese mo file"
fi
if use linguas_ru; then
msgfmt pyfpdb/locale/fpdb-ru_RU.po -o pyfpdb/locale/ru.mo || die "failed to create Russian mo file"
fi
if use linguas_zh; then
msgfmt pyfpdb/locale/fpdb-zh_CN.po -o pyfpdb/locale/zh.mo || die "failed to create Chinese mo file"
fi
domo pyfpdb/locale/*.mo
domo pyfpdb/locale/*.mo || die "failed to install mo files"
doins readme.txt
doins readme.txt || die "failed to install readme.txt file"
exeinto "${GAMES_DATADIR}"/${PN}
doexe run_fpdb.py
doexe run_fpdb.py || die "failed to install executable run_fpdb.py"
dodir "${GAMES_BINDIR}"
dosym "${GAMES_DATADIR}"/${PN}/run_fpdb.py "${GAMES_BINDIR}"/${PN}
dosym "${GAMES_DATADIR}"/${PN}/run_fpdb.py "${GAMES_BINDIR}"/${PN} || die "failed to create symlink for starting fpdb"
newicon gfx/fpdb-icon.png ${PN}.png
make_desktop_entry ${PN}
newicon gfx/fpdb-icon.png ${PN}.png || die "failed to install fpdb icon"
make_desktop_entry ${PN} || die "failed to create desktop entry"
fperms +x "${GAMES_DATADIR}"/${PN}/pyfpdb/*.pyw
prepgamesdirs

4
pyfpdb/AbsoluteToFpdb.py

@ -138,7 +138,7 @@ class Absolute(HandHistoryConverter):
if not m:
tmp = handText[0:100]
log.error(_("Unable to recognise gametype from: '%s'") % tmp)
log.error(_("determineGameType: Raising FpdbParseError"))
log.error("determineGameType: " + _("Raising FpdbParseError"))
raise FpdbParseError(_("Unable to recognise gametype from: '%s'") % tmp)
@ -349,7 +349,7 @@ class Absolute(HandHistoryConverter):
bet = action.group('BET').replace(',', '')
hand.addComplete( street, action.group('PNAME'), bet)
else:
logging.debug(_("Unimplemented readAction: '%s' '%s'") % (action.group('PNAME'),action.group('ATYPE')))
logging.debug(_("Unimplemented readAction: '%s' '%s'") % (action.group('PNAME'), action.group('ATYPE')))
def readShowdownActions(self, hand):

134
pyfpdb/AlchemyFacilities.py

@ -1,134 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Copyright 2009-2011 Grigorij Indigirkin
#This program is free software: you can redistribute it and/or modify
#it under the terms of the GNU Affero General Public License as published by
#the Free Software Foundation, version 3 of the License.
#
#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 Affero General Public License
#along with this program. If not, see <http://www.gnu.org/licenses/>.
#In the "official" distribution you can find the license in agpl-3.0.txt.
#TODO: gettextify if file is used again
from decimal_wrapper import Decimal
from sqlalchemy import types
from sqlalchemy.orm.exc import NoResultFound
from sqlalchemy.exc import IntegrityError
import Card
class CardColumn(types.TypeDecorator):
"""Stores cards as smallints
Automatically converts values like '9h' to smallint
>>> CardColumn().process_bind_param( 'Td', '' )
22
>>> CardColumn().process_bind_param( u'Td', '' )
22
>>> CardColumn().process_bind_param( 22, '' )
22
>>> CardColumn().process_result_value( 22, '' )
'Td'
"""
impl = types.SmallInteger
def process_bind_param(self, value, dialect):
if value is None or isinstance(value, int):
return value
elif isinstance(value, basestring) and len(value) == 2:
return Card.encodeCard(str(value))
else:
raise Exception, "Incorrect card value: " + repr(value)
def process_result_value(self, value, dialect):
return Card.valueSuitFromCard( value )
class MoneyColumn(types.TypeDecorator):
"""Stores money: bets, pots, etc
Understands:
Decimal as real amount
int as amount mupliplied by 100
string as decimal
Returns Decimal
>>> MoneyColumn().process_bind_param( 230, '' )
230
>>> MoneyColumn().process_bind_param( Decimal('2.30'), '' )
230
>>> MoneyColumn().process_bind_param( '2.30', '' )
230
>>> MoneyColumn().process_result_value( 230, '' )
Decimal('2.3')
"""
impl = types.Integer
def process_bind_param(self, value, dialect):
if value is None or isinstance(value, int):
return value
elif isinstance(value, basestring) or isinstance(value, Decimal):
return int(Decimal(value)*100)
else:
raise Exception, "Incorrect amount:" + repr(value)
def process_result_value(self, value, dialect):
if value is None:
return None
return Decimal(value)/100
class BigIntColumn(types.TypeDecorator, types.Integer):
"""Representing db-independent big integer """
# Integer inheritance required for auto_increment flag
impl = types.Integer
def load_dialect_impl(self, dialect):
from sqlalchemy import databases
if dialect.name == 'mysql':
return databases.mysql.MSBigInteger()
elif dialect.name == 'postgres':
return databases.mysql.PGBigInteger()
return types.Integer()
class MappedBase(object):
"""Provide dummy contrcutor"""
def __init__(self, **kwargs):
for k, v in kwargs.iteritems():
setattr(self, k, v)
def get_columns_names(self):
return [i.name for i in self._sa_class_manager.mapper.c]
def get_or_create(klass, session, **kwargs):
"""
Looks up an object with the given kwargs, creating one if necessary.
Returns a tuple of (object, created), where created is a boolean
specifying whether an object was created.
"""
assert kwargs, \
'get_or_create() must be passed at least one keyword argument'
try:
return session.query(klass).filter_by(**kwargs).one(), False
except NoResultFound:
try:
obj = klass(**kwargs)
session.add(obj)
session.flush()
return obj, True
except IntegrityError:
return session.query(klass).filter_by(**kwargs).one(), False

485
pyfpdb/AlchemyMappings.py

@ -1,485 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Copyright 2009-2011 Grigorij Indigirkin
#This program is free software: you can redistribute it and/or modify
#it under the terms of the GNU Affero General Public License as published by
#the Free Software Foundation, version 3 of the License.
#
#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 Affero General Public License
#along with this program. If not, see <http://www.gnu.org/licenses/>.
#In the "official" distribution you can find the license in agpl-3.0.txt.
"""@package AlchemyMappings
This package contains all classes to be mapped and mappers themselves
"""
#TODO: gettextify if file is used again
import logging
import re
from decimal_wrapper import Decimal
from sqlalchemy.orm import mapper, relation, reconstructor
from sqlalchemy.sql import select
from collections import defaultdict
from AlchemyTables import *
from AlchemyFacilities import get_or_create, MappedBase
from DerivedStats import DerivedStats
from Exceptions import IncompleteHandError, FpdbError
class Player(MappedBase):
"""Class reflecting Players db table"""
@staticmethod
def get_or_create(session, siteId, name):
return get_or_create(Player, session, siteId=siteId, name=name)[0]
def __str__(self):
return '<Player "%s" on %s>' % (self.name, self.site and self.site.name)
class Gametype(MappedBase):
"""Class reflecting Gametypes db table"""
@staticmethod
def get_or_create(session, siteId, gametype):
map = zip(
['type', 'base', 'category', 'limitType', 'smallBlind', 'bigBlind', 'smallBet', 'bigBet', 'currency'],
['type', 'base', 'category', 'limitType', 'sb', 'bb', 'dummy', 'dummy', 'currency'])
gametype = dict([(new, gametype.get(old)) for new, old in map ])
hilo = "h"
if gametype['category'] in ('studhilo', 'omahahilo'):
hilo = "s"
elif gametype['category'] in ('razz','27_3draw','badugi'):
hilo = "l"
gametype['hiLo'] = hilo
for f in ['smallBlind', 'bigBlind', 'smallBet', 'bigBet']:
if gametype[f] is None:
gametype[f] = 0
gametype[f] = int(Decimal(gametype[f])*100)
gametype['siteId'] = siteId
return get_or_create(Gametype, session, **gametype)[0]
class HandActions(object):
"""Class reflecting HandsActions db table"""
def initFromImportedHand(self, hand, actions):
self.hand = hand
self.actions = {}
for street, street_actions in actions.iteritems():
self.actions[street] = []
for v in street_actions:
hp = hand.handplayers_by_name[v[0]]
self.actions[street].append({'street': street, 'pid': hp.id, 'seat': hp.seatNo, 'action':v})
@property
def flat_actions(self):
actions = []
for street in self.hand.allStreets:
actions += self.actions[street]
return actions
class HandInternal(DerivedStats):
"""Class reflecting Hands db table"""
def parseImportedHandStep1(self, hand):
"""Extracts values to insert into from hand returned by HHC. No db is needed he"""
hand.players = hand.getAlivePlayers()
# also save some data for step2. Those fields aren't in Hands table
self.siteId = hand.siteId
self.gametype_dict = hand.gametype
self.attachHandPlayers(hand)
self.attachActions(hand)
self.assembleHands(hand)
self.assembleHandsPlayers(hand)
def parseImportedHandStep2(self, session):
"""Fetching ids for gametypes and players"""
gametype = Gametype.get_or_create(session, self.siteId, self.gametype_dict)
self.gametypeId = gametype.id
for hp in self.handPlayers:
hp.playerId = Player.get_or_create(session, self.siteId, hp.name).id
def getPlayerByName(self, name):
if not hasattr(self, 'handplayers_by_name'):
self.handplayers_by_name = {}
for hp in self.handPlayers:
pname = getattr(hp, 'name', None) or hp.player.name
self.handplayers_by_name[pname] = hp
return self.handplayers_by_name[name]
def attachHandPlayers(self, hand):
"""Fill HandInternal.handPlayers list. Create self.handplayers_by_name"""
hand.noSb = getattr(hand, 'noSb', None)
if hand.noSb is None and self.gametype_dict['base']=='hold':
saw_sb = False
for action in hand.actions[hand.actionStreets[0]]: # blindsantes
if action[1] == 'posts' and action[2] == 'small blind' and action[0] is not None:
saw_sb = True
hand.noSb = saw_sb
self.handplayers_by_name = {}
for seat, name, chips in hand.players:
p = HandPlayer(hand = self, imported_hand=hand, seatNo=seat,
name=name, startCash=chips)
self.handplayers_by_name[name] = p
def attachActions(self, hand):
"""Create HandActions object"""
a = HandActions()
a.initFromImportedHand(self, hand.actions)
def parseImportedTournament(self, hand, session):
"""Fetching tourney, its type and players
Must be called after Step2
"""
if self.gametype_dict['type'] != 'tour': return
# check for consistense
for i in ('buyin', 'tourNo'):
if not hasattr(hand, i):
raise IncompleteHandError(
"Field '%s' required for tournaments" % i, self.id, hand )
# repair old-style buyin value
m = re.match('\$(\d+)\+\$(\d+)', hand.buyin)
if m is not None:
hand.buyin, self.fee = m.groups()
# fetch tourney type
tour_type_hand2db = {
'buyin': 'buyin',
'fee': 'fee',
'speed': 'speed',
'maxSeats': 'maxseats',
'knockout': 'isKO',
'rebuy': 'isRebuy',
'addOn': 'isAddOn',
'shootout': 'isShootout',
'matrix': 'isMatrix',
'sng': 'isSNG',
}
tour_type_index = dict([
( i_db, getattr(hand, i_hand, None) )
for i_db, i_hand in tour_type_hand2db.iteritems()
])
tour_type_index['siteId'] = self.siteId
tour_type = TourneyType.get_or_create(session, **tour_type_index)
# fetch and update tourney
tour = Tourney.get_or_create(session, hand.tourNo, tour_type.id)
cols = tour.get_columns_names()
for col in cols:
hand_val = getattr(hand, col, None)
if col in ('id', 'tourneyTypeId', 'comment', 'commentTs') or hand_val is None:
continue
db_val = getattr(tour, col, None)
if db_val is None:
setattr(tour, col, hand_val)
elif col == 'koBounty':
setattr(tour, col, max(db_val, hand_val))
elif col == 'tourStartTime' and hand.startTime:
setattr(tour, col, min(db_val, hand.startTime))
if tour.entries is None and tour_type.sng:
tour.entries = tour_type.maxSeats
# fetch and update tourney players
for hp in self.handPlayers:
tp = TourneysPlayer.get_or_create(session, tour.id, hp.playerId)
# FIXME: other TourneysPlayers should be added here
session.flush()
def isDuplicate(self, session):
"""Checks if current hand already exists in db
siteHandNo ans gametypeId have to be setted
"""
return session.query(HandInternal).filter_by(
siteHandNo=self.siteHandNo, gametypeId=self.gametypeId).count()!=0
def __str__(self):
s = list()
for i in self._sa_class_manager.mapper.c:
s.append('%25s %s' % (i, getattr(self, i.name)))
s+=['', '']
for i,p in enumerate(self.handPlayers):
s.append('%d. %s' % (i, p.name or '???'))
s.append(str(p))
return '\n'.join(s)
@property
def boardcards(self):
cards = []
for i in range(5):
cards.append(getattr(self, 'boardcard%d' % (i+1), None))
return filter(bool, cards)
@property
def HandClass(self):
"""Return HoldemOmahaHand or something like this"""
import Hand
if self.gametype.base == 'hold':
return Hand.HoldemOmahaHand
elif self.gametype.base == 'draw':
return Hand.DrawHand
elif self.gametype.base == 'stud':
return Hand.StudHand
raise Exception("Unknow gametype.base: '%s'" % self.gametype.base)
@property
def allStreets(self):
return self.HandClass.allStreets
@property
def actionStreets(self):
return self.HandClass.actionStreets
class HandPlayer(MappedBase):
"""Class reflecting HandsPlayers db table"""
def __init__(self, **kwargs):
if 'imported_hand' in kwargs and 'seatNo' in kwargs:
imported_hand = kwargs.pop('imported_hand')
self.position = self.getPosition(imported_hand, kwargs['seatNo'])
super(HandPlayer, self).__init__(**kwargs)
@reconstructor
def init_on_load(self):
self.name = self.player.name
@staticmethod
def getPosition(hand, seat):
"""Returns position value like 'B', 'S', '0', '1', ...
>>> class A(object): pass
...
>>> A.noSb = False
>>> A.maxseats = 6
>>> A.buttonpos = 2
>>> A.gametype = {'base': 'hold'}
>>> A.players = [(i, None, None) for i in (2, 4, 5, 6)]
>>> HandPlayer.getPosition(A, 6) # cut off
'1'
>>> HandPlayer.getPosition(A, 2) # button
'0'
>>> HandPlayer.getPosition(A, 4) # SB
'S'
>>> HandPlayer.getPosition(A, 5) # BB
'B'
>>> A.noSb = True
>>> HandPlayer.getPosition(A, 5) # MP3
'2'
>>> HandPlayer.getPosition(A, 6) # cut off
'1'
>>> HandPlayer.getPosition(A, 2) # button
'0'
>>> HandPlayer.getPosition(A, 4) # BB
'B'
"""
from itertools import chain
if hand.gametype['base'] == 'stud':
# FIXME: i've never played stud so plz check & del comment \\grindi
bringin = None
for action in chain(*[self.actions[street] for street in hand.allStreets]):
if action[1]=='bringin':
bringin = action[0]
break
if bringin is None:
raise Exception, "Cannot find bringin"
# name -> seat
bringin = int(filter(lambda p: p[1]==bringin, bringin)[0])
seat = (int(seat) - int(bringin))%int(hand.maxseats)
return str(seat)
else:
seats_occupied = sorted([seat_ for seat_, name, chips in hand.players], key=int)
if hand.buttonpos not in seats_occupied:
# i.e. something like
# Seat 3: PlayerX ($0), is sitting out
# The button is in seat #3
hand.buttonpos = max(seats_occupied,
key = lambda s: int(s)
if int(s) <= int(hand.buttonpos)
else int(s) - int(hand.maxseats)
)
seats_occupied = sorted(seats_occupied,
key = lambda seat_: (
- seats_occupied.index(seat_)
+ seats_occupied.index(hand.buttonpos)
+ 2) % len(seats_occupied)
)
# now (if SB presents) seats_occupied contains seats in order: BB, SB, BU, CO, MP3, ...
if hand.noSb:
# fix order in the case nosb
seats_occupied = seats_occupied[1:] + seats_occupied[0:1]
seats_occupied.insert(1, -1)
seat = seats_occupied.index(seat)
if seat == 0:
return 'B'
elif seat == 1:
return 'S'
else:
return str(seat-2)
@property
def cards(self):
cards = []
for i in range(7):
cards.append(getattr(self, 'card%d' % (i+1), None))
return filter(bool, cards)
def __str__(self):
s = list()
for i in self._sa_class_manager.mapper.c:
s.append('%45s %s' % (i, getattr(self, i.name)))
return '\n'.join(s)
class Site(object):
"""Class reflecting Players db table"""
INITIAL_DATA = [
(1 , 'Full Tilt Poker','FT'),
(2 , 'PokerStars', 'PS'),
(3 , 'Everleaf', 'EV'),
(4 , 'Win2day', 'W2'),
(5 , 'OnGame', 'OG'),
(6 , 'UltimateBet', 'UB'),
(7 , 'Betfair', 'BF'),
(8 , 'Absolute', 'AB'),
(9 , 'PartyPoker', 'PP'),
(10, 'Partouche', 'PA'),
(11, 'Carbon', 'CA'),
(12, 'PKR', 'PK'),
(13, 'PacificPoker', 'P8'),
]
INITIAL_DATA_KEYS = ('id', 'name', 'code')
INITIAL_DATA_DICTS = [ dict(zip(INITIAL_DATA_KEYS, datum)) for datum in INITIAL_DATA ]
@classmethod
def insert_initial(cls, connection):
connection.execute(sites_table.insert(), cls.INITIAL_DATA_DICTS)
class Tourney(MappedBase):
"""Class reflecting Tourneys db table"""
@classmethod
def get_or_create(cls, session, siteTourneyNo, tourneyTypeId):
"""Fetch tourney by index or creates one if none. """
return get_or_create(cls, session, siteTourneyNo=siteTourneyNo,
tourneyTypeId=tourneyTypeId)[0]
class TourneyType(MappedBase):
"""Class reflecting TourneyType db table"""
@classmethod
def get_or_create(cls, session, **kwargs):
"""Fetch tourney type by index or creates one if none
Required kwargs:
buyin fee speed maxSeats knockout
rebuy addOn shootout matrix sng currency
"""
return get_or_create(cls, session, **kwargs)[0]
class TourneysPlayer(MappedBase):
"""Class reflecting TourneysPlayers db table"""
@classmethod
def get_or_create(cls, session, tourneyId, playerId):
"""Fetch tourney player by index or creates one if none """
return get_or_create(cls, session, tourneyId=tourneyId, playerId=playerId)
class Version(object):
"""Provides read/write access for version var"""
CURRENT_VERSION = 120 # db version for current release
# 119 - first alchemy version
# 120 - add m_factor
conn = None
ver = None
def __init__(self, connection=None):
if self.__class__.conn is None:
self.__class__.conn = connection
@classmethod
def is_wrong(cls):
return cls.get() != cls.CURRENT_VERSION
@classmethod
def get(cls):
if cls.ver is None:
try:
cls.ver = cls.conn.execute(select(['version'], settings_table)).fetchone()[0]
except:
return None
return cls.ver
@classmethod
def set(cls, value):
if cls.conn.execute(settings_table.select()).rowcount==0:
cls.conn.execute(settings_table.insert(), version=value)
else:
cls.conn.execute(settings_table.update().values(version=value))
cls.ver = value
@classmethod
def set_initial(cls):
cls.set(cls.CURRENT_VERSION)
mapper (Gametype, gametypes_table, properties={
'hands': relation(HandInternal, backref='gametype'),
})
mapper (Player, players_table, properties={
'playerHands': relation(HandPlayer, backref='player'),
'playerTourney': relation(TourneysPlayer, backref='player'),
})
mapper (Site, sites_table, properties={
'gametypes': relation(Gametype, backref = 'site'),
'players': relation(Player, backref = 'site'),
'tourneyTypes': relation(TourneyType, backref = 'site'),
})
mapper (HandActions, hands_actions_table, properties={})
mapper (HandInternal, hands_table, properties={
'handPlayers': relation(HandPlayer, backref='hand'),
'actions_all': relation(HandActions, backref='hand', uselist=False),
})
mapper (HandPlayer, hands_players_table, properties={})
mapper (Tourney, tourneys_table)
mapper (TourneyType, tourney_types_table, properties={
'tourneys': relation(Tourney, backref='type'),
})
mapper (TourneysPlayer, tourneys_players_table)
class LambdaKeyDict(defaultdict):
"""Operates like defaultdict but passes key argument to the factory function"""
def __missing__(key):
return self.default_factory(key)

460
pyfpdb/AlchemyTables.py

@ -1,460 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Copyright 2009-2011 Grigorij Indigirkin
#This program is free software: you can redistribute it and/or modify
#it under the terms of the GNU Affero General Public License as published by
#the Free Software Foundation, version 3 of the License.
#
#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 Affero General Public License
#along with this program. If not, see <http://www.gnu.org/licenses/>.
#In the "official" distribution you can find the license in agpl-3.0.txt.
"""@package AlchemyTables
Contains all sqlalchemy tables
"""
#TODO: gettextify if file is used again
from sqlalchemy import Table, Float, Column, Integer, String, MetaData, \
ForeignKey, Boolean, SmallInteger, DateTime, Text, Index, CHAR, \
PickleType, Unicode
from AlchemyFacilities import CardColumn, MoneyColumn, BigIntColumn
metadata = MetaData()
autorates_table = Table('Autorates', metadata,
Column('id', Integer, primary_key=True, nullable=False),
Column('playerId', Integer, ForeignKey("Players.id"), nullable=False),
Column('gametypeId', SmallInteger, ForeignKey("Gametypes.id"), nullable=False),
Column('description', String(50), nullable=False),
Column('shortDesc', CHAR(8), nullable=False),
Column('ratingTime', DateTime, nullable=False),
Column('handCount', Integer, nullable=False),
mysql_charset='utf8',
mysql_engine='InnoDB',
)
gametypes_table = Table('Gametypes', metadata,
Column('id', SmallInteger, primary_key=True),
Column('siteId', SmallInteger, ForeignKey("Sites.id"), nullable=False), # SMALLINT
Column('currency', String(4), nullable=False), # varchar(4) NOT NULL
Column('type', String(4), nullable=False), # char(4) NOT NULL
Column('base', String(4), nullable=False), # char(4) NOT NULL
Column('category', String(9), nullable=False), # varchar(9) NOT NULL
Column('limitType', CHAR(2), nullable=False), # char(2) NOT NULL
Column('hiLo', CHAR(1), nullable=False), # char(1) NOT NULL
Column('smallBlind', Integer(3)), # int
Column('bigBlind', Integer(3)), # int
Column('smallBet', Integer(3), nullable=False), # int NOT NULL
Column('bigBet', Integer(3), nullable=False), # int NOT NULL
mysql_charset='utf8',
mysql_engine='InnoDB',
)
hands_table = Table('Hands', metadata,
Column('id', BigIntColumn, primary_key=True),
Column('tableName', String(30), nullable=False),
Column('siteHandNo', BigIntColumn, nullable=False),
Column('gametypeId', SmallInteger, ForeignKey('Gametypes.id'), nullable=False),
Column('startTime', DateTime, nullable=False),
Column('importTime', DateTime, nullable=False),
Column('seats', SmallInteger, nullable=False),
Column('maxSeats', SmallInteger, nullable=False),
Column('boardcard1', CardColumn),
Column('boardcard2', CardColumn),
Column('boardcard3', CardColumn),
Column('boardcard4', CardColumn),
Column('boardcard5', CardColumn),
Column('texture', SmallInteger),
Column('playersVpi', SmallInteger, nullable=False),
Column('playersAtStreet1', SmallInteger, nullable=False, default=0),
Column('playersAtStreet2', SmallInteger, nullable=False, default=0),
Column('playersAtStreet3', SmallInteger, nullable=False, default=0),
Column('playersAtStreet4', SmallInteger, nullable=False, default=0),
Column('playersAtShowdown',SmallInteger, nullable=False),
Column('street0Raises', SmallInteger, nullable=False),
Column('street1Raises', SmallInteger, nullable=False),
Column('street2Raises', SmallInteger, nullable=False),
Column('street3Raises', SmallInteger, nullable=False),
Column('street4Raises', SmallInteger, nullable=False),
Column('street1Pot', MoneyColumn),
Column('street2Pot', MoneyColumn),
Column('street3Pot', MoneyColumn),
Column('street4Pot', MoneyColumn),
Column('showdownPot', MoneyColumn),
Column('comment', Text),
Column('commentTs', DateTime),
mysql_charset='utf8',
mysql_engine='InnoDB',
)
Index('siteHandNo', hands_table.c.siteHandNo, hands_table.c.gametypeId, unique=True)
hands_actions_table = Table('HandsActions', metadata,
Column('id', BigIntColumn, primary_key=True, nullable=False),
Column('handId', BigIntColumn, ForeignKey("Hands.id"), nullable=False),
Column('actions', PickleType, nullable=False),
mysql_charset='utf8',
mysql_engine='InnoDB',
)
hands_players_table = Table('HandsPlayers', metadata,
Column('id', BigIntColumn, primary_key=True),
Column('handId', BigIntColumn, ForeignKey("Hands.id"), nullable=False),
Column('playerId', Integer, ForeignKey("Players.id"), nullable=False),
Column('startCash', MoneyColumn),
Column('position', CHAR(1)), #CHAR(1)
Column('seatNo', SmallInteger, nullable=False), #SMALLINT NOT NULL
Column('card1', CardColumn), #smallint NOT NULL,
Column('card2', CardColumn), #smallint NOT NULL
Column('card3', CardColumn), #smallint
Column('card4', CardColumn), #smallint
Column('card5', CardColumn), #smallint
Column('card6', CardColumn), #smallint
Column('card7', CardColumn), #smallint
Column('startCards', SmallInteger), #smallint
Column('m_factor', Integer), # null for ring games
Column('ante', MoneyColumn), #INT
Column('winnings', MoneyColumn, nullable=False, default=0), #int NOT NULL
Column('rake', MoneyColumn, nullable=False, default=0), #int NOT NULL
Column('totalProfit', MoneyColumn), #INT
Column('comment', Text), #text
Column('commentTs', DateTime), #DATETIME
Column('tourneysPlayersId', BigIntColumn, ForeignKey("TourneysPlayers.id"),), #BIGINT UNSIGNED
Column('tourneyTypeId', Integer, ForeignKey("TourneyTypes.id"),), #SMALLINT UNSIGNED
Column('wonWhenSeenStreet1',Float), #FLOAT
Column('wonWhenSeenStreet2',Float), #FLOAT
Column('wonWhenSeenStreet3',Float), #FLOAT
Column('wonWhenSeenStreet4',Float), #FLOAT
Column('wonAtSD', Float), #FLOAT
Column('street0VPI', Boolean), #BOOLEAN
Column('street0Aggr', Boolean), #BOOLEAN
Column('street0_3BChance', Boolean), #BOOLEAN
Column('street0_3BDone', Boolean), #BOOLEAN
Column('street0_4BChance', Boolean), #BOOLEAN
Column('street0_4BDone', Boolean), #BOOLEAN
Column('other3BStreet0', Boolean), #BOOLEAN
Column('other4BStreet0', Boolean), #BOOLEAN
Column('street1Seen', Boolean), #BOOLEAN
Column('street2Seen', Boolean), #BOOLEAN
Column('street3Seen', Boolean), #BOOLEAN
Column('street4Seen', Boolean), #BOOLEAN
Column('sawShowdown', Boolean), #BOOLEAN
Column('street1Aggr', Boolean), #BOOLEAN
Column('street2Aggr', Boolean), #BOOLEAN
Column('street3Aggr', Boolean), #BOOLEAN
Column('street4Aggr', Boolean), #BOOLEAN
Column('otherRaisedStreet0',Boolean), #BOOLEAN
Column('otherRaisedStreet1',Boolean), #BOOLEAN
Column('otherRaisedStreet2',Boolean), #BOOLEAN
Column('otherRaisedStreet3',Boolean), #BOOLEAN
Column('otherRaisedStreet4',Boolean), #BOOLEAN
Column('foldToOtherRaisedStreet0', Boolean), #BOOLEAN
Column('foldToOtherRaisedStreet1', Boolean), #BOOLEAN
Column('foldToOtherRaisedStreet2', Boolean), #BOOLEAN
Column('foldToOtherRaisedStreet3', Boolean), #BOOLEAN
Column('foldToOtherRaisedStreet4', Boolean), #BOOLEAN
Column('stealAttemptChance', Boolean), #BOOLEAN
Column('stealAttempted', Boolean), #BOOLEAN
Column('foldBbToStealChance', Boolean), #BOOLEAN
Column('foldedBbToSteal', Boolean), #BOOLEAN
Column('foldSbToStealChance', Boolean), #BOOLEAN
Column('foldedSbToSteal', Boolean), #BOOLEAN
Column('street1CBChance', Boolean), #BOOLEAN
Column('street1CBDone', Boolean), #BOOLEAN
Column('street2CBChance', Boolean), #BOOLEAN
Column('street2CBDone', Boolean), #BOOLEAN
Column('street3CBChance', Boolean), #BOOLEAN
Column('street3CBDone', Boolean), #BOOLEAN
Column('street4CBChance', Boolean), #BOOLEAN
Column('street4CBDone', Boolean), #BOOLEAN
Column('foldToStreet1CBChance', Boolean), #BOOLEAN
Column('foldToStreet1CBDone', Boolean), #BOOLEAN
Column('foldToStreet2CBChance', Boolean), #BOOLEAN
Column('foldToStreet2CBDone', Boolean), #BOOLEAN
Column('foldToStreet3CBChance', Boolean), #BOOLEAN
Column('foldToStreet3CBDone', Boolean), #BOOLEAN
Column('foldToStreet4CBChance', Boolean), #BOOLEAN
Column('foldToStreet4CBDone', Boolean), #BOOLEAN
Column('street1CheckCallRaiseChance',Boolean), #BOOLEAN
Column('street1CheckCallRaiseDone', Boolean), #BOOLEAN
Column('street2CheckCallRaiseChance',Boolean), #BOOLEAN
Column('street2CheckCallRaiseDone', Boolean), #BOOLEAN
Column('street3CheckCallRaiseChance',Boolean), #BOOLEAN
Column('street3CheckCallRaiseDone', Boolean), #BOOLEAN
Column('street4CheckCallRaiseChance',Boolean), #BOOLEAN
Column('street4CheckCallRaiseDone', Boolean), #BOOLEAN
Column('street0Calls', SmallInteger), #TINYINT
Column('street1Calls', SmallInteger), #TINYINT
Column('street2Calls', SmallInteger), #TINYINT
Column('street3Calls', SmallInteger), #TINYINT
Column('street4Calls', SmallInteger), #TINYINT
Column('street0Bets', SmallInteger), #TINYINT
Column('street1Bets', SmallInteger), #TINYINT
Column('street2Bets', SmallInteger), #TINYINT
Column('street3Bets', SmallInteger), #TINYINT
Column('street4Bets', SmallInteger), #TINYINT
Column('street0Raises', SmallInteger), #TINYINT
Column('street1Raises', SmallInteger), #TINYINT
Column('street2Raises', SmallInteger), #TINYINT
Column('street3Raises', SmallInteger), #TINYINT
Column('street4Raises', SmallInteger), #TINYINT
Column('actionString', String(15)), #VARCHAR(15)
mysql_charset='utf8',
mysql_engine='InnoDB',
)
hud_cache_table = Table('HudCache', metadata,
Column('id', BigIntColumn, primary_key=True),
Column('gametypeId', SmallInteger, ForeignKey("Gametypes.id"), nullable=False), # SMALLINT
Column('playerId', Integer, ForeignKey("Players.id"), nullable=False), # SMALLINT
Column('activeSeats', SmallInteger, nullable=False), # SMALLINT NOT NULL
Column('position', CHAR(1)), # CHAR(1)
Column('tourneyTypeId', Integer, ForeignKey("TourneyTypes.id") ), # SMALLINT
Column('styleKey', CHAR(7), nullable=False), # CHAR(7) NOT NULL
Column('m_factor', Integer),
Column('HDs', Integer, nullable=False), # INT NOT NULL
Column('wonWhenSeenStreet1', Float), # FLOAT
Column('wonWhenSeenStreet2', Float), # FLOAT
Column('wonWhenSeenStreet3', Float), # FLOAT
Column('wonWhenSeenStreet4', Float), # FLOAT
Column('wonAtSD', Float), # FLOAT
Column('street0VPI', Integer), # INT
Column('street0Aggr', Integer), # INT
Column('street0_3BChance', Integer), # INT
Column('street0_3BDone', Integer), # INT
Column('street0_4BChance', Integer), # INT
Column('street0_4BDone', Integer), # INT
Column('other3BStreet0', Integer), # INT
Column('other4BStreet0', Integer), # INT
Column('street1Seen', Integer), # INT
Column('street2Seen', Integer), # INT
Column('street3Seen', Integer), # INT
Column('street4Seen', Integer), # INT
Column('sawShowdown', Integer), # INT
Column('street1Aggr', Integer), # INT
Column('street2Aggr', Integer), # INT
Column('street3Aggr', Integer), # INT
Column('street4Aggr', Integer), # INT
Column('otherRaisedStreet0', Integer), # INT
Column('otherRaisedStreet1', Integer), # INT
Column('otherRaisedStreet2', Integer), # INT
Column('otherRaisedStreet3', Integer), # INT
Column('otherRaisedStreet4', Integer), # INT
Column('foldToOtherRaisedStreet0', Integer), # INT
Column('foldToOtherRaisedStreet1', Integer), # INT
Column('foldToOtherRaisedStreet2', Integer), # INT
Column('foldToOtherRaisedStreet3', Integer), # INT
Column('foldToOtherRaisedStreet4', Integer), # INT
Column('stealAttemptChance', Integer), # INT
Column('stealAttempted', Integer), # INT
Column('foldBbToStealChance', Integer), # INT
Column('foldedBbToSteal', Integer), # INT
Column('foldSbToStealChance', Integer), # INT
Column('foldedSbToSteal', Integer), # INT
Column('street1CBChance', Integer), # INT
Column('street1CBDone', Integer), # INT
Column('street2CBChance', Integer), # INT
Column('street2CBDone', Integer), # INT
Column('street3CBChance', Integer), # INT
Column('street3CBDone', Integer), # INT
Column('street4CBChance', Integer), # INT
Column('street4CBDone', Integer), # INT
Column('foldToStreet1CBChance', Integer), # INT
Column('foldToStreet1CBDone', Integer), # INT
Column('foldToStreet2CBChance', Integer), # INT
Column('foldToStreet2CBDone', Integer), # INT
Column('foldToStreet3CBChance', Integer), # INT
Column('foldToStreet3CBDone', Integer), # INT
Column('foldToStreet4CBChance', Integer), # INT
Column('foldToStreet4CBDone', Integer), # INT
Column('totalProfit', Integer), # INT
Column('street1CheckCallRaiseChance', Integer), # INT
Column('street1CheckCallRaiseDone', Integer), # INT
Column('street2CheckCallRaiseChance', Integer), # INT
Column('street2CheckCallRaiseDone', Integer), # INT
Column('street3CheckCallRaiseChance', Integer), # INT
Column('street3CheckCallRaiseDone', Integer), # INT
Column('street4CheckCallRaiseChance', Integer), # INT
Column('street4CheckCallRaiseDone', Integer), # INT
Column('street0Calls', Integer), # INT
Column('street1Calls', Integer), # INT
Column('street2Calls', Integer), # INT
Column('street3Calls', Integer), # INT
Column('street4Calls', Integer), # INT
Column('street0Bets', Integer), # INT
Column('street1Bets', Integer), # INT
Column('street2Bets', Integer), # INT
Column('street3Bets', Integer), # INT
Column('street4Bets', Integer), # INT
Column('street0Raises', Integer), # INT
Column('street1Raises', Integer), # INT
Column('street2Raises', Integer), # INT
Column('street3Raises', Integer), # INT
Column('street4Raises', Integer), # INT
mysql_charset='utf8',
mysql_engine='InnoDB',
)
players_table = Table('Players', metadata,
Column('id', Integer, primary_key=True),
Column('name', Unicode(32), nullable=False), # VARCHAR(32) CHARACTER SET utf8 NOT NULL
Column('siteId', SmallInteger, ForeignKey("Sites.id"), nullable=False), # SMALLINT
Column('comment', Text), # text
Column('commentTs', DateTime), # DATETIME
mysql_charset='utf8',
mysql_engine='InnoDB',
)
Index('name', players_table.c.name, players_table.c.siteId, unique=True)
settings_table = Table('Settings', metadata,
Column('version', SmallInteger, nullable=False),
mysql_charset='utf8',
mysql_engine='InnoDB',
)
sites_table = Table('Sites', metadata,
Column('id', SmallInteger, primary_key=True),
Column('name', String(32), nullable=False), # varchar(32) NOT NULL
Column('code', String(2), nullable=False), # char(2) NOT NULL
mysql_charset='utf8',
mysql_engine='InnoDB',
)
tourneys_table = Table('Tourneys', metadata,
Column('id', Integer, primary_key=True),
Column('tourneyTypeId', Integer, ForeignKey("TourneyTypes.id"), nullable=False, default=1),
Column('siteTourneyNo', BigIntColumn, nullable=False), # BIGINT NOT NULL
Column('entries', Integer), # INT NOT NULL
Column('prizepool', Integer), # INT NOT NULL
Column('tourStartTime', DateTime), # DATETIME NOT NULL
Column('tourEndTime', DateTime), # DATETIME
Column('tourneyName', String(40)), # varchar(40)
# Mask use : 1=Positionnal Winnings|2=Match1|4=Match2|...|pow(2,n)=Matchn
Column('matrixIdProcessed',SmallInteger, default=0), # TINYINT UNSIGNED DEFAULT 0
Column('totalRebuyCount', Integer, default=0), # INT DEFAULT 0
Column('totalAddOnCount', Integer, default=0), # INT DEFAULT 0
Column('comment', Text), # TEXT
Column('commentTs', DateTime), # DATETIME
mysql_charset='utf8',
mysql_engine='InnoDB',
)
Index('siteTourneyNo', tourneys_table.c.siteTourneyNo, tourneys_table.c.tourneyTypeId, unique=True)
tourney_types_table = Table('TourneyTypes', metadata,
Column('id', Integer, primary_key=True),
Column('siteId', SmallInteger, ForeignKey("Sites.id"), nullable=False),
Column('currency', String(4), nullable=False), # varchar(4) NOT NULL
Column('buyin', Integer, nullable=False), # INT NOT NULL
Column('fee', Integer, nullable=False), # INT NOT NULL
Column('buyInChips', Integer, nullable=False), # INT NOT NULL
Column('maxSeats', Boolean, nullable=False, default=-1), # INT NOT NULL DEFAULT -1
Column('rebuy', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False
Column('rebuyCost', Integer), # INT
Column('rebuyChips', Integer), # INT
Column('addOn', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False
Column('addOnCost', Integer), # INT
Column('addOnChips', Integer), # INT
Column('knockout', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False
Column('koBounty', Integer), # INT
Column('speed', String(10)), # varchar(10)
Column('shootout', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False
Column('matrix', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False
Column('sng', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False
Column('satellite', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False
Column('doubleOrNothing', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False
Column('guarantee', Integer, nullable=False, default=0), # INT NOT NULL DEFAULT 0
mysql_charset='utf8',
mysql_engine='InnoDB',
)
Index('tourneyTypes_all',
tourney_types_table.c.siteId, tourney_types_table.c.buyin, tourney_types_table.c.fee,
tourney_types_table.c.maxSeats, tourney_types_table.c.knockout, tourney_types_table.c.rebuy,
tourney_types_table.c.addOn, tourney_types_table.c.speed,
tourney_types_table.c.shootout, tourney_types_table.c.matrix, tourney_types_table.c.sng)
tourneys_players_table = Table('TourneysPlayers', metadata,
Column('id', BigIntColumn, primary_key=True),
Column('tourneyId', Integer, ForeignKey("Tourneys.id"), nullable=False),
Column('playerId', Integer, ForeignKey("Players.id"), nullable=False),
Column('rank', Integer), # INT NOT NULL
Column('winnings', Integer), # INT NOT NULL
Column('winningsCurrency', Text), # TEXT
Column('rebuyCount', Integer, default=0), # INT DEFAULT 0
Column('addOnCount', Integer, default=0), # INT DEFAULT 0
Column('koCount', Integer, default=0), # INT DEFAULT 0
Column('comment', Text), # TEXT
Column('commentTs', DateTime), # DATETIME
mysql_charset='utf8',
mysql_engine='InnoDB',
)
Index('tourneyId', tourneys_players_table.c.tourneyId, tourneys_players_table.c.playerId, unique=True)
def sss():
"Debug function. Returns (config, sql, db)"
import Configuration, SQL, Database, os
class Dummy(object):
pass
self = Dummy()
self.config = Configuration.Config()
self.settings = {}
if (os.sep=="/"):
self.settings['os']="linuxmac"
else:
self.settings['os']="windows"
self.settings.update(self.config.get_db_parameters())
self.settings.update(self.config.get_import_parameters())
self.settings.update(self.config.get_default_paths())
self.sql = SQL.Sql( db_server = self.settings['db-server'])
self.db = Database.Database(self.config, sql = self.sql)
return self.config, self.sql, self.db

4
pyfpdb/BetfairToFpdb.py

@ -74,7 +74,7 @@ class Betfair(HandHistoryConverter):
if not m:
tmp = handText[0:100]
log.error(_("Unable to recognise gametype from: '%s'") % tmp)
log.error(_("determineGameType: Raising FpdbParseError"))
log.error("determineGameType: " + _("Raising FpdbParseError"))
raise FpdbParseError(_("Unable to recognise gametype from: '%s'") % tmp)
mg = m.groupdict()
@ -196,7 +196,7 @@ class Betfair(HandHistoryConverter):
elif action.group('ATYPE') == 'checks':
hand.addCheck( street, action.group('PNAME'))
else:
sys.stderr.write(_("DEBUG: ") + _("Unimplemented readAction: '%s' '%s'") % (action.group('PNAME'),action.group('ATYPE')))
sys.stderr.write(_("DEBUG: ") + _("Unimplemented readAction: '%s' '%s'") % (action.group('PNAME'), action.group('ATYPE')))
def readShowdownActions(self, hand):

4
pyfpdb/CarbonToFpdb.py

@ -128,7 +128,7 @@ or None if we fail to get the info """
except AttributeError:
tmp = handText[0:100]
log.error(_("Unable to recognise gametype from: '%s'") % tmp)
log.error(_("determineGameType: Raising FpdbParseError"))
log.error("determineGameType: " + _("Raising FpdbParseError"))
raise FpdbParseError(_("Unable to recognise gametype from: '%s'") % tmp)
self.info = {}
@ -264,7 +264,7 @@ or None if we fail to get the info """
elif action.group('ATYPE') == 'ALL_IN':
hand.addAllIn(street, player, action.group('BET'))
else:
logging.debug(_("Unimplemented readAction: '%s' '%s'") % (action.group('PSEAT'),action.group('ATYPE')))
logging.debug(_("Unimplemented readAction: '%s' '%s'") % (action.group('PSEAT'), action.group('ATYPE')))
def readShowdownActions(self, hand):
for shows in self.re_ShowdownAction.finditer(hand.handText):

18
pyfpdb/Charset.py

@ -26,9 +26,7 @@ import Configuration
encoder_to_utf = codecs.lookup('utf-8')
encoder_to_sys = codecs.lookup(Configuration.LOCALE_ENCODING)
coder_hex = codecs.lookup('hex_codec')
hex_coding = False #FIXME: Should only be on if db is not UTF8 - test in Database.py?
# I'm saving a few cycles with this one
not_needed1, not_needed2, not_needed3 = False, False, False
if Configuration.LOCALE_ENCODING == 'UTF8':
@ -77,19 +75,3 @@ def to_gui(s):
except UnicodeEncodeError:
sys.stderr.write(_('Could not encode: "%s"\n') % s)
raise
def to_hex(s):
try:
out = coder_hex.encode(s)[0]
return out
except UnicodeDecodeError:
sys.stderr.write(_('Could not convert: "%s"\n') % s)
return s
def from_hex(s):
try:
out = coder_hex.decode(s)[0]
return out
except UnicodeDecodeError:
sys.stderr.write(_('Could not convert: "%s"\n') % s)
return s

22
pyfpdb/Configuration.py

@ -207,8 +207,8 @@ DATABASE_TYPES = (
DATABASE_TYPE_MYSQL,
)
#LOCALE_ENCODING = locale.getdefaultlocale()[1]
LOCALE_ENCODING = locale.getpreferredencoding()
LOCALE_ENCODING = locale.getdefaultlocale()[1]
#LOCALE_ENCODING = locale.getpreferredencoding() #this breaks on Mac OSX - please leave this comment
if LOCALE_ENCODING == "US-ASCII":
print _("Default encoding set to US-ASCII, defaulting to CP1252 instead -- If you're not on a Mac, please report this problem.")
LOCALE_ENCODING = "cp1252"
@ -314,8 +314,6 @@ class Site:
self.layout = {}
self.emails = {}
#print _("Loading site"), self.site_name
for layout_node in node.getElementsByTagName('layout'):
lo = Layout(layout_node)
self.layout[lo.max] = lo
@ -637,14 +635,14 @@ class RawHands:
if save in ("none", "error", "all"):
self.save=save
else:
print _("Invalid config value for raw_hands.save, defaulting to \"error\"")
print (_("Invalid config value for %s, defaulting to %s") % (raw_hands.save, "\"error\""))
self.save="error"
compression=node.getAttribute("compression")
if save in ("none", "gzip", "bzip2"):
self.compression=compression
else:
print _("Invalid config value for raw_hands.compression, defaulting to \"none\"")
print (_("Invalid config value for %s, defaulting to %s") % (raw_hands.compression, "\"none\""))
self.compression="none"
#end def __init__
@ -663,14 +661,14 @@ class RawTourneys:
if save in ("none", "error", "all"):
self.save=save
else:
print _("Invalid config value for raw_tourneys.save, defaulting to \"error\"")
print (_("Invalid config value for %s, defaulting to %s") % (raw_tourneys.save, "\"error\""))
self.save="error"
compression=node.getAttribute("compression")
if save in ("none", "gzip", "bzip2"):
self.compression=compression
else:
print _("Invalid config value for raw_tourneys.compression, defaulting to \"none\"")
print (_("Invalid config value for %s, defaulting to %s") % (raw_tourneys.compression, "\"none\""))
self.compression="none"
#end def __init__
@ -688,8 +686,8 @@ class Config:
if file is not None: # config file path passed in
file = os.path.expanduser(file)
if not os.path.exists(file):
print _("Configuration file %s not found. Using defaults.") % (file)
sys.stderr.write(_("Configuration file %s not found. Using defaults.") % (file))
print _("Configuration file %s not found. Using defaults.") % (file)
sys.stderr.write(_("Configuration file %s not found. Using defaults.") % (file))
file = None
self.example_copy,example_file = True,None
@ -726,7 +724,7 @@ class Config:
self.doc = doc
self.file_error = None
except:
log.error(_("Error parsing %s. See error log file.") % (file))
log.error((_("Error parsing %s.") % (file)) + _("See error log file."))
traceback.print_exc(file=sys.stderr)
self.file_error = sys.exc_info()[1]
# we could add a parameter to decide whether to return or read a line and exit?
@ -842,7 +840,7 @@ class Config:
try:
example_doc = xml.dom.minidom.parse(example_file)
except:
log.error(_("Error parsing example configuration file %s. See error log file.") % (example_file))
log.error((_("Error parsing example configuration file %s.") % (example_file)) + _("See error log file."))
return nodes_added
for cnode in doc.getElementsByTagName("FreePokerToolsConfig"):

73
pyfpdb/Database.py

@ -467,7 +467,7 @@ class Database:
os.mkdir(self.config.dir_database)
database = os.path.join(self.config.dir_database, database)
self.db_path = database
log.info(_("Connecting to SQLite: %(database)s") % {'database':self.db_path})
log.info(_("Connecting to SQLite: %s") % self.db_path)
if os.path.exists(database) or create:
self.connection = sqlite3.connect(self.db_path, detect_types=sqlite3.PARSE_DECLTYPES )
self.__connected = True
@ -510,19 +510,18 @@ class Database:
self.cursor.execute("SELECT * FROM Settings")
settings = self.cursor.fetchone()
if settings[0] != DB_VERSION:
log.error(_("outdated or too new database version (%s) - please recreate tables")
% (settings[0]))
log.error((_("Outdated or too new database version (%s).") % (settings[0])) + " " + _("Please recreate tables."))
self.wrongDbVersion = True
except:# _mysql_exceptions.ProgrammingError:
if database != ":memory:":
if create:
print _("Failed to read settings table - recreating tables")
log.info(_("Failed to read settings table - recreating tables"))
print (_("Failed to read settings table.") + " - " + _("Recreating tables."))
log.info(_("Failed to read settings table.") + " - " + _("Recreating tables."))
self.recreate_tables()
self.check_version(database=database, create=False)
else:
print _("Failed to read settings table - please recreate tables")
log.info(_("Failed to read settings table - please recreate tables"))
print (_("Failed to read settings table.") + " - " + _("Please recreate tables."))
log.info(_("Failed to read settings table.") + " - " + _("Please recreate tables."))
self.wrongDbVersion = True
else:
self.wrongDbVersion = True
@ -1534,37 +1533,37 @@ class Database:
c = self.get_cursor()
c.execute("INSERT INTO Settings (version) VALUES (%s);" % (DB_VERSION))
#Fill Sites
c.execute("INSERT INTO Sites (name,code) VALUES ('Full Tilt Poker', 'FT')")
c.execute("INSERT INTO Sites (name,code) VALUES ('PokerStars', 'PS')")
c.execute("INSERT INTO Sites (name,code) VALUES ('Everleaf', 'EV')")
c.execute("INSERT INTO Sites (name,code) VALUES ('Win2day', 'W2')")
c.execute("INSERT INTO Sites (name,code) VALUES ('OnGame', 'OG')")
c.execute("INSERT INTO Sites (name,code) VALUES ('UltimateBet', 'UB')")
c.execute("INSERT INTO Sites (name,code) VALUES ('Betfair', 'BF')")
c.execute("INSERT INTO Sites (name,code) VALUES ('Absolute', 'AB')")
c.execute("INSERT INTO Sites (name,code) VALUES ('PartyPoker', 'PP')")
c.execute("INSERT INTO Sites (name,code) VALUES ('PacificPoker', 'P8')")
c.execute("INSERT INTO Sites (name,code) VALUES ('Partouche', 'PA')")
c.execute("INSERT INTO Sites (name,code) VALUES ('Carbon', 'CA')")
c.execute("INSERT INTO Sites (name,code) VALUES ('PKR', 'PK')")
c.execute("INSERT INTO Sites (name,code) VALUES ('iPoker', 'IP')")
c.execute("INSERT INTO Sites (name,code) VALUES ('Winamax', 'WM')")
c.execute("INSERT INTO Sites (name,code) VALUES ('Everest', 'EP')")
c.execute("INSERT INTO Sites (id,name,code) VALUES ('1', 'Full Tilt Poker', 'FT')")
c.execute("INSERT INTO Sites (id,name,code) VALUES ('2', 'PokerStars', 'PS')")
c.execute("INSERT INTO Sites (id,name,code) VALUES ('3', 'Everleaf', 'EV')")
c.execute("INSERT INTO Sites (id,name,code) VALUES ('4', 'Win2day', 'W2')")
c.execute("INSERT INTO Sites (id,name,code) VALUES ('5', 'OnGame', 'OG')")
c.execute("INSERT INTO Sites (id,name,code) VALUES ('6', 'UltimateBet', 'UB')")
c.execute("INSERT INTO Sites (id,name,code) VALUES ('7', 'Betfair', 'BF')")
c.execute("INSERT INTO Sites (id,name,code) VALUES ('8', 'Absolute', 'AB')")
c.execute("INSERT INTO Sites (id,name,code) VALUES ('9', 'PartyPoker', 'PP')")
c.execute("INSERT INTO Sites (id,name,code) VALUES ('10', 'PacificPoker', 'P8')")
c.execute("INSERT INTO Sites (id,name,code) VALUES ('11', 'Partouche', 'PA')")
c.execute("INSERT INTO Sites (id,name,code) VALUES ('12', 'Carbon', 'CA')")
c.execute("INSERT INTO Sites (id,name,code) VALUES ('13', 'PKR', 'PK')")
c.execute("INSERT INTO Sites (id,name,code) VALUES ('14', 'iPoker', 'IP')")
c.execute("INSERT INTO Sites (id,name,code) VALUES ('15', 'Winamax', 'WM')")
c.execute("INSERT INTO Sites (id,name,code) VALUES ('16', 'Everest', 'EP')")
#Fill Actions
c.execute("INSERT INTO Actions (name,code) VALUES ('ante', 'A')")
c.execute("INSERT INTO Actions (name,code) VALUES ('small blind', 'SB')")
c.execute("INSERT INTO Actions (name,code) VALUES ('secondsb', 'SSB')")
c.execute("INSERT INTO Actions (name,code) VALUES ('big blind', 'BB')")
c.execute("INSERT INTO Actions (name,code) VALUES ('both', 'SBBB')")
c.execute("INSERT INTO Actions (name,code) VALUES ('calls', 'C')")
c.execute("INSERT INTO Actions (name,code) VALUES ('raises', 'R')")
c.execute("INSERT INTO Actions (name,code) VALUES ('bets', 'B')")
c.execute("INSERT INTO Actions (name,code) VALUES ('stands pat', 'S')")
c.execute("INSERT INTO Actions (name,code) VALUES ('folds', 'F')")
c.execute("INSERT INTO Actions (name,code) VALUES ('checks', 'K')")
c.execute("INSERT INTO Actions (name,code) VALUES ('discards', 'D')")
c.execute("INSERT INTO Actions (name,code) VALUES ('bringin', 'I')")
c.execute("INSERT INTO Actions (name,code) VALUES ('completes', 'P')")
c.execute("INSERT INTO Actions (id,name,code) VALUES ('1', 'ante', 'A')")
c.execute("INSERT INTO Actions (id,name,code) VALUES ('2', 'small blind', 'SB')")
c.execute("INSERT INTO Actions (id,name,code) VALUES ('3', 'secondsb', 'SSB')")
c.execute("INSERT INTO Actions (id,name,code) VALUES ('4', 'big blind', 'BB')")
c.execute("INSERT INTO Actions (id,name,code) VALUES ('5', 'both', 'SBBB')")
c.execute("INSERT INTO Actions (id,name,code) VALUES ('6', 'calls', 'C')")
c.execute("INSERT INTO Actions (id,name,code) VALUES ('7', 'raises', 'R')")
c.execute("INSERT INTO Actions (id,name,code) VALUES ('8', 'bets', 'B')")
c.execute("INSERT INTO Actions (id,name,code) VALUES ('9', 'stands pat', 'S')")
c.execute("INSERT INTO Actions (id,name,code) VALUES ('10', 'folds', 'F')")
c.execute("INSERT INTO Actions (id,name,code) VALUES ('11', 'checks', 'K')")
c.execute("INSERT INTO Actions (id,name,code) VALUES ('12', 'discards', 'D')")
c.execute("INSERT INTO Actions (id,name,code) VALUES ('13', 'bringin', 'I')")
c.execute("INSERT INTO Actions (id,name,code) VALUES ('14', 'completes', 'P')")
#end def fillDefaultData

8
pyfpdb/EverestToFpdb.py

@ -99,12 +99,12 @@ class Everest(HandHistoryConverter):
except AttributeError:
tmp = handText[0:100]
log.error(_("Unable to recognise gametype from: '%s'") % tmp)
log.error(_("determineGameType: Raising FpdbParseError"))
log.error("determineGameType: " + _("Raising FpdbParseError"))
raise FpdbParseError(_("Unable to recognise gametype from: '%s'") % tmp)
if not m2:
tmp = handText[0:100]
log.error(_("determineGameType: Raising FpdbParseError"))
log.error("determineGameType: " + _("Raising FpdbParseError"))
raise FpdbParseError(_("Unable to recognise handinfo from: '%s'") % tmp)
self.info = {}
@ -231,8 +231,8 @@ class Everest(HandHistoryConverter):
elif action.group('ATYPE') in ('FOLD', 'SIT_OUT'):
hand.addFold(street, player)
else:
print (_("Unimplemented readAction: '%s' '%s'") % (action.group('PSEAT'),action.group('ATYPE')))
logging.debug(_("Unimplemented readAction: '%s' '%s'") % (action.group('PSEAT'),action.group('ATYPE')))
print (_("Unimplemented readAction: '%s' '%s'") % (action.group('PSEAT'), action.group('ATYPE')))
logging.debug(_("Unimplemented readAction: '%s' '%s'") % (action.group('PSEAT'), action.group('ATYPE')))
def readShowdownActions(self, hand):
for shows in self.re_ShowdownAction.finditer(hand.handText):

56
pyfpdb/EverleafToFpdb.py

@ -33,20 +33,34 @@ class Everleaf(HandHistoryConverter):
filetype = "text"
codepage = "cp1252"
siteId = 3 # Needs to match id entry in Sites database
substitutions = {
'LEGAL_ISO' : "USD|EUR|GBP|CAD|FPP", # legal ISO currency codes
'LS' : u"\$|\u20AC|\xe2\x82\xac|\x80|", # legal currency symbols - Euro(cp1252, utf-8) #TODO change \x80 to \x20\x80, update all regexes accordingly
'TAB' : u"-\u2013'\s\da-zA-Z#_", # legal characters for tablename
'NUM' : u".,\d", # legal characters in number format
}
# Static regexes
re_SplitHands = re.compile(r"\n\n\n+")
re_TailSplitHands = re.compile(r"(\n\n\n+)")
re_GameInfo = re.compile(ur"^(Blinds )?(?P<CURRENCY>[$€]?)(?P<SB>[.0-9]+)/[$€]?(?P<BB>[.0-9]+) (?P<LIMIT>NL|PL|) ?(?P<GAME>(Hold\'em|Omaha|7 Card Stud))", re.MULTILINE)
#re.compile(ur"^(Blinds )?(?P<CURRENCY>\$| €|)(?P<SB>[.0-9]+)/(?:\$| €)?(?P<BB>[.0-9]+) (?P<LIMIT>NL|PL|) ?(?P<GAME>(Hold\'em|Omaha|7 Card Stud))", re.MULTILINE)
re_HandInfo = re.compile(ur".*#(?P<HID>[0-9]+)\n.*\n(Blinds )?(?P<CURRENCY>[$€])?(?P<SB>[.0-9]+)/(?:[$€])?(?P<BB>[.0-9]+) (?P<GAMETYPE>.*) - (?P<DATETIME>\d\d\d\d/\d\d/\d\d - \d\d:\d\d:\d\d)\nTable (?P<TABLE>.+$)", re.MULTILINE)
re_GameInfo = re.compile(ur"^(Blinds )? ?(?P<CURRENCY>[%(LS)s]?)(?P<SB>[.0-9]+) ?/ ? ?[%(LS)s]?(?P<BB>[.0-9]+) (?P<LIMIT>NL|PL|) ?(?P<GAME>(Hold\'em|Omaha|7 Card Stud))" % substitutions, re.MULTILINE)
#re_HandInfo = re.compile(ur".*#(?P<HID>[0-9]+)\n.*\n(Blinds )?(?P<CURRENCY>[$€])?(?P<SB>[.0-9]+)/(?:[$€])?(?P<BB>[.0-9]+) (?P<GAMETYPE>.*) - (?P<DATETIME>\d\d\d\d/\d\d/\d\d - \d\d:\d\d:\d\d)\nTable (?P<TABLE>.+$)", re.MULTILINE)
re_HandInfo = re.compile(ur".*\n(.*#|.* partie )(?P<HID>[0-9]+).*(\n|\n\n)(Blinds )? ?(?P<CURRENCY>[%(LS)s])?(?P<SB>[.0-9]+) ?/ ?(?:[%(LS)s])?(?P<BB>[.0-9]+) (?P<GAMETYPE>.*) - (?P<DATETIME>\d\d\d\d/\d\d/\d\d - \d\d:\d\d:\d\d)\nTable (?P<TABLE>.+$)" % substitutions, re.MULTILINE)
#
#re_HandInfo = re.compile(ur"(.*#|.*\n.* partie )(?P<HID>[0-9]+).*(\n|\n\n)(Blinds )?(?:\$| €|)(?P<SB>[.0-9]+)/(?:\$| €|)(?P<BB>[.0-9]+) (?P<GAMETYPE>.*) - (?P<DATETIME>\d\d\d\d/\d\d/\d\d - \d\d:\d\d:\d\d)\nTable (?P<TABLE>.+$)", re.MULTILINE)
re_Button = re.compile(ur"^Seat (?P<BUTTON>\d+) is the button$", re.MULTILINE)
re_PlayerInfo = re.compile(ur"""^Seat\s(?P<SEAT>[0-9]+):\s(?P<PNAME>.*)\s+
\(
\s+[$]?\s?(?P<CASH>[.0-9]+)
(\s(USD|EURO|Chips)?(new\splayer|All-in)?)?
\s+[%(LS)s]?\s?(?P<CASH>[.0-9]+)
(\s(USD|EURO|EUR|Chips)?(new\splayer|All-in)?)?
\s?\)$
""", re.MULTILINE|re.VERBOSE)
""" % substitutions, re.MULTILINE|re.VERBOSE)
re_Board = re.compile(ur"\[ (?P<CARDS>.+) \]")
re_TourneyInfoFromFilename = re.compile(ur".*TID_(?P<TOURNO>[0-9]+)-(?P<TABLE>[0-9]+)\.txt")
@ -58,16 +72,16 @@ class Everleaf(HandHistoryConverter):
self.compiledPlayers = players
player_re = "(?P<PNAME>" + "|".join(map(re.escape, players)) + ")"
logging.debug("player_re: "+ player_re)
self.re_PostSB = re.compile(ur"^%s: posts small blind \[[$€]? (?P<SB>[.0-9]+)\s.*\]$" % player_re, re.MULTILINE)
self.re_PostBB = re.compile(ur"^%s: posts big blind \[[$€]? (?P<BB>[.0-9]+)\s.*\]$" % player_re, re.MULTILINE)
self.re_PostBoth = re.compile(ur"^%s: posts both blinds \[[$€]? (?P<SBBB>[.0-9]+)\s.*\]$" % player_re, re.MULTILINE)
self.re_Antes = re.compile(ur"^%s: posts ante \[[$€]? (?P<ANTE>[.0-9]+)\s.*\]$" % player_re, re.MULTILINE)
self.re_BringIn = re.compile(ur"^%s posts bring-in [$€]? (?P<BRINGIN>[.0-9]+)\." % player_re, re.MULTILINE)
self.re_PostSB = re.compile(ur"^%s: posts small blind \[ ?[%s]? (?P<SB>[.0-9]+)\s.*\]$" % (player_re, self.substitutions["LS"]), re.MULTILINE)
self.re_PostBB = re.compile(ur"^%s: posts big blind \[ ?[%s]? (?P<BB>[.0-9]+)\s.*\]$" % (player_re, self.substitutions["LS"]), re.MULTILINE)
self.re_PostBoth = re.compile(ur"^%s: posts both blinds \[ ?[%s]? (?P<SBBB>[.0-9]+)\s.*\]$" % (player_re, self.substitutions["LS"]), re.MULTILINE)
self.re_Antes = re.compile(ur"^%s: posts ante \[ ?[%s]? (?P<ANTE>[.0-9]+)\s.*\]$" % (player_re, self.substitutions["LS"]), re.MULTILINE)
self.re_BringIn = re.compile(ur"^%s posts bring-in ?[%s]? (?P<BRINGIN>[.0-9]+)\." % (player_re, self.substitutions["LS"]), re.MULTILINE)
self.re_HeroCards = re.compile(ur"^Dealt to %s \[ (?P<CARDS>.*) \]$" % player_re, re.MULTILINE)
# ^%s(?P<ATYPE>: bets| checks| raises| calls| folds)(\s\[(?:\$| €|) (?P<BET>[.,\d]+) (USD|EURO|Chips)\])?
self.re_Action = re.compile(ur"^%s(?P<ATYPE>: bets| checks| raises| calls| folds)(\s\[(?:[$€]?) (?P<BET>[.,\d]+)\s?(USD|EURO|Chips|)\])?" % player_re, re.MULTILINE)
# ^%s(?P<ATYPE>: bets| checks| raises| calls| folds)(\s\[(?:\$| €|) (?P<BET>[.,\d]+) (USD|EURO|EUR|Chips)\])?
self.re_Action = re.compile(ur"^%s(?P<ATYPE>: bets| checks| raises| calls| folds)(\s\[(?: ?[%s]?) (?P<BET>[.,\d]+)\s?(USD|EURO|EUR|Chips|)\])?" % (player_re, self.substitutions["LS"]), re.MULTILINE)
self.re_ShowdownAction = re.compile(ur"^%s shows \[ (?P<CARDS>.*) \]" % player_re, re.MULTILINE)
self.re_CollectPot = re.compile(ur"^%s wins (?:[$€]?)\s?(?P<POT>[.\d]+) (USD|EURO|chips)(.*?\[ (?P<CARDS>.*?) \])?" % player_re, re.MULTILINE)
self.re_CollectPot = re.compile(ur"^%s wins ?(?: ?[%s]?)\s?(?P<POT>[.\d]+) (USD|EURO|EUR|chips)(.*?\[ (?P<CARDS>.*?) \])?" % (player_re, self.substitutions["LS"]), re.MULTILINE)
self.re_SitsOut = re.compile(ur"^%s sits out" % player_re, re.MULTILINE)
def readSupportedGames(self):
@ -106,12 +120,13 @@ or None if we fail to get the info """
# Blinds 10/20 NL Hold'em - 2009/02/25 - 17:30:32
# Table 2
info = {'type':'ring'}
m = self.re_GameInfo.search(handText)
if not m:
tmp = handText[0:100]
tmp = handText[0:150]
log.error(_("Unable to recognise gametype from: '%s'") % tmp)
log.error(_("determineGameType: Raising FpdbParseError"))
log.error("determineGameType: " + _("Raising FpdbParseError"))
raise FpdbParseError(_("Unable to recognise gametype from: '%s'") % tmp)
mg = m.groupdict()
@ -256,10 +271,7 @@ or None if we fail to get the info """
def readStudPlayerCards(self, hand, street):
# lol. see Plymouth.txt
logging.warning(_("Everleaf readStudPlayerCards is only a stub."))
#~ if street in ('THIRD', 'FOURTH', 'FIFTH', 'SIXTH'):
#~ hand.addPlayerCards(player = player.group('PNAME'), street = street, closed = [], open = [])
def readAction(self, hand, street):
@ -280,7 +292,7 @@ or None if we fail to get the info """
elif action.group('ATYPE') == ' complete to':
hand.addComplete( street, action.group('PNAME'), action.group('BET'))
else:
logging.debug(_("Unimplemented readAction: %s %s") % (action.group('PNAME'),action.group('ATYPE')))
logging.debug(_("Unimplemented readAction: '%s' '%s'") % (action.group('PNAME'), action.group('ATYPE')))
def readShowdownActions(self, hand):

8
pyfpdb/FullTiltPokerSummary.py

@ -89,8 +89,8 @@ class FullTiltPokerSummary(TourneySummary):
m = self.re_TourneyInfo.search(self.summaryText[:2000])
if m == None:
tmp = self.summaryText[0:200]
log.error(_("parseSummary: Unable to recognise Tourney Info: '%s'") % tmp)
log.error(_("parseSummary: Raising FpdbParseError"))
log.error("parseSummary: " + _("Unable to recognise Tourney Info: '%s'") % tmp)
log.error("parseSummary: " + _("Raising FpdbParseError"))
raise FpdbParseError(_("Unable to recognise Tourney Info: '%s'") % tmp)
#print "DEBUG: m.groupdict(): %s" % m.groupdict()
@ -115,8 +115,8 @@ class FullTiltPokerSummary(TourneySummary):
m = self.re_Currency.search(self.summaryText)
if m == None:
log.error(_("parseSummary: Unable to locate currency"))
log.error(_("parseSummary: Raising FpdbParseError"))
log.error("parseSummary: " + _("Unable to locate currency"))
log.error("parseSummary: " + _("Raising FpdbParseError"))
raise FpdbParseError(_("Unable to locate currency"))
#print "DEBUG: m.groupdict(): %s" % m.groupdict()

25
pyfpdb/FulltiltToFpdb.py

@ -197,9 +197,14 @@ class Fulltilt(HandHistoryConverter):
["tour", "hold", "nl"],
["tour", "hold", "pl"],
["tour", "hold", "fl"],
["tour", "hold", "cn"],
["tour", "stud", "fl"],
]
["tour", "draw", "fl"],
["tour", "draw", "pl"],
["tour", "draw", "nl"],
]
def determineGameType(self, handText):
info = {'type':'ring'}
@ -208,7 +213,7 @@ class Fulltilt(HandHistoryConverter):
if not m:
tmp = handText[0:100]
log.error(_("Unable to recognise gametype from: '%s'") % tmp)
log.error(_("determineGameType: Raising FpdbParseError for file '%s'") % self.in_path)
log.error("determineGameType: " + _("Raising FpdbParseError for file '%s'") % self.in_path)
raise FpdbParseError(_("Unable to recognise gametype from: '%s'") % tmp)
mg = m.groupdict()
@ -251,7 +256,7 @@ class Fulltilt(HandHistoryConverter):
info['bb'] = self.Lim_Blinds[bb][1]
except KeyError:
log.error(_("Lim_Blinds has no lookup for '%s'") % mg['BB'])
log.error(_("determineGameType: Raising FpdbParseError"))
log.error("determineGameType: " + _("Raising FpdbParseError"))
raise FpdbParseError(_("Lim_Blinds has no lookup for '%s'") % mg['BB'])
if mg['GAME'] is not None:
@ -369,7 +374,7 @@ class Fulltilt(HandHistoryConverter):
if plist == {}:
#No players! The hand is either missing stacks or everyone is sitting out
raise FpdbParseError(_("FTP: readPlayerStacks: No players detected (hand #%s)") % hand.handid)
raise FpdbParseError(_("readPlayerStacks: No players detected (hand #%s)") % hand.handid)
def markStreets(self, hand):
@ -441,7 +446,7 @@ class Fulltilt(HandHistoryConverter):
hand.buttonpos = int(self.re_Button.search(hand.handText).group('BUTTON'))
except AttributeError, e:
# FTP has no indication that a hand is cancelled.
raise FpdbParseError(_("FTP: readButton: Failed to detect button (hand #%s cancelled?)") % hand.handid)
raise FpdbParseError(_("readButton: Failed to detect button (hand #%s cancelled?)") % hand.handid)
def readHeroCards(self, hand):
# streets PREFLOP, PREDRAW, and THIRD are special cases beacause
@ -499,7 +504,7 @@ class Fulltilt(HandHistoryConverter):
elif action.group('ATYPE') == ' stands pat':
hand.addStandsPat( street, action.group('PNAME'), action.group('CARDS'))
else:
print _("FullTilt: DEBUG: unimplemented readAction: '%s' '%s'") %(action.group('PNAME'),action.group('ATYPE'),)
print (_("DEBUG: ") + " " + _("Unimplemented readAction: '%s' '%s'") % (action.group('PNAME'), action.group('ATYPE')))
def readShowdownActions(self, hand):
@ -776,7 +781,7 @@ class Fulltilt(HandHistoryConverter):
tourney.addPlayer(rank, a.group('PNAME'), winnings, "USD", 0, 0, 0) #TODO: make it store actual winnings currency
else:
print (_("FullTilt: Player finishing stats unreadable : %s") % a)
print (_("Player finishing stats unreadable : %s") % a)
# Find Hero
n = self.re_TourneyHeroFinishingP.search(playersText)
@ -785,9 +790,9 @@ class Fulltilt(HandHistoryConverter):
tourney.hero = heroName
# Is this really useful ?
if heroName not in tourney.ranks:
print (_("FullTilt: %s not found in tourney.ranks ...") % heroName)
print (_("%s not found in tourney.ranks ...") % heroName)
elif (tourney.ranks[heroName] != Decimal(n.group('HERO_FINISHING_POS'))):
print (_("FullTilt: Bad parsing : finish position incoherent : %s / %s") % (tourney.ranks[heroName], n.group('HERO_FINISHING_POS')))
print (_("Bad parsing : finish position incoherent : %s / %s") % (tourney.ranks[heroName], n.group('HERO_FINISHING_POS')))
return True

2
pyfpdb/GuiImapFetcher.py

@ -107,7 +107,7 @@ class GuiImapFetcher (threading.Thread):
def displayConfig(self):
box=gtk.HBox(homogeneous=True)
for text in (_("Site"), _("Fetch Type"), _("Mailserver"), _("Username"), _("Password"), _("Mail Folder"), _("Use SSL")):
for text in (_("Site"), _("Fetch Type"), _("Mail Server"), _("Username"), _("Password"), _("Mail Folder"), _("Use SSL")):
label=gtk.Label(text)
box.add(label)
self.mainVBox.pack_start(box, expand=False)

4
pyfpdb/OnGameToFpdb.py

@ -161,7 +161,7 @@ class OnGame(HandHistoryConverter):
if not m:
tmp = handText[0:100]
log.error(_("Unable to recognise gametype from: '%s'") % tmp)
log.error(_("determineGameType: Raising FpdbParseError"))
log.error("determineGameType: " + _("Raising FpdbParseError"))
raise FpdbParseError(_("Unable to recognise gametype from: '%s'") % tmp)
mg = m.groupdict()
@ -180,7 +180,7 @@ class OnGame(HandHistoryConverter):
else:
tmp = handText[0:100]
log.error(_("limit not found in self.limits(%s). hand: '%s'") % (str(mg),tmp))
log.error(_("determineGameType: Raising FpdbParseError"))
log.error("determineGameType: " + _("Raising FpdbParseError"))
raise FpdbParseError(_("limit not found in self.limits(%s). hand: '%s'") % (str(mg),tmp))
if 'GAME' in mg:
(info['base'], info['category']) = self.games[mg['GAME']]

8
pyfpdb/PacificPokerToFpdb.py

@ -171,7 +171,7 @@ class PacificPoker(HandHistoryConverter):
if not m:
tmp = handText[0:120]
log.error(_("Unable to recognise gametype from: '%s'") % tmp)
log.error(_("determineGameType: Raising FpdbParseError"))
log.error("determineGameType: " + _("Raising FpdbParseError"))
raise FpdbParseError(_("Unable to recognise gametype from: '%s'") % tmp)
mg = m.groupdict()
@ -202,7 +202,7 @@ class PacificPoker(HandHistoryConverter):
info['bb'] = self.Lim_Blinds[mg['BB']][1]
except KeyError:
log.error(_("Lim_Blinds has no lookup for '%s'") % mg['BB'])
log.error(_("determineGameType: Raising FpdbParseError"))
log.error("determineGameType: " + _("Raising FpdbParseError"))
raise FpdbParseError(_("Lim_Blinds has no lookup for '%s'") % mg['BB'])
return info
@ -255,7 +255,7 @@ class PacificPoker(HandHistoryConverter):
hand.buyinCurrency="PSFP"
else:
#FIXME: handle other currencies, FPP, play money
raise FpdbParseError(_("Failed to detect currency. Hand ID: %s: '%s'") % (hand.handid, info[key]))
raise FpdbParseError(_("Failed to detect currency.") + " " + _("Hand ID: %s: '%s'") % (hand.handid, info[key]))
info['BIAMT'] = info['BIAMT'].strip(u'$€FPP')
@ -426,7 +426,7 @@ class PacificPoker(HandHistoryConverter):
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'),)
print (_("DEBUG: ") + _("Unimplemented readAction: '%s' '%s'") % (action.group('PNAME'), action.group('ATYPE')))
def readShowdownActions(self, hand):

8
pyfpdb/PartyPokerToFpdb.py

@ -195,7 +195,7 @@ class PartyPoker(HandHistoryConverter):
if m is None:
tmp = handText[0:100]
log.error(_("Unable to recognise gametype from: '%s'") % tmp)
log.error(_("determineGameType: Raising FpdbParseError"))
log.error("determineGameType: " + _("Raising FpdbParseError"))
raise FpdbParseError(_("Unable to recognise gametype from: '%s'") % tmp)
mg = m.groupdict()
@ -345,7 +345,7 @@ class PartyPoker(HandHistoryConverter):
elif info[key].find(u"")!=-1:
hand.buyinCurrency="EUR"
else:
raise FpdbParseError(_("Failed to detect currency. Hand ID: %s: '%s'") % (hand.handid, info[key]))
raise FpdbParseError(_("Failed to detect currency.") + " " + _("Hand ID: %s: '%s'") % (hand.handid, info[key]))
info[key] = info[key].strip(u'$€')
hand.buyin = int(100*Decimal(info[key]))
if key == 'LEVEL':
@ -532,9 +532,7 @@ class PartyPoker(HandHistoryConverter):
elif actionType == 'checks':
hand.addCheck( street, playerName )
else:
raise FpdbParseError(
_("Unimplemented readAction: '%s' '%s'") % (playerName,actionType,),
hid = hand.hid, )
raise FpdbParseError(_("Unimplemented readAction: '%s' '%s'") % (playerName,actionType), hid = hand.hid)
def readShowdownActions(self, hand):
# all action in readShownCards

6
pyfpdb/PkrToFpdb.py

@ -126,7 +126,7 @@ class Pkr(HandHistoryConverter):
if not m:
tmp = handText[0:100]
log.error(_("Unable to recognise gametype from: '%s'") % tmp)
log.error(_("determineGameType: Raising FpdbParseError"))
log.error("determineGameType: " + _("Raising FpdbParseError"))
raise FpdbParseError(_("Unable to recognise gametype from: '%s'") % tmp)
mg = m.groupdict()
@ -151,7 +151,7 @@ class Pkr(HandHistoryConverter):
info['bb'] = self.Lim_Blinds[mg['BB']][1]
except KeyError:
log.error(_("Lim_Blinds has no lookup for '%s'") % mg['BB'])
log.error(_("determineGameType: Raising FpdbParseError"))
log.error("determineGameType: " + _("Raising FpdbParseError"))
raise FpdbParseError(_("Lim_Blinds has no lookup for '%s'") % mg['BB'])
return info
@ -348,7 +348,7 @@ class Pkr(HandHistoryConverter):
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'),)
print (_("DEBUG: ") + _("Unimplemented readAction: '%s' '%s'") % (action.group('PNAME'), action.group('ATYPE')))
def readShowdownActions(self, hand):

8
pyfpdb/PokerStarsSummary.py

@ -78,8 +78,8 @@ class PokerStarsSummary(TourneySummary):
m = self.re_TourneyInfo.search(self.summaryText)
if m == None:
tmp = self.summaryText[0:200]
log.error(_("parseSummary: Unable to recognise Tourney Info: '%s'") % tmp)
log.error(_("parseSummary: Raising FpdbParseError"))
log.error("parseSummary: " + _("Unable to recognise Tourney Info: '%s'") % tmp)
log.error("parseSummary: " + _("Raising FpdbParseError"))
raise FpdbParseError(_("Unable to recognise Tourney Info: '%s'") % tmp)
#print "DEBUG: m.groupdict(): %s" % m.groupdict()
@ -104,8 +104,8 @@ class PokerStarsSummary(TourneySummary):
m = self.re_Currency.search(self.summaryText)
if m == None:
log.error(_("parseSummary: Unable to locate currency"))
log.error(_("parseSummary: Raising FpdbParseError"))
log.error("parseSummary: " + _("Unable to locate currency"))
log.error("parseSummary: " + _("Raising FpdbParseError"))
raise FpdbParseError(_("Unable to locate currency"))
#print "DEBUG: m.groupdict(): %s" % m.groupdict()

10
pyfpdb/PokerStarsToFpdb.py

@ -182,9 +182,9 @@ class PokerStars(HandHistoryConverter):
info = {}
m = self.re_GameInfo.search(handText)
if not m:
tmp = handText[0:100]
tmp = handText[0:150]
log.error(_("Unable to recognise gametype from: '%s'") % tmp)
log.error(_("determineGameType: Raising FpdbParseError"))
log.error("determineGameType: " + _("Raising FpdbParseError"))
raise FpdbParseError(_("Unable to recognise gametype from: '%s'") % tmp)
mg = m.groupdict()
@ -210,7 +210,7 @@ class PokerStars(HandHistoryConverter):
info['bb'] = self.Lim_Blinds[mg['BB']][1]
except KeyError:
log.error(_("Lim_Blinds has no lookup for '%s'") % mg['BB'])
log.error(_("determineGameType: Raising FpdbParseError"))
log.error("determineGameType: " + _("Raising FpdbParseError"))
raise FpdbParseError(_("Lim_Blinds has no lookup for '%s'") % mg['BB'])
return info
@ -263,7 +263,7 @@ class PokerStars(HandHistoryConverter):
hand.buyinCurrency="PSFP"
else:
#FIXME: handle other currencies, play money
raise FpdbParseError(_("Failed to detect currency. Hand ID: %s: '%s'") % (hand.handid, info[key]))
raise FpdbParseError(_("Failed to detect currency.") + " " + _("Hand ID: %s: '%s'") % (hand.handid, info[key]))
info['BIAMT'] = info['BIAMT'].strip(u'$€FPP')
@ -437,7 +437,7 @@ class PokerStars(HandHistoryConverter):
elif action.group('ATYPE') == ' stands pat':
hand.addStandsPat( street, action.group('PNAME'), action.group('CARDS'))
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')))
def readShowdownActions(self, hand):

2
pyfpdb/RushNotesAux.py

@ -243,7 +243,7 @@ class RushNotes(Aux_Window):
c.execute(("SELECT handId, position, startCards, street0Aggr, tableName " +
"FROM Hands, HandsPlayers " +
"WHERE HandsPlayers.handId = Hands.id " +
"AND street0VPI = True " +
"AND street0VPI " +
"AND startCards > 0 " +
"AND playerId = %d " +
"ORDER BY startCards DESC " +

4
pyfpdb/SitenameSummary.py

@ -78,8 +78,8 @@ class Sitename(TourneySummary):
m = self.re_TourneyInfo.search(self.summaryText)
if m == None:
tmp = self.summaryText[0:200]
log.error(_("parseSummary: Unable to recognise Tourney Info: '%s'") % tmp)
log.error(_("parseSummary: Raising FpdbParseError"))
log.error("parseSummary: " + _("Unable to recognise Tourney Info: '%s'") % tmp)
log.error("parseSummary: " + _("Raising FpdbParseError"))
raise FpdbParseError(_("Unable to recognise Tourney Info: '%s'") % tmp)
print "DEBUG: m.groupdict(): %s" % m.groupdict()

6
pyfpdb/TestHandsPlayers.py

@ -380,9 +380,6 @@ def main(argv=None):
for i, site in enumerate(ErrorsList):
totalerrors += ErrorsList[i].errorcount
print "---------------------"
print "Total Errors: %d" % totalerrors
print "---------------------"
for i, site in enumerate(ErrorsList):
ErrorsList[i].print_histogram()
@ -407,6 +404,9 @@ def main(argv=None):
for num, stat in sortedstats:
print "(%3d) : %s" %(num, stat)
print "---------------------"
print "Total Errors: %d" % totalerrors
print "---------------------"
if __name__ == '__main__':
sys.exit(main())

4
pyfpdb/Win2dayToFpdb.py

@ -99,7 +99,7 @@ class Win2day(HandHistoryConverter):
if not m:
tmp = handText[0:1000]
log.error(_("Unable to recognise gametype from: '%s'") % tmp)
log.error(_("determineGameType: Raising FpdbParseError"))
log.error("determineGameType: " + _("Raising FpdbParseError"))
raise FpdbParseError(_("Unable to recognise gametype from: '%s'") % tmp)
mg = m.groupdict()
@ -345,7 +345,7 @@ class Win2day(HandHistoryConverter):
elif action.group('ATYPE') == 'ACTION_STAND':
hand.addStandsPat( street, action.group('PNAME'))
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')))
def readShowdownActions(self, hand):

10
pyfpdb/WinamaxToFpdb.py

@ -170,7 +170,7 @@ class Winamax(HandHistoryConverter):
if not m:
tmp = handText[0:100]
log.error(_("Unable to recognise gametype from: '%s'") % tmp)
log.error(_("determineGameType: Raising FpdbParseError"))
log.error("determineGameType: " + _("Raising FpdbParseError"))
raise FpdbParseError(_("Unable to recognise gametype from: '%s'") % tmp)
mg = m.groupdict()
@ -188,7 +188,7 @@ class Winamax(HandHistoryConverter):
else:
tmp = handText[0:100]
log.error(_("limit not found in self.limits(%s). hand: '%s'") % (str(mg),tmp))
log.error(_("determineGameType: Raising FpdbParseError"))
log.error("determineGameType: " + _("Raising FpdbParseError"))
raise FpdbParseError(_("limit not found in self.limits(%s). hand: '%s'") % (str(mg),tmp))
if 'GAME' in mg:
(info['base'], info['category']) = self.games[mg['GAME']]
@ -260,7 +260,7 @@ class Winamax(HandHistoryConverter):
hand.buyinCurrency="PSFP"
else:
#FIXME: handle other currencies (are there other currencies?)
raise FpdbParseError(_("Failed to detect currency. Hand ID: %s: '%s'") % (hand.handid, info[key]))
raise FpdbParseError(_("Failed to detect currency.") + " " + _("Hand ID: %s: '%s'") % (hand.handid, info[key]))
info['BIAMT'] = info['BIAMT'].strip(u'$€FPP')
@ -403,13 +403,13 @@ class Winamax(HandHistoryConverter):
elif action.group('ATYPE') == ' stands pat':
hand.addStandsPat( street, action.group('PNAME'))
else:
log.fatal(_("DEBUG: ") + _("unimplemented readAction: '%s' '%s'") % (action.group('PNAME'),action.group('ATYPE')))
log.fatal(_("DEBUG: ") + _("Unimplemented readAction: '%s' '%s'") % (action.group('PNAME'), action.group('ATYPE')))
# print "Processed %s"%acts
# print "committed=",hand.pot.committed
def readShowdownActions(self, hand):
for shows in self.re_ShowdownAction.finditer(hand.handText):
log.debug(_("add show actions %s") % shows)
#log.debug(_("add show actions %s") % shows)
cards = shows.group('CARDS')
cards = cards.split(' ')
# print "DEBUG: addShownCards(%s, %s)" %(cards, shows.group('PNAME'))

18
pyfpdb/fpdb.pyw

@ -265,11 +265,16 @@ class fpdb:
dia.set_authors(['Steffen', 'Eratosthenes', 'Carl Gherardi',
'Eric Blade', '_mt', 'sqlcoder', 'Bostik', _('and others')])
dia.set_program_name("Free Poker Database (FPDB)")
db_version = ""
#if self.db is not None:
# db_version = self.db.get_version()
nums = [(_('Operating System'), os.name),
if (os.name=="posix"):
os_text=str(os.uname())
elif (os.name=="nt"):
import platform
os_text=("Windows" + " " + str(platform.win32_ver()))
else:
os_text="Unknown"
nums = [(_('Operating System'), os_text),
('Python', sys.version[0:3]),
('GTK+', '.'.join([str(x) for x in gtk.gtk_version])),
('PyGTK', '.'.join([str(x) for x in gtk.pygtk_version])),
@ -281,7 +286,7 @@ class fpdb:
]
versions = gtk.TextBuffer()
w = 20 # width used for module names and version numbers
versions.set_text('\n'.join([x[0].rjust(w) + ' ' + x[1].ljust(w) for x in nums]))
versions.set_text('\n'.join([x[0].rjust(w) + ': ' + x[1].ljust(w) for x in nums]))
view = gtk.TextView(versions)
view.set_editable(False)
view.set_justification(gtk.JUSTIFY_CENTER)
@ -1221,7 +1226,6 @@ You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt an
self.window.set_icon_from_file('/usr/share/pixmaps/fpdb-cards.png')
else:
self.statusIcon.set_from_stock(gtk.STOCK_HOME)
self.window.set_icon_stock(gtk.STOCK_HOME)
self.statusIcon.set_tooltip("Free Poker Database")
self.statusIcon.connect('activate', self.statusicon_activate)
self.statusMenu = gtk.Menu()

4
pyfpdb/iPokerToFpdb.py

@ -120,7 +120,7 @@ or None if we fail to get the info """
except AttributeError:
tmp = handText[0:100]
log.error(_("Unable to recognise gametype from: '%s'") % tmp)
log.error(_("determineGameType: Raising FpdbParseError"))
log.error("determineGameType: " + _("Raising FpdbParseError"))
raise FpdbParseError(_("Unable to recognise gametype from: '%s'") % tmp)
self.info = {}
@ -258,7 +258,7 @@ or None if we fail to get the info """
#print "DEBUG: addBringIn(%s, %s)" %(action.group('PNAME'), action.group('BET'))
hand.addBringIn(action.group('PNAME'), action.group('BET'))
else:
logging.error(_("Unimplemented readAction: %s") % (ag))
logging.error(_("DEBUG: ") + _("Unimplemented readAction: '%s' '%s'") % (action.group('PNAME'), action.group('ATYPE')))
def readShowdownActions(self, hand):
for shows in self.re_ShowdownAction.finditer(hand.handText):

BIN
pyfpdb/locale/de/LC_MESSAGES/fpdb.mo

Binary file not shown.

BIN
pyfpdb/locale/es/LC_MESSAGES/fpdb.mo

Binary file not shown.

1325
pyfpdb/locale/fpdb-de_DE.po

File diff suppressed because it is too large Load Diff

1090
pyfpdb/locale/fpdb-en_GB.pot

File diff suppressed because it is too large Load Diff

2089
pyfpdb/locale/fpdb-es_ES.po

File diff suppressed because it is too large Load Diff

1619
pyfpdb/locale/fpdb-fr_FR.po

File diff suppressed because it is too large Load Diff

1282
pyfpdb/locale/fpdb-hu_HU.po

File diff suppressed because it is too large Load Diff

4225
pyfpdb/locale/fpdb-it_IT.po

File diff suppressed because it is too large Load Diff

1152
pyfpdb/locale/fpdb-pl_PL.po

File diff suppressed because it is too large Load Diff

4026
pyfpdb/locale/fpdb-pt_BR.po

File diff suppressed because it is too large Load Diff

1778
pyfpdb/locale/fpdb-ru_RU.po

File diff suppressed because it is too large Load Diff

3992
pyfpdb/locale/fpdb-zh_CN.po

File diff suppressed because it is too large Load Diff

BIN
pyfpdb/locale/fr/LC_MESSAGES/fpdb.mo

Binary file not shown.

BIN
pyfpdb/locale/hu/LC_MESSAGES/fpdb.mo

Binary file not shown.

BIN
pyfpdb/locale/it/LC_MESSAGES/fpdb.mo

Binary file not shown.

28
pyfpdb/locale/localise.sh

@ -5,26 +5,42 @@ echo "creating template po file"
python /usr/share/doc/python-2.*/examples/Tools/i18n/pygettext.py --output-dir=locale --default-domain=fpdb --output=fpdb-en_GB.pot *.py *.pyw
echo "merging template with existing translations"
#msgmerge --update locale/fpdb-.po locale/fpdb-en_GB.pot
msgmerge --update locale/fpdb-de_DE.po locale/fpdb-en_GB.pot
msgmerge --update locale/fpdb-es_ES.po locale/fpdb-en_GB.pot
msgmerge --update locale/fpdb-fr_FR.po locale/fpdb-en_GB.pot
msgmerge --update locale/fpdb-hu_HU.po locale/fpdb-en_GB.pot
msgmerge --update locale/fpdb-it_IT.po locale/fpdb-en_GB.pot
msgmerge --update locale/fpdb-pl_PL.po locale/fpdb-en_GB.pot
msgmerge --update locale/fpdb-pt_BR.po locale/fpdb-en_GB.pot
msgmerge --update locale/fpdb-ru_RU.po locale/fpdb-en_GB.pot
msgmerge --update locale/fpdb-zh_CN.po locale/fpdb-en_GB.pot
msgfmt -c locale/fpdb-de_DE.po
msgfmt -c locale/fpdb-es_ES.po
msgfmt -c locale/fpdb-fr_FR.po
msgfmt -c locale/fpdb-hu_HU.po
msgfmt -c locale/fpdb-pl_PL.po
msgfmt -c locale/fpdb-ru_RU.po
echo "checking translated files"
#msgfmt -c --check-accelerators locale/fpdb-.po
msgfmt -c --check-accelerators locale/fpdb-de_DE.po
msgfmt -c --check-accelerators locale/fpdb-es_ES.po
msgfmt -c --check-accelerators locale/fpdb-fr_FR.po
msgfmt -c --check-accelerators locale/fpdb-hu_HU.po
msgfmt -c --check-accelerators locale/fpdb-it_IT.po
msgfmt -c --check-accelerators locale/fpdb-pl_PL.po
msgfmt -c --check-accelerators locale/fpdb-pt_BR.po
msgfmt -c --check-accelerators locale/fpdb-ru_RU.po
msgfmt -c --check-accelerators locale/fpdb-zh_CN.po
echo "check the following output for misplaced \\\\"
grep "[\\][\\]" locale/*.po
echo "compiling mo files"
#python /usr/share/doc/python-2.*/examples/Tools/i18n/msgfmt.py --output-file=locale//LC_MESSAGES/fpdb.mo locale/fpdb-.po
python /usr/share/doc/python-2.*/examples/Tools/i18n/msgfmt.py --output-file=locale/de/LC_MESSAGES/fpdb.mo locale/fpdb-de_DE.po
python /usr/share/doc/python-2.*/examples/Tools/i18n/msgfmt.py --output-file=locale/es/LC_MESSAGES/fpdb.mo locale/fpdb-es_ES.po
python /usr/share/doc/python-2.*/examples/Tools/i18n/msgfmt.py --output-file=locale/fr/LC_MESSAGES/fpdb.mo locale/fpdb-fr_FR.po
python /usr/share/doc/python-2.*/examples/Tools/i18n/msgfmt.py --output-file=locale/hu/LC_MESSAGES/fpdb.mo locale/fpdb-hu_HU.po
python /usr/share/doc/python-2.*/examples/Tools/i18n/msgfmt.py --output-file=locale/it/LC_MESSAGES/fpdb.mo locale/fpdb-it_IT.po
python /usr/share/doc/python-2.*/examples/Tools/i18n/msgfmt.py --output-file=locale/pl/LC_MESSAGES/fpdb.mo locale/fpdb-pl_PL.po
python /usr/share/doc/python-2.*/examples/Tools/i18n/msgfmt.py --output-file=locale/pt/LC_MESSAGES/fpdb.mo locale/fpdb-pt_BR.po
python /usr/share/doc/python-2.*/examples/Tools/i18n/msgfmt.py --output-file=locale/ru/LC_MESSAGES/fpdb.mo locale/fpdb-ru_RU.po
python /usr/share/doc/python-2.*/examples/Tools/i18n/msgfmt.py --output-file=locale/zh/LC_MESSAGES/fpdb.mo locale/fpdb-zh_CN.po
pocount locale/*.po

BIN
pyfpdb/locale/pl/LC_MESSAGES/fpdb.mo

Binary file not shown.

BIN
pyfpdb/locale/pt/LC_MESSAGES/fpdb.mo

Binary file not shown.

BIN
pyfpdb/locale/ru/LC_MESSAGES/fpdb.mo

Binary file not shown.

BIN
pyfpdb/locale/zh/LC_MESSAGES/fpdb.mo

Binary file not shown.

48
pyfpdb/regression-test-files/cash/Everleaf/Flop/NLHE-EUR-0.01-0.02-20091027.partouche

@ -0,0 +1,48 @@
Partouche Poker Gibraltar
*** Historique des Mains pour la partie 25324991 ***
Blinds €0.01/ €0.02 NL Hold'em - 2009/10/27 - 19:04:57
Table Andernos 2
Seat 1 is the button
Total number of players: 6
Seat 1: player1 ( € 0.76 EUR )
Seat 2: player2 ( € 1.83 EUR )
Seat 3: player3 ( € 0.81 EUR )
Seat 4: player4 ( € 2 EUR )
Seat 5: player5 ( € 1.39 EUR )
Seat 6: player6 ( new player )
player2: posts small blind [ € 0.01 EUR]
player3: posts big blind [ € 0.02 EUR]
player4: posts big blind [ € 0.02 EUR]
** Dealing down cards **
Dealt to player4 [ 5s, 4s ]
player4 checks
player5 raises [ € 0.04 EUR]
player1 folds
player2 calls [ € 0.03 EUR]
player3 est déconnecté et dispose de 20 secondes supplémentaires pour agir
player3 calls [ € 0.02 EUR]
player4 calls [ € 0.02 EUR]
** Dealing Flop ** [ Qs, 8s, 7c ]
player3 est déconnecté et dispose de 20 secondes supplémentaires pour agir
player2 checks
player3 est déconnecté et dispose de 20 secondes supplémentaires pour agir
player3 checks
player4: bets [ € 0.08 EUR]
player5 raises [ € 0.16 EUR]
player2 folds
player3 calls [ € 0.16 EUR]
player4 calls [ € 0.08 EUR]
** Dealing Turn ** [ Th ]
player3 checks
player4 checks
player5: bets [ € 0.64 EUR]
player3 folds
player4 calls [ € 0.64 EUR]
** Dealing River ** [ Tc ]
player4: bets [ € 1.16 EUR]
player5 calls [ € 0.55 EUR]
player4 shows [ 5s, 4s ]a pair of tens
player5 shows [ Qh, Ad ]two pairs, queens and tens
player5 wins € 2.72 EUR from main pot with two pairs, queens and tens [ Ad, Qh, Qs, Th, Tc ]

1729
pyfpdb/regression-test-files/cash/Stars/Flop/LHE-10max-USD-0.05-0.10-PF_all_fold_to_BB.txt.0001.sql

File diff suppressed because it is too large Load Diff

126
pyfpdb/regression-test-files/empty_DB.0000.sql

@ -1,126 +0,0 @@
fpdb database dump
DB version=143
###################
Table Autorates
###################
empty table
###################
Table Backings
###################
empty table
###################
Table Gametypes
###################
empty table
###################
Table Hands
###################
empty table
###################
Table HandsActions
###################
empty table
###################
Table HandsPlayers
###################
empty table
###################
Table HudCache
###################
empty table
###################
Table Players
###################
empty table
###################
Table RawHands
###################
empty table
###################
Table RawTourneys
###################
empty table
###################
Table Settings
###################
version=143
###################
Table Sites
###################
id=1
name=Full Tilt Poker
code=FT
id=2
name=PokerStars
code=PS
id=3
name=Everleaf
code=EV
id=4
name=Win2day
code=W2
id=5
name=OnGame
code=OG
id=6
name=UltimateBet
code=UB
id=7
name=Betfair
code=BF
id=8
name=Absolute
code=AB
id=9
name=PartyPoker
code=PP
id=10
name=Partouche
code=PA
id=11
name=Carbon
code=CA
id=12
name=PKR
code=PK
###################
Table TourneyTypes
###################
empty table
###################
Table Tourneys
###################
empty table
###################
Table TourneysPlayers
###################
empty table

19
pyfpdb/regression-test-files/summaries/Stars/NLHE-Play-STT-20110405.txt

@ -0,0 +1,19 @@
PokerStars Tournament #382394766, No Limit Hold'em
Buy-In: 300/20
9 players
Total Prize Pool: 2700
Tournament started 2011/04/05 4:00:18 CET [2011/04/04 22:00:18 ET]
1: ColdChipz (Australia), still playing
2: pokermom2121 (United States), still playing
3: Jerry4rt (United States), still playing
4: scratch228 (United States), still playing
5: steffen780 (Germany),
6: thegoodnews (United States),
7: olii22 (Colombia),
8: LinColn368 (United States),
9: neto coinete (Brazil),
You finished in 5th place (eliminated at hand #60348883363).

3674
pyfpdb/regression-test-files/tour/Stars/Flop/LHE-USD-STT-5-20100607.allInPreflop.txt.0002.sql

File diff suppressed because it is too large Load Diff

381
pyfpdb/regression-test-files/tour/Stars/Flop/NLHE-Play-STT-20110405.txt

@ -0,0 +1,381 @@
PokerStars Game #60348646994: Tournament #382394766, 300+20 Hold'em No Limit - Level I (10/20) - 2011/04/05 4:00:18 CET [2011/04/04 22:00:18 ET]
Table '382394766 1' 9-max Seat #1 is the button
Seat 1: olii22 (1500 in chips)
Seat 2: Jerry4rt (1500 in chips)
Seat 3: pokermom2121 (1500 in chips)
Seat 4: thegoodnews (1500 in chips)
Seat 5: ColdChipz (1500 in chips)
Seat 6: steffen780 (1500 in chips)
Seat 7: neto coinete (1500 in chips)
Seat 8: scratch228 (1500 in chips)
Seat 9: LinColn368 (1500 in chips)
Jerry4rt: posts small blind 10
pokermom2121: posts big blind 20
*** HOLE CARDS ***
Dealt to steffen780 [8h 6s]
thegoodnews: folds
ColdChipz: calls 20
steffen780: folds
neto coinete: raises 80 to 100
scratch228: raises 1400 to 1500 and is all-in
LinColn368: calls 1500 and is all-in
olii22: folds
Jerry4rt: folds
pokermom2121: folds
ColdChipz: folds
neto coinete: calls 1400 and is all-in
*** FLOP *** [3s 4h 7h]
ColdChipz said, "surprise surprise"
*** TURN *** [3s 4h 7h] [2h]
*** RIVER *** [3s 4h 7h 2h] [3h]
*** SHOW DOWN ***
neto coinete: shows [As Kc] (a pair of Threes)
scratch228: shows [Tc Td] (two pair, Tens and Threes)
LinColn368: shows [6c 4c] (two pair, Fours and Threes)
scratch228 collected 4550 from pot
neto coinete finished the tournament in 8th place
LinColn368 finished the tournament in 8th place
*** SUMMARY ***
Total pot 4550 | Rake 0
Board [3s 4h 7h 2h 3h]
Seat 1: olii22 (button) folded before Flop (didn't bet)
Seat 2: Jerry4rt (small blind) folded before Flop
Seat 3: pokermom2121 (big blind) folded before Flop
Seat 4: thegoodnews folded before Flop (didn't bet)
Seat 5: ColdChipz folded before Flop
Seat 6: steffen780 folded before Flop (didn't bet)
Seat 7: neto coinete showed [As Kc] and lost with a pair of Threes
Seat 8: scratch228 showed [Tc Td] and won (4550) with two pair, Tens and Threes
Seat 9: LinColn368 showed [6c 4c] and lost with two pair, Fours and Threes
PokerStars Game #60348679778: Tournament #382394766, 300+20 Hold'em No Limit - Level I (10/20) - 2011/04/05 4:01:29 CET [2011/04/04 22:01:29 ET]
Table '382394766 1' 9-max Seat #2 is the button
Seat 1: olii22 (1500 in chips)
Seat 2: Jerry4rt (1490 in chips)
Seat 3: pokermom2121 (1480 in chips)
Seat 4: thegoodnews (1500 in chips)
Seat 5: ColdChipz (1480 in chips)
Seat 6: steffen780 (1500 in chips)
Seat 8: scratch228 (4550 in chips)
pokermom2121: posts small blind 10
thegoodnews: posts big blind 20
*** HOLE CARDS ***
Dealt to steffen780 [5d 2s]
ColdChipz: folds
steffen780: calls 20
scratch228: raises 100 to 120
olii22: raises 100 to 220
Jerry4rt: folds
pokermom2121: folds
thegoodnews: calls 200
steffen780: folds
scratch228: calls 100
*** FLOP *** [6s 3s 9s]
thegoodnews: checks
scratch228: bets 400
olii22: calls 400
thegoodnews: raises 880 to 1280 and is all-in
scratch228: calls 880
olii22: calls 880 and is all-in
*** TURN *** [6s 3s 9s] [2c]
*** RIVER *** [6s 3s 9s 2c] [5c]
*** SHOW DOWN ***
thegoodnews: shows [8c Js] (high card Jack)
scratch228: shows [6c 6h] (three of a kind, Sixes)
olii22: shows [7h Qc] (high card Queen)
scratch228 collected 4530 from pot
olii22 finished the tournament in 6th place
thegoodnews finished the tournament in 6th place
*** SUMMARY ***
Total pot 4530 | Rake 0
Board [6s 3s 9s 2c 5c]
Seat 1: olii22 showed [7h Qc] and lost with high card Queen
Seat 2: Jerry4rt (button) folded before Flop (didn't bet)
Seat 3: pokermom2121 (small blind) folded before Flop
Seat 4: thegoodnews (big blind) showed [8c Js] and lost with high card Jack
Seat 5: ColdChipz folded before Flop (didn't bet)
Seat 6: steffen780 folded before Flop
Seat 8: scratch228 showed [6c 6h] and won (4530) with three of a kind, Sixes
PokerStars Game #60348723543: Tournament #382394766, 300+20 Hold'em No Limit - Level I (10/20) - 2011/04/05 4:02:51 CET [2011/04/04 22:02:51 ET]
Table '382394766 1' 9-max Seat #3 is the button
Seat 2: Jerry4rt (1490 in chips)
Seat 3: pokermom2121 (1470 in chips)
Seat 5: ColdChipz (1480 in chips)
Seat 6: steffen780 (1480 in chips)
Seat 8: scratch228 (7580 in chips)
ColdChipz: posts small blind 10
steffen780: posts big blind 20
*** HOLE CARDS ***
Dealt to steffen780 [Ac 7s]
scratch228: calls 20
Jerry4rt: folds
pokermom2121: calls 20
ColdChipz: calls 10
steffen780: raises 100 to 120
ColdChipz said, "yep"
scratch228: calls 100
pokermom2121: calls 100
ColdChipz: folds
*** FLOP *** [5d Ks 3h]
steffen780: checks
scratch228: checks
pokermom2121: checks
*** TURN *** [5d Ks 3h] [Kd]
steffen780: bets 220
scratch228: calls 220
pokermom2121: calls 220
*** RIVER *** [5d Ks 3h Kd] [Tc]
steffen780: bets 1140 and is all-in
scratch228: folds
pokermom2121: calls 1130 and is all-in
Uncalled bet (10) returned to steffen780
*** SHOW DOWN ***
steffen780: shows [Ac 7s] (a pair of Kings)
pokermom2121: shows [7h Kc] (three of a kind, Kings)
pokermom2121 collected 3300 from pot
*** SUMMARY ***
Total pot 3300 | Rake 0
Board [5d Ks 3h Kd Tc]
Seat 2: Jerry4rt folded before Flop (didn't bet)
Seat 3: pokermom2121 (button) showed [7h Kc] and won (3300) with three of a kind, Kings
Seat 5: ColdChipz (small blind) folded before Flop
Seat 6: steffen780 (big blind) showed [Ac 7s] and lost with a pair of Kings
Seat 8: scratch228 folded on the River
PokerStars Game #60348767993: Tournament #382394766, 300+20 Hold'em No Limit - Level I (10/20) - 2011/04/05 4:04:11 CET [2011/04/04 22:04:11 ET]
Table '382394766 1' 9-max Seat #5 is the button
Seat 2: Jerry4rt (1490 in chips)
Seat 3: pokermom2121 (3300 in chips)
Seat 5: ColdChipz (1460 in chips)
Seat 6: steffen780 (10 in chips)
Seat 8: scratch228 (7240 in chips)
steffen780: posts small blind 10 and is all-in
scratch228: posts big blind 20
*** HOLE CARDS ***
Dealt to steffen780 [2s Ks]
Jerry4rt: raises 400 to 420
pokermom2121: calls 420
ColdChipz: folds
scratch228: folds
*** FLOP *** [Kd 4s 7s]
Jerry4rt: bets 1070 and is all-in
pokermom2121: folds
Uncalled bet (1070) returned to Jerry4rt
*** TURN *** [Kd 4s 7s] [8d]
*** RIVER *** [Kd 4s 7s 8d] [8h]
*** SHOW DOWN ***
Jerry4rt: shows [Td Ts] (two pair, Tens and Eights)
Jerry4rt collected 830 from side pot
steffen780: shows [2s Ks] (two pair, Kings and Eights)
steffen780 collected 40 from main pot
*** SUMMARY ***
Total pot 870 Main pot 40. Side pot 830. | Rake 0
Board [Kd 4s 7s 8d 8h]
Seat 2: Jerry4rt showed [Td Ts] and won (830) with two pair, Tens and Eights
Seat 3: pokermom2121 folded on the Flop
Seat 5: ColdChipz (button) folded before Flop (didn't bet)
Seat 6: steffen780 (small blind) showed [2s Ks] and won (40) with two pair, Kings and Eights
Seat 8: scratch228 (big blind) folded before Flop
PokerStars Game #60348792090: Tournament #382394766, 300+20 Hold'em No Limit - Level I (10/20) - 2011/04/05 4:04:54 CET [2011/04/04 22:04:54 ET]
Table '382394766 1' 9-max Seat #6 is the button
Seat 2: Jerry4rt (1900 in chips)
Seat 3: pokermom2121 (2880 in chips)
Seat 5: ColdChipz (1460 in chips)
Seat 6: steffen780 (40 in chips)
Seat 8: scratch228 (7220 in chips)
scratch228: posts small blind 10
Jerry4rt: posts big blind 20
*** HOLE CARDS ***
Dealt to steffen780 [Js Kh]
pokermom2121: folds
ColdChipz: calls 20
steffen780: raises 20 to 40 and is all-in
scratch228: calls 30
Jerry4rt: calls 20
ColdChipz: calls 20
*** FLOP *** [7s 8c Kc]
scratch228: checks
Jerry4rt: checks
ColdChipz: checks
*** TURN *** [7s 8c Kc] [Ks]
scratch228: checks
Jerry4rt: bets 200
ColdChipz: folds
scratch228: folds
Uncalled bet (200) returned to Jerry4rt
*** RIVER *** [7s 8c Kc Ks] [Td]
*** SHOW DOWN ***
Jerry4rt: shows [5s 5d] (two pair, Kings and Fives)
steffen780: shows [Js Kh] (three of a kind, Kings)
steffen780 collected 160 from pot
*** SUMMARY ***
Total pot 160 | Rake 0
Board [7s 8c Kc Ks Td]
Seat 2: Jerry4rt (big blind) showed [5s 5d] and lost with two pair, Kings and Fives
Seat 3: pokermom2121 folded before Flop (didn't bet)
Seat 5: ColdChipz folded on the Turn
Seat 6: steffen780 (button) showed [Js Kh] and won (160) with three of a kind, Kings
Seat 8: scratch228 (small blind) folded on the Turn
PokerStars Game #60348824266: Tournament #382394766, 300+20 Hold'em No Limit - Level I (10/20) - 2011/04/05 4:05:51 CET [2011/04/04 22:05:51 ET]
Table '382394766 1' 9-max Seat #8 is the button
Seat 2: Jerry4rt (1860 in chips)
Seat 3: pokermom2121 (2880 in chips)
Seat 5: ColdChipz (1420 in chips)
Seat 6: steffen780 (160 in chips)
Seat 8: scratch228 (7180 in chips)
Jerry4rt: posts small blind 10
pokermom2121: posts big blind 20
*** HOLE CARDS ***
Dealt to steffen780 [Th 8s]
ColdChipz: folds
steffen780: raises 140 to 160 and is all-in
scratch228: folds
Jerry4rt: folds
pokermom2121: calls 140
*** FLOP *** [Qd 8h 8c]
*** TURN *** [Qd 8h 8c] [Ad]
*** RIVER *** [Qd 8h 8c Ad] [7h]
*** SHOW DOWN ***
pokermom2121: shows [4s Ks] (a pair of Eights)
steffen780: shows [Th 8s] (three of a kind, Eights)
steffen780 collected 330 from pot
*** SUMMARY ***
Total pot 330 | Rake 0
Board [Qd 8h 8c Ad 7h]
Seat 2: Jerry4rt (small blind) folded before Flop
Seat 3: pokermom2121 (big blind) showed [4s Ks] and lost with a pair of Eights
Seat 5: ColdChipz folded before Flop (didn't bet)
Seat 6: steffen780 showed [Th 8s] and won (330) with three of a kind, Eights
Seat 8: scratch228 (button) folded before Flop (didn't bet)
PokerStars Game #60348839497: Tournament #382394766, 300+20 Hold'em No Limit - Level I (10/20) - 2011/04/05 4:06:18 CET [2011/04/04 22:06:18 ET]
Table '382394766 1' 9-max Seat #2 is the button
Seat 2: Jerry4rt (1850 in chips)
Seat 3: pokermom2121 (2720 in chips)
Seat 5: ColdChipz (1420 in chips)
Seat 6: steffen780 (330 in chips)
Seat 8: scratch228 (7180 in chips)
pokermom2121: posts small blind 10
ColdChipz: posts big blind 20
*** HOLE CARDS ***
Dealt to steffen780 [8c 6c]
steffen780: raises 310 to 330 and is all-in
scratch228: calls 330
Jerry4rt: folds
pokermom2121: folds
ColdChipz: folds
*** FLOP *** [Jc 5s 7c]
*** TURN *** [Jc 5s 7c] [Qd]
*** RIVER *** [Jc 5s 7c Qd] [6s]
*** SHOW DOWN ***
steffen780: shows [8c 6c] (a pair of Sixes)
scratch228: shows [Tc Kc] (high card King)
steffen780 collected 690 from pot
*** SUMMARY ***
Total pot 690 | Rake 0
Board [Jc 5s 7c Qd 6s]
Seat 2: Jerry4rt (button) folded before Flop (didn't bet)
Seat 3: pokermom2121 (small blind) folded before Flop
Seat 5: ColdChipz (big blind) folded before Flop
Seat 6: steffen780 showed [8c 6c] and won (690) with a pair of Sixes
Seat 8: scratch228 showed [Tc Kc] and lost with high card King
PokerStars Game #60348854448: Tournament #382394766, 300+20 Hold'em No Limit - Level I (10/20) - 2011/04/05 4:06:45 CET [2011/04/04 22:06:45 ET]
Table '382394766 1' 9-max Seat #3 is the button
Seat 2: Jerry4rt (1850 in chips)
Seat 3: pokermom2121 (2710 in chips)
Seat 5: ColdChipz (1400 in chips)
Seat 6: steffen780 (690 in chips)
Seat 8: scratch228 (6850 in chips)
ColdChipz: posts small blind 10
steffen780: posts big blind 20
*** HOLE CARDS ***
Dealt to steffen780 [4d 2h]
scratch228: folds
Jerry4rt: folds
pokermom2121: calls 20
ColdChipz: calls 10
steffen780: checks
*** FLOP *** [Kh Kd Kc]
ColdChipz: checks
steffen780: checks
pokermom2121: checks
*** TURN *** [Kh Kd Kc] [8c]
ColdChipz: checks
steffen780: checks
pokermom2121: bets 140
ColdChipz: calls 140
steffen780: calls 140
*** RIVER *** [Kh Kd Kc 8c] [Ts]
ColdChipz: checks
steffen780: checks
pokermom2121: checks
*** SHOW DOWN ***
ColdChipz: shows [7d Ac] (three of a kind, Kings)
steffen780: mucks hand
pokermom2121: shows [9c 8s] (a full house, Kings full of Eights)
pokermom2121 collected 480 from pot
*** SUMMARY ***
Total pot 480 | Rake 0
Board [Kh Kd Kc 8c Ts]
Seat 2: Jerry4rt folded before Flop (didn't bet)
Seat 3: pokermom2121 (button) showed [9c 8s] and won (480) with a full house, Kings full of Eights
Seat 5: ColdChipz (small blind) showed [7d Ac] and lost with three of a kind, Kings
Seat 6: steffen780 (big blind) mucked [4d 2h]
Seat 8: scratch228 folded before Flop (didn't bet)
PokerStars Game #60348883363: Tournament #382394766, 300+20 Hold'em No Limit - Level I (10/20) - 2011/04/05 4:07:37 CET [2011/04/04 22:07:37 ET]
Table '382394766 1' 9-max Seat #5 is the button
Seat 2: Jerry4rt (1850 in chips)
Seat 3: pokermom2121 (3030 in chips)
Seat 5: ColdChipz (1240 in chips)
Seat 6: steffen780 (530 in chips)
Seat 8: scratch228 (6850 in chips)
steffen780: posts small blind 10
scratch228: posts big blind 20
*** HOLE CARDS ***
Dealt to steffen780 [As Qs]
Jerry4rt: folds
pokermom2121: folds
ColdChipz: calls 20
steffen780: raises 510 to 530 and is all-in
scratch228: folds
ColdChipz: calls 510
*** FLOP *** [3d Tc 7s]
*** TURN *** [3d Tc 7s] [2h]
*** RIVER *** [3d Tc 7s 2h] [4s]
*** SHOW DOWN ***
steffen780: shows [As Qs] (high card Ace)
ColdChipz: shows [7c Ad] (a pair of Sevens)
ColdChipz collected 1080 from pot
steffen780 finished the tournament in 5th place
*** SUMMARY ***
Total pot 1080 | Rake 0
Board [3d Tc 7s 2h 4s]
Seat 2: Jerry4rt folded before Flop (didn't bet)
Seat 3: pokermom2121 folded before Flop (didn't bet)
Seat 5: ColdChipz (button) showed [7c Ad] and won (1080) with a pair of Sevens
Seat 6: steffen780 (small blind) showed [As Qs] and lost with high card Ace
Seat 8: scratch228 (big blind) folded before Flop

288
pyfpdb/regression-test-files/unsupported-sites/entraction/HandHistoryIndex.txt

@ -0,0 +1,288 @@
2137865906:35129644
2137866285:35129644
2137866663:35129644
2137870973:35129644
2137871766:35134072
2137871297:35129644
2137872103:35134072
2137871605:35129644
2137872595:35134072
2137875811:35129644
2137875860:35135862
2137873579:35132513
2137876905:35134072
2137876144:35129644
2137876304:35135862
2137877295:35134072
2137876333:35125878
2137876536:35129644
2137877928:35132513
2137877564:35134072
2137878328:35132513
2137879861:35129644
2137879886:35125878
2137881190:35124993
2137878558:35132513
2137879970:35135862
2137880240:35125878
2137880794:35134072
2137880410:35135862
2137880231:35129644
2137881290:35124993
2137882780:35132513
2137881406:35134072
2137881679:35134072
2137880464:35125878
2137880727:35129644
2137881626:35124993
2137880704:35135862
2137883876:35125878
2137884785:35134072
2137883993:35129644
2137883139:35132513
2137884961:35124993
2137884221:35135862
2137885174:35134072
2137884365:35129644
2137885400:35134072
2137883628:35132513
2137884472:35135862
2137884196:35125878
2137885347:35124993
2137885725:35134072
2137886946:35132513
2137887899:35135862
2137884723:35129644
2137889992:35124993
2137887205:35132513
2137887352:35132513
2137890172:35134072
2137888240:35129644
2137890469:35134072
2137888228:35135862
2137890574:35134072
2137890313:35124993
2137887389:35132513
2137888461:35129644
2137890639:35134072
2137890809:35124993
2137891798:35129644
2137893735:35132513
2137888599:35135862
2137890884:35134072
2137891075:35124993
2137892026:35129644
2137891456:35134072
2137892446:35129644
2137892247:35135862
2137894197:35131702
2137891445:35124993
2137894058:35132513
2137896843:35124993
2137894457:35131702
2137891555:35134072
2137897773:35129644
2137897740:35135862
2137894547:35132513
2137894631:35131702
2137896932:35124993
2137897044:35134072
2137894729:35132513
2137897392:35134072
2137898016:35129644
2137898913:35132513
2137897466:35134072
2137898774:35131702
2137897328:35124993
2137898079:35135862
2137898413:35129644
2137897728:35124993
2137899017:35132513
2137899072:35131702
2137897590:35134072
2137898640:35135862
2137898682:35129644
2137899820:35124993
2137899323:35131702
2137900225:35124993
2137899379:35132513
2137899994:35134072
2137900410:35134072
2137900360:35124993
2137900997:35135862
2137900613:35124993
2137901078:35129644
2137900503:35134072
2137899716:35132513
2137901536:35129644
2137901493:35135862
2137900671:35124993
2137899674:35131702
2137905742:35134072
2137905028:35132513
2137906011:35134072
2137906110:35134072
2137905180:35131702
2137906194:35134072
2137905268:35132513
2137901646:35129644
2137906306:35134072
2137905426:35132513
2137901693:35135862
2137905979:35124993
2137906407:35134072
2137907083:35129644
2137906451:35124993
2137906504:35134072
2137907200:35135862
2137906693:35134072
2137905419:35131702
2137907278:35129644
2137905538:35132513
2137906618:35124993
2137911790:35134072
2137911910:35124993
2137907478:35135862
2137910856:35131702
2137910932:35132513
2137907595:35129644
2137911986:35124993
2137907707:35135862
2137911971:35134072
2137913922:35129644
2137912286:35134072
2137911090:35131702
2137912502:35134072
2137911226:35132513
2137913947:35135862
2137912590:35134072
2137911581:35132513
2137912240:35124993
2137914142:35129644
2137911633:35132513
2137912681:35134072
2137911470:35131702
2137914295:35135862
2137914798:35124993
2137914936:35134072
2137915764:35132513
2137914494:35129644
2137915057:35134072
2137916021:35132513
2137914624:35135862
2137915017:35124993
2137915868:35131702
2137916208:35132513
2137917880:35129644
2137915297:35134072
2137918014:35135862
2137915612:35134072
2137915423:35124993
2137916302:35131702
2137918193:35129644
2137915700:35134072
2137916618:35131702
2137916377:35132513
2137918296:35135862
2137918531:35129644
2137922085:35134072
2137922912:35131702
2137921772:35124993
2137918702:35135862
2137922377:35124993
2137922268:35134072
2137923085:35131702
2137922529:35134072
2137923949:35135862
2137923777:35129644
2137922927:35132513
2137923379:35131702
2137922678:35134072
2137923575:35131702
2137924196:35135862
2137923428:35132513
2137923651:35131702
2137926879:35131702
2137924232:35129644
2137924970:35134072
2137922524:35124993
2137926868:35132513
2137925462:35134072
2137926921:35131702
2137924592:35135862
2137927833:35129644
2137925433:35124993
2137927144:35131702
2137927069:35132513
2137927391:35131702
2137925533:35134072
2137928074:35135862
2137929945:35134072
2137927474:35131702
2137930036:35134072
2137929754:35124993
2137927470:35132513
2137928281:35129644
2137930113:35134072
2137930781:35132513
2137928489:35135862
2137927663:35131702
2137930118:35124993
2137928701:35129644
2137930949:35132513
2137930313:35134072
2137931072:35131702
2137930640:35124993
2137931898:35135862
2137931205:35132513
2137934771:35124993
2137930652:35134072
2137934890:35124993
2137934990:35124993
2137932103:35129644
2137932326:35135862
2137934951:35134072
2137935031:35124993
2137931321:35131702
2137931420:35132513
2137935162:35124993
2137932614:35129644
2137935292:35124993
2137935148:35134072
2137935475:35124993
2137936812:35132513
2137932612:35135862
2137935560:35124993
2137936806:35131702
2137937090:35132513
2137935478:35134072
2137935641:35124993
2137935927:35129644
2137937188:35131702
2137937250:35132513
2137940806:35124993
2137936192:35135862
2137936484:35129644
2137941010:35124993
2137940802:35134072
2137937476:35131702
2137936697:35135862
2137937492:35132513
2137941174:35124993
2137944960:35135862
2137937697:35131702
2137944843:35129644
2137941177:35134072
2137946897:35132513
2137947029:35131702
2137941442:35124993
2137941580:35134072
2137945234:35135862
2137945289:35129644
2137947158:35132513
2137948842:35134072
2137947161:35131702
2137941705:35124993
2137949017:35134072
2137947446:35132513
2137947521:35131702

1842
pyfpdb/regression-test-files/unsupported-sites/entraction/Table_35124993.txt

File diff suppressed because it is too large Load Diff

258
pyfpdb/regression-test-files/unsupported-sites/entraction/Table_35125878.txt

@ -0,0 +1,258 @@
Game # 2137876333 - Omaha High Pot Limit EUR 0.02/0.04 - Table "Chikumi"
Players(max 6):
LihavaLapsi (EUR 2.08 in seat 1)
kikekake (EUR 2.15 in seat 2)
RealFish82 (EUR 4.00 in seat 3)
lukasp2 (EUR 2.30 in seat 4)
F4UXR34L (EUR 4.00 in seat 5)
ditemelovoi (EUR 10.44 in seat 6)
Dealer: RealFish82
Small Blind: lukasp2 (0.02)
Big Blind: F4UXR34L (0.04)
F4UXR34L was dealt: 8s - Qd - 3d - 5c
ditemelovoi Call (0.04)
LihavaLapsi Raise (0.18)
kikekake Fold
RealFish82 Fold
lukasp2 Fold
F4UXR34L Fold
ditemelovoi Call (0.14)
Flop Kh - 6d - 3c
ditemelovoi Check
LihavaLapsi Bet (0.36)
ditemelovoi Raise (1.50)
LihavaLapsi All-In (1.54)
ditemelovoi Call (0.40)
Turn Kh - 6d - 3c - Jh
River Kh - 6d - 3c - Jh - 7d
ditemelovoi shows: Th - Jd - Kd - 8h (two pairs, Kings and Jacks)
LihavaLapsi shows: Kc - 9h - Ad - Ts (a pair of Kings)
ditemelovoi wins: EUR 4.01 (with two pairs, Kings and Jacks)
Rake: EUR 0.21
Game ended 2011-03-21 16:44:53 GMT
Game # 2137879886 - Omaha High Pot Limit EUR 0.02/0.04 - Table "Chikumi"
Players(max 6):
LihavaLapsi (EUR 4.00 in seat 1)
kikekake (EUR 2.15 in seat 2)
RealFish82 (EUR 4.00 in seat 3)
lukasp2 (EUR 2.28 in seat 4)
F4UXR34L (EUR 3.96 in seat 5)
ditemelovoi (EUR 12.37 in seat 6)
Dealer: lukasp2
Small Blind: F4UXR34L (0.02)
Big Blind: ditemelovoi (0.04)
F4UXR34L was dealt: Td - 5h - Kc - 3d
LihavaLapsi Fold
kikekake Fold
RealFish82 Fold
lukasp2 Raise (0.14)
F4UXR34L Fold
ditemelovoi Call (0.10)
Flop Qs - 4c - Jh
ditemelovoi Check
lukasp2 Bet (0.22)
ditemelovoi Raise (0.96)
lukasp2 Fold
ditemelovoi Payback (0.74)
ditemelovoi didn't show hand
ditemelovoi wins: EUR 0.71
Rake: EUR 0.03
Game ended 2011-03-21 16:46:00 GMT
Game # 2137880240 - Omaha High Pot Limit EUR 0.02/0.04 - Table "Chikumi"
Players(max 6):
LihavaLapsi (EUR 4.00 in seat 1)
kikekake (EUR 2.15 in seat 2)
RealFish82 (EUR 4.00 in seat 3)
lukasp2 (EUR 1.92 in seat 4)
F4UXR34L (EUR 4.00 in seat 5)
ditemelovoi (EUR 12.72 in seat 6)
Dealer: F4UXR34L
Small Blind: ditemelovoi (0.02)
Big Blind: LihavaLapsi (0.04)
F4UXR34L was dealt: 8s - 5c - 8c - 6d
kikekake Raise (0.14)
RealFish82 Fold
lukasp2 Fold
F4UXR34L Fold
ditemelovoi Call (0.12)
LihavaLapsi Call (0.10)
Flop 6h - Js - 5s
ditemelovoi Check
LihavaLapsi Check
kikekake Bet (0.42)
ditemelovoi Fold
LihavaLapsi Fold
kikekake Payback (0.42)
kikekake didn't show hand
kikekake wins: EUR 0.40
Rake: EUR 0.02
Game ended 2011-03-21 16:46:39 GMT
Game # 2137880464 - Omaha High Pot Limit EUR 0.02/0.04 - Table "Chikumi"
Players(max 6):
LihavaLapsi (EUR 3.86 in seat 1)
kikekake (EUR 2.41 in seat 2)
RealFish82 (EUR 4.00 in seat 3)
lukasp2 (EUR 1.92 in seat 4)
F4UXR34L (EUR 4.00 in seat 5)
ditemelovoi (EUR 12.58 in seat 6)
Dealer: ditemelovoi
Small Blind: LihavaLapsi (0.02)
Big Blind: kikekake (0.04)
F4UXR34L was dealt: 3s - 7h - Th - Jc
RealFish82 Fold
lukasp2 Raise (0.14)
F4UXR34L Fold
ditemelovoi Call (0.14)
LihavaLapsi Fold
kikekake Call (0.10)
Flop 2h - 8d - 8s
kikekake Check
lukasp2 Check
ditemelovoi Bet (0.44)
kikekake Fold
lukasp2 Fold
ditemelovoi Payback (0.44)
ditemelovoi didn't show hand
ditemelovoi wins: EUR 0.42
Rake: EUR 0.02
Game ended 2011-03-21 16:47:45 GMT
Game # 2137883876 - Omaha High Pot Limit EUR 0.02/0.04 - Table "Chikumi"
Players(max 6):
LihavaLapsi (EUR 3.84 in seat 1)
kikekake (EUR 2.27 in seat 2)
RealFish82 (EUR 4.00 in seat 3)
lukasp2 (EUR 1.78 in seat 4)
F4UXR34L (EUR 4.00 in seat 5)
ditemelovoi (EUR 12.86 in seat 6)
Dealer: LihavaLapsi
Small Blind: kikekake (0.02)
Big Blind: RealFish82 (0.04)
F4UXR34L was dealt: 3c - Ah - 4s - 9c
lukasp2 Fold
F4UXR34L Fold
ditemelovoi Fold
LihavaLapsi Fold
kikekake Call (0.02)
RealFish82 Check
Flop 7s - 5s - Jd
kikekake Bet (0.04)
RealFish82 Call (0.04)
Turn 7s - 5s - Jd - As
kikekake Bet (0.16)
RealFish82 Call (0.16)
River 7s - 5s - Jd - As - 6s
kikekake Bet (0.48)
RealFish82 Call (0.48)
kikekake shows: Js - 3d - 3s - Jc (a flush, Ace high)
RealFish82 shows: 9s - Qs - 2c - 5d (a flush, Ace and Queen high)
RealFish82 wins: EUR 1.37 (with a flush, Ace and Queen high)
Rake: EUR 0.07
Game ended 2011-03-21 16:48:35 GMT
Game # 2137884196 - Omaha High Pot Limit EUR 0.02/0.04 - Table "Chikumi"
Players(max 6):
LihavaLapsi (EUR 3.84 in seat 1)
kikekake (EUR 1.55 in seat 2)
RealFish82 (EUR 4.65 in seat 3)
lukasp2 (EUR 1.78 in seat 4)
F4UXR34L (EUR 4.00 in seat 5)
ditemelovoi (EUR 12.86 in seat 6)
Dealer: kikekake
Small Blind: RealFish82 (0.02)
Big Blind: lukasp2 (0.04)
F4UXR34L was dealt: 5s - 2h - Ad - 2s
F4UXR34L Fold
ditemelovoi Call (0.04)
LihavaLapsi Call (0.04)
kikekake Call (0.04)
RealFish82 Call (0.02)
lukasp2 Check
Flop 7d - 2c - 8h
RealFish82 Check
lukasp2 Check
ditemelovoi Check
LihavaLapsi Bet (0.15)
kikekake Call (0.15)
RealFish82 Fold
lukasp2 Call (0.15)
ditemelovoi Call (0.15)
Turn 7d - 2c - 8h - 4d
lukasp2 Check
ditemelovoi Bet (0.80)
LihavaLapsi Fold
kikekake All-In (1.36)
lukasp2 Fold
ditemelovoi Call (0.56)
River 7d - 2c - 8h - 4d - 4h
ditemelovoi shows: 6s - 4c - Jc - 8c (a full house, Fours full of Eights)
kikekake shows: 5c - 7c - Jd - 6c (a straight, Eight high)
ditemelovoi wins: EUR 3.35 (with a full house, Fours full of Eights)
Rake: EUR 0.17
Game ended 2011-03-21 16:50:35 GMT

2236
pyfpdb/regression-test-files/unsupported-sites/entraction/Table_35129644.txt

File diff suppressed because it is too large Load Diff

1399
pyfpdb/regression-test-files/unsupported-sites/entraction/Table_35131702.txt

File diff suppressed because it is too large Load Diff

2046
pyfpdb/regression-test-files/unsupported-sites/entraction/Table_35132513.txt

File diff suppressed because it is too large Load Diff

2481
pyfpdb/regression-test-files/unsupported-sites/entraction/Table_35134072.txt

File diff suppressed because it is too large Load Diff

1950
pyfpdb/regression-test-files/unsupported-sites/entraction/Table_35135862.txt

File diff suppressed because it is too large Load Diff

175
regression-test/PrintHand.py

@ -1,175 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Copyright 2008-2011 Steffen Schaumburg
#This program is free software: you can redistribute it and/or modify
#it under the terms of the GNU Affero General Public License as published by
#the Free Software Foundation, version 3 of the License.
#
#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 Affero General Public License
#along with this program. If not, see <http://www.gnu.org/licenses/>.
#In the "official" distribution you can find the license in agpl-3.0.txt.
#This is intended mostly for regression testing
import sys
import MySQLdb
from optparse import OptionParser
import fpdb_util_lib as ful
parser = OptionParser()
parser.add_option("-n", "--handNumber", "--hand", type="int",
help="Number of the hand to print")
parser.add_option("-p", "--password", help="The password for the MySQL user")
parser.add_option("-s", "--site", default="PokerStars",
help="Name of the site (as written in the history files)")
(options, sys.argv) = parser.parse_args()
if options.handNumber==None or options.site==None:
print "please supply a hand number and site name. TODO: make this work"
db = MySQLdb.connect("localhost", "fpdb", options.password, "fpdb")
cursor = db.cursor()
print "Connected to MySQL on localhost. Print Hand Utility"
cursor.execute("SELECT id FROM Sites WHERE name=%s", (options.site,))
siteId=cursor.fetchone()[0]
print "options.site:",options.site,"siteId:",siteId
print ""
print "From Table Hands"
print "================"
cursor.execute("""SELECT Hands.* FROM Hands INNER JOIN Gametypes
ON Hands.gametypeId = Gametypes.id WHERE Gametypes.siteId=%s AND Hands.siteHandNo=%s""",
(siteId, options.handNumber))
handsResult=cursor.fetchone()
handId=handsResult[0]
tableName=handsResult[1]
siteHandNo=options.handNumber
gametypeId=handsResult[3]
handStart=handsResult[4]
#skip importTime
seats=handsResult[6]
maxSeats=handsResult[7]
print "handId:", handId, " tableName:", tableName, " siteHandNo:", siteHandNo, " gametypeId:", gametypeId, " handStart:", handStart, " seats:", seats, " maxSeats:", maxSeats
print ""
print "From Table Gametypes"
print "===================="
cursor.execute("""SELECT type, base, category, limitType, hiLo FROM Gametypes WHERE id=%s""", (gametypeId, ))
typeEtc=cursor.fetchone()
type=typeEtc[0]
base=typeEtc[1]
category=typeEtc[2]
limitType=typeEtc[3]
hiLo=typeEtc[4]
print "type:", type, " base:", base, " category:", category, " limitType:", limitType, " hiLo:", hiLo
gtString=""
doBets=False
if base=="hold":
cursor.execute("SELECT smallBlind FROM Gametypes WHERE id=%s", (gametypeId, ))
sb=cursor.fetchone()[0]
cursor.execute("SELECT bigBlind FROM Gametypes WHERE id=%s", (gametypeId, ))
bb=cursor.fetchone()[0]
gtString=("sb: "+str(sb)+" bb: "+str(bb))
if (limitType=="fl"):
doBets=True
elif base=="stud":
doBets=True
if doBets:
cursor.execute("SELECT smallBet FROM Gametypes WHERE id=%s", (gametypeId, ))
sbet=cursor.fetchone()[0]
cursor.execute("SELECT bigBet FROM Gametypes WHERE id=%s", (gametypeId, ))
bbet=cursor.fetchone()[0]
gtString+=(" sbet: "+str(sbet)+" bbet: "+str(bbet))
print gtString
if type=="ring":
pass
elif type=="tour":
#cursor.execute("SELECT tourneys_players_id FROM hands
cursor.execute("""SELECT DISTINCT TourneysPlayers.id
FROM Hands JOIN HandsPlayers ON HandsPlayers.handId=Hands.id
JOIN TourneysPlayers ON HandsPlayers.tourneysPlayersId=TourneysPlayers.id
WHERE Hands.id=%s""", (hand_id,))
handsPlayersIds=cursor.fetchall()
print "dbg hands_players_ids:",handsPlayersIds
print ""
print "From Table Tourneys"
print "==================="
print "TODO"
print ""
print "From Table TourneysPlayers"
print "=========================="
print "TODO"
else:
print "invalid type:",type
sys.exit(1)
print ""
print "From Table BoardCards"
print "====================="
if (category=="holdem" or category=="omahahi" or category=="omahahilo"):
cursor.execute("""SELECT * FROM BoardCards WHERE handId=%s""",(handId, ))
bc=cursor.fetchone()
print "Board cards:", ful.cards2String(bc[2:])
print ""
print "From Table HandsPlayers"
print "======================="
cursor.execute("""SELECT * FROM HandsPlayers WHERE handId=%s""",(handId, ))
handsPlayers=cursor.fetchall()
playerNames=[]
for i in range (len(handsPlayers)):
line=handsPlayers[i][2:]
playerNames.append(ful.id_to_player_name(cursor, line[0]))
printstr="playerName:"+playerNames[i]+" playerStartcash:"+str(line[1])
if (category=="holdem" or category=="omahahi" or category=="omahahilo"):
printstr+=" position:"+ful.position2String(line[2])+" cards:"
if (category=="holdem"):
printstr+=ful.cards2String(line[5:9])
else:
printstr+=ful.cards2String(line[5:13])
elif (category=="razz" or category=="studhi" or category=="studhilo"):
printstr+=" ante:"+str(line[4])+" cards:"
printstr+=ful.cards2String(line[5:19])
else:
print "TODO: raise error, print_hand.py"
sys.exit(1)
printstr+=" winnings:"+str(line[19])+" rake:"+str(line[20])
print printstr
print ""
print "From Table HandsActions"
print "======================="
for i in range (len(handsPlayers)):
cursor.execute("""SELECT * FROM HandsActions WHERE handPlayerId=%s""",(handsPlayers[i][0], ))
handsActions=cursor.fetchall()
for j in range (len(handsActions)):
line=handsActions[j][2:]
printstr="playerName:"+playerNames[i]
printstr+=" street:"+ful.street_int2String(category, line[0])+" streetActionNo:"+str(line[1])+" action:"+line[2]
printstr+=" amount:"+str(line[4])
print printstr
cursor.close()
db.close()
sys.exit(0)

158
regression-test/PrintPlayerHudData.py

@ -1,158 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Copyright 2008-2011 Steffen Schaumburg
#This program is free software: you can redistribute it and/or modify
#it under the terms of the GNU Affero General Public License as published by
#the Free Software Foundation, version 3 of the License.
#
#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 Affero General Public License
#along with this program. If not, see <http://www.gnu.org/licenses/>.
#In the "official" distribution you can find the license in agpl-3.0.txt.
#This is intended mostly for regression testing
import sys
import MySQLdb
from optparse import OptionParser
import fpdb_util_lib as ful
parser = OptionParser()
parser.add_option("-b", "--bigBet", default="4", type="int", help="big bet in cent")
parser.add_option("-c", "--cat", "--category", default="holdem", help="Category, e.g. holdem or studhilo")
parser.add_option("-e", "--seats", default="7", type="int", help="number of active seats")
parser.add_option("-g", "--gameType", default="ring", help="Whether its a ringgame (ring) or a tournament (tour)")
parser.add_option("-l", "--limit", "--limitType", default="fl", help="Limit Type, one of: nl, pl, fl, cn, cp")
parser.add_option("-n", "--name", "--playername", default="Player_1", help="Name of the player to print")
parser.add_option("-o", "--position", default="B", help="Position, can be B, S, D, C, M or E (see tabledesign.html)")
parser.add_option("-p", "--password", help="The password for the MySQL user")
parser.add_option("-s", "--site", default="PokerStars", help="Name of the site (as written in the history files)")
(options, sys.argv) = parser.parse_args()
db = MySQLdb.connect("localhost", "fpdb", options.password, "fpdb")
cursor = db.cursor()
print "Connected to MySQL on localhost. Print Player Flags Utility"
print ""
print "Basic Data"
print "=========="
print "bigBet:",options.bigBet, "category:",options.cat, "limitType:", options.limit, "name:", options.name, "gameType:", options.gameType, "site:", options.site
cursor.execute("SELECT id FROM Sites WHERE name=%s", (options.site,))
siteId=cursor.fetchone()[0]
cursor.execute("SELECT id FROM Gametypes WHERE bigBet=%s AND category=%s AND siteId=%s AND limitType=%s AND type=%s", (options.bigBet, options.cat, siteId, options.limit, options.gameType))
gametypeId=cursor.fetchone()[0]
cursor.execute("SELECT id FROM Players WHERE name=%s", (options.name,))
playerId=cursor.fetchone()[0]
#print "debug: gametypeId:", gametypeId, "playerId:", playerId, "options.seats:", options.seats, "options.position:", options.position
cursor.execute("SELECT id FROM HudCache WHERE gametypeId=%s AND playerId=%s AND activeSeats=%s AND position=%s",(gametypeId, playerId, options.seats, options.position))
hudDataId=cursor.fetchone()[0]
print "siteId:", siteId, "gametypeId:", gametypeId, "playerId:", playerId, "hudDataId:", hudDataId
print ""
print "HUD Raw Hand Counts"
print "==================="
cursor.execute ("SELECT HDs, street0VPI, street0Aggr, street0_3B4BChance, street0_3B4BDone FROM HudCache WHERE id=%s", (hudDataId,))
fields=cursor.fetchone()
print "HDs:",fields[0]
print "street0VPI:",fields[1]
print "street0Aggr:",fields[2]
print "street0_3B4BChance:",fields[3]
print "street0_3B4BDone:",fields[4]
print ""
cursor.execute ("SELECT street1Seen, street2Seen, street3Seen, street4Seen, sawShowdown FROM HudCache WHERE id=%s", (hudDataId,))
fields=cursor.fetchone()
print "street1Seen:",fields[0]
print "street2Seen:",fields[1]
print "street3Seen:",fields[2]
print "street4Seen:",fields[3]
print "sawShowdown:",fields[4]
print ""
cursor.execute ("SELECT street1Aggr, street2Aggr, street3Aggr, street4Aggr FROM HudCache WHERE id=%s", (hudDataId,))
fields=cursor.fetchone()
print "street1Aggr:",fields[0]
print "street2Aggr:",fields[1]
print "street3Aggr:",fields[2]
print "street4Aggr:",fields[3]
print ""
cursor.execute ("SELECT otherRaisedStreet1, otherRaisedStreet2, otherRaisedStreet3, otherRaisedStreet4, foldToOtherRaisedStreet1, foldToOtherRaisedStreet2, foldToOtherRaisedStreet3, foldToOtherRaisedStreet4 FROM HudCache WHERE id=%s", (hudDataId,))
fields=cursor.fetchone()
print "otherRaisedStreet1:",fields[0]
print "otherRaisedStreet2:",fields[1]
print "otherRaisedStreet3:",fields[2]
print "otherRaisedStreet4:",fields[3]
print "foldToOtherRaisedStreet1:",fields[4]
print "foldToOtherRaisedStreet2:",fields[5]
print "foldToOtherRaisedStreet3:",fields[6]
print "foldToOtherRaisedStreet4:",fields[7]
print ""
cursor.execute ("SELECT wonWhenSeenStreet1, wonAtSD FROM HudCache WHERE id=%s", (hudDataId,))
fields=cursor.fetchone()
print "wonWhenSeenStreet1:",fields[0]
print "wonAtSD:",fields[1]
cursor.execute ("SELECT stealAttemptChance, stealAttempted, foldBbToStealChance, foldedBbToSteal, foldSbToStealChance, foldedSbToSteal FROM HudCache WHERE id=%s", (hudDataId,))
fields=cursor.fetchone()
print "stealAttemptChance:",fields[0]
print "stealAttempted:",fields[1]
print "foldBbToStealChance:",fields[2]
print "foldedBbToSteal:",fields[3]
print "foldSbToStealChance:",fields[4]
print "foldedSbToSteal:",fields[5]
cursor.execute ("SELECT street1CBChance, street1CBDone, street2CBChance, street2CBDone, street3CBChance, street3CBDone, street4CBChance, street4CBDone FROM HudCache WHERE id=%s", (hudDataId,))
fields=cursor.fetchone()
print "street1CBChance:",fields[0]
print "street1CBDone:",fields[1]
print "street2CBChance:",fields[2]
print "street2CBDone:",fields[3]
print "street3CBChance:",fields[4]
print "street3CBDone:",fields[5]
print "street4CBChance:",fields[6]
print "street4CBDone:",fields[7]
cursor.execute ("SELECT foldToStreet1CBChance, foldToStreet1CBDone, foldToStreet2CBChance, foldToStreet2CBDone, foldToStreet3CBChance, foldToStreet3CBDone, foldToStreet4CBChance, foldToStreet4CBDone FROM HudCache WHERE id=%s", (hudDataId,))
fields=cursor.fetchone()
print "foldToStreet1CBChance:",fields[0]
print "foldToStreet1CBDone:",fields[1]
print "foldToStreet2CBChance:",fields[2]
print "foldToStreet2CBDone:",fields[3]
print "foldToStreet3CBChance:",fields[4]
print "foldToStreet3CBDone:",fields[5]
print "foldToStreet4CBChance:",fields[6]
print "foldToStreet4CBDone:",fields[7]
cursor.execute ("SELECT totalProfit FROM HudCache WHERE id=%s", (hudDataId,))
fields=cursor.fetchone()
print "totalProfit:",fields[0]
cursor.execute ("SELECT street1CheckCallRaiseChance, street1CheckCallRaiseDone, street2CheckCallRaiseChance, street2CheckCallRaiseDone, street3CheckCallRaiseChance, street3CheckCallRaiseDone, street4CheckCallRaiseChance, street4CheckCallRaiseDone FROM HudCache WHERE id=%s", (hudDataId,))
fields=cursor.fetchone()
print "street1CheckCallRaiseChance:",fields[0]
print "street1CheckCallRaiseDone:",fields[1]
print "street2CheckCallRaiseChance:",fields[2]
print "street2CheckCallRaiseDone:",fields[3]
print "street3CheckCallRaiseChance:",fields[4]
print "street3CheckCallRaiseDone:",fields[5]
print "street4CheckCallRaiseChance:",fields[6]
print "street4CheckCallRaiseDone:",fields[7]
cursor.close()
db.close()
sys.exit(0)

80
regression-test/fpdb_util_lib.py

@ -1,80 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Copyright 2008-2011 Steffen Schaumburg
#This program is free software: you can redistribute it and/or modify
#it under the terms of the GNU Affero General Public License as published by
#the Free Software Foundation, version 3 of the License.
#
#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 Affero General Public License
#along with this program. If not, see <http://www.gnu.org/licenses/>.
#In the "official" distribution you can find the license in agpl-3.0.txt.
import sys
def cards2String(arr):
if (len(arr)%2!=0):
print "TODO: raise error, cards2String failed, uneven length of arr"
sys.exit(1)
result = ""
for i in range (len(arr)/2):
if arr[i*2]==0:
result+="??"
else:
if arr[i*2]==14:
result+="A"
elif arr[i*2]==13:
result+="K"
elif arr[i*2]==12:
result+="Q"
elif arr[i*2]==11:
result+="J"
elif arr[i*2]==10:
result+="T"
elif (arr[i*2]>=2 and arr[i*2]<=9):
result+=str(arr[i*2])
else:
print "TODO: raise error, cards2String failed, arr[i*2]:", arr[i*2], "len(arr):", len(arr)
print "arr:",arr
sys.exit(1)
result+=arr[i*2+1]
result+=" "
return result[:-1]
def id_to_player_name(cursor, id):
cursor.execute("SELECT name FROM Players WHERE id=%s", (id, ))
return cursor.fetchone()[0]
def position2String(pos):
if pos=="B":
return "BB"
elif pos=="S":
return "SB"
elif pos=="0":
return "Btn"
else:
return (pos+" off Btn")
def street_int2String(category, street):
if (category=="holdem" or category=="omahahi" or category=="omahahilo"):
if street==0:
return "Preflop"
elif street==1:
return "Flop "
elif street==2:
return "Turn "
elif street==3:
return "River "
else:
print "TODO: raise error, fpdb_util_lib.py street_int2String invalid street no"
sys.exit(1)
elif (category=="razz" or category=="studhi" or category=="studhilo"):
return str(street)
else:
print "TODO: raise error, fpdb_util_lib.py street_int2String invalid category"
sys.exit(1)

271
regression-test/known-broken/ftp-omaha-hi-pl-ring-001-005.txt

@ -1,271 +0,0 @@
Full Tilt Poker Game #6929537410: Table Green (deep) - $0.50/$1 - Pot Limit Omaha Hi - 17:15:44 ET - 2008/06/22
Seat 1: player16 ($94.90)
Seat 2: player25 ($147)
Seat 3: player18 ($62.80)
Seat 4: player19 ($136.55)
Seat 5: play-er26 ($56.05)
Seat 6: player21 ($252.95)
Seat 7: player22 ($200)
Seat 8: player23 ($162.50)
Seat 9: player24 ($270.70)
player24 posts the small blind of $0.50
player16 posts the big blind of $1
player22 posts $1
The button is in seat #8
*** HOLE CARDS ***
player25 folds
player25 stands up
player18 folds
player19 folds
play-er26 folds
player21 folds
player22 checks
player23 calls $1
player17 adds $100
player24 calls $0.50
player16 checks
*** FLOP *** [4s Kc 8s]
player24 has 15 seconds left to act
player24 checks
player16 checks
player22 checks
player23 checks
*** TURN *** [4s Kc 8s] [6s]
player24 checks
player16 checks
player22 checks
player23 bets $4
player24 calls $4
player16 folds
player22 folds
*** RIVER *** [4s Kc 8s 6s] [Qc]
player24 checks
player23 checks
*** SHOW DOWN ***
player23 shows [Td 5s 3d Js] a flush, Jack high
player24 mucks
player23 wins the pot ($11.40) with a flush, Jack high
*** SUMMARY ***
Total pot $12 | Rake $0.60
Board: [4s Kc 8s 6s Qc]
Seat 1: player16 (big blind) folded on the Turn
Seat 2: player25 didn't bet (folded)
Seat 3: player18 didn't bet (folded)
Seat 4: player19 didn't bet (folded)
Seat 5: play-er26 didn't bet (folded)
Seat 6: player21 didn't bet (folded)
Seat 7: player22 folded on the Turn
Seat 8: player23 (button) collected ($11.40)
Seat 9: player24 (small blind) mucked
Full Tilt Poker Game #6929553738: Table Green (deep) - $0.50/$1 - Pot Limit Omaha Hi - 17:17:06 ET - 2008/06/22
Seat 1: player16 ($93.90)
Seat 2: player17 ($100)
Seat 3: player18 ($62.80)
Seat 4: player19 ($136.55)
Seat 5: play-er26 ($56.05)
Seat 6: player21 ($252.95)
Seat 7: player22 ($199)
Seat 8: player23 ($168.90)
Seat 9: player24 ($265.70)
player16 posts the small blind of $0.50
player17 posts the big blind of $1
The button is in seat #9
*** HOLE CARDS ***
player18 folds
play-er26 stands up
player19 raises to $2
play-er26 folds
player21 calls $2
player22 has 15 seconds left to act
player22 folds
player23 folds
player24 folds
player16 calls $1.50
player17 calls $1
*** FLOP *** [Jc 4c Kc]
player16 checks
player17 checks
player19 checks
player21 checks
*** TURN *** [Jc 4c Kc] [7h]
player16 checks
player17 checks
player19 bets $3.50
player21 folds
player16 folds
player17 calls $3.50
*** RIVER *** [Jc 4c Kc 7h] [8s]
player17 checks
player19 has 15 seconds left to act
player19 bets $10
player17 calls $10
*** SHOW DOWN ***
player19 shows [4s Tc As Ac] a flush, Ace high
player17 mucks
player19 wins the pot ($33.25) with a flush, Ace high
*** SUMMARY ***
Total pot $35 | Rake $1.75
Board: [Jc 4c Kc 7h 8s]
Seat 1: player16 (small blind) folded on the Turn
Seat 2: player17 (big blind) mucked
Seat 3: player18 didn't bet (folded)
Seat 4: player19 collected ($33.25)
Seat 5: play-er26 didn't bet (folded)
Seat 6: player21 folded on the Turn
Seat 7: player22 didn't bet (folded)
Seat 8: player23 didn't bet (folded)
Seat 9: player24 (button) didn't bet (folded)
Full Tilt Poker Game #6929572212: Table Green (deep) - $0.50/$1 - Pot Limit Omaha Hi - 17:18:40 ET - 2008/06/22
Seat 1: player16 ($91.90)
Seat 2: player17 ($84.50)
Seat 3: player18 ($62.80)
Seat 4: player19 ($154.30)
Seat 6: player21 ($250.95)
Seat 7: player22 ($199)
Seat 8: player23 ($168.90)
Seat 9: player24 ($265.70)
player17 posts the small blind of $0.50
player18 posts the big blind of $1
The button is in seat #1
*** HOLE CARDS ***
player19 folds
player21 folds
player20 adds $50
player22 folds
player23 folds
player24 folds
player20 is sitting out
player16 raises to $2
player17 folds
player18 folds
Uncalled bet of $1 returned to player16
player16 mucks
player16 wins the pot ($2.50)
*** SUMMARY ***
Total pot $2.50 | Rake $0
Seat 1: player16 (button) collected ($2.50), mucked
Seat 2: player17 (small blind) folded before the Flop
Seat 3: player18 (big blind) folded before the Flop
Seat 4: player19 didn't bet (folded)
Seat 6: player21 didn't bet (folded)
Seat 7: player22 didn't bet (folded)
Seat 8: player23 didn't bet (folded)
Seat 9: player24 didn't bet (folded)
Full Tilt Poker Game #6929576743: Table Green (deep) - $0.50/$1 - Pot Limit Omaha Hi - 17:19:03 ET - 2008/06/22
Seat 1: player16 ($93.40)
Seat 2: player17 ($84)
Seat 3: player18 ($61.80)
Seat 4: player19 ($154.30)
Seat 5: player20 ($50), is sitting out
Seat 6: player21 ($250.95)
Seat 7: player22 ($199)
Seat 8: player23 ($168.90)
Seat 9: player24 ($265.70)
player18 posts the small blind of $0.50
player19 posts the big blind of $1
The button is in seat #2
*** HOLE CARDS ***
player20 has returned
player21 calls $1
player22 folds
player23 calls $1
player24 calls $1
player16 raises to $4
player17 folds
player18 folds
player19 folds
player21 folds
player23 folds
player17 is sitting out
player24 has 15 seconds left to act
player24 calls $3
*** FLOP *** [Tc 9s 7h]
player24 checks
player16 has 15 seconds left to act
player16 bets $8
player24 folds
Uncalled bet of $8 returned to player16
player16 mucks
player16 wins the pot ($10.95)
*** SUMMARY ***
Total pot $11.50 | Rake $0.55
Board: [Tc 9s 7h]
Seat 1: player16 collected ($10.95), mucked
Seat 2: player17 (button) didn't bet (folded)
Seat 3: player18 (small blind) folded before the Flop
Seat 4: player19 (big blind) folded before the Flop
Seat 5: player20 is sitting out
Seat 6: player21 folded before the Flop
Seat 7: player22 didn't bet (folded)
Seat 8: player23 folded before the Flop
Seat 9: player24 folded on the Flop
Full Tilt Poker Game #6929587483: Table Green (deep) - $0.50/$1 - Pot Limit Omaha Hi - 17:19:57 ET - 2008/06/22
Seat 1: player16 ($100.35)
Seat 2: player17 ($84), is sitting out
Seat 3: player18 ($61.30)
Seat 4: player19 ($153.30)
Seat 5: player20 ($50)
Seat 6: player21 ($249.95)
Seat 7: player22 ($199)
Seat 8: player23 ($167.90)
Seat 9: player24 ($261.70)
player19 posts the small blind of $0.50
player20 posts the big blind of $1
The button is in seat #3
*** HOLE CARDS ***
player21 folds
player22 folds
player21 stands up
player23 calls $1
player24 calls $1
player16 folds
player18 folds
player19 calls $0.50
player20 checks
*** FLOP *** [Jd Td 2c]
roguern adds $100
player19 bets $3
player20 folds
player23 folds
player24 has 15 seconds left to act
player24 raises to $11
player19 raises to $37
player24 raises to $115
player19 raises to $152.30, and is all in
player24 calls $37.30
player19 shows [Jc Jh 7s 5h]
player24 shows [Kh Ad 6h Qd]
*** TURN *** [Jd Td 2c] [As]
*** RIVER *** [Jd Td 2c As] [8s]
player19 shows three of a kind, Jacks
player24 shows a straight, Ace high
player24 wins the pot ($305.60) with a straight, Ace high
player19 is sitting out
*** SUMMARY ***
Total pot $308.60 | Rake $3
Board: [Jd Td 2c As 8s]
Seat 1: player16 didn't bet (folded)
Seat 2: player17 is sitting out
Seat 3: player18 (button) didn't bet (folded)
Seat 4: player19 (small blind) showed [Jc Jh 7s 5h] and lost with three of a kind, Jacks
Seat 5: player20 (big blind) folded on the Flop
Seat 6: player21 didn't bet (folded)
Seat 7: player22 didn't bet (folded)
Seat 8: player23 folded on the Flop
Seat 9: player24 showed [Kh Ad 6h Qd] and won ($305.60) with a straight, Ace high

61
regression-test/known-broken/ftp-stud-hilo-ring-001.txt

@ -1,61 +0,0 @@
Full Tilt Poker Game #6367428246: Table Mountain Mesa - $15/$30 Ante $3 - Limit Stud H/L - 23:47:38 ET - 2008/05/10
Seat 1: Player_8 ($446), is sitting out
Seat 2: Play er9 ($303.50)
Seat 3: P layer10 ($613), is sitting out
Seat 4: Player_11 ($164)
Seat 5: Player1 2 ($543.50), is sitting out
Seat 6: Player13 ($912.50)
Seat 7: Player14 ($430), is sitting out
Seat 8: Player15 ($531.50)
Player15 antes $3
Player_11 antes $3
Player13 antes $3
Play er9 antes $3
*** 3RD STREET ***
Dealt to Play er9 [2s]
Dealt to Player_11 [3c]
Dealt to Player13 [8c]
Dealt to Player15 [Jc]
Play er9 is low with [2s]
Play er9 brings in for $5
Player_11 folds
Player13 completes it to $15
Player15 folds
Play er9 calls $10
*** 4TH STREET ***
Dealt to Play er9 [2s] [6c]
Dealt to Player13 [8c] [5h]
Player13 bets $15
Play er9 calls $15
*** 5TH STREET ***
Dealt to Play er9 [2s 6c] [Ac]
Dealt to Player13 [8c 5h] [Ah]
Player13 bets $30
Play er9 calls $30
*** 6TH STREET ***
Dealt to Play er9 [2s 6c Ac] [2c]
Dealt to Player13 [8c 5h Ah] [Jd]
Play er9 bets $30
Player13 calls $30
*** 7TH STREET ***
Play er9 bets $30
Player13 calls $30
*** SHOW DOWN ***
Play er9 shows [5c 4h 2s 6c Ac 2c 2h] three of a kind, Twos, for high and 6,5,4,2,A, for low
Player13 mucks
Play er9 wins the high pot ($125) with three of a kind, Twos
Play er9 wins the low pot ($125) with 6,5,4,2,A
*** SUMMARY ***
Total pot $252 | Rake $2
Seat 1: Player_8 is sitting out
Seat 2: Play er9 collected ($250)
Seat 3: P layer10 is sitting out
Seat 4: Player_11 folded on 3rd St.
Seat 5: Player1 2 is sitting out
Seat 6: Player13 mucked
Seat 7: Player14 is sitting out
Seat 8: Player15 folded on 3rd St.

40
regression-test/known-broken/ftp.6367428246.expected.txt

@ -1,40 +0,0 @@
This file is outdated!
Connected to MySQL on localhost. Print Hand Utility
options.site: Full Tilt Poker site_id: 1
From Table sites
====================
site_name: Full Tilt Poker
From Table gametypes
====================
type: category: studhilo limit_type:
sb: bb: sbet: bbet:
From Table hands
================
site_hand_no: 6367428246 hand_start: 2008-05-11 04:47:38 seat_count: 4
From Table hands_players
========================
player_name:Play er9 player_startcash:30350 ante:300 cards:5c 4h 2s 6c Ac 2c 2h winnings:25000 rake:200
player_name:Player_11 player_startcash:16400 ante:300 cards:?? ?? 3c ?? ?? ?? ?? winnings:0 rake:0
player_name:Player13 player_startcash:91250 ante:300 cards:?? ?? 8c 5h Ah Jd ?? winnings:0 rake:0
player_name:Player15 player_startcash:53150 ante:300 cards:?? ?? Jc ?? ?? ?? ?? winnings:0 rake:0
From Table hands_actions
========================
player_name:Play er9 actionCount:0 street:3 streetActionNo:0 action:blind amount:500
player_name:Play er9 actionCount:1 street:3 streetActionNo:1 action:call amount:1000
player_name:Play er9 actionCount:2 street:4 streetActionNo:0 action:call amount:1500
player_name:Play er9 actionCount:3 street:5 streetActionNo:0 action:call amount:3000
player_name:Play er9 actionCount:4 street:6 streetActionNo:0 action:bet amount:3000
player_name:Play er9 actionCount:5 street:7 streetActionNo:0 action:bet amount:3000
player_name:Player_11 actionCount:0 street:3 streetActionNo:0 action:fold amount:0
player_name:Player13 actionCount:0 street:3 streetActionNo:0 action:bet amount:1500
player_name:Player13 actionCount:1 street:4 streetActionNo:0 action:bet amount:1500
player_name:Player13 actionCount:2 street:5 streetActionNo:0 action:bet amount:3000
player_name:Player13 actionCount:3 street:6 streetActionNo:0 action:call amount:3000
player_name:Player13 actionCount:4 street:7 streetActionNo:0 action:call amount:3000
player_name:Player15 actionCount:0 street:3 streetActionNo:0 action:fold amount:0

48
regression-test/known-broken/ftp.6929537410.expected.txt

@ -1,48 +0,0 @@
This file is outdated!
Connected to MySQL on localhost. Print Hand Utility
options.site: Full Tilt Poker site_id: 1
From Table hands
================
site_hand_no: 6929537410 hand_start: 2008-06-22 22:15:44 seat_count: 9 category: omahahi
Board cards: 4s Kc 8s 6s Qc
From Table hands_players
========================
player_name:player16 player_startcash:9490 position:BB cards:?? ?? ?? ?? winnings:0 rake:0
player_name:player25 player_startcash:14700 position:6 off Btn cards:?? ?? ?? ?? winnings:0 rake:0
player_name:player18 player_startcash:6280 position:5 off Btn cards:?? ?? ?? ?? winnings:0 rake:0
player_name:player19 player_startcash:13655 position:4 off Btn cards:?? ?? ?? ?? winnings:0 rake:0
player_name:play-er26 player_startcash:5605 position:3 off Btn cards:?? ?? ?? ?? winnings:0 rake:0
player_name:player21 player_startcash:25295 position:2 off Btn cards:?? ?? ?? ?? winnings:0 rake:0
player_name:player22 player_startcash:20000 position:1 off Btn cards:?? ?? ?? ?? winnings:0 rake:0
player_name:player23 player_startcash:16250 position:Btn cards:Td 5s 3d Js winnings:1140 rake:60
player_name:player24 player_startcash:27070 position:SB cards:?? ?? ?? ?? winnings:0 rake:0
From Table hands_actions
========================
player_name:player16 actionCount:0 street:Preflop streetActionNo:0 action:blind amount:100
player_name:player16 actionCount:1 street:Preflop streetActionNo:1 action:check amount:0
player_name:player16 actionCount:2 street:Flop streetActionNo:0 action:check amount:0
player_name:player16 actionCount:3 street:Turn streetActionNo:0 action:check amount:0
player_name:player16 actionCount:4 street:Turn streetActionNo:1 action:fold amount:0
player_name:player25 actionCount:0 street:Preflop streetActionNo:0 action:fold amount:0
player_name:player18 actionCount:0 street:Preflop streetActionNo:0 action:fold amount:0
player_name:player19 actionCount:0 street:Preflop streetActionNo:0 action:fold amount:0
player_name:play-er26 actionCount:0 street:Preflop streetActionNo:0 action:fold amount:0
player_name:player21 actionCount:0 street:Preflop streetActionNo:0 action:fold amount:0
player_name:player22 actionCount:0 street:Preflop streetActionNo:0 action:blind amount:100
player_name:player22 actionCount:1 street:Preflop streetActionNo:1 action:check amount:0
player_name:player22 actionCount:2 street:Flop streetActionNo:0 action:check amount:0
player_name:player22 actionCount:3 street:Turn streetActionNo:0 action:check amount:0
player_name:player22 actionCount:4 street:Turn streetActionNo:1 action:fold amount:0
player_name:player23 actionCount:0 street:Preflop streetActionNo:0 action:call amount:100
player_name:player23 actionCount:1 street:Flop streetActionNo:0 action:check amount:0
player_name:player23 actionCount:2 street:Turn streetActionNo:0 action:bet amount:400
player_name:player23 actionCount:3 street:River streetActionNo:0 action:check amount:0
player_name:player24 actionCount:0 street:Preflop streetActionNo:0 action:blind amount:50
player_name:player24 actionCount:1 street:Preflop streetActionNo:1 action:call amount:50
player_name:player24 actionCount:2 street:Flop streetActionNo:0 action:check amount:0
player_name:player24 actionCount:3 street:Turn streetActionNo:0 action:check amount:0
player_name:player24 actionCount:4 street:Turn streetActionNo:1 action:call amount:400
player_name:player24 actionCount:5 street:River streetActionNo:0 action:check amount:0

47
regression-test/known-broken/ftp.6929553738.expected.txt

@ -1,47 +0,0 @@
This file is outdated!
Connected to MySQL on localhost. Print Hand Utility
options.site: Full Tilt Poker site_id: 1
From Table hands
================
site_hand_no: 6929553738 hand_start: 2008-06-22 22:17:06 seat_count: 9 category: omahahi
Board cards: Jc 4c Kc 7h 8s
From Table hands_players
========================
player_name:player16 player_startcash:9390 position:SB cards:?? ?? ?? ?? winnings:0 rake:0
player_name:player17 player_startcash:10000 position:BB cards:?? ?? ?? ?? winnings:0 rake:0
player_name:player18 player_startcash:6280 position:6 off Btn cards:?? ?? ?? ?? winnings:0 rake:0
player_name:player19 player_startcash:13655 position:5 off Btn cards:4s Tc As Ac winnings:3325 rake:175
player_name:play-er26 player_startcash:5605 position:4 off Btn cards:?? ?? ?? ?? winnings:0 rake:0
player_name:player21 player_startcash:25295 position:3 off Btn cards:?? ?? ?? ?? winnings:0 rake:0
player_name:player22 player_startcash:19900 position:2 off Btn cards:?? ?? ?? ?? winnings:0 rake:0
player_name:player23 player_startcash:16890 position:1 off Btn cards:?? ?? ?? ?? winnings:0 rake:0
player_name:player24 player_startcash:26570 position:Btn cards:?? ?? ?? ?? winnings:0 rake:0
From Table hands_actions
========================
player_name:player16 actionCount:0 street:Preflop streetActionNo:0 action:blind amount:50
player_name:player16 actionCount:1 street:Preflop streetActionNo:1 action:call amount:150
player_name:player16 actionCount:2 street:Flop streetActionNo:0 action:check amount:0
player_name:player16 actionCount:3 street:Turn streetActionNo:0 action:check amount:0
player_name:player16 actionCount:4 street:Turn streetActionNo:1 action:fold amount:0
player_name:player17 actionCount:0 street:Preflop streetActionNo:0 action:blind amount:100
player_name:player17 actionCount:1 street:Preflop streetActionNo:1 action:call amount:100
player_name:player17 actionCount:2 street:Flop streetActionNo:0 action:check amount:0
player_name:player17 actionCount:3 street:Turn streetActionNo:0 action:check amount:0
player_name:player17 actionCount:4 street:Turn streetActionNo:1 action:call amount:350
player_name:player17 actionCount:5 street:River streetActionNo:0 action:check amount:0
player_name:player17 actionCount:6 street:River streetActionNo:1 action:call amount:1000
player_name:player18 actionCount:0 street:Preflop streetActionNo:0 action:fold amount:0
player_name:player19 actionCount:0 street:Preflop streetActionNo:0 action:bet amount:200
player_name:player19 actionCount:1 street:Flop streetActionNo:0 action:check amount:0
player_name:player19 actionCount:2 street:Turn streetActionNo:0 action:bet amount:350
player_name:player19 actionCount:3 street:River streetActionNo:0 action:bet amount:1000
player_name:play-er26 actionCount:0 street:Preflop streetActionNo:0 action:fold amount:0
player_name:player21 actionCount:0 street:Preflop streetActionNo:0 action:call amount:200
player_name:player21 actionCount:1 street:Flop streetActionNo:0 action:check amount:0
player_name:player21 actionCount:2 street:Turn streetActionNo:0 action:fold amount:0
player_name:player22 actionCount:0 street:Preflop streetActionNo:0 action:fold amount:0
player_name:player23 actionCount:0 street:Preflop streetActionNo:0 action:fold amount:0
player_name:player24 actionCount:0 street:Preflop streetActionNo:0 action:fold amount:0

68
regression-test/ps-flags-B-1hands.expected.txt

@ -1,68 +0,0 @@
Connected to MySQL on localhost. Print Player Flags Utility
Basic Data
==========
bigBet: 4 category: holdem limitType: fl name: Player_5 gameType: ring site: PokerStars
siteId: 2 gametypeId: 1 playerId: 5 hudDataId: 12
HUD Raw Hand Counts
===================
HDs: 1
street0VPI: 0
street0Aggr: 0
street0_3B4BChance: 0
street0_3B4BDone: 0
street1Seen: 1
street2Seen: 1
street3Seen: 1
street4Seen: 0
sawShowdown: 1
street1Aggr: 1
street2Aggr: 1
street3Aggr: 0
street4Aggr: 0
otherRaisedStreet1: 0
otherRaisedStreet2: 1
otherRaisedStreet3: 1
otherRaisedStreet4: 0
foldToOtherRaisedStreet1: 0
foldToOtherRaisedStreet2: 0
foldToOtherRaisedStreet3: 0
foldToOtherRaisedStreet4: 0
wonWhenSeenStreet1: 0.0
wonAtSD: 0.0
stealAttemptChance: 0
stealAttempted: 0
foldBbToStealChance: 0
foldedBbToSteal: 0
foldSbToStealChance: 0
foldedSbToSteal: 0
street1CBChance: 0
street1CBDone: 0
street2CBChance: 0
street2CBDone: 0
street3CBChance: 0
street3CBDone: 0
street4CBChance: 0
street4CBDone: 0
foldToStreet1CBChance: 0
foldToStreet1CBDone: 0
foldToStreet2CBChance: 0
foldToStreet2CBDone: 0
foldToStreet3CBChance: 0
foldToStreet3CBDone: 0
foldToStreet4CBChance: 0
foldToStreet4CBDone: 0
totalProfit:
street1CheckCallRaiseChance:
street1CheckCallRaiseDone:
street2CheckCallRaiseChance:
street2CheckCallRaiseDone:
street3CheckCallRaiseChance:
street3CheckCallRaiseDone:
street4CheckCallRaiseChance: 0
street4CheckCallRaiseDone: 0

68
regression-test/ps-flags-CBflop.expected.txt

@ -1,68 +0,0 @@
Connected to MySQL on localhost. Print Player Flags Utility
Basic Data
==========
bigBet: 50 category: holdem limitType: fl name: player3 gameType: ring site: PokerStars
siteId: 2 gametypeId: 2 playerId: 11 hudDataId: 22
HUD Raw Hand Counts
===================
HDs: 1
street0VPI: 1
street0Aggr: 1
street0_3B4BChance: 1
street0_3B4BDone: 1
street1Seen: 1
street2Seen: 1
street3Seen: 1
street4Seen: 0
sawShowdown: 1
street1Aggr: 1
street2Aggr: 0
street3Aggr: 0
street4Aggr: 0
otherRaisedStreet1: 0
otherRaisedStreet2:
otherRaisedStreet3:
otherRaisedStreet4: 0
foldToOtherRaisedStreet1: 0
foldToOtherRaisedStreet2: 0
foldToOtherRaisedStreet3: 0
foldToOtherRaisedStreet4: 0
wonWhenSeenStreet1: 0.0
wonAtSD: 0.0
stealAttemptChance: 0
stealAttempted: 0
foldBbToStealChance: 0
foldedBbToSteal: 0
foldSbToStealChance: 0
foldedSbToSteal: 0
street1CBChance: 1
street1CBDone: 1
street2CBChance: 0
street2CBDone: 0
street3CBChance: 0
street3CBDone: 0
street4CBChance: 0
street4CBDone: 0
foldToStreet1CBChance: 0
foldToStreet1CBDone: 0
foldToStreet2CBChance: 0
foldToStreet2CBDone: 0
foldToStreet3CBChance: 0
foldToStreet3CBDone: 0
foldToStreet4CBChance: 0
foldToStreet4CBDone: 0
totalProfit:
street1CheckCallRaiseChance: 0
street1CheckCallRaiseDone: 0
street2CheckCallRaiseChance: 0
street2CheckCallRaiseDone: 0
street3CheckCallRaiseChance: 0
street3CheckCallRaiseDone: 0
street4CheckCallRaiseChance: 0
street4CheckCallRaiseDone: 0

68
regression-test/ps-flags-M-2hands.expected.txt

@ -1,68 +0,0 @@
Connected to MySQL on localhost. Print Player Flags Utility
Basic Data
==========
bigBet: 4 category: holdem limitType: fl name: Player_1 gameType: ring site: PokerStars
siteId: 2 gametypeId: 1 playerId: 1 hudDataId: 8
HUD Raw Hand Counts
===================
HDs: 2
street0VPI: 0
street0Aggr: 0
street0_3B4BChance: 0
street0_3B4BDone: 0
street1Seen: 0
street2Seen: 0
street3Seen: 0
street4Seen: 0
sawShowdown: 0
street1Aggr: 0
street2Aggr: 0
street3Aggr: 0
street4Aggr: 0
otherRaisedStreet1: 0
otherRaisedStreet2: 0
otherRaisedStreet3: 0
otherRaisedStreet4: 0
foldToOtherRaisedStreet1: 0
foldToOtherRaisedStreet2: 0
foldToOtherRaisedStreet3: 0
foldToOtherRaisedStreet4: 0
wonWhenSeenStreet1: 0.0
wonAtSD: 0.0
stealAttemptChance: 0
stealAttempted: 0
foldBbToStealChance: 0
foldedBbToSteal: 0
foldSbToStealChance: 0
foldedSbToSteal: 0
street1CBChance: 0
street1CBDone: 0
street2CBChance: 0
street2CBDone: 0
street3CBChance: 0
street3CBDone: 0
street4CBChance: 0
street4CBDone: 0
foldToStreet1CBChance: 0
foldToStreet1CBDone: 0
foldToStreet2CBChance: 0
foldToStreet2CBDone: 0
foldToStreet3CBChance: 0
foldToStreet3CBDone: 0
foldToStreet4CBChance: 0
foldToStreet4CBDone: 0
totalProfit: 0
street1CheckCallRaiseChance: 0
street1CheckCallRaiseDone: 0
street2CheckCallRaiseChance: 0
street2CheckCallRaiseDone: 0
street3CheckCallRaiseChance: 0
street3CheckCallRaiseDone: 0
street4CheckCallRaiseChance: 0
street4CheckCallRaiseDone: 0

68
regression-test/ps-flags-studhilo.expected.txt

@ -1,68 +0,0 @@
Connected to MySQL on localhost. Print Player Flags Utility
Basic Data
==========
bigBet: 20 category: studhilo limitType: fl name: br1an gameType: ring site: PokerStars
siteId: 2 gametypeId: 3 playerId: 21 hudDataId: 32
HUD Raw Hand Counts
===================
HDs: 1
street0VPI: 0
street0Aggr: 0
street0_3B4BChance: 0
street0_3B4BDone: 0
street1Seen: 1
street2Seen: 1
street3Seen: 1
street4Seen: 1
sawShowdown: 1
street1Aggr: 0
street2Aggr: 0
street3Aggr: 0
street4Aggr: 0
otherRaisedStreet1: 0
otherRaisedStreet2: 1
otherRaisedStreet3: 0
otherRaisedStreet4: 1
foldToOtherRaisedStreet1: 0
foldToOtherRaisedStreet2: 0
foldToOtherRaisedStreet3: 0
foldToOtherRaisedStreet4: 0
wonWhenSeenStreet1: 0.0
wonAtSD: 0.0
stealAttemptChance: 0
stealAttempted: 0
foldBbToStealChance: 0
foldedBbToSteal: 0
foldSbToStealChance: 0
foldedSbToSteal: 0
street1CBChance: 0
street1CBDone: 0
street2CBChance: 0
street2CBDone: 0
street3CBChance: 0
street3CBDone: 0
street4CBChance: 0
street4CBDone: 0
foldToStreet1CBChance: 0
foldToStreet1CBDone: 0
foldToStreet2CBChance: 0
foldToStreet2CBDone: 0
foldToStreet3CBChance: 0
foldToStreet3CBDone: 0
foldToStreet4CBChance: 0
foldToStreet4CBDone: 0
totalProfit: -0.47
street1CheckCallRaiseChance: 0
street1CheckCallRaiseDone: 0
street2CheckCallRaiseChance: 0
street2CheckCallRaiseDone: 0
street3CheckCallRaiseChance: 0
street3CheckCallRaiseDone: 0
street4CheckCallRaiseChance: 1
street4CheckCallRaiseDone: 0

169
regression-test/ps-lhe-ring-3hands.txt

@ -1,169 +0,0 @@
PokerStars Game #14519394979: Hold'em Limit ($0.02/$0.04) - 2008/01/13 - 00:22:15 (ET)
Table 'Merope' 10-max Seat #1 is the button
Seat 1: Player_1 ($0.75 in chips)
Seat 3: Player_2 ($0.59 in chips)
Seat 4: Player_3 ($1.47 in chips)
Seat 6: Player_4 ($1.98 in chips)
Seat 7: Player_5 ($1.22 in chips)
Seat 8: Player_6 ($0.48 in chips)
Seat 9: Player_7 ($1.39 in chips)
Player_2: posts small blind $0.01
Player_3: posts big blind $0.02
*** HOLE CARDS ***
Dealt to Player_7 [Ts Jh]
Player_4: raises $0.02 to $0.04
Player_5: folds
Player_6: folds
Player_7: folds
Player_1: calls $0.04
Player_2: calls $0.03
Player_3: folds
*** FLOP *** [Qd Th Js]
Player_2: checks
Player_4: bets $0.02
Player_1: calls $0.02
Player_2: calls $0.02
*** TURN *** [Qd Th Js] [2s]
Player_2: checks
Player_4: bets $0.04
Player_1: calls $0.04
Player_2: calls $0.04
*** RIVER *** [Qd Th Js 2s] [7s]
Player_2: checks
Player_4: bets $0.04
Player_1: folds
Player_2: folds
Player_4 collected $0.31 from pot
*** SUMMARY ***
Total pot $0.32 | Rake $0.01
Board [Qd Th Js 2s 7s]
Seat 1: Player_1 (button) folded on the River
Seat 3: Player_2 (small blind) folded on the River
Seat 4: Player_3 (big blind) folded before Flop
Seat 6: Player_4 collected ($0.31)
Seat 7: Player_5 folded before Flop (didn't bet)
Seat 8: Player_6 folded before Flop (didn't bet)
Seat 9: Player_7 folded before Flop (didn't bet)
PokerStars Game #14519420999: Hold'em Limit ($0.02/$0.04) - 2008/01/13 - 00:23:43 (ET)
Table 'Merope' 10-max Seat #4 is the button
Seat 1: Player_1 ($0.65 in chips)
Seat 3: Player_2 ($0.49 in chips)
Seat 4: Player_3 ($1.79 in chips)
Seat 6: Player_4 ($2.05 in chips)
Seat 7: Player_5 ($1.18 in chips)
Seat 8: Player_6 ($0.34 in chips)
Seat 9: Player_7 ($1.35 in chips)
wakked13 will be allowed to play after the button
Player_4: posts small blind $0.01
Player_5: posts big blind $0.02
*** HOLE CARDS ***
Dealt to Player_7 [8d 5d]
Player_6 said, "vn"
Player_6: folds
Player_7: folds
Player_1: folds
Player_2: calls $0.02
Player_3: folds
Player_4: calls $0.01
Player_5: checks
*** FLOP *** [Th Jd 3c]
Player_3 said, "ty"
Player_4: checks
Player_5: bets $0.02
Player_2: calls $0.02
Player_4: calls $0.02
*** TURN *** [Th Jd 3c] [7c]
Player_4: checks
Player_5: bets $0.04
Player_2: raises $0.04 to $0.08
Player_4: folds
Player_5: calls $0.04
*** RIVER *** [Th Jd 3c 7c] [4s]
Player_5: checks
Player_2: bets $0.04
Player_5: calls $0.04
*** SHOW DOWN ***
Player_2: shows [8s 9s] (a straight, Seven to Jack)
Player_5: mucks hand
Player_2 collected $0.35 from pot
*** SUMMARY ***
Total pot $0.36 | Rake $0.01
Board [Th Jd 3c 7c 4s]
Seat 1: Player_1 folded before Flop (didn't bet)
Seat 3: Player_2 showed [8s 9s] and won ($0.35) with a straight, Seven to Jack
Seat 4: Player_3 (button) folded before Flop (didn't bet)
Seat 6: Player_4 (small blind) folded on the Turn
Seat 7: Player_5 (big blind) mucked [Qh Js]
Seat 8: Player_6 folded before Flop (didn't bet)
Seat 9: Player_7 folded before Flop (didn't bet)
PokerStars Game #14519433154: Hold'em Limit ($0.02/$0.04) - 2008/01/13 - 00:24:25 (ET)
Table 'Merope' 10-max Seat #6 is the button
Seat 1: Player_1 ($0.65 in chips)
Seat 3: Player_2 ($0.68 in chips)
Seat 4: Player_3 ($1.79 in chips)
Seat 6: Player_4 ($2.01 in chips)
Seat 7: Player_5 ($1.02 in chips)
Seat 8: Player_6 ($0.34 in chips)
Seat 9: Player_7 ($1.35 in chips)
Player_5: posts small blind $0.01
Player_6: posts big blind $0.02
wakked13: sits out
*** HOLE CARDS ***
Dealt to Player_7 [7c Jh]
Player_7: folds
Player_1: folds
Player_2: folds
Player_3: calls $0.02
Player_4: calls $0.02
Player_5: raises $0.02 to $0.04
Player_6: calls $0.02
Player_3: calls $0.02
Player_4: calls $0.02
*** FLOP *** [4h 9s Ad]
Player_5: checks
Player_6: checks
Player_3: bets $0.02
Player_4: raises $0.02 to $0.04
Player_5: folds
Player_6: folds
Player_3: raises $0.02 to $0.06
Player_4: raises $0.02 to $0.08
Betting is capped
Player_3: calls $0.02
*** TURN *** [4h 9s Ad] [Qc]
Player_3: bets $0.04
Player_4: raises $0.04 to $0.08
Player_3: raises $0.04 to $0.12
Player_4: raises $0.04 to $0.16
Betting is capped
Player_3: calls $0.04
*** RIVER *** [4h 9s Ad Qc] [Ks]
Player_3: bets $0.04
Player_4: raises $0.04 to $0.08
Player_3: raises $0.04 to $0.12
Player_4: raises $0.04 to $0.16
Betting is capped
Player_3: calls $0.04
*** SHOW DOWN ***
Player_4: shows [Ac Td] (a pair of Aces)
Player_3: shows [Ah 9d] (two pair, Aces and Nines)
Player_3 collected $0.92 from pot
*** SUMMARY ***
Total pot $0.96 | Rake $0.04
Board [4h 9s Ad Qc Ks]
Seat 1: Player_1 folded before Flop (didn't bet)
Seat 3: Player_2 folded before Flop (didn't bet)
Seat 4: Player_3 showed [Ah 9d] and won ($0.92) with two pair, Aces and Nines
Seat 6: Player_4 (button) showed [Ac Td] and lost with a pair of Aces
Seat 7: Player_5 (small blind) folded on the Flop
Seat 8: Player_6 (big blind) folded on the Flop
Seat 9: Player_7 folded before Flop (didn't bet)

62
regression-test/ps-lhe-ring-call-3B-preflop-cb-no2b.txt

@ -1,62 +0,0 @@
PokerStars Game #19546605871: Hold'em Limit ($0.25/$0.50) - 2008/08/11 - 20:15:41 (ET)
Table 'Pyxis' 10-max Seat #1 is the button
Seat 1: player10 ($7.75 in chips)
Seat 2: player1 ($11.55 in chips)
Seat 3: player2 ($8.25 in chips)
Seat 4: player3 ($0.90 in chips)
Seat 5: player4 ($10003.50 in chips)
Seat 6: player5 ($13.50 in chips)
Seat 7: player6 ($8 in chips)
Seat 8: player7 ($11.80 in chips)
Seat 9: player8 ($11.05 in chips)
Seat 10: player9 ($11.85 in chips)
player1: posts small blind $0.10
player1 said, "little holy water on the river lol"
player2: posts big blind $0.25
*** HOLE CARDS ***
Dealt to player6 [Ad Ts]
player3: calls $0.25
player4: folds
player5: raises $0.25 to $0.50
player6: calls $0.50
player7: folds
player8: folds
player9: folds
player10: folds
player1: folds
player2: folds
player3: raises $0.25 to $0.75
player5: calls $0.25
player6: calls $0.25
*** FLOP *** [Js 5d 4c]
player3: bets $0.15 and is all-in
player5: calls $0.15
player6: calls $0.15
*** TURN *** [Js 5d 4c] [4s]
player5: bets $0.50
player6: calls $0.50
*** RIVER *** [Js 5d 4c 4s] [6d]
player5: bets $0.50
player6: calls $0.50
*** SHOW DOWN ***
player5: shows [Qc Ac] (a pair of Fours)
player6: mucks hand
player5 collected $1.90 from side pot
player3: shows [9c 7c] (a pair of Fours - lower kicker)
player5 collected $2.95 from main pot
*** SUMMARY ***
Total pot $5.05 Main pot $2.95. Side pot $1.90. | Rake $0.20
Board [Js 5d 4c 4s 6d]
Seat 1: player10 (button) folded before Flop (didn't bet)
Seat 2: player1 (small blind) folded before Flop
Seat 3: player2 (big blind) folded before Flop
Seat 4: player3 showed [9c 7c] and lost with a pair of Fours
Seat 5: player4 folded before Flop (didn't bet)
Seat 6: player5 showed [Qc Ac] and won ($4.85) with a pair of Fours
Seat 7: player6 mucked [Ad Ts]
Seat 8: player7 folded before Flop (didn't bet)
Seat 9: player8 folded before Flop (didn't bet)
Seat 10: player9 folded before Flop (didn't bet)

42
regression-test/ps-lhe-ring-successful-steal-by-cutoff.txt

@ -1,42 +0,0 @@
PokerStars Game #19546637866: Hold'em Limit ($0.25/$0.50) - 2008/08/11 - 20:17:04 (ET)
Table 'Pyxis' 10-max Seat #2 is the button
Seat 1: player1 ($7.75 in chips)
Seat 2: player2 ($11.45 in chips)
Seat 5: player3 ($10003.50 in chips)
Seat 6: player4 ($16.45 in chips)
Seat 7: player5 ($6.10 in chips)
Seat 8: player6 ($11.80 in chips)
Seat 9: player7 ($11.05 in chips)
Seat 10: player8 ($11.85 in chips)
player9 leaves the table
player10: is sitting out
player10 leaves the table
player3: posts small blind $0.10
player4: posts big blind $0.25
*** HOLE CARDS ***
Dealt to player5 [Jh 5d]
Mac Fun K joins the table at seat #4
player5: folds
player6: folds
player7: folds
player8: folds
player1: raises $0.25 to $0.50
player2: folds
player3: folds
player4: folds
Uncalled bet ($0.25) returned to player1
player1 collected $0.60 from pot
player1: doesn't show hand
*** SUMMARY ***
Total pot $0.60 | Rake $0
Seat 1: player1 collected ($0.60)
Seat 2: player2 (button) folded before Flop (didn't bet)
Seat 5: player3 (small blind) folded before Flop
Seat 6: player4 (big blind) folded before Flop
Seat 7: player5 folded before Flop (didn't bet)
Seat 8: player6 folded before Flop (didn't bet)
Seat 9: player7 folded before Flop (didn't bet)
Seat 10: player8 folded before Flop (didn't bet)

130
regression-test/ps-studhilo-ring-showdown.txt

@ -1,130 +0,0 @@
PokerStars Game #15043388146: 7 Card Stud Hi/Lo Limit ($0.10/$0.20) - 2008/02/03 - 22:04:15 (ET)
Table 'Lydia' 8-max
Seat 2: olimpicon99 ($5.31 in chips)
Seat 4: PokerPig55 ($1.58 in chips)
Seat 5: VISTA GIRL ($0.83 in chips)
Seat 6: br1an ($5.10 in chips)
Seat 7: steffen780 ($4 in chips)
Seat 8: willowdale ($3.92 in chips)
olimpicon99: posts the ante $0.02
PokerPig55: posts the ante $0.02
VISTA GIRL: posts the ante $0.02
br1an: posts the ante $0.02
steffen780: posts the ante $0.02
willowdale: posts the ante $0.02
*** 3rd STREET ***
Dealt to olimpicon99 [8c]
Dealt to PokerPig55 [Kh]
Dealt to VISTA GIRL [8h]
Dealt to br1an [2d]
Dealt to steffen780 [Kc 9h 9c]
Dealt to willowdale [5s]
br1an: brings in for $0.05
steffen780: calls $0.05
willowdale: calls $0.05
olimpicon99: folds
olimpicon99 leaves the table
PokerPig55: folds
VISTA GIRL: folds
*** 4th STREET ***
Dealt to br1an [2d] [Qh]
Dealt to steffen780 [Kc 9h 9c] [5c]
Dealt to willowdale [5s] [4s]
br1an: checks
steffen780: checks
willowdale: checks
*** 5th STREET ***
Dealt to br1an [2d Qh] [6d]
Dealt to steffen780 [Kc 9h 9c 5c] [8s]
Dealt to willowdale [5s 4s] [Ad]
willowdale: bets $0.20
br1an: calls $0.20
steffen780: folds
*** 6th STREET ***
Dealt to br1an [2d Qh 6d] [6h]
Dealt to willowdale [5s 4s Ad] [5h]
br1an: checks
willowdale: checks
*** RIVER ***
br1an: checks
willowdale: bets $0.20
br1an: calls $0.20
*** SHOW DOWN ***
willowdale: shows [3s 4d 5s 4s Ad 5h 2c] (HI: a straight, Ace to Five; LO: 5,4,3,2,A)
br1an: shows [4c 7d 2d Qh 6d 6h 2h] (HI: two pair, Sixes and Deuces)
willowdale collected $0.51 from pot
willowdale collected $0.51 from pot
*** SUMMARY ***
Total pot $1.07 | Rake $0.05
Seat 2: olimpicon99 folded on the 3rd Street (didn't bet)
Seat 4: PokerPig55 folded on the 3rd Street (didn't bet)
Seat 5: VISTA GIRL folded on the 3rd Street (didn't bet)
Seat 6: br1an showed [4c 7d 2d Qh 6d 6h 2h] and lost with HI: two pair, Sixes and Deuces
Seat 7: steffen780 folded on the 5th Street
Seat 8: willowdale showed [3s 4d 5s 4s Ad 5h 2c] and won ($1.02) with HI: a straight, Ace to Five; LO: 5,4,3,2,A
PokerStars Game #20711747191: Razz Limit ($1/$2) - 2008/09/26 14:36:50 ET
Table 'Siwa III' 8-max
Seat 2: dainmat ($63.15 in chips)
Seat 3: fnJ's ($30.75 in chips)
Seat 4: ambythegreat ($24.90 in chips)
Seat 5: jt studd ($39.90 in chips)
Seat 6: KyleHruby ($11.55 in chips)
Seat 7: nutOmatic ($71.30 in chips)
dainmat: posts the ante $0.10
fnJ's: posts the ante $0.10
ambythegreat: posts the ante $0.10
jt studd: posts the ante $0.10
KyleHruby: posts the ante $0.10
nutOmatic: posts the ante $0.10
*** 3rd STREET ***
Dealt to dainmat [Ts]
Dealt to fnJ's [3s]
Dealt to ambythegreat [5h]
Dealt to jt studd [Ad]
Dealt to KyleHruby [As]
Dealt to nutOmatic [6d Kd Th]
dainmat: brings in for $0.50
fnJ's: calls $0.50
ambythegreat: raises $0.50 to $1
garnishgut joins the table at seat #1
jt studd: folds
KyleHruby: folds
nutOmatic: folds
dainmat: folds
fnJ's: calls $0.50
*** 4th STREET ***
Dealt to fnJ's [3s] [6h]
Dealt to ambythegreat [5h] [4c]
ambythegreat: bets $1
fnJ's: calls $1
*** 5th STREET ***
Dealt to fnJ's [3s 6h] [2h]
Dealt to ambythegreat [5h 4c] [Kh]
fnJ's: bets $2
ambythegreat: calls $2
*** 6th STREET ***
Dealt to fnJ's [3s 6h 2h] [2c]
Dealt to ambythegreat [5h 4c Kh] [5s]
fnJ's: bets $2
ambythegreat: calls $2
*** RIVER ***
fnJ's: bets $2
ambythegreat: calls $2
*** SHOW DOWN ***
fnJ's: shows [9d 5c 3s 6h 2h 2c 4h] (Lo: 6,5,4,3,2)
ambythegreat: mucks hand
fnJ's collected $16.35 from pot
*** SUMMARY ***
Total pot $17.10 | Rake $0.75
Seat 2: dainmat folded on the 3rd Street
Seat 3: fnJ's showed [9d 5c 3s 6h 2h 2c 4h] and won ($16.35) with Lo: 6,5,4,3,2
Seat 4: ambythegreat mucked [6s 7h 5h 4c Kh 5s Jc]
Seat 5: jt studd folded on the 3rd Street (didn't bet)
Seat 6: KyleHruby folded on the 3rd Street (didn't bet)
Seat 7: nutOmatic folded on the 3rd Street (didn't bet)

49
regression-test/ps.14519394979.expected.txt

@ -1,49 +0,0 @@
Connected to MySQL on localhost. Print Hand Utility
options.site: PokerStars siteId: 2
From Table Hands
================
handId: 1 tableName: Merope siteHandNo: 14519394979 gametypeId: 1 handStart: 2008-01-13 05:22:15 seats: 7 maxSeats: 10
From Table Gametypes
====================
type: ring base: hold category: holdem limitType: fl hiLo: h
sb: 1 bb: 2 sbet: 2 bbet: 4
From Table BoardCards
=====================
Board cards: Qd Th Js 2s 7s
From Table HandsPlayers
=======================
playerName:Player_1 playerStartcash:75 position:Btn cards:?? ?? winnings:0 rake:0
playerName:Player_2 playerStartcash:59 position:SB cards:?? ?? winnings:0 rake:0
playerName:Player_3 playerStartcash:147 position:BB cards:?? ?? winnings:0 rake:0
playerName:Player_4 playerStartcash:198 position:4 off Btn cards:?? ?? winnings:31 rake:1
playerName:Player_5 playerStartcash:122 position:3 off Btn cards:?? ?? winnings:0 rake:0
playerName:Player_6 playerStartcash:48 position:2 off Btn cards:?? ?? winnings:0 rake:0
playerName:Player_7 playerStartcash:139 position:1 off Btn cards:Ts Jh winnings:0 rake:0
From Table HandsActions
=======================
playerName:Player_1 street:Preflop streetActionNo:6 action:call amount:4
playerName:Player_1 street:Flop streetActionNo:2 action:call amount:2
playerName:Player_1 street:Turn streetActionNo:2 action:call amount:4
playerName:Player_1 street:River streetActionNo:2 action:fold amount:0
playerName:Player_2 street:Preflop streetActionNo:0 action:blind amount:1
playerName:Player_2 street:Preflop streetActionNo:7 action:call amount:3
playerName:Player_2 street:Flop streetActionNo:0 action:check amount:0
playerName:Player_2 street:Flop streetActionNo:3 action:call amount:2
playerName:Player_2 street:Turn streetActionNo:0 action:check amount:0
playerName:Player_2 street:Turn streetActionNo:3 action:call amount:4
playerName:Player_2 street:River streetActionNo:0 action:check amount:0
playerName:Player_2 street:River streetActionNo:3 action:fold amount:0
playerName:Player_3 street:Preflop streetActionNo:1 action:blind amount:2
playerName:Player_3 street:Preflop streetActionNo:8 action:fold amount:0
playerName:Player_4 street:Preflop streetActionNo:2 action:bet amount:4
playerName:Player_4 street:Flop streetActionNo:1 action:bet amount:2
playerName:Player_4 street:Turn streetActionNo:1 action:bet amount:4
playerName:Player_4 street:River streetActionNo:1 action:bet amount:4
playerName:Player_5 street:Preflop streetActionNo:3 action:fold amount:0
playerName:Player_6 street:Preflop streetActionNo:4 action:fold amount:0
playerName:Player_7 street:Preflop streetActionNo:5 action:fold amount:0

49
regression-test/ps.14519420999.expected.txt

@ -1,49 +0,0 @@
Connected to MySQL on localhost. Print Hand Utility
options.site: PokerStars siteId: 2
From Table Hands
================
handId: 2 tableName: Merope siteHandNo: 14519420999 gametypeId: 1 handStart: 2008-01-13 05:23:43 seats: 7 maxSeats: 10
From Table Gametypes
====================
type: ring base: hold category: holdem limitType: fl hiLo: h
sb: 1 bb: 2 sbet: 2 bbet: 4
From Table BoardCards
=====================
Board cards: Th Jd 3c 7c 4s
From Table HandsPlayers
=======================
playerName:Player_1 playerStartcash:65 position:2 off Btn cards:?? ?? winnings:0 rake:0
playerName:Player_2 playerStartcash:49 position:1 off Btn cards:8s 9s winnings:35 rake:1
playerName:Player_3 playerStartcash:179 position:Btn cards:?? ?? winnings:0 rake:0
playerName:Player_4 playerStartcash:205 position:SB cards:?? ?? winnings:0 rake:0
playerName:Player_5 playerStartcash:118 position:BB cards:Qh Js winnings:0 rake:0
playerName:Player_6 playerStartcash:34 position:4 off Btn cards:?? ?? winnings:0 rake:0
playerName:Player_7 playerStartcash:135 position:3 off Btn cards:8d 5d winnings:0 rake:0
From Table HandsActions
=======================
playerName:Player_1 street:Preflop streetActionNo:4 action:fold amount:0
playerName:Player_2 street:Preflop streetActionNo:5 action:call amount:2
playerName:Player_2 street:Flop streetActionNo:2 action:call amount:2
playerName:Player_2 street:Turn streetActionNo:2 action:bet amount:8
playerName:Player_2 street:River streetActionNo:1 action:bet amount:4
playerName:Player_3 street:Preflop streetActionNo:6 action:fold amount:0
playerName:Player_4 street:Preflop streetActionNo:0 action:blind amount:1
playerName:Player_4 street:Preflop streetActionNo:7 action:call amount:1
playerName:Player_4 street:Flop streetActionNo:0 action:check amount:0
playerName:Player_4 street:Flop streetActionNo:3 action:call amount:2
playerName:Player_4 street:Turn streetActionNo:0 action:check amount:0
playerName:Player_4 street:Turn streetActionNo:3 action:fold amount:0
playerName:Player_5 street:Preflop streetActionNo:1 action:blind amount:2
playerName:Player_5 street:Preflop streetActionNo:8 action:check amount:0
playerName:Player_5 street:Flop streetActionNo:1 action:bet amount:2
playerName:Player_5 street:Turn streetActionNo:1 action:bet amount:4
playerName:Player_5 street:Turn streetActionNo:4 action:call amount:4
playerName:Player_5 street:River streetActionNo:0 action:check amount:0
playerName:Player_5 street:River streetActionNo:2 action:call amount:4
playerName:Player_6 street:Preflop streetActionNo:2 action:fold amount:0
playerName:Player_7 street:Preflop streetActionNo:3 action:fold amount:0

58
regression-test/ps.14519433154.expected.txt

@ -1,58 +0,0 @@
Connected to MySQL on localhost. Print Hand Utility
options.site: PokerStars siteId: 2
From Table Hands
================
handId: 3 tableName: Merope siteHandNo: 14519433154 gametypeId: 1 handStart: 2008-01-13 05:24:25 seats: 7 maxSeats: 10
From Table Gametypes
====================
type: ring base: hold category: holdem limitType: fl hiLo: h
sb: 1 bb: 2 sbet: 2 bbet: 4
From Table BoardCards
=====================
Board cards: 4h 9s Ad Qc Ks
From Table HandsPlayers
=======================
playerName:Player_1 playerStartcash:65 position:3 off Btn cards:?? ?? winnings:0 rake:0
playerName:Player_2 playerStartcash:68 position:2 off Btn cards:?? ?? winnings:0 rake:0
playerName:Player_3 playerStartcash:179 position:1 off Btn cards:Ah 9d winnings:92 rake:4
playerName:Player_4 playerStartcash:201 position:Btn cards:Ac Td winnings:0 rake:0
playerName:Player_5 playerStartcash:102 position:SB cards:?? ?? winnings:0 rake:0
playerName:Player_6 playerStartcash:34 position:BB cards:?? ?? winnings:0 rake:0
playerName:Player_7 playerStartcash:135 position:4 off Btn cards:7c Jh winnings:0 rake:0
From Table HandsActions
=======================
playerName:Player_1 street:Preflop streetActionNo:3 action:fold amount:0
playerName:Player_2 street:Preflop streetActionNo:4 action:fold amount:0
playerName:Player_3 street:Preflop streetActionNo:5 action:call amount:2
playerName:Player_3 street:Preflop streetActionNo:9 action:call amount:2
playerName:Player_3 street:Flop streetActionNo:2 action:bet amount:2
playerName:Player_3 street:Flop streetActionNo:6 action:bet amount:4
playerName:Player_3 street:Flop streetActionNo:8 action:call amount:2
playerName:Player_3 street:Turn streetActionNo:0 action:bet amount:4
playerName:Player_3 street:Turn streetActionNo:2 action:bet amount:8
playerName:Player_3 street:Turn streetActionNo:4 action:call amount:4
playerName:Player_3 street:River streetActionNo:0 action:bet amount:4
playerName:Player_3 street:River streetActionNo:2 action:bet amount:8
playerName:Player_3 street:River streetActionNo:4 action:call amount:4
playerName:Player_4 street:Preflop streetActionNo:6 action:call amount:2
playerName:Player_4 street:Preflop streetActionNo:10 action:call amount:2
playerName:Player_4 street:Flop streetActionNo:3 action:bet amount:4
playerName:Player_4 street:Flop streetActionNo:7 action:bet amount:4
playerName:Player_4 street:Turn streetActionNo:1 action:bet amount:8
playerName:Player_4 street:Turn streetActionNo:3 action:bet amount:8
playerName:Player_4 street:River streetActionNo:1 action:bet amount:8
playerName:Player_4 street:River streetActionNo:3 action:bet amount:8
playerName:Player_5 street:Preflop streetActionNo:0 action:blind amount:1
playerName:Player_5 street:Preflop streetActionNo:7 action:bet amount:3
playerName:Player_5 street:Flop streetActionNo:0 action:check amount:0
playerName:Player_5 street:Flop streetActionNo:4 action:fold amount:0
playerName:Player_6 street:Preflop streetActionNo:1 action:blind amount:2
playerName:Player_6 street:Preflop streetActionNo:8 action:call amount:2
playerName:Player_6 street:Flop streetActionNo:1 action:check amount:0
playerName:Player_6 street:Flop streetActionNo:5 action:fold amount:0
playerName:Player_7 street:Preflop streetActionNo:2 action:fold amount:0

43
regression-test/ps.15043388146.expected.txt

@ -1,43 +0,0 @@
Connected to MySQL on localhost. Print Hand Utility
options.site: PokerStars siteId: 2
From Table Hands
================
handId: 5 tableName: Lydia siteHandNo: 15043388146 gametypeId: 3 handStart: 2008-02-04 03:04:15 seats: 6 maxSeats: 8
From Table Gametypes
====================
type: ring base: stud category: studhilo limitType: fl hiLo: s
sbet: 10 bbet: 20
From Table BoardCards
=====================
From Table HandsPlayers
=======================
playerName:olimpicon99 playerStartcash:531 ante:2 cards:?? ?? 8c ?? ?? ?? ?? winnings:0 rake:0
playerName:PokerPig55 playerStartcash:158 ante:2 cards:?? ?? Kh ?? ?? ?? ?? winnings:0 rake:0
playerName:VISTA GIRL playerStartcash:83 ante:2 cards:?? ?? 8h ?? ?? ?? ?? winnings:0 rake:0
playerName:br1an playerStartcash:510 ante:2 cards:4c 7d 2d Qh 6d 6h 2h winnings:0 rake:0
playerName:steffen780 playerStartcash:400 ante:2 cards:Kc 9h 9c 5c 8s ?? ?? winnings:0 rake:0
playerName:willowdale playerStartcash:392 ante:2 cards:3s 4d 5s 4s Ad 5h 2c winnings:102 rake:5
From Table HandsActions
=======================
playerName:olimpicon99 street:0 streetActionNo:3 action:fold amount:0
playerName:PokerPig55 street:0 streetActionNo:4 action:fold amount:0
playerName:VISTA GIRL street:0 streetActionNo:5 action:fold amount:0
playerName:br1an street:0 streetActionNo:0 action:blind amount:5
playerName:br1an street:1 streetActionNo:0 action:check amount:0
playerName:br1an street:2 streetActionNo:1 action:call amount:20
playerName:br1an street:3 streetActionNo:0 action:check amount:0
playerName:br1an street:4 streetActionNo:0 action:check amount:0
playerName:br1an street:4 streetActionNo:2 action:call amount:20
playerName:steffen780 street:0 streetActionNo:1 action:call amount:5
playerName:steffen780 street:1 streetActionNo:1 action:check amount:0
playerName:steffen780 street:2 streetActionNo:2 action:fold amount:0
playerName:willowdale street:0 streetActionNo:2 action:call amount:5
playerName:willowdale street:1 streetActionNo:2 action:check amount:0
playerName:willowdale street:2 streetActionNo:0 action:bet amount:20
playerName:willowdale street:3 streetActionNo:1 action:check amount:0
playerName:willowdale street:4 streetActionNo:1 action:bet amount:20

44
regression-test/regression-test.sh

@ -1,44 +0,0 @@
#!/bin/sh
#Copyright 2008-2011 Steffen Schaumburg
#This program is free software: you can redistribute it and/or modify
#it under the terms of the GNU Affero General Public License as published by
#the Free Software Foundation, version 3 of the License.
#
#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 Affero General Public License
#along with this program. If not, see <http://www.gnu.org/licenses/>.
#In the "official" distribution you can find the license in agpl-3.0.txt.
echo "Please note for this to work you need to work on an empty database, otherwise some info (the id fields) will be off"
rm *.found.txt
../pyfpdb/CliFpdb.py -p$1 --file=ps-lhe-ring-3hands.txt -x
../pyfpdb/CliFpdb.py -p$1 --file=ps-lhe-ring-3hands.txt -x
echo "it should've reported first that it stored 3, then that it had 3 duplicates"
./PrintHand.py -p$1 --hand=14519394979 > ps.14519394979.found.txt && colordiff ps.14519394979.found.txt ps.14519394979.expected.txt
./PrintHand.py -p$1 --hand=14519420999 > ps.14519420999.found.txt && colordiff ps.14519420999.found.txt ps.14519420999.expected.txt
./PrintHand.py -p$1 --hand=14519433154 > ps.14519433154.found.txt && colordiff ps.14519433154.found.txt ps.14519433154.expected.txt
./PrintPlayerHudData.py -p$1 -oM > ps-flags-M-2hands.found.txt && colordiff ps-flags-M-2hands.found.txt ps-flags-M-2hands.expected.txt
./PrintPlayerHudData.py -p$1 -nPlayer_5 -oB > ps-flags-B-1hands.found.txt && colordiff ps-flags-B-1hands.found.txt ps-flags-B-1hands.expected.txt
../pyfpdb/CliFpdb.py -p$1 --file=ps-lhe-ring-call-3B-preflop-cb-no2b.txt -x
echo "it should've now reported another successful store of 1 hand"
./PrintPlayerHudData.py -p$1 -nplayer3 -oE -e10 -b50 > ps-flags-CBflop.found.txt && colordiff ps-flags-CBflop.found.txt ps-flags-CBflop.expected.txt
../pyfpdb/CliFpdb.py -p$1 --file=ps-studhilo-ring-showdown.txt -x
echo "it should've now reported another successful store of 1 hand"
./PrintHand.py -p$1 --hand=15043388146 > ps.15043388146.found.txt && colordiff ps.15043388146.found.txt ps.15043388146.expected.txt
./PrintPlayerHudData.py -p$1 -nbr1an -o0 -e6 -b20 -cstudhilo> ps-flags-studhilo.found.txt && colordiff ps-flags-studhilo.found.txt ps-flags-studhilo.expected.txt
echo "if everything was printed as expected this worked"
Loading…
Cancel
Save