Merge branch 'master' of git://git.assembla.com/fpdboz
This commit is contained in:
commit
df43e0e6b8
|
@ -1514,6 +1514,7 @@ class Database:
|
||||||
c.execute("INSERT INTO Sites (name,code) VALUES ('PKR', 'PK')")
|
c.execute("INSERT INTO Sites (name,code) VALUES ('PKR', 'PK')")
|
||||||
c.execute("INSERT INTO Sites (name,code) VALUES ('iPoker', 'IP')")
|
c.execute("INSERT INTO Sites (name,code) VALUES ('iPoker', 'IP')")
|
||||||
c.execute("INSERT INTO Sites (name,code) VALUES ('Winamax', 'WM')")
|
c.execute("INSERT INTO Sites (name,code) VALUES ('Winamax', 'WM')")
|
||||||
|
c.execute("INSERT INTO Sites (name,code) VALUES ('Everest', 'EP')")
|
||||||
#Fill Actions
|
#Fill Actions
|
||||||
c.execute("INSERT INTO Actions (name,code) VALUES ('ante', 'A')")
|
c.execute("INSERT INTO Actions (name,code) VALUES ('ante', 'A')")
|
||||||
c.execute("INSERT INTO Actions (name,code) VALUES ('small blind', 'SB')")
|
c.execute("INSERT INTO Actions (name,code) VALUES ('small blind', 'SB')")
|
||||||
|
|
|
@ -420,12 +420,15 @@ class Filters(threading.Thread):
|
||||||
self.limits[limit] = w.get_active()
|
self.limits[limit] = w.get_active()
|
||||||
log.debug(_("self.limit[%s] set to %s") %(limit, self.limits[limit]))
|
log.debug(_("self.limit[%s] set to %s") %(limit, self.limits[limit]))
|
||||||
if limit.isdigit() or (len(limit) > 2 and (limit[-2:] == 'nl' or limit[-2:] == 'fl' or limit[-2:] == 'pl')):
|
if limit.isdigit() or (len(limit) > 2 and (limit[-2:] == 'nl' or limit[-2:] == 'fl' or limit[-2:] == 'pl')):
|
||||||
|
# turning a leaf limit on with 'None' checked turns 'None' off
|
||||||
if self.limits[limit]:
|
if self.limits[limit]:
|
||||||
if self.cbNoLimits is not None:
|
if self.cbNoLimits is not None:
|
||||||
self.cbNoLimits.set_active(False)
|
self.cbNoLimits.set_active(False)
|
||||||
|
# turning a leaf limit off with 'All' checked turns 'All' off
|
||||||
else:
|
else:
|
||||||
if self.cbAllLimits is not None:
|
if self.cbAllLimits is not None:
|
||||||
self.cbAllLimits.set_active(False)
|
self.cbAllLimits.set_active(False)
|
||||||
|
# turning off a leaf limit turns off the corresponding fl. nl, or pl
|
||||||
if not self.limits[limit]:
|
if not self.limits[limit]:
|
||||||
if limit.isdigit():
|
if limit.isdigit():
|
||||||
if self.cbFL is not None:
|
if self.cbFL is not None:
|
||||||
|
@ -438,8 +441,10 @@ class Filters(threading.Thread):
|
||||||
self.cbPL.set_active(False)
|
self.cbPL.set_active(False)
|
||||||
elif limit == "all":
|
elif limit == "all":
|
||||||
if self.limits[limit]:
|
if self.limits[limit]:
|
||||||
#for cb in self.cbLimits.values():
|
if self.num_limit_types == 1:
|
||||||
# cb.set_active(True)
|
for cb in self.cbLimits.values():
|
||||||
|
cb.set_active(True)
|
||||||
|
else:
|
||||||
if self.cbFL is not None:
|
if self.cbFL is not None:
|
||||||
self.cbFL.set_active(True)
|
self.cbFL.set_active(True)
|
||||||
if self.cbNL is not None:
|
if self.cbNL is not None:
|
||||||
|
@ -448,8 +453,10 @@ class Filters(threading.Thread):
|
||||||
self.cbPL.set_active(True)
|
self.cbPL.set_active(True)
|
||||||
elif limit == "none":
|
elif limit == "none":
|
||||||
if self.limits[limit]:
|
if self.limits[limit]:
|
||||||
|
if self.num_limit_types == 1:
|
||||||
for cb in self.cbLimits.values():
|
for cb in self.cbLimits.values():
|
||||||
cb.set_active(False)
|
cb.set_active(False)
|
||||||
|
else:
|
||||||
if self.cbNL is not None:
|
if self.cbNL is not None:
|
||||||
self.cbNL.set_active(False)
|
self.cbNL.set_active(False)
|
||||||
if self.cbFL is not None:
|
if self.cbFL is not None:
|
||||||
|
@ -765,11 +772,11 @@ class Filters(threading.Thread):
|
||||||
|
|
||||||
dest = vbox3 # for ring/tour buttons
|
dest = vbox3 # for ring/tour buttons
|
||||||
if "LimitType" in display and display["LimitType"] == True:
|
if "LimitType" in display and display["LimitType"] == True:
|
||||||
num_limit_types = 0
|
self.num_limit_types = 0
|
||||||
if self.found['fl']: num_limit_types = num_limit_types + 1
|
if self.found['fl']: self.num_limit_types = self.num_limit_types + 1
|
||||||
if self.found['pl']: num_limit_types = num_limit_types + 1
|
if self.found['pl']: self.num_limit_types = self.num_limit_types + 1
|
||||||
if self.found['nl']: num_limit_types = num_limit_types + 1
|
if self.found['nl']: self.num_limit_types = self.num_limit_types + 1
|
||||||
if num_limit_types > 1:
|
if self.num_limit_types > 1:
|
||||||
if self.found['fl']:
|
if self.found['fl']:
|
||||||
hbox = gtk.HBox(False, 0)
|
hbox = gtk.HBox(False, 0)
|
||||||
vbox3.pack_start(hbox, False, False, 0)
|
vbox3.pack_start(hbox, False, False, 0)
|
||||||
|
|
|
@ -49,6 +49,7 @@ class Fulltilt(HandHistoryConverter):
|
||||||
'6.00': ('1.00', '3.00'), '6': ('1.00', '3.00'),
|
'6.00': ('1.00', '3.00'), '6': ('1.00', '3.00'),
|
||||||
'8.00': ('2.00', '4.00'), '8': ('2.00', '4.00'),
|
'8.00': ('2.00', '4.00'), '8': ('2.00', '4.00'),
|
||||||
'10.00': ('2.00', '5.00'), '10': ('2.00', '5.00'),
|
'10.00': ('2.00', '5.00'), '10': ('2.00', '5.00'),
|
||||||
|
'16.00': ('4.00', '8.00'), '16': ('4.00', '8.00'),
|
||||||
'20.00': ('5.00', '10.00'), '20': ('5.00', '10.00'),
|
'20.00': ('5.00', '10.00'), '20': ('5.00', '10.00'),
|
||||||
'30.00': ('10.00', '15.00'), '30': ('10.00', '15.00'),
|
'30.00': ('10.00', '15.00'), '30': ('10.00', '15.00'),
|
||||||
'40.00': ('10.00', '20.00'), '40': ('10.00', '20.00'),
|
'40.00': ('10.00', '20.00'), '40': ('10.00', '20.00'),
|
||||||
|
@ -88,7 +89,7 @@ class Fulltilt(HandHistoryConverter):
|
||||||
[%(LS)s]?(?P<CAP>[.0-9]+\sCap\s)?
|
[%(LS)s]?(?P<CAP>[.0-9]+\sCap\s)?
|
||||||
(?P<GAMETYPE>[-\da-zA-Z\/\'\s]+)\s-\s
|
(?P<GAMETYPE>[-\da-zA-Z\/\'\s]+)\s-\s
|
||||||
(?P<DATETIME>.*$)
|
(?P<DATETIME>.*$)
|
||||||
(?P<PARTIAL>\(partial\))?\n
|
(?P<PARTIAL>\(partial\))?\s
|
||||||
(?:.*?\n(?P<CANCELLED>Hand\s\#(?P=HID)\shas\sbeen\scanceled))?
|
(?:.*?\n(?P<CANCELLED>Hand\s\#(?P=HID)\shas\sbeen\scanceled))?
|
||||||
''' % substitutions, re.MULTILINE|re.VERBOSE)
|
''' % substitutions, re.MULTILINE|re.VERBOSE)
|
||||||
re_TourneyExtraInfo = re.compile('''(((?P<TOURNEY_NAME>[^$]+)?
|
re_TourneyExtraInfo = re.compile('''(((?P<TOURNEY_NAME>[^$]+)?
|
||||||
|
@ -147,7 +148,7 @@ class Fulltilt(HandHistoryConverter):
|
||||||
re_Mixed = re.compile(r'\s\-\s(?P<MIXED>HA|HORSE|HOSE)\s\-\s', re.VERBOSE)
|
re_Mixed = re.compile(r'\s\-\s(?P<MIXED>HA|HORSE|HOSE)\s\-\s', re.VERBOSE)
|
||||||
re_Max = re.compile("(?P<MAX>\d+)( max)?", re.MULTILINE)
|
re_Max = re.compile("(?P<MAX>\d+)( max)?", re.MULTILINE)
|
||||||
# NB: if we ever match "Full Tilt Poker" we should also match "FullTiltPoker", which PT Stud erroneously exports.
|
# NB: if we ever match "Full Tilt Poker" we should also match "FullTiltPoker", which PT Stud erroneously exports.
|
||||||
re_DateTime = re.compile("""((?P<H>[0-9]+):(?P<MIN>[0-9]+):(?P<S>[0-9]+)\s(?P<TZ>\w+)\s-\s(?P<Y>[0-9]{4})\/(?P<M>[0-9]{2})\/(?P<D>[0-9]{2})|(?P<H2>[0-9]+):(?P<MIN2>[0-9]+)\s(?P<TZ2>\w+)\s-\s\w+\,\s(?P<M2>\w+)\s(?P<D2>\d+)\,\s(?P<Y2>[0-9]{4}))""", re.MULTILINE)
|
re_DateTime = re.compile("""((?P<H>[0-9]+):(?P<MIN>[0-9]+):(?P<S>[0-9]+)\s(?P<TZ>\w+)\s-\s(?P<Y>[0-9]{4})\/(?P<M>[0-9]{2})\/(?P<D>[0-9]{2})|(?P<H2>[0-9]+):(?P<MIN2>[0-9]+)\s(?P<TZ2>\w+)\s-\s\w+\,\s(?P<M2>\w+)\s(?P<D2>\d+)\,\s(?P<Y2>[0-9]{4}))(?P<PARTIAL>\s\(partial\))?""", re.MULTILINE)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -283,10 +284,13 @@ class Fulltilt(HandHistoryConverter):
|
||||||
datetimestr = "%s/%s/%s %s:%s" % (a.group('Y2'), a.group('M2'),a.group('D2'),a.group('H2'),a.group('MIN2'))
|
datetimestr = "%s/%s/%s %s:%s" % (a.group('Y2'), a.group('M2'),a.group('D2'),a.group('H2'),a.group('MIN2'))
|
||||||
timezone = a.group('TZ2')
|
timezone = a.group('TZ2')
|
||||||
hand.startTime = datetime.datetime.strptime(datetimestr, "%Y/%B/%d %H:%M")
|
hand.startTime = datetime.datetime.strptime(datetimestr, "%Y/%B/%d %H:%M")
|
||||||
|
if a.group('PARTIAL'):
|
||||||
|
raise FpdbParseError(hid=m.group('HID'))
|
||||||
|
|
||||||
hand.startTime = HandHistoryConverter.changeTimezone(hand.startTime, timezone, "UTC")
|
hand.startTime = HandHistoryConverter.changeTimezone(hand.startTime, timezone, "UTC")
|
||||||
|
|
||||||
if m.group("CANCELLED") or m.group("PARTIAL"):
|
if m.group("CANCELLED") or m.group("PARTIAL"):
|
||||||
|
# It would appear this can't be triggered as DATETIME is a bit greedy
|
||||||
raise FpdbParseError(hid=m.group('HID'))
|
raise FpdbParseError(hid=m.group('HID'))
|
||||||
|
|
||||||
if m.group('TABLEATTRIBUTES'):
|
if m.group('TABLEATTRIBUTES'):
|
||||||
|
@ -351,7 +355,7 @@ class Fulltilt(HandHistoryConverter):
|
||||||
n = self.re_SummarySitout.finditer(post)
|
n = self.re_SummarySitout.finditer(post)
|
||||||
for b in n:
|
for b in n:
|
||||||
del plist[b.group('PNAME')]
|
del plist[b.group('PNAME')]
|
||||||
print "DEBUG: Deleting '%s' from player dict" %(b.group('PNAME'))
|
#print "DEBUG: Deleting '%s' from player dict" %(b.group('PNAME'))
|
||||||
|
|
||||||
# Add remaining players
|
# Add remaining players
|
||||||
for a in plist:
|
for a in plist:
|
||||||
|
|
|
@ -15,6 +15,9 @@
|
||||||
#along with this program. If not, see <http://www.gnu.org/licenses/>.
|
#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 "official" distribution you can find the license in agpl-3.0.txt.
|
||||||
|
|
||||||
|
import L10n
|
||||||
|
_ = L10n.get_translation()
|
||||||
|
|
||||||
import threading
|
import threading
|
||||||
import pygtk
|
import pygtk
|
||||||
pygtk.require('2.0')
|
pygtk.require('2.0')
|
||||||
|
@ -22,18 +25,6 @@ import gtk
|
||||||
import os
|
import os
|
||||||
from time import time, strftime
|
from time import time, strftime
|
||||||
|
|
||||||
import locale
|
|
||||||
lang=locale.getdefaultlocale()[0][0:2]
|
|
||||||
if lang=="en":
|
|
||||||
def _(string): return string
|
|
||||||
else:
|
|
||||||
import gettext
|
|
||||||
try:
|
|
||||||
trans = gettext.translation("fpdb", localedir="locale", languages=[lang])
|
|
||||||
trans.install()
|
|
||||||
except IOError:
|
|
||||||
def _(string): return string
|
|
||||||
|
|
||||||
import fpdb_import
|
import fpdb_import
|
||||||
import Database
|
import Database
|
||||||
import Filters
|
import Filters
|
||||||
|
|
|
@ -15,6 +15,9 @@
|
||||||
#along with this program. If not, see <http://www.gnu.org/licenses/>.
|
#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 "official" distribution you can find the license in agpl-3.0.txt.
|
||||||
|
|
||||||
|
import L10n
|
||||||
|
_ = L10n.get_translation()
|
||||||
|
|
||||||
import xml.dom.minidom
|
import xml.dom.minidom
|
||||||
from xml.dom.minidom import Node
|
from xml.dom.minidom import Node
|
||||||
|
|
||||||
|
@ -23,18 +26,6 @@ pygtk.require('2.0')
|
||||||
import gtk
|
import gtk
|
||||||
import gobject
|
import gobject
|
||||||
|
|
||||||
import locale
|
|
||||||
lang=locale.getdefaultlocale()[0][0:2]
|
|
||||||
if lang=="en":
|
|
||||||
def _(string): return string
|
|
||||||
else:
|
|
||||||
import gettext
|
|
||||||
try:
|
|
||||||
trans = gettext.translation("fpdb", localedir="locale", languages=[lang])
|
|
||||||
trans.install()
|
|
||||||
except IOError:
|
|
||||||
def _(string): return string
|
|
||||||
|
|
||||||
import Configuration
|
import Configuration
|
||||||
|
|
||||||
rewrite = { 'general' : 'General', 'supported_databases' : 'Databases'
|
rewrite = { 'general' : 'General', 'supported_databases' : 'Databases'
|
||||||
|
|
|
@ -339,7 +339,7 @@ class GuiRingPlayerStats (GuiPlayerStats.GuiPlayerStats):
|
||||||
#end def createStatsTable
|
#end def createStatsTable
|
||||||
|
|
||||||
def reset_style_render_func(self, treeviewcolumn, cell, model, iter):
|
def reset_style_render_func(self, treeviewcolumn, cell, model, iter):
|
||||||
cell.set_property('foreground', 'black')
|
cell.set_property('foreground', None)
|
||||||
#end def reset_style_render_func
|
#end def reset_style_render_func
|
||||||
|
|
||||||
def ledger_style_render_func(self, tvcol, cell, model, iter):
|
def ledger_style_render_func(self, tvcol, cell, model, iter):
|
||||||
|
|
|
@ -434,7 +434,7 @@ class GuiTourneyPlayerStats (GuiPlayerStats.GuiPlayerStats):
|
||||||
#end def refreshStats
|
#end def refreshStats
|
||||||
|
|
||||||
def reset_style_render_func(self, treeviewcolumn, cell, model, iter):
|
def reset_style_render_func(self, treeviewcolumn, cell, model, iter):
|
||||||
cell.set_property('foreground', 'black')
|
cell.set_property('foreground', None)
|
||||||
#end def reset_style_render_func
|
#end def reset_style_render_func
|
||||||
|
|
||||||
def sortCols(self, col, nums):
|
def sortCols(self, col, nums):
|
||||||
|
|
|
@ -23,6 +23,9 @@
|
||||||
|
|
||||||
Main for FreePokerTools HUD.
|
Main for FreePokerTools HUD.
|
||||||
"""
|
"""
|
||||||
|
import L10n
|
||||||
|
_ = L10n.get_translation()
|
||||||
|
|
||||||
# Standard Library modules
|
# Standard Library modules
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
|
@ -51,21 +54,6 @@ elif sys.platform == 'darwin':
|
||||||
else: # This is bad--figure out the values for the various windows flavors
|
else: # This is bad--figure out the values for the various windows flavors
|
||||||
import WinTables as Tables
|
import WinTables as Tables
|
||||||
|
|
||||||
import locale
|
|
||||||
lang = locale.getdefaultlocale()[0][0:2]
|
|
||||||
print "lang:", lang
|
|
||||||
if lang == "en":
|
|
||||||
def _(string):
|
|
||||||
return string
|
|
||||||
else:
|
|
||||||
import gettext
|
|
||||||
try:
|
|
||||||
trans = gettext.translation("fpdb", localedir="locale", languages=[lang])
|
|
||||||
trans.install()
|
|
||||||
except IOError:
|
|
||||||
def _(string):
|
|
||||||
return string
|
|
||||||
|
|
||||||
# get config and set up logger
|
# get config and set up logger
|
||||||
c = Configuration.Config(file=options.config, dbname=options.dbname)
|
c = Configuration.Config(file=options.config, dbname=options.dbname)
|
||||||
log = Configuration.get_logger("logging.conf", "hud", log_dir=c.dir_log, log_file='HUD-log.txt')
|
log = Configuration.get_logger("logging.conf", "hud", log_dir=c.dir_log, log_file='HUD-log.txt')
|
||||||
|
|
|
@ -1140,7 +1140,7 @@ class DrawHand(Hand):
|
||||||
hhc.markStreets(self)
|
hhc.markStreets(self)
|
||||||
# markStreets in Draw may match without dealing cards
|
# markStreets in Draw may match without dealing cards
|
||||||
if self.streets['DEAL'] == None:
|
if self.streets['DEAL'] == None:
|
||||||
raise FpdbParseError(_("DrawHand.__init__: street 'DEAL' is empty. Hand cancelled?"))
|
raise FpdbParseError(_("DrawHand.__init__: street 'DEAL' is empty. Hand cancelled? '%s'" % self.handid))
|
||||||
hhc.readBlinds(self)
|
hhc.readBlinds(self)
|
||||||
hhc.readAntes(self)
|
hhc.readAntes(self)
|
||||||
hhc.readButton(self)
|
hhc.readButton(self)
|
||||||
|
|
|
@ -49,7 +49,7 @@ class OnGame(HandHistoryConverter):
|
||||||
}
|
}
|
||||||
currencies = { u'\u20ac':'EUR', u'\xe2\x82\xac':'EUR', '$':'USD', '':'T$' }
|
currencies = { u'\u20ac':'EUR', u'\xe2\x82\xac':'EUR', '$':'USD', '':'T$' }
|
||||||
|
|
||||||
limits = { 'NO_LIMIT':'nl', 'LIMIT':'fl'}
|
limits = { 'NO_LIMIT':'nl', 'POT_LIMIT':'pl', 'LIMIT':'fl'}
|
||||||
|
|
||||||
games = { # base, category
|
games = { # base, category
|
||||||
"TEXAS_HOLDEM" : ('hold','holdem'),
|
"TEXAS_HOLDEM" : ('hold','holdem'),
|
||||||
|
@ -73,7 +73,7 @@ class OnGame(HandHistoryConverter):
|
||||||
Start\shand:\s(?P<DATETIME>.*)
|
Start\shand:\s(?P<DATETIME>.*)
|
||||||
Table:\s(?P<TABLE>[-\'\w\s]+)\s\[\d+\]\s\(
|
Table:\s(?P<TABLE>[-\'\w\s]+)\s\[\d+\]\s\(
|
||||||
(
|
(
|
||||||
(?P<LIMIT>NO_LIMIT|Limit|LIMIT|Pot\sLimit)\s
|
(?P<LIMIT>NO_LIMIT|Limit|LIMIT|Pot\sLimit|POT_LIMIT)\s
|
||||||
(?P<GAME>TEXAS_HOLDEM|OMAHA_HI|SEVEN_CARD_STUD|SEVEN_CARD_STUD_HI_LO|RAZZ|FIVE_CARD_DRAW)\s
|
(?P<GAME>TEXAS_HOLDEM|OMAHA_HI|SEVEN_CARD_STUD|SEVEN_CARD_STUD_HI_LO|RAZZ|FIVE_CARD_DRAW)\s
|
||||||
(?P<CURRENCY>%(LS)s|)?(?P<SB>[.0-9]+)/
|
(?P<CURRENCY>%(LS)s|)?(?P<SB>[.0-9]+)/
|
||||||
(%(LS)s)?(?P<BB>[.0-9]+)
|
(%(LS)s)?(?P<BB>[.0-9]+)
|
||||||
|
@ -140,6 +140,7 @@ class OnGame(HandHistoryConverter):
|
||||||
def readSupportedGames(self):
|
def readSupportedGames(self):
|
||||||
return [
|
return [
|
||||||
["ring", "hold", "fl"],
|
["ring", "hold", "fl"],
|
||||||
|
["ring", "hold", "pl"],
|
||||||
["ring", "hold", "nl"],
|
["ring", "hold", "nl"],
|
||||||
["ring", "stud", "fl"],
|
["ring", "stud", "fl"],
|
||||||
["ring", "draw", "fl"],
|
["ring", "draw", "fl"],
|
||||||
|
@ -158,6 +159,7 @@ class OnGame(HandHistoryConverter):
|
||||||
raise FpdbParseError(_("Unable to recognise gametype from: '%s'") % tmp)
|
raise FpdbParseError(_("Unable to recognise gametype from: '%s'") % tmp)
|
||||||
|
|
||||||
mg = m.groupdict()
|
mg = m.groupdict()
|
||||||
|
#print "DEBUG: mg: %s" % mg
|
||||||
|
|
||||||
info['type'] = 'ring'
|
info['type'] = 'ring'
|
||||||
if 'CURRENCY' in mg:
|
if 'CURRENCY' in mg:
|
||||||
|
@ -314,9 +316,9 @@ class OnGame(HandHistoryConverter):
|
||||||
m = self.re_Action.finditer(hand.streets[street])
|
m = self.re_Action.finditer(hand.streets[street])
|
||||||
for action in m:
|
for action in m:
|
||||||
#acts = action.groupdict()
|
#acts = action.groupdict()
|
||||||
#log.debug("readaction: acts: %s" %acts)
|
#print "readaction: acts: %s" %acts
|
||||||
if action.group('ATYPE') == ' raises':
|
if action.group('ATYPE') == ' raises':
|
||||||
hand.addRaiseBy( street, action.group('PNAME'), action.group('BET') )
|
hand.addRaiseTo( street, action.group('PNAME'), action.group('BET') )
|
||||||
elif action.group('ATYPE') == ' calls':
|
elif action.group('ATYPE') == ' calls':
|
||||||
hand.addCall( street, action.group('PNAME'), action.group('BET') )
|
hand.addCall( street, action.group('PNAME'), action.group('BET') )
|
||||||
elif action.group('ATYPE') == ' bets':
|
elif action.group('ATYPE') == ' bets':
|
||||||
|
|
|
@ -49,7 +49,8 @@ class PartyPoker(HandHistoryConverter):
|
||||||
currencies = {"\$": "USD", "$": "USD", u"\xe2\x82\xac": "EUR", u"\u20ac": "EUR", '': "T$"}
|
currencies = {"\$": "USD", "$": "USD", u"\xe2\x82\xac": "EUR", u"\u20ac": "EUR", '': "T$"}
|
||||||
substitutions = {
|
substitutions = {
|
||||||
'LEGAL_ISO' : "USD|EUR", # legal ISO currency codes
|
'LEGAL_ISO' : "USD|EUR", # legal ISO currency codes
|
||||||
'LS' : "\$|\u20AC|\xe2\x82\xac|" # legal currency symbols - Euro(cp1252, utf-8)
|
'LS' : u"\$|\u20ac|\xe2\x82\xac|", # Currency symbols - Euro(cp1252, utf-8)
|
||||||
|
'NUM' : u".,\d",
|
||||||
}
|
}
|
||||||
|
|
||||||
# Static regexes
|
# Static regexes
|
||||||
|
@ -81,7 +82,7 @@ class PartyPoker(HandHistoryConverter):
|
||||||
re_PlayerInfo = re.compile(u"""
|
re_PlayerInfo = re.compile(u"""
|
||||||
Seat\s(?P<SEAT>\d+):\s
|
Seat\s(?P<SEAT>\d+):\s
|
||||||
(?P<PNAME>.*)\s
|
(?P<PNAME>.*)\s
|
||||||
\(\s*[%(LS)s]?(?P<CASH>[0-9,.]+)\s*(?:%(LEGAL_ISO)s|)\s*\)
|
\(\s*[%(LS)s]?(?P<CASH>[%(NUM)s]+)\s*(?:%(LEGAL_ISO)s|)\s*\)
|
||||||
""" % substitutions, re.VERBOSE| re.UNICODE)
|
""" % substitutions, re.VERBOSE| re.UNICODE)
|
||||||
|
|
||||||
re_HandInfo = re.compile("""
|
re_HandInfo = re.compile("""
|
||||||
|
|
|
@ -84,8 +84,8 @@ class PokerStars(HandHistoryConverter):
|
||||||
|
|
||||||
# Static regexes
|
# Static regexes
|
||||||
re_GameInfo = re.compile(u"""
|
re_GameInfo = re.compile(u"""
|
||||||
PokerStars\sGame\s\#(?P<HID>[0-9]+):\s+
|
PokerStars(\sHome)?\sGame\s\#(?P<HID>[0-9]+):\s+
|
||||||
(Tournament\s\# # open paren of tournament info
|
(\{.*\}\s+)?(Tournament\s\# # open paren of tournament info
|
||||||
(?P<TOURNO>\d+),\s
|
(?P<TOURNO>\d+),\s
|
||||||
# here's how I plan to use LS
|
# here's how I plan to use LS
|
||||||
(?P<BUYIN>(?P<BIAMT>[%(LS)s\d\.]+)?\+?(?P<BIRAKE>[%(LS)s\d\.]+)?\+?(?P<BOUNTY>[%(LS)s\d\.]+)?\s?(?P<TOUR_ISO>%(LEGAL_ISO)s)?|Freeroll)\s+)?
|
(?P<BUYIN>(?P<BIAMT>[%(LS)s\d\.]+)?\+?(?P<BIRAKE>[%(LS)s\d\.]+)?\+?(?P<BOUNTY>[%(LS)s\d\.]+)?\s?(?P<TOUR_ISO>%(LEGAL_ISO)s)?|Freeroll)\s+)?
|
||||||
|
|
|
@ -109,9 +109,9 @@ class RushNotes(Aux_Window):
|
||||||
notepath = site_params_dict['site_path'] # this is a temporary hijack of site-path
|
notepath = site_params_dict['site_path'] # this is a temporary hijack of site-path
|
||||||
self.heroid = self.hud.db_connection.get_player_id(self.config, sitename, heroname)
|
self.heroid = self.hud.db_connection.get_player_id(self.config, sitename, heroname)
|
||||||
self.notefile = notepath + "/" + heroname + ".xml"
|
self.notefile = notepath + "/" + heroname + ".xml"
|
||||||
self.rushtables = ("Mach 10", "Lightning", "Celerity", "Flash", "Zoom")
|
self.rushtables = ("Mach 10", "Lightning", "Celerity", "Flash", "Zoom", "Apollo")
|
||||||
|
|
||||||
if not os.path.isfile(self.notefile):
|
if not (os.path.isfile(self.notefile)):
|
||||||
self.active = False
|
self.active = False
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
|
@ -130,9 +130,14 @@ class RushNotes(Aux_Window):
|
||||||
xmlnotefile.unlink
|
xmlnotefile.unlink
|
||||||
|
|
||||||
#
|
#
|
||||||
# Create a fresh queue file with skeleton XML
|
# if queue file does not exist create a fresh queue file with skeleton XML
|
||||||
|
# This is possibly not totally safe, if multiple threads arrive
|
||||||
|
# here at the same time, but the consequences are not serious
|
||||||
#
|
#
|
||||||
|
|
||||||
self.queuefile = self.notefile + ".queue"
|
self.queuefile = self.notefile + ".queue"
|
||||||
|
if not (os.path.isfile(self.queuefile)):
|
||||||
|
|
||||||
queuedom = minidom.Document()
|
queuedom = minidom.Document()
|
||||||
|
|
||||||
pld=queuedom.createElement("PLAYERDATA")
|
pld=queuedom.createElement("PLAYERDATA")
|
||||||
|
@ -152,7 +157,7 @@ class RushNotes(Aux_Window):
|
||||||
|
|
||||||
if (debugmode):
|
if (debugmode):
|
||||||
#initialise logfiles
|
#initialise logfiles
|
||||||
debugfile=open("~Rushdebug.init", "w")
|
debugfile=open("~Rushdebug.init", "a")
|
||||||
debugfile.write("conf="+str(config)+"\n")
|
debugfile.write("conf="+str(config)+"\n")
|
||||||
debugfile.write("spdi="+str(site_params_dict)+"\n")
|
debugfile.write("spdi="+str(site_params_dict)+"\n")
|
||||||
debugfile.write("para="+str(params)+"\n")
|
debugfile.write("para="+str(params)+"\n")
|
||||||
|
@ -161,8 +166,6 @@ class RushNotes(Aux_Window):
|
||||||
debugfile.write("queu="+self.queuefile+"\n")
|
debugfile.write("queu="+self.queuefile+"\n")
|
||||||
debugfile.close()
|
debugfile.close()
|
||||||
|
|
||||||
open("~Rushdebug.data", "w").close()
|
|
||||||
|
|
||||||
|
|
||||||
def update_data(self, new_hand_id, db_connection):
|
def update_data(self, new_hand_id, db_connection):
|
||||||
#this method called once for every hand processed
|
#this method called once for every hand processed
|
||||||
|
@ -204,8 +207,12 @@ class RushNotes(Aux_Window):
|
||||||
vpip=str(Stats.do_stat(self.hud.stat_dict, player = playerid, stat = 'vpip')[3] + " ")
|
vpip=str(Stats.do_stat(self.hud.stat_dict, player = playerid, stat = 'vpip')[3] + " ")
|
||||||
pfr=str(Stats.do_stat(self.hud.stat_dict, player = playerid, stat = 'pfr')[3] + " ")
|
pfr=str(Stats.do_stat(self.hud.stat_dict, player = playerid, stat = 'pfr')[3] + " ")
|
||||||
three_B=str(Stats.do_stat(self.hud.stat_dict, player = playerid, stat = 'three_B')[3] + " ")
|
three_B=str(Stats.do_stat(self.hud.stat_dict, player = playerid, stat = 'three_B')[3] + " ")
|
||||||
|
four_B=str(Stats.do_stat(self.hud.stat_dict, player = playerid, stat = 'four_B')[3] + " ")
|
||||||
cbet=str(Stats.do_stat(self.hud.stat_dict, player = playerid, stat = 'cbet')[3] + " ")
|
cbet=str(Stats.do_stat(self.hud.stat_dict, player = playerid, stat = 'cbet')[3] + " ")
|
||||||
|
|
||||||
fbbsteal=str(Stats.do_stat(self.hud.stat_dict, player = playerid, stat = 'f_BB_steal')[3] + " ")
|
fbbsteal=str(Stats.do_stat(self.hud.stat_dict, player = playerid, stat = 'f_BB_steal')[3] + " ")
|
||||||
|
f_3bet=str(Stats.do_stat(self.hud.stat_dict, player = playerid, stat = 'f_3bet')[3] + " ")
|
||||||
|
f_4bet=str(Stats.do_stat(self.hud.stat_dict, player = playerid, stat = 'f_4bet')[3] + " ")
|
||||||
|
|
||||||
steal=str(Stats.do_stat(self.hud.stat_dict, player = playerid, stat = 'steal')[3] + " ")
|
steal=str(Stats.do_stat(self.hud.stat_dict, player = playerid, stat = 'steal')[3] + " ")
|
||||||
ffreq1=str(Stats.do_stat(self.hud.stat_dict, player = playerid, stat = 'ffreq1')[3] + " ")
|
ffreq1=str(Stats.do_stat(self.hud.stat_dict, player = playerid, stat = 'ffreq1')[3] + " ")
|
||||||
|
@ -213,7 +220,6 @@ class RushNotes(Aux_Window):
|
||||||
BBper100=str(Stats.do_stat(self.hud.stat_dict, player = playerid, stat = 'BBper100')[3])
|
BBper100=str(Stats.do_stat(self.hud.stat_dict, player = playerid, stat = 'BBper100')[3])
|
||||||
if BBper100[6] == "-": BBper100=BBper100[0:6] + "(" + BBper100[7:] + ")"
|
if BBper100[6] == "-": BBper100=BBper100[0:6] + "(" + BBper100[7:] + ")"
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# grab villain known starting hands
|
# grab villain known starting hands
|
||||||
# only those where they VPIP'd, so limp in the BB will not be shown
|
# only those where they VPIP'd, so limp in the BB will not be shown
|
||||||
|
@ -269,10 +275,13 @@ class RushNotes(Aux_Window):
|
||||||
# for later search/replace by Merge module
|
# for later search/replace by Merge module
|
||||||
#
|
#
|
||||||
xmlqueuedict[playername] = ("~fpdb~" + "\n" +
|
xmlqueuedict[playername] = ("~fpdb~" + "\n" +
|
||||||
n + vpip + pfr + three_B + fbbsteal + "\n" +
|
n + vpip + pfr + "\n" +
|
||||||
steal + cbet + ffreq1 + "\n" +
|
steal + cbet + fbbsteal + ffreq1 + "\n" +
|
||||||
|
three_B + four_B + f_3bet + f_4bet + "\n" +
|
||||||
agg_freq + BBper100 + "\n" +
|
agg_freq + BBper100 + "\n" +
|
||||||
PFcall+"\n"+PFaggr+"\n"+PFdefend +"\n"
|
PFcall+"\n"+
|
||||||
|
PFaggr+"\n"+
|
||||||
|
PFdefend +"\n"+
|
||||||
"~ends~")
|
"~ends~")
|
||||||
|
|
||||||
if (debugmode):
|
if (debugmode):
|
||||||
|
|
|
@ -105,8 +105,6 @@ if not os.path.isfile(sys.argv[1]):
|
||||||
|
|
||||||
if not os.path.isfile((sys.argv[1]+".queue")):
|
if not os.path.isfile((sys.argv[1]+".queue")):
|
||||||
print "Nothing found to merge, quitting"
|
print "Nothing found to merge, quitting"
|
||||||
print "Did the HUD not get started during the last session?"
|
|
||||||
print "Has the HUD been stopped and started without merging?"
|
|
||||||
quit()
|
quit()
|
||||||
|
|
||||||
print "***************************************************************"
|
print "***************************************************************"
|
||||||
|
@ -117,7 +115,7 @@ print "has stopped completely"
|
||||||
print "***************************************************************"
|
print "***************************************************************"
|
||||||
print
|
print
|
||||||
print "read from: ", sys.argv[1]
|
print "read from: ", sys.argv[1]
|
||||||
print "merge with: ", sys.argv[1]+".queue"
|
print "updated with: ", sys.argv[1]+".queue"
|
||||||
|
|
||||||
#read queue and turn into a dict
|
#read queue and turn into a dict
|
||||||
queuedict = {}
|
queuedict = {}
|
||||||
|
@ -172,7 +170,7 @@ mergednotes.close()
|
||||||
|
|
||||||
xmlnotefile.unlink
|
xmlnotefile.unlink
|
||||||
|
|
||||||
print "Merged file has been written to: ", sys.argv[1]+".merged"
|
print "written to: ", sys.argv[1]+".merged"
|
||||||
print ""
|
print ""
|
||||||
print "number in queue: ", statqueue
|
print "number in queue: ", statqueue
|
||||||
print "existing players updated: ", statupdated
|
print "existing players updated: ", statupdated
|
||||||
|
@ -180,5 +178,7 @@ print "new players added: ", statadded
|
||||||
print "\n"
|
print "\n"
|
||||||
print "Use a viewer to check the contents of the merge file."
|
print "Use a viewer to check the contents of the merge file."
|
||||||
print "If you are happy, carry out the following steps:"
|
print "If you are happy, carry out the following steps:"
|
||||||
print "1 Rename or delete the existing notes file (normally <heroname>.xml"
|
print "1 Rename or delete the existing notes file (normally <heroname>.xml)"
|
||||||
print "2 Rename the .merged file to become the new notes file"
|
print "2 Rename the .merged file to become the new notes file"
|
||||||
|
print "3 Delete the .queue file (it will be created at the next rush autoimport)"
|
||||||
|
|
||||||
|
|
|
@ -15,11 +15,6 @@ Important info:
|
||||||
The Merge process can only be run when ftp client is shutdown
|
The Merge process can only be run when ftp client is shutdown
|
||||||
- otherwise ftp overwrites the xml on exit.
|
- otherwise ftp overwrites the xml on exit.
|
||||||
|
|
||||||
Restarting the autoimport will empty the notes"queue" so avoid restarting
|
|
||||||
autoimport until the previous notes "queue" has been merged. You will
|
|
||||||
lose all the queued notes, but these will be regenerated the next time
|
|
||||||
the villian is at your table, so it isn't the end of the world.
|
|
||||||
|
|
||||||
Existing ftp notes _SHOULD_ be preserved, but this isn't guaranteed,
|
Existing ftp notes _SHOULD_ be preserved, but this isn't guaranteed,
|
||||||
you have been warned!
|
you have been warned!
|
||||||
|
|
||||||
|
@ -27,7 +22,8 @@ Existing colour codings should be preserved,
|
||||||
this process does not change or set colourcodings.
|
this process does not change or set colourcodings.
|
||||||
|
|
||||||
Copies of the live ftp notes file should be preserved everytime
|
Copies of the live ftp notes file should be preserved everytime
|
||||||
RushNotesAux (i.e. the HUD is started)
|
RushNotesAux (i.e. the HUD is started). If you play at different
|
||||||
|
rush tables, the backup will be created several times.
|
||||||
|
|
||||||
The AW is hard-coded with just the table names of Micro Rush Poker,
|
The AW is hard-coded with just the table names of Micro Rush Poker,
|
||||||
and should ignore all other hands.
|
and should ignore all other hands.
|
||||||
|
@ -35,7 +31,7 @@ The AW is hard-coded with just the table names of Micro Rush Poker,
|
||||||
What might not work?
|
What might not work?
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
This isn't tested with Windows, and probably won't work, feedback welcome.
|
This should work with windows sourcecode version, but will not work with the exe download.
|
||||||
Hasn't been tested for co-existance with other sites, feedback welcome.
|
Hasn't been tested for co-existance with other sites, feedback welcome.
|
||||||
Whenever FTP change their notes file format, this will all break rather spectacularly,
|
Whenever FTP change their notes file format, this will all break rather spectacularly,
|
||||||
you have been warned!
|
you have been warned!
|
||||||
|
@ -77,7 +73,7 @@ execute the following:
|
||||||
./pyfpdb/RushNotesMerge.py "/home/foo/.wine/drive_c/Program Files/Full Tilt Poker/myname.xml"
|
./pyfpdb/RushNotesMerge.py "/home/foo/.wine/drive_c/Program Files/Full Tilt Poker/myname.xml"
|
||||||
|
|
||||||
A revised notes file (blah.merge) should automagically appear in the full tilt root directory.
|
A revised notes file (blah.merge) should automagically appear in the full tilt root directory.
|
||||||
If you are happy with it, replace the existing (myname.xml file)
|
If you are happy with it, replace the existing (myname.xml file) and delete the .queue file.
|
||||||
|
|
||||||
|
|
||||||
Since the updates aren't real time, it would be ok to play the rush
|
Since the updates aren't real time, it would be ok to play the rush
|
||||||
|
@ -176,7 +172,7 @@ Process overview
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
1/ The HUD process is started.
|
1/ The HUD process is started.
|
||||||
1.1/ when the first hand is received, h fresh holding file is created, and
|
1.1/ when the first hand is received, a queue file is created if not already there, and
|
||||||
a copy of the current live xml note file is created as a security backup.
|
a copy of the current live xml note file is created as a security backup.
|
||||||
2/ For every hand played, the auxillary window is called
|
2/ For every hand played, the auxillary window is called
|
||||||
3/ Based upon the players in the hand, fpdb will be interrogated
|
3/ Based upon the players in the hand, fpdb will be interrogated
|
||||||
|
@ -191,4 +187,4 @@ existing notes, but this cannot be guaranteed.
|
||||||
they replace the existing note file.
|
they replace the existing note file.
|
||||||
9/ Note that this process never updates the live notes file in situ, but
|
9/ Note that this process never updates the live notes file in situ, but
|
||||||
there is a risk that something goes wrong, and that existing notes could be destroyed.
|
there is a risk that something goes wrong, and that existing notes could be destroyed.
|
||||||
|
10/ the queue file can be deleted to reduce re-processing next time.
|
||||||
|
|
|
@ -2294,7 +2294,7 @@ class Sql:
|
||||||
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
|
,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)))
|
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)))
|
/(0.0+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
|
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)))
|
,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.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))) +
|
||||||
|
@ -2415,7 +2415,7 @@ class Sql:
|
||||||
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
|
,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)))
|
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)))
|
/(0.0+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
|
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)))
|
,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.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))) +
|
||||||
|
@ -2537,7 +2537,7 @@ class Sql:
|
||||||
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
|
,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)))
|
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)))
|
/(0.0+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
|
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)))
|
,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.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))) +
|
||||||
|
|
|
@ -15,10 +15,13 @@ import L10n
|
||||||
_ = L10n.get_translation()
|
_ = L10n.get_translation()
|
||||||
|
|
||||||
import sys, random
|
import sys, random
|
||||||
|
import re
|
||||||
import pokereval
|
import pokereval
|
||||||
|
|
||||||
SUITS = ['h', 'd', 's', 'c']
|
SUITS = ['h', 'd', 's', 'c']
|
||||||
|
|
||||||
|
CONNECTORS = ['32', '43', '54', '65', '76', '87', '98', 'T9', 'JT', 'QJ', 'KQ', 'AK']
|
||||||
|
|
||||||
ANY = 0
|
ANY = 0
|
||||||
SUITED = 1
|
SUITED = 1
|
||||||
OFFSUIT = 2
|
OFFSUIT = 2
|
||||||
|
@ -65,13 +68,6 @@ class Stove:
|
||||||
hands_in_range = string.strip().split(',')
|
hands_in_range = string.strip().split(',')
|
||||||
for h in hands_in_range:
|
for h in hands_in_range:
|
||||||
_h = h.strip()
|
_h = h.strip()
|
||||||
if len(_h) > 3:
|
|
||||||
cc = _h.split()
|
|
||||||
r1 = cc[0]
|
|
||||||
r2 = cc[1]
|
|
||||||
vp = Cards(r1, r2)
|
|
||||||
h_range.add(vp)
|
|
||||||
else:
|
|
||||||
h_range.expand(expand_hands(_h, self.hand, self.board))
|
h_range.expand(expand_hands(_h, self.hand, self.board))
|
||||||
|
|
||||||
self.h_range = h_range
|
self.h_range = h_range
|
||||||
|
@ -83,7 +79,7 @@ class Cards:
|
||||||
self.c2 = c2
|
self.c2 = c2
|
||||||
|
|
||||||
def get(self):
|
def get(self):
|
||||||
return [c1, c2]
|
return [self.c1, self.c2]
|
||||||
|
|
||||||
class Board:
|
class Board:
|
||||||
def __init__(self, b1=None, b2=None, b3=None, b4=None, b5=None):
|
def __init__(self, b1=None, b2=None, b3=None, b4=None, b5=None):
|
||||||
|
@ -175,6 +171,35 @@ def expand_hands(abbrev, hand, board):
|
||||||
known_cards.update(set([hand.c2, hand.c2]))
|
known_cards.update(set([hand.c2, hand.c2]))
|
||||||
known_cards.update(set([board.b1, board.b2, board.b3, board.b4, board.b5]))
|
known_cards.update(set([board.b1, board.b2, board.b3, board.b4, board.b5]))
|
||||||
|
|
||||||
|
re.search('[2-9TJQKA]{2}(s|o)',abbrev)
|
||||||
|
|
||||||
|
if re.search('^[2-9TJQKA]{2}(s|o)$',abbrev): #AKs or AKo
|
||||||
|
return standard_expand(abbrev, hand, known_cards)
|
||||||
|
elif re.search('^[2-9TJQKA]{2}(s|o)\+$',abbrev): #76s+ or 76o+
|
||||||
|
return iterative_expand(abbrev, hand, known_cards)
|
||||||
|
#elif: AhXh
|
||||||
|
#elif: Ah6h+A
|
||||||
|
|
||||||
|
def iterative_expand(abbrev, hand, known_cards):
|
||||||
|
r1 = abbrev[0]
|
||||||
|
r2 = abbrev[1]
|
||||||
|
|
||||||
|
h_range = []
|
||||||
|
considered = set()
|
||||||
|
|
||||||
|
idx = CONNECTORS.index('%s%s' % (r1, r2))
|
||||||
|
|
||||||
|
ltr = abbrev[2]
|
||||||
|
|
||||||
|
h_range = []
|
||||||
|
for h in CONNECTORS[idx:]:
|
||||||
|
abr = "%s%s" % (h, ltr)
|
||||||
|
h_range += standard_expand(abr, hand, known_cards)
|
||||||
|
|
||||||
|
return h_range
|
||||||
|
|
||||||
|
|
||||||
|
def standard_expand(abbrev, hand, known_cards):
|
||||||
# Card ranks may be different
|
# Card ranks may be different
|
||||||
r1 = abbrev[0]
|
r1 = abbrev[0]
|
||||||
r2 = abbrev[1]
|
r2 = abbrev[1]
|
||||||
|
|
Binary file not shown.
|
@ -0,0 +1,44 @@
|
||||||
|
***** History for hand R5-21973400-50 *****
|
||||||
|
Start hand: Mon Feb 7 15:22:00 GMT+0100 2011
|
||||||
|
Table: Oullins [21973414] (POT_LIMIT OMAHA_HI €1/€1, Real money)
|
||||||
|
User: Hero
|
||||||
|
Button: seat 7
|
||||||
|
Players in round: 6
|
||||||
|
Seat 8: Player8 (€89)
|
||||||
|
Seat 10: Hero (€100)
|
||||||
|
Seat 2: Player2 (€50)
|
||||||
|
Seat 3: Player3 (€93.50)
|
||||||
|
Seat 5: Player5 (€86.15)
|
||||||
|
Seat 7: Player7 (€149.40)
|
||||||
|
Player8 posts small blind (€0.50)
|
||||||
|
Hero posts big blind (€1)
|
||||||
|
---
|
||||||
|
Dealing pocket cards
|
||||||
|
Dealing to Hero: [3c, 7c, 4c, 5h]
|
||||||
|
Player2 calls €1
|
||||||
|
Player3 raises €4.50 to €4.50
|
||||||
|
Player5 folds
|
||||||
|
Player7 calls €4.50
|
||||||
|
Player8 calls €4
|
||||||
|
Hero calls €3.50
|
||||||
|
Player2 folds
|
||||||
|
--- Dealing flop [7s, 4d, 3h]
|
||||||
|
Player8 checks
|
||||||
|
Hero bets €12
|
||||||
|
Player3 calls €12
|
||||||
|
Player7 folds
|
||||||
|
Player8 folds
|
||||||
|
--- Dealing turn [6d]
|
||||||
|
Hero bets €21.50
|
||||||
|
Player3 folds
|
||||||
|
---
|
||||||
|
Summary:
|
||||||
|
Main pot: €43 won by Hero (€40.85)
|
||||||
|
Rake taken: €2.15
|
||||||
|
Seat 8: Player8 (€84.50), net: -€4.50
|
||||||
|
Seat 10: Hero (€124.35), net: +€24.35
|
||||||
|
Seat 2: Player2 (€49), net: -€1
|
||||||
|
Seat 3: Player3 (€77), net: -€16.50
|
||||||
|
Seat 5: Player5 (€86.15)
|
||||||
|
Seat 7: Player7 (€144.90), net: -€4.50
|
||||||
|
***** End of hand R5-21973414-50 *****
|
|
@ -0,0 +1,16 @@
|
||||||
|
Full Tilt Poker Tournament Summary $2 + $0.25 Sit & Go (214900008) Hold'em No Limit
|
||||||
|
Buy-In: $2 + $0.25
|
||||||
|
Buy-In Chips: 1500
|
||||||
|
6 Entries
|
||||||
|
Total Prize Pool: $12
|
||||||
|
Tournament started: 2011/01/27 07:21:00 ET
|
||||||
|
Tournament finished: 2011/01/27 08:38:00 ET
|
||||||
|
|
||||||
|
1: Hero, $7.80
|
||||||
|
2: Player2, $4.20
|
||||||
|
3: Player3
|
||||||
|
4: Player4
|
||||||
|
5: Player5
|
||||||
|
6: Player6
|
||||||
|
Hero finished in 1st place
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
Full Tilt Poker Tournament Summary $2 + $0.25 Sit & Go (214976900) Hold'em No Limit
|
||||||
|
Buy-In: $2 + $0.25
|
||||||
|
Buy-In Chips: 1500
|
||||||
|
9 Entries
|
||||||
|
Total Prize Pool: $18
|
||||||
|
Tournament started: 2011/01/27 14:35:00 ET
|
||||||
|
Tournament finished: 2011/01/27 15:25:00 ET
|
||||||
|
|
||||||
|
1: Player1, $9
|
||||||
|
2: Player2, $5.40
|
||||||
|
3: Hero, $3.60
|
||||||
|
4: Player4
|
||||||
|
5: Player5
|
||||||
|
6: Player6
|
||||||
|
7: Player7
|
||||||
|
8: Player8
|
||||||
|
9: Player9
|
||||||
|
Hero finished in 3rd place
|
Loading…
Reference in New Issue
Block a user