Merge branch 'master' of git://git.assembla.com/fpdboz
This commit is contained in:
commit
7f7d56c4c7
|
@ -16,6 +16,25 @@
|
||||||
#agpl-3.0.txt in the docs folder of the package.
|
#agpl-3.0.txt in the docs folder of the package.
|
||||||
|
|
||||||
|
|
||||||
|
# From fpdb_simple
|
||||||
|
card_map = { "0": 0, "2": 2, "3" : 3, "4" : 4, "5" : 5, "6" : 6, "7" : 7, "8" : 8,
|
||||||
|
"9" : 9, "T" : 10, "J" : 11, "Q" : 12, "K" : 13, "A" : 14}
|
||||||
|
|
||||||
|
# FIXME: the following is a workaround until switching to newimport.
|
||||||
|
# This should be moved into DerivedStats
|
||||||
|
# I'd also like to change HandsPlayers.startCards to a different datatype
|
||||||
|
# so we can 'trivially' add different start card classifications
|
||||||
|
|
||||||
|
def calcStartCards(hand, player):
|
||||||
|
if hand.gametype['category'] == 'holdem':
|
||||||
|
hcs = hand.join_holecards(player, asList=True)
|
||||||
|
#print "DEBUG: hcs: %s" % hcs
|
||||||
|
value1 = card_map[hcs[0][0]]
|
||||||
|
value2 = card_map[hcs[1][0]]
|
||||||
|
return twoStartCards(value1, hcs[0][1], value2, hcs[1][1])
|
||||||
|
else:
|
||||||
|
# FIXME: Only do startCards value for holdem at the moment
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
def twoStartCards(value1, suit1, value2, suit2):
|
def twoStartCards(value1, suit1, value2, suit2):
|
||||||
|
@ -127,4 +146,4 @@ if __name__ == '__main__':
|
||||||
(i, valueSuitFromCard(i), i+13, valueSuitFromCard(i+13), i+26, valueSuitFromCard(i+26), i+39, valueSuitFromCard(i+39))
|
(i, valueSuitFromCard(i), i+13, valueSuitFromCard(i+13), i+26, valueSuitFromCard(i+26), i+39, valueSuitFromCard(i+39))
|
||||||
|
|
||||||
print
|
print
|
||||||
print encodeCard('7c')
|
print encodeCard('7c')
|
||||||
|
|
|
@ -1651,7 +1651,8 @@ class Database:
|
||||||
pdata[p]['street2CheckCallRaiseDone'],
|
pdata[p]['street2CheckCallRaiseDone'],
|
||||||
pdata[p]['street3CheckCallRaiseChance'],
|
pdata[p]['street3CheckCallRaiseChance'],
|
||||||
pdata[p]['street3CheckCallRaiseDone'],
|
pdata[p]['street3CheckCallRaiseDone'],
|
||||||
pdata[p]['street4CheckCallRaiseChance']
|
pdata[p]['street4CheckCallRaiseChance'],
|
||||||
|
pdata[p]['street4CheckCallRaiseDone']
|
||||||
) )
|
) )
|
||||||
|
|
||||||
q = self.sql.query['store_hands_players']
|
q = self.sql.query['store_hands_players']
|
||||||
|
|
|
@ -47,6 +47,7 @@ class DerivedStats():
|
||||||
self.handsplayers[player[1]]['wonWhenSeenStreet1'] = 0.0
|
self.handsplayers[player[1]]['wonWhenSeenStreet1'] = 0.0
|
||||||
self.handsplayers[player[1]]['sawShowdown'] = False
|
self.handsplayers[player[1]]['sawShowdown'] = False
|
||||||
self.handsplayers[player[1]]['wonAtSD'] = 0.0
|
self.handsplayers[player[1]]['wonAtSD'] = 0.0
|
||||||
|
self.handsplayers[player[1]]['startCards'] = 0
|
||||||
for i in range(5):
|
for i in range(5):
|
||||||
self.handsplayers[player[1]]['street%dCalls' % i] = 0
|
self.handsplayers[player[1]]['street%dCalls' % i] = 0
|
||||||
self.handsplayers[player[1]]['street%dBets' % i] = 0
|
self.handsplayers[player[1]]['street%dBets' % i] = 0
|
||||||
|
@ -57,7 +58,6 @@ class DerivedStats():
|
||||||
#FIXME - Everything below this point is incomplete.
|
#FIXME - Everything below this point is incomplete.
|
||||||
self.handsplayers[player[1]]['position'] = 2
|
self.handsplayers[player[1]]['position'] = 2
|
||||||
self.handsplayers[player[1]]['tourneyTypeId'] = 1
|
self.handsplayers[player[1]]['tourneyTypeId'] = 1
|
||||||
self.handsplayers[player[1]]['startCards'] = 0
|
|
||||||
self.handsplayers[player[1]]['street0_3BChance'] = False
|
self.handsplayers[player[1]]['street0_3BChance'] = False
|
||||||
self.handsplayers[player[1]]['street0_3BDone'] = False
|
self.handsplayers[player[1]]['street0_3BDone'] = False
|
||||||
self.handsplayers[player[1]]['stealAttemptChance'] = False
|
self.handsplayers[player[1]]['stealAttemptChance'] = False
|
||||||
|
@ -168,9 +168,11 @@ class DerivedStats():
|
||||||
for player in hand.players:
|
for player in hand.players:
|
||||||
hcs = hand.join_holecards(player[1], asList=True)
|
hcs = hand.join_holecards(player[1], asList=True)
|
||||||
hcs = hcs + [u'0x', u'0x', u'0x', u'0x', u'0x']
|
hcs = hcs + [u'0x', u'0x', u'0x', u'0x', u'0x']
|
||||||
for i, card in enumerate(hcs[:7], 1):
|
#for i, card in enumerate(hcs[:7], 1): #Python 2.6 syntax
|
||||||
self.handsplayers[player[1]]['card%s' % i] = Card.encodeCard(card)
|
# self.handsplayers[player[1]]['card%s' % i] = Card.encodeCard(card)
|
||||||
|
for i, card in enumerate(hcs[:7]):
|
||||||
|
self.handsplayers[player[1]]['card%s' % (i+1)] = Card.encodeCard(card)
|
||||||
|
self.handsplayers[player[1]]['startCards'] = Card.calcStartCards(hand, player[1])
|
||||||
|
|
||||||
# position,
|
# position,
|
||||||
#Stud 3rd street card test
|
#Stud 3rd street card test
|
||||||
|
@ -266,13 +268,17 @@ class DerivedStats():
|
||||||
# Then no bets before the player with initiatives first action on current street
|
# Then no bets before the player with initiatives first action on current street
|
||||||
# ie. if player on street-1 had initiative
|
# ie. if player on street-1 had initiative
|
||||||
# and no donkbets occurred
|
# and no donkbets occurred
|
||||||
for i, street in enumerate(hand.actionStreets[2:], start=1):
|
|
||||||
name = self.lastBetOrRaiser(hand.actionStreets[i])
|
# XXX: enumerate(list, start=x) is python 2.6 syntax; 'start'
|
||||||
|
# came there
|
||||||
|
#for i, street in enumerate(hand.actionStreets[2:], start=1):
|
||||||
|
for i, street in enumerate(hand.actionStreets[2:]):
|
||||||
|
name = self.lastBetOrRaiser(hand.actionStreets[i+1])
|
||||||
if name:
|
if name:
|
||||||
chance = self.noBetsBefore(hand.actionStreets[i+1], name)
|
chance = self.noBetsBefore(hand.actionStreets[i+2], name)
|
||||||
self.handsplayers[name]['street%dCBChance' %i] = True
|
self.handsplayers[name]['street%dCBChance' % (i+1)] = True
|
||||||
if chance == True:
|
if chance == True:
|
||||||
self.handsplayers[name]['street%dCBDone' %i] = self.betStreet(hand.actionStreets[i+1], name)
|
self.handsplayers[name]['street%dCBDone' % (i+1)] = self.betStreet(hand.actionStreets[i+2], name)
|
||||||
|
|
||||||
def seen(self, hand, i):
|
def seen(self, hand, i):
|
||||||
pas = set()
|
pas = set()
|
||||||
|
|
|
@ -326,6 +326,8 @@ def main(argv=None):
|
||||||
help="How often to print a one-line status report (0 (default) means never)")
|
help="How often to print a one-line status report (0 (default) means never)")
|
||||||
parser.add_option("-u", "--usage", action="store_true", dest="usage", default=False,
|
parser.add_option("-u", "--usage", action="store_true", dest="usage", default=False,
|
||||||
help="Print some useful one liners")
|
help="Print some useful one liners")
|
||||||
|
parser.add_option("-s", "--starsarchive", action="store_true", dest="starsArchive", default=False,
|
||||||
|
help="Do the required conversion for Stars Archive format (ie. as provided by support")
|
||||||
(options, argv) = parser.parse_args(args = argv)
|
(options, argv) = parser.parse_args(args = argv)
|
||||||
|
|
||||||
if options.usage == True:
|
if options.usage == True:
|
||||||
|
@ -369,6 +371,8 @@ def main(argv=None):
|
||||||
importer.setThreads(-1)
|
importer.setThreads(-1)
|
||||||
importer.addBulkImportImportFileOrDir(os.path.expanduser(options.filename), site=options.filtername)
|
importer.addBulkImportImportFileOrDir(os.path.expanduser(options.filename), site=options.filtername)
|
||||||
importer.setCallHud(False)
|
importer.setCallHud(False)
|
||||||
|
if options.starsArchive:
|
||||||
|
importer.setStarsArchive(True)
|
||||||
(stored, dups, partial, errs, ttime) = importer.runImport()
|
(stored, dups, partial, errs, ttime) = importer.runImport()
|
||||||
importer.clearFileList()
|
importer.clearFileList()
|
||||||
print 'GuiBulkImport done: Stored: %d \tDuplicates: %d \tPartial: %d \tErrors: %d in %s seconds - %.0f/sec'\
|
print 'GuiBulkImport done: Stored: %d \tDuplicates: %d \tPartial: %d \tErrors: %d in %s seconds - %.0f/sec'\
|
||||||
|
|
|
@ -54,6 +54,7 @@ class Hand(object):
|
||||||
self.starttime = 0
|
self.starttime = 0
|
||||||
self.handText = handText
|
self.handText = handText
|
||||||
self.handid = 0
|
self.handid = 0
|
||||||
|
self.cancelled = False
|
||||||
self.dbid_hands = 0
|
self.dbid_hands = 0
|
||||||
self.dbid_pids = None
|
self.dbid_pids = None
|
||||||
self.dbid_gt = 0
|
self.dbid_gt = 0
|
||||||
|
@ -263,6 +264,9 @@ If a player has None chips he won't be added."""
|
||||||
log.debug("markStreets:\n"+ str(self.streets))
|
log.debug("markStreets:\n"+ str(self.streets))
|
||||||
else:
|
else:
|
||||||
log.error("markstreets didn't match")
|
log.error("markstreets didn't match")
|
||||||
|
log.error(" - Assuming hand cancelled")
|
||||||
|
self.cancelled = True
|
||||||
|
raise FpdbParseError
|
||||||
|
|
||||||
def checkPlayerExists(self,player):
|
def checkPlayerExists(self,player):
|
||||||
if player not in [p[1] for p in self.players]:
|
if player not in [p[1] for p in self.players]:
|
||||||
|
@ -613,6 +617,8 @@ class HoldemOmahaHand(Hand):
|
||||||
hhc.readPlayerStacks(self)
|
hhc.readPlayerStacks(self)
|
||||||
hhc.compilePlayerRegexs(self)
|
hhc.compilePlayerRegexs(self)
|
||||||
hhc.markStreets(self)
|
hhc.markStreets(self)
|
||||||
|
if self.cancelled:
|
||||||
|
return
|
||||||
hhc.readBlinds(self)
|
hhc.readBlinds(self)
|
||||||
hhc.readAntes(self)
|
hhc.readAntes(self)
|
||||||
hhc.readButton(self)
|
hhc.readButton(self)
|
||||||
|
|
|
@ -57,7 +57,7 @@ class HandHistoryConverter():
|
||||||
codepage = "cp1252"
|
codepage = "cp1252"
|
||||||
|
|
||||||
|
|
||||||
def __init__(self, in_path = '-', out_path = '-', follow=False, index=0, autostart=True):
|
def __init__(self, in_path = '-', out_path = '-', follow=False, index=0, autostart=True, starsArchive=False):
|
||||||
"""\
|
"""\
|
||||||
in_path (default '-' = sys.stdin)
|
in_path (default '-' = sys.stdin)
|
||||||
out_path (default '-' = sys.stdout)
|
out_path (default '-' = sys.stdout)
|
||||||
|
@ -66,6 +66,7 @@ follow : whether to tail -f the input"""
|
||||||
log.info("HandHistory init - %s subclass, in_path '%s'; out_path '%s'" % (self.sitename, in_path, out_path) )
|
log.info("HandHistory init - %s subclass, in_path '%s'; out_path '%s'" % (self.sitename, in_path, out_path) )
|
||||||
|
|
||||||
self.index = 0
|
self.index = 0
|
||||||
|
self.starsArchive = starsArchive
|
||||||
|
|
||||||
self.in_path = in_path
|
self.in_path = in_path
|
||||||
self.out_path = out_path
|
self.out_path = out_path
|
||||||
|
@ -254,6 +255,11 @@ which it expects to find at self.re_TailSplitHands -- see for e.g. Everleaf.py.
|
||||||
self.readFile()
|
self.readFile()
|
||||||
self.obs = self.obs.strip()
|
self.obs = self.obs.strip()
|
||||||
self.obs = self.obs.replace('\r\n', '\n')
|
self.obs = self.obs.replace('\r\n', '\n')
|
||||||
|
if self.starsArchive == True:
|
||||||
|
log.debug("Converting starsArchive format to readable")
|
||||||
|
m = re.compile('^Hand #\d+', re.MULTILINE)
|
||||||
|
self.obs = m.sub('', self.obs)
|
||||||
|
|
||||||
if self.obs is None or self.obs == "":
|
if self.obs is None or self.obs == "":
|
||||||
log.info("Read no hands.")
|
log.info("Read no hands.")
|
||||||
return []
|
return []
|
||||||
|
|
|
@ -89,6 +89,7 @@ class PartyPoker(HandHistoryConverter):
|
||||||
(?P<TTYPE>[a-zA-Z0-9 ]+)\s+
|
(?P<TTYPE>[a-zA-Z0-9 ]+)\s+
|
||||||
(?: \#|\(|)(?P<TABLE>\d+)\)?\s+
|
(?: \#|\(|)(?P<TABLE>\d+)\)?\s+
|
||||||
(?:[^ ]+\s+\#(?P<MTTTABLE>\d+).+)? # table number for mtt
|
(?:[^ ]+\s+\#(?P<MTTTABLE>\d+).+)? # table number for mtt
|
||||||
|
(\(No\sDP\)\s)?
|
||||||
\((?P<PLAY>Real|Play)\s+Money\)\s+ # FIXME: check if play money is correct
|
\((?P<PLAY>Real|Play)\s+Money\)\s+ # FIXME: check if play money is correct
|
||||||
Seat\s+(?P<BUTTON>\d+)\sis\sthe\sbutton
|
Seat\s+(?P<BUTTON>\d+)\sis\sthe\sbutton
|
||||||
""",
|
""",
|
||||||
|
|
|
@ -203,6 +203,8 @@ class PokerStars(HandHistoryConverter):
|
||||||
if key == 'TOURNO':
|
if key == 'TOURNO':
|
||||||
hand.tourNo = info[key]
|
hand.tourNo = info[key]
|
||||||
if key == 'BUYIN':
|
if key == 'BUYIN':
|
||||||
|
#FIXME: The key looks like: '€0.82+€0.18 EUR'
|
||||||
|
# This should be parsed properly and used
|
||||||
hand.buyin = info[key]
|
hand.buyin = info[key]
|
||||||
if key == 'LEVEL':
|
if key == 'LEVEL':
|
||||||
hand.level = info[key]
|
hand.level = info[key]
|
||||||
|
|
|
@ -3404,10 +3404,11 @@ class Sql:
|
||||||
street2CheckCallRaiseDone,
|
street2CheckCallRaiseDone,
|
||||||
street3CheckCallRaiseChance,
|
street3CheckCallRaiseChance,
|
||||||
street3CheckCallRaiseDone,
|
street3CheckCallRaiseDone,
|
||||||
street4CheckCallRaiseChance
|
street4CheckCallRaiseChance,
|
||||||
|
street4CheckCallRaiseDone
|
||||||
)
|
)
|
||||||
VALUES (
|
VALUES (
|
||||||
%s, %s, %s, %s,
|
%s, %s, %s, %s, %s,
|
||||||
%s, %s, %s, %s, %s,
|
%s, %s, %s, %s, %s,
|
||||||
%s, %s, %s, %s, %s,
|
%s, %s, %s, %s, %s,
|
||||||
%s, %s, %s, %s, %s,
|
%s, %s, %s, %s, %s,
|
||||||
|
|
|
@ -91,6 +91,7 @@ class Importer:
|
||||||
self.settings.setdefault("writeQMaxWait", 10) # not used
|
self.settings.setdefault("writeQMaxWait", 10) # not used
|
||||||
self.settings.setdefault("dropIndexes", "don't drop")
|
self.settings.setdefault("dropIndexes", "don't drop")
|
||||||
self.settings.setdefault("dropHudCache", "don't drop")
|
self.settings.setdefault("dropHudCache", "don't drop")
|
||||||
|
self.settings.setdefault("starsArchive", False)
|
||||||
|
|
||||||
self.writeq = None
|
self.writeq = None
|
||||||
self.database = Database.Database(self.config, sql = self.sql)
|
self.database = Database.Database(self.config, sql = self.sql)
|
||||||
|
@ -134,6 +135,9 @@ class Importer:
|
||||||
def setDropHudCache(self, value):
|
def setDropHudCache(self, value):
|
||||||
self.settings['dropHudCache'] = value
|
self.settings['dropHudCache'] = value
|
||||||
|
|
||||||
|
def setStarsArchive(self, value):
|
||||||
|
self.settings['starsArchive'] = value
|
||||||
|
|
||||||
# def setWatchTime(self):
|
# def setWatchTime(self):
|
||||||
# self.updated = time()
|
# self.updated = time()
|
||||||
|
|
||||||
|
@ -425,25 +429,31 @@ class Importer:
|
||||||
mod = __import__(filter)
|
mod = __import__(filter)
|
||||||
obj = getattr(mod, filter_name, None)
|
obj = getattr(mod, filter_name, None)
|
||||||
if callable(obj):
|
if callable(obj):
|
||||||
hhc = obj(in_path = file, out_path = out_path, index = 0) # Index into file 0 until changeover
|
hhc = obj(in_path = file, out_path = out_path, index = 0, starsArchive = self.settings['starsArchive']) # Index into file 0 until changeover
|
||||||
if hhc.getStatus() and self.NEWIMPORT == False:
|
if hhc.getStatus() and self.NEWIMPORT == False:
|
||||||
(stored, duplicates, partial, errors, ttime) = self.import_fpdb_file(db, out_path, site, q)
|
(stored, duplicates, partial, errors, ttime) = self.import_fpdb_file(db, out_path, site, q)
|
||||||
elif hhc.getStatus() and self.NEWIMPORT == True:
|
elif hhc.getStatus() and self.NEWIMPORT == True:
|
||||||
#This code doesn't do anything yet
|
#This code doesn't do anything yet
|
||||||
handlist = hhc.getProcessedHands()
|
handlist = hhc.getProcessedHands()
|
||||||
self.pos_in_file[file] = hhc.getLastCharacterRead()
|
self.pos_in_file[file] = hhc.getLastCharacterRead()
|
||||||
|
to_hud = []
|
||||||
|
|
||||||
for hand in handlist:
|
for hand in handlist:
|
||||||
#try, except duplicates here?
|
if hand is not None:
|
||||||
hand.prepInsert(self.database)
|
#try, except duplicates here?
|
||||||
hand.insert(self.database)
|
hand.prepInsert(self.database)
|
||||||
if self.callHud and hand.dbid_hands != 0:
|
hand.insert(self.database)
|
||||||
#print "DEBUG: call to HUD: handsId: %s" % hand.dbid_hands
|
if self.callHud and hand.dbid_hands != 0:
|
||||||
#pipe the Hands.id out to the HUD
|
to_hud.append(hand.dbid_hands)
|
||||||
print "fpdb_import: sending hand to hud", hand.dbid_hands, "pipe =", self.caller.pipe_to_hud
|
else:
|
||||||
self.caller.pipe_to_hud.stdin.write("%s" % (hand.dbid_hands) + os.linesep)
|
log.error("Hand processed but empty")
|
||||||
self.database.commit()
|
self.database.commit()
|
||||||
|
|
||||||
|
#pipe the Hands.id out to the HUD
|
||||||
|
for hid in to_hud:
|
||||||
|
print "fpdb_import: sending hand to hud", hand.dbid_hands, "pipe =", self.caller.pipe_to_hud
|
||||||
|
self.caller.pipe_to_hud.stdin.write("%s" % (hid) + os.linesep)
|
||||||
|
|
||||||
errors = getattr(hhc, 'numErrors')
|
errors = getattr(hhc, 'numErrors')
|
||||||
stored = getattr(hhc, 'numHands')
|
stored = getattr(hhc, 'numHands')
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
|
# -*- coding: iso-8859-15 -*-
|
||||||
|
|
||||||
#Copyright 2008 Steffen Jobbagy-Felso
|
#Copyright 2008 Steffen Jobbagy-Felso
|
||||||
#This program is free software: you can redistribute it and/or modify
|
#This program is free software: you can redistribute it and/or modify
|
||||||
|
@ -538,7 +539,11 @@ def parseAnteLine(line, isTourney, names, antes):
|
||||||
#returns the buyin of a tourney in cents
|
#returns the buyin of a tourney in cents
|
||||||
def parseBuyin(topline):
|
def parseBuyin(topline):
|
||||||
pos1 = topline.find("$")+1
|
pos1 = topline.find("$")+1
|
||||||
pos2 = topline.find("+")
|
if pos1 != 0:
|
||||||
|
pos2 = topline.find("+")
|
||||||
|
else:
|
||||||
|
pos1 = topline.find("€")+3
|
||||||
|
pos2 = topline.find("+")
|
||||||
return float2int(topline[pos1:pos2])
|
return float2int(topline[pos1:pos2])
|
||||||
|
|
||||||
#parses a card line and changes the passed arrays accordingly
|
#parses a card line and changes the passed arrays accordingly
|
||||||
|
@ -635,9 +640,14 @@ def parseCashesAndSeatNos(lines):
|
||||||
|
|
||||||
#returns the buyin of a tourney in cents
|
#returns the buyin of a tourney in cents
|
||||||
def parseFee(topline):
|
def parseFee(topline):
|
||||||
pos1=topline.find("$")+1
|
pos1 = topline.find("$")+1
|
||||||
pos1=topline.find("$",pos1)+1
|
if pos1 != 0:
|
||||||
pos2=topline.find(" ", pos1)
|
pos1 = topline.find("$", pos1)+1
|
||||||
|
pos2 = topline.find(" ", pos1)
|
||||||
|
else:
|
||||||
|
pos1 = topline.find("€")+3
|
||||||
|
pos1 = topline.find("€", pos1)+3
|
||||||
|
pos2 = topline.find(" ", pos1)
|
||||||
return float2int(topline[pos1:pos2])
|
return float2int(topline[pos1:pos2])
|
||||||
|
|
||||||
#returns a datetime object with the starttime indicated in the given topline
|
#returns a datetime object with the starttime indicated in the given topline
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
PokerStars Game #25979907808: Omaha Pot Limit ($0.05/$0.10 USD) - 2009/03/15 6:20:33 ET
|
||||||
|
Table 'Waterman' 6-max Seat #1 is the button
|
||||||
|
Seat 1: s0rrow ($11.65 in chips)
|
||||||
|
s0rrow: posts small blind $0.05
|
||||||
|
ritalinIV: is sitting out
|
||||||
|
Hand cancelled
|
||||||
|
*** SUMMARY ***
|
||||||
|
Seat 1: s0rrow (button) collected ($0)
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user