Browse Source

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

master
Mika Bostrom 14 years ago
parent
commit
8411f3ed09
  1. 0
      agpl-3.0.txt
  2. 75
      docs/filelist.txt
  3. 79
      docs/readme.txt
  4. 93
      docs/release-notes.txt
  5. 1430
      docs/tabledesign.html
  6. 0
      fdl-1.2.txt
  7. 62
      packaging/gentoo/fpdb-0.10.ebuild
  8. 53
      packaging/gentoo/fpdb-0.20_rc1.ebuild
  9. 147
      packaging/windows/py2exeWalkthroughPython26.txt
  10. 46
      pyfpdb/Configuration.py
  11. 37
      pyfpdb/Database.py
  12. 1
      pyfpdb/DerivedStats.py
  13. 4
      pyfpdb/GuiAutoImport.py
  14. 4
      pyfpdb/GuiGraphViewer.py
  15. 5
      pyfpdb/GuiPlayerStats.py
  16. 10
      pyfpdb/GuiPrefs.py
  17. 3
      pyfpdb/HUD_config.test.xml
  18. 14
      pyfpdb/HUD_config.xml.example
  19. 2
      pyfpdb/Hand.py
  20. 3
      pyfpdb/Hud.py
  21. 14
      pyfpdb/PokerStarsToFpdb.py
  22. 280
      pyfpdb/SQL.py
  23. 92
      pyfpdb/Stats.py
  24. 31
      pyfpdb/fpdb.py
  25. 82
      pyfpdb/fpdb.pyw
  26. 55
      pyfpdb/py2exe_setup.py
  27. 665
      pyfpdb/regression-test-files/cash/FTP/Stud/7-StudHL-USD-2-4-201006.Steal.examples.txt
  28. 272
      pyfpdb/regression-test-files/cash/Stars/Flop/NLHE-2max-USD-0.25-0.50-201005.Hitnrun.txt
  29. 92
      pyfpdb/regression-test-files/cash/Stars/Flop/NLHE-FR-USD-0.01-0.02-201004.4betPF.txt
  30. 9706
      pyfpdb/regression-test-files/cash/Stars/Flop/NLHE-FR-USD-0.01-0.02-201005.microgrind.txt
  31. 86
      pyfpdb/regression-test-files/cash/Stars/Flop/NLHE-FR-USD-0.01-0.02-201006.foldsoutofturn.txt
  32. 62
      pyfpdb/regression-test-files/cash/Stars/Flop/NLHE-FR-USD-0.05-0.10-201004.allinWithAmtReturned.txt
  33. 314
      pyfpdb/regression-test-files/cash/Stars/Flop/PLO-FR-USD-0.01-0.02-201006.sidepots.txt
  34. 39
      pyfpdb/regression-test-files/tour/FTP/Flop/NLHE-USD-STT-2-20100323.Allin.with.less.than.sb.txt
  35. 3018
      pyfpdb/regression-test-files/tour/Stars/Flop/NLHE-FPP-MTT-1r-201005.AllinLotsRebuy.txt
  36. 128
      pyfpdb/regression-test-files/tour/Stars/Flop/NLHE-USD-STT-1-201004.8betPF.txt
  37. 5732
      pyfpdb/regression-test-files/tour/Stars/Flop/NLHE-USD-STT-20-201006.DONturbo.txt
  38. 7
      run_fpdb.py
  39. 0
      test_Python.py
  40. 0
      test_Python_Libs.py
  41. 38
      utils/dump_db_basedata.py
  42. 83
      utils/get_db_stats.py

0
docs/agpl-3.0.txt → agpl-3.0.txt

75
docs/filelist.txt

@ -1,75 +0,0 @@
This is partially outdated
File list
=========
.:
docs/ Documentation files
pyfpdb/ The main program (in python)
setup/ Directory with files for setting up this program
regression-test/ Directory with test data, query scripts (in python) and the regression test script (in bash)
utils/ A couple of things that will migrate to the main prog soon
viewer/ Directory with the GUI (in Java)
./docs:
abbreviations.txt A list of abbreviations used and their meaning
agpl-3.0.txt License of the program (everything under /code)
benchmarks.txt Some benchmark results
codingstyle.txt Some notes on formatting. Feel free to ignore.
fdl-1.2.txt License of the documentation (the files in /)
filelist.txt This file
howto-import.txt Instructions on how to run the importer
install-in-gentoo.txt Installation instructions for Gentoo GNU/Linux
install-in-windows.txt Installation instructions for Windows
readme-dev.txt Some notes, pointers and such for developers or anyone else interested in changing fpdb
readme-overview.txt Some general info about this program - read that first
readme-user.txt Instructions on how to use fpdb
status.txt Details of support for poker types and sites
tabledesign.html Table design with comments
./pyfpdb:
fpdb.py The main GUI. This is what the user will start and use to access the other things.
fpdb_import.py Main import program. Calls methods in the other files.
Takes one hand history file as input. This is the file
you execute, do not run the other ones individually.
Except import_gui.py of course.
fpdb_parse_logic.py Parses a holdem/omaha/razz/stud hand.
fpdb_save_to_db.py Just methods to store the parsed data into SQL.
Seperate file because these calls are very unwieldy.
fpdb_simple.py Simple methods called by the other files. Most work is
actually done in this file to make the other ones look
much easier than they are.
import_gui.py GUI interface to the importer (obselete)
./setup:
insert-basedata.sql Fills sites and gametypes tables. Run this once after running the above.
recreate-tables.sql File for mysql to recreate the tables. THIS WILL DELETE EXISTING TABLES!!!
./testdata:
should be self explanatory
./utils:
dump_db_basedata.py Prints the contents of the tables sites and gametypes
fpdb_util_lib.py Helper methods for the utilities.
get_DB_stats.py Prints some counts (like no. of players in the DB)
get_player_stats.py Prints certain stats about players with CLI-passed constraints
mysql-reset-tables.sh Reset tables for MySQL. THIS WILL DELETE EXISTING TABLES!!!
print_hand.py Prints a hand in legible format.
psql-interactive.sh *nix script to connect to a PostgreSQL database in
interactive mode (note that we're currently only supporting MySQL)
regression-test.sh Resets tables and checks manually verified hands for errors
./viewer:
todo
License
=======
Trademarks of third parties have been used under Fair Use or similar laws.
Copyright 2008 Steffen Jobbagy-Felso
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation License,
Version 1.2 as published by the Free Software Foundation; with
no Invariant Sections, no Front-Cover Texts, and with no Back-Cover
Texts. A copy of the license can be found in fdl-1.2.txt
The program itself is licensed under AGPLv3, see agpl-3.0.txt

79
docs/readme.txt

@ -1,79 +0,0 @@
README.txt
updated 22 February 2010, REB
fpdb - Free Poker Database
The most accurate and up-to-date information on fpdb will be found in the wiki:
http://fpdb.wiki.sourceforge.net/
Other resources are:
Mailing list: http://sourceforge.net/mailarchive/forum.php?forum_name=fpdb-main
Chat room(irc): #fpdb on freenode.net
fpdb is a free program for use with on line poker. It provides:
Tracking of your results and statistics.
Tracking of opponents' results statistics.
Win/loss graphing
Heads Up Display (HUD) with a variety of statistics
Display of mucked cards in the HUD
fpdb supports:
Sites:
PokerStars
Full Tilt Poker
Everleaf Network
Other sites are under development and are easily added
Games:
Holdem
Omaha (incl Hi/low)
7 Card Stud (incl Hi/low)
Razz
Triple Draw and Badugi
Mixed Games -- HUD under development
Operating Systems:
Linux and other Unix-like, using X
Windows
Mac OS/X -- no support for HUD
Databases:
SQLite configured by default
MySQL
PostgreSQL
Downloads:
Releases: http://sourceforge.net/project/showfiles.php?group_id=226872
Development code via git: http://www.assembla.com/spaces/free_poker_tools/trac_git_tool
Developers:
At least 10 people have contributed code or patches. Others are welcome.
Source Code:
If you received fpdb as the Windows compressed exe, then you did not
receive souce code for fpdb or the included libraries. If you wish, you can
obtain the source code here:
fpdb: see Downloads, above.
python: http://python.org/
gtk: http://www.gtk.org/download.html
pygtk: http://www.pygtk.org/downloads.html
psycopg2: http://initd.org/pub/software/psycopg/
mysqldb: http://sourceforge.net/projects/mysql-python/files/
sqlalchemy: http://www.sqlalchemy.org/download.html
numpy: http://www.scipy.org/Download
matplotlib: http://sourceforge.net/projects/matplotlib/files/
License
=======
Trademarks of third parties have been used under Fair Use or similar laws.
Copyright 2008 Steffen Jobbagy-Felso
Copyright 2009,2010 Ray E. Barker
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation License,
Version 1.2 as published by the Free Software Foundation; with
no Invariant Sections, no Front-Cover Texts, and with no Back-Cover
Texts. A copy of the license can be found in fdl-1.2.txt
fpdb itself is licensed under AGPLv3, see agpl-3.0.txt.

93
docs/release-notes.txt

@ -1,93 +0,0 @@
alpha2
======
Hi everyone,
we are proud to announce the second alpha release of fpdb, the free/libre open source poker tracker. The biggest highlight is the HUD for Linux made by Ray (and perhaps Mac, not sure). But for everyone fpdb now also supports PS tournaments (SnG and MTT) and FTP ring games. There is also a new auto-importer though it currently only runs on one file per instance (but you can open multiple instances of fpdb).
Fpdb also parses alot of new situations into the cache table for the HUD, most of which are already available through the Linux HUD. There have also been a large number of bugfixes for all kinds of things. For full details of the changes see the git commit comments.
You can download fpdb at https://sourceforge.net/project/showfiles.php?group_id=226872
Our website at http://fpdb.sourceforge.net/ will be updated shortly but in the meantime please note that the configuration file now resides in ~/.fpdb/default.conf on Linux/Mac and in C:\Documents and Settings\Application Data\fpdb\default.conf on Windows (on non-English Windows you have to translate the Documents and Settings, but not the Application data bit). Apart from that just follow the instructions on the site. I will be updating/improving the fpdb ebuild for Gentoo next week, please send me a PM or email if you would like a package for another Linux/BSD.
To use the HUD in Linux simply run the auto importer whilst having the table open. You will also have to rename HUD_config.xml.example to HUD_config.xml and edit the database parameters in there in addition to what is written in the install guide.
If you've been using fpdb alpha1 just delete the fpdb folder, follow the installation guide except for installing the dependencies, then run fpdb and run recreate tables. Note that you will have to reimport ALL your history files.
For external devs (in particular Youre Toast): The table design has gone through some changes, though most of it was just renaming to make a consistent naming scheme and to make it more flexible towards stud/razz type games. I do not expect to having to make any future changes to the existing fields but I cannot yet guarantee that. There will be some additional fields in particular in the HudCache table. Please let me know if you need any further fields. I realise my naming breaks the "database designer's convention" but for this project I feel ignoring this convention for the benefit of consistent naming between Python and SQL is ok.
Any questions and comments please post here, send me a PM or email, post a feature request or bug report on sourceforge or use any of the other means of contact listed on our webpage.
Enjoy,
The fpdb team
PS: I personally will be away Sun-Tue so I probably won't be responding to anything but feel free to message me anyways, but if you post here or at SF someone else might be able to help.
PPS: If you wanna know EXACTLY how this project is moving along follow the git tree over at [url]http://www.assembla.com/spaces/fpdb/trac_git_tool[/url]
alpha1
======
Hi everyone,
I am proud to announce the first release of my new poker tracking software fpdb (freepokerdb, very imaginative I know ;) ). You may wonder why I bothered when now with HM and PT3 there are at least two excellent packages to choose from.
Four main reasons:
1. Fpdb is free/libre open source software. In short, this means you don't depend on me if sth. is wrong or you want something more in this program as you can freely change it yourself. You also don't have to pay anything for it. If you like it and think I deserve to be paid just drop me a mail ;)
2. HM and PT3 only support holdem. Fpdb initially supports Holdem and Omaha, with Stud and Razz mostly implemented and coming soon.
3. HM and PT3 run on Windows only, and for me at least did not work in wine even after installing Mono. Fpdb runs on any plattform that has the required software, which will cover roundabout 99.9% of PCs. Currently tested plattforms are Windows XP-x86 and Gentoo GNU/Linux-amd64 as well as -x86.
You still need to run Windows or wine to run the actual poker client though.
4. Fpdb won't irritate you with copy prevention measures.
To install it go to https://sourceforge.net/project/showfiles.php?group_id=226872 and download the zip or tar.bz2, unpack it, and follow the instructions in docs/install-in-* for your operating system (e.g. docs\install-in-windows.txt). Sourceforge lists the release files as source files, not as binary executables - this is correct, python will automagically compile as and when required.
This is alpha1, as the name indicates it is still at a very early stage. The importer and database are nearing completion but the GUI in particular is not very functional yet and the HUD is missing alltogether.
If anyone wishes to help with development that would be very very welcome and I've put a few notes in docs/readme-dev.txt in the download for what you could do. Or just start coding and send me the patches :)
If you're not a programmer and you're not interested in learning it you can still help simply by trying it out and sending bug reports and feature requests. To avoid unrealistic expectations I'd like to state that it'll be a long time until fpdb reaches feature parity to established paid-for closed source software.
Feature List (short now, growing fast ;) ):
You can edit/add whatever you like, it's all python and SQL. The code should be fairly straightforward I think and I put some notes into readme-dev.txt but feel free to ask.
Backend, Distribution
=====================
- Choice of MySQL/InnoDB or PostgreSQL. (not tested on PostgreSQL)
- It is possible to run the database on one PC, the importer on another, and then access the database with the table viewer or HUD from a third PC. (note: do NOT do this unencrypted over an untrusted network like your employer's LAN or the Internet!)
Site/Game Support
=================
- Initially only full support for PS, FTP coming soon
- Supports Holdem, Omaha Hi and Omaha Hi/Lo. Stud and Razz coming soon.
- Supports No Limit, Pot Limit, Fixed Limit NL, Cap NL and Cap PL
Note that currently it does not display extra stats for NL/PL so usefulness is limited for these limit types. Suggestions welcome, I don't play these.
- Supports ring/cash games, SnG/MTT coming soon
Tableviewer (tv)
===========
Tv takes a history filename and loads the appropriate players' stats and displays them in a tabular format. These stats currently are:
- VPIP, PFR and Preflop 3B/4B (3B/4B is not quite correct I think)
- Raise and Fold % on flop, turn and river. Fold only counts hands when someone raised. This can be displayed per street or as one combined value each for aggression and folding.
- Number of hands this is based on.
- SD/F (aka WtSD, proportion of hands where player went to showdown after seeing flop)
- W$wSF (Won $ when seen Flop)
- W$@SD (Won $ at showdown)
For all stats it also displays how many hands this particular is based on
IMPORTANT: The database format WILL undergo more changes and at this point I am not planning to write a converter so please keep your history files so you can re-import when necessary. Independent of this you should always keep the original raw files in a safe place with any tracking software. Should you however end up loosing your files somehow let me know and I'll try to help.
Please send any feedback, feature requests/suggestions, bug reports and animal names to steffen@sycamoretest.info, pick one of the contact methods listed in readme-overview.txt, send me a PM here or reply to this post.
License
=======
Trademarks of third parties have been used under Fair Use or similar laws.
Copyright 2008 Steffen Jobbagy-Felso
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation License,
Version 1.2 as published by the Free Software Foundation; with
no Invariant Sections, no Front-Cover Texts, and with no Back-Cover
Texts. A copy of the license can be found in fdl-1.2.txt
The program itself is licensed under AGPLv3, see agpl-3.0.txt

1430
docs/tabledesign.html

File diff suppressed because it is too large Load Diff

0
docs/fdl-1.2.txt → fdl-1.2.txt

62
packaging/gentoo/fpdb-0.10.ebuild

@ -1,62 +0,0 @@
# Copyright 1999-2008 Gentoo Foundation
# Gentoo had nothing to do with the production of this ebuild, but I'm pre-emptively transferring all copyrights (as far as legally possible under my local jurisdiction) to them.
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/games-util/fpdb/fpdb-0.10.ebuild,v 1.0 2009/1/30 steffen@sycamoretest.info Exp $
NEED_PYTHON=2.3
#inherit distutils
MY_P="fpdb-${PV}"
DESCRIPTION="A database program to track your online poker games"
HOMEPAGE="https://sourceforge.net/projects/fpdb/"
SRC_URI="mirror://sourceforge/fpdb/${MY_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=""
RDEPEND="virtual/mysql
dev-python/mysql-python
>=x11-libs/gtk+-2.10
dev-python/pygtk
dev-python/numpy
dev-python/matplotlib"
DEPEND="${RDEPEND}"
src_install() {
DIRINST="${D}usr/share/games/fpdb/"
mkdir -p "${DIRINST}"
cp -R * "${DIRINST}" || die
DIRBIN="${D}usr/games/bin/"
mkdir -p "${DIRBIN}"
#echo "pathes"
#echo "${DIRINST}pyfpdb/fpdb.py"
#echo "${DIRBIN}fpdb.py"
#echo
echo "cd /usr/share/games/fpdb/pyfpdb/ && python fpdb.py" > "${DIRBIN}fpdb" || die
chmod 755 "${DIRBIN}fpdb" || die
}
#src_test() {
#}
pkg_postinst() {
elog "Fpdb has been installed and can be called by executing /usr/games/bin/fpdb"
elog "You need to perform a couple more steps manually."
elog "Please also make sure you followed instructions from previous emerges, in particular make sure you configured mysql and set a root pw for it"
elog "Now run this command to connect to MySQL: mysql --user=root --password=yourPassword"
elog "In the mysql command line interface you need to type these two lines (make sure you get the ; at the end)"
elog "In the second line replace \"newPassword\" with a password of your choice"
elog "CREATE DATABASE fpdb;"
elog "GRANT ALL PRIVILEGES ON fpdb.* TO 'fpdb'@'localhost' IDENTIFIED BY 'newPassword' WITH GRANT OPTION;"
elog "Finally copy the default config file from ${DIRINST}docs/default.conf to ~/.fpdb/ for every user that is to use fpdb."
elog "You will need to edit the default.conf, in particular you need to replace the password with what you entered in the \"GRANT ALL...\""
elog "Finally run the GUI and click the menu database -> recreate tables"
elog "That's it! See our webpage at http://fpdb.sourceforge.net for more documentation"
elog " "
}

53
packaging/gentoo/fpdb-0.20_rc1.ebuild

@ -0,0 +1,53 @@
# Copyright 1999-2010 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# created by Steffen Schaumburg, steffen@schaumburger.info
EAPI="2"
NEED_PYTHON=2.5
#inherit distutils
DESCRIPTION="A database program to track your online poker games"
HOMEPAGE="http://fpdb.sourceforge.net/"
#SRC_URI="mirror://sourceforge/fpdb/${MY_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="mysql postgres graphing"
RDEPEND="
mysql? ( virtual/mysql
dev-python/mysql-python )
postgres? ( dev-db/postgresql-server
dev-python/psycopg )
>=x11-libs/gtk+-2.10
dev-python/pygtk
graphing? ( dev-python/numpy
dev-python/matplotlib[gtk] )
dev-python/python-xlib"
DEPEND="${RDEPEND}"
#src_install() {
# DIRINST="${D}usr/share/games/fpdb/"
# mkdir -p "${DIRINST}"
# cp -R * "${DIRINST}" || die
#
# DIRBIN="${D}usr/games/bin/"
# mkdir -p "${DIRBIN}"
# #echo "pathes"
# #echo "${DIRINST}pyfpdb/fpdb.py"
# #echo "${DIRBIN}fpdb.py"
# #echo
# echo "cd /usr/share/games/fpdb/pyfpdb/ && python fpdb.py" > "${DIRBIN}fpdb" || die
# chmod 755 "${DIRBIN}fpdb" || die
#}
#src_test() {
#}
pkg_postinst() {
elog "Fpdb's dependencies have been installed. Please visit fpdb.sourceforge.net and download and unpack the archive."
elog "You can then start fpdb by running run_fpdb.py. Good luck!"
}

147
packaging/windows/py2exeWalkthroughPython26.txt

@ -0,0 +1,147 @@
PY2EXE walkthrough for Python 2.6 & FPDB 0.20
created by Gimick on 22nd June 2010
Step 0 Get a fresh XP installation
----------------------------------
0.1/ Using XPhome 32bit
Step 1, Python install
----------------------
1.1/ install the following in sequence (accept all default options) there should be no errors !
Python 2.6.5 ... http://www.python.org/ftp/python/2.6.5/python-2.6.5.msi
pywin 214 ... http://sourceforge.net/projects/pywin32/files/pywin32/Build%20214/pywin32-214.win32-py2.6.exe/download
numpy 1.4.1 ... http://sourceforge.net/projects/numpy/files/NumPy/1.4.1/numpy-1.4.1-win32-superpack-python2.6.exe/download
matplotlib 0.99.3 ... http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-0.99.3/matplotlib-0.99.3.win32-py2.6.exe/download
pygtk 2.16.0 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pygtk/2.16/pygtk-2.16.0.win32-py2.6.exe
pycairo 1.8.6 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pycairo/1.8/pycairo-1.8.6.win32-py2.6.exe
pyGobject 2.20.0 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pygobject/2.20/pygobject-2.20.0.win32-py2.6.exe
py2exe 0.6.9 ... http://sourceforge.net/projects/py2exe/files/py2exe/0.6.9/py2exe-0.6.9.win32-py2.6.exe/download
Step 2 Setup GTK
-----------------
There are quite a few GTK packages needed, and rather than install them individually, I used the official AllinOne from the GTK project.
2,1/ Create a new folder c:\GTK
2.2/ Extract the following zip file into c:\GTK
GTK+ all in one 2.20.0 ... http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.20/gtk+-bundle_2.20.0-20100406_win32.zip
2.3/ If everything has worked, you should have c:\GTK\bin \etc \lib \src and so on created.
Step 3 Set GTK into the PATH variable
-------------------------------------
The path for GTK isn't set by default, so need to let the o/s know where the GTK stuff is.
3.1/ Rightclick on mycomputer to show system properties
3.2/ select advanced/environment Variables
3.3/ in "system variables" NOT "user variables" do the following
3.3.1/ create a new item as name: GTK_BASEPATH value: c:\GTK
3.3.2/ edit the item "path", press home to get to the first character and insert the following text, (no quotes, including semicolon) %GTK_BASEPATH%\bin;
3.4/ to check, open command prompt and do:
dos>path ... system should respond with ... PATH=c:\GTK\bin;C:\WIN........
3.5/ Give it a spin to test (hopefully an application will start, if not, something has gone wrong)
dos> gtk-demo
Step 4 Get the fpdb GIT tree
----------------------------
4.1/ Best to take a copy to work with; following steps will assume that the fpdb folder is on the Desktop
Step 5 Put MSVCP90.dll temporarily into the fpdb folder
-------------------------------------------------------
py2exe will check for MSVCP90.dll. The version installed by python2.6.5runtime is not in the path, so we will put it in place TEMPORARILY. This will/must be removed manually once the exe has been created, as we do not have a licence to redistribute.
Search for MSVCP90.dll (should be found in C:\WINDOWS\WinSxS\...
copy this file TEMPORARILY to the Desktop\fpdb\pyfpdb folder
Step 6 Run py2exe to generate fpdb.exe
--------------------------------------
6.1/ Run the script to create the fpdb.exe bundle
dos> cd Desktop\fpdb\pyfpdb
dos> c:\python26\python.exe py2exe_setup.py py2exe
wait a while, watch lots of copying and whatever.
6.2/ You should next get prompted for the GTK folder.
c:\GTK
6.3/ If there are no errors reported, it has probably worked, we will test soon.
Step 7 Delete C++runtime
------------------------
This is really really important, this file must NOT be distributed, so get rid of it now to avoid issues.
7.1/ in Desktop\fpdb\pyfpdb\ remove the file msvcp90.dll
Step 8 Drag out the completed bundle
------------------------------------
py2exe creates a new folder for the created software bundle, drag this out to the desktop for ease of working
8.1/ Drag Desktop\fpdb\pyfpdb\fpdb-yyyymmdd-exe to Desktop\
Step 9 Initial run
------------------
9.1/ Open the Desktop\fpdb-yyyymmdd-exe folder
9.2/ In explorer...tools...folder options...View uncheck "Hide extensions for known file types"
9.3/ Double click run_fpdb.bat
9.4/ check the contents of pyfpdb\fpdb.exe.log, deal with any errors thrown
Step 10 drum roll.......
------------------------
10.1/ hopefully, fpdb will run
10.2/ Try out a few options, deal with any errors reported
Observe that the msvcp90.dll was provided by the python runtime package, so we don't have to install the separate package from Microsoft. End-users will, however need the dependency.
Step 11 pruning
---------------
11.1/ The generated folder is 100+MB and can be pruned by removing the following directories:
pyfpdb/lib/glib-2.0
pyfpdb/lib/gtk-2.0/include
pyfpdb/lib/pkgconfig
pyfpdb/share/aclocal
pyfpdb/share/doc
pyfpdb/share/glib-2.0
pyfpdb/share/gtk-2.0
pyfpdb/share/gtk-doc
pyfpdb/share/locale
pyfpdb/share/man
Step 12 rename folder
---------------------
12/ Rename the folder to something meaningful to the community
Step 13 Compress to executable archive
--------------------------------------
13.1/ Download and install 7zip 914 ... http://sourceforge.net/projects/sevenzip/files/7-Zip/9.14/7z914.exe/download
13.2/ Rightclick on fpdb executable folder, select 7zip Add to archive... select SFX archive option switch
13.3/ Test the created exe file

46
pyfpdb/Configuration.py

@ -32,6 +32,7 @@ import string
import traceback
import shutil
import locale
import re
import xml.dom.minidom
from xml.dom.minidom import Node
@ -248,6 +249,8 @@ class Site:
self.enabled = string_to_bool(node.getAttribute("enabled"), default=True)
self.xpad = node.getAttribute("xpad")
self.ypad = node.getAttribute("ypad")
self.xshift = node.getAttribute("xshift")
self.yshift = node.getAttribute("yshift")
self.layout = {}
print "Loading site", self.site_name
@ -259,6 +262,8 @@ class Site:
# Site defaults
self.xpad = 1 if self.xpad == "" else int(self.xpad)
self.ypad = 0 if self.ypad == "" else int(self.ypad)
self.xshift = 1 if self.xshift == "" else int(self.xshift)
self.yshift = 0 if self.yshift == "" else int(self.yshift)
self.font_size = 7 if self.font_size == "" else int(self.font_size)
self.hudopacity = 1.0 if self.hudopacity == "" else float(self.hudopacity)
@ -296,12 +301,18 @@ class Game:
self.cols = int( node.getAttribute("cols") )
self.xpad = node.getAttribute("xpad")
self.ypad = node.getAttribute("ypad")
self.xshift = node.getAttribute("xshift")
self.yshift = node.getAttribute("yshift")
# Defaults
if self.xpad == "": self.xpad = 1
else: self.xpad = int(self.xpad)
if self.ypad == "": self.ypad = 0
else: self.ypad = int(self.ypad)
if self.xshift == "": self.xshift = 1
else: self.xshift = int(self.xshift)
if self.yshift == "": self.yshift = 0
else: self.yshift = int(self.yshift)
aux_text = node.getAttribute("aux")
aux_list = aux_text.split(',')
@ -334,6 +345,8 @@ class Game:
temp = temp + " cols = %d\n" % self.cols
temp = temp + " xpad = %d\n" % self.xpad
temp = temp + " ypad = %d\n" % self.ypad
temp = temp + " xshift = %d\n" % self.xshift
temp = temp + " yshift = %d\n" % self.yshift
temp = temp + " aux = %s\n" % self.aux
for stat in self.stats.keys():
@ -662,7 +675,34 @@ class Config:
pass
with open(file, 'w') as f:
self.doc.writexml(f)
#self.doc.writexml(f)
f.write( self.wrap_long_lines( self.doc.toxml() ) )
def wrap_long_lines(self, s):
lines = [ self.wrap_long_line(l) for l in s.splitlines() ]
return('\n'.join(lines) + '\n')
def wrap_long_line(self, l):
if 'config_wrap_len' in self.general:
wrap_len = int(self.general['config_wrap_len'])
else:
wrap_len = -1 # < 0 means no wrap
if wrap_len >= 0 and len(l) > wrap_len:
m = re.compile('\s+\S+\s+')
mo = m.match(l)
if mo:
indent_len = mo.end()
#print "indent = %s (%s)" % (indent_len, l[0:indent_len])
indent = '\n' + ' ' * indent_len
m = re.compile('(\S+="[^"]+"\s+)')
parts = [x for x in m.split(l[indent_len:]) if x]
if len(parts) > 1:
#print "parts =", parts
l = l[0:indent_len] + indent.join(parts)
return(l)
else:
return(l)
def edit_layout(self, site_name, max, width = None, height = None,
fav_seat = None, locations = None):
@ -951,6 +991,8 @@ class Config:
parms["enabled"] = self.supported_sites[site].enabled
parms["xpad"] = self.supported_sites[site].xpad
parms["ypad"] = self.supported_sites[site].ypad
parms["xshift"] = self.supported_sites[site].xshift
parms["yshift"] = self.supported_sites[site].yshift
return parms
def set_site_parameters(self, site_name, converter = None, decoder = None,
@ -1002,6 +1044,8 @@ class Config:
param['cols'] = self.supported_games[name].cols
param['xpad'] = self.supported_games[name].xpad
param['ypad'] = self.supported_games[name].ypad
param['xshift'] = self.supported_games[name].xshift
param['yshift'] = self.supported_games[name].yshift
param['aux'] = self.supported_games[name].aux
return param

37
pyfpdb/Database.py

@ -1633,7 +1633,12 @@ class Database:
pdata[p]['street3CheckCallRaiseChance'],
pdata[p]['street3CheckCallRaiseDone'],
pdata[p]['street4CheckCallRaiseChance'],
pdata[p]['street4CheckCallRaiseDone']
pdata[p]['street4CheckCallRaiseDone'],
pdata[p]['street0Raises'],
pdata[p]['street1Raises'],
pdata[p]['street2Raises'],
pdata[p]['street3Raises'],
pdata[p]['street4Raises']
) )
q = self.sql.query['store_hands_players']
@ -1662,7 +1667,7 @@ class Database:
#print "DEBUG: %s %s %s" %(hid, pids, pdata)
inserts = []
for p in pdata:
line = [0]*61
line = [0]*76
line[0] = 1 # HDs
if pdata[p]['street0VPI']: line[1] = 1
@ -1719,13 +1724,29 @@ class Database:
if pdata[p]['street3CheckCallRaiseDone']: line[52] = 1
if pdata[p]['street4CheckCallRaiseChance']: line[53] = 1
if pdata[p]['street4CheckCallRaiseDone']: line[54] = 1
line[55] = gid # gametypeId
line[56] = pids[p] # playerId
line[57] = len(pids) # activeSeats
if pdata[p]['street0Calls']: line[55] = 1
if pdata[p]['street1Calls']: line[56] = 1
if pdata[p]['street2Calls']: line[57] = 1
if pdata[p]['street3Calls']: line[58] = 1
if pdata[p]['street4Calls']: line[59] = 1
if pdata[p]['street0Bets']: line[60] = 1
if pdata[p]['street1Bets']: line[61] = 1
if pdata[p]['street2Bets']: line[62] = 1
if pdata[p]['street3Bets']: line[63] = 1
if pdata[p]['street4Bets']: line[64] = 1
if pdata[p]['street0Raises']: line[65] = 1
if pdata[p]['street1Raises']: line[66] = 1
if pdata[p]['street2Raises']: line[67] = 1
if pdata[p]['street3Raises']: line[68] = 1
if pdata[p]['street4Raises']: line[69] = 1
line[70] = gid # gametypeId
line[71] = pids[p] # playerId
line[72] = len(pids) # activeSeats
pos = {'B':'B', 'S':'S', 0:'D', 1:'C', 2:'M', 3:'M', 4:'M', 5:'E', 6:'E', 7:'E', 8:'E', 9:'E' }
line[58] = pos[pdata[p]['position']]
line[59] = pdata[p]['tourneyTypeId']
line[60] = styleKey # styleKey
line[73] = pos[pdata[p]['position']]
line[74] = pdata[p]['tourneyTypeId']
line[75] = styleKey # styleKey
inserts.append(line)

1
pyfpdb/DerivedStats.py

@ -62,6 +62,7 @@ class DerivedStats():
for i in range(5):
self.handsplayers[player[1]]['street%dCalls' % i] = 0
self.handsplayers[player[1]]['street%dBets' % i] = 0
self.handsplayers[player[1]]['street%dRaises' % i] = 0
for i in range(1,5):
self.handsplayers[player[1]]['street%dCBChance' %i] = False
self.handsplayers[player[1]]['street%dCBDone' %i] = False

4
pyfpdb/GuiAutoImport.py

@ -214,8 +214,8 @@ class GuiAutoImport (threading.Thread):
stderr=subprocess.PIPE, # only needed for py2exe
universal_newlines=True
)
self.pipe_to_hud.stdout.close()
self.pipe_to_hud.stderr.close()
#self.pipe_to_hud.stdout.close()
#self.pipe_to_hud.stderr.close()
except:
err = traceback.extract_tb(sys.exc_info()[2])[-1]
#self.addText( "\n*** GuiAutoImport Error opening pipe: " + err[2] + "(" + str(err[1]) + "): " + str(sys.exc_info()[1]))

4
pyfpdb/GuiGraphViewer.py

@ -228,9 +228,9 @@ class GuiGraphViewer (threading.Thread):
self.ax.plot(blue, color='blue', label='Showdown: $%.2f' %(blue[-1]))
self.ax.plot(red, color='red', label='Non-showdown: $%.2f' %(red[-1]))
if sys.version[0:3] == '2.5':
self.ax.legend(loc='best', shadow=True, prop=FontProperties(size='smaller'))
self.ax.legend(loc='upper left', shadow=True, prop=FontProperties(size='smaller'))
else:
self.ax.legend(loc='best', fancybox=True, shadow=True, prop=FontProperties(size='smaller'))
self.ax.legend(loc='upper left', fancybox=True, shadow=True, prop=FontProperties(size='smaller'))
self.graphBox.add(self.canvas)
self.canvas.show()

5
pyfpdb/GuiPlayerStats.py

@ -93,10 +93,13 @@ class GuiPlayerStats (threading.Thread):
, ["plposition", False, "Posn", 1.0, "%s", "str"] # true not allowed for this line (set in code)
, ["pname", False, "Name", 0.0, "%s", "str"] # true not allowed for this line (set in code)
, ["n", True, "Hds", 1.0, "%1.0f", "str"]
, ["avgseats", False, "Seats", 1.0, "%3.1f", "str"]
, ["avgseats", False, "Seats", 1.0, "%3.1f", "str"]
, ["vpip", True, "VPIP", 1.0, "%3.1f", "str"]
, ["pfr", True, "PFR", 1.0, "%3.1f", "str"]
, ["pf3", True, "PF3", 1.0, "%3.1f", "str"]
, ["aggfac", True, "AggFac", 1.0, "%2.2f", "str"]
, ["aggfrq", True, "AggFreq", 1.0, "%3.1f", "str"]
, ["conbet", True, "ContBet", 1.0, "%3.1f", "str"]
, ["steals", True, "Steals", 1.0, "%3.1f", "str"]
, ["saw_f", True, "Saw_F", 1.0, "%3.1f", "str"]
, ["sawsd", True, "SawSD", 1.0, "%3.1f", "str"]

10
pyfpdb/GuiPrefs.py

@ -30,10 +30,11 @@ import Configuration
class GuiPrefs:
def __init__(self, config, mainwin, dia):
def __init__(self, config, mainwin, dia, parentwin):
self.config = config
self.main_window = mainwin
self.dialog = dia
self.parent_window = parentwin #need to pass reference of parent, to set transient
self.tree_box = gtk.ScrolledWindow()
self.tree_box.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
@ -60,7 +61,7 @@ class GuiPrefs:
configColumn.pack_start(cRender, True)
configColumn.add_attribute(cRender, 'text', 1)
configColumn = gtk.TreeViewColumn("Value")
configColumn = gtk.TreeViewColumn("Value (double-click to change)")
self.configView.append_column(configColumn)
cRender = gtk.CellRendererText()
configColumn.pack_start(cRender, True)
@ -120,7 +121,7 @@ class GuiPrefs:
name = tmodel.get_value( iter, 1 )
val = tmodel.get_value( iter, 2 )
dia_edit = gtk.Dialog(name,
self.main_window,
self.parent_window,
gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
@ -162,7 +163,8 @@ if __name__=="__main__":
(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
gtk.STOCK_SAVE, gtk.RESPONSE_ACCEPT))
dia.set_default_size(700, 500)
prefs = GuiPrefs(config, win, dia.vbox)
pw=dia #pass parent window
prefs = GuiPrefs(config, win, dia.vbox,pw)
response = dia.run()
if response == gtk.RESPONSE_ACCEPT:
# save updated config

3
pyfpdb/HUD_config.test.xml

@ -508,6 +508,9 @@ Left-Drag to Move"
<pu_stat pu_stat_name="a_freq2"> </pu_stat>
<pu_stat pu_stat_name="a_freq3"> </pu_stat>
<pu_stat pu_stat_name="a_freq4"> </pu_stat>
<pu_stat pu_stat_name="agg_freq"> </pu_stat>
<pu_stat pu_stat_name="agg_fact"> </pu_stat>
<pu_stat pu_stat_name="cbet"> </pu_stat>
<pu_stat pu_stat_name="cb1"> </pu_stat>
<pu_stat pu_stat_name="cb2"> </pu_stat>
<pu_stat pu_stat_name="cb3"> </pu_stat>

14
pyfpdb/HUD_config.xml.example

@ -2,6 +2,13 @@
<FreePokerToolsConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FreePokerToolsConfig.xsd">
<!-- config_wrap_len is preferred max line length in this file, -1 means no max
day_start is time that logical day starts, e.g. 5 means that any play
between 00:00 and 04:59:59 counts as being on the previous day -->
<general config_wrap_len="-1"
day_start="5"
/>
<import callFpdbHud = "True" interval = "10" fastStoreHudCache="False" hhArchiveBase="~/.fpdb/HandHistories/" saveActions="True"></import>
<!-- These values determine what stats are displayed in the HUD
@ -114,6 +121,10 @@ Left-Drag to Move"
hudopacity="1.0"
font="Sans"
font_size="8"
xpad="1"
ypad="0"
xshift="0"
yshift="0"
supported_games="holdem,razz,omahahi,omahahilo,studhi,studhilo">
<layout max="8" width="792" height="546" fav_seat="0">
<location seat="1" x="684" y="61"> </location>
@ -559,6 +570,9 @@ Left-Drag to Move"
<pu_stat pu_stat_name="a_freq2"> </pu_stat>
<pu_stat pu_stat_name="a_freq3"> </pu_stat>
<pu_stat pu_stat_name="a_freq4"> </pu_stat>
<pu_stat pu_stat_name="agg_freq"> </pu_stat>
<pu_stat pu_stat_name="agg_fact"> </pu_stat>
<pu_stat pu_stat_name="cbet"> </pu_stat>
<pu_stat pu_stat_name="cb1"> </pu_stat>
<pu_stat pu_stat_name="cb2"> </pu_stat>
<pu_stat pu_stat_name="cb3"> </pu_stat>

2
pyfpdb/Hand.py

@ -345,7 +345,7 @@ For sites (currently only Carbon Poker) which record "all in" as a special actio
self.actions['BLINDSANTES'].append(act)
if blindtype == 'both':
# work with the real ammount. limit games are listed as $1, $2, where
# work with the real amount. limit games are listed as $1, $2, where
# the SB 0.50 and the BB is $1, after the turn the minimum bet amount is $2....
amount = self.bb
self.bets['BLINDSANTES'][player].append(Decimal(self.sb))

3
pyfpdb/Hud.py

@ -87,6 +87,7 @@ class Hud:
(font, font_size) = config.get_default_font(self.table.site)
self.colors = config.get_default_colors(self.table.site)
self.hud_ui = config.get_hud_ui_parameters()
self.site_params = config.get_site_parameters(self.table.site)
self.backgroundcolor = gtk.gdk.color_parse(self.colors['hudbgcolor'])
self.foregroundcolor = gtk.gdk.color_parse(self.colors['hudfgcolor'])
@ -457,7 +458,7 @@ class Hud:
if self.table.x != x or self.table.y != y:
self.table.x = x
self.table.y = y
self.main_window.move(x, y)
self.main_window.move(x + self.site_params['xshift'], y + self.site_params['yshift'])
adj = self.adj_seats(self.hand, self.config)
loc = self.config.get_locations(self.table.site, self.max)
# TODO: is stat_windows getting converted somewhere from a list to a dict, for no good reason?

14
pyfpdb/PokerStarsToFpdb.py

@ -145,13 +145,12 @@ class PokerStars(HandHistoryConverter):
mg = m.groupdict()
# translations from captured groups to fpdb info strings
Lim_Blinds = { '0.04': ('0.01', '0.02'), '0.10': ('0.02', '0.05'), '0.20': ('0.05', '0.10'),
'0.50': ('0.10', '0.25'), '1.00': ('0.25', '0.50'), '2.00': ('0.50', '1.00'),
'2': ('0.50', '1.00'), '4': ('1.00', '2.00'), '6': ('1.00', '3.00'),
'4.00': ('1.00', '2.00'), '6.00': ('1.00', '3.00'), '10.00': ('2.00', '5.00'),
'20.00': ('5.00', '10.00'), '30.00': ('10.00', '15.00'), '60.00': ('15.00', '30.00'),
'100.00': ('25.00', '50.00'),'200.00': ('50.00', '100.00'),'400.00': ('100.00', '200.00'),
'1000.00': ('250.00', '500.00')}
'0.40': ('0.10', '0.20'), '0.50': ('0.10', '0.25'), '1.00': ('0.25', '0.50'),
'2.00': ('0.50', '1.00'), '2': ('0.50', '1.00'), '4' : ('1.00', '2.00'),
'4.00': ('1.00', '2.00'), '6': ('1.00', '3.00'), '6.00': ('1.00', '3.00'),
'10.00': ('2.00', '5.00'), '20.00': ('5.00', '10.00'), '30.00': ('10.00', '15.00'),
'60.00': ('15.00', '30.00'), '100.00': ('25.00', '50.00'), '200.00': ('50.00', '100.00'),
'400.00': ('100.00', '200.00'), '1000.00': ('250.00', '500.00')}
limits = { 'No Limit':'nl', 'Pot Limit':'pl', 'Limit':'fl', 'LIMIT':'fl' }
games = { # base, category
@ -196,7 +195,6 @@ class PokerStars(HandHistoryConverter):
log.error("determineGameType: Raising FpdbParseError")
raise FpdbParseError("Lim_Blinds has no lookup for '%s'" % mg['BB'])
# NB: SB, BB must be interpreted as blinds or bets depending on limit type.
return info
def readHandInfo(self, hand):

280
pyfpdb/SQL.py

@ -819,7 +819,6 @@ class Sql:
street2Raises INT,
street3Raises INT,
street4Raises INT,
actionString REAL)
"""
@ -1337,6 +1336,21 @@ class Sql:
sum(hc.street3CheckCallRaiseDone) AS ccr_3,
sum(hc.street4CheckCallRaiseChance) AS ccr_opp_4,
sum(hc.street4CheckCallRaiseDone) AS ccr_4
sum(hc.street0Calls) AS call_0,
sum(hc.street1Calls) AS call_1,
sum(hc.street2Calls) AS call_2,
sum(hc.street3Calls) AS call_3,
sum(hc.street4Calls) AS call_4,
sum(hc.street0Bets) AS bet_0,
sum(hc.street1Bets) AS bet_1,
sum(hc.street2Bets) AS bet_2,
sum(hc.street3Bets) AS bet_3,
sum(hc.street4Bets) AS bet_4,
sum(hc.street0Raises) AS raise_0,
sum(hc.street1Raises) AS raise_1,
sum(hc.street2Raises) AS raise_2,
sum(hc.street3Raises) AS raise_3,
sum(hc.street4Raises) AS raise_4
FROM Hands h
INNER JOIN HandsPlayers hp ON (hp.handId = h.id)
INNER JOIN HudCache hc ON ( hc.PlayerId = hp.PlayerId+0
@ -1420,7 +1434,22 @@ class Sql:
sum(hc.street3CheckCallRaiseChance) AS ccr_opp_3,
sum(hc.street3CheckCallRaiseDone) AS ccr_3,
sum(hc.street4CheckCallRaiseChance) AS ccr_opp_4,
sum(hc.street4CheckCallRaiseDone) AS ccr_4
sum(hc.street4CheckCallRaiseDone) AS ccr_4,
sum(hc.street0Calls) AS call_0,
sum(hc.street1Calls) AS call_1,
sum(hc.street2Calls) AS call_2,
sum(hc.street3Calls) AS call_3,
sum(hc.street4Calls) AS call_4,
sum(hc.street0Bets) AS bet_0,
sum(hc.street1Bets) AS bet_1,
sum(hc.street2Bets) AS bet_2,
sum(hc.street3Bets) AS bet_3,
sum(hc.street4Bets) AS bet_4,
sum(hc.street0Raises) AS raise_0,
sum(hc.street1Raises) AS raise_1,
sum(hc.street2Raises) AS raise_2,
sum(hc.street3Raises) AS raise_3,
sum(hc.street4Raises) AS raise_4
FROM Hands h
INNER JOIN HandsPlayers hp ON (hp.handId = h.id)
INNER JOIN HudCache hc ON (hc.playerId = hp.playerId)
@ -1531,7 +1560,22 @@ class Sql:
cast(hp2.street3CheckCallRaiseChance as <signed>integer) AS ccr_opp_3,
cast(hp2.street3CheckCallRaiseDone as <signed>integer) AS ccr_3,
cast(hp2.street4CheckCallRaiseChance as <signed>integer) AS ccr_opp_4,
cast(hp2.street4CheckCallRaiseDone as <signed>integer) AS ccr_4
cast(hp2.street4CheckCallRaiseDone as <signed>integer) AS ccr_4,
cast(hp2.street0Calls as <signed>integer) AS call_0,
cast(hp2.street1Calls as <signed>integer) AS call_1,
cast(hp2.street2Calls as <signed>integer) AS call_2,
cast(hp2.street3Calls as <signed>integer) AS call_3,
cast(hp2.street4Calls as <signed>integer) AS call_4,
cast(hp2.street0Bets as <signed>integer) AS bet_0,
cast(hp2.street1Bets as <signed>integer) AS bet_1,
cast(hp2.street2Bets as <signed>integer) AS bet_2,
cast(hp2.street3Bets as <signed>integer) AS bet_3,
cast(hp2.street4Bets as <signed>integer) AS bet_4,
cast(hp2.street0Raises as <signed>integer) AS raise_0,
cast(hp2.street1Raises as <signed>integer) AS raise_1,
cast(hp2.street2Raises as <signed>integer) AS raise_2,
cast(hp2.street3Raises as <signed>integer) AS raise_3,
cast(hp2.street4Raises as <signed>integer) AS raise_4
FROM
Hands h
INNER JOIN Hands h2 ON (h2.id > %s AND h2.tableName = h.tableName)
@ -1618,8 +1662,23 @@ class Sql:
cast(hp2.street3CheckCallRaiseChance as <signed>integer) AS ccr_opp_3,
cast(hp2.street3CheckCallRaiseDone as <signed>integer) AS ccr_3,
cast(hp2.street4CheckCallRaiseChance as <signed>integer) AS ccr_opp_4,
cast(hp2.street4CheckCallRaiseDone as <signed>integer) AS ccr_4
FROM Hands h /* this hand */
cast(hp2.street4CheckCallRaiseDone as <signed>integer) AS ccr_4,
cast(hp2.street0Calls as <signed>integer) AS call_0,
cast(hp2.street1Calls as <signed>integer) AS call_1,
cast(hp2.street2Calls as <signed>integer) AS call_2,
cast(hp2.street3Calls as <signed>integer) AS call_3,
cast(hp2.street4Calls as <signed>integer) AS call_4,
cast(hp2.street0Bets as <signed>integer) AS bet_0,
cast(hp2.street1Bets as <signed>integer) AS bet_1,
cast(hp2.street2Bets as <signed>integer) AS bet_2,
cast(hp2.street3Bets as <signed>integer) AS bet_3,
cast(hp2.street4Bets as <signed>integer) AS bet_4,
cast(hp2.street0Raises as <signed>integer) AS raise_0,
cast(hp2.street1Raises as <signed>integer) AS raise_1,
cast(hp2.street2Raises as <signed>integer) AS raise_2,
cast(hp2.street3Raises as <signed>integer) AS raise_3,
cast(hp2.street4Raises as <signed>integer) AS raise_4
FROM Hands h /* this hand */
INNER JOIN Hands h2 ON ( h2.id > %s /* other hands */
AND h2.tableName = h.tableName)
INNER JOIN HandsPlayers hp ON (h.id = hp.handId) /* players in this hand */
@ -1706,8 +1765,23 @@ class Sql:
cast(hp2.street3CheckCallRaiseChance as <signed>integer) AS ccr_opp_3,
cast(hp2.street3CheckCallRaiseDone as <signed>integer) AS ccr_3,
cast(hp2.street4CheckCallRaiseChance as <signed>integer) AS ccr_opp_4,
cast(hp2.street4CheckCallRaiseDone as <signed>integer) AS ccr_4
FROM Hands h /* this hand */
cast(hp2.street4CheckCallRaiseDone as <signed>integer) AS ccr_4,
cast(hp2.street0Calls as <signed>integer) AS call_0,
cast(hp2.street1Calls as <signed>integer) AS call_1,
cast(hp2.street2Calls as <signed>integer) AS call_2,
cast(hp2.street3Calls as <signed>integer) AS call_3,
cast(hp2.street4Calls as <signed>integer) AS call_4,
cast(hp2.street0Bets as <signed>integer) AS bet_0,
cast(hp2.street1Bets as <signed>integer) AS bet_1,
cast(hp2.street2Bets as <signed>integer) AS bet_2,
cast(hp2.street3Bets as <signed>integer) AS bet_3,
cast(hp2.street4Bets as <signed>integer) AS bet_4,
cast(hp2.street0Raises as <signed>integer) AS raise_0,
cast(hp2.street1Raises as <signed>integer) AS raise_1,
cast(hp2.street2Raises as <signed>integer) AS raise_2,
cast(hp2.street3Raises as <signed>integer) AS raise_3,
cast(hp2.street4Raises as <signed>integer) AS raise_4
FROM Hands h /* this hand */
INNER JOIN Hands h2 ON ( h2.id > %s /* other hands */
AND h2.tableName = h.tableName)
INNER JOIN HandsPlayers hp ON (h.id = hp.handId) /* players in this hand */
@ -1913,6 +1987,18 @@ class Sql:
else 100.0*(sum(cast(hp.street1Aggr as <signed>integer))+sum(cast(hp.street2Aggr as <signed>integer))+sum(cast(hp.street3Aggr as <signed>integer)))
/(sum(cast(hp.street1Seen as <signed>integer))+sum(cast(hp.street2Seen as <signed>integer))+sum(cast(hp.street3Seen as <signed>integer)))
end AS pofafq
,case when sum(cast(hp.street1Calls as <signed>integer))+ sum(cast(hp.street2Calls as <signed>integer))+ sum(cast(hp.street3Calls as <signed>integer))+ sum(cast(hp.street4Calls as <signed>integer)) = 0 then -999
else (sum(cast(hp.street1Aggr as <signed>integer)) + sum(cast(hp.street2Aggr as <signed>integer)) + sum(cast(hp.street3Aggr as <signed>integer)) + sum(cast(hp.street4Aggr as <signed>integer)))
/(sum(cast(hp.street1Calls as <signed>integer))+ sum(cast(hp.street2Calls as <signed>integer))+ sum(cast(hp.street3Calls as <signed>integer))+ sum(cast(hp.street4Calls as <signed>integer)))
end AS aggfac
,100.0*(sum(cast(hp.street1Aggr as <signed>integer)) + sum(cast(hp.street2Aggr as <signed>integer)) + sum(cast(hp.street3Aggr as <signed>integer)) + sum(cast(hp.street4Aggr as <signed>integer)))
/ ((sum(cast(hp.foldToOtherRaisedStreet1 as <signed>integer))+ sum(cast(hp.foldToOtherRaisedStreet2 as <signed>integer))+ sum(cast(hp.foldToOtherRaisedStreet3 as <signed>integer))+ sum(cast(hp.foldToOtherRaisedStreet4 as <signed>integer))) +
(sum(cast(hp.street1Calls as <signed>integer))+ sum(cast(hp.street2Calls as <signed>integer))+ sum(cast(hp.street3Calls as <signed>integer))+ sum(cast(hp.street4Calls as <signed>integer))) +
(sum(cast(hp.street1Aggr as <signed>integer)) + sum(cast(hp.street2Aggr as <signed>integer)) + sum(cast(hp.street3Aggr as <signed>integer)) + sum(cast(hp.street4Aggr as <signed>integer))) )
AS aggfrq
,100.0*(sum(cast(hp.street1CBDone as <signed>integer)) + sum(cast(hp.street2CBDone as <signed>integer)) + sum(cast(hp.street2CBDone as <signed>integer)) + sum(cast(hp.street4CBDone as <signed>integer)))
/ (sum(cast(hp.street1CBChance as <signed>integer))+ sum(cast(hp.street2CBChance as <signed>integer))+ sum(cast(hp.street3CBChance as <signed>integer))+ sum(cast(hp.street4CBChance as <signed>integer)))
AS conbet
,sum(hp.totalProfit)/100.0 AS net
,sum(hp.rake)/100.0 AS rake
,100.0*avg(hp.totalProfit/(gt.bigBlind+0.0)) AS bbper100
@ -1998,6 +2084,18 @@ class Sql:
else 100.0*(sum(cast(hp.street1Aggr as <signed>integer))+sum(cast(hp.street2Aggr as <signed>integer))+sum(cast(hp.street3Aggr as <signed>integer)))
/(sum(cast(hp.street1Seen as <signed>integer))+sum(cast(hp.street2Seen as <signed>integer))+sum(cast(hp.street3Seen as <signed>integer)))
end AS pofafq
,case when sum(cast(hp.street1Calls as <signed>integer))+ sum(cast(hp.street2Calls as <signed>integer))+ sum(cast(hp.street3Calls as <signed>integer))+ sum(cast(hp.street4Calls as <signed>integer)) = 0 then -999
else (sum(cast(hp.street1Aggr as <signed>integer)) + sum(cast(hp.street2Aggr as <signed>integer)) + sum(cast(hp.street3Aggr as <signed>integer)) + sum(cast(hp.street4Aggr as <signed>integer)))
/(sum(cast(hp.street1Calls as <signed>integer))+ sum(cast(hp.street2Calls as <signed>integer))+ sum(cast(hp.street3Calls as <signed>integer))+ sum(cast(hp.street4Calls as <signed>integer)))
end AS aggfac
,100.0*(sum(cast(hp.street1Aggr as <signed>integer)) + sum(cast(hp.street2Aggr as <signed>integer)) + sum(cast(hp.street3Aggr as <signed>integer)) + sum(cast(hp.street4Aggr as <signed>integer)))
/ ((sum(cast(hp.foldToOtherRaisedStreet1 as <signed>integer))+ sum(cast(hp.foldToOtherRaisedStreet2 as <signed>integer))+ sum(cast(hp.foldToOtherRaisedStreet3 as <signed>integer))+ sum(cast(hp.foldToOtherRaisedStreet4 as <signed>integer))) +
(sum(cast(hp.street1Calls as <signed>integer))+ sum(cast(hp.street2Calls as <signed>integer))+ sum(cast(hp.street3Calls as <signed>integer))+ sum(cast(hp.street4Calls as <signed>integer))) +
(sum(cast(hp.street1Aggr as <signed>integer)) + sum(cast(hp.street2Aggr as <signed>integer)) + sum(cast(hp.street3Aggr as <signed>integer)) + sum(cast(hp.street4Aggr as <signed>integer))) )
AS aggfrq
,100.0*(sum(cast(hp.street1CBDone as <signed>integer)) + sum(cast(hp.street2CBDone as <signed>integer)) + sum(cast(hp.street2CBDone as <signed>integer)) + sum(cast(hp.street4CBDone as <signed>integer)))
/ (sum(cast(hp.street1CBChance as <signed>integer))+ sum(cast(hp.street2CBChance as <signed>integer))+ sum(cast(hp.street3CBChance as <signed>integer))+ sum(cast(hp.street4CBChance as <signed>integer)))
AS conbet
,sum(hp.totalProfit)/100.0 AS net
,sum(hp.rake)/100.0 AS rake
,100.0*avg(hp.totalProfit/(gt.bigBlind+0.0)) AS bbper100
@ -2084,6 +2182,18 @@ class Sql:
else 100.0*(sum(cast(hp.street1Aggr as <signed>integer))+sum(cast(hp.street2Aggr as <signed>integer))+sum(cast(hp.street3Aggr as <signed>integer)))
/(sum(cast(hp.street1Seen as <signed>integer))+sum(cast(hp.street2Seen as <signed>integer))+sum(cast(hp.street3Seen as <signed>integer)))
end AS pofafq
,case when sum(cast(hp.street1Calls as <signed>integer))+ sum(cast(hp.street2Calls as <signed>integer))+ sum(cast(hp.street3Calls as <signed>integer))+ sum(cast(hp.street4Calls as <signed>integer)) = 0 then -999
else (sum(cast(hp.street1Aggr as <signed>integer)) + sum(cast(hp.street2Aggr as <signed>integer)) + sum(cast(hp.street3Aggr as <signed>integer)) + sum(cast(hp.street4Aggr as <signed>integer)))
/(sum(cast(hp.street1Calls as <signed>integer))+ sum(cast(hp.street2Calls as <signed>integer))+ sum(cast(hp.street3Calls as <signed>integer))+ sum(cast(hp.street4Calls as <signed>integer)))
end AS aggfac
,100.0*(sum(cast(hp.street1Aggr as <signed>integer)) + sum(cast(hp.street2Aggr as <signed>integer)) + sum(cast(hp.street3Aggr as <signed>integer)) + sum(cast(hp.street4Aggr as <signed>integer)))
/ ((sum(cast(hp.foldToOtherRaisedStreet1 as <signed>integer))+ sum(cast(hp.foldToOtherRaisedStreet2 as <signed>integer))+ sum(cast(hp.foldToOtherRaisedStreet3 as <signed>integer))+ sum(cast(hp.foldToOtherRaisedStreet4 as <signed>integer))) +
(sum(cast(hp.street1Calls as <signed>integer))+ sum(cast(hp.street2Calls as <signed>integer))+ sum(cast(hp.street3Calls as <signed>integer))+ sum(cast(hp.street4Calls as <signed>integer))) +
(sum(cast(hp.street1Aggr as <signed>integer)) + sum(cast(hp.street2Aggr as <signed>integer)) + sum(cast(hp.street3Aggr as <signed>integer)) + sum(cast(hp.street4Aggr as <signed>integer))) )
AS aggfrq
,100.0*(sum(cast(hp.street1CBDone as <signed>integer)) + sum(cast(hp.street2CBDone as <signed>integer)) + sum(cast(hp.street2CBDone as <signed>integer)) + sum(cast(hp.street4CBDone as <signed>integer)))
/ (sum(cast(hp.street1CBChance as <signed>integer))+ sum(cast(hp.street2CBChance as <signed>integer))+ sum(cast(hp.street3CBChance as <signed>integer))+ sum(cast(hp.street4CBChance as <signed>integer)))
AS conbet
,sum(hp.totalProfit)/100.0 AS net
,sum(hp.rake)/100.0 AS rake
,100.0*avg(hp.totalProfit/(gt.bigBlind+0.0)) AS bbper100
@ -2632,24 +2742,6 @@ class Sql:
GROUP BY h.handStart, hp.handId, hp.sawShowdown, hp.totalProfit
ORDER BY h.handStart"""
####################################
# Session stats query
####################################
if db_server == 'mysql':
self.query['sessionStats'] = """
SELECT UNIX_TIMESTAMP(h.handStart) as time, hp.handId, hp.startCash, hp.winnings, hp.totalProfit
FROM HandsPlayers hp
INNER JOIN Players pl ON (pl.id = hp.playerId)
INNER JOIN Hands h ON (h.id = hp.handId)
INNER JOIN Gametypes gt ON (gt.id = h.gametypeId)
WHERE pl.id in <player_test>
AND pl.siteId in <site_test>
AND h.handStart > '<startdate_test>'
AND h.handStart < '<enddate_test>'
<limit_test>
AND hp.tourneysPlayersId IS NULL
GROUP BY h.handStart, hp.handId, hp.totalProfit
ORDER BY h.handStart"""
####################################
# Session stats query
@ -2664,6 +2756,7 @@ class Sql:
INNER JOIN Players p on (p.Id = hp.playerId)
WHERE hp.playerId in <player_test>
AND date_format(h.handStart, '%Y-%m-%d') <datestest>
AND hp.tourneysPlayersId IS NULL
ORDER by time"""
elif db_server == 'postgresql':
self.query['sessionStats'] = """
@ -2675,6 +2768,7 @@ class Sql:
INNER JOIN Players p on (p.Id = hp.playerId)
WHERE hp.playerId in <player_test>
AND h.handStart <datestest>
AND hp.tourneysPlayersId IS NULL
ORDER by time"""
elif db_server == 'sqlite':
self.query['sessionStats'] = """
@ -2686,6 +2780,7 @@ class Sql:
INNER JOIN Players p on (p.Id = hp.playerId)
WHERE hp.playerId in <player_test>
AND h.handStart <datestest>
AND hp.tourneysPlayersId IS NULL
ORDER by time"""
@ -2759,6 +2854,21 @@ class Sql:
,street3CheckCallRaiseDone
,street4CheckCallRaiseChance
,street4CheckCallRaiseDone
,street0Calls
,street1Calls
,street2Calls
,street3Calls
,street4Calls
,street0Bets
,street1Bets
,street2Bets
,street3Bets
,street4Bets
,street0Raises
,street1Raises
,street2Raises
,street3Raises
,street4Raises
)
SELECT h.gametypeId
,hp.playerId
@ -2834,6 +2944,21 @@ class Sql:
,sum(street3CheckCallRaiseDone)
,sum(street4CheckCallRaiseChance)
,sum(street4CheckCallRaiseDone)
,sum(street0Calls)
,sum(street1Calls)
,sum(street2Calls)
,sum(street3Calls)
,sum(street4Calls)
,sum(street0Bets)
,sum(street1Bets)
,sum(street2Bets)
,sum(street3Bets)
,sum(street4Bets)
,sum(hp.street0Raises)
,sum(hp.street1Raises)
,sum(hp.street2Raises)
,sum(hp.street3Raises)
,sum(hp.street4Raises)
FROM HandsPlayers hp
INNER JOIN Hands h ON (h.id = hp.handId)
<where_clause>
@ -2908,6 +3033,21 @@ class Sql:
,street3CheckCallRaiseDone
,street4CheckCallRaiseChance
,street4CheckCallRaiseDone
,street0Calls
,street1Calls
,street2Calls
,street3Calls
,street4Calls
,street0Bets
,street1Bets
,street2Bets
,street3Bets
,street4Bets
,street0Raises
,street1Raises
,street2Raises
,street3Raises
,street4Raises
)
SELECT h.gametypeId
,hp.playerId
@ -2983,6 +3123,21 @@ class Sql:
,sum(CAST(street3CheckCallRaiseDone as integer))
,sum(CAST(street4CheckCallRaiseChance as integer))
,sum(CAST(street4CheckCallRaiseDone as integer))
,sum(CAST(street0Calls as integer))
,sum(CAST(street1Calls as integer))
,sum(CAST(street2Calls as integer))
,sum(CAST(street3Calls as integer))
,sum(CAST(street4Calls as integer))
,sum(CAST(street0Bets as integer))
,sum(CAST(street1Bets as integer))
,sum(CAST(street2Bets as integer))
,sum(CAST(street3Bets as integer))
,sum(CAST(street4Bets as integer))
,sum(CAST(hp.street0Raises as integer))
,sum(CAST(hp.street1Raises as integer))
,sum(CAST(hp.street2Raises as integer))
,sum(CAST(hp.street3Raises as integer))
,sum(CAST(hp.street4Raises as integer))
FROM HandsPlayers hp
INNER JOIN Hands h ON (h.id = hp.handId)
<where_clause>
@ -3057,6 +3212,21 @@ class Sql:
,street3CheckCallRaiseDone
,street4CheckCallRaiseChance
,street4CheckCallRaiseDone
,street0Calls
,street1Calls
,street2Calls
,street3Calls
,street4Calls
,street0Bets
,street1Bets
,street2Bets
,street3Bets
,street4Bets
,street0Raises
,street1Raises
,street2Raises
,street3Raises
,street4Raises
)
SELECT h.gametypeId
,hp.playerId
@ -3132,6 +3302,21 @@ class Sql:
,sum(CAST(street3CheckCallRaiseDone as integer))
,sum(CAST(street4CheckCallRaiseChance as integer))
,sum(CAST(street4CheckCallRaiseDone as integer))
,sum(CAST(street0Calls as integer))
,sum(CAST(street1Calls as integer))
,sum(CAST(street2Calls as integer))
,sum(CAST(street3Calls as integer))
,sum(CAST(street4Calls as integer))
,sum(CAST(street0Bets as integer))
,sum(CAST(street1Bets as integer))
,sum(CAST(street2Bets as integer))
,sum(CAST(street3Bets as integer))
,sum(CAST(street4Bets as integer))
,sum(CAST(hp.street0Raises as integer))
,sum(CAST(hp.street1Raises as integer))
,sum(CAST(hp.street2Raises as integer))
,sum(CAST(hp.street3Raises as integer))
,sum(CAST(hp.street4Raises as integer))
FROM HandsPlayers hp
INNER JOIN Hands h ON (h.id = hp.handId)
<where_clause>
@ -3205,7 +3390,22 @@ class Sql:
street3CheckCallRaiseChance,
street3CheckCallRaiseDone,
street4CheckCallRaiseChance,
street4CheckCallRaiseDone)
street4CheckCallRaiseDone,
street0Calls,
street1Calls,
street2Calls,
street3Calls,
street4Calls,
street0Bets,
street1Bets,
street2Bets,
street3Bets,
street4Bets,
street0Raises,
street1Raises,
street2Raises,
street3Raises,
street4Raises)
VALUES (%s, %s, %s, %s, %s,
%s, %s, %s, %s, %s,
%s, %s, %s, %s, %s,
@ -3218,6 +3418,9 @@ class Sql:
%s, %s, %s, %s, %s,
%s, %s, %s, %s, %s,
%s, %s, %s, %s, %s,
%s, %s, %s, %s, %s,
%s, %s, %s, %s, %s,
%s, %s, %s, %s, %s,
%s)"""
self.query['update_hudcache'] = """
@ -3276,7 +3479,22 @@ class Sql:
street3CheckCallRaiseChance=street3CheckCallRaiseChance+%s,
street3CheckCallRaiseDone=street3CheckCallRaiseDone+%s,
street4CheckCallRaiseChance=street4CheckCallRaiseChance+%s,
street4CheckCallRaiseDone=street4CheckCallRaiseDone+%s
street4CheckCallRaiseDone=street4CheckCallRaiseDone+%s,
street0Calls=street0Calls+%s,
street1Calls=street1Calls+%s,
street2Calls=street2Calls+%s,
street3Calls=street3Calls+%s,
street4Calls=street4Calls+%s,
street0Bets=street0Bets+%s,
street1Bets=street1Bets+%s,
street2Bets=street2Bets+%s,
street3Bets=street3Bets+%s,
street4Bets=street4Bets+%s,
street0Raises=street0Raises+%s,
street1Raises=street1Raises+%s,
street2Raises=street2Raises+%s,
street3Raises=street3Raises+%s,
street4Raises=street4Raises+%s
WHERE gametypeId+0=%s
AND playerId=%s
AND activeSeats=%s
@ -3602,7 +3820,12 @@ class Sql:
street3CheckCallRaiseChance,
street3CheckCallRaiseDone,
street4CheckCallRaiseChance,
street4CheckCallRaiseDone
street4CheckCallRaiseDone,
street0Raises,
street1Raises,
street2Raises,
street3Raises,
street4Raises
)
VALUES (
%s, %s, %s, %s, %s,
@ -3620,6 +3843,7 @@ class Sql:
%s, %s, %s, %s, %s,
%s, %s, %s, %s, %s,
%s, %s, %s, %s, %s,
%s, %s, %s, %s, %s,
%s, %s, %s, %s, %s
)"""

92
pyfpdb/Stats.py

@ -1,4 +1,5 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Manage collecting and formatting of stats and tooltips.
"""
@ -114,7 +115,7 @@ def playername(stat_dict, player):
stat_dict[player]['screen_name'])
def vpip(stat_dict, player):
""" Voluntarily put $ in the pot."""
""" Voluntarily put $ in the pot pre-flop."""
stat = 0.0
try:
stat = float(stat_dict[player]['vpip'])/float(stat_dict[player]['n'])
@ -123,14 +124,14 @@ def vpip(stat_dict, player):
'v=%3.1f' % (100*stat) + '%',
'vpip=%3.1f' % (100*stat) + '%',
'(%d/%d)' % (stat_dict[player]['vpip'], stat_dict[player]['n']),
'Voluntarily Put In Pot %'
'Voluntarily Put In Pot Pre-Flop%'
)
except: return (stat,
'%3.1f' % (0) + '%',
'v=%3.1f' % (0) + '%',
'vpip=%3.1f' % (0) + '%',
'(%d/%d)' % (0, 0),
'Voluntarily Put In Pot %'
'Voluntarily Put In Pot Pre-Flop%'
)
def pfr(stat_dict, player):
@ -503,6 +504,91 @@ def a_freq_123(stat_dict, player):
'(%d/%d)' % (0, 0),
'Post-Flop Aggression Freq'
)
def agg_freq(stat_dict, player):
""" Post-Flop aggression frequency."""
""" Aggression frequency % = (times bet or raised post-flop) * 100 / (times bet, raised, called, or folded post-flop) """
stat = 0.0
try:
""" Agression on the flop and all streets """
bet_raise = stat_dict[player]['aggr_1'] + stat_dict[player]['aggr_2'] + stat_dict[player]['aggr_3'] + stat_dict[player]['aggr_4']
""" number post flop streets seen, this must be number of post-flop calls !! """
post_call = stat_dict[player]['call_1'] + stat_dict[player]['call_2'] + stat_dict[player]['call_3'] + stat_dict[player]['call_4']
""" Number of post flop folds this info is not yet in the database """
post_fold = stat_dict[player]['f_freq_1'] + stat_dict[player]['f_freq_2'] + stat_dict[player]['f_freq_3'] + stat_dict[player]['f_freq_4']
stat = float (bet_raise) / float(post_call + post_fold + bet_raise)
return (stat,
'%3.1f' % (100*stat) + '%',
'afr=%3.1f' % (100*stat) + '%',
'agg_fr=%3.1f' % (100*stat) + '%',
'(%d/%d)' % (bet_raise, (post_call + post_fold + bet_raise)),
'Aggression Freq'
)
except:
return (stat,
'%2.1f' % (0) + '%',
'af=%3.1f' % (0) + '%',
'agg_f=%3.1f' % (0) + '%',
'(%d/%d)' % (0, 0),
'Aggression Freq'
)
def agg_fact(stat_dict, player):
""" Post-Flop aggression frequency."""
""" Aggression factor = (times bet or raised post-flop) / (times called post-flop) """
stat = 0.0
try:
bet_raise = stat_dict[player]['aggr_1'] + stat_dict[player]['aggr_2'] + stat_dict[player]['aggr_3'] + stat_dict[player]['aggr_4']
post_call = stat_dict[player]['call_1'] + stat_dict[player]['call_2'] + stat_dict[player]['call_3'] + stat_dict[player]['call_4']
if post_call > 0:
stat = float (bet_raise) / float(post_call)
else:
stat = float (bet_raise)
return (stat,
'%2.2f' % (stat) ,
'afa=%2.2f' % (stat) ,
'agg_fa=%2.2f' % (stat) ,
'(%d/%d)' % (bet_raise, post_call),
'Aggression Factor'
)
except:
return (stat,
'%2.2f' % (0) ,
'afa=%2.2f' % (0) ,
'agg_fa=%2.2f' % (0),
'(%d/%d)' % (0, 0),
'Aggression Factor'
)
def cbet(stat_dict, player):
""" Flop continuation bet."""
""" Continuation bet % = (times made a continuation bet on the flop) * 100 / (number of opportunities to make a continuation bet on the flop) """
stat = 0.0
try:
cbets = stat_dict[player]['cb_1']+stat_dict[player]['cb_2']+stat_dict[player]['cb_3']+stat_dict[player]['cb_4']
oppt = stat_dict[player]['cb_opp_1']+stat_dict[player]['cb_opp_2']+stat_dict[player]['cb_opp_3']+stat_dict[player]['cb_opp_4']
stat = float(cbets)/float(oppt)
return (stat,
'%3.1f' % (100*stat) + '%',
'cbet=%3.1f' % (100*stat) + '%',
'cbet=%3.1f' % (100*stat) + '%',
'(%d/%d)' % (cbets, oppt),
'% continuation bet '
)
except:
return (stat,
'%3.1f' % (0) + '%',
'cbet=%3.1f' % (0) + '%',
'cbet=%3.1f' % (0) + '%',
'(%d/%d)' % (0, 0),
'% continuation bet '
)
def cb1(stat_dict, player):
""" Flop continuation bet."""

31
pyfpdb/fpdb.py

@ -1,31 +0,0 @@
#!/usr/bin/python
#Copyright 2008 Steffen Jobbagy-Felso
#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 in the docs folder of the package.
# Users should run fpdb.pyw now, this is included in case they still try to run fpdb.py
import os
import sys
#print "fpdb.py has now been renamed to fpdb.pyw - calling fpdb.pyw ...\n"
sys.stdout.write('fpdb.py has been renamed to fpdb.pyw - now calling fpdb.pyw ...\n\n')
sys.stdout.flush()
os.execvpe('pythonw.exe', ('pythonw.exe', 'fpdb.pyw', '-r'), os.environ)
# first arg is ignored (name of program being run)

82
pyfpdb/fpdb.pyw

@ -1,4 +1,5 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
#Copyright 2008 Steffen Jobbagy-Felso
#This program is free software: you can redistribute it and/or modify
@ -35,7 +36,7 @@ if os.name == 'nt' and sys.version[0:3] not in ('2.5', '2.6') and '-r' not in sy
os.environ['PATH'] = tmppath
print "Python " + sys.version[0:3] + ' - press return to continue\n'
sys.stdin.readline()
os.execvpe('python.exe', ('python.exe', 'fpdb.py', '-r'), os.environ) # first arg is ignored (name of program being run)
os.execvpe('pythonw.exe', ('pythonw.exe', 'fpdb.pyw', '-r'), os.environ) # first arg is ignored (name of program being run)
else:
print "\npython 2.5 not found, please install python 2.5 or 2.6 for fpdb\n"
raw_input("Press ENTER to continue.")
@ -110,7 +111,7 @@ import Database
import Configuration
import Exceptions
VERSION = "0.20"
VERSION = "0.20-pre1"
class fpdb:
@ -226,12 +227,12 @@ class fpdb:
dia = gtk.AboutDialog()
dia.set_name("Free Poker Database (FPDB)")
dia.set_version(VERSION)
dia.set_copyright("2008-2010, Steffen, Eratosthenes, s0rrow, EricBlade, _mt, sqlcoder, Bostik, and others")
dia.set_copyright("2008-2010, Steffen, Eratosthenes, Carl Gherardi, Eric Blade, _mt, sqlcoder, Bostik, and others")
dia.set_comments("GTK AboutDialog comments here")
dia.set_license("GPL v3")
dia.set_website("http://fpdb.sourceforge.net/")
dia.set_authors(['Steffen', 'Eratosthenes', 's0rrow',
'EricBlade', '_mt', 'sqlcoder', 'Bostik', 'and others'])
dia.set_authors(['Steffen', 'Eratosthenes', 'Carl Gherardi',
'Eric Blade', '_mt', 'sqlcoder', 'Bostik', 'and others'])
dia.set_program_name("Free Poker Database (FPDB)")
db_version = ""
@ -275,7 +276,7 @@ class fpdb:
gtk.STOCK_SAVE, gtk.RESPONSE_ACCEPT))
dia.set_default_size(700, 500)
prefs = GuiPrefs.GuiPrefs(self.config, self.window, dia.vbox)
prefs = GuiPrefs.GuiPrefs(self.config, self.window, dia.vbox, dia)
response = dia.run()
if response == gtk.RESPONSE_ACCEPT:
# save updated config
@ -283,11 +284,13 @@ class fpdb:
if len(self.nb_tab_names) == 1:
# only main tab open, reload profile
self.load_profile()
dia.destroy()
else:
dia.destroy() # destroy prefs before raising warning, otherwise parent is dia rather than self.window
self.warning_box("Updated preferences have not been loaded because "
+ "windows are open. Re-start fpdb to load them.")
dia.destroy()
else:
dia.destroy()
def dia_maintain_dbs(self, widget, data=None):
self.warning_box("Unimplemented: Maintain Databases")
@ -393,11 +396,13 @@ class fpdb:
if self.obtain_global_lock(): # returns true if successful
#lock_released = False
dia_confirm = gtk.MessageDialog(parent=None, flags=0, type=gtk.MESSAGE_WARNING,
dia_confirm = gtk.MessageDialog(parent=self.window, flags=gtk.DIALOG_DESTROY_WITH_PARENT, type=gtk.MESSAGE_WARNING,
buttons=(gtk.BUTTONS_YES_NO), message_format="Confirm deleting and recreating tables")
diastring = "Please confirm that you want to (re-)create the tables. If there already are tables in the database " \
+self.db.database+" on "+self.db.host+" they will be deleted."
dia_confirm.format_secondary_text(diastring)#todo: make above string with bold for db, host and deleted
# disable windowclose, do not want the the underlying processing interrupted mid-process
dia_confirm.set_deletable(False)
response = dia_confirm.run()
dia_confirm.destroy()
@ -412,6 +417,14 @@ class fpdb:
#else:
# for other dbs use same connection as holds global lock
# self.fdb_lock.fdb.recreate_tables()
# TODO: figure out why this seems to be necessary
dia_restart = gtk.MessageDialog(parent=self.window, flags=0, type=gtk.MESSAGE_WARNING,
buttons=(gtk.BUTTONS_OK), message_format="Restart fpdb")
diastring = "You should now restart fpdb."
dia_restart.format_secondary_text(diastring)
dia_restart.run()
dia_restart.destroy()
elif response == gtk.RESPONSE_NO:
print 'User cancelled recreating tables'
#if not lock_released:
@ -419,9 +432,11 @@ class fpdb:
def dia_recreate_hudcache(self, widget, data=None):
if self.obtain_global_lock():
self.dia_confirm = gtk.MessageDialog(parent=None, flags=0, type=gtk.MESSAGE_WARNING, buttons=(gtk.BUTTONS_YES_NO), message_format="Confirm recreating HUD cache")
self.dia_confirm = gtk.MessageDialog(parent=self.window, flags=gtk.DIALOG_DESTROY_WITH_PARENT, type=gtk.MESSAGE_WARNING, buttons=(gtk.BUTTONS_YES_NO), message_format="Confirm recreating HUD cache")
diastring = "Please confirm that you want to re-create the HUD cache."
self.dia_confirm.format_secondary_text(diastring)
# disable windowclose, do not want the the underlying processing interrupted mid-process
self.dia_confirm.set_deletable(False)
hb1 = gtk.HBox(True, 1)
self.h_start_date = gtk.Entry(max=12)
@ -469,16 +484,19 @@ class fpdb:
def dia_rebuild_indexes(self, widget, data=None):
if self.obtain_global_lock():
self.dia_confirm = gtk.MessageDialog(parent=None
,flags=0
self.dia_confirm = gtk.MessageDialog(parent=self.window
,flags=gtk.DIALOG_DESTROY_WITH_PARENT
,type=gtk.MESSAGE_WARNING
,buttons=(gtk.BUTTONS_YES_NO)
,message_format="Confirm rebuilding database indexes")
diastring = "Please confirm that you want to rebuild the database indexes."
self.dia_confirm.format_secondary_text(diastring)
# disable windowclose, do not want the the underlying processing interrupted mid-process
self.dia_confirm.set_deletable(False)
response = self.dia_confirm.run()
if response == gtk.RESPONSE_YES:
#FIXME these progress messages do not seem to work
lbl = gtk.Label(" Rebuilding Indexes ... ")
self.dia_confirm.vbox.add(lbl)
lbl.show()
@ -550,8 +568,13 @@ class fpdb:
pass
def __calendar_dialog(self, widget, entry):
self.dia_confirm.set_modal(False)
# do not alter the modality of the parent
# self.dia_confirm.set_modal(False)
d = gtk.Window(gtk.WINDOW_TOPLEVEL)
d.set_transient_for(self.dia_confirm)
d.set_destroy_with_parent(True)
d.set_modal(True)
d.set_title('Pick a date')
vb = gtk.VBox()
@ -714,7 +737,7 @@ class fpdb:
self.warning_box( "There is an error in your config file\n" + self.config.file
+ "\n\nError is: " + str(self.config.file_error)
, diatitle="CONFIG FILE ERROR" )
exit()
sys.exit()
log = Configuration.get_logger("logging.conf", "fpdb", log_dir=self.config.dir_log)
print "Logfile is " + os.path.join(self.config.dir_log, self.config.log_file) + "\n"
@ -875,9 +898,12 @@ class fpdb:
def tab_main_help(self, widget, data=None):
"""Displays a tab with the main fpdb help screen"""
mh_tab=gtk.Label("""Welcome to Fpdb!
For documentation please visit our website at http://fpdb.sourceforge.net/ or check the docs directory in the fpdb folder.
Please note that default.conf is no longer needed nor used, all configuration now happens in HUD_config.xml
This program is licensed under the AGPL3, see docs"""+os.sep+"agpl-3.0.txt")
This program is currently in an alpha-state, so our database format is still sometimes changed.
You should therefore always keep your hand history files so that you can re-import after an update, if necessary.
For documentation please visit our website at http://fpdb.sourceforge.net/.
If you need help click on Contact - Get Help on our website.
Please note that default.conf is no longer needed nor used, all configuration now happens in HUD_config.xml.
This program is licensed under the AGPL3, see agpl-3.0.txt in the fpdb installation directory.""")
self.add_and_display_tab(mh_tab, "Help")
def tab_table_viewer(self, widget, data=None):
@ -905,7 +931,11 @@ This program is licensed under the AGPL3, see docs"""+os.sep+"agpl-3.0.txt")
self.window.connect("destroy", self.destroy)
self.window.set_title("Free Poker DB - v%s or higher" % (VERSION, ))
self.window.set_border_width(1)
self.window.set_default_size(900,720)
defx, defy = 900, 720
sx, sy = gtk.gdk.screen_width(), gtk.gdk.screen_height()
if sx < defx: defx = sx
if sy < defy: defy = sy
self.window.set_default_size(defx, defy)
self.window.set_resizable(True)
self.main_vbox = gtk.VBox(False, 1)
@ -957,9 +987,15 @@ This program is licensed under the AGPL3, see docs"""+os.sep+"agpl-3.0.txt")
menuItem = gtk.ImageMenuItem(gtk.STOCK_ABOUT)
menuItem.connect('activate', self.dia_about)
self.statusMenu.append(menuItem)
menuItem = gtk.ImageMenuItem(gtk.STOCK_QUIT)
menuItem.connect('activate', self.quit)
self.statusMenu.append(menuItem)
# do not allow quit - if any transient (popup) windows are open (rebuild cache, rebuild index etc)
# quit from the tray causes a very very unclean shutdown, lockup of python process and failure to release global lock.
# fpdb window must be re-opened and the windows closed to quit
# menuItem = gtk.ImageMenuItem(gtk.STOCK_QUIT)
# menuItem.connect('activate', self.quit)
# self.statusMenu.append(menuItem)
self.statusIcon.connect('popup-menu', self.statusicon_menu, self.statusMenu)
self.statusIcon.set_visible(True)
@ -1006,7 +1042,7 @@ This program is licensed under the AGPL3, see docs"""+os.sep+"agpl-3.0.txt")
self.window.present()
def info_box(self, str1, str2):
diapath = gtk.MessageDialog( parent=None, flags=0, type=gtk.MESSAGE_INFO
diapath = gtk.MessageDialog( parent=self.window, flags=0, type=gtk.MESSAGE_INFO
, buttons=(gtk.BUTTONS_OK), message_format=str1 )
diapath.format_secondary_text(str2)
response = diapath.run()
@ -1014,7 +1050,7 @@ This program is licensed under the AGPL3, see docs"""+os.sep+"agpl-3.0.txt")
return response
def warning_box(self, str, diatitle="FPDB WARNING"):
diaWarning = gtk.Dialog(title=diatitle, parent=None, flags=0, buttons=(gtk.STOCK_OK,gtk.RESPONSE_OK))
diaWarning = gtk.Dialog(title=diatitle, parent=self.window, flags=0, buttons=(gtk.STOCK_OK,gtk.RESPONSE_OK))
label = gtk.Label(str)
diaWarning.vbox.add(label)

55
pyfpdb/py2exe_setup.py

@ -39,16 +39,14 @@ Py2exe script for fpdb.
# MSVCP90.dll. These are somewhere in your windows install, so you
# can just copy them to your working folder. (or just assume other
# person will have them? any copyright issues with including them?)
#- [ If it works, you'll have 3 new folders, build and dist and gfx. Build is
# working space and should be deleted. Dist and gfx contain the files to be
# distributed. ]
# If it works, you'll have a new dir fpdb-XXX-YYYYMMDD-exe which should
#- If it works, you'll have a new dir fpdb-YYYYMMDD-exe which should
# contain 2 dirs; gfx and pyfpdb and run_fpdb.bat
#- Last, you must copy the etc/, lib/ and share/ folders from your
# gtk/bin/ (just /gtk/?) folder to the pyfpdb folder. (the whole folders,
# not just the contents)
#- [ This bit is now automated:
# Last, you must copy the etc/, lib/ and share/ folders from your
# gtk/bin/ (just /gtk/?) folder to the pyfpdb folder. (the whole folders,
# not just the contents) ]
#- You can (should) then prune the etc/, lib/ and share/ folders to
# remove components we don't need.
# remove components we don't need. (see output at end of program run)
# sqlcoder notes: this worked for me with the following notes:
#- I used the following versions:
@ -116,11 +114,11 @@ test_and_remove('build')
today = date.today().strftime('%Y%m%d')
print "\n" + r"Output will be created in \pyfpdb\ and \fpdb_XXX_"+today+'\\'
print "Enter value for XXX (any length): ", # the comma means no newline
xxx = sys.stdin.readline().rstrip()
dist_dirname = r'fpdb-' + xxx + '-' + today + '-exe'
dist_dir = r'..\fpdb-' + xxx + '-' + today + '-exe'
print "\n" + r"Output will be created in \pyfpdb\ and \fpdb_"+today+'\\'
#print "Enter value for XXX (any length): ", # the comma means no newline
#xxx = sys.stdin.readline().rstrip()
dist_dirname = r'fpdb-' + today + '-exe'
dist_dir = r'..\fpdb-' + today + '-exe'
print
test_and_remove(dist_dir)
@ -137,7 +135,7 @@ setup(
options = {'py2exe': {
'packages' : ['encodings', 'matplotlib'],
'includes' : ['cairo', 'pango', 'pangocairo', 'atk', 'gobject'
'includes' : ['gio', 'cairo', 'pango', 'pangocairo', 'atk', 'gobject'
,'matplotlib.numerix.random_array'
,'AbsoluteToFpdb', 'BetfairToFpdb'
,'CarbonToFpdb', 'EverleafToFpdb'
@ -163,10 +161,11 @@ setup(
os.rename('dist', 'pyfpdb')
print '\n' + 'If py2exe was successful add the \\etc \\lib and \\share dirs '
print 'from your gtk dir to \\%s\\pyfpdb\\\n' % dist_dirname
print 'Also copy libgobject-2.0-0.dll and libgdk-win32-2.0-0.dll from <gtk_dir>\\bin'
print 'into there'
# these instructions no longer needed:
#print '\n' + 'If py2exe was successful add the \\etc \\lib and \\share dirs '
#print 'from your gtk dir to \\%s\\pyfpdb\\\n' % dist_dirname
#print 'Also copy libgobject-2.0-0.dll and libgdk-win32-2.0-0.dll from <gtk_dir>\\bin'
#print 'into there'
dest = os.path.join(dist_dirname, 'pyfpdb')
#print "try renaming pyfpdb to", dest
@ -207,4 +206,24 @@ dest_dir = os.path.join(dest, 'share')
dest_dir = dest_dir.replace('\\', '\\\\')
shutil.copytree( src_dir, dest_dir )
print "\nIf py2exe was successful you should now have a new dir"
print dist_dirname+" in your pyfpdb dir"
print """
The following dirs can probably removed to make the final package smaller:
pyfpdb/lib/glib-2.0
pyfpdb/lib/gtk-2.0/include
pyfpdb/lib/pkgconfig
pyfpdb/share/aclocal
pyfpdb/share/doc
pyfpdb/share/glib-2.0
pyfpdb/share/gtk-2.0
pyfpdb/share/gtk-doc
pyfpdb/share/locale
pyfpdb/share/man
pyfpdb/share/themes/Default
Use 7-zip to zip up the distribution and create a self extracting archive and that's it!
"""

665
pyfpdb/regression-test-files/cash/FTP/Stud/7-StudHL-USD-2-4-201006.Steal.examples.txt

@ -0,0 +1,665 @@
Full Tilt Poker Game #11111111813: Table Fpdb - $2/$4 Ante $0.40 - Limit Stud Hi - 13:14:27 ET - 2010/06/10
Seat 1: Player4 ($7.40)
Seat 2: Player13 ($77.20)
Seat 3: Player1 ($111.80)
Seat 5: Player5 ($118.70)
Seat 7: Player6 ($36.30)
Player1 antes $0.40
Player4 antes $0.40
Player13 antes $0.40
Player5 antes $0.40
Player6 antes $0.40
*** 3RD STREET ***
Dealt to Player4 [9c]
Dealt to Player13 [8s]
Dealt to Player1 [Ac 9h] [3s]
Dealt to Player5 [3c]
Dealt to Player6 [Qs]
Player5 is low with [3c]
Player5 brings in for $0.50
Player6 folds
Player4 completes it to $2
Player14 sits down
Player13 folds
Player1 folds
Player14 adds $152
Player5 calls $1.50
*** 4TH STREET ***
Dealt to Player4 [9c] [9d]
Dealt to Player5 [3c] [8d]
Player4 bets $4
Player5 folds
Uncalled bet of $4 returned to Player4
Player4 mucks
Player4 wins the pot ($6)
*** SUMMARY ***
Total pot $6 | Rake $0
Seat 1: Player4 collected ($6), mucked
Seat 2: Player13 folded on 3rd St.
Seat 3: Player1 folded on 3rd St.
Seat 5: Player5 folded on 4th St.
Seat 7: Player6 folded on 3rd St.
Full Tilt Poker Game #11111111538: Table Fpdb - $2/$4 Ante $0.40 - Limit Stud Hi - 13:15:56 ET - 2010/06/10
Seat 1: Player4 ($12.60)
Seat 2: Player13 ($89.90)
Seat 3: Player1 ($110.60)
Seat 5: Player5 ($115.50)
Seat 6: Player14 ($138.70)
Seat 7: Player6 ($35.10)
Player1 antes $0.40
Player4 antes $0.40
Player13 antes $0.40
Player5 antes $0.40
Player14 antes $0.40
Player6 antes $0.40
*** 3RD STREET ***
Dealt to Player4 [Qc]
Dealt to Player13 [5s]
Dealt to Player1 [6c 5d] [3d]
Dealt to Player5 [9d]
Dealt to Player14 [8h]
Dealt to Player6 [Ts]
Player1 is low with [3d]
Player1 brings in for $0.50
Player5 folds
Player14 folds
Player6 completes it to $2
Player4 folds
Player13 folds
Player1 calls $1.50
*** 4TH STREET ***
Dealt to Player1 [6c 5d 3d] [7c]
Dealt to Player6 [Ts] [6d]
Player6 bets $2
Player1 calls $2
*** 5TH STREET ***
Dealt to Player1 [6c 5d 3d 7c] [Qd]
Dealt to Player6 [Ts 6d] [9s]
Player1 checks
Player6 bets $4
Player1 folds
Uncalled bet of $4 returned to Player6
Player6 mucks
Player6 wins the pot ($10.40)
*** SUMMARY ***
Total pot $10.40 | Rake $0
Seat 1: Player4 folded on 3rd St.
Seat 2: Player13 folded on 3rd St.
Seat 3: Player1 folded on 5th St.
Seat 5: Player5 folded on 3rd St.
Seat 6: Player14 folded on 3rd St.
Seat 7: Player6 collected ($10.40), mucked
Full Tilt Poker Game #11111111649: Table Fpdb - $2/$4 Ante $0.40 - Limit Stud Hi - 13:17:24 ET - 2010/06/10
Seat 1: Player4 ($16.30)
Seat 2: Player13 ($88.70)
Seat 3: Player1 ($107.30)
Seat 5: Player5 ($114.30)
Seat 6: Player14 ($135.50)
Seat 7: Player6 ($40.30)
Player1 antes $0.40
Player4 antes $0.40
Player13 antes $0.40
Player5 antes $0.40
Player14 antes $0.40
Player6 antes $0.40
*** 3RD STREET ***
Dealt to Player4 [9s]
Dealt to Player13 [9h]
Dealt to Player1 [8h Kd] [6s]
Dealt to Player5 [4c]
Dealt to Player14 [8d]
Dealt to Player6 [6c]
Player5 is low with [4c]
Player10 sits down
Player10 adds $40
Player5 brings in for $0.50
Player14 folds
Player6 folds
Player4 folds
Player13 completes it to $2
Player1 folds
Player5 folds
Uncalled bet of $1.50 returned to Player13
Player13 mucks
Player13 wins the pot ($3.40)
*** SUMMARY ***
Total pot $3.40 | Rake $0
Seat 1: Player4 folded on 3rd St.
Seat 2: Player13 collected ($3.40), mucked
Seat 3: Player1 folded on 3rd St.
Seat 5: Player5 folded on 3rd St.
Seat 6: Player14 folded on 3rd St.
Seat 7: Player6 folded on 3rd St.
Full Tilt Poker Game #11111112277: Table Fpdb - $2/$4 Ante $0.40 - Limit Stud Hi - 13:17:41 ET - 2010/06/10
Seat 1: Player4 ($15.90)
Seat 2: Player13 ($91.20)
Seat 3: Player1 ($106.90)
Seat 5: Player5 ($113.40)
Seat 6: Player14 ($135.10)
Seat 7: Player6 ($39.90)
Seat 8: Player10 ($40)
Player1 antes $0.40
Player4 antes $0.40
Player13 antes $0.40
Player5 antes $0.40
Player14 antes $0.40
Player6 antes $0.40
Player10 antes $0.40
*** 3RD STREET ***
Dealt to Player4 [Qs]
Dealt to Player13 [8s]
Dealt to Player1 [3h 9c] [Ah]
Dealt to Player5 [Qc]
Dealt to Player14 [Kc]
Dealt to Player6 [Jh]
Dealt to Player10 [6d]
Player10 is low with [6d]
Player10 brings in for $0.50
Player4 folds
Player13 folds
Player1 folds
Player5 completes it to $2
Player14 raises to $4
Player6 folds
Player10 calls $3.50
Player5 calls $2
*** 4TH STREET ***
Dealt to Player5 [Qc] [3c]
Dealt to Player14 [Kc] [Kh]
Dealt to Player10 [6d] [Td]
Player14 has 15 seconds left to act
Player14 bets $4
Player10 folds
Player5 folds
Uncalled bet of $4 returned to Player14
Player14 mucks
Player14 wins the pot ($14.80)
*** SUMMARY ***
Total pot $14.80 | Rake $0
Seat 1: Player4 folded on 3rd St.
Seat 2: Player13 folded on 3rd St.
Seat 3: Player1 folded on 3rd St.
Seat 5: Player5 folded on 4th St.
Seat 6: Player14 collected ($14.80), mucked
Seat 7: Player6 folded on 3rd St.
Seat 8: Player10 folded on 4th St.
Full Tilt Poker Game #11111110428: Table Fpdb - $2/$4 Ante $0.40 - Limit Stud Hi - 13:18:23 ET - 2010/06/10
Seat 1: Player4 ($15.50)
Seat 2: Player13 ($90.80)
Seat 3: Player1 ($106.50)
Seat 5: Player5 ($109)
Seat 6: Player14 ($145.50)
Seat 7: Player6 ($39.50)
Seat 8: Player10 ($35.60)
Player10 antes $0.40
Player13 antes $0.40
Player1 antes $0.40
Player4 antes $0.40
Player5 antes $0.40
Player14 antes $0.40
Player6 antes $0.40
*** 3RD STREET ***
Dealt to Player4 [Th]
Dealt to Player13 [Kc]
Dealt to Player1 [Kh 9c] [5h]
Dealt to Player5 [6h]
Dealt to Player14 [Js]
Dealt to Player6 [Ac]
Dealt to Player10 [Ah]
Player1 is low with [5h]
Player1 brings in for $0.50
Player5 folds
Player14 folds
Player6 folds
Player10 completes it to $2
Player4 calls $2
Player13 folds
Player1 folds
*** 4TH STREET ***
Dealt to Player4 [Th] [4h]
Dealt to Player10 [Ah] [3c]
Player10 bets $2
Player4 calls $2
*** 5TH STREET ***
Dealt to Player4 [Th 4h] [9h]
Dealt to Player10 [Ah 3c] [8h]
Player10 has 15 seconds left to act
Player10 bets $4
Player4 raises to $8
Player10 folds
Uncalled bet of $4 returned to Player4
Player4 mucks
Player4 wins the pot ($19.30)
*** SUMMARY ***
Total pot $19.30 | Rake $0
Seat 1: Player4 collected ($19.30), mucked
Seat 2: Player13 folded on 3rd St.
Seat 3: Player1 folded on 3rd St.
Seat 5: Player5 folded on 3rd St.
Seat 6: Player14 folded on 3rd St.
Seat 7: Player6 folded on 3rd St.
Seat 8: Player10 folded on 5th St.
Full Tilt Poker Game #11111112961: Table Fpdb - $2/$4 Ante $0.40 - Limit Stud Hi - 13:19:27 ET - 2010/06/10
Seat 1: Player4 ($26)
Seat 2: Player13 ($90)
Seat 3: Player1 ($105.20)
Seat 5: Player5 ($108.20)
Seat 6: Player14 ($144.70)
Seat 7: Player6 ($41.50)
Seat 8: Player10 ($26.80)
Player4 antes $0.40
Player13 antes $0.40
Player1 antes $0.40
Player5 antes $0.40
Player10 antes $0.40
Player14 antes $0.40
Player6 antes $0.40
*** 3RD STREET ***
Dealt to Player4 [9d]
Dealt to Player13 [Qs]
Dealt to Player1 [9h 9s] [5c]
Dealt to Player5 [Th]
Dealt to Player14 [6c]
Dealt to Player6 [2d]
Dealt to Player10 [Qh]
Player6 is low with [2d]
Player6 brings in for $0.50
Player10 folds
Player4 folds
Player13 folds
Player1 completes it to $2
Player5 folds
Player14 folds
Player6 calls $1.50
*** 4TH STREET ***
Dealt to Player1 [9h 9s 5c] [3s]
Dealt to Player6 [2d] [Ah]
Player6 checks
Player1 bets $2
Player6 calls $2
*** 5TH STREET ***
Dealt to Player1 [9h 9s 5c 3s] [Kh]
Dealt to Player6 [2d Ah] [Kc]
Player6 checks
Player1 bets $4
Player6 raises to $8
Player1 calls $4
*** 6TH STREET ***
Dealt to Player1 [9h 9s 5c 3s Kh] [5d]
Dealt to Player6 [2d Ah Kc] [4d]
Player1 bets $4
Player6 calls $4
*** 7TH STREET ***
Dealt to Player1 [9h 9s 5c 3s Kh 5d] [8s]
Player1 bets $4
Player6 calls $4
*** SHOW DOWN ***
Player1 shows [9s 9h 5c 3s Kh 5d 8s] two pair, Nines and Fives
Player6 shows [Ad Kd 2d Ah Kc 4d 8h] two pair, Aces and Kings
Player6 wins the pot ($40.80) with two pair, Aces and Kings
*** SUMMARY ***
Total pot $42.80 | Rake $2
Seat 1: Player4 folded on 3rd St.
Seat 2: Player13 folded on 3rd St.
Seat 3: Player1 showed [9s 9h 5c 3s Kh 5d 8s] and lost with two pair, Nines and Fives
Seat 5: Player5 folded on 3rd St.
Seat 6: Player14 folded on 3rd St.
Seat 7: Player6 showed [Ad Kd 2d Ah Kc 4d 8h] and won ($40.80) with two pair, Aces and Kings
Seat 8: Player10 folded on 3rd St.
Full Tilt Poker Game #11111110018: Table Fpdb - $2/$4 Ante $0.40 - Limit Stud Hi - 13:26:21 ET - 2010/06/10
Seat 1: Player12 ($66.10)
Seat 2: Player13 ($85.50)
Seat 3: Player1 ($81.10)
Seat 4: Player11 ($283.75)
Seat 5: Player5 ($109.40)
Seat 6: Player14 ($140.20)
Seat 7: Player6 ($59.80)
Seat 8: Player10 ($62.10)
Player10 antes $0.40
Player13 antes $0.40
Player1 antes $0.40
Player5 antes $0.40
Player14 antes $0.40
Player12 antes $0.40
Player11 antes $0.40
Player6 antes $0.40
*** 3RD STREET ***
Dealt to Player12 [Qh]
Dealt to Player13 [Kd]
Dealt to Player1 [2d Kc] [5h]
Dealt to Player11 [9d]
Dealt to Player5 [6d]
Dealt to Player14 [Ad]
Dealt to Player6 [6h]
Dealt to Player10 [7h]
Player1 is low with [5h]
Player1 brings in for $0.50
Player11 folds
Player5 folds
Player14 folds
Player6 folds
Player10 folds
Player12 folds
Player13 completes it to $2
Player1 folds
Uncalled bet of $1.50 returned to Player13
Player13 mucks
Player13 wins the pot ($4.20)
*** SUMMARY ***
Total pot $4.20 | Rake $0
Seat 1: Player12 folded on 3rd St.
Seat 2: Player13 collected ($4.20), mucked
Seat 3: Player1 folded on 3rd St.
Seat 4: Player11 folded on 3rd St.
Seat 5: Player5 folded on 3rd St.
Seat 6: Player14 folded on 3rd St.
Seat 7: Player6 folded on 3rd St.
Seat 8: Player10 folded on 3rd St.
Full Tilt Poker Game #11111111146: Table Fpdb - $2/$4 Ante $0.40 - Limit Stud Hi - 13:26:47 ET - 2010/06/10
Seat 1: Player12 ($65.70)
Seat 2: Player13 ($88.80)
Seat 3: Player1 ($80.20)
Seat 4: Player11 ($283.35)
Seat 5: Player5 ($109)
Seat 6: Player14 ($139.80)
Seat 7: Player6 ($59.40)
Seat 8: Player10 ($61.70)
Player10 antes $0.40
Player1 antes $0.40
Player13 antes $0.40
Player5 antes $0.40
Player11 antes $0.40
Player12 antes $0.40
Player14 antes $0.40
Player6 antes $0.40
*** 3RD STREET ***
Dealt to Player12 [Qd]
Dealt to Player13 [5c]
Dealt to Player1 [4d 3s] [9s]
Dealt to Player11 [Ks]
Dealt to Player5 [2c]
Dealt to Player14 [3d]
Dealt to Player6 [2h]
Dealt to Player10 [2d]
Player5 is low with [2c]
Player5 brings in for $0.50
Player14 folds
Player6 folds
Player10 folds
Player12 folds
Player13 folds
Player1 folds
Player11 completes it to $2
Player5 calls $1.50
*** 4TH STREET ***
Dealt to Player11 [Ks] [Ah]
Dealt to Player5 [2c] [5s]
Player11 bets $2
Player5 folds
Uncalled bet of $2 returned to Player11
Player11 mucks
Player11 wins the pot ($7.20)
*** SUMMARY ***
Total pot $7.20 | Rake $0
Seat 1: Player12 folded on 3rd St.
Seat 2: Player13 folded on 3rd St.
Seat 3: Player1 folded on 3rd St.
Seat 4: Player11 collected ($7.20), mucked
Seat 5: Player5 folded on 4th St.
Seat 6: Player14 folded on 3rd St.
Seat 7: Player6 folded on 3rd St.
Seat 8: Player10 folded on 3rd St.
Full Tilt Poker Game #11111111633: Table Fpdb - $2/$4 Ante $0.40 - Limit Stud Hi - 13:37:55 ET - 2010/06/10
Seat 1: Player12 ($72)
Seat 2: Player9 ($40), is sitting out
Seat 3: Player1 ($89.20)
Seat 4: Player2 ($96.10)
Seat 5: Player5 ($105.50), is sitting out
Seat 6: Player14 ($131.70)
Seat 7: Player6 ($54.70)
Seat 8: Player10 ($96.40)
Player10 antes $0.40
Player1 antes $0.40
Player12 antes $0.40
Player14 antes $0.40
Player6 antes $0.40
5 seconds left to act
Player2 is sitting out
*** 3RD STREET ***
Dealt to Player12 [5c]
Dealt to Player1 [Td 9d] [Kc]
Dealt to Player14 [5h]
Dealt to Player6 [4s]
Dealt to Player10 [7s]
Player6 is low with [4s]
Player2 stands up
Player6 brings in for $0.50
Player10 folds
Player12 folds
Player1 completes it to $2
Player14 calls $2
Player6 folds
*** 4TH STREET ***
Dealt to Player1 [Td 9d Kc] [9s]
Dealt to Player14 [5h] [9h]
Player1 bets $2
Player14 raises to $4
Player1 calls $2
*** 5TH STREET ***
Dealt to Player1 [Td 9d Kc 9s] [Tc]
Dealt to Player14 [5h 9h] [3d]
Player1 checks
Player14 checks
*** 6TH STREET ***
Dealt to Player1 [Td 9d Kc 9s Tc] [9c]
Dealt to Player14 [5h 9h 3d] [Th]
Player1 bets $4
Player14 calls $4
*** 7TH STREET ***
Dealt to Player1 [Td 9d Kc 9s Tc 9c] [7h]
Player1 bets $4
Player14 calls $4
*** SHOW DOWN ***
Player1 shows [Td 9d Kc 9s Tc 9c 7h] a full house, Nines full of Tens
Player14 mucks
Player1 wins the pot ($29.50) with a full house, Nines full of Tens
*** SUMMARY ***
Total pot $30.50 | Rake $1
Seat 1: Player12 folded on 3rd St.
Seat 2: Player9 is sitting out
Seat 3: Player1 showed [Td 9d Kc 9s Tc 9c 7h] and won ($29.50) with a full house, Nines full of Tens
Seat 4: Player2 is sitting out
Seat 5: Player5 is sitting out
Seat 6: Player14 mucked [8h 6h 5h 9h 3d Th 3h] - a flush, Ten high
Seat 7: Player6 folded on 3rd St.
Seat 8: Player10 folded on 3rd St.
Full Tilt Poker Game #11111113928: Table Fpdb - $2/$4 Ante $0.40 - Limit Stud Hi - 13:39:41 ET - 2010/06/10
Seat 1: Player12 ($68.70)
Seat 2: Player9 ($40), is sitting out
Seat 3: Player1 ($103.90)
Seat 6: Player14 ($116.40)
Seat 7: Player6 ($58.40)
Seat 8: Player10 ($95.60)
Player10 antes $0.40
Player1 antes $0.40
Player6 antes $0.40
Player3 sits down
Player14 antes $0.40
Player12 antes $0.40
*** 3RD STREET ***
Dealt to Player12 [9c]
Dealt to Player1 [Ts 4h] [9h]
Dealt to Player14 [7c]
Dealt to Player6 [7s]
Dealt to Player10 [2h]
Player10 is low with [2h]
Player3 adds $40
Player10 brings in for $0.50
Player12 folds
Player1 completes it to $2
Player14 folds
Player6 folds
Player10 folds
Uncalled bet of $1.50 returned to Player1
Player1 mucks
Player1 wins the pot ($3)
*** SUMMARY ***
Total pot $3 | Rake $0
Seat 1: Player12 folded on 3rd St.
Seat 2: Player9 is sitting out
Seat 3: Player1 collected ($3), mucked
Seat 6: Player14 folded on 3rd St.
Seat 7: Player6 folded on 3rd St.
Seat 8: Player10 folded on 3rd St.
Full Tilt Poker Game #11111111062: Table Fpdb - $2/$4 Ante $0.40 - Limit Stud Hi - 13:51:45 ET - 2010/06/10
Seat 1: Player12 ($83.40)
Seat 2: Player9 ($24.35)
Seat 3: Player1 ($147.90)
Seat 4: Player3 ($74.10)
Seat 5: Player8 ($63.10)
Seat 6: Player14 ($103)
Seat 7: Player6 ($63.20)
Seat 8: Player7 ($48.40)
Player7 antes $0.40
Player1 antes $0.40
Player8 antes $0.40
Player3 antes $0.40
Player9 antes $0.40
Player12 antes $0.40
Player14 antes $0.40
Player6 antes $0.40
*** 3RD STREET ***
Dealt to Player12 [As]
Dealt to Player9 [7s]
Dealt to Player1 [7h 6s] [8d]
Dealt to Player3 [2d]
Dealt to Player8 [3c]
Dealt to Player14 [7c]
Dealt to Player6 [8h]
Dealt to Player7 [Qs]
Player3 is low with [2d]
Player3 brings in for $0.50
Player8 folds
Player14 folds
Player6 folds
Player7 folds
Player12 completes it to $2
Player9 folds
Player1 calls $2
Player3 calls $1.50
*** 4TH STREET ***
Dealt to Player12 [As] [5d]
Dealt to Player1 [7h 6s 8d] [Qc]
Dealt to Player3 [2d] [3h]
Player12 bets $2
Player1 folds
Player3 calls $2
*** 5TH STREET ***
Dealt to Player12 [As 5d] [4c]
Dealt to Player3 [2d 3h] [5s]
Player12 bets $4
Player3 folds
Uncalled bet of $4 returned to Player12
Player12 mucks
Player12 wins the pot ($13.20)
*** SUMMARY ***
Total pot $13.20 | Rake $0
Seat 1: Player12 collected ($13.20), mucked
Seat 2: Player9 folded on 3rd St.
Seat 3: Player1 folded on 4th St.
Seat 4: Player3 folded on 5th St.
Seat 5: Player8 folded on 3rd St.
Seat 6: Player14 folded on 3rd St.
Seat 7: Player6 folded on 3rd St.
Seat 8: Player7 folded on 3rd St.
Full Tilt Poker Game #11111115744: Table Fpdb - $2/$4 Ante $0.40 - Limit Stud Hi - 14:02:17 ET - 2010/06/10
Seat 2: Player0 ($60)
Seat 3: Player1 ($129.30)
Seat 4: Player3 ($125.75)
Seat 5: Player8 ($40.10)
Seat 7: Player6 ($72)
Seat 8: Player7 ($32.20)
Player0 antes $0.40
Player8 antes $0.40
Player7 antes $0.40
Player1 antes $0.40
Player3 antes $0.40
Player6 antes $0.40
*** 3RD STREET ***
Dealt to Player0 [Th]
Dealt to Player1 [9s Qc] [7d]
Dealt to Player3 [Qh]
Dealt to Player8 [Kd]
Dealt to Player6 [Jd]
Dealt to Player7 [Jh]
Player1 is low with [7d]
Player1 brings in for $0.50
Player3 folds
Player8 folds
Player6 folds
Player7 completes it to $2
Player0 calls $2
Player1 folds
*** 4TH STREET ***
Dealt to Player0 [Th] [As]
Dealt to Player7 [Jh] [8c]
Player0 bets $2
Player7 calls $2
*** 5TH STREET ***
Dealt to Player0 [Th As] [Kh]
Dealt to Player7 [Jh 8c] [2s]
Player0 checks
Player7 checks
*** 6TH STREET ***
Dealt to Player0 [Th As Kh] [7h]
Dealt to Player7 [Jh 8c 2s] [9h]
Player0 bets $4
Player7 folds
Uncalled bet of $4 returned to Player0
Player0 mucks
Player0 wins the pot ($10.90)
*** SUMMARY ***
Total pot $10.90 | Rake $0
Seat 2: Player0 collected ($10.90), mucked
Seat 3: Player1 folded on 3rd St.
Seat 4: Player3 folded on 3rd St.
Seat 5: Player8 folded on 3rd St.
Seat 7: Player6 folded on 3rd St.
Seat 8: Player7 folded on 6th St.

272
pyfpdb/regression-test-files/cash/Stars/Flop/NLHE-2max-USD-0.25-0.50-201005.Hitnrun.txt

@ -1,137 +1,137 @@
PokerStars Game #14732633821: Hold'em No Limit ($0.25/$0.50 USD) - 2010/05/23 22:39:16 WET [2010/05/23 17:39:16 ET]
Table '99999999 II' 2-max Seat #1 is the button
Seat 1: Player0 ($20 in chips)
Seat 2: Player1 ($50.50 in chips)
Player0: posts small blind $0.25
Player1: posts big blind $0.50
*** HOLE CARDS ***
Dealt to Player0 [2h Th]
Player0: calls $0.25
Player1: checks
*** FLOP *** [4c 8c Ac]
Player1: checks
Player0: checks
*** TURN *** [4c 8c Ac] [7s]
Player1: checks
Player0: bets $1
Player1: folds
Uncalled bet ($1) returned to Player0
Player0 collected $0.95 from pot
Player0: doesn't show hand
*** SUMMARY ***
Total pot $1 | Rake $0.05
Board [4c 8c Ac 7s]
Seat 1: Player0 (button) (small blind) collected ($0.95)
Seat 2: Player1 (big blind) folded on the Turn
PokerStars Game #28140199921: Hold'em No Limit ($0.25/$0.50 USD) - 2010/05/23 22:39:59 WET [2010/05/23 17:39:59 ET]
Table '99999999 II' 2-max Seat #2 is the button
Seat 1: Player0 ($20.45 in chips)
Seat 2: Player1 ($50 in chips)
Player1: posts small blind $0.25
Player0: posts big blind $0.50
*** HOLE CARDS ***
Dealt to Player0 [7h Kh]
Player1: raises $1 to $1.50
Player0: folds
Uncalled bet ($1) returned to Player1
Player1 collected $1 from pot
Player1: doesn't show hand
*** SUMMARY ***
Total pot $1 | Rake $0
Seat 1: Player0 (big blind) folded before Flop
Seat 2: Player1 (button) (small blind) collected ($1)
PokerStars Game #29402240709: Hold'em No Limit ($0.25/$0.50 USD) - 2010/05/23 22:40:22 WET [2010/05/23 17:40:22 ET]
Table '99999999 II' 2-max Seat #1 is the button
Seat 1: Player0 ($19.95 in chips)
Seat 2: Player1 ($50.50 in chips)
Player0: posts small blind $0.25
Player1: posts big blind $0.50
*** HOLE CARDS ***
Dealt to Player0 [5c 8c]
Player0: folds
Uncalled bet ($0.25) returned to Player1
Player1 collected $0.50 from pot
Player1: doesn't show hand
*** SUMMARY ***
Total pot $0.50 | Rake $0
Seat 1: Player0 (button) (small blind) folded before Flop
Seat 2: Player1 (big blind) collected ($0.50)
PokerStars Game #31842149327: Hold'em No Limit ($0.25/$0.50 USD) - 2010/05/23 22:40:29 WET [2010/05/23 17:40:29 ET]
Table '99999999 II' 2-max Seat #2 is the button
Seat 1: Player0 ($19.70 in chips)
Seat 2: Player1 ($50.75 in chips)
Player1: posts small blind $0.25
Player0: posts big blind $0.50
*** HOLE CARDS ***
Dealt to Player0 [Ks 9c]
Player1: raises $1 to $1.50
Player0: calls $1
*** FLOP *** [3d As 4s]
Player0: checks
Player1: bets $2
Player0: calls $2
*** TURN *** [3d As 4s] [Jd]
Player0: checks
Player1: checks
*** RIVER *** [3d As 4s Jd] [3h]
Player0: checks
Player1: checks
*** SHOW DOWN ***
Player0: shows [Ks 9c] (a pair of Threes)
Player1: mucks hand
Player0 collected $6.70 from pot
*** SUMMARY ***
Total pot $7 | Rake $0.30
Board [3d As 4s Jd 3h]
Seat 1: Player0 (big blind) showed [Ks 9c] and won ($6.70) with a pair of Threes
Seat 2: Player1 (button) (small blind) mucked [6c 5s]
PokerStars Game #10697227103: Hold'em No Limit ($0.25/$0.50 USD) - 2010/05/23 22:41:10 WET [2010/05/23 17:41:10 ET]
Table '99999999 II' 2-max Seat #1 is the button
Seat 1: Player0 ($22.90 in chips)
Seat 2: Player1 ($50 in chips)
Player0: posts small blind $0.25
Player1: posts big blind $0.50
*** HOLE CARDS ***
Dealt to Player0 [Ts 3d]
Player0: folds
Uncalled bet ($0.25) returned to Player1
Player1 collected $0.50 from pot
Player1: doesn't show hand
*** SUMMARY ***
Total pot $0.50 | Rake $0
Seat 1: Player0 (button) (small blind) folded before Flop
Seat 2: Player1 (big blind) collected ($0.50)
PokerStars Game #27159326072: Hold'em No Limit ($0.25/$0.50 USD) - 2010/05/23 22:41:17 WET [2010/05/23 17:41:17 ET]
Table '99999999 II' 2-max Seat #2 is the button
Seat 1: Player0 ($22.65 in chips)
Seat 2: Player1 ($50.25 in chips)
Player1: posts small blind $0.25
Player0: posts big blind $0.50
*** HOLE CARDS ***
Dealt to Player0 [4h Ks]
Player1: raises $1 to $1.50
Player0: folds
Uncalled bet ($1) returned to Player1
Player1 collected $1 from pot
Player1: doesn't show hand
*** SUMMARY ***
Total pot $1 | Rake $0
Seat 1: Player0 (big blind) folded before Flop
Seat 2: Player1 (button) (small blind) collected ($1)
PokerStars Game #14732633821: Hold'em No Limit ($0.25/$0.50 USD) - 2010/05/23 22:39:16 WET [2010/05/23 17:39:16 ET]
Table '99999999 II' 2-max Seat #1 is the button
Seat 1: Player0 ($20 in chips)
Seat 2: Player1 ($50.50 in chips)
Player0: posts small blind $0.25
Player1: posts big blind $0.50
*** HOLE CARDS ***
Dealt to Player0 [2h Th]
Player0: calls $0.25
Player1: checks
*** FLOP *** [4c 8c Ac]
Player1: checks
Player0: checks
*** TURN *** [4c 8c Ac] [7s]
Player1: checks
Player0: bets $1
Player1: folds
Uncalled bet ($1) returned to Player0
Player0 collected $0.95 from pot
Player0: doesn't show hand
*** SUMMARY ***
Total pot $1 | Rake $0.05
Board [4c 8c Ac 7s]
Seat 1: Player0 (button) (small blind) collected ($0.95)
Seat 2: Player1 (big blind) folded on the Turn
PokerStars Game #28140199921: Hold'em No Limit ($0.25/$0.50 USD) - 2010/05/23 22:39:59 WET [2010/05/23 17:39:59 ET]
Table '99999999 II' 2-max Seat #2 is the button
Seat 1: Player0 ($20.45 in chips)
Seat 2: Player1 ($50 in chips)
Player1: posts small blind $0.25
Player0: posts big blind $0.50
*** HOLE CARDS ***
Dealt to Player0 [7h Kh]
Player1: raises $1 to $1.50
Player0: folds
Uncalled bet ($1) returned to Player1
Player1 collected $1 from pot
Player1: doesn't show hand
*** SUMMARY ***
Total pot $1 | Rake $0
Seat 1: Player0 (big blind) folded before Flop
Seat 2: Player1 (button) (small blind) collected ($1)
PokerStars Game #29402240709: Hold'em No Limit ($0.25/$0.50 USD) - 2010/05/23 22:40:22 WET [2010/05/23 17:40:22 ET]
Table '99999999 II' 2-max Seat #1 is the button
Seat 1: Player0 ($19.95 in chips)
Seat 2: Player1 ($50.50 in chips)
Player0: posts small blind $0.25
Player1: posts big blind $0.50
*** HOLE CARDS ***
Dealt to Player0 [5c 8c]
Player0: folds
Uncalled bet ($0.25) returned to Player1
Player1 collected $0.50 from pot
Player1: doesn't show hand
*** SUMMARY ***
Total pot $0.50 | Rake $0
Seat 1: Player0 (button) (small blind) folded before Flop
Seat 2: Player1 (big blind) collected ($0.50)
PokerStars Game #31842149327: Hold'em No Limit ($0.25/$0.50 USD) - 2010/05/23 22:40:29 WET [2010/05/23 17:40:29 ET]
Table '99999999 II' 2-max Seat #2 is the button
Seat 1: Player0 ($19.70 in chips)
Seat 2: Player1 ($50.75 in chips)
Player1: posts small blind $0.25
Player0: posts big blind $0.50
*** HOLE CARDS ***
Dealt to Player0 [Ks 9c]
Player1: raises $1 to $1.50
Player0: calls $1
*** FLOP *** [3d As 4s]
Player0: checks
Player1: bets $2
Player0: calls $2
*** TURN *** [3d As 4s] [Jd]
Player0: checks
Player1: checks
*** RIVER *** [3d As 4s Jd] [3h]
Player0: checks
Player1: checks
*** SHOW DOWN ***
Player0: shows [Ks 9c] (a pair of Threes)
Player1: mucks hand
Player0 collected $6.70 from pot
*** SUMMARY ***
Total pot $7 | Rake $0.30
Board [3d As 4s Jd 3h]
Seat 1: Player0 (big blind) showed [Ks 9c] and won ($6.70) with a pair of Threes
Seat 2: Player1 (button) (small blind) mucked [6c 5s]
PokerStars Game #10697227103: Hold'em No Limit ($0.25/$0.50 USD) - 2010/05/23 22:41:10 WET [2010/05/23 17:41:10 ET]
Table '99999999 II' 2-max Seat #1 is the button
Seat 1: Player0 ($22.90 in chips)
Seat 2: Player1 ($50 in chips)
Player0: posts small blind $0.25
Player1: posts big blind $0.50
*** HOLE CARDS ***
Dealt to Player0 [Ts 3d]
Player0: folds
Uncalled bet ($0.25) returned to Player1
Player1 collected $0.50 from pot
Player1: doesn't show hand
*** SUMMARY ***
Total pot $0.50 | Rake $0
Seat 1: Player0 (button) (small blind) folded before Flop
Seat 2: Player1 (big blind) collected ($0.50)
PokerStars Game #27159326072: Hold'em No Limit ($0.25/$0.50 USD) - 2010/05/23 22:41:17 WET [2010/05/23 17:41:17 ET]
Table '99999999 II' 2-max Seat #2 is the button
Seat 1: Player0 ($22.65 in chips)
Seat 2: Player1 ($50.25 in chips)
Player1: posts small blind $0.25
Player0: posts big blind $0.50
*** HOLE CARDS ***
Dealt to Player0 [4h Ks]
Player1: raises $1 to $1.50
Player0: folds
Uncalled bet ($1) returned to Player1
Player1 collected $1 from pot
Player1: doesn't show hand
*** SUMMARY ***
Total pot $1 | Rake $0
Seat 1: Player0 (big blind) folded before Flop
Seat 2: Player1 (button) (small blind) collected ($1)

92
pyfpdb/regression-test-files/cash/Stars/Flop/NLHE-FR-USD-0.01-0.02-201004.4betPF.txt

@ -1,49 +1,49 @@
PokerStars Game #42738187409: Hold'em No Limit ($0.01/$0.02 USD) - 2010/04/16 11:14:06 WET [2010/04/16 6:14:06 ET]
Table 'Circinus V' 9-max Seat #4 is the button
Seat 1: Player2 ($4.26 in chips)
Seat 2: Player1 ($0.35 in chips)
Seat 3: Player7 ($8.34 in chips)
Seat 4: Player5 ($3.70 in chips)
Seat 5: Player6 ($4.98 in chips)
Seat 7: Player3 ($2.55 in chips)
Seat 8: Player0 ($4.91 in chips)
Seat 9: Player4 ($1.31 in chips)
Player6: posts small blind $0.01
Alehta: is sitting out
Player3: posts big blind $0.02
*** HOLE CARDS ***
Dealt to Player1 [3d Ks]
Alehta leaves the table
Player0: calls $0.02
Player4: raises $0.06 to $0.08
Player2: raises $0.16 to $0.24
AFMAT joins the table at seat #6
Player1: folds
Player7: folds
Player5: folds
Player6: folds
Player3: folds
Player0: calls $0.22
Player4: raises $1.07 to $1.31 and is all-in
Player2: calls $1.07
Player0: folds
*** FLOP *** [7c Ac 6s]
*** TURN *** [7c Ac 6s] [5d]
*** RIVER *** [7c Ac 6s 5d] [Qh]
*** SHOW DOWN ***
Player4: shows [As Qs] (two pair, Aces and Queens)
Player2: shows [Jc Jd] (a pair of Jacks)
Player4 collected $2.79 from pot
*** SUMMARY ***
Total pot $2.89 | Rake $0.10
Board [7c Ac 6s 5d Qh]
Seat 1: Player2 showed [Jc Jd] and lost with a pair of Jacks
Seat 2: Player1 folded before Flop (didn't bet)
Seat 3: Player7 folded before Flop (didn't bet)
Seat 4: Player5 (button) folded before Flop (didn't bet)
Seat 5: Player6 (small blind) folded before Flop
Seat 7: Player3 (big blind) folded before Flop
Seat 8: Player0 folded before Flop
PokerStars Game #42738187409: Hold'em No Limit ($0.01/$0.02 USD) - 2010/04/16 11:14:06 WET [2010/04/16 6:14:06 ET]
Table 'Circinus V' 9-max Seat #4 is the button
Seat 1: Player2 ($4.26 in chips)
Seat 2: Player1 ($0.35 in chips)
Seat 3: Player7 ($8.34 in chips)
Seat 4: Player5 ($3.70 in chips)
Seat 5: Player6 ($4.98 in chips)
Seat 7: Player3 ($2.55 in chips)
Seat 8: Player0 ($4.91 in chips)
Seat 9: Player4 ($1.31 in chips)
Player6: posts small blind $0.01
Alehta: is sitting out
Player3: posts big blind $0.02
*** HOLE CARDS ***
Dealt to Player1 [3d Ks]
Alehta leaves the table
Player0: calls $0.02
Player4: raises $0.06 to $0.08
Player2: raises $0.16 to $0.24
AFMAT joins the table at seat #6
Player1: folds
Player7: folds
Player5: folds
Player6: folds
Player3: folds
Player0: calls $0.22
Player4: raises $1.07 to $1.31 and is all-in
Player2: calls $1.07
Player0: folds
*** FLOP *** [7c Ac 6s]
*** TURN *** [7c Ac 6s] [5d]
*** RIVER *** [7c Ac 6s 5d] [Qh]
*** SHOW DOWN ***
Player4: shows [As Qs] (two pair, Aces and Queens)
Player2: shows [Jc Jd] (a pair of Jacks)
Player4 collected $2.79 from pot
*** SUMMARY ***
Total pot $2.89 | Rake $0.10
Board [7c Ac 6s 5d Qh]
Seat 1: Player2 showed [Jc Jd] and lost with a pair of Jacks
Seat 2: Player1 folded before Flop (didn't bet)
Seat 3: Player7 folded before Flop (didn't bet)
Seat 4: Player5 (button) folded before Flop (didn't bet)
Seat 5: Player6 (small blind) folded before Flop
Seat 7: Player3 (big blind) folded before Flop
Seat 8: Player0 folded before Flop
Seat 9: Player4 showed [As Qs] and won ($2.79) with two pair, Aces and Queens

9706
pyfpdb/regression-test-files/cash/Stars/Flop/NLHE-FR-USD-0.01-0.02-201005.microgrind.txt

File diff suppressed because it is too large Load Diff

86
pyfpdb/regression-test-files/cash/Stars/Flop/NLHE-FR-USD-0.01-0.02-201006.foldsoutofturn.txt

@ -1,45 +1,45 @@
PokerStars Game #24782122321: Hold'em No Limit ($0.01/$0.02 USD) - 2010/06/06 22:24:02 WET [2010/06/06 17:24:02 ET]
Table '999999999' 9-max Seat #1 is the button
Seat 1: Player2 ($0.88 in chips)
Seat 2: Player0 ($1.61 in chips)
Seat 3: Player5 ($5.27 in chips)
Seat 5: Player1 ($2.15 in chips)
Seat 6: Player3 ($2.55 in chips)
Seat 7: Player6 ($2.90 in chips)
Seat 9: Player4 ($1.93 in chips)
Player0: posts small blind $0.01
Player5: posts big blind $0.02
*** HOLE CARDS ***
Dealt to Player0 [Td Qc]
Player1: folds
Player3: calls $0.02
Player3 said, "":D""
Player6: folds
Player4: folds
Player2 has timed out
Player2: folds
Player0: calls $0.01
Player5: checks
*** FLOP *** [7d 2s Jc]
Player0: checks
Player5: checks
Player3: checks
*** TURN *** [7d 2s Jc] [2h]
Player0: folds
Player5: bets $0.06
Player3: folds
Uncalled bet ($0.06) returned to Player5
Player5 collected $0.06 from pot
Player5: doesn't show hand
*** SUMMARY ***
Total pot $0.06 | Rake $0
Board [7d 2s Jc 2h]
Seat 1: Player2 (button) folded before Flop (didn't bet)
Seat 2: Player0 (small blind) folded on the Turn
Seat 3: Player5 (big blind) collected ($0.06)
Seat 5: Player1 folded before Flop (didn't bet)
Seat 6: Player3 folded on the Turn
Seat 7: Player6 folded before Flop (didn't bet)
Seat 9: Player4 folded before Flop (didn't bet)
PokerStars Game #24782122321: Hold'em No Limit ($0.01/$0.02 USD) - 2010/06/06 22:24:02 WET [2010/06/06 17:24:02 ET]
Table '999999999' 9-max Seat #1 is the button
Seat 1: Player2 ($0.88 in chips)
Seat 2: Player0 ($1.61 in chips)
Seat 3: Player5 ($5.27 in chips)
Seat 5: Player1 ($2.15 in chips)
Seat 6: Player3 ($2.55 in chips)
Seat 7: Player6 ($2.90 in chips)
Seat 9: Player4 ($1.93 in chips)
Player0: posts small blind $0.01
Player5: posts big blind $0.02
*** HOLE CARDS ***
Dealt to Player0 [Td Qc]
Player1: folds
Player3: calls $0.02
Player3 said, "":D""
Player6: folds
Player4: folds
Player2 has timed out
Player2: folds
Player0: calls $0.01
Player5: checks
*** FLOP *** [7d 2s Jc]
Player0: checks
Player5: checks
Player3: checks
*** TURN *** [7d 2s Jc] [2h]
Player0: folds
Player5: bets $0.06
Player3: folds
Uncalled bet ($0.06) returned to Player5
Player5 collected $0.06 from pot
Player5: doesn't show hand
*** SUMMARY ***
Total pot $0.06 | Rake $0
Board [7d 2s Jc 2h]
Seat 1: Player2 (button) folded before Flop (didn't bet)
Seat 2: Player0 (small blind) folded on the Turn
Seat 3: Player5 (big blind) collected ($0.06)
Seat 5: Player1 folded before Flop (didn't bet)
Seat 6: Player3 folded on the Turn
Seat 7: Player6 folded before Flop (didn't bet)
Seat 9: Player4 folded before Flop (didn't bet)

62
pyfpdb/regression-test-files/cash/Stars/Flop/NLHE-FR-USD-0.05-0.10-201004.allinWithAmtReturned.txt

@ -1,33 +1,33 @@
PokerStars Game #42875758685: Hold'em No Limit ($0.05/$0.10 USD) - 2010/04/19 0:19:11 WET [2010/04/18 19:19:11 ET]
Table 'gimick VI' 9-max Seat #4 is the button
Seat 3: Player1 ($5.55 in chips)
Seat 4: Player0 ($2.40 in chips)
Seat 8: Player2 ($3.90 in chips)
Player2: posts small blind $0.05
Player1: posts big blind $0.10
*** HOLE CARDS ***
PokerStars Game #42875758685: Hold'em No Limit ($0.05/$0.10 USD) - 2010/04/19 0:19:11 WET [2010/04/18 19:19:11 ET]
Table 'gimick VI' 9-max Seat #4 is the button
Seat 3: Player1 ($5.55 in chips)
Seat 4: Player0 ($2.40 in chips)
Seat 8: Player2 ($3.90 in chips)
Player2: posts small blind $0.05
Player1: posts big blind $0.10
*** HOLE CARDS ***
Dealt to Player0 [7d 8d]
Player0: raises $0.30 to $0.40
Player2: calls $0.35
Player1: folds
*** FLOP *** [2h 2d Qd]
Player2: checks
Player0: bets $0.60
Player2: raises $0.60 to $1.20
Player0: calls $0.60
*** TURN *** [2h 2d Qd] [5d]
Player2: bets $0.90
Player0: calls $0.80 and is all-in
Uncalled bet ($0.10) returned to Player2
*** RIVER *** [2h 2d Qd 5d] [4d]
*** SHOW DOWN ***
Player2: shows [9d As] (a flush, Queen high)
Player0: shows [7d 8d] (a flush, Queen high - lower cards)
Player2 collected $4.70 from pot
*** SUMMARY ***
Total pot $4.90 | Rake $0.20
Board [2h 2d Qd 5d 4d]
Seat 3: Player1 (big blind) folded before Flop
Seat 4: Player0 (button) showed [7d 8d] and lost with a flush, Queen high
Seat 8: Player2 (small blind) showed [9d As] and won ($4.70) with a flush, Queen high
Player0: raises $0.30 to $0.40
Player2: calls $0.35
Player1: folds
*** FLOP *** [2h 2d Qd]
Player2: checks
Player0: bets $0.60
Player2: raises $0.60 to $1.20
Player0: calls $0.60
*** TURN *** [2h 2d Qd] [5d]
Player2: bets $0.90
Player0: calls $0.80 and is all-in
Uncalled bet ($0.10) returned to Player2
*** RIVER *** [2h 2d Qd 5d] [4d]
*** SHOW DOWN ***
Player2: shows [9d As] (a flush, Queen high)
Player0: shows [7d 8d] (a flush, Queen high - lower cards)
Player2 collected $4.70 from pot
*** SUMMARY ***
Total pot $4.90 | Rake $0.20
Board [2h 2d Qd 5d 4d]
Seat 3: Player1 (big blind) folded before Flop
Seat 4: Player0 (button) showed [7d 8d] and lost with a flush, Queen high
Seat 8: Player2 (small blind) showed [9d As] and won ($4.70) with a flush, Queen high

314
pyfpdb/regression-test-files/cash/Stars/Flop/PLO-FR-USD-0.01-0.02-201006.sidepots.txt

@ -1,158 +1,158 @@
PokerStars Game #14311270221: Omaha Pot Limit ($0.01/$0.02 USD) - 2010/06/07 20:13:12 WET [2010/06/07 15:13:12 ET]
Table '99999999I' 9-max Seat #3 is the button
Seat 2: Player5 ($0.58 in chips)
Seat 3: Player1 ($0.65 in chips)
Seat 6: Player4 ($1.92 in chips)
Seat 7: Player6 ($2.81 in chips)
Seat 8: Player3 ($2.50 in chips)
Seat 9: Player2 ($0.80 in chips)
Player0 will be allowed to play after the button
Player4: posts small blind $0.01
Player6: posts big blind $0.02
Player3: posts big blind $0.02
Player2: posts big blind $0.02
*** HOLE CARDS ***
Dealt to Player1 [8d As 2h Ks]
Player3: checks
Player2: checks
Player5: raises $0.02 to $0.04
Player1: raises $0.02 to $0.06
Player4: calls $0.05
Player6: folds
Player3: calls $0.04
Player2: calls $0.04
Player5: calls $0.02
*** FLOP *** [Qh 7c Qs]
Player4: checks
Player3: checks
Player2: bets $0.31
Player5: folds
Player1: folds
Player4: folds
Player3: folds
Uncalled bet ($0.31) returned to Player2
Player2 collected $0.31 from pot
*** SUMMARY ***
Total pot $0.32 | Rake $0.01
Board [Qh 7c Qs]
Seat 2: Player5 folded on the Flop
Seat 3: Player1 (button) folded on the Flop
Seat 6: Player4 (small blind) folded on the Flop
Seat 7: Player6 (big blind) folded before Flop
Seat 8: Player3 folded on the Flop
Seat 9: Player2 collected ($0.31)
PokerStars Game #22865231671: Omaha Pot Limit ($0.01/$0.02 USD) - 2010/06/07 20:14:17 WET [2010/06/07 15:14:17 ET]
Table '99999999I' 9-max Seat #6 is the button
Seat 2: Player5 ($0.52 in chips)
Seat 3: Player1 ($0.59 in chips)
Seat 5: Player0 ($0.90 in chips)
Seat 6: Player4 ($1.86 in chips)
Seat 7: Player6 ($2.79 in chips)
Seat 8: Player3 ($5 in chips)
Seat 9: Player2 ($1.05 in chips)
Player6: posts small blind $0.01
Player3: posts big blind $0.02
Player0: posts big blind $0.02
*** HOLE CARDS ***
Dealt to Player1 [6d 3c 5s As]
Player2: calls $0.02
Player5: calls $0.02
Player1: calls $0.02
Player0: raises $0.06 to $0.08
Player4: calls $0.08
Player6: folds
Player3: folds
Player2: calls $0.06
Player5: calls $0.06
Player1: raises $0.06 to $0.14
Player0: raises $0.55 to $0.69
Player4: calls $0.61
Player2: raises $0.36 to $1.05 and is all-in
Player5: folds
Player1: calls $0.45 and is all-in
Player0: calls $0.21 and is all-in
Player4: calls $0.36
*** FLOP *** [6c Kc Qc]
*** TURN *** [6c Kc Qc] [Jc]
*** RIVER *** [6c Kc Qc Jc] [4c]
*** SHOW DOWN ***
Player2: shows [Js Ah 5d 9h] (a pair of Jacks)
Player4: shows [9c 9d 7d 7h] (a pair of Nines)
Player2 collected $0.29 from side pot-2
Player0: shows [Ks Ad 7s Tc] (a straight, Ten to Ace)
Player0 collected $0.88 from side pot-1
Player1: shows [6d 3c 5s As] (a pair of Sixes)
Player0 collected $2.35 from main pot
*** SUMMARY ***
Total pot $3.70 Main pot $2.35. Side pot-1 $0.88. Side pot-2 $0.29. | Rake $0.18
Board [6c Kc Qc Jc 4c]
Seat 2: Player5 folded before Flop
Seat 3: Player1 showed [6d 3c 5s As] and lost with a pair of Sixes
Seat 5: Player0 showed [Ks Ad 7s Tc] and won ($3.23) with a straight, Ten to Ace
Seat 6: Player4 (button) showed [9c 9d 7d 7h] and lost with a pair of Nines
Seat 7: Player6 (small blind) folded before Flop
Seat 8: Player3 (big blind) folded before Flop
Seat 9: Player2 showed [Js Ah 5d 9h] and won ($0.29) with a pair of Jacks
PokerStars Game #60920749213: Omaha Pot Limit ($0.01/$0.02 USD) - 2010/06/07 20:15:29 WET [2010/06/07 15:15:29 ET]
Table '99999999I' 9-max Seat #7 is the button
Seat 2: Player5 ($0.44 in chips)
Seat 3: Player1 ($0.80 in chips)
Seat 5: Player0 ($3.23 in chips)
Seat 6: Player4 ($0.81 in chips)
Seat 7: Player6 ($2.78 in chips)
Seat 8: Player3 ($4.98 in chips)
Seat 9: Player2 ($0.29 in chips)
Player3: posts small blind $0.01
Player2: posts big blind $0.02
*** HOLE CARDS ***
Dealt to Player1 [2c 4c 3s 7c]
Player5: calls $0.02
Player1: calls $0.02
Player0: calls $0.02
Player4: folds
Player6: calls $0.02
Player3: folds
Player2: checks
*** FLOP *** [7h 8s 4s]
Player2: checks
Player5: bets $0.02
Player1: raises $0.02 to $0.04
Player0: raises $0.14 to $0.18
Player6: calls $0.18
Player2: raises $0.09 to $0.27 and is all-in
Player5: calls $0.25
Player1: raises $0.51 to $0.78 and is all-in
Player0: calls $0.60
Player6: folds
Player5: calls $0.15 and is all-in
*** TURN *** [7h 8s 4s] [2s]
*** RIVER *** [7h 8s 4s 2s] [2h]
*** SHOW DOWN ***
Player1: shows [2c 4c 3s 7c] (a full house, Deuces full of Sevens)
Player0: shows [6h 3h Tc 9c] (a pair of Deuces)
Player1 collected $0.69 from side pot-2
Player5: shows [3d 5c 8h 7s] (two pair, Eights and Sevens)
Player1 collected $0.42 from side pot-1
Player2: shows [5s 7d Kd 9h] (two pair, Sevens and Deuces)
Player1 collected $1.31 from main pot
*** SUMMARY ***
Total pot $2.54 Main pot $1.31. Side pot-1 $0.42. Side pot-2 $0.69. | Rake $0.12
Board [7h 8s 4s 2s 2h]
Seat 2: Player5 showed [3d 5c 8h 7s] and lost with two pair, Eights and Sevens
Seat 3: Player1 showed [2c 4c 3s 7c] and won ($2.42) with a full house, Deuces full of Sevens
Seat 5: Player0 showed [6h 3h Tc 9c] and lost with a pair of Deuces
Seat 6: Player4 folded before Flop (didn't bet)
Seat 7: Player6 (button) folded on the Flop
Seat 8: Player3 (small blind) folded before Flop
Seat 9: Player2 (big blind) showed [5s 7d Kd 9h] and lost with two pair, Sevens and Deuces
PokerStars Game #14311270221: Omaha Pot Limit ($0.01/$0.02 USD) - 2010/06/07 20:13:12 WET [2010/06/07 15:13:12 ET]
Table '99999999I' 9-max Seat #3 is the button
Seat 2: Player5 ($0.58 in chips)
Seat 3: Player1 ($0.65 in chips)
Seat 6: Player4 ($1.92 in chips)
Seat 7: Player6 ($2.81 in chips)
Seat 8: Player3 ($2.50 in chips)
Seat 9: Player2 ($0.80 in chips)
Player0 will be allowed to play after the button
Player4: posts small blind $0.01
Player6: posts big blind $0.02
Player3: posts big blind $0.02
Player2: posts big blind $0.02
*** HOLE CARDS ***
Dealt to Player1 [8d As 2h Ks]
Player3: checks
Player2: checks
Player5: raises $0.02 to $0.04
Player1: raises $0.02 to $0.06
Player4: calls $0.05
Player6: folds
Player3: calls $0.04
Player2: calls $0.04
Player5: calls $0.02
*** FLOP *** [Qh 7c Qs]
Player4: checks
Player3: checks
Player2: bets $0.31
Player5: folds
Player1: folds
Player4: folds
Player3: folds
Uncalled bet ($0.31) returned to Player2
Player2 collected $0.31 from pot
*** SUMMARY ***
Total pot $0.32 | Rake $0.01
Board [Qh 7c Qs]
Seat 2: Player5 folded on the Flop
Seat 3: Player1 (button) folded on the Flop
Seat 6: Player4 (small blind) folded on the Flop
Seat 7: Player6 (big blind) folded before Flop
Seat 8: Player3 folded on the Flop
Seat 9: Player2 collected ($0.31)
PokerStars Game #22865231671: Omaha Pot Limit ($0.01/$0.02 USD) - 2010/06/07 20:14:17 WET [2010/06/07 15:14:17 ET]
Table '99999999I' 9-max Seat #6 is the button
Seat 2: Player5 ($0.52 in chips)
Seat 3: Player1 ($0.59 in chips)
Seat 5: Player0 ($0.90 in chips)
Seat 6: Player4 ($1.86 in chips)
Seat 7: Player6 ($2.79 in chips)
Seat 8: Player3 ($5 in chips)
Seat 9: Player2 ($1.05 in chips)
Player6: posts small blind $0.01
Player3: posts big blind $0.02
Player0: posts big blind $0.02
*** HOLE CARDS ***
Dealt to Player1 [6d 3c 5s As]
Player2: calls $0.02
Player5: calls $0.02
Player1: calls $0.02
Player0: raises $0.06 to $0.08
Player4: calls $0.08
Player6: folds
Player3: folds
Player2: calls $0.06
Player5: calls $0.06
Player1: raises $0.06 to $0.14
Player0: raises $0.55 to $0.69
Player4: calls $0.61
Player2: raises $0.36 to $1.05 and is all-in
Player5: folds
Player1: calls $0.45 and is all-in
Player0: calls $0.21 and is all-in
Player4: calls $0.36
*** FLOP *** [6c Kc Qc]
*** TURN *** [6c Kc Qc] [Jc]
*** RIVER *** [6c Kc Qc Jc] [4c]
*** SHOW DOWN ***
Player2: shows [Js Ah 5d 9h] (a pair of Jacks)
Player4: shows [9c 9d 7d 7h] (a pair of Nines)
Player2 collected $0.29 from side pot-2
Player0: shows [Ks Ad 7s Tc] (a straight, Ten to Ace)
Player0 collected $0.88 from side pot-1
Player1: shows [6d 3c 5s As] (a pair of Sixes)
Player0 collected $2.35 from main pot
*** SUMMARY ***
Total pot $3.70 Main pot $2.35. Side pot-1 $0.88. Side pot-2 $0.29. | Rake $0.18
Board [6c Kc Qc Jc 4c]
Seat 2: Player5 folded before Flop
Seat 3: Player1 showed [6d 3c 5s As] and lost with a pair of Sixes
Seat 5: Player0 showed [Ks Ad 7s Tc] and won ($3.23) with a straight, Ten to Ace
Seat 6: Player4 (button) showed [9c 9d 7d 7h] and lost with a pair of Nines
Seat 7: Player6 (small blind) folded before Flop
Seat 8: Player3 (big blind) folded before Flop
Seat 9: Player2 showed [Js Ah 5d 9h] and won ($0.29) with a pair of Jacks
PokerStars Game #60920749213: Omaha Pot Limit ($0.01/$0.02 USD) - 2010/06/07 20:15:29 WET [2010/06/07 15:15:29 ET]
Table '99999999I' 9-max Seat #7 is the button
Seat 2: Player5 ($0.44 in chips)
Seat 3: Player1 ($0.80 in chips)
Seat 5: Player0 ($3.23 in chips)
Seat 6: Player4 ($0.81 in chips)
Seat 7: Player6 ($2.78 in chips)
Seat 8: Player3 ($4.98 in chips)
Seat 9: Player2 ($0.29 in chips)
Player3: posts small blind $0.01
Player2: posts big blind $0.02
*** HOLE CARDS ***
Dealt to Player1 [2c 4c 3s 7c]
Player5: calls $0.02
Player1: calls $0.02
Player0: calls $0.02
Player4: folds
Player6: calls $0.02
Player3: folds
Player2: checks
*** FLOP *** [7h 8s 4s]
Player2: checks
Player5: bets $0.02
Player1: raises $0.02 to $0.04
Player0: raises $0.14 to $0.18
Player6: calls $0.18
Player2: raises $0.09 to $0.27 and is all-in
Player5: calls $0.25
Player1: raises $0.51 to $0.78 and is all-in
Player0: calls $0.60
Player6: folds
Player5: calls $0.15 and is all-in
*** TURN *** [7h 8s 4s] [2s]
*** RIVER *** [7h 8s 4s 2s] [2h]
*** SHOW DOWN ***
Player1: shows [2c 4c 3s 7c] (a full house, Deuces full of Sevens)
Player0: shows [6h 3h Tc 9c] (a pair of Deuces)
Player1 collected $0.69 from side pot-2
Player5: shows [3d 5c 8h 7s] (two pair, Eights and Sevens)
Player1 collected $0.42 from side pot-1
Player2: shows [5s 7d Kd 9h] (two pair, Sevens and Deuces)
Player1 collected $1.31 from main pot
*** SUMMARY ***
Total pot $2.54 Main pot $1.31. Side pot-1 $0.42. Side pot-2 $0.69. | Rake $0.12
Board [7h 8s 4s 2s 2h]
Seat 2: Player5 showed [3d 5c 8h 7s] and lost with two pair, Eights and Sevens
Seat 3: Player1 showed [2c 4c 3s 7c] and won ($2.42) with a full house, Deuces full of Sevens
Seat 5: Player0 showed [6h 3h Tc 9c] and lost with a pair of Deuces
Seat 6: Player4 folded before Flop (didn't bet)
Seat 7: Player6 (button) folded on the Flop
Seat 8: Player3 (small blind) folded before Flop
Seat 9: Player2 (big blind) showed [5s 7d Kd 9h] and lost with two pair, Sevens and Deuces

39
pyfpdb/regression-test-files/tour/FTP/Flop/NLHE-USD-STT-2-20100323.Allin.with.less.than.sb.txt

@ -0,0 +1,39 @@
Full Tilt Poker Game #19505996411: $2 + $0.25 Sit & Go (148860619), Table 1 - 300/600 - Limit Hold'em - 18:58:46 ET - 2010/03/23
Seat 2: Player2 (7,723)
Seat 5: Player5 (3,409)
Seat 6: Player6 (50)
Seat 8: Player8 (818)
Player6 posts the small blind of 50, and is all in
Player8 posts the big blind of 300
The button is in seat #5
*** HOLE CARDS ***
Dealt to Player5 [2h 9h]
Player2 has 15 seconds left to act
Player2 calls 300
Player5 folds
Player8 checks
*** FLOP *** [2d 7s Qc]
Player8 checks
Player2 checks
*** TURN *** [2d 7s Qc] [8s]
Player8 checks
Player2 checks
*** RIVER *** [2d 7s Qc 8s] [5c]
Player8 checks
Player2 checks
*** SHOW DOWN ***
Player8 shows [Ts 4c] Queen Ten high
Player2 shows [2c As] a pair of Twos
Player2 wins the side pot (500) with a pair of Twos
Player6 shows [7c 5s] two pair, Sevens and Fives
Player6 wins the main pot (150) with two pair, Sevens and Fives
*** SUMMARY ***
Total pot 650 Main pot 150. Side pot 500. | Rake 0
Board: [2d 7s Qc 8s 5c]
Seat 2: Player2 showed [2c As] and won (500) with a pair of Twos
Seat 5: Player5 (button) didn't bet (folded)
Seat 6: Player6 (small blind) showed [7c 5s] and won (150) with two pair, Sevens and Fives
Seat 8: Player8 (big blind) showed [Ts 4c] and lost with Queen Ten high

3018
pyfpdb/regression-test-files/tour/Stars/Flop/NLHE-FPP-MTT-1r-201005.AllinLotsRebuy.txt

File diff suppressed because it is too large Load Diff

128
pyfpdb/regression-test-files/tour/Stars/Flop/NLHE-USD-STT-1-201004.8betPF.txt

@ -1,65 +1,65 @@
PokerStars Game #74759586758: Tournament #589688686, $1.00+$0.15 USD Hold'em No Limit - Level I (10/20) - 2010/04/10 22:18:19 WET [2010/04/10 17:18:19 ET]
Table '589688686 1' 10-max Seat #4 is the button
Seat 1: Player3 (1400 in chips)
Seat 2: Player5 (1470 in chips)
Seat 3: Player0 (1820 in chips)
Seat 4: Player2 (1620 in chips)
Seat 5: Player6 (560 in chips)
Seat 6: Player7 (1500 in chips)
Seat 7: Player8 (1500 in chips)
Seat 8: Player4 (1500 in chips)
Seat 9: Player1 (1500 in chips)
Seat 10: Player9 (2130 in chips)
Player6: posts small blind 10
Player7: posts big blind 20
*** HOLE CARDS ***
Dealt to Player0 [8c Tc]
Player8: calls 20
Player4: folds
Player1: folds
Player9: folds
Player3: folds
Player5: calls 20
Player0: calls 20
Player2: raises 20 to 40
Player6: calls 30
Player7: folds
Player8: calls 20
Player5: calls 20
Player0: raises 20 to 60
Player2: raises 20 to 80
Player6: calls 40
Player8: calls 40
Player5: folds
Player0: raises 20 to 100
Player2: raises 20 to 120
Player6: calls 40
Player8: calls 40
Player0: raises 20 to 140
Player2: raises 1480 to 1620 and is all-in
Player6: folds
Player8: folds
Player0: calls 1480
*** FLOP *** [8d 7d Qs]
*** TURN *** [8d 7d Qs] [Qc]
*** RIVER *** [8d 7d Qs Qc] [7c]
*** SHOW DOWN ***
Player0: shows [8c Tc] (two pair, Queens and Eights)
Player2: shows [3d Ad] (two pair, Queens and Sevens)
Player0 collected 3540 from pot
*** SUMMARY ***
Total pot 3540 | Rake 0
Board [8d 7d Qs Qc 7c]
Seat 1: Player3 folded before Flop (didn't bet)
Seat 2: Player5 folded before Flop
Seat 3: Player0 showed [8c Tc] and won (3540) with two pair, Queens and Eights
Seat 4: Player2 (button) showed [3d Ad] and lost with two pair, Queens and Sevens
Seat 5: Player6 (small blind) folded before Flop
Seat 6: Player7 (big blind) folded before Flop
Seat 7: Player8 folded before Flop
Seat 8: Player4 folded before Flop (didn't bet)
Seat 9: Player1 folded before Flop (didn't bet)
Seat 10: Player9 folded before Flop (didn't bet)
PokerStars Game #74759586758: Tournament #589688686, $1.00+$0.15 USD Hold'em No Limit - Level I (10/20) - 2010/04/10 22:18:19 WET [2010/04/10 17:18:19 ET]
Table '589688686 1' 10-max Seat #4 is the button
Seat 1: Player3 (1400 in chips)
Seat 2: Player5 (1470 in chips)
Seat 3: Player0 (1820 in chips)
Seat 4: Player2 (1620 in chips)
Seat 5: Player6 (560 in chips)
Seat 6: Player7 (1500 in chips)
Seat 7: Player8 (1500 in chips)
Seat 8: Player4 (1500 in chips)
Seat 9: Player1 (1500 in chips)
Seat 10: Player9 (2130 in chips)
Player6: posts small blind 10
Player7: posts big blind 20
*** HOLE CARDS ***
Dealt to Player0 [8c Tc]
Player8: calls 20
Player4: folds
Player1: folds
Player9: folds
Player3: folds
Player5: calls 20
Player0: calls 20
Player2: raises 20 to 40
Player6: calls 30
Player7: folds
Player8: calls 20
Player5: calls 20
Player0: raises 20 to 60
Player2: raises 20 to 80
Player6: calls 40
Player8: calls 40
Player5: folds
Player0: raises 20 to 100
Player2: raises 20 to 120
Player6: calls 40
Player8: calls 40
Player0: raises 20 to 140
Player2: raises 1480 to 1620 and is all-in
Player6: folds
Player8: folds
Player0: calls 1480
*** FLOP *** [8d 7d Qs]
*** TURN *** [8d 7d Qs] [Qc]
*** RIVER *** [8d 7d Qs Qc] [7c]
*** SHOW DOWN ***
Player0: shows [8c Tc] (two pair, Queens and Eights)
Player2: shows [3d Ad] (two pair, Queens and Sevens)
Player0 collected 3540 from pot
*** SUMMARY ***
Total pot 3540 | Rake 0
Board [8d 7d Qs Qc 7c]
Seat 1: Player3 folded before Flop (didn't bet)
Seat 2: Player5 folded before Flop
Seat 3: Player0 showed [8c Tc] and won (3540) with two pair, Queens and Eights
Seat 4: Player2 (button) showed [3d Ad] and lost with two pair, Queens and Sevens
Seat 5: Player6 (small blind) folded before Flop
Seat 6: Player7 (big blind) folded before Flop
Seat 7: Player8 folded before Flop
Seat 8: Player4 folded before Flop (didn't bet)
Seat 9: Player1 folded before Flop (didn't bet)
Seat 10: Player9 folded before Flop (didn't bet)

5732
pyfpdb/regression-test-files/tour/Stars/Flop/NLHE-USD-STT-20-201006.DONturbo.txt

File diff suppressed because it is too large Load Diff

7
run_fpdb.py

@ -15,7 +15,6 @@
#In the "official" distribution you can find the license in
#agpl-3.0.txt in the docs folder of the package.
import os
import sys
@ -25,6 +24,8 @@ sys.path[0] = sys.path[0]+os.sep+"pyfpdb"
os.chdir(sys.path[0])
#print "sys.path[0] =", sys.path[0], "cwd =", os.getcwd()
os.execvpe('pythonw.exe', ('pythonw.exe', 'fpdb.pyw', '-r'), os.environ)
if os.name=='nt':
os.execvpe('pythonw.exe', list(('pythonw.exe', 'fpdb.pyw', '-r'))+sys.argv[1:], os.environ)
else:
os.execvpe('python', list(('python', 'fpdb.pyw', '-r'))+sys.argv[1:], os.environ)
# first arg is ignored (name of program being run)

0
pyfpdb/test1.py → test_Python.py

0
pyfpdb/test2.py → test_Python_Libs.py

38
utils/dump_db_basedata.py

@ -1,38 +0,0 @@
#!/usr/bin/python
#Copyright 2008 Steffen Jobbagy-Felso
#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 in the docs folder of the package.
import sys
import MySQLdb
db = MySQLdb.connect("localhost", "fpdb", sys.argv[1], "fpdb")
cursor = db.cursor()
print "Connected to MySQL on localhost. Printing dev-supplied base data:"
cursor.execute("SELECT * FROM sites")
print "Sites"
print "====="
print cursor.fetchall()
cursor.execute("SELECT * FROM gametypes")
print "Gametypes"
print "========="
result=cursor.fetchall()
for i in range (len(result)):
print result[i]
cursor.close()
db.close()

83
utils/get_db_stats.py

@ -1,83 +0,0 @@
#!/usr/bin/python
#Copyright 2008 Steffen Jobbagy-Felso
#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 in the docs folder of the package.
import sys
import MySQLdb
db = MySQLdb.connect("localhost", "fpdb", sys.argv[1], "fpdb")
cursor = db.cursor()
print "Connected to MySQL on localhost. Printing summary stats:"
cursor.execute("SELECT id FROM Players")
print "Players:",cursor.rowcount
cursor.execute("SELECT id FROM Autorates")
print "Autorates:",cursor.rowcount
cursor.execute("SELECT id FROM Sites")
print "Sites:",cursor.rowcount
cursor.execute("SELECT id FROM Gametypes")
print "Gametypes:",cursor.rowcount
cursor.execute("SELECT id FROM Hands")
print "Total Hands:",cursor.rowcount
cursor.execute("SELECT Hands.id FROM Hands INNER JOIN Gametypes ON Hands.gametypeId = Gametypes.id WHERE Gametypes.type='ring'")
print "Hands, Ring:",cursor.rowcount
cursor.execute("SELECT Hands.id FROM Hands INNER JOIN Gametypes ON Hands.gametypeId = Gametypes.id WHERE Gametypes.type='stt'")
print "Hands, STT:",cursor.rowcount
cursor.execute("SELECT Hands.id FROM Hands INNER JOIN Gametypes ON Hands.gametypeId = Gametypes.id WHERE Gametypes.type='mtt'")
print "Hands, MTT:",cursor.rowcount
print ""
print "Hands per category and type"
cursor.execute("SELECT Hands.id FROM Hands INNER JOIN Gametypes ON Hands.gametypeId = Gametypes.id WHERE Gametypes.limitType='cn'")
print "Hands, Cap No Limit:",cursor.rowcount
cursor.execute("SELECT Hands.id FROM Hands INNER JOIN Gametypes ON Hands.gametypeId = Gametypes.id WHERE Gametypes.limitType='cp'")
print "Hands, Cap Pot Limit:",cursor.rowcount
cursor.execute("SELECT Hands.id FROM Hands INNER JOIN Gametypes ON Hands.gametypeId = Gametypes.id WHERE Gametypes.category='holdem' AND Gametypes.limitType='nl'")
print "Hands, Holdem No Limit:",cursor.rowcount
cursor.execute("SELECT Hands.id FROM Hands INNER JOIN Gametypes ON Hands.gametypeId = Gametypes.id WHERE Gametypes.category='holdem' AND Gametypes.limitType='pl'")
print "Hands, Holdem Pot Limit:",cursor.rowcount
cursor.execute("SELECT Hands.id FROM Hands INNER JOIN Gametypes ON Hands.gametypeId = Gametypes.id WHERE Gametypes.category='holdem' AND Gametypes.limitType='fl'")
print "Hands, Holdem Fixed Limit:",cursor.rowcount
cursor.execute("SELECT Hands.id FROM Hands INNER JOIN Gametypes ON Hands.gametypeId = Gametypes.id WHERE Gametypes.category='omahahi' AND Gametypes.limitType='nl'")
print "Hands, Omaha Hi No Limit:",cursor.rowcount
cursor.execute("SELECT Hands.id FROM Hands INNER JOIN Gametypes ON Hands.gametypeId = Gametypes.id WHERE Gametypes.category='omahahi' AND Gametypes.limitType='pl'")
print "Hands, Omaha Hi Pot Limit:",cursor.rowcount
cursor.execute("SELECT Hands.id FROM Hands INNER JOIN Gametypes ON Hands.gametypeId = Gametypes.id WHERE Gametypes.category='omahahi' AND Gametypes.limitType='fl'")
print "Hands, Omaha Hi Fixed Limit:",cursor.rowcount
cursor.execute("SELECT Hands.id FROM Hands INNER JOIN Gametypes ON Hands.gametypeId = Gametypes.id WHERE Gametypes.category='omahahilo' AND Gametypes.limitType='nl'")
print "Hands, Omaha Hi/Lo No Limit:",cursor.rowcount
cursor.execute("SELECT Hands.id FROM Hands INNER JOIN Gametypes ON Hands.gametypeId = Gametypes.id WHERE Gametypes.category='omahahilo' AND Gametypes.limitType='pl'")
print "Hands, Omaha Hi/Lo Pot Limit:",cursor.rowcount
cursor.execute("SELECT Hands.id FROM Hands INNER JOIN Gametypes ON Hands.gametypeId = Gametypes.id WHERE Gametypes.category='omahahilo' AND Gametypes.limitType='fl'")
print "Hands, Omaha Hi/Lo Fixed Limit:",cursor.rowcount
cursor.execute("SELECT Hands.id FROM Hands INNER JOIN Gametypes ON Hands.gametypeId = Gametypes.id WHERE Gametypes.category='razz'")
print "Hands, Razz:",cursor.rowcount
cursor.execute("SELECT Hands.id FROM Hands INNER JOIN Gametypes ON Hands.gametypeId = Gametypes.id WHERE Gametypes.category='studhi'")
print "Hands, Stud Hi:",cursor.rowcount
cursor.execute("SELECT Hands.id FROM Hands INNER JOIN Gametypes ON Hands.gametypeId = Gametypes.id WHERE Gametypes.category='studhilo'")
print "Hands, Stud Hi/Lo:",cursor.rowcount
print ""
cursor.execute("SELECT id FROM BoardCards")
print "Board_cards:",cursor.rowcount
cursor.execute("SELECT id FROM HandsPlayers")
print "Hands_players:",cursor.rowcount
cursor.execute("SELECT id FROM HandsActions")
print "Hands_actions:",cursor.rowcount
cursor.close()
db.close()
Loading…
Cancel
Save