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

This commit is contained in:
Mika Bostrom 2010-06-29 10:26:20 +03:00
commit 8411f3ed09
42 changed files with 11165 additions and 11699 deletions

View File

@ -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

View File

@ -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.

View File

@ -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

File diff suppressed because it is too large Load Diff

View File

@ -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 " "
}

View File

@ -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!"
}

View File

@ -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

View File

@ -32,6 +32,7 @@ import string
import traceback import traceback
import shutil import shutil
import locale import locale
import re
import xml.dom.minidom import xml.dom.minidom
from xml.dom.minidom import Node from xml.dom.minidom import Node
@ -248,6 +249,8 @@ class Site:
self.enabled = string_to_bool(node.getAttribute("enabled"), default=True) self.enabled = string_to_bool(node.getAttribute("enabled"), default=True)
self.xpad = node.getAttribute("xpad") self.xpad = node.getAttribute("xpad")
self.ypad = node.getAttribute("ypad") self.ypad = node.getAttribute("ypad")
self.xshift = node.getAttribute("xshift")
self.yshift = node.getAttribute("yshift")
self.layout = {} self.layout = {}
print "Loading site", self.site_name print "Loading site", self.site_name
@ -259,6 +262,8 @@ class Site:
# Site defaults # Site defaults
self.xpad = 1 if self.xpad == "" else int(self.xpad) self.xpad = 1 if self.xpad == "" else int(self.xpad)
self.ypad = 0 if self.ypad == "" else int(self.ypad) 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.font_size = 7 if self.font_size == "" else int(self.font_size)
self.hudopacity = 1.0 if self.hudopacity == "" else float(self.hudopacity) self.hudopacity = 1.0 if self.hudopacity == "" else float(self.hudopacity)
@ -296,12 +301,18 @@ class Game:
self.cols = int( node.getAttribute("cols") ) self.cols = int( node.getAttribute("cols") )
self.xpad = node.getAttribute("xpad") self.xpad = node.getAttribute("xpad")
self.ypad = node.getAttribute("ypad") self.ypad = node.getAttribute("ypad")
self.xshift = node.getAttribute("xshift")
self.yshift = node.getAttribute("yshift")
# Defaults # Defaults
if self.xpad == "": self.xpad = 1 if self.xpad == "": self.xpad = 1
else: self.xpad = int(self.xpad) else: self.xpad = int(self.xpad)
if self.ypad == "": self.ypad = 0 if self.ypad == "": self.ypad = 0
else: self.ypad = int(self.ypad) 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_text = node.getAttribute("aux")
aux_list = aux_text.split(',') aux_list = aux_text.split(',')
@ -334,6 +345,8 @@ class Game:
temp = temp + " cols = %d\n" % self.cols temp = temp + " cols = %d\n" % self.cols
temp = temp + " xpad = %d\n" % self.xpad temp = temp + " xpad = %d\n" % self.xpad
temp = temp + " ypad = %d\n" % self.ypad 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 temp = temp + " aux = %s\n" % self.aux
for stat in self.stats.keys(): for stat in self.stats.keys():
@ -662,7 +675,34 @@ class Config:
pass pass
with open(file, 'w') as f: 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, def edit_layout(self, site_name, max, width = None, height = None,
fav_seat = None, locations = None): fav_seat = None, locations = None):
@ -951,6 +991,8 @@ class Config:
parms["enabled"] = self.supported_sites[site].enabled parms["enabled"] = self.supported_sites[site].enabled
parms["xpad"] = self.supported_sites[site].xpad parms["xpad"] = self.supported_sites[site].xpad
parms["ypad"] = self.supported_sites[site].ypad parms["ypad"] = self.supported_sites[site].ypad
parms["xshift"] = self.supported_sites[site].xshift
parms["yshift"] = self.supported_sites[site].yshift
return parms return parms
def set_site_parameters(self, site_name, converter = None, decoder = None, 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['cols'] = self.supported_games[name].cols
param['xpad'] = self.supported_games[name].xpad param['xpad'] = self.supported_games[name].xpad
param['ypad'] = self.supported_games[name].ypad 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 param['aux'] = self.supported_games[name].aux
return param return param

View File

@ -1633,7 +1633,12 @@ class Database:
pdata[p]['street3CheckCallRaiseChance'], pdata[p]['street3CheckCallRaiseChance'],
pdata[p]['street3CheckCallRaiseDone'], pdata[p]['street3CheckCallRaiseDone'],
pdata[p]['street4CheckCallRaiseChance'], 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'] q = self.sql.query['store_hands_players']
@ -1662,7 +1667,7 @@ class Database:
#print "DEBUG: %s %s %s" %(hid, pids, pdata) #print "DEBUG: %s %s %s" %(hid, pids, pdata)
inserts = [] inserts = []
for p in pdata: for p in pdata:
line = [0]*61 line = [0]*76
line[0] = 1 # HDs line[0] = 1 # HDs
if pdata[p]['street0VPI']: line[1] = 1 if pdata[p]['street0VPI']: line[1] = 1
@ -1719,13 +1724,29 @@ class Database:
if pdata[p]['street3CheckCallRaiseDone']: line[52] = 1 if pdata[p]['street3CheckCallRaiseDone']: line[52] = 1
if pdata[p]['street4CheckCallRaiseChance']: line[53] = 1 if pdata[p]['street4CheckCallRaiseChance']: line[53] = 1
if pdata[p]['street4CheckCallRaiseDone']: line[54] = 1 if pdata[p]['street4CheckCallRaiseDone']: line[54] = 1
line[55] = gid # gametypeId if pdata[p]['street0Calls']: line[55] = 1
line[56] = pids[p] # playerId if pdata[p]['street1Calls']: line[56] = 1
line[57] = len(pids) # activeSeats 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' } 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[73] = pos[pdata[p]['position']]
line[59] = pdata[p]['tourneyTypeId'] line[74] = pdata[p]['tourneyTypeId']
line[60] = styleKey # styleKey line[75] = styleKey # styleKey
inserts.append(line) inserts.append(line)

View File

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

View File

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

View File

@ -228,9 +228,9 @@ class GuiGraphViewer (threading.Thread):
self.ax.plot(blue, color='blue', label='Showdown: $%.2f' %(blue[-1])) self.ax.plot(blue, color='blue', label='Showdown: $%.2f' %(blue[-1]))
self.ax.plot(red, color='red', label='Non-showdown: $%.2f' %(red[-1])) self.ax.plot(red, color='red', label='Non-showdown: $%.2f' %(red[-1]))
if sys.version[0:3] == '2.5': 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: 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.graphBox.add(self.canvas)
self.canvas.show() self.canvas.show()

View File

@ -97,6 +97,9 @@ class GuiPlayerStats (threading.Thread):
, ["vpip", True, "VPIP", 1.0, "%3.1f", "str"] , ["vpip", True, "VPIP", 1.0, "%3.1f", "str"]
, ["pfr", True, "PFR", 1.0, "%3.1f", "str"] , ["pfr", True, "PFR", 1.0, "%3.1f", "str"]
, ["pf3", True, "PF3", 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"] , ["steals", True, "Steals", 1.0, "%3.1f", "str"]
, ["saw_f", True, "Saw_F", 1.0, "%3.1f", "str"] , ["saw_f", True, "Saw_F", 1.0, "%3.1f", "str"]
, ["sawsd", True, "SawSD", 1.0, "%3.1f", "str"] , ["sawsd", True, "SawSD", 1.0, "%3.1f", "str"]

View File

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

View File

@ -508,6 +508,9 @@ Left-Drag to Move"
<pu_stat pu_stat_name="a_freq2"> </pu_stat> <pu_stat pu_stat_name="a_freq2"> </pu_stat>
<pu_stat pu_stat_name="a_freq3"> </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="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="cb1"> </pu_stat>
<pu_stat pu_stat_name="cb2"> </pu_stat> <pu_stat pu_stat_name="cb2"> </pu_stat>
<pu_stat pu_stat_name="cb3"> </pu_stat> <pu_stat pu_stat_name="cb3"> </pu_stat>

View File

@ -2,6 +2,13 @@
<FreePokerToolsConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FreePokerToolsConfig.xsd"> <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> <import callFpdbHud = "True" interval = "10" fastStoreHudCache="False" hhArchiveBase="~/.fpdb/HandHistories/" saveActions="True"></import>
<!-- These values determine what stats are displayed in the HUD <!-- These values determine what stats are displayed in the HUD
@ -114,6 +121,10 @@ Left-Drag to Move"
hudopacity="1.0" hudopacity="1.0"
font="Sans" font="Sans"
font_size="8" font_size="8"
xpad="1"
ypad="0"
xshift="0"
yshift="0"
supported_games="holdem,razz,omahahi,omahahilo,studhi,studhilo"> supported_games="holdem,razz,omahahi,omahahilo,studhi,studhilo">
<layout max="8" width="792" height="546" fav_seat="0"> <layout max="8" width="792" height="546" fav_seat="0">
<location seat="1" x="684" y="61"> </location> <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_freq2"> </pu_stat>
<pu_stat pu_stat_name="a_freq3"> </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="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="cb1"> </pu_stat>
<pu_stat pu_stat_name="cb2"> </pu_stat> <pu_stat pu_stat_name="cb2"> </pu_stat>
<pu_stat pu_stat_name="cb3"> </pu_stat> <pu_stat pu_stat_name="cb3"> </pu_stat>

View File

@ -345,7 +345,7 @@ For sites (currently only Carbon Poker) which record "all in" as a special actio
self.actions['BLINDSANTES'].append(act) self.actions['BLINDSANTES'].append(act)
if blindtype == 'both': 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.... # the SB 0.50 and the BB is $1, after the turn the minimum bet amount is $2....
amount = self.bb amount = self.bb
self.bets['BLINDSANTES'][player].append(Decimal(self.sb)) self.bets['BLINDSANTES'][player].append(Decimal(self.sb))

View File

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

View File

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

View File

@ -819,7 +819,6 @@ class Sql:
street2Raises INT, street2Raises INT,
street3Raises INT, street3Raises INT,
street4Raises INT, street4Raises INT,
actionString REAL) actionString REAL)
""" """
@ -1337,6 +1336,21 @@ class Sql:
sum(hc.street3CheckCallRaiseDone) AS ccr_3, sum(hc.street3CheckCallRaiseDone) AS ccr_3,
sum(hc.street4CheckCallRaiseChance) AS ccr_opp_4, 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 FROM Hands h
INNER JOIN HandsPlayers hp ON (hp.handId = h.id) INNER JOIN HandsPlayers hp ON (hp.handId = h.id)
INNER JOIN HudCache hc ON ( hc.PlayerId = hp.PlayerId+0 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.street3CheckCallRaiseChance) AS ccr_opp_3,
sum(hc.street3CheckCallRaiseDone) AS ccr_3, sum(hc.street3CheckCallRaiseDone) AS ccr_3,
sum(hc.street4CheckCallRaiseChance) AS ccr_opp_4, 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 FROM Hands h
INNER JOIN HandsPlayers hp ON (hp.handId = h.id) INNER JOIN HandsPlayers hp ON (hp.handId = h.id)
INNER JOIN HudCache hc ON (hc.playerId = hp.playerId) 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.street3CheckCallRaiseChance as <signed>integer) AS ccr_opp_3,
cast(hp2.street3CheckCallRaiseDone as <signed>integer) AS ccr_3, cast(hp2.street3CheckCallRaiseDone as <signed>integer) AS ccr_3,
cast(hp2.street4CheckCallRaiseChance as <signed>integer) AS ccr_opp_4, 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 FROM
Hands h Hands h
INNER JOIN Hands h2 ON (h2.id > %s AND h2.tableName = h.tableName) INNER JOIN Hands h2 ON (h2.id > %s AND h2.tableName = h.tableName)
@ -1618,7 +1662,22 @@ class Sql:
cast(hp2.street3CheckCallRaiseChance as <signed>integer) AS ccr_opp_3, cast(hp2.street3CheckCallRaiseChance as <signed>integer) AS ccr_opp_3,
cast(hp2.street3CheckCallRaiseDone as <signed>integer) AS ccr_3, cast(hp2.street3CheckCallRaiseDone as <signed>integer) AS ccr_3,
cast(hp2.street4CheckCallRaiseChance as <signed>integer) AS ccr_opp_4, 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 /* this hand */ FROM Hands h /* this hand */
INNER JOIN Hands h2 ON ( h2.id > %s /* other hands */ INNER JOIN Hands h2 ON ( h2.id > %s /* other hands */
AND h2.tableName = h.tableName) AND h2.tableName = h.tableName)
@ -1706,7 +1765,22 @@ class Sql:
cast(hp2.street3CheckCallRaiseChance as <signed>integer) AS ccr_opp_3, cast(hp2.street3CheckCallRaiseChance as <signed>integer) AS ccr_opp_3,
cast(hp2.street3CheckCallRaiseDone as <signed>integer) AS ccr_3, cast(hp2.street3CheckCallRaiseDone as <signed>integer) AS ccr_3,
cast(hp2.street4CheckCallRaiseChance as <signed>integer) AS ccr_opp_4, 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 /* this hand */ FROM Hands h /* this hand */
INNER JOIN Hands h2 ON ( h2.id > %s /* other hands */ INNER JOIN Hands h2 ON ( h2.id > %s /* other hands */
AND h2.tableName = h.tableName) AND h2.tableName = h.tableName)
@ -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))) 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))) /(sum(cast(hp.street1Seen as <signed>integer))+sum(cast(hp.street2Seen as <signed>integer))+sum(cast(hp.street3Seen as <signed>integer)))
end AS pofafq 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.totalProfit)/100.0 AS net
,sum(hp.rake)/100.0 AS rake ,sum(hp.rake)/100.0 AS rake
,100.0*avg(hp.totalProfit/(gt.bigBlind+0.0)) AS bbper100 ,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))) 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))) /(sum(cast(hp.street1Seen as <signed>integer))+sum(cast(hp.street2Seen as <signed>integer))+sum(cast(hp.street3Seen as <signed>integer)))
end AS pofafq 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.totalProfit)/100.0 AS net
,sum(hp.rake)/100.0 AS rake ,sum(hp.rake)/100.0 AS rake
,100.0*avg(hp.totalProfit/(gt.bigBlind+0.0)) AS bbper100 ,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))) 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))) /(sum(cast(hp.street1Seen as <signed>integer))+sum(cast(hp.street2Seen as <signed>integer))+sum(cast(hp.street3Seen as <signed>integer)))
end AS pofafq 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.totalProfit)/100.0 AS net
,sum(hp.rake)/100.0 AS rake ,sum(hp.rake)/100.0 AS rake
,100.0*avg(hp.totalProfit/(gt.bigBlind+0.0)) AS bbper100 ,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 GROUP BY h.handStart, hp.handId, hp.sawShowdown, hp.totalProfit
ORDER BY h.handStart""" 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 # Session stats query
@ -2664,6 +2756,7 @@ class Sql:
INNER JOIN Players p on (p.Id = hp.playerId) INNER JOIN Players p on (p.Id = hp.playerId)
WHERE hp.playerId in <player_test> WHERE hp.playerId in <player_test>
AND date_format(h.handStart, '%Y-%m-%d') <datestest> AND date_format(h.handStart, '%Y-%m-%d') <datestest>
AND hp.tourneysPlayersId IS NULL
ORDER by time""" ORDER by time"""
elif db_server == 'postgresql': elif db_server == 'postgresql':
self.query['sessionStats'] = """ self.query['sessionStats'] = """
@ -2675,6 +2768,7 @@ class Sql:
INNER JOIN Players p on (p.Id = hp.playerId) INNER JOIN Players p on (p.Id = hp.playerId)
WHERE hp.playerId in <player_test> WHERE hp.playerId in <player_test>
AND h.handStart <datestest> AND h.handStart <datestest>
AND hp.tourneysPlayersId IS NULL
ORDER by time""" ORDER by time"""
elif db_server == 'sqlite': elif db_server == 'sqlite':
self.query['sessionStats'] = """ self.query['sessionStats'] = """
@ -2686,6 +2780,7 @@ class Sql:
INNER JOIN Players p on (p.Id = hp.playerId) INNER JOIN Players p on (p.Id = hp.playerId)
WHERE hp.playerId in <player_test> WHERE hp.playerId in <player_test>
AND h.handStart <datestest> AND h.handStart <datestest>
AND hp.tourneysPlayersId IS NULL
ORDER by time""" ORDER by time"""
@ -2759,6 +2854,21 @@ class Sql:
,street3CheckCallRaiseDone ,street3CheckCallRaiseDone
,street4CheckCallRaiseChance ,street4CheckCallRaiseChance
,street4CheckCallRaiseDone ,street4CheckCallRaiseDone
,street0Calls
,street1Calls
,street2Calls
,street3Calls
,street4Calls
,street0Bets
,street1Bets
,street2Bets
,street3Bets
,street4Bets
,street0Raises
,street1Raises
,street2Raises
,street3Raises
,street4Raises
) )
SELECT h.gametypeId SELECT h.gametypeId
,hp.playerId ,hp.playerId
@ -2834,6 +2944,21 @@ class Sql:
,sum(street3CheckCallRaiseDone) ,sum(street3CheckCallRaiseDone)
,sum(street4CheckCallRaiseChance) ,sum(street4CheckCallRaiseChance)
,sum(street4CheckCallRaiseDone) ,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 FROM HandsPlayers hp
INNER JOIN Hands h ON (h.id = hp.handId) INNER JOIN Hands h ON (h.id = hp.handId)
<where_clause> <where_clause>
@ -2908,6 +3033,21 @@ class Sql:
,street3CheckCallRaiseDone ,street3CheckCallRaiseDone
,street4CheckCallRaiseChance ,street4CheckCallRaiseChance
,street4CheckCallRaiseDone ,street4CheckCallRaiseDone
,street0Calls
,street1Calls
,street2Calls
,street3Calls
,street4Calls
,street0Bets
,street1Bets
,street2Bets
,street3Bets
,street4Bets
,street0Raises
,street1Raises
,street2Raises
,street3Raises
,street4Raises
) )
SELECT h.gametypeId SELECT h.gametypeId
,hp.playerId ,hp.playerId
@ -2983,6 +3123,21 @@ class Sql:
,sum(CAST(street3CheckCallRaiseDone as integer)) ,sum(CAST(street3CheckCallRaiseDone as integer))
,sum(CAST(street4CheckCallRaiseChance as integer)) ,sum(CAST(street4CheckCallRaiseChance as integer))
,sum(CAST(street4CheckCallRaiseDone 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 FROM HandsPlayers hp
INNER JOIN Hands h ON (h.id = hp.handId) INNER JOIN Hands h ON (h.id = hp.handId)
<where_clause> <where_clause>
@ -3057,6 +3212,21 @@ class Sql:
,street3CheckCallRaiseDone ,street3CheckCallRaiseDone
,street4CheckCallRaiseChance ,street4CheckCallRaiseChance
,street4CheckCallRaiseDone ,street4CheckCallRaiseDone
,street0Calls
,street1Calls
,street2Calls
,street3Calls
,street4Calls
,street0Bets
,street1Bets
,street2Bets
,street3Bets
,street4Bets
,street0Raises
,street1Raises
,street2Raises
,street3Raises
,street4Raises
) )
SELECT h.gametypeId SELECT h.gametypeId
,hp.playerId ,hp.playerId
@ -3132,6 +3302,21 @@ class Sql:
,sum(CAST(street3CheckCallRaiseDone as integer)) ,sum(CAST(street3CheckCallRaiseDone as integer))
,sum(CAST(street4CheckCallRaiseChance as integer)) ,sum(CAST(street4CheckCallRaiseChance as integer))
,sum(CAST(street4CheckCallRaiseDone 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 FROM HandsPlayers hp
INNER JOIN Hands h ON (h.id = hp.handId) INNER JOIN Hands h ON (h.id = hp.handId)
<where_clause> <where_clause>
@ -3205,7 +3390,22 @@ class Sql:
street3CheckCallRaiseChance, street3CheckCallRaiseChance,
street3CheckCallRaiseDone, street3CheckCallRaiseDone,
street4CheckCallRaiseChance, street4CheckCallRaiseChance,
street4CheckCallRaiseDone) street4CheckCallRaiseDone,
street0Calls,
street1Calls,
street2Calls,
street3Calls,
street4Calls,
street0Bets,
street1Bets,
street2Bets,
street3Bets,
street4Bets,
street0Raises,
street1Raises,
street2Raises,
street3Raises,
street4Raises)
VALUES (%s, %s, %s, %s, %s, VALUES (%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,
@ -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, %s, %s, %s, %s,
%s, %s, %s, %s, %s,
%s, %s, %s, %s, %s,
%s)""" %s)"""
self.query['update_hudcache'] = """ self.query['update_hudcache'] = """
@ -3276,7 +3479,22 @@ class Sql:
street3CheckCallRaiseChance=street3CheckCallRaiseChance+%s, street3CheckCallRaiseChance=street3CheckCallRaiseChance+%s,
street3CheckCallRaiseDone=street3CheckCallRaiseDone+%s, street3CheckCallRaiseDone=street3CheckCallRaiseDone+%s,
street4CheckCallRaiseChance=street4CheckCallRaiseChance+%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 WHERE gametypeId+0=%s
AND playerId=%s AND playerId=%s
AND activeSeats=%s AND activeSeats=%s
@ -3602,7 +3820,12 @@ class Sql:
street3CheckCallRaiseChance, street3CheckCallRaiseChance,
street3CheckCallRaiseDone, street3CheckCallRaiseDone,
street4CheckCallRaiseChance, street4CheckCallRaiseChance,
street4CheckCallRaiseDone street4CheckCallRaiseDone,
street0Raises,
street1Raises,
street2Raises,
street3Raises,
street4Raises
) )
VALUES ( VALUES (
%s, %s, %s, %s, %s, %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, %s, %s, %s, %s, %s,
%s, %s, %s, %s, %s,
%s, %s, %s, %s, %s %s, %s, %s, %s, %s
)""" )"""

View File

@ -1,4 +1,5 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Manage collecting and formatting of stats and tooltips. """Manage collecting and formatting of stats and tooltips.
""" """
@ -114,7 +115,7 @@ def playername(stat_dict, player):
stat_dict[player]['screen_name']) stat_dict[player]['screen_name'])
def vpip(stat_dict, player): def vpip(stat_dict, player):
""" Voluntarily put $ in the pot.""" """ Voluntarily put $ in the pot pre-flop."""
stat = 0.0 stat = 0.0
try: try:
stat = float(stat_dict[player]['vpip'])/float(stat_dict[player]['n']) 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) + '%', 'v=%3.1f' % (100*stat) + '%',
'vpip=%3.1f' % (100*stat) + '%', 'vpip=%3.1f' % (100*stat) + '%',
'(%d/%d)' % (stat_dict[player]['vpip'], stat_dict[player]['n']), '(%d/%d)' % (stat_dict[player]['vpip'], stat_dict[player]['n']),
'Voluntarily Put In Pot %' 'Voluntarily Put In Pot Pre-Flop%'
) )
except: return (stat, except: return (stat,
'%3.1f' % (0) + '%', '%3.1f' % (0) + '%',
'v=%3.1f' % (0) + '%', 'v=%3.1f' % (0) + '%',
'vpip=%3.1f' % (0) + '%', 'vpip=%3.1f' % (0) + '%',
'(%d/%d)' % (0, 0), '(%d/%d)' % (0, 0),
'Voluntarily Put In Pot %' 'Voluntarily Put In Pot Pre-Flop%'
) )
def pfr(stat_dict, player): def pfr(stat_dict, player):
@ -504,6 +505,91 @@ def a_freq_123(stat_dict, player):
'Post-Flop Aggression Freq' '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): def cb1(stat_dict, player):
""" Flop continuation bet.""" """ Flop continuation bet."""
stat = 0.0 stat = 0.0

View File

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

View File

@ -1,4 +1,5 @@
#!/usr/bin/python #!/usr/bin/python
# -*- coding: utf-8 -*-
#Copyright 2008 Steffen Jobbagy-Felso #Copyright 2008 Steffen Jobbagy-Felso
#This program is free software: you can redistribute it and/or modify #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 os.environ['PATH'] = tmppath
print "Python " + sys.version[0:3] + ' - press return to continue\n' print "Python " + sys.version[0:3] + ' - press return to continue\n'
sys.stdin.readline() 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: else:
print "\npython 2.5 not found, please install python 2.5 or 2.6 for fpdb\n" print "\npython 2.5 not found, please install python 2.5 or 2.6 for fpdb\n"
raw_input("Press ENTER to continue.") raw_input("Press ENTER to continue.")
@ -110,7 +111,7 @@ import Database
import Configuration import Configuration
import Exceptions import Exceptions
VERSION = "0.20" VERSION = "0.20-pre1"
class fpdb: class fpdb:
@ -226,11 +227,11 @@ class fpdb:
dia = gtk.AboutDialog() dia = gtk.AboutDialog()
dia.set_name("Free Poker Database (FPDB)") dia.set_name("Free Poker Database (FPDB)")
dia.set_version(VERSION) 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_comments("GTK AboutDialog comments here")
dia.set_license("GPL v3") dia.set_license("GPL v3")
dia.set_website("http://fpdb.sourceforge.net/") dia.set_website("http://fpdb.sourceforge.net/")
dia.set_authors(['Steffen', 'Eratosthenes', 's0rrow', dia.set_authors(['Steffen', 'Eratosthenes', 'Carl Gherardi',
'Eric Blade', '_mt', 'sqlcoder', 'Bostik', 'and others']) 'Eric Blade', '_mt', 'sqlcoder', 'Bostik', 'and others'])
dia.set_program_name("Free Poker Database (FPDB)") dia.set_program_name("Free Poker Database (FPDB)")
@ -275,7 +276,7 @@ class fpdb:
gtk.STOCK_SAVE, gtk.RESPONSE_ACCEPT)) gtk.STOCK_SAVE, gtk.RESPONSE_ACCEPT))
dia.set_default_size(700, 500) 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() response = dia.run()
if response == gtk.RESPONSE_ACCEPT: if response == gtk.RESPONSE_ACCEPT:
# save updated config # save updated config
@ -283,10 +284,12 @@ class fpdb:
if len(self.nb_tab_names) == 1: if len(self.nb_tab_names) == 1:
# only main tab open, reload profile # only main tab open, reload profile
self.load_profile() self.load_profile()
dia.destroy()
else: 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 " self.warning_box("Updated preferences have not been loaded because "
+ "windows are open. Re-start fpdb to load them.") + "windows are open. Re-start fpdb to load them.")
else:
dia.destroy() dia.destroy()
def dia_maintain_dbs(self, widget, data=None): def dia_maintain_dbs(self, widget, data=None):
@ -393,11 +396,13 @@ class fpdb:
if self.obtain_global_lock(): # returns true if successful if self.obtain_global_lock(): # returns true if successful
#lock_released = False #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") 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 " \ 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." +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 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() response = dia_confirm.run()
dia_confirm.destroy() dia_confirm.destroy()
@ -412,6 +417,14 @@ class fpdb:
#else: #else:
# for other dbs use same connection as holds global lock # for other dbs use same connection as holds global lock
# self.fdb_lock.fdb.recreate_tables() # 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: elif response == gtk.RESPONSE_NO:
print 'User cancelled recreating tables' print 'User cancelled recreating tables'
#if not lock_released: #if not lock_released:
@ -419,9 +432,11 @@ class fpdb:
def dia_recreate_hudcache(self, widget, data=None): def dia_recreate_hudcache(self, widget, data=None):
if self.obtain_global_lock(): 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." diastring = "Please confirm that you want to re-create the HUD cache."
self.dia_confirm.format_secondary_text(diastring) 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) hb1 = gtk.HBox(True, 1)
self.h_start_date = gtk.Entry(max=12) self.h_start_date = gtk.Entry(max=12)
@ -469,16 +484,19 @@ class fpdb:
def dia_rebuild_indexes(self, widget, data=None): def dia_rebuild_indexes(self, widget, data=None):
if self.obtain_global_lock(): if self.obtain_global_lock():
self.dia_confirm = gtk.MessageDialog(parent=None self.dia_confirm = gtk.MessageDialog(parent=self.window
,flags=0 ,flags=gtk.DIALOG_DESTROY_WITH_PARENT
,type=gtk.MESSAGE_WARNING ,type=gtk.MESSAGE_WARNING
,buttons=(gtk.BUTTONS_YES_NO) ,buttons=(gtk.BUTTONS_YES_NO)
,message_format="Confirm rebuilding database indexes") ,message_format="Confirm rebuilding database indexes")
diastring = "Please confirm that you want to rebuild the database indexes." diastring = "Please confirm that you want to rebuild the database indexes."
self.dia_confirm.format_secondary_text(diastring) 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() response = self.dia_confirm.run()
if response == gtk.RESPONSE_YES: if response == gtk.RESPONSE_YES:
#FIXME these progress messages do not seem to work
lbl = gtk.Label(" Rebuilding Indexes ... ") lbl = gtk.Label(" Rebuilding Indexes ... ")
self.dia_confirm.vbox.add(lbl) self.dia_confirm.vbox.add(lbl)
lbl.show() lbl.show()
@ -550,8 +568,13 @@ class fpdb:
pass pass
def __calendar_dialog(self, widget, entry): 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 = 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') d.set_title('Pick a date')
vb = gtk.VBox() vb = gtk.VBox()
@ -714,7 +737,7 @@ class fpdb:
self.warning_box( "There is an error in your config file\n" + self.config.file self.warning_box( "There is an error in your config file\n" + self.config.file
+ "\n\nError is: " + str(self.config.file_error) + "\n\nError is: " + str(self.config.file_error)
, diatitle="CONFIG FILE ERROR" ) , diatitle="CONFIG FILE ERROR" )
exit() sys.exit()
log = Configuration.get_logger("logging.conf", "fpdb", log_dir=self.config.dir_log) 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" 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): def tab_main_help(self, widget, data=None):
"""Displays a tab with the main fpdb help screen""" """Displays a tab with the main fpdb help screen"""
mh_tab=gtk.Label("""Welcome to Fpdb! 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. This program is currently in an alpha-state, so our database format is still sometimes changed.
Please note that default.conf is no longer needed nor used, all configuration now happens in HUD_config.xml You should therefore always keep your hand history files so that you can re-import after an update, if necessary.
This program is licensed under the AGPL3, see docs"""+os.sep+"agpl-3.0.txt") 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") self.add_and_display_tab(mh_tab, "Help")
def tab_table_viewer(self, widget, data=None): 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.connect("destroy", self.destroy)
self.window.set_title("Free Poker DB - v%s or higher" % (VERSION, )) self.window.set_title("Free Poker DB - v%s or higher" % (VERSION, ))
self.window.set_border_width(1) 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.window.set_resizable(True)
self.main_vbox = gtk.VBox(False, 1) 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 = gtk.ImageMenuItem(gtk.STOCK_ABOUT)
menuItem.connect('activate', self.dia_about) menuItem.connect('activate', self.dia_about)
self.statusMenu.append(menuItem) self.statusMenu.append(menuItem)
menuItem = gtk.ImageMenuItem(gtk.STOCK_QUIT)
menuItem.connect('activate', self.quit) # do not allow quit - if any transient (popup) windows are open (rebuild cache, rebuild index etc)
self.statusMenu.append(menuItem) # 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.connect('popup-menu', self.statusicon_menu, self.statusMenu)
self.statusIcon.set_visible(True) 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() self.window.present()
def info_box(self, str1, str2): 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 ) , buttons=(gtk.BUTTONS_OK), message_format=str1 )
diapath.format_secondary_text(str2) diapath.format_secondary_text(str2)
response = diapath.run() response = diapath.run()
@ -1014,7 +1050,7 @@ This program is licensed under the AGPL3, see docs"""+os.sep+"agpl-3.0.txt")
return response return response
def warning_box(self, str, diatitle="FPDB WARNING"): 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) label = gtk.Label(str)
diaWarning.vbox.add(label) diaWarning.vbox.add(label)

View File

@ -39,16 +39,14 @@ Py2exe script for fpdb.
# MSVCP90.dll. These are somewhere in your windows install, so you # MSVCP90.dll. These are somewhere in your windows install, so you
# can just copy them to your working folder. (or just assume other # can just copy them to your working folder. (or just assume other
# person will have them? any copyright issues with including them?) # 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 #- If it works, you'll have a new dir fpdb-YYYYMMDD-exe which should
# 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
# contain 2 dirs; gfx and pyfpdb and run_fpdb.bat # contain 2 dirs; gfx and pyfpdb and run_fpdb.bat
#- Last, you must copy the etc/, lib/ and share/ folders from your #- [ 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, # gtk/bin/ (just /gtk/?) folder to the pyfpdb folder. (the whole folders,
# not just the contents) # not just the contents) ]
#- You can (should) then prune the etc/, lib/ and share/ folders to #- 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: # sqlcoder notes: this worked for me with the following notes:
#- I used the following versions: #- I used the following versions:
@ -116,11 +114,11 @@ test_and_remove('build')
today = date.today().strftime('%Y%m%d') today = date.today().strftime('%Y%m%d')
print "\n" + r"Output will be created in \pyfpdb\ and \fpdb_XXX_"+today+'\\' print "\n" + r"Output will be created in \pyfpdb\ and \fpdb_"+today+'\\'
print "Enter value for XXX (any length): ", # the comma means no newline #print "Enter value for XXX (any length): ", # the comma means no newline
xxx = sys.stdin.readline().rstrip() #xxx = sys.stdin.readline().rstrip()
dist_dirname = r'fpdb-' + xxx + '-' + today + '-exe' dist_dirname = r'fpdb-' + today + '-exe'
dist_dir = r'..\fpdb-' + xxx + '-' + today + '-exe' dist_dir = r'..\fpdb-' + today + '-exe'
print print
test_and_remove(dist_dir) test_and_remove(dist_dir)
@ -137,7 +135,7 @@ setup(
options = {'py2exe': { options = {'py2exe': {
'packages' : ['encodings', 'matplotlib'], 'packages' : ['encodings', 'matplotlib'],
'includes' : ['cairo', 'pango', 'pangocairo', 'atk', 'gobject' 'includes' : ['gio', 'cairo', 'pango', 'pangocairo', 'atk', 'gobject'
,'matplotlib.numerix.random_array' ,'matplotlib.numerix.random_array'
,'AbsoluteToFpdb', 'BetfairToFpdb' ,'AbsoluteToFpdb', 'BetfairToFpdb'
,'CarbonToFpdb', 'EverleafToFpdb' ,'CarbonToFpdb', 'EverleafToFpdb'
@ -163,10 +161,11 @@ setup(
os.rename('dist', 'pyfpdb') os.rename('dist', 'pyfpdb')
print '\n' + 'If py2exe was successful add the \\etc \\lib and \\share dirs ' # these instructions no longer needed:
print 'from your gtk dir to \\%s\\pyfpdb\\\n' % dist_dirname #print '\n' + 'If py2exe was successful add the \\etc \\lib and \\share dirs '
print 'Also copy libgobject-2.0-0.dll and libgdk-win32-2.0-0.dll from <gtk_dir>\\bin' #print 'from your gtk dir to \\%s\\pyfpdb\\\n' % dist_dirname
print 'into there' #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') dest = os.path.join(dist_dirname, 'pyfpdb')
#print "try renaming pyfpdb to", dest #print "try renaming pyfpdb to", dest
@ -207,4 +206,24 @@ dest_dir = os.path.join(dest, 'share')
dest_dir = dest_dir.replace('\\', '\\\\') dest_dir = dest_dir.replace('\\', '\\\\')
shutil.copytree( src_dir, dest_dir ) 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!
"""

View File

@ -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.

View File

@ -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

7
run_fpdb.py Normal file → Executable file
View File

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

View File

@ -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()

View File

@ -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()