gimick
13 years ago
162 changed files with 43305 additions and 14779 deletions
@ -0,0 +1,112 @@
|
||||
Hello everyone, |
||||
The new fpdb release 0.22 is now available for download as source or as packages/installers for Debian, Gentoo, Ubuntu and Windows. |
||||
This version brings many improvements and bugfixes. A quick word on our version naming: We have decided to stop using the usual alpha/beta/rc release system as it doesn't suit fpdb's development style and resources. From now on all releases are created equal (ie. considered "testing"). If they proof themselves we declare them "stable" and make them the default download on sourceforge. If you wish to be notified of new releases or stabilisation please subscribe to the fpdb-announe mailing list (see Links further down). Since this version has been available for some time we consider it stable and recommend all users to update. |
||||
|
||||
So... what is FPDB? |
||||
=================== |
||||
FPDB (Free Poker Database) is a free/open source suite of steadily growing tools to track and analyse your online poker game. FPDB is able to import the hand histories that poker sites write to your computer and to store additional data from each hand in a database for use in later analysis. |
||||
|
||||
FPDB is ambitious, intending to support all games. Currently we support flop based games (Hold’em, Omaha, Omaha Hi/Lo), stud games (7 Card Stud, 7 Card Stud Hi/Lo, and Razz) and draw games (Triple Draw Lowball, 5 Card Draw) on most major poker sites. |
||||
|
||||
FPDB provides a Heads Up Display (HUD), Profit Grapher and Stats viewers with a list of features that is growing. |
||||
|
||||
What's changed |
||||
============== |
||||
417 changesets (incl. merges) have gone in since 0.21-rc2. Some of the improvements are: |
||||
|
||||
New stats: |
||||
Three bet: name="three_B" (note this stat was previously "three_B_0") |
||||
Four bet: name="four_B" |
||||
Cold four bet: name="cfour_B" |
||||
Squeeze bet preflop: name="squeeze" |
||||
Fold to three bet preflop: name="f_3bet" |
||||
Fold to four bet preflop: name="f_4bet" |
||||
Steal Success : name="s_steal" |
||||
|
||||
Pokerstars Home Games now supported |
||||
Everest now supported |
||||
Winamax now supported |
||||
|
||||
Translation progress: |
||||
Complete: English, Hungarian. If you notice an untranslated string in any output please let us know. |
||||
Partial: French (85%), German (32%), Polish (27%), Spanish (17%), Russian (6%). |
||||
|
||||
|
||||
Significant work on the underlying HUD code, including hud dragging and table closing |
||||
Problems where some stats became > 100% are now fixed |
||||
sqlite database performance improvements (sqlite is the default database for fpdb) |
||||
pokerstars.it tournament HUD now working |
||||
Cap games added to filter options |
||||
Initial work to support Rush poker - this will need further testing and improvement before we can release it. One or two testers would be welcome, please PM gimick if you want to help. |
||||
|
||||
Various updates and fixes when importing Hand histories. |
||||
Party freeroll tournaments now recognised. |
||||
Stars 20/40 limit and FTP 1k/2k limit now recognised. |
||||
Initial work on a Stove function for holdem (see the viewers menu) |
||||
The windows exe has been upgraded from python 2.6 to python 2.7. |
||||
|
||||
|
||||
Where to get it |
||||
=============== |
||||
Please note that you will have to either recreate your database or use a new one if you're updating from 0.21-rc2 or older. Fpdb will warn you if your database is incompatible and will not work unless you recreate or use a different one. |
||||
Config files from 0.20 and later should work. Please report if you have problems with config files from that version or later. |
||||
You can find checksums (MD5 and SHA512) in the download folder. |
||||
To download: http://sourceforge.net/projects/fpdb/files/fpdb/0.22/ |
||||
|
||||
Links |
||||
===== |
||||
To be notified by email of new versions you can subscribe to our announce mailing list here: https://lists.sourceforge.net/lists/listinfo/fpdb-announce |
||||
Link to fpdb website (wiki) http://fpdb.wiki.sourceforge.net/ |
||||
Features page: http://sourceforge.net/apps/mediawiki/fpdb/index.php?title=Features |
||||
How to install&setup fpdb in 5 Minutes with the Windows installer: http://sf.net/projects/fpdb/files/fpdb/help/ Choose exe021install.avi (18mb, no sound) |
||||
Installation instructions are available from: http://sourceforge.net/apps/mediawiki/fpdb/index.php?title=Installation |
||||
Getting Started Instructions: http://sourceforge.net/apps/mediawiki/fpdb/index.php?title=Getting_Started |
||||
FAQ: http://sourceforge.net/apps/mediawiki/fpdb/index.php?title=FAQ |
||||
Screenshots: http://sourceforge.net/apps/mediawiki/fpdb/index.php?title=Screenshots |
||||
|
||||
How to help |
||||
=========== |
||||
Join us in IRC (see below) and say you want to do something :) |
||||
|
||||
How to get help |
||||
=============== |
||||
Please also see the "Bug reports" section below to enable us to help you. |
||||
These are listed in order of usefulness - the 2+2 thread in particular is rather chaotic so if we miss your post feel free to bring it up again |
||||
1) Chat/IRC |
||||
One of the developers is usually around, but it is IRC. Dont get discouraged because we didn't answer within 10 minutes, once we do you've probably got our full attention. |
||||
This link takes you to a website where you can talk to us directly: http://webchat.freenode.net/?channels=fpdb |
||||
Alternatively use can use any IRC client to connect to #fpdb on freenode.net |
||||
2) Mailing List |
||||
Visit http://lists.sourceforge.net/lists/listinfo/fpdb-main to subscribe to the development&support mailing list and send us an email |
||||
3) The monster 2+2 forum thread (registration required). |
||||
http://forumserver.twoplustwo.com/16...2009-a-273001/ Please dont let the size of the thread phase you. It is monitored and sends email notifications to some of the developers. (Note: If you play poker and don't frequent the 2+2 forums, you may want to become better acquainted. Its a bit daunting at first, but well worth the effort) |
||||
|
||||
Bug reports |
||||
=========== |
||||
When you do report issues, try to make it easier for us help you. We usually need at least the following information: |
||||
- Operating system and version (e.g. Ubuntu 10.10 or Windows XP) |
||||
- Database type (MySQL, SQLite, PostgreSQL) |
||||
- Install method (exe, tarball, deb, git, ebuild) |
||||
- Fpdb version |
||||
- Site name and gametype (e.g. $10 Pokerstars Razz SnG) |
||||
You can find most of these details for easy copy&paste in the Help menu under About. |
||||
|
||||
Important known problems |
||||
======================== |
||||
Hud will not work if using postgres database - fixed in 0.23 |
||||
PKR is not working correctly |
||||
|
||||
Special information for Windows installations |
||||
============================================= |
||||
First-time installs will need to download and install the C++ runtime executable from Microsoft. |
||||
Windows 7 and windows Vista users will need to set fpdb.exe and hud_main.exe to run as administrator (see http://sourceforge.net/apps/mediawiki/fpdb/index.php?title=Install_in_Windows) |
||||
|
||||
Contributors |
||||
============ |
||||
Code/translations: Worros, Donoban, Nutomatic, Steffen, Chaz Littlejohn, Scott Wolchok, tribumarchal, Erki Ferenc, Eric Blade, atinm, Mika Bostrom, Robert Wielinga, Chris Moore, Gerko de Roo, Gimick |
||||
Special shoutout to Eleatic Stranger who has written an initial converter for Carbon poker, without ever having played on the site! |
||||
Documentation: RSOAndrew, Buggernaut, ChazDazzle |
||||
Testers and everyone answering forum questions - xaviax, Dog, uncooper etc. You know who you are. |
||||
Hand History donations: Quite a few people on this list now. Every donation for alternate sites and various corner cases is appreciated. |
||||
|
||||
And a particular thanks to all the libraries, interpreters etc. that we use to create fpdb! |
@ -0,0 +1,78 @@
|
||||
Replace all occurrences of XXX with the real values. |
||||
Remove or leave YYY(foobar)YYY sections as appropriate. |
||||
|
||||
Hello everyone, |
||||
The new fpdb release XXX is now available for download as source or as packages/installers for Debian, Gentoo, Ubuntu and Windows. |
||||
This version brings many improvements and bugfixes. A quick word on our version naming: We have decided to stop using the usual alpha/beta/rc release system as it doesn't suit fpdb's development style and resources. From now on all releases are created equal (ie. considered "testing"). If they proof themselves we declare them "stable" and make them the default download on sourceforge. If you wish to be notified of new releases or stabilisation please subscribe to the fpdb-announe mailing list (see Links further down). |
||||
|
||||
So... what is FPDB? |
||||
=================== |
||||
FPDB (Free Poker Database) is a free/open source suite of steadily growing tools to track and analyse your online poker game. FPDB is able to import the hand histories that poker sites write to your computer and to store additional data from each hand in a database for use in later analysis. |
||||
|
||||
FPDB is ambitious, intending to support all games. Currently we support flop based games (Hold’em, Omaha, Omaha Hi/Lo), stud games (7 Card Stud, 7 Card Stud Hi/Lo, and Razz) and draw games (Triple Draw Lowball, 5 Card Draw) on most major poker sites. |
||||
|
||||
FPDB provides a Heads Up Display (HUD), Profit Grapher and Stats viewers with a list of features that is growing. |
||||
|
||||
What's changed |
||||
============== |
||||
XXX changesets (incl. merges) have gone in since XXX. Some of the improvements are: |
||||
|
||||
XXX |
||||
|
||||
Where to get it |
||||
=============== |
||||
Please note that you will have to either recreate your database or use a new one if you're updating from XXX or older. Fpdb will warn you if your database is incompatible and will not work unless you recreate or use a different one. |
||||
Config files from 0.20 and later should work. Please report if you have problems with config files from that version or later. |
||||
You can find checksums (MD5 and SHA512) in the download folder. |
||||
To download: http://sourceforge.net/projects/fpdb/files/fpdb/XXX/ |
||||
|
||||
Links |
||||
===== |
||||
To be notified by email of new versions you can subscribe to our announce mailing list here: https://lists.sourceforge.net/lists/listinfo/fpdb-announce |
||||
Link to fpdb website (wiki) http://fpdb.wiki.sourceforge.net/ |
||||
Features page: http://sourceforge.net/apps/mediawiki/fpdb/index.php?title=Features |
||||
How to install&setup fpdb in 5 Minutes with the Windows installer: http://sf.net/projects/fpdb/files/fpdb/help/ Choose exe021install.avi (18mb, no sound) |
||||
Installation instructions are available from: http://sourceforge.net/apps/mediawiki/fpdb/index.php?title=Installation |
||||
Getting Started Instructions: http://sourceforge.net/apps/mediawiki/fpdb/index.php?title=Getting_Started |
||||
FAQ: http://sourceforge.net/apps/mediawiki/fpdb/index.php?title=FAQ |
||||
Screenshots: http://sourceforge.net/apps/mediawiki/fpdb/index.php?title=Screenshots |
||||
|
||||
How to help |
||||
=========== |
||||
Join us in IRC (see below) and say you want to do something :) |
||||
|
||||
How to get help |
||||
=============== |
||||
Please also see the "Bug reports" section below to enable us to help you. |
||||
These are listed in order of usefulness - the 2+2 thread in particular is rather chaotic so if we miss your post feel free to bring it up again |
||||
1) Chat/IRC |
||||
One of the developers is usually around, but it is IRC. Dont get discouraged because we didn't answer within 10 minutes, once we do you've probably got our full attention. |
||||
This link takes you to a website where you can talk to us directly: http://webchat.freenode.net/?channels=fpdb |
||||
Alternatively use can use any IRC client to connect to #fpdb on freenode.net |
||||
2) Mailing List |
||||
Visit http://lists.sourceforge.net/lists/listinfo/fpdb-main to subscribe to the development&support mailing list and send us an email |
||||
3) The monster 2+2 forum thread (registration required). |
||||
http://forumserver.twoplustwo.com/16...2009-a-273001/ Please dont let the size of the thread phase you. It is monitored and sends email notifications to some of the developers. (Note: If you play poker and don't frequent the 2+2 forums, you may want to become better acquainted. Its a bit daunting at first, but well worth the effort) |
||||
|
||||
Bug reports |
||||
=========== |
||||
When you do report issues, try to make it easier for us help you. We usually need at least the following information: |
||||
- Operating system and version (e.g. Ubuntu 10.10 or Windows XP) |
||||
- Database type (MySQL, SQLite, PostgreSQL) |
||||
- Install method (exe, tarball, deb, git, ebuild) |
||||
- Fpdb version |
||||
- Site name and gametype (e.g. $10 Pokerstars Razz SnG) |
||||
You can find most of these details for easy copy&paste in the Help menu under About. |
||||
|
||||
Important known problems |
||||
======================== |
||||
YYY(PKR is not working correctly)YYY |
||||
|
||||
Special information for Windows installations |
||||
============================================= |
||||
YYY(First-time installs may need to download and install the C++ runtime executable from Microsoft.)YYY |
||||
YYY(Windows 7 and windows Vista users will need to set fpdb.exe and hud_main.exe to run as administrator (see http://sourceforge.net/apps/mediawiki/fpdb/index.php?title=Install_in_Windows))YYY |
||||
|
||||
Contributors |
||||
============ |
||||
For the latest list of contributors please see YYY(replace with link to git-web of contributors.txt)YYY |
@ -1,60 +0,0 @@
|
||||
# Copyright 1999-2011 Gentoo Foundation |
||||
# Distributed under the terms of the GNU General Public License v2 |
||||
# $Header: $ |
||||
|
||||
#TODO: Header, add cdecimal |
||||
|
||||
EAPI="2" |
||||
|
||||
inherit eutils games |
||||
|
||||
DESCRIPTION="A free/open source tracker/HUD for use with online poker" |
||||
HOMEPAGE="http://fpdb.wiki.sourceforge.net/" |
||||
SRC_URI="mirror://sourceforge/${PN}/${PV}/${P}.tar.bz2" |
||||
|
||||
LICENSE="AGPL-3" |
||||
SLOT="0" |
||||
KEYWORDS="~amd64 ~x86" |
||||
#note: this should work on other architectures too, please send me your experiences |
||||
|
||||
IUSE="graph mysql postgres sqlite" |
||||
RDEPEND=" |
||||
mysql? ( virtual/mysql |
||||
dev-python/mysql-python ) |
||||
postgres? ( dev-db/postgresql-server |
||||
dev-python/psycopg ) |
||||
sqlite? ( dev-lang/python[sqlite] |
||||
dev-python/numpy ) |
||||
>=x11-libs/gtk+-2.10 |
||||
dev-python/pygtk |
||||
graph? ( dev-python/numpy |
||||
dev-python/matplotlib[gtk] ) |
||||
dev-python/python-xlib |
||||
dev-python/pytz" |
||||
DEPEND="${RDEPEND}" |
||||
|
||||
src_install() { |
||||
insinto "${GAMES_DATADIR}"/${PN} |
||||
doins -r gfx |
||||
doins -r pyfpdb |
||||
doins readme.txt |
||||
|
||||
exeinto "${GAMES_DATADIR}"/${PN} |
||||
doexe run_fpdb.py |
||||
|
||||
dodir "${GAMES_BINDIR}" |
||||
dosym "${GAMES_DATADIR}"/${PN}/run_fpdb.py "${GAMES_BINDIR}"/${PN} |
||||
|
||||
newicon gfx/fpdb-icon.png ${PN}.png |
||||
make_desktop_entry ${PN} |
||||
|
||||
fperms +x "${GAMES_DATADIR}"/${PN}/pyfpdb/*.pyw |
||||
prepgamesdirs |
||||
} |
||||
|
||||
pkg_postinst() { |
||||
games_pkg_postinst |
||||
elog "Note that if you really want to use mysql or postgresql you will have to create" |
||||
elog "the database and user yourself and enter it into the fpdb config." |
||||
elog "You can find the instructions on the project's website." |
||||
} |
@ -1,134 +0,0 @@
|
||||
#!/usr/bin/env python |
||||
# -*- coding: utf-8 -*- |
||||
|
||||
#Copyright 2009-2011 Grigorij Indigirkin |
||||
#This program is free software: you can redistribute it and/or modify |
||||
#it under the terms of the GNU Affero General Public License as published by |
||||
#the Free Software Foundation, version 3 of the License. |
||||
# |
||||
#This program is distributed in the hope that it will be useful, |
||||
#but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
#GNU General Public License for more details. |
||||
# |
||||
#You should have received a copy of the GNU Affero General Public License |
||||
#along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
#In the "official" distribution you can find the license in agpl-3.0.txt. |
||||
|
||||
#TODO: gettextify if file is used again |
||||
|
||||
from decimal_wrapper import Decimal |
||||
|
||||
from sqlalchemy import types |
||||
from sqlalchemy.orm.exc import NoResultFound |
||||
from sqlalchemy.exc import IntegrityError |
||||
|
||||
import Card |
||||
|
||||
class CardColumn(types.TypeDecorator): |
||||
"""Stores cards as smallints |
||||
|
||||
Automatically converts values like '9h' to smallint |
||||
|
||||
>>> CardColumn().process_bind_param( 'Td', '' ) |
||||
22 |
||||
>>> CardColumn().process_bind_param( u'Td', '' ) |
||||
22 |
||||
>>> CardColumn().process_bind_param( 22, '' ) |
||||
22 |
||||
>>> CardColumn().process_result_value( 22, '' ) |
||||
'Td' |
||||
""" |
||||
|
||||
impl = types.SmallInteger |
||||
|
||||
def process_bind_param(self, value, dialect): |
||||
if value is None or isinstance(value, int): |
||||
return value |
||||
elif isinstance(value, basestring) and len(value) == 2: |
||||
return Card.encodeCard(str(value)) |
||||
else: |
||||
raise Exception, "Incorrect card value: " + repr(value) |
||||
|
||||
def process_result_value(self, value, dialect): |
||||
return Card.valueSuitFromCard( value ) |
||||
|
||||
|
||||
class MoneyColumn(types.TypeDecorator): |
||||
"""Stores money: bets, pots, etc |
||||
|
||||
Understands: |
||||
Decimal as real amount |
||||
int as amount mupliplied by 100 |
||||
string as decimal |
||||
Returns Decimal |
||||
>>> MoneyColumn().process_bind_param( 230, '' ) |
||||
230 |
||||
>>> MoneyColumn().process_bind_param( Decimal('2.30'), '' ) |
||||
230 |
||||
>>> MoneyColumn().process_bind_param( '2.30', '' ) |
||||
230 |
||||
>>> MoneyColumn().process_result_value( 230, '' ) |
||||
Decimal('2.3') |
||||
""" |
||||
|
||||
impl = types.Integer |
||||
|
||||
def process_bind_param(self, value, dialect): |
||||
if value is None or isinstance(value, int): |
||||
return value |
||||
elif isinstance(value, basestring) or isinstance(value, Decimal): |
||||
return int(Decimal(value)*100) |
||||
else: |
||||
raise Exception, "Incorrect amount:" + repr(value) |
||||
|
||||
def process_result_value(self, value, dialect): |
||||
if value is None: |
||||
return None |
||||
return Decimal(value)/100 |
||||
|
||||
|
||||
class BigIntColumn(types.TypeDecorator, types.Integer): |
||||
"""Representing db-independent big integer """ |
||||
# Integer inheritance required for auto_increment flag |
||||
|
||||
impl = types.Integer |
||||
|
||||
def load_dialect_impl(self, dialect): |
||||
from sqlalchemy import databases |
||||
if dialect.name == 'mysql': |
||||
return databases.mysql.MSBigInteger() |
||||
elif dialect.name == 'postgres': |
||||
return databases.mysql.PGBigInteger() |
||||
return types.Integer() |
||||
|
||||
|
||||
class MappedBase(object): |
||||
"""Provide dummy contrcutor""" |
||||
|
||||
def __init__(self, **kwargs): |
||||
for k, v in kwargs.iteritems(): |
||||
setattr(self, k, v) |
||||
|
||||
def get_columns_names(self): |
||||
return [i.name for i in self._sa_class_manager.mapper.c] |
||||
|
||||
def get_or_create(klass, session, **kwargs): |
||||
""" |
||||
Looks up an object with the given kwargs, creating one if necessary. |
||||
Returns a tuple of (object, created), where created is a boolean |
||||
specifying whether an object was created. |
||||
""" |
||||
assert kwargs, \ |
||||
'get_or_create() must be passed at least one keyword argument' |
||||
try: |
||||
return session.query(klass).filter_by(**kwargs).one(), False |
||||
except NoResultFound: |
||||
try: |
||||
obj = klass(**kwargs) |
||||
session.add(obj) |
||||
session.flush() |
||||
return obj, True |
||||
except IntegrityError: |
||||
return session.query(klass).filter_by(**kwargs).one(), False |
||||
|
@ -1,485 +0,0 @@
|
||||
#!/usr/bin/env python |
||||
# -*- coding: utf-8 -*- |
||||
|
||||
#Copyright 2009-2011 Grigorij Indigirkin |
||||
#This program is free software: you can redistribute it and/or modify |
||||
#it under the terms of the GNU Affero General Public License as published by |
||||
#the Free Software Foundation, version 3 of the License. |
||||
# |
||||
#This program is distributed in the hope that it will be useful, |
||||
#but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
#GNU General Public License for more details. |
||||
# |
||||
#You should have received a copy of the GNU Affero General Public License |
||||
#along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
#In the "official" distribution you can find the license in agpl-3.0.txt. |
||||
|
||||
"""@package AlchemyMappings |
||||
This package contains all classes to be mapped and mappers themselves |
||||
""" |
||||
|
||||
#TODO: gettextify if file is used again |
||||
|
||||
import logging |
||||
import re |
||||
from decimal_wrapper import Decimal |
||||
from sqlalchemy.orm import mapper, relation, reconstructor |
||||
from sqlalchemy.sql import select |
||||
from collections import defaultdict |
||||
|
||||
|
||||
from AlchemyTables import * |
||||
from AlchemyFacilities import get_or_create, MappedBase |
||||
from DerivedStats import DerivedStats |
||||
from Exceptions import IncompleteHandError, FpdbError |
||||
|
||||
|
||||
class Player(MappedBase): |
||||
"""Class reflecting Players db table""" |
||||
|
||||
@staticmethod |
||||
def get_or_create(session, siteId, name): |
||||
return get_or_create(Player, session, siteId=siteId, name=name)[0] |
||||
|
||||
def __str__(self): |
||||
return '<Player "%s" on %s>' % (self.name, self.site and self.site.name) |
||||
|
||||
|
||||
class Gametype(MappedBase): |
||||
"""Class reflecting Gametypes db table""" |
||||
|
||||
@staticmethod |
||||
def get_or_create(session, siteId, gametype): |
||||
map = zip( |
||||
['type', 'base', 'category', 'limitType', 'smallBlind', 'bigBlind', 'smallBet', 'bigBet', 'currency'], |
||||
['type', 'base', 'category', 'limitType', 'sb', 'bb', 'dummy', 'dummy', 'currency']) |
||||
gametype = dict([(new, gametype.get(old)) for new, old in map ]) |
||||
|
||||
hilo = "h" |
||||
if gametype['category'] in ('studhilo', 'omahahilo'): |
||||
hilo = "s" |
||||
elif gametype['category'] in ('razz','27_3draw','badugi'): |
||||
hilo = "l" |
||||
gametype['hiLo'] = hilo |
||||
|
||||
for f in ['smallBlind', 'bigBlind', 'smallBet', 'bigBet']: |
||||
if gametype[f] is None: |
||||
gametype[f] = 0 |
||||
gametype[f] = int(Decimal(gametype[f])*100) |
||||
|
||||
gametype['siteId'] = siteId |
||||
return get_or_create(Gametype, session, **gametype)[0] |
||||
|
||||
|
||||
class HandActions(object): |
||||
"""Class reflecting HandsActions db table""" |
||||
def initFromImportedHand(self, hand, actions): |
||||
self.hand = hand |
||||
self.actions = {} |
||||
for street, street_actions in actions.iteritems(): |
||||
self.actions[street] = [] |
||||
for v in street_actions: |
||||
hp = hand.handplayers_by_name[v[0]] |
||||
self.actions[street].append({'street': street, 'pid': hp.id, 'seat': hp.seatNo, 'action':v}) |
||||
|
||||
@property |
||||
def flat_actions(self): |
||||
actions = [] |
||||
for street in self.hand.allStreets: |
||||
actions += self.actions[street] |
||||
return actions |
||||
|
||||
|
||||
|
||||
class HandInternal(DerivedStats): |
||||
"""Class reflecting Hands db table""" |
||||
|
||||
def parseImportedHandStep1(self, hand): |
||||
"""Extracts values to insert into from hand returned by HHC. No db is needed he""" |
||||
hand.players = hand.getAlivePlayers() |
||||
|
||||
# also save some data for step2. Those fields aren't in Hands table |
||||
self.siteId = hand.siteId |
||||
self.gametype_dict = hand.gametype |
||||
|
||||
self.attachHandPlayers(hand) |
||||
self.attachActions(hand) |
||||
|
||||
self.assembleHands(hand) |
||||
self.assembleHandsPlayers(hand) |
||||
|
||||
def parseImportedHandStep2(self, session): |
||||
"""Fetching ids for gametypes and players""" |
||||
gametype = Gametype.get_or_create(session, self.siteId, self.gametype_dict) |
||||
self.gametypeId = gametype.id |
||||
for hp in self.handPlayers: |
||||
hp.playerId = Player.get_or_create(session, self.siteId, hp.name).id |
||||
|
||||
def getPlayerByName(self, name): |
||||
if not hasattr(self, 'handplayers_by_name'): |
||||
self.handplayers_by_name = {} |
||||
for hp in self.handPlayers: |
||||
pname = getattr(hp, 'name', None) or hp.player.name |
||||
self.handplayers_by_name[pname] = hp |
||||
return self.handplayers_by_name[name] |
||||
|
||||
def attachHandPlayers(self, hand): |
||||
"""Fill HandInternal.handPlayers list. Create self.handplayers_by_name""" |
||||
hand.noSb = getattr(hand, 'noSb', None) |
||||
if hand.noSb is None and self.gametype_dict['base']=='hold': |
||||
saw_sb = False |
||||
for action in hand.actions[hand.actionStreets[0]]: # blindsantes |
||||
if action[1] == 'posts' and action[2] == 'small blind' and action[0] is not None: |
||||
saw_sb = True |
||||
hand.noSb = saw_sb |
||||
|
||||
self.handplayers_by_name = {} |
||||
for seat, name, chips in hand.players: |
||||
p = HandPlayer(hand = self, imported_hand=hand, seatNo=seat, |
||||
name=name, startCash=chips) |
||||
self.handplayers_by_name[name] = p |
||||
|
||||
def attachActions(self, hand): |
||||
"""Create HandActions object""" |
||||
a = HandActions() |
||||
a.initFromImportedHand(self, hand.actions) |
||||
|
||||
def parseImportedTournament(self, hand, session): |
||||
"""Fetching tourney, its type and players |
||||
|
||||
Must be called after Step2 |
||||
""" |
||||
if self.gametype_dict['type'] != 'tour': return |
||||
|
||||
# check for consistense |
||||
for i in ('buyin', 'tourNo'): |
||||
if not hasattr(hand, i): |
||||
raise IncompleteHandError( |
||||
"Field '%s' required for tournaments" % i, self.id, hand ) |
||||
|
||||
# repair old-style buyin value |
||||
m = re.match('\$(\d+)\+\$(\d+)', hand.buyin) |
||||
if m is not None: |
||||
hand.buyin, self.fee = m.groups() |
||||
|
||||
# fetch tourney type |
||||
tour_type_hand2db = { |
||||
'buyin': 'buyin', |
||||
'fee': 'fee', |
||||
'speed': 'speed', |
||||
'maxSeats': 'maxseats', |
||||
'knockout': 'isKO', |
||||
'rebuy': 'isRebuy', |
||||
'addOn': 'isAddOn', |
||||
'shootout': 'isShootout', |
||||
'matrix': 'isMatrix', |
||||
'sng': 'isSNG', |
||||
} |
||||
tour_type_index = dict([ |
||||
( i_db, getattr(hand, i_hand, None) ) |
||||
for i_db, i_hand in tour_type_hand2db.iteritems() |
||||
]) |
||||
tour_type_index['siteId'] = self.siteId |
||||
tour_type = TourneyType.get_or_create(session, **tour_type_index) |
||||
|
||||
# fetch and update tourney |
||||
tour = Tourney.get_or_create(session, hand.tourNo, tour_type.id) |
||||
cols = tour.get_columns_names() |
||||
for col in cols: |
||||
hand_val = getattr(hand, col, None) |
||||
if col in ('id', 'tourneyTypeId', 'comment', 'commentTs') or hand_val is None: |
||||
continue |
||||
db_val = getattr(tour, col, None) |
||||
if db_val is None: |
||||
setattr(tour, col, hand_val) |
||||
elif col == 'koBounty': |
||||
setattr(tour, col, max(db_val, hand_val)) |
||||
elif col == 'tourStartTime' and hand.startTime: |
||||
setattr(tour, col, min(db_val, hand.startTime)) |
||||
|
||||
if tour.entries is None and tour_type.sng: |
||||
tour.entries = tour_type.maxSeats |
||||
|
||||
# fetch and update tourney players |
||||
for hp in self.handPlayers: |
||||
tp = TourneysPlayer.get_or_create(session, tour.id, hp.playerId) |
||||
# FIXME: other TourneysPlayers should be added here |
||||
|
||||
session.flush() |
||||
|
||||
def isDuplicate(self, session): |
||||
"""Checks if current hand already exists in db |
||||
|
||||
siteHandNo ans gametypeId have to be setted |
||||
""" |
||||
return session.query(HandInternal).filter_by( |
||||
siteHandNo=self.siteHandNo, gametypeId=self.gametypeId).count()!=0 |
||||
|
||||
def __str__(self): |
||||
s = list() |
||||
for i in self._sa_class_manager.mapper.c: |
||||
s.append('%25s %s' % (i, getattr(self, i.name))) |
||||
|
||||
s+=['', ''] |
||||
for i,p in enumerate(self.handPlayers): |
||||
s.append('%d. %s' % (i, p.name or '???')) |
||||
s.append(str(p)) |
||||
return '\n'.join(s) |
||||
|
||||
@property |
||||
def boardcards(self): |
||||
cards = [] |
||||
for i in range(5): |
||||
cards.append(getattr(self, 'boardcard%d' % (i+1), None)) |
||||
return filter(bool, cards) |
||||
|
||||
@property |
||||
def HandClass(self): |
||||
"""Return HoldemOmahaHand or something like this""" |
||||
import Hand |
||||
if self.gametype.base == 'hold': |
||||
return Hand.HoldemOmahaHand |
||||
elif self.gametype.base == 'draw': |
||||
return Hand.DrawHand |
||||
elif self.gametype.base == 'stud': |
||||
return Hand.StudHand |
||||
raise Exception("Unknow gametype.base: '%s'" % self.gametype.base) |
||||
|
||||
@property |
||||
def allStreets(self): |
||||
return self.HandClass.allStreets |
||||
|
||||
@property |
||||
def actionStreets(self): |
||||
return self.HandClass.actionStreets |
||||
|
||||
|
||||
|
||||
class HandPlayer(MappedBase): |
||||
"""Class reflecting HandsPlayers db table""" |
||||
def __init__(self, **kwargs): |
||||
if 'imported_hand' in kwargs and 'seatNo' in kwargs: |
||||
imported_hand = kwargs.pop('imported_hand') |
||||
self.position = self.getPosition(imported_hand, kwargs['seatNo']) |
||||
super(HandPlayer, self).__init__(**kwargs) |
||||
|
||||
@reconstructor |
||||
def init_on_load(self): |
||||
self.name = self.player.name |
||||
|
||||
@staticmethod |
||||
def getPosition(hand, seat): |
||||
"""Returns position value like 'B', 'S', '0', '1', ... |
||||
|
||||
>>> class A(object): pass |
||||
... |
||||
>>> A.noSb = False |
||||
>>> A.maxseats = 6 |
||||
>>> A.buttonpos = 2 |
||||
>>> A.gametype = {'base': 'hold'} |
||||
>>> A.players = [(i, None, None) for i in (2, 4, 5, 6)] |
||||
>>> HandPlayer.getPosition(A, 6) # cut off |
||||
'1' |
||||
>>> HandPlayer.getPosition(A, 2) # button |
||||
'0' |
||||
>>> HandPlayer.getPosition(A, 4) # SB |
||||
'S' |
||||
>>> HandPlayer.getPosition(A, 5) # BB |
||||
'B' |
||||
>>> A.noSb = True |
||||
>>> HandPlayer.getPosition(A, 5) # MP3 |
||||
'2' |
||||
>>> HandPlayer.getPosition(A, 6) # cut off |
||||
'1' |
||||
>>> HandPlayer.getPosition(A, 2) # button |
||||
'0' |
||||
>>> HandPlayer.getPosition(A, 4) # BB |
||||
'B' |
||||
""" |
||||
from itertools import chain |
||||
if hand.gametype['base'] == 'stud': |
||||
# FIXME: i've never played stud so plz check & del comment \\grindi |
||||
bringin = None |
||||
for action in chain(*[self.actions[street] for street in hand.allStreets]): |
||||
if action[1]=='bringin': |
||||
bringin = action[0] |
||||
break |
||||
if bringin is None: |
||||
raise Exception, "Cannot find bringin" |
||||
# name -> seat |
||||
bringin = int(filter(lambda p: p[1]==bringin, bringin)[0]) |
||||
seat = (int(seat) - int(bringin))%int(hand.maxseats) |
||||
return str(seat) |
||||
else: |
||||
seats_occupied = sorted([seat_ for seat_, name, chips in hand.players], key=int) |
||||
if hand.buttonpos not in seats_occupied: |
||||
# i.e. something like |
||||
# Seat 3: PlayerX ($0), is sitting out |
||||
# The button is in seat #3 |
||||
hand.buttonpos = max(seats_occupied, |
||||
key = lambda s: int(s) |
||||
if int(s) <= int(hand.buttonpos) |
||||
else int(s) - int(hand.maxseats) |
||||
) |
||||
seats_occupied = sorted(seats_occupied, |
||||
key = lambda seat_: ( |
||||
- seats_occupied.index(seat_) |
||||
+ seats_occupied.index(hand.buttonpos) |
||||
+ 2) % len(seats_occupied) |
||||
) |
||||
# now (if SB presents) seats_occupied contains seats in order: BB, SB, BU, CO, MP3, ... |
||||
if hand.noSb: |
||||
# fix order in the case nosb |
||||
seats_occupied = seats_occupied[1:] + seats_occupied[0:1] |
||||
seats_occupied.insert(1, -1) |
||||
seat = seats_occupied.index(seat) |
||||
if seat == 0: |
||||
return 'B' |
||||
elif seat == 1: |
||||
return 'S' |
||||
else: |
||||
return str(seat-2) |
||||
|
||||
@property |
||||
def cards(self): |
||||
cards = [] |
||||
for i in range(7): |
||||
cards.append(getattr(self, 'card%d' % (i+1), None)) |
||||
return filter(bool, cards) |
||||
|
||||
def __str__(self): |
||||
s = list() |
||||
for i in self._sa_class_manager.mapper.c: |
||||
s.append('%45s %s' % (i, getattr(self, i.name))) |
||||
return '\n'.join(s) |
||||
|
||||
|
||||
class Site(object): |
||||
"""Class reflecting Players db table""" |
||||
INITIAL_DATA = [ |
||||
(1 , 'Full Tilt Poker','FT'), |
||||
(2 , 'PokerStars', 'PS'), |
||||
(3 , 'Everleaf', 'EV'), |
||||
(4 , 'Win2day', 'W2'), |
||||
(5 , 'OnGame', 'OG'), |
||||
(6 , 'UltimateBet', 'UB'), |
||||
(7 , 'Betfair', 'BF'), |
||||
(8 , 'Absolute', 'AB'), |
||||
(9 , 'PartyPoker', 'PP'), |
||||
(10, 'Partouche', 'PA'), |
||||
(11, 'Carbon', 'CA'), |
||||
(12, 'PKR', 'PK'), |
||||
(13, 'PacificPoker', 'P8'), |
||||
] |
||||
INITIAL_DATA_KEYS = ('id', 'name', 'code') |
||||
|
||||
INITIAL_DATA_DICTS = [ dict(zip(INITIAL_DATA_KEYS, datum)) for datum in INITIAL_DATA ] |
||||
|
||||
@classmethod |
||||
def insert_initial(cls, connection): |
||||
connection.execute(sites_table.insert(), cls.INITIAL_DATA_DICTS) |
||||
|
||||
|
||||
class Tourney(MappedBase): |
||||
"""Class reflecting Tourneys db table""" |
||||
|
||||
@classmethod |
||||
def get_or_create(cls, session, siteTourneyNo, tourneyTypeId): |
||||
"""Fetch tourney by index or creates one if none. """ |
||||
return get_or_create(cls, session, siteTourneyNo=siteTourneyNo, |
||||
tourneyTypeId=tourneyTypeId)[0] |
||||
|
||||
|
||||
|
||||
class TourneyType(MappedBase): |
||||
"""Class reflecting TourneyType db table""" |
||||
|
||||
@classmethod |
||||
def get_or_create(cls, session, **kwargs): |
||||
"""Fetch tourney type by index or creates one if none |
||||
|
||||
Required kwargs: |
||||
buyin fee speed maxSeats knockout |
||||
rebuy addOn shootout matrix sng currency |
||||
""" |
||||
return get_or_create(cls, session, **kwargs)[0] |
||||
|
||||
|
||||
class TourneysPlayer(MappedBase): |
||||
"""Class reflecting TourneysPlayers db table""" |
||||
|
||||
@classmethod |
||||
def get_or_create(cls, session, tourneyId, playerId): |
||||
"""Fetch tourney player by index or creates one if none """ |
||||
return get_or_create(cls, session, tourneyId=tourneyId, playerId=playerId) |
||||
|
||||
|
||||
class Version(object): |
||||
"""Provides read/write access for version var""" |
||||
CURRENT_VERSION = 120 # db version for current release |
||||
# 119 - first alchemy version |
||||
# 120 - add m_factor |
||||
|
||||
conn = None |
||||
ver = None |
||||
def __init__(self, connection=None): |
||||
if self.__class__.conn is None: |
||||
self.__class__.conn = connection |
||||
|
||||
@classmethod |
||||
def is_wrong(cls): |
||||
return cls.get() != cls.CURRENT_VERSION |
||||
|
||||
@classmethod |
||||
def get(cls): |
||||
if cls.ver is None: |
||||
try: |
||||
cls.ver = cls.conn.execute(select(['version'], settings_table)).fetchone()[0] |
||||
except: |
||||
return None |
||||
return cls.ver |
||||
|
||||
@classmethod |
||||
def set(cls, value): |
||||
if cls.conn.execute(settings_table.select()).rowcount==0: |
||||
cls.conn.execute(settings_table.insert(), version=value) |
||||
else: |
||||
cls.conn.execute(settings_table.update().values(version=value)) |
||||
cls.ver = value |
||||
|
||||
@classmethod |
||||
def set_initial(cls): |
||||
cls.set(cls.CURRENT_VERSION) |
||||
|
||||
|
||||
mapper (Gametype, gametypes_table, properties={ |
||||
'hands': relation(HandInternal, backref='gametype'), |
||||
}) |
||||
mapper (Player, players_table, properties={ |
||||
'playerHands': relation(HandPlayer, backref='player'), |
||||
'playerTourney': relation(TourneysPlayer, backref='player'), |
||||
}) |
||||
mapper (Site, sites_table, properties={ |
||||
'gametypes': relation(Gametype, backref = 'site'), |
||||
'players': relation(Player, backref = 'site'), |
||||
'tourneyTypes': relation(TourneyType, backref = 'site'), |
||||
}) |
||||
mapper (HandActions, hands_actions_table, properties={}) |
||||
mapper (HandInternal, hands_table, properties={ |
||||
'handPlayers': relation(HandPlayer, backref='hand'), |
||||
'actions_all': relation(HandActions, backref='hand', uselist=False), |
||||
}) |
||||
mapper (HandPlayer, hands_players_table, properties={}) |
||||
|
||||
mapper (Tourney, tourneys_table) |
||||
mapper (TourneyType, tourney_types_table, properties={ |
||||
'tourneys': relation(Tourney, backref='type'), |
||||
}) |
||||
mapper (TourneysPlayer, tourneys_players_table) |
||||
|
||||
class LambdaKeyDict(defaultdict): |
||||
"""Operates like defaultdict but passes key argument to the factory function""" |
||||
def __missing__(key): |
||||
return self.default_factory(key) |
||||
|
@ -1,460 +0,0 @@
|
||||
#!/usr/bin/env python |
||||
# -*- coding: utf-8 -*- |
||||
|
||||
#Copyright 2009-2011 Grigorij Indigirkin |
||||
#This program is free software: you can redistribute it and/or modify |
||||
#it under the terms of the GNU Affero General Public License as published by |
||||
#the Free Software Foundation, version 3 of the License. |
||||
# |
||||
#This program is distributed in the hope that it will be useful, |
||||
#but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
#GNU General Public License for more details. |
||||
# |
||||
#You should have received a copy of the GNU Affero General Public License |
||||
#along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
#In the "official" distribution you can find the license in agpl-3.0.txt. |
||||
|
||||
"""@package AlchemyTables |
||||
Contains all sqlalchemy tables |
||||
""" |
||||
|
||||
#TODO: gettextify if file is used again |
||||
|
||||
from sqlalchemy import Table, Float, Column, Integer, String, MetaData, \ |
||||
ForeignKey, Boolean, SmallInteger, DateTime, Text, Index, CHAR, \ |
||||
PickleType, Unicode |
||||
|
||||
from AlchemyFacilities import CardColumn, MoneyColumn, BigIntColumn |
||||
|
||||
|
||||
metadata = MetaData() |
||||
|
||||
|
||||
autorates_table = Table('Autorates', metadata, |
||||
Column('id', Integer, primary_key=True, nullable=False), |
||||
Column('playerId', Integer, ForeignKey("Players.id"), nullable=False), |
||||
Column('gametypeId', SmallInteger, ForeignKey("Gametypes.id"), nullable=False), |
||||
Column('description', String(50), nullable=False), |
||||
Column('shortDesc', CHAR(8), nullable=False), |
||||
Column('ratingTime', DateTime, nullable=False), |
||||
Column('handCount', Integer, nullable=False), |
||||
mysql_charset='utf8', |
||||
mysql_engine='InnoDB', |
||||
) |
||||
|
||||
|
||||
gametypes_table = Table('Gametypes', metadata, |
||||
Column('id', SmallInteger, primary_key=True), |
||||
Column('siteId', SmallInteger, ForeignKey("Sites.id"), nullable=False), # SMALLINT |
||||
Column('currency', String(4), nullable=False), # varchar(4) NOT NULL |
||||
Column('type', String(4), nullable=False), # char(4) NOT NULL |
||||
Column('base', String(4), nullable=False), # char(4) NOT NULL |
||||
Column('category', String(9), nullable=False), # varchar(9) NOT NULL |
||||
Column('limitType', CHAR(2), nullable=False), # char(2) NOT NULL |
||||
Column('hiLo', CHAR(1), nullable=False), # char(1) NOT NULL |
||||
Column('smallBlind', Integer(3)), # int |
||||
Column('bigBlind', Integer(3)), # int |
||||
Column('smallBet', Integer(3), nullable=False), # int NOT NULL |
||||
Column('bigBet', Integer(3), nullable=False), # int NOT NULL |
||||
mysql_charset='utf8', |
||||
mysql_engine='InnoDB', |
||||
) |
||||
|
||||
|
||||
hands_table = Table('Hands', metadata, |
||||
Column('id', BigIntColumn, primary_key=True), |
||||
Column('tableName', String(30), nullable=False), |
||||
Column('siteHandNo', BigIntColumn, nullable=False), |
||||
Column('gametypeId', SmallInteger, ForeignKey('Gametypes.id'), nullable=False), |
||||
Column('startTime', DateTime, nullable=False), |
||||
Column('importTime', DateTime, nullable=False), |
||||
Column('seats', SmallInteger, nullable=False), |
||||
Column('maxSeats', SmallInteger, nullable=False), |
||||
|
||||
Column('boardcard1', CardColumn), |
||||
Column('boardcard2', CardColumn), |
||||
Column('boardcard3', CardColumn), |
||||
Column('boardcard4', CardColumn), |
||||
Column('boardcard5', CardColumn), |
||||
Column('texture', SmallInteger), |
||||
Column('playersVpi', SmallInteger, nullable=False), |
||||
Column('playersAtStreet1', SmallInteger, nullable=False, default=0), |
||||
Column('playersAtStreet2', SmallInteger, nullable=False, default=0), |
||||
Column('playersAtStreet3', SmallInteger, nullable=False, default=0), |
||||
Column('playersAtStreet4', SmallInteger, nullable=False, default=0), |
||||
Column('playersAtShowdown',SmallInteger, nullable=False), |
||||
Column('street0Raises', SmallInteger, nullable=False), |
||||
Column('street1Raises', SmallInteger, nullable=False), |
||||
Column('street2Raises', SmallInteger, nullable=False), |
||||
Column('street3Raises', SmallInteger, nullable=False), |
||||
Column('street4Raises', SmallInteger, nullable=False), |
||||
Column('street1Pot', MoneyColumn), |
||||
Column('street2Pot', MoneyColumn), |
||||
Column('street3Pot', MoneyColumn), |
||||
Column('street4Pot', MoneyColumn), |
||||
Column('showdownPot', MoneyColumn), |
||||
Column('comment', Text), |
||||
Column('commentTs', DateTime), |
||||
mysql_charset='utf8', |
||||
mysql_engine='InnoDB', |
||||
) |
||||
Index('siteHandNo', hands_table.c.siteHandNo, hands_table.c.gametypeId, unique=True) |
||||
|
||||
|
||||
hands_actions_table = Table('HandsActions', metadata, |
||||
Column('id', BigIntColumn, primary_key=True, nullable=False), |
||||
Column('handId', BigIntColumn, ForeignKey("Hands.id"), nullable=False), |
||||
Column('actions', PickleType, nullable=False), |
||||
mysql_charset='utf8', |
||||
mysql_engine='InnoDB', |
||||
) |
||||
|
||||
|
||||
hands_players_table = Table('HandsPlayers', metadata, |
||||
Column('id', BigIntColumn, primary_key=True), |
||||
Column('handId', BigIntColumn, ForeignKey("Hands.id"), nullable=False), |
||||
Column('playerId', Integer, ForeignKey("Players.id"), nullable=False), |
||||
Column('startCash', MoneyColumn), |
||||
Column('position', CHAR(1)), #CHAR(1) |
||||
Column('seatNo', SmallInteger, nullable=False), #SMALLINT NOT NULL |
||||
|
||||
Column('card1', CardColumn), #smallint NOT NULL, |
||||
Column('card2', CardColumn), #smallint NOT NULL |
||||
Column('card3', CardColumn), #smallint |
||||
Column('card4', CardColumn), #smallint |
||||
Column('card5', CardColumn), #smallint |
||||
Column('card6', CardColumn), #smallint |
||||
Column('card7', CardColumn), #smallint |
||||
Column('startCards', SmallInteger), #smallint |
||||
|
||||
Column('m_factor', Integer), # null for ring games |
||||
Column('ante', MoneyColumn), #INT |
||||
Column('winnings', MoneyColumn, nullable=False, default=0), #int NOT NULL |
||||
Column('rake', MoneyColumn, nullable=False, default=0), #int NOT NULL |
||||
Column('totalProfit', MoneyColumn), #INT |
||||
Column('comment', Text), #text |
||||
Column('commentTs', DateTime), #DATETIME |
||||
Column('tourneysPlayersId', BigIntColumn, ForeignKey("TourneysPlayers.id"),), #BIGINT UNSIGNED |
||||
Column('tourneyTypeId', Integer, ForeignKey("TourneyTypes.id"),), #SMALLINT UNSIGNED |
||||
|
||||
Column('wonWhenSeenStreet1',Float), #FLOAT |
||||
Column('wonWhenSeenStreet2',Float), #FLOAT |
||||
Column('wonWhenSeenStreet3',Float), #FLOAT |
||||
Column('wonWhenSeenStreet4',Float), #FLOAT |
||||
Column('wonAtSD', Float), #FLOAT |
||||
|
||||
Column('street0VPI', Boolean), #BOOLEAN |
||||
Column('street0Aggr', Boolean), #BOOLEAN |
||||
Column('street0_3BChance', Boolean), #BOOLEAN |
||||
Column('street0_3BDone', Boolean), #BOOLEAN |
||||
Column('street0_4BChance', Boolean), #BOOLEAN |
||||
Column('street0_4BDone', Boolean), #BOOLEAN |
||||
Column('other3BStreet0', Boolean), #BOOLEAN |
||||
Column('other4BStreet0', Boolean), #BOOLEAN |
||||
|
||||
Column('street1Seen', Boolean), #BOOLEAN |
||||
Column('street2Seen', Boolean), #BOOLEAN |
||||
Column('street3Seen', Boolean), #BOOLEAN |
||||
Column('street4Seen', Boolean), #BOOLEAN |
||||
Column('sawShowdown', Boolean), #BOOLEAN |
||||
|
||||
Column('street1Aggr', Boolean), #BOOLEAN |
||||
Column('street2Aggr', Boolean), #BOOLEAN |
||||
Column('street3Aggr', Boolean), #BOOLEAN |
||||
Column('street4Aggr', Boolean), #BOOLEAN |
||||
|
||||
Column('otherRaisedStreet0',Boolean), #BOOLEAN |
||||
Column('otherRaisedStreet1',Boolean), #BOOLEAN |
||||
Column('otherRaisedStreet2',Boolean), #BOOLEAN |
||||
Column('otherRaisedStreet3',Boolean), #BOOLEAN |
||||
Column('otherRaisedStreet4',Boolean), #BOOLEAN |
||||
Column('foldToOtherRaisedStreet0', Boolean), #BOOLEAN |
||||
Column('foldToOtherRaisedStreet1', Boolean), #BOOLEAN |
||||
Column('foldToOtherRaisedStreet2', Boolean), #BOOLEAN |
||||
Column('foldToOtherRaisedStreet3', Boolean), #BOOLEAN |
||||
Column('foldToOtherRaisedStreet4', Boolean), #BOOLEAN |
||||
|
||||
Column('stealAttemptChance', Boolean), #BOOLEAN |
||||
Column('stealAttempted', Boolean), #BOOLEAN |
||||
Column('foldBbToStealChance', Boolean), #BOOLEAN |
||||
Column('foldedBbToSteal', Boolean), #BOOLEAN |
||||
Column('foldSbToStealChance', Boolean), #BOOLEAN |
||||
Column('foldedSbToSteal', Boolean), #BOOLEAN |
||||
|
||||
Column('street1CBChance', Boolean), #BOOLEAN |
||||
Column('street1CBDone', Boolean), #BOOLEAN |
||||
Column('street2CBChance', Boolean), #BOOLEAN |
||||
Column('street2CBDone', Boolean), #BOOLEAN |
||||
Column('street3CBChance', Boolean), #BOOLEAN |
||||
Column('street3CBDone', Boolean), #BOOLEAN |
||||
Column('street4CBChance', Boolean), #BOOLEAN |
||||
Column('street4CBDone', Boolean), #BOOLEAN |
||||
|
||||
Column('foldToStreet1CBChance', Boolean), #BOOLEAN |
||||
Column('foldToStreet1CBDone', Boolean), #BOOLEAN |
||||
Column('foldToStreet2CBChance', Boolean), #BOOLEAN |
||||
Column('foldToStreet2CBDone', Boolean), #BOOLEAN |
||||
Column('foldToStreet3CBChance', Boolean), #BOOLEAN |
||||
Column('foldToStreet3CBDone', Boolean), #BOOLEAN |
||||
Column('foldToStreet4CBChance', Boolean), #BOOLEAN |
||||
Column('foldToStreet4CBDone', Boolean), #BOOLEAN |
||||
|
||||
Column('street1CheckCallRaiseChance',Boolean), #BOOLEAN |
||||
Column('street1CheckCallRaiseDone', Boolean), #BOOLEAN |
||||
Column('street2CheckCallRaiseChance',Boolean), #BOOLEAN |
||||
Column('street2CheckCallRaiseDone', Boolean), #BOOLEAN |
||||
Column('street3CheckCallRaiseChance',Boolean), #BOOLEAN |
||||
Column('street3CheckCallRaiseDone', Boolean), #BOOLEAN |
||||
Column('street4CheckCallRaiseChance',Boolean), #BOOLEAN |
||||
Column('street4CheckCallRaiseDone', Boolean), #BOOLEAN |
||||
|
||||
Column('street0Calls', SmallInteger), #TINYINT |
||||
Column('street1Calls', SmallInteger), #TINYINT |
||||
Column('street2Calls', SmallInteger), #TINYINT |
||||
Column('street3Calls', SmallInteger), #TINYINT |
||||
Column('street4Calls', SmallInteger), #TINYINT |
||||
Column('street0Bets', SmallInteger), #TINYINT |
||||
Column('street1Bets', SmallInteger), #TINYINT |
||||
Column('street2Bets', SmallInteger), #TINYINT |
||||
Column('street3Bets', SmallInteger), #TINYINT |
||||
Column('street4Bets', SmallInteger), #TINYINT |
||||
Column('street0Raises', SmallInteger), #TINYINT |
||||
Column('street1Raises', SmallInteger), #TINYINT |
||||
Column('street2Raises', SmallInteger), #TINYINT |
||||
Column('street3Raises', SmallInteger), #TINYINT |
||||
Column('street4Raises', SmallInteger), #TINYINT |
||||
|
||||
Column('actionString', String(15)), #VARCHAR(15) |
||||
mysql_charset='utf8', |
||||
mysql_engine='InnoDB', |
||||
) |
||||
|
||||
|
||||
hud_cache_table = Table('HudCache', metadata, |
||||
Column('id', BigIntColumn, primary_key=True), |
||||
Column('gametypeId', SmallInteger, ForeignKey("Gametypes.id"), nullable=False), # SMALLINT |
||||
Column('playerId', Integer, ForeignKey("Players.id"), nullable=False), # SMALLINT |
||||
Column('activeSeats', SmallInteger, nullable=False), # SMALLINT NOT NULL |
||||
Column('position', CHAR(1)), # CHAR(1) |
||||
Column('tourneyTypeId', Integer, ForeignKey("TourneyTypes.id") ), # SMALLINT |
||||
Column('styleKey', CHAR(7), nullable=False), # CHAR(7) NOT NULL |
||||
Column('m_factor', Integer), |
||||
Column('HDs', Integer, nullable=False), # INT NOT NULL |
||||
|
||||
Column('wonWhenSeenStreet1', Float), # FLOAT |
||||
Column('wonWhenSeenStreet2', Float), # FLOAT |
||||
Column('wonWhenSeenStreet3', Float), # FLOAT |
||||
Column('wonWhenSeenStreet4', Float), # FLOAT |
||||
Column('wonAtSD', Float), # FLOAT |
||||
|
||||
Column('street0VPI', Integer), # INT |
||||
Column('street0Aggr', Integer), # INT |
||||
Column('street0_3BChance', Integer), # INT |
||||
Column('street0_3BDone', Integer), # INT |
||||
Column('street0_4BChance', Integer), # INT |
||||
Column('street0_4BDone', Integer), # INT |
||||
Column('other3BStreet0', Integer), # INT |
||||
Column('other4BStreet0', Integer), # INT |
||||
|
||||
Column('street1Seen', Integer), # INT |
||||
Column('street2Seen', Integer), # INT |
||||
Column('street3Seen', Integer), # INT |
||||
Column('street4Seen', Integer), # INT |
||||
Column('sawShowdown', Integer), # INT |
||||
|
||||
Column('street1Aggr', Integer), # INT |
||||
Column('street2Aggr', Integer), # INT |
||||
Column('street3Aggr', Integer), # INT |
||||
Column('street4Aggr', Integer), # INT |
||||
|
||||
Column('otherRaisedStreet0', Integer), # INT |
||||
Column('otherRaisedStreet1', Integer), # INT |
||||
Column('otherRaisedStreet2', Integer), # INT |
||||
Column('otherRaisedStreet3', Integer), # INT |
||||
Column('otherRaisedStreet4', Integer), # INT |
||||
Column('foldToOtherRaisedStreet0', Integer), # INT |
||||
Column('foldToOtherRaisedStreet1', Integer), # INT |
||||
Column('foldToOtherRaisedStreet2', Integer), # INT |
||||
Column('foldToOtherRaisedStreet3', Integer), # INT |
||||
Column('foldToOtherRaisedStreet4', Integer), # INT |
||||
|
||||
Column('stealAttemptChance', Integer), # INT |
||||
Column('stealAttempted', Integer), # INT |
||||
Column('foldBbToStealChance', Integer), # INT |
||||
Column('foldedBbToSteal', Integer), # INT |
||||
Column('foldSbToStealChance', Integer), # INT |
||||
Column('foldedSbToSteal', Integer), # INT |
||||
|
||||
Column('street1CBChance', Integer), # INT |
||||
Column('street1CBDone', Integer), # INT |
||||
Column('street2CBChance', Integer), # INT |
||||
Column('street2CBDone', Integer), # INT |
||||
Column('street3CBChance', Integer), # INT |
||||
Column('street3CBDone', Integer), # INT |
||||
Column('street4CBChance', Integer), # INT |
||||
Column('street4CBDone', Integer), # INT |
||||
|
||||
Column('foldToStreet1CBChance', Integer), # INT |
||||
Column('foldToStreet1CBDone', Integer), # INT |
||||
Column('foldToStreet2CBChance', Integer), # INT |
||||
Column('foldToStreet2CBDone', Integer), # INT |
||||
Column('foldToStreet3CBChance', Integer), # INT |
||||
Column('foldToStreet3CBDone', Integer), # INT |
||||
Column('foldToStreet4CBChance', Integer), # INT |
||||
Column('foldToStreet4CBDone', Integer), # INT |
||||
|
||||
Column('totalProfit', Integer), # INT |
||||
|
||||
Column('street1CheckCallRaiseChance', Integer), # INT |
||||
Column('street1CheckCallRaiseDone', Integer), # INT |
||||
Column('street2CheckCallRaiseChance', Integer), # INT |
||||
Column('street2CheckCallRaiseDone', Integer), # INT |
||||
Column('street3CheckCallRaiseChance', Integer), # INT |
||||
Column('street3CheckCallRaiseDone', Integer), # INT |
||||
Column('street4CheckCallRaiseChance', Integer), # INT |
||||
Column('street4CheckCallRaiseDone', Integer), # INT |
||||
|
||||
Column('street0Calls', Integer), # INT |
||||
Column('street1Calls', Integer), # INT |
||||
Column('street2Calls', Integer), # INT |
||||
Column('street3Calls', Integer), # INT |
||||
Column('street4Calls', Integer), # INT |
||||
Column('street0Bets', Integer), # INT |
||||
Column('street1Bets', Integer), # INT |
||||
Column('street2Bets', Integer), # INT |
||||
Column('street3Bets', Integer), # INT |
||||
Column('street4Bets', Integer), # INT |
||||
Column('street0Raises', Integer), # INT |
||||
Column('street1Raises', Integer), # INT |
||||
Column('street2Raises', Integer), # INT |
||||
Column('street3Raises', Integer), # INT |
||||
Column('street4Raises', Integer), # INT |
||||
mysql_charset='utf8', |
||||
mysql_engine='InnoDB', |
||||
) |
||||
|
||||
|
||||
players_table = Table('Players', metadata, |
||||
Column('id', Integer, primary_key=True), |
||||
Column('name', Unicode(32), nullable=False), # VARCHAR(32) CHARACTER SET utf8 NOT NULL |
||||
Column('siteId', SmallInteger, ForeignKey("Sites.id"), nullable=False), # SMALLINT |
||||
Column('comment', Text), # text |
||||
Column('commentTs', DateTime), # DATETIME |
||||
mysql_charset='utf8', |
||||
mysql_engine='InnoDB', |
||||
) |
||||
Index('name', players_table.c.name, players_table.c.siteId, unique=True) |
||||
|
||||
|
||||
settings_table = Table('Settings', metadata, |
||||
Column('version', SmallInteger, nullable=False), |
||||
mysql_charset='utf8', |
||||
mysql_engine='InnoDB', |
||||
) |
||||
|
||||
|
||||
sites_table = Table('Sites', metadata, |
||||
Column('id', SmallInteger, primary_key=True), |
||||
Column('name', String(32), nullable=False), # varchar(32) NOT NULL |
||||
Column('code', String(2), nullable=False), # char(2) NOT NULL |
||||
mysql_charset='utf8', |
||||
mysql_engine='InnoDB', |
||||
) |
||||
|
||||
|
||||
tourneys_table = Table('Tourneys', metadata, |
||||
Column('id', Integer, primary_key=True), |
||||
Column('tourneyTypeId', Integer, ForeignKey("TourneyTypes.id"), nullable=False, default=1), |
||||
Column('siteTourneyNo', BigIntColumn, nullable=False), # BIGINT NOT NULL |
||||
Column('entries', Integer), # INT NOT NULL |
||||
Column('prizepool', Integer), # INT NOT NULL |
||||
Column('tourStartTime', DateTime), # DATETIME NOT NULL |
||||
Column('tourEndTime', DateTime), # DATETIME |
||||
Column('tourneyName', String(40)), # varchar(40) |
||||
# Mask use : 1=Positionnal Winnings|2=Match1|4=Match2|...|pow(2,n)=Matchn |
||||
Column('matrixIdProcessed',SmallInteger, default=0), # TINYINT UNSIGNED DEFAULT 0 |
||||
Column('totalRebuyCount', Integer, default=0), # INT DEFAULT 0 |
||||
Column('totalAddOnCount', Integer, default=0), # INT DEFAULT 0 |
||||
Column('comment', Text), # TEXT |
||||
Column('commentTs', DateTime), # DATETIME |
||||
mysql_charset='utf8', |
||||
mysql_engine='InnoDB', |
||||
) |
||||
Index('siteTourneyNo', tourneys_table.c.siteTourneyNo, tourneys_table.c.tourneyTypeId, unique=True) |
||||
|
||||
|
||||
tourney_types_table = Table('TourneyTypes', metadata, |
||||
Column('id', Integer, primary_key=True), |
||||
Column('siteId', SmallInteger, ForeignKey("Sites.id"), nullable=False), |
||||
Column('currency', String(4), nullable=False), # varchar(4) NOT NULL |
||||
Column('buyin', Integer, nullable=False), # INT NOT NULL |
||||
Column('fee', Integer, nullable=False), # INT NOT NULL |
||||
Column('buyInChips', Integer, nullable=False), # INT NOT NULL |
||||
Column('maxSeats', Boolean, nullable=False, default=-1), # INT NOT NULL DEFAULT -1 |
||||
Column('rebuy', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False |
||||
Column('rebuyCost', Integer), # INT |
||||
Column('rebuyChips', Integer), # INT |
||||
Column('addOn', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False |
||||
Column('addOnCost', Integer), # INT |
||||
Column('addOnChips', Integer), # INT |
||||
Column('knockout', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False |
||||
Column('koBounty', Integer), # INT |
||||
Column('speed', String(10)), # varchar(10) |
||||
Column('shootout', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False |
||||
Column('matrix', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False |
||||
Column('sng', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False |
||||
Column('satellite', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False |
||||
Column('doubleOrNothing', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False |
||||
Column('guarantee', Integer, nullable=False, default=0), # INT NOT NULL DEFAULT 0 |
||||
mysql_charset='utf8', |
||||
mysql_engine='InnoDB', |
||||
) |
||||
Index('tourneyTypes_all', |
||||
tourney_types_table.c.siteId, tourney_types_table.c.buyin, tourney_types_table.c.fee, |
||||
tourney_types_table.c.maxSeats, tourney_types_table.c.knockout, tourney_types_table.c.rebuy, |
||||
tourney_types_table.c.addOn, tourney_types_table.c.speed, |
||||
tourney_types_table.c.shootout, tourney_types_table.c.matrix, tourney_types_table.c.sng) |
||||
|
||||
|
||||
tourneys_players_table = Table('TourneysPlayers', metadata, |
||||
Column('id', BigIntColumn, primary_key=True), |
||||
Column('tourneyId', Integer, ForeignKey("Tourneys.id"), nullable=False), |
||||
Column('playerId', Integer, ForeignKey("Players.id"), nullable=False), |
||||
Column('rank', Integer), # INT NOT NULL |
||||
Column('winnings', Integer), # INT NOT NULL |
||||
Column('winningsCurrency', Text), # TEXT |
||||
Column('rebuyCount', Integer, default=0), # INT DEFAULT 0 |
||||
Column('addOnCount', Integer, default=0), # INT DEFAULT 0 |
||||
Column('koCount', Integer, default=0), # INT DEFAULT 0 |
||||
Column('comment', Text), # TEXT |
||||
Column('commentTs', DateTime), # DATETIME |
||||
mysql_charset='utf8', |
||||
mysql_engine='InnoDB', |
||||
) |
||||
Index('tourneyId', tourneys_players_table.c.tourneyId, tourneys_players_table.c.playerId, unique=True) |
||||
|
||||
|
||||
def sss(): |
||||
"Debug function. Returns (config, sql, db)" |
||||
|
||||
import Configuration, SQL, Database, os |
||||
class Dummy(object): |
||||
pass |
||||
self = Dummy() |
||||
self.config = Configuration.Config() |
||||
self.settings = {} |
||||
if (os.sep=="/"): |
||||
self.settings['os']="linuxmac" |
||||
else: |
||||
self.settings['os']="windows" |
||||
|
||||
self.settings.update(self.config.get_db_parameters()) |
||||
self.settings.update(self.config.get_import_parameters()) |
||||
self.settings.update(self.config.get_default_paths()) |
||||
|
||||
self.sql = SQL.Sql( db_server = self.settings['db-server']) |
||||
self.db = Database.Database(self.config, sql = self.sql) |
||||
|
||||
return self.config, self.sql, self.db |
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,48 @@
|
||||
Partouche Poker Gibraltar |
||||
*** Historique des Mains pour la partie 25324991 *** |
||||
Blinds €0.01/ €0.02 NL Hold'em - 2009/10/27 - 19:04:57 |
||||
Table Andernos 2 |
||||
Seat 1 is the button |
||||
Total number of players: 6 |
||||
Seat 1: player1 ( € 0.76 EUR ) |
||||
Seat 2: player2 ( € 1.83 EUR ) |
||||
Seat 3: player3 ( € 0.81 EUR ) |
||||
Seat 4: player4 ( € 2 EUR ) |
||||
Seat 5: player5 ( € 1.39 EUR ) |
||||
Seat 6: player6 ( new player ) |
||||
player2: posts small blind [ € 0.01 EUR] |
||||
player3: posts big blind [ € 0.02 EUR] |
||||
player4: posts big blind [ € 0.02 EUR] |
||||
** Dealing down cards ** |
||||
Dealt to player4 [ 5s, 4s ] |
||||
player4 checks |
||||
player5 raises [ € 0.04 EUR] |
||||
player1 folds |
||||
player2 calls [ € 0.03 EUR] |
||||
player3 est déconnecté et dispose de 20 secondes supplémentaires pour agir |
||||
player3 calls [ € 0.02 EUR] |
||||
player4 calls [ € 0.02 EUR] |
||||
** Dealing Flop ** [ Qs, 8s, 7c ] |
||||
player3 est déconnecté et dispose de 20 secondes supplémentaires pour agir |
||||
player2 checks |
||||
player3 est déconnecté et dispose de 20 secondes supplémentaires pour agir |
||||
player3 checks |
||||
player4: bets [ € 0.08 EUR] |
||||
player5 raises [ € 0.16 EUR] |
||||
player2 folds |
||||
player3 calls [ € 0.16 EUR] |
||||
player4 calls [ € 0.08 EUR] |
||||
** Dealing Turn ** [ Th ] |
||||
player3 checks |
||||
player4 checks |
||||
player5: bets [ € 0.64 EUR] |
||||
player3 folds |
||||
player4 calls [ € 0.64 EUR] |
||||
** Dealing River ** [ Tc ] |
||||
player4: bets [ € 1.16 EUR] |
||||
player5 calls [ € 0.55 EUR] |
||||
player4 shows [ 5s, 4s ]a pair of tens |
||||
player5 shows [ Qh, Ad ]two pairs, queens and tens |
||||
player5 wins € 2.72 EUR from main pot with two pairs, queens and tens [ Ad, Qh, Qs, Th, Tc ] |
||||
|
||||
|
@ -0,0 +1,65 @@
|
||||
FullTiltPoker Game #27088270000: Table harrington25 (6 max) - $1,500/$3,000 - Limit 2-7 Triple Draw - 11:00:00 ET - 2011/01/08 |
||||
|
||||
Seat 1: Player1 ($103,461) |
||||
Seat 2: Player2 ($120,106) |
||||
Seat 4: Hero ($57,750) |
||||
Seat 6: Player6 ($46,497.50) |
||||
Player1 posts the small blind of $750 |
||||
Player2 posts the big blind of $1,500 |
||||
The button is in seat #6 |
||||
*** HOLE CARDS *** |
||||
Dealt to Hero [5s 3h 4c Qs 8d] |
||||
Hero raises to $3,000 |
||||
Player6 raises to $4,500 |
||||
Player1 folds |
||||
Player2 has 15 seconds left to act |
||||
Player2 raises to $6,000 |
||||
Hero calls $3,000 |
||||
Player6 calls $1,500 |
||||
*** FIRST DRAW *** |
||||
Player2 discards 1 card |
||||
Hero discards 1 card [Qs] |
||||
Player6 discards 2 cards |
||||
Player2 is dealt 1 card |
||||
Dealt to Hero [5s 3h 4c 8d] [2h] |
||||
Player6 is dealt 2 cards |
||||
Player2 checks |
||||
Hero bets $1,500 |
||||
Player6 raises to $3,000 |
||||
Player2 calls $3,000 |
||||
Hero raises to $4,500 |
||||
Player6 raises to $6,000 |
||||
Player2 calls $3,000 |
||||
Hero calls $1,500 |
||||
*** SECOND DRAW *** |
||||
Player2 discards 1 card |
||||
Hero stands pat on [5s 3h 4c 8d 2h] |
||||
Player6 has 15 seconds left to act |
||||
Player6 has requested TIME |
||||
Player6 stands pat |
||||
Player2 is dealt 1 card |
||||
Player2 checks |
||||
Hero checks |
||||
Player6 checks |
||||
*** THIRD DRAW *** |
||||
Player2 discards 1 card |
||||
Hero stands pat on [5s 3h 4c 8d 2h] |
||||
Player6 stands pat |
||||
Player2 is dealt 1 card |
||||
Player2 bets $3,000 |
||||
Hero calls $3,000 |
||||
Player6 folds |
||||
*** SHOW DOWN *** |
||||
Player2 shows [8s 6d 4s 3d 2c] 8,6,4,3,2 |
||||
Hero shows [8d 5s 4c 3h 2h] 8,5,4,3,2 |
||||
Hero wins the pot ($42,748) with 8,5,4,3,2 |
||||
*** SUMMARY *** |
||||
Duration 106s |
||||
Total pot $42,750 | Rake $2 |
||||
Seat 1: Player1 (small blind) folded before the draw |
||||
Seat 2: Player2 (big blind) showed [8s 6d 4s 3d 2c] and lost with 8,6,4,3,2 |
||||
Seat 4: Hero showed [8d 5s 4c 3h 2h] and won ($42,748) with 8,5,4,3,2 |
||||
Seat 6: Player6 (button) folded after the 3rd Draw |
||||
|
||||
|
||||
|
@ -0,0 +1,55 @@
|
||||
Full Tilt Poker Game #29408130000: Table XGod_Of_WarX - $2/$4 Ante $0.40 - Limit Stud H/L - 01:12:00 ET - 2011/03/28 |
||||
Seat 1: Player1 ($17.70) |
||||
Seat 2: Hero ($82.30) |
||||
Seat 3: Player3 ($81.70) |
||||
Seat 5: Player5 ($95.45) |
||||
Seat 6: Player6 ($43.60), is sitting out |
||||
Seat 7: Player7 ($435.15) |
||||
Seat 8: Player8 ($20.60) |
||||
Player5 antes $0.40 |
||||
Player7 antes $0.40 |
||||
Player1 antes $0.40 |
||||
Hero antes $0.40 |
||||
Player8 antes $0.40 |
||||
Player3 antes $0.40 |
||||
*** 3RD STREET *** |
||||
Dealt to Player1 [3c] |
||||
Dealt to Hero [5d Ah] [Ad] |
||||
Dealt to Player3 [7h] |
||||
Dealt to Player5 [4c] |
||||
Dealt to Player7 [8h] |
||||
Dealt to Player8 [5s] |
||||
Player1 is low with [3c] |
||||
Player1 brings in for $0.50 |
||||
Hero completes it to $2 |
||||
Player3 folds |
||||
Player5 calls $2 |
||||
Player7 folds |
||||
Player7 is sitting out |
||||
Player8 folds |
||||
Player1 folds |
||||
*** 4TH STREET *** |
||||
Dealt to Hero [5d Ah Ad] [6h] |
||||
Dealt to Player5 [4c] [7c] |
||||
Hero bets $2 |
||||
Player5 calls $2 |
||||
*** 5TH STREET *** |
||||
Dealt to Hero [5d Ah Ad 6h] [5c] |
||||
Dealt to Player5 [4c 7c] [Tc] |
||||
Hero bets $4 |
||||
Player5 folds |
||||
Uncalled bet of $4 returned to Hero |
||||
Hero mucks |
||||
Hero wins the pot ($10.90) |
||||
*** SUMMARY *** |
||||
Total pot $10.90 | Rake $0 |
||||
Seat 1: Player1 folded on 3rd St. |
||||
Seat 2: Hero collected ($10.90), mucked |
||||
Seat 3: Player3 folded on 3rd St. |
||||
Seat 5: Player5 folded on 5th St. |
||||
Seat 6: Player6 is sitting out |
||||
Seat 7: Player7 folded on 3rd St. |
||||
Seat 8: Player8 folded on 3rd St. |
||||
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue