diff --git a/pyfpdb/Card.py b/pyfpdb/Card.py index d0ca69766..f93b58691 100755 --- a/pyfpdb/Card.py +++ b/pyfpdb/Card.py @@ -50,9 +50,11 @@ 'irish' : ('hold', None,'h', {'PREFLOP':0,'FLOP':1,'TURN':2,'RIVER':3}, 'RIVER', [(0,4)]), '5_omahahi' : ('hold','omaha','h', {'PREFLOP':0,'FLOP':1,'TURN':2,'RIVER':3}, 'RIVER', [(0,5)]), '6_omahahi' : ('hold','omaha','h', {'PREFLOP':0,'FLOP':1,'TURN':2,'RIVER':3}, 'RIVER', [(0,6)]), + '6_omaha8' : ('hold','omaha8','s', {'PREFLOP':0,'FLOP':1,'TURN':2,'RIVER':3}, 'RIVER', [(0,6)]), '5_omaha8' : ('hold','omaha8','s', {'PREFLOP':0,'FLOP':1,'TURN':2,'RIVER':3}, 'RIVER', [(0,5)]), 'cour_hi' : ('hold','omaha','h', {'PREFLOP':0,'FLOP':1,'TURN':2,'RIVER':3}, 'RIVER', [(0,5)]), 'cour_hilo' : ('hold','omaha8','s', {'PREFLOP':0,'FLOP':1,'TURN':2,'RIVER':3}, 'RIVER', [(0,5)]), + 'aof_omaha' : ('hold','omaha','h', {'FLOP':0,'TURN':1,'RIVER':2}, 'RIVER', [(0,4)]), '5_studhi' : ('stud','holdem', 'h', {'SECOND': 0, 'THIRD': 1,'FOURTH': 2,'FIFTH': 3}, 'FIFTH', [(0,2),(0,3),(0,4),(0,5)]), 'razz' : ('stud', None, 'l', {'THIRD': 0,'FOURTH': 1,'FIFTH': 2,'SIXTH': 3,'SEVENTH': 4}, 'SEVENTH', [(0,3),(0,4),(0,5),(0,6),(0,7)]), 'studhi' : ('stud','7stud', 'h', {'THIRD': 0,'FOURTH': 1,'FIFTH': 2,'SIXTH': 3,'SEVENTH': 4}, 'SEVENTH', [(0,3),(0,4),(0,5),(0,6),(0,7)]), diff --git a/pyfpdb/Database.py b/pyfpdb/Database.py index 8c6f306e5..c66c51ca3 100755 --- a/pyfpdb/Database.py +++ b/pyfpdb/Database.py @@ -878,11 +878,13 @@ def connect(self, backend=None, host=None, database=None, self.cursor = self.connection.cursor() self.cursor.execute(self.sql.query['set tx level']) self.check_version(database=database, create=create) + self.commit() def get_sites(self): self.cursor.execute("SELECT name,id FROM Sites") sites = self.cursor.fetchall() self.config.set_site_ids(sites) + self.commit() def check_version(self, database, create): self.wrongDbVersion = False diff --git a/pyfpdb/DerivedStats.py b/pyfpdb/DerivedStats.py index 534562d3b..ffad67577 100644 --- a/pyfpdb/DerivedStats.py +++ b/pyfpdb/DerivedStats.py @@ -425,13 +425,17 @@ def assembleHandsStove(self, hand): maxcards = (base!='hold' and len(cards)>=5) if notnull and (postflop or maxcards): for hl, side in hiLoKey[hilo]: - value, rank = pokereval.best(side, cards, bcards) - rankId = Card.hands[rank[0]][0] - if rank!=None and rank[0] != 'Nothing': - _cards = ''.join([pokereval.card2string(i)[0] for i in rank[1:]]) - else: - _cards = None - self.handsstove.append( [hand.dbid_hands, hand.dbid_pids[pname], streetId, boardId, hl, rankId, value, _cards, 0] ) + try: + value, rank = pokereval.best(side, cards, bcards) + rankId = Card.hands[rank[0]][0] + if rank!=None and rank[0] != 'Nothing': + _cards = ''.join([pokereval.card2string(i)[0] for i in rank[1:]]) + else: + _cards = None + self.handsstove.append( [hand.dbid_hands, hand.dbid_pids[pname], streetId, boardId, hl, rankId, value, _cards, 0] ) + except RuntimeError: + log.error("assembleHandsStove: error determining value and rank for hand %s %s" % (hand.handid, hand.in_path)) + self.handsstove.append( [hand.dbid_hands, hand.dbid_pids[pname], streetId, boardId, 'n', 1, 0, None, 0] ) else: self.handsstove.append( [hand.dbid_hands, hand.dbid_pids[pname], streetId, boardId, 'n', 1, 0, None, 0] ) else: @@ -467,14 +471,18 @@ def getAllInEV(self, hand, evalgame, holeplayers, boards, streets, holecards): if len(players) == len(valid) and (board['allin'] or hand.publicDB): if board['allin'] and not startstreet: startstreet = street if len(valid) > 1: - evs = pokereval.poker_eval( - game = evalgame, - iterations = Card.iter[streetId], - pockets = [holecards[p]['hole'] for p in valid], - dead = deadcards, - board = [str(b) for b in board['board'][n]] + (5 - len(board['board'][n])) * ['__'] - ) - equities = [e['ev'] for e in evs['eval']] + try: + evs = pokereval.poker_eval( + game = evalgame, + iterations = Card.iter[streetId], + pockets = [holecards[p]['hole'] for p in valid], + dead = deadcards, + board = [str(b) for b in board['board'][n]] + (5 - len(board['board'][n])) * ['__'] + ) + equities = [e['ev'] for e in evs['eval']] + except RuntimeError: + log.error("getAllInEV: error running poker_eval for hand %s %s" % (hand.handid, hand.in_path)) + equities = [1000] else: equities = [1000] remainder = (1000 - sum(equities)) / Decimal(len(equities)) @@ -483,7 +491,7 @@ def getAllInEV(self, hand, evalgame, holeplayers, boards, streets, holecards): p = valid[i] pid = hand.dbid_pids[p] if street == startstreet: - rake = Decimal(0) if hand.cashedOut else (hand.rake * (Decimal(pot)/Decimal(hand.totalpot))) + rake = hand.rake * (Decimal(pot)/Decimal(hand.totalpot)) holecards[p]['eq'] += ((pot - rake) * equities[i])/Decimal(10) holecards[p]['committed'] = 100*hand.pot.committed[p] + 100*hand.pot.common[p] for j in self.handsstove: @@ -534,7 +542,7 @@ def getBoardsDict(self, hand, base, streets): runitcards += hand.board[street_i] sId = len(boardcards + runitcards) - 3 boardStreets[sId].append(boardcards + runitcards) - for i in range(len(boardStreets)): + for i in range(len([b for b in boardStreets if len(b)>0])): if boardStreets[i]: boards[allInStreets[i+1]]['board'] = boardStreets[i] else: @@ -652,6 +660,10 @@ def assembleHandsPots(self, hand): ): #print 'DEBUG hand.collected', hand.collected #print 'DEBUG hand.collectees', hand.collectees + if not hand.cashedOut: + for p in hand.players: + self.handsplayers[p[1]]['rake'] = 0 + hand.rake = 0 rakes, totrake, potId = {}, 0, 0 for pot, players in hand.pot.pots: if potId ==0: pot += (sum(hand.pot.common.values()) + hand.pot.stp) @@ -704,7 +716,6 @@ def assembleHandsPots(self, hand): potFound[pname][0] += ppot data = {'potId': potId, 'boardId': boardId, 'hiLo': hl,'ppot':ppot, 'winners': [m for m in pnames if pname!=n], 'mod': ppot>potSplit} playersPots[pname][1].append(data) - self.handsplayers[pname]['rake'] = 0 for p, (total, info) in playersPots.iteritems(): #log.error((p, (total, info))) @@ -733,7 +744,9 @@ def assembleHandsPots(self, hand): potFound[p][1] -= collected insert = [None, item['potId'], item['boardId'], item['hiLo'][0], hand.dbid_pids[p], int(item['ppot']*100), int(collected*100), int(rake*100)] self.handspots.append(insert) - self.handsplayers[p]['rake'] += int(rake*100) + if not hand.cashedOut: + self.handsplayers[p]['rake'] += int(rake*100) + hand.rake += rake def setPositions(self, hand): """Sets the position for each player in HandsPlayers @@ -1289,7 +1302,7 @@ def foldTofirstsBetOrRaiser(self, actions, street, aggressor): players[act[0]] = False if act[1] == 'raises' or act[1] == 'completes': break - elif act[1]!='discards': + elif act[1] not in ('discards','stands pat'): i+=1 return players diff --git a/pyfpdb/GGPokerToFpdb.py b/pyfpdb/GGPokerToFpdb.py index 3826846d3..00bf48b58 100644 --- a/pyfpdb/GGPokerToFpdb.py +++ b/pyfpdb/GGPokerToFpdb.py @@ -209,7 +209,7 @@ class GGPoker(HandHistoryConverter): and\stheir\sown\sbounty\sincreases\sby\s%(CUR)s(?P[\.0-9]+)\sto\s%(CUR)s(?P[\.0-9]+)$""" % substitutions, re.MULTILINE|re.VERBOSE) re_Rake = re.compile(u""" - Total\spot\s%(CUR)s(?P[,\.0-9]+)(.+?)?\s\|\sRake\s%(CUR)s(?P[,\.0-9]+)""" + Total\spot\s%(CUR)s(?P[,\.0-9]+)(.+?)?\s\|\sRake\s%(CUR)s(?P[,\.0-9]+)(\s\|\sJackpot\s%(CUR)s(?P[,\.0-9]+))?(\s\|\ssBingo\s%(CUR)s(?P[,\.0-9]+))?""" % substitutions, re.MULTILINE|re.VERBOSE) re_STP = re.compile(u""" @@ -683,6 +683,14 @@ def readCollectPot(self,hand): for m in self.re_CollectPot4.finditer(pre): pot = '-' + self.clearMoneyString(m.group('POT')) hand.addCollectPot(player=m.group('PNAME'),pot=pot) + if hand.cashedOut: + m = self.re_Rake.search(post) + if m: + hand.rake = Decimal(m.group('RAKE')) + if m.group('JACKPOT'): + hand.rake += Decimal(m.group('JACKPOT')) + if m.group('BINGO'): + hand.rake += Decimal(m.group('BINGO')) def readShownCards(self,hand): for m in self.re_ShownCards.finditer(hand.handText): diff --git a/pyfpdb/Hand.py b/pyfpdb/Hand.py index e7a47beb0..61475b842 100644 --- a/pyfpdb/Hand.py +++ b/pyfpdb/Hand.py @@ -707,7 +707,9 @@ def addBlind(self, player, blindtype, amount): street = 'BLAH' - if self.gametype['base'] == 'hold': + if self.gametype['category'] == 'aof_omaha': + street = 'FLOP' + elif self.gametype['base'] == 'hold': street = 'PREFLOP' elif self.gametype['base'] == 'draw': street = 'DEAL' @@ -1098,6 +1100,11 @@ def __init__(self, config, hhc, sitename, gametype, handText, builtFrom = "HHC", self.discardStreets = ['PREFLOP'] self.communityStreets = ['FLOP', 'TURN', 'RIVER'] self.actionStreets = ['BLINDSANTES','PREFLOP','FLOP','TURN','RIVER'] + if gametype['category']=='aof_omaha': + self.allStreets = ['BLINDSANTES','FLOP','TURN','RIVER'] + self.holeStreets = ['FLOP'] + self.communityStreets = ['FLOP', 'TURN', 'RIVER'] + self.actionStreets = ['BLINDSANTES','FLOP','TURN','RIVER'] Hand.__init__(self, self.config, sitename, gametype, handText, builtFrom = "HHC") self.sb = gametype['sb'] self.bb = gametype['bb'] @@ -1157,7 +1164,9 @@ def addShownCards(self, cards, player, shown=True, mucked=False, dealt=False, st if shown: self.shown.add(player) if mucked: self.mucked.add(player) else: - if len(cards) in (2, 3, 4, 6) or self.gametype['category'] in ('5_omahahi', '5_omaha8', 'cour_hi', 'cour_hilo'): # avoid adding board by mistake (Everleaf problem) + if self.gametype['category'] == 'aof_omaha': + self.addHoleCards('FLOP', player, open=[], closed=cards, shown=shown, mucked=mucked, dealt=dealt) + elif len(cards) in (2, 3, 4, 6) or self.gametype['category'] in ('5_omahahi', '5_omaha8', 'cour_hi', 'cour_hilo'): # avoid adding board by mistake (Everleaf problem) self.addHoleCards('PREFLOP', player, open=[], closed=cards, shown=shown, mucked=mucked, dealt=dealt) elif len(cards) == 5: # cards holds a winning hand, not hole cards # filter( lambda x: x not in b, a ) # calcs a - b where a and b are lists diff --git a/pyfpdb/HandHistoryConverter.py b/pyfpdb/HandHistoryConverter.py index b42899d04..82e001d73 100644 --- a/pyfpdb/HandHistoryConverter.py +++ b/pyfpdb/HandHistoryConverter.py @@ -417,7 +417,8 @@ def readOther(self, hand): pass # Some sites don't report the rake. This will be called at the end of the hand after the pot total has been calculated # an inheriting class can calculate it for the specific site if need be. def getRake(self, hand): - hand.rake = hand.totalpot - hand.totalcollected # * Decimal('0.05') # probably not quite right + if hand.rake is None: + hand.rake = hand.totalpot - hand.totalcollected # * Decimal('0.05') # probably not quite right if self.siteId == 9 and hand.gametype['type'] == "tour": round = -5 #round up to 10 elif hand.gametype['type'] == "tour": diff --git a/pyfpdb/KingsClubToFpdb.py b/pyfpdb/KingsClubToFpdb.py index 7c3b4f3fa..711fcf3ce 100644 --- a/pyfpdb/KingsClubToFpdb.py +++ b/pyfpdb/KingsClubToFpdb.py @@ -201,6 +201,7 @@ class KingsClub(HandHistoryConverter): re_Rake = re.compile(r"^Rake\s(?P[,.0-9]+)$", re.MULTILINE) re_Split = re.compile(r"\*\*\* BOARD 1 - FLOP \*\*\*") + re_Table = re.compile(r"^\s?Table\s(ID\s)?\'(?P.+?)\'\s", re.MULTILINE|re.VERBOSE) def compilePlayerRegexs(self, hand): players = set([player[1] for player in hand.players]) @@ -266,9 +267,13 @@ def determineGameType(self, handText): m2 = self.re_Split.search(handText) if m2: - info['split'] = True + info['split'] = True else: info['split'] = False + + m3 = self.re_Table.search(handText) + if m3 and 'AOF' in m3.group('TABLE'): + info['category'] = 'aof_omaha' if info['limitType'] == 'fl' and info['bb'] is not None: if info['type'] == 'ring': @@ -432,11 +437,14 @@ def markStreets(self, hand): r"(\*\*\* BOARD 1 - RIVER \*\*\* \[(?P\S\S \S\S \S\S) (?P\S\S)] (?P\[\S\S\].+(?=\*\*\* BOARD 2 - RIVER \*\*\*)|.+))" r"(\*\*\* BOARD 2 - RIVER \*\*\* \[(?P(\S\S|\-) (\S\S|\-) (\S\S|\-)) (?P(\S\S|\-))] (?P\[\S\S\].+))", post,re.DOTALL) if m1: - if hand.streets.get('FLOP') is None: + if hand.streets.get('FLOP') is None or re.search(r"\*\*\* BOARD 1 - FLOP \*\*\*", post,re.DOTALL): hand.streets.update({'FLOP1': m1.group('FLOP1'),'FLOP2': m1.group('FLOP2')}) - if hand.streets.get('TURN') is None: + hand.streets['FLOP'] = [] + if hand.streets.get('TURN') is None or re.search(r"\*\*\* BOARD 1 - TURN \*\*\*", post,re.DOTALL): hand.streets.update({'TURN1': m1.group('TURN1'),'TURN2': m1.group('TURN2')}) + hand.streets['TURN'] = [] hand.streets.update({'RIVER1': m1.group('RIVER1'),'RIVER2': m1.group('RIVER2')}) + hand.streets['RIVER'] = [] else: m2 = re.search( r"(\*\*\* RIVER \*\*\* \[(?P\S\S \S\S \S\S) (?P\S\S)] (?P\[\S\S\].+(?=\*\*\* SUMMARY \*\s?\*\*)|.+))", post,re.DOTALL) @@ -534,7 +542,8 @@ def readHoleCards(self, hand): newcards = [x for x in found.group('NEWCARDS').split(' ') if x != 'X'] if len(newcards)>0: hand.hero = found.group('PNAME') - hand.addHoleCards(street, hand.hero, closed=newcards, shown=False, mucked=False, dealt=True) + _street = 'FLOP' if hand.gametype['category'] == 'aof_omaha' else street + hand.addHoleCards(_street, hand.hero, closed=newcards, shown=False, mucked=False, dealt=True) for street, text in hand.streets.iteritems(): if not text or street in ('PREFLOP', 'DEAL'): continue # already done these @@ -628,8 +637,7 @@ def readShowdownActions(self, hand): pass def readCollectPot(self,hand): - if ((hand.gametype['category'] == '27_1draw' and hand.gametype['limitType'] == 'nl') or - hand.gametype['base'] == 'stud'): + if ((hand.gametype['category'] == '27_1draw' and hand.gametype['limitType'] == 'nl')): hand.adjustCollected = False else: hand.adjustCollected = True diff --git a/pyfpdb/PacificPokerSummary.py b/pyfpdb/PacificPokerSummary.py index 05e850d30..815096326 100644 --- a/pyfpdb/PacificPokerSummary.py +++ b/pyfpdb/PacificPokerSummary.py @@ -44,7 +44,7 @@ class PacificPokerSummary(TourneySummary): 'NUM' : u".,\d\xa0" # legal characters in number format } - re_Identify = re.compile(u'\*{5}\s(Cassava|888poker|888)(\.[a-z]{2})?(\-[a-z]{2})? Tournament Summary\s\*{5}') + re_Identify = re.compile(u'\*{5}\s(Cassava|888poker|888)?(\.[a-z]{2})?(\-[a-z]{2})? ?Tournament Summary\s\*{5}') re_TourneyInfo = re.compile(u""" Tournament\sID:\s(?P[0-9]+)\s+ diff --git a/pyfpdb/PacificPokerToFpdb.py b/pyfpdb/PacificPokerToFpdb.py index 555f1505b..e81e0dda8 100644 --- a/pyfpdb/PacificPokerToFpdb.py +++ b/pyfpdb/PacificPokerToFpdb.py @@ -241,6 +241,8 @@ def readHandInfo(self, hand): datetimestr = "%s/%s/%s %s:%s:%s" % (a.group('Y'), a.group('M'),a.group('D'),a.group('H'),a.group('MIN'),a.group('S')) hand.startTime = datetime.datetime.strptime(datetimestr, "%Y/%m/%d %H:%M:%S") hand.startTime = HandHistoryConverter.changeTimezone(hand.startTime, "ET", "UTC") + hand.newFormat = datetime.datetime.strptime('20220908000000','%Y%m%d%H%M%S') #this is a guess + hand.newFormat = HandHistoryConverter.changeTimezone(hand.newFormat, "ET", "UTC") if key == 'HID': hand.handid = info[key] if key == 'TOURNO' and info['TOURNO'] != None: @@ -350,7 +352,8 @@ def readBringIn(self, hand): hand.addBringIn(m.group('PNAME'), m.group('BRINGIN')) def readBlinds(self, hand): - hand.setUncalledBets(True) + if hand.startTime < hand.newFormat: + hand.setUncalledBets(True) liveBlind, hand.allInBlind = True, False for a in self.re_PostSB.finditer(hand.handText): if a.group('PNAME') in hand.stacks: diff --git a/pyfpdb/PartyPokerToFpdb.py b/pyfpdb/PartyPokerToFpdb.py index 2f05bd75e..edd2d4a7c 100644 --- a/pyfpdb/PartyPokerToFpdb.py +++ b/pyfpdb/PartyPokerToFpdb.py @@ -239,7 +239,7 @@ def compilePlayerRegexs(self, hand): r"%(PLYR)s posts button blind ?[%(BRAX)s]?%(CUR_SYM)s?(?P[.,0-9]+)\s*%(CUR)s?[%(BRAX)s]?\.?\s*$" % subst, re.MULTILINE) self.re_Antes = re.compile( - r"%(PLYR)s posts ante( of)? [%(BRAX)s]?%(CUR_SYM)s(?P[.,0-9]+)\s*%(CUR)s[%(BRAX)s]?\.?\s*$" % subst, + r"%(PLYR)s posts ante( of)? [%(BRAX)s]?%(CUR_SYM)s?(?P[.,0-9]+)\s*(%(CUR)s)?[%(BRAX)s]?\.?\s*$" % subst, re.MULTILINE) self.re_HeroCards = re.compile( r"Dealt to %(PLYR)s \[\s*(?P.+)\s*\]" % subst, diff --git a/pyfpdb/PokerStarsSummary.py b/pyfpdb/PokerStarsSummary.py index f512f0017..37c0229a2 100644 --- a/pyfpdb/PokerStarsSummary.py +++ b/pyfpdb/PokerStarsSummary.py @@ -42,6 +42,7 @@ class PokerStarsSummary(TourneySummary): '5 Card Omaha Hi/Lo' : ('hold', '5_omaha8'), '5 Card Omaha H/L' : ('hold', '5_omaha8'), '6 Card Omaha' : ('hold', '6_omahahi'), + '6 Card Omaha Hi/Lo' : ('hold', '6_omaha8'), 'Courchevel' : ('hold', 'cour_hi'), 'Courchevel Hi/Lo' : ('hold', 'cour_hilo'), 'Courchevel H/L' : ('hold', 'cour_hilo'), @@ -78,7 +79,7 @@ class PokerStarsSummary(TourneySummary): substitutions = { 'LEGAL_ISO' : "USD|EUR|GBP|CAD|FPP|SC|INR|CNY", # legal ISO currency codes - 'LS' : u"\$|\xe2\x82\xac|\u20AC||\£|\u20b9|\¥|" # legal currency symbols - Euro(cp1252, utf-8) + 'LS' : u"\$|\xe2\x82\xac|\u20AC||\£|\u20b9|\¥|Rs\.\s|" # legal currency symbols - Euro(cp1252, utf-8) } re_Identify = re.compile(u'((?PPokerStars|Full\sTilt|Run\sIt\sOnce\sPoker)\sTournament\s\#\d+|TOURNEYS:)') @@ -454,6 +455,7 @@ def parseSummaryFile(self): elif mg['CUR'] == u"€": targetCurrency="EUR" elif mg['CUR'] == u"£": targetCurrency="GBP" elif mg['CUR'] == u"₹": targetCurrency="INR" + elif mg['CUR'] == "Rs. ": targetCurrency="INR" elif mg['CUR'] == u"¥": targetCurrency="CNY" elif mg['CUR'] == "FPP": targetCurrency="PSFP" elif mg['CUR'] == "SC": targetCurrency="PSFP" @@ -462,6 +464,7 @@ def parseSummaryFile(self): elif mg['CURRENCY'] == u"€": self.buyinCurrency="EUR" elif mg['CURRENCY'] == u"£": self.buyinCurrency="GBP" elif mg['CURRENCY'] == u"₹": self.buyinCurrency="INR" + elif mg['CURRENCY'] == "Rs. ": self.buyinCurrency="INR" elif mg['CURRENCY'] == u"¥": self.buyinCurrency="CNY" elif mg['CURRENCY1'] == "FPP": self.buyinCurrency="PSFP" elif mg['CURRENCY1'] == "SC": self.buyinCurrency="PSFP" @@ -500,6 +503,7 @@ def parseSummaryFile(self): elif mg['CUR'] == u"€": self.currency="EUR" elif mg['CUR'] == u"£": self.currency="GBP" elif mg['CUR'] == u"₹": self.currency="INR" + elif mg['CUR'] == "Rs. ": self.currency="INR" elif mg['CUR'] == u"¥": self.currency="CNY" elif mg['CUR1'] == "FPP": self.currency="PSFP" elif mg['CUR1'] == "SC": self.currency="PSFP" diff --git a/pyfpdb/PokerStarsToFpdb.py b/pyfpdb/PokerStarsToFpdb.py index bea387b82..839a0fb23 100644 --- a/pyfpdb/PokerStarsToFpdb.py +++ b/pyfpdb/PokerStarsToFpdb.py @@ -2,17 +2,17 @@ # -*- coding: utf-8 -*- # # Copyright 2008-2011, Carl Gherardi -# +# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. -# +# # 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 General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA @@ -40,12 +40,12 @@ class PokerStars(HandHistoryConverter): sym = {'USD': "\$", 'CAD': "\$", 'T$': "", "EUR": "\xe2\x82\xac", "GBP": "\£", "play": "", "INR": "\₹", "CNY": "\¥"} # ADD Euro, Sterling, etc HERE substitutions = { 'LEGAL_ISO' : "USD|EUR|GBP|CAD|FPP|SC|INR|CNY", # legal ISO currency codes - 'LS' : u"\$|\xe2\x82\xac|\u20ac|\£|\u20b9|\¥|", # legal currency symbols - Euro(cp1252, utf-8) + 'LS' : u"\$|\xe2\x82\xac|\u20ac|\£|\u20b9|\¥|Rs\.\s|", # legal currency symbols - Euro(cp1252, utf-8) 'PLYR': r'\s?(?P<PNAME>.+?)', - 'CUR': u"(\$|\xe2\x82\xac|\u20ac||\£|\u20b9|\¥|)", + 'CUR': u"(\$|\xe2\x82\xac|\u20ac||\£|\u20b9|\¥|Rs\.\s|)", 'BRKTS': r'(\(button\) |\(small blind\) |\(big blind\) |\(button blind\) |\(button\) \(small blind\) |\(small blind\) \(button\) |\(big blind\) \(button\) |\(small blind/button\) |\(button\) \(big blind\) )?', } - + # translations from captured groups to fpdb info strings Lim_Blinds = { '0.04': ('0.01', '0.02'), '0.08': ('0.02', '0.04'), '0.10': ('0.02', '0.05'), '0.20': ('0.05', '0.10'), @@ -78,30 +78,33 @@ class PokerStars(HandHistoryConverter): '40000.00': ('10000.00', '20000.00'),'40000': ('10000.00', '20000.00'), } - limits = { - 'No Limit':'nl', - 'NO LIMIT':'nl', - 'Pot Limit':'pl', - 'POT LIMIT':'pl', - 'Fixed Limit':'fl', - 'Limit':'fl', - 'LIMIT':'fl' , + limits = { + 'No Limit':'nl', + 'NO LIMIT':'nl', + 'Pot Limit':'pl', + 'POT LIMIT':'pl', + 'Fixed Limit':'fl', + 'Limit':'fl', + 'LIMIT':'fl' , 'Pot Limit Pre-Flop, No Limit Post-Flop': 'pn' } games = { # base, category "Hold'em" : ('hold','holdem'), - "HOLD'EM" : ('hold','holdem'), + "HOLD'EM" : ('hold','holdem'), "6+ Hold'em" : ('hold','6_holdem'), 'Omaha' : ('hold','omahahi'), 'OMAHA' : ('hold','omahahi'), 'Omaha Hi/Lo' : ('hold','omahahilo'), 'OMAHA HI/LO' : ('hold','omahahilo'), '5 Card Omaha' : ('hold', '5_omahahi'), + 'Omaha 5 Cards' : ('hold', '5_omahahi'), '5 Card Omaha Hi/Lo' : ('hold', '5_omaha8'), '6 Card Omaha' : ('hold', '6_omahahi'), + 'Omaha 6 Cards' : ('hold', '6_omahahi'), + '6 Card Omaha Hi/Lo' : ('hold', '6_omaha8'), 'Courchevel' : ('hold', 'cour_hi'), 'Courchevel Hi/Lo' : ('hold', 'cour_hilo'), - 'Razz' : ('stud','razz'), + 'Razz' : ('stud','razz'), 'RAZZ' : ('stud','razz'), '7 Card Stud' : ('stud','studhi'), '7 CARD STUD' : ('stud','studhi'), @@ -124,11 +127,11 @@ class PokerStars(HandHistoryConverter): 'Mixed Omaha': 'momaha', 'Triple Stud': '3stud' } # Legal mixed games - currencies = { u'€':'EUR', '$':'USD', '':'T$', u'£':'GBP', u'¥':'CNY', u'₹':'INR'} + currencies = { u'€':'EUR', '$':'USD', '':'T$', u'£':'GBP', u'¥':'CNY', u'₹':'INR', 'Rs. ':'INR'} # Static regexes re_GameInfo = re.compile(u""" - (?P<SITE>PokerStars|POKERSTARS|Hive\sPoker|Full\sTilt|PokerMaster|Run\sIt\sOnce\sPoker|BetOnline|PokerBros)(?P<TITLE>\sGame|\sHand|\sHome\sGame|\sHome\sGame\sHand|Game|\s(Zoom|Rush)\sHand|\sGAME)\s\#(?P<HID>[0-9]+):\s+ + (?P<SITE>PokerStars|POKERSTARS|Hive\sPoker|Full\sTilt|PokerMaster|Run\sIt\sOnce\sPoker|BetOnline|PokerBros|SupremaPoker|MPLPoker)(?P<TITLE>\sGame|\sHand|\sHome\sGame|\sHome\sGame\sHand|Game|\s(Zoom|Rush)\sHand|\sGAME)\s\#(?P<HID>[0-9]+):\s+ (\{.*\}\s+)?((?P<TOUR>((Zoom|Rush)\s)?(Tournament|TOURNAMENT))\s\# # open paren of tournament info (?P<TOURNO>\d+),\s(Table\s\#(?P<HIVETABLE>\d+),\s)? # here's how I plan to use LS @@ -138,11 +141,11 @@ class PokerStars(HandHistoryConverter): # close paren of tournament info (?P<MIXED>HORSE|8\-Game|8\-GAME|HOSE|Mixed\sOmaha\sH/L|Mixed\sHold\'em|Mixed\sPLH/PLO|Mixed\sNLH/PLO|Mixed\sOmaha|Triple\sStud)?\s?\(? (?P<SPLIT>Split)?\s? - (?P<GAME>Hold\'em|HOLD\'EM|Hold\'em|6\+\sHold\'em|Razz|RAZZ|7\sCard\sStud|7\sCARD\sSTUD|7\sCard\sStud\sHi/Lo|7\sCARD\sSTUD\sHI/LO|Omaha|OMAHA|Omaha\sHi/Lo|OMAHA\sHI/LO|Badugi|Triple\sDraw\s2\-7\sLowball|Single\sDraw\s2\-7\sLowball|5\sCard\sDraw|(5|6)\sCard\sOmaha(\sHi/Lo)?|Courchevel(\sHi/Lo)?)\s + (?P<GAME>Hold\'em|HOLD\'EM|Hold\'em|6\+\sHold\'em|Razz|RAZZ|7\sCard\sStud|7\sCARD\sSTUD|7\sCard\sStud\sHi/Lo|7\sCARD\sSTUD\sHI/LO|Omaha|OMAHA|Omaha\sHi/Lo|OMAHA\sHI/LO|Badugi|Triple\sDraw\s2\-7\sLowball|Single\sDraw\s2\-7\sLowball|5\sCard\sDraw|(5|6)\sCard\sOmaha(\sHi/Lo)?|Omaha\s(5|6)\sCards|Courchevel(\sHi/Lo)?)\s (?P<LIMIT>No\sLimit|NO\sLIMIT|Fixed\sLimit|Limit|LIMIT|Pot\sLimit|POT\sLIMIT|Pot\sLimit\sPre\-Flop,\sNo\sLimit\sPost\-Flop)\)?,?\s (-\s)? (?P<SHOOTOUT>Match.*,\s)? - ((Level|LEVEL)\s(?P<LEVEL>[IVXLC\d]+)\s)? + ((Level|LEVEL)\s((?P<LEVEL>[IVXLC\d]+)\s)?)? \(? # open paren of the stakes (?P<CURRENCY>%(LS)s|)? (ante\s\d+,\s)? @@ -150,7 +153,7 @@ class PokerStars(HandHistoryConverter): (?P<CAP>\s-\s[%(LS)s]?(?P<CAPAMT>[.0-9]+)\sCap\s-\s)? # Optional Cap part \s?(?P<ISO>%(LEGAL_ISO)s)? \) # close paren of the stakes - (?P<BLAH2>\s\[AAMS\sID:\s[A-Z0-9]+\])? # AAMS ID: in .it HH's + (?P<BLAH2>\s\[(ADM|AAMS)\sID:\s[A-Z0-9]+\])? # AAMS/ADM ID: in .it HH's \s-\s (?P<DATETIME>.*$) """ % substitutions, re.MULTILINE|re.VERBOSE) @@ -161,17 +164,18 @@ class PokerStars(HandHistoryConverter): \((%(LS)s)?(?P<CASH>[,.0-9]+)\sin\schips (,\s(%(LS)s)?(?P<BOUNTY>[,.0-9]+)\sbounty)? \) - (?P<SITOUT>\sis\ssitting\sout)?""" % substitutions, + (?P<SITOUT>\sis\ssitting\sout)?""" % substitutions, re.MULTILINE|re.VERBOSE) re_HandInfo = re.compile(""" - ^\s?Table\s(ID\s)?\'(?P<TABLE>.+?)\'\s + ^\s?Table\s(ID\s)?\'(?P<TABLE>.+?)\'(\(\d+\))?\s ((?P<MAX>\d+)-[Mm]ax\s)? (?P<PLAY>\(Play\sMoney\)\s)? - (Seat\s\#(?P<BUTTON>\d+)\sis\sthe\sbutton)?""", + (\(Real\sMoney\)\s)? + (Seat\s\#(?P<BUTTON>\d+)\sis\sthe\sbutton)?""", re.MULTILINE|re.VERBOSE) - re_Identify = re.compile(u'(PokerStars|POKERSTARS|Hive\sPoker|Full\sTilt|PokerMaster|Run\sIt\sOnce\sPoker|BetOnline|PokerBros)(\sGame|\sHand|\sHome\sGame|\sHome\sGame\sHand|Game|\s(Zoom|Rush)\sHand|\sGAME)\s\#\d+:') + re_Identify = re.compile(u'(PokerStars|POKERSTARS|Hive\sPoker|Full\sTilt|PokerMaster|Run\sIt\sOnce\sPoker|BetOnline|PokerBros|SupremaPoker|MPLPoker)(\sGame|\sHand|\sHome\sGame|\sHome\sGame\sHand|Game|\s(Zoom|Rush)\sHand|\sGAME)\s\#\d+:') re_SplitHands = re.compile('(?:\s?\n){2,}') re_TailSplitHands = re.compile('(\n\n\n+)') re_Button = re.compile('Seat #(?P<BUTTON>\d+) is the button', re.MULTILINE) @@ -218,7 +222,7 @@ class PokerStars(HandHistoryConverter): #JKuzja, vecenta split the $50 bounty for eliminating ODYSSES re_Bounty = re.compile(u"^%(PLYR)s (?P<SPLIT>split|wins) the %(CUR)s(?P<AMT>[,\.0-9]+) bounty for eliminating (?P<ELIMINATED>.+?)$" % substitutions, re.MULTILINE) #Amsterdam71 wins $19.90 for eliminating MuKoJla and their own bounty increases by $19.89 to $155.32 - #Amsterdam71 wins $4.60 for splitting the elimination of Frimble11 and their own bounty increases by $4.59 to $41.32 + #Amsterdam71 wins $4.60 for splitting the elimination of Frimble11 and their own bounty increases by $4.59 to $41.32 #Amsterdam71 wins the tournament and receives $230.36 - congratulations! re_Progressive = re.compile(u""" ^%(PLYR)s\swins\s%(CUR)s(?P<AMT>[,\.0-9]+)\s @@ -228,7 +232,7 @@ class PokerStars(HandHistoryConverter): re_Rake = re.compile(u""" Total\spot\s%(CUR)s(?P<POT>[,\.0-9]+)(.+?)?\s\|\sRake\s%(CUR)s(?P<RAKE>[,\.0-9]+)""" % substitutions, re.MULTILINE|re.VERBOSE) - + re_STP = re.compile(u""" STP\sadded:\s%(CUR)s(?P<AMOUNT>[,\.0-9]+)""" % substitutions, re.MULTILINE|re.VERBOSE) @@ -246,9 +250,9 @@ def compilePlayerRegexs(self, hand): if self.siteId == 26: self.re_HeroCards = re.compile(r"^Dealt to (?P<PNAME>(?![A-Z][a-z]+\s[A-Z]).+?)(?: \[(?P<OLDCARDS>.+?)\])?( \[(?P<NEWCARDS>.+?)\])" % subst, re.MULTILINE) self.re_ShownCards = re.compile("^Seat (?P<SEAT>[0-9]+): %(PLYR)s %(BRKTS)s(?P<SHOWED>showed|mucked) \[(?P<CARDS>.*)\]( and (lost|(won|collected) %(CUR)s(?P<POT>[,\.\d]+) with (?P<STRING>.+?))(,\sand\s(lost|won\s%(CUR)s[\.\d]+\swith\s(?P<STRING2>.*)))?)?$" % subst, re.MULTILINE) - else: + else: self.re_HeroCards = re.compile(r"^Dealt to %(PLYR)s(?: \[(?P<OLDCARDS>.+?)\])?( \[(?P<NEWCARDS>.+?)\])" % subst, re.MULTILINE) - self.re_ShownCards = re.compile("^Seat (?P<SEAT>[0-9]+): %(PLYR)s %(BRKTS)s(?P<SHOWED>showed|mucked) \[(?P<CARDS>.*)\]( and (lost|(won|collected) \(%(CUR)s(?P<POT>[,\.\d]+)\)) with (?P<STRING>.+?)(,\sand\s(won\s\(%(CUR)s[\.\d]+\)|lost)\swith\s(?P<STRING2>.*))?)?$" % subst, re.MULTILINE) + self.re_ShownCards = re.compile("^Seat (?P<SEAT>[0-9]+): %(PLYR)s %(BRKTS)s(?P<SHOWED>showed|mucked) \[(?P<CARDS>.*)\]( and (lost|(won|collected) \(%(CUR)s(?P<POT>[,\.\d]+)\)) with (?P<STRING>.+?)(,\sand\s(won\s\(%(CUR)s[\.\d]+\)|lost)\swith\s(?P<STRING2>.*))?)?$" % subst, re.MULTILINE) def readSupportedGames(self): return [["ring", "hold", "nl"], @@ -268,7 +272,7 @@ def readSupportedGames(self): ["tour", "hold", "pn"], ["tour", "stud", "fl"], - + ["tour", "draw", "fl"], ["tour", "draw", "pl"], ["tour", "draw", "nl"], @@ -319,7 +323,7 @@ def determineGameType(self, handText): if 'SITE' in mg: if mg['SITE'] == 'PokerMaster': self.sitename = "PokerMaster" - self.siteId = 25 + self.siteId = 25 m1 = self.re_HandInfo.search(handText,re.DOTALL) if m1 and '_5Cards_' in m1.group('TABLE'): info['category'] = '5_omahahi' @@ -332,14 +336,14 @@ def determineGameType(self, handText): elif mg['SITE'] == 'PokerBros': self.sitename = 'PokerBros' self.siteId = 29 - + if 'TOURNO' in mg and mg['TOURNO'] is None: info['type'] = 'ring' else: info['type'] = 'tour' if 'ZOOM' in mg['TOUR']: info['fast'] = True - + if info.get('currency') in ('T$', None) and info['type']=='ring': info['currency'] = 'play' @@ -354,7 +358,7 @@ def determineGameType(self, handText): raise FpdbParseError else: info['sb'] = str((Decimal(mg['SB'])/2).quantize(Decimal("0.01"))) - info['bb'] = str(Decimal(mg['SB']).quantize(Decimal("0.01"))) + info['bb'] = str(Decimal(mg['SB']).quantize(Decimal("0.01"))) return info @@ -362,7 +366,7 @@ def readHandInfo(self, hand): #First check if partial if hand.handText.count('*** SUMMARY ***')!=1: raise FpdbHandPartial(_("Hand is not cleanly split into pre and post Summary")) - + info = {} m = self.re_HandInfo.search(hand.handText,re.DOTALL) m2 = self.re_GameInfo.search(hand.handText) @@ -379,7 +383,7 @@ def readHandInfo(self, hand): if key == 'DATETIME': #2008/11/12 10:00:48 CET [2008/11/12 4:00:48 ET] # (both dates are parsed so ET date overrides the other) #2008/08/17 - 01:14:43 (ET) - #2008/09/07 06:23:14 ET + #2008/09/07 06:23:14 ET datetimestr = "2000/01/01 00:00:00" # default used if time not found if self.siteId == 26: m2 = self.re_DateTime2.finditer(info[key]) @@ -396,7 +400,7 @@ def readHandInfo(self, hand): #print " tz = ", tz, " datetime =", datetimestr hand.startTime = datetime.datetime.strptime(datetimestr, "%Y/%m/%d %H:%M:%S") # also timezone at end, e.g. " ET" hand.startTime = HandHistoryConverter.changeTimezone(hand.startTime, "ET", "UTC") - + if key == 'HID': hand.handid = info[key] if key == 'TOURNO' and info[key]!=None: @@ -424,6 +428,8 @@ def readHandInfo(self, hand): hand.buyinCurrency="EUR" elif info[key].find(u"₹")!=-1: hand.buyinCurrency="INR" + elif info[key].find("Rs. ")!=-1: + hand.buyinCurrency="INR" elif info[key].find(u"¥")!=-1: hand.buyinCurrency="CNY" elif info[key].find("FPP")!=-1: @@ -438,7 +444,7 @@ def readHandInfo(self, hand): raise FpdbParseError info['BIAMT'] = info['BIAMT'].strip(u'$€£FPPSC₹') - + if hand.buyinCurrency!="PSFP": if info['BOUNTY'] != None: # There is a bounty, Which means we need to switch BOUNTY and BIRAKE values @@ -467,7 +473,7 @@ def readHandInfo(self, hand): else: hand.isHomeGame = False if key == 'LEVEL': - hand.level = info[key] + hand.level = info[key] if key == 'SHOOTOUT' and info[key] != None: hand.isShootout = True if key == 'TABLE': @@ -482,13 +488,13 @@ def readHandInfo(self, hand): hand.buttonpos = info[key] if key == 'MAX' and info[key] != None: hand.maxseats = int(info[key]) - + if 'Zoom' in self.in_path or 'Rush' in self.in_path: (hand.gametype['fast'], hand.isFast) = (True, True) - + if self.re_Cancelled.search(hand.handText): raise FpdbHandPartial(_("Hand '%s' was cancelled.") % hand.handid) - + def readButton(self, hand): m = self.re_Button.search(hand.handText) if m: @@ -501,10 +507,10 @@ def readPlayerStacks(self, hand): m = self.re_PlayerInfo.finditer(pre) for a in m: hand.addPlayer( - int(a.group('SEAT')), - a.group('PNAME'), - self.clearMoneyString(a.group('CASH')), - None, + int(a.group('SEAT')), + a.group('PNAME'), + self.clearMoneyString(a.group('CASH')), + None, a.group('SITOUT'), self.clearMoneyString(a.group('BOUNTY')) ) @@ -512,7 +518,7 @@ def readPlayerStacks(self, hand): def markStreets(self, hand): # There is no marker between deal and draw in Stars single draw games - # this upsets the accounting, incorrectly sets handsPlayers.cardxx and + # this upsets the accounting, incorrectly sets handsPlayers.cardxx and # in consequence the mucked-display is incorrect. # Attempt to fix by inserting a DRAW marker into the hand text attribute @@ -536,7 +542,7 @@ def markStreets(self, hand): r"(\*\*\* FIRST FLOP \*\*\* (?P<FLOP1>\[(\S\S ?)?\S\S \S\S\].+(?=\*\*\* SECOND\sFLOP \*\*\*)|.+))?" r"(\*\*\* SECOND FLOP \*\*\* (?P<FLOP2>\[(\S\S ?)?\S\S \S\S\].+(?=\*\*\* FIRST\sTURN \*\*\*)|.+))?" r"(\*\*\* FIRST TURN \*\*\* \[\S\S \S\S \S\S] (?P<TURN1>\[\S\S\].+(?=\*\*\* SECOND TURN \*\*\*)|.+))?" - r"(\*\*\* SECOND TURN \*\*\* \[\S\S \S\S \S\S] (?P<TURN2>\[\S\S\].+(?=\*\*\* FIRST RIVER \*\*\*)|.+))?" + r"(\*\*\* SECOND TURN \*\*\* \[\S\S \S\S \S\S] (?P<TURN2>\[\S\S\].+(?=\*\*\* FIRST RIVER \*\*\*)|.+))?" r"(\*\*\* FIRST RIVER \*\*\* \[\S\S \S\S \S\S \S\S] (?P<RIVER1>\[\S\S\].+?(?=\*\*\* SECOND RIVER \*\*\*)|.+))?" r"(\*\*\* SECOND RIVER \*\*\* \[\S\S \S\S \S\S \S\S] (?P<RIVER2>\[\S\S\].+))?", hand.handText,re.DOTALL) elif hand.gametype['base'] in ("hold"): @@ -588,7 +594,7 @@ def readCommunityCards(self, hand, street): # street has been matched by markStr hand.setCommunityCards(street, m.group('CARDS').split(' ')) if street in ('FLOP1', 'TURN1', 'RIVER1', 'FLOP2', 'TURN2', 'RIVER2'): hand.runItTimes = 2 - + def readSTP(self, hand): #log.debug(_("read Splash the Pot")) m = self.re_STP.search(hand.handText) @@ -601,13 +607,13 @@ def readAntes(self, hand): for player in m: #~ logging.debug("hand.addAnte(%s,%s)" %(player.group('PNAME'), player.group('ANTE'))) hand.addAnte(player.group('PNAME'), self.clearMoneyString(player.group('ANTE'))) - + def readBringIn(self, hand): m = self.re_BringIn.search(hand.handText,re.DOTALL) if m: #~ logging.debug("readBringIn: %s for %s" %(m.group('PNAME'), m.group('BRINGIN'))) hand.addBringIn(m.group('PNAME'), self.clearMoneyString(m.group('BRINGIN'))) - + def readBlinds(self, hand): liveBlind = True for a in self.re_PostSB.finditer(hand.handText): @@ -688,7 +694,7 @@ def readAction(self, hand, street): if action.group('BETTO') is not None: hand.addRaiseTo( street, action.group('PNAME'), self.clearMoneyString(action.group('BETTO')) ) elif action.group('BET') is not None: - hand.addCallandRaise( street, action.group('PNAME'), self.clearMoneyString(action.group('BET')) ) + hand.addCallandRaise( street, action.group('PNAME'), self.clearMoneyString(action.group('BET')) ) elif action.group('ATYPE') == ' bets': hand.addBet( street, action.group('PNAME'), self.clearMoneyString(action.group('BET')) ) elif action.group('ATYPE') == ' discards': @@ -701,7 +707,7 @@ def readAction(self, hand, street): def readShowdownActions(self, hand): # TODO: pick up mucks also?? - for shows in self.re_ShowdownAction.finditer(hand.handText): + for shows in self.re_ShowdownAction.finditer(hand.handText): cards = shows.group('CARDS').split(' ') hand.addShownCards(cards, shows.group('PNAME')) @@ -718,10 +724,10 @@ def readTourneyResults(self, hand): koAmounts[a.group('PNAME')] += 100*Decimal(a.group('AMT')) hand.endBounty[a.group('PNAME')] = 100*Decimal(a.group('ENDAMT')) hand.isProgressive = True - + m = self.re_WinningRankOne.search(hand.handText) if m: winner = m.group('PNAME') - + if hand.koBounty > 0: for pname, amount in koAmounts.iteritems(): if pname == winner: @@ -741,7 +747,7 @@ def readTourneyResults(self, hand): else: if a.group('PNAME') not in hand.koCounts: hand.koCounts[a.group('PNAME')] = 0 - hand.koCounts[a.group('PNAME')] += 1 + hand.koCounts[a.group('PNAME')] += 1 def readCollectPot(self,hand): #Bovada walks are calculated incorrectly in converted PokerStars hands @@ -756,7 +762,7 @@ def readCollectPot(self,hand): bovadaUncalled_v1 = True has_sb = len([a[2] for a in hand.actions.get('BLINDSANTES') if a[1] == 'small blind']) > 0 adjustment = (Decimal(hand.bb) - Decimal(hand.sb)) if has_sb else Decimal(hand.bb) - blindsantes = sum([a[2] for a in hand.actions.get('BLINDSANTES')]) + blindsantes = sum([a[2] for a in hand.actions.get('BLINDSANTES')]) i=0 pre, post = hand.handText.split('*** SUMMARY ***') hand.cashedOut = self.re_CashedOut.search(pre) != None @@ -779,15 +785,19 @@ def readCollectPot(self,hand): hand.addCollectPot(player=m.group('PNAME'),pot=str(Decimal(pot)*2)) else: hand.addCollectPot(player=m.group('PNAME'),pot=pot) + if hand.cashedOut: + m = self.re_Rake.search(post) + if m: + hand.rake = Decimal(m.group('RAKE')) def readShownCards(self,hand): if self.siteId == 26: re_RevealedCards = re.compile(r"^Dealt to %(PLYR)s(?: \[(?P<OLDCARDS>.+?)\])?( \[(?P<NEWCARDS>.+?)\])" % self.substitutions, re.MULTILINE) m = re_RevealedCards.finditer(hand.handText) - for found in m: + for found in m: cards = found.group('NEWCARDS').split(' ') hand.addShownCards(cards=cards, player=found.group('PNAME'), shown=True, mucked=False) - + for m in self.re_ShownCards.finditer(hand.handText): if m.group('CARDS') is not None: cards = m.group('CARDS') @@ -802,7 +812,7 @@ def readShownCards(self,hand): #print "DEBUG: hand.addShownCards(%s, %s, %s, %s)" %(cards, m.group('PNAME'), shown, mucked) hand.addShownCards(cards=cards, player=m.group('PNAME'), shown=shown, mucked=mucked, string=string) - + @staticmethod def getTableTitleRe(type, table_name=None, tournament = None, table_number=None): diff --git a/pyfpdb/WinamaxToFpdb.py b/pyfpdb/WinamaxToFpdb.py index 2ce1cbed8..8673fe5a4 100644 --- a/pyfpdb/WinamaxToFpdb.py +++ b/pyfpdb/WinamaxToFpdb.py @@ -79,7 +79,7 @@ def my_f(*args, **kwds): # Static regexes # ***** End of hand R5-75443872-57 ***** - re_Identify = re.compile(u'Winamax\sPoker\s\-\s(CashGame|Go\sFast|Tournament\s\")') + re_Identify = re.compile(u'Winamax\sPoker\s\-\s(CashGame|Go\sFast|HOLD\-UP|Tournament\s\")') re_SplitHands = re.compile(r'\n\n') @@ -88,7 +88,7 @@ def my_f(*args, **kwds): # Table: 'Charenton-le-Pont' 9-max (real money) Seat #5 is the button re_HandInfo = re.compile(u""" \s*Winamax\sPoker\s-\s - (?P<RING>(CashGame|Go\sFast\s"[^"]+"))? + (?P<RING>(CashGame|Go\sFast\s"[^"]+"|HOLD\-UP\s"[^"]+"))? (?P<TOUR>Tournament\s (?P<TOURNAME>.+)?\s buyIn:\s(?P<BUYIN>(?P<BIAMT>[%(LS)s\d\,.]+)?(\s\+?\s|-)(?P<BIRAKE>[%(LS)s\d\,.]+)?\+?(?P<BOUNTY>[%(LS)s\d\.]+)?\s?(?P<TOUR_ISO>%(LEGAL_ISO)s)?|(?P<FREETICKET>[\sa-zA-Z]+))?\s diff --git a/pyfpdb/WinningToFpdb.py b/pyfpdb/WinningToFpdb.py index 7b43a9a85..402b5de65 100644 --- a/pyfpdb/WinningToFpdb.py +++ b/pyfpdb/WinningToFpdb.py @@ -72,7 +72,8 @@ class Winning(HandHistoryConverter): limits = { 'No Limit':'nl', 'Pot Limit':'pl', - 'Fixed Limit':'fl' + 'Fixed Limit':'fl', + 'All-in or Fold Limit':'al' } speeds = { 'Turbo': 'Turbo', @@ -149,6 +150,7 @@ class Winning(HandHistoryConverter): #Hand #78708209 - Omaha H/L(Fixed Limit) - $20.00/$40.00 - 2019/07/18 15:13:01 UTC #Hand #68217077 - Holdem(No Limit) - $0.05/$0.10 - 2019/06/28 02:38:17 UTC + #Hand #1916523972 - Omaha H/L (No Limit) - $3.00/$6.00 - 2023/11/02 13:08:56 UTC #Game Hand #80586589 - Tournament #11182752 - Holdem(No Limit) - Level 15 (250.00/500.00)- 2019/07/21 17:44:50 UTC #Game Hand #82980175 - Tournament #11212445 - Omaha H/L(Pot Limit) - Level 1 (250.00/500.00)- 2019/07/25 02:31:33 UTC #Game Hand #1296393662 - $5,000 GTD Tournament #27099516 - Holdem(No Limit) - Level 10 (3000.00/6000.00)- 2022/07/11 01:11:44 UTC @@ -160,7 +162,8 @@ class Winning(HandHistoryConverter): )? # close paren of tournament info (?P<GAME>Holdem|Omaha|Omaha\sH/L|7Stud|7Stud\sH/L|5Card\sOmaha|5Card\sOmaha\sH/L) - \((?P<LIMIT>No\sLimit|Fixed\sLimit|Pot\sLimit)\)\s\-\s + (\sReshuffle)?\s? + \((?P<LIMIT>No\sLimit|Fixed\sLimit|Pot\sLimit|All\-in\sor\sFold\sLimit)\)\s\-\s (Level\s(?P<LEVEL>[IVXLC\d]+)\s)? \(? # open paren of the stakes (?P<CURRENCY>%(LS)s|)? @@ -338,12 +341,14 @@ def readSupportedGames(self): ["ring", "hold", "nl"], ["ring", "hold", "fl"], ["ring", "hold", "pl"], + ["ring", "hold", "al"], ["ring", "stud", "fl"], ["tour", "hold", "nl"], ["tour", "hold", "fl"], ["tour", "hold", "pl"], + ["tour", "hold", "al"], ["tour", "stud", "fl"] ] diff --git a/pyfpdb/iPokerSummary.py b/pyfpdb/iPokerSummary.py index bf0a94fd9..16d902d97 100644 --- a/pyfpdb/iPokerSummary.py +++ b/pyfpdb/iPokerSummary.py @@ -28,11 +28,11 @@ class iPokerSummary(TourneySummary): substitutions = { - 'LS' : u"\$|\xe2\x82\xac|\xe2\u201a\xac|\u20ac|\xc2\xa3|\£|RSD|", + 'LS' : u"\$|\xe2\x82\xac|\xe2\u201a\xac|\u20ac|\xc2\xa3|\£|RSD|kr|", 'PLYR': r'(?P<PNAME>[^"]+)', - 'NUM' : r'.,0-9', + 'NUM' : r'.,0-9\s', } - currencies = { u'€':'EUR', '$':'USD', '':'T$', u'£':'GBP', 'RSD': 'RSD'} + currencies = { u'€':'EUR', '$':'USD', '':'T$', u'£':'GBP', 'RSD': 'RSD', 'kr': 'SEK'} months = { 'Jan':1, 'Feb':2, 'Mar':3, 'Apr':4, 'May':5, 'Jun':6, 'Jul':7, 'Aug':8, 'Sep':9, 'Oct':10, 'Nov':11, 'Dec':12} @@ -50,17 +50,19 @@ class iPokerSummary(TourneySummary): games = { # base, category '7 Card Stud' : ('stud','studhi'), '7 Card Stud Hi-Lo' : ('stud','studhilo'), + '7 Card Stud HiLow' : ('stud','studhilo'), '5 Card Stud' : ('stud','5_studhi'), 'Holdem' : ('hold','holdem'), 'Six Plus Holdem' : ('hold','6_holdem'), 'Omaha' : ('hold','omahahi'), 'Omaha Hi-Lo' : ('hold','omahahilo'), + 'Omaha HiLow' : ('hold','omahahilo'), } re_Identify = re.compile(u'<game\sgamecode=') re_GameType = re.compile(ur""" - <gametype>(?P<GAME>((?P<CATEGORY>(5|7)\sCard\sStud(\sHi\-Lo)?|(Six\sPlus\s)?Holdem|Omaha(\sHi\-Lo)?)?\s?(?P<LIMIT>NL|SL|L|LZ|PL|БЛ|LP|No\slimit|Pot\slimit|Limit))|LH\s(?P<LSB>[%(NUM)s]+)(%(LS)s)?/(?P<LBB>[%(NUM)s]+)(%(LS)s)?.+?) + <gametype>(?P<GAME>((?P<CATEGORY>(5|7)\sCard\sStud(\sHi\-Lo)?(\sHiLow)?|(Six\sPlus\s)?Holdem|Omaha(\sHi\-Lo)?(\sHiLow)?)?\s?(?P<LIMIT>NL|SL|L|LZ|PL|БЛ|LP|No\slimit|Pot\slimit|Limit))|LH\s(?P<LSB>[%(NUM)s]+)(%(LS)s)?/(?P<LBB>[%(NUM)s]+)(%(LS)s)?.+?) (\s(%(LS)s)?(?P<SB>[%(NUM)s]+)(%(LS)s)?/(%(LS)s)?(?P<BB>[%(NUM)s]+))?(%(LS)s)?(\sAnte\s(%(LS)s)?(?P<ANTE>[%(NUM)s]+)(%(LS)s)?)?</gametype>\s+? <tablename>(?P<TABLE>.+)?</tablename>\s+? (<(tablecurrency|tournamentcurrency)>.*</(tablecurrency|tournamentcurrency)>\s+?)? diff --git a/pyfpdb/iPokerToFpdb.py b/pyfpdb/iPokerToFpdb.py index 1bfd00141..4d25526f6 100644 --- a/pyfpdb/iPokerToFpdb.py +++ b/pyfpdb/iPokerToFpdb.py @@ -58,9 +58,9 @@ class iPoker(HandHistoryConverter): summaryInFile = True substitutions = { - 'LS' : u"\$|\xe2\x82\xac|\xe2\u201a\xac|\u20ac|\xc2\xa3|\£|RSD|", + 'LS' : u"\$|\xe2\x82\xac|\xe2\u201a\xac|\u20ac|\xc2\xa3|\£|RSD|kr|", 'PLYR': r'(?P<PNAME>[^"]+)', - 'NUM' : r'.,\d', + 'NUM' : r'.,\d\s', } limits = { 'No limit':'nl', 'Pot limit':'pl', @@ -76,14 +76,16 @@ class iPoker(HandHistoryConverter): games = { # base, category '7 Card Stud' : ('stud','studhi'), '7 Card Stud Hi-Lo' : ('stud','studhilo'), + '7 Card Stud HiLow' : ('stud','studhilo'), '5 Card Stud' : ('stud','5_studhi'), 'Holdem' : ('hold','holdem'), 'Six Plus Holdem' : ('hold','6_holdem'), 'Omaha' : ('hold','omahahi'), 'Omaha Hi-Lo' : ('hold','omahahilo'), + 'Omaha HiLow' : ('hold','omahahilo'), } - currencies = { u'€':'EUR', '$':'USD', '':'T$', u'£':'GBP', 'RSD': 'RSD'} + currencies = { u'€':'EUR', '$':'USD', '':'T$', u'£':'GBP', 'RSD': 'RSD', 'kr': 'SEK'} # translations from captured groups to fpdb info strings Lim_Blinds = { '0.04': ('0.01', '0.02'), '0.08': ('0.02', '0.04'), @@ -143,7 +145,7 @@ class iPoker(HandHistoryConverter): re_SplitHands = re.compile(r'</game>') re_TailSplitHands = re.compile(r'(</game>)') re_GameInfo = re.compile(ur""" - <gametype>(?P<GAME>((?P<CATEGORY>(5|7)\sCard\sStud(\sHi\-Lo)?|(Six\sPlus\s)?Holdem|Omaha(\sHi\-Lo)?)?\s?(?P<LIMIT>NL|SL|L|LZ|PL|БЛ|LP|No\slimit|Pot\slimit|Limit))|LH\s(?P<LSB>[%(NUM)s]+)(%(LS)s)?/(?P<LBB>[%(NUM)s]+)(%(LS)s)?.+?) + <gametype>(?P<GAME>((?P<CATEGORY>(5|7)\sCard\sStud(\sHi\-Lo)?(\sHiLow)?|(Six\sPlus\s)?Holdem|Omaha(\sHi\-Lo)?(\sHiLow)?)?\s?(?P<LIMIT>NL|SL|L|LZ|PL|БЛ|LP|No\slimit|Pot\slimit|Limit))|LH\s(?P<LSB>[%(NUM)s]+)(%(LS)s)?/(?P<LBB>[%(NUM)s]+)(%(LS)s)?.+?) (\s(%(LS)s)?(?P<SB>[%(NUM)s]+)(%(LS)s)?/(%(LS)s)?(?P<BB>[%(NUM)s]+))?(%(LS)s)?(\sAnte\s(%(LS)s)?(?P<ANTE>[%(NUM)s]+)(%(LS)s)?)?</gametype>\s+? <tablename>(?P<TABLE>.+)?</tablename>\s+? (<(tablecurrency|tournamentcurrency)>(?P<TABLECURRENCY>.*)</(tablecurrency|tournamentcurrency)>\s+?)? diff --git a/pyfpdb/regression-test-files/cash/KingsClub/Flop/AOF-PLO-USD-100-200-202308.txt b/pyfpdb/regression-test-files/cash/KingsClub/Flop/AOF-PLO-USD-100-200-202308.txt new file mode 100644 index 000000000..59be5a0f2 --- /dev/null +++ b/pyfpdb/regression-test-files/cash/KingsClub/Flop/AOF-PLO-USD-100-200-202308.txt @@ -0,0 +1,25 @@ +#7071017: Pot Limit Omaha - 100/200 +2023-08-14 02:22:40 +Table 'MAD AOF PLO' Seat 3 is the button +Seat 1: Nich B (1,000) +Seat 2: Christo A. (1,000) +Seat 3: Brian Str (1,000) +Nich B: posts the small blind 100 +Christo A.: posts the big blind 200 +*** HOLE CARDS *** +Dealt to Nich B: [9c 9d Kh Jh] +Dealt to Christo A.: [X X X X] +Dealt to Brian Str: [X X X X] +*** FLOP *** [Ah Qd Tc] +Brian Str folds +Nich B raises to 1,000, and is all in +Christo A. calls 1,000, and is all in +Nich B shows [9c 9d Kh Jh] +Christo A. shows [Qh Kd As 9s] +*** RIVER *** [Ah Qd Tc Qs] [8c] +*** SUMMARY * ** +Seat 1: Nich B (0) -1,000 +Seat 2: Christo A. (1,992) +992 +Seat 3: Brian Str (1,000) +Rake 8 +Christo A. wins pot (1,992) \ No newline at end of file diff --git a/pyfpdb/regression-test-files/cash/KingsClub/Flop/AOF-PLO-USD-150-300-202310.RIT.txt b/pyfpdb/regression-test-files/cash/KingsClub/Flop/AOF-PLO-USD-150-300-202310.RIT.txt new file mode 100644 index 000000000..1494a311f --- /dev/null +++ b/pyfpdb/regression-test-files/cash/KingsClub/Flop/AOF-PLO-USD-150-300-202310.RIT.txt @@ -0,0 +1,34 @@ +#7851383: Pot Limit Omaha - 150/300 +2023-10-07 03:04:57 +Table 'MAD AOF PLO HighCAP 4' Seat 1 is the button +Seat 1: Player0 (2,000) +Seat 2: Player1 (2,000) +Seat 3: Hero (2,000) +Seat 4: Player2 (2,000) +Player0: posts ante 50 +Player1: posts ante 50 +Hero: posts ante 50 +Player2: posts ante 50 +Player1: posts the small blind 150 +Hero: posts the big blind 300 +*** HOLE CARDS *** +Dealt to Player0: [X X X X] +Dealt to Player1: [X X X X] +Dealt to Hero: [Jh 7c Qh 6h] +Dealt to Player2: [X X X X] +*** FLOP *** [Qs 4c Js] +Player2 raises to 1,950, and is all in +Player0 folds +Player1 folds +Hero calls 1,950, and is all in +Hero shows [Jh 7c Qh 6h] +Player2 shows [4d 9s 3s 5c] +*** BOARD 1 - RIVER *** [Qs 4c Js 2s] [3c] +*** BOARD 2 - RIVER *** [- - - 6s] [8d] +*** SUMMARY * ** +Seat 1: Player0 (1,950) -50 +Seat 2: Player1 (1,800) -200 +Seat 3: Hero (0) -2,000 +Seat 4: Player2 (4,229) +2,229 +Rake 21 +Player2 wins pot (4,229) \ No newline at end of file diff --git a/pyfpdb/regression-test-files/cash/KingsClub/Flop/PLO-USD-100-200-202401.bad.RIT.txt b/pyfpdb/regression-test-files/cash/KingsClub/Flop/PLO-USD-100-200-202401.bad.RIT.txt new file mode 100644 index 000000000..7ad7fa233 --- /dev/null +++ b/pyfpdb/regression-test-files/cash/KingsClub/Flop/PLO-USD-100-200-202401.bad.RIT.txt @@ -0,0 +1,36 @@ +#8777161: Pot Limit Omaha - 100/200 +2024-01-30 01:52:43 +Table '8 game mix' Seat 3 is the button +Seat 2: Player0 (2,492) +Seat 3: Player1 (8,000) +Seat 4: Hero (8,000) +Player0: posts ante 60 +Player1: posts ante 60 +Hero: posts ante 60 +Hero: posts the small blind 100 +Player0: posts the big blind 200 +*** HOLE CARDS *** +Dealt to Player0: [X X X X] +Dealt to Player1: [X X X X] +Dealt to Hero: [7c 6c 5h Jd] +Player1 folds +Hero calls 200 +Player0 checks +*** FLOP *** [8d Ts 4d] +Hero bets 396.20 +Player0 calls 396.20 +*** TURN *** [8d Ts 4d] [9h] +Hero bets 1,358.40 +Player0 raises to 1,835.80, and is all in +Hero calls 1,835.80 +Player0 shows [Kd Qc 6s Jc] +Hero shows [7c 6c 5h Jd] +*** RIVER *** [8d Ts 4d 9h] [Jh] +*** BOARD 1 - RIVER *** [8d Ts 4d 9h] [Jh] +*** BOARD 2 - RIVER *** [- - - -] [Js] +*** SUMMARY * ** +Seat 2: Player0 (5,030) +2,538 +Seat 3: Player1 (7,940) -60 +Seat 4: Hero (5,508) -2,492 +Rake 14 +Player0 wins pot (5,030) \ No newline at end of file diff --git a/pyfpdb/regression-test-files/cash/KingsClub/Stud/7-Stud-USD-400-800-202401.bad.award.txt b/pyfpdb/regression-test-files/cash/KingsClub/Stud/7-Stud-USD-400-800-202401.bad.award.txt new file mode 100644 index 000000000..e83c4f6f6 --- /dev/null +++ b/pyfpdb/regression-test-files/cash/KingsClub/Stud/7-Stud-USD-400-800-202401.bad.award.txt @@ -0,0 +1,56 @@ +#8776891: Limit Seven Card Stud - 400/800 +2024-01-30 01:10:22 +Table '8 game mix' +Seat 2: Player0 (691) +Seat 3: Player1 (6,400) +Seat 4: Hero (8,000) +Seat 7: Player2 (16,872) +Player0: posts ante 100 +Player1: posts ante 100 +Hero: posts ante 100 +Player2: posts ante 100 +*** 3RD STREET *** +Dealt to Player0: [X X 4s] +Dealt to Player1: [X X 9s] +Dealt to Hero: [Qh Ac Jc] +Dealt to Player2: [X X 8h] +Player0 brings in for 100 +Player1 folds +Hero bets 400 +Player2 raises to 800 +Player0 calls 591, and is all in +Hero calls 800 +*** 4TH STREET *** +Dealt to Player0: [Td] +Dealt to Hero: [7d] +Dealt to Player2: [Jd] +Player2 bets 400 +Hero calls 400 +*** 5TH STREET *** +Dealt to Player0: [4c] +Dealt to Hero: [5c] +Dealt to Player2: [Tc] +Hero checks +Player2 bets 800 +Hero calls 800 +*** 6TH STREET *** +Dealt to Player0: [2s] +Dealt to Hero: [As] +Dealt to Player2: [8c] +Player2 bets 800 +Hero calls 800 +*** 7TH STREET *** +Dealt to Player0: [X] +Dealt to Hero: [3s] +Dealt to Player2: [X] +Player2 bets 800 +Hero folds +Player2 shows [6h 7c 8h Jd Tc 8c Th] +Player0 shows [4h 9c 4s Td 4c 2s Ts] +*** SUMMARY * ** +Seat 2: Player0 (2,153) +1,462 +Seat 3: Player1 (6,300) -100 +Seat 4: Hero (5,100) -2,900 +Seat 7: Player2 (18,390) +1,518 +Rake 20 +Player0 wins pot (2,153) \ No newline at end of file diff --git a/pyfpdb/regression-test-files/cash/PacificPoker/Flop/888-NLH-USD-0.02-0.05-202306.uncalled.fixed.txt b/pyfpdb/regression-test-files/cash/PacificPoker/Flop/888-NLH-USD-0.02-0.05-202306.uncalled.fixed.txt new file mode 100644 index 000000000..71f95045a --- /dev/null +++ b/pyfpdb/regression-test-files/cash/PacificPoker/Flop/888-NLH-USD-0.02-0.05-202306.uncalled.fixed.txt @@ -0,0 +1,24 @@ +#Game No : 678485555 +***** 888poker Snap Poker Hand History for Game 678485555 ***** +$0.02/$0.05 Blinds No Limit Holdem - *** 27 06 2023 12:02:42 +Table Kazan 6 Max (Real Money) +Seat 4 is the button +Total number of players : 6 +Seat 1: Player9 ( $2.02 ) +Seat 2: Player8 ( $1.55 ) +Seat 4: Player7 ( $5 ) +Seat 6: Hero ( $5.74 ) +Seat 7: Player6 ( $3.52 ) +Seat 9: Player5 ( $3.62 ) +Hero posts small blind [$0.02] +Player6 posts big blind [$0.05] +** Dealing down cards ** +Dealt to Hero [ 6d, 5c ] +Player5 folds +Player9 folds +Player8 folds +Player7 folds +Hero folds +** Summary ** +Player6 did not show his hand +Player6 collected [ $0.04 ] \ No newline at end of file diff --git a/pyfpdb/regression-test-files/cash/Stars/Flop/5-Card-PLO-6max-INR-100-200-202310.MPLPoker.txt b/pyfpdb/regression-test-files/cash/Stars/Flop/5-Card-PLO-6max-INR-100-200-202310.MPLPoker.txt new file mode 100644 index 000000000..2c04cf78f --- /dev/null +++ b/pyfpdb/regression-test-files/cash/Stars/Flop/5-Card-PLO-6max-INR-100-200-202310.MPLPoker.txt @@ -0,0 +1,22 @@ +MPLPoker Hand #4227871731: Omaha 5 Cards Pot Limit (₹100/₹200) - 2023/10/17 22:39:01 UTC +Table 'PLO5 100/200 RIT #7'(1941903751) 6-max (Real Money) Seat #1 is the button +Seat 1: Player0 (₹8,946.98 in chips) +Seat 4: Hero (₹20,000 in chips) +Player0: posts small blind ₹100 +Hero: posts big blind ₹200 +*** HOLE CARDS *** +Dealt to Hero [2s 6d 7s Kh 3h] +Player0: calls ₹100 +Hero: checks +*** FLOP *** [Ah 2d Th] +Hero: bets ₹300 +Player0: folds +Uncalled bet (₹300) returned to Hero +*** SHOW DOWN *** +Hero: doesn't show hand +Hero collected ₹400 from pot +*** SUMMARY *** +Total pot ₹400 | Rake ₹15.35 +Board [Ah 2d Th] +Seat 1: Player0 (button) (small blind) folded on the Flop +Seat 4: Hero (big blind) collected (₹400) \ No newline at end of file diff --git a/pyfpdb/regression-test-files/cash/Stars/Flop/6-Card-PLO8-6max-USD-2.00-4.00-202310.txt b/pyfpdb/regression-test-files/cash/Stars/Flop/6-Card-PLO8-6max-USD-2.00-4.00-202310.txt new file mode 100644 index 000000000..09f4bbef3 --- /dev/null +++ b/pyfpdb/regression-test-files/cash/Stars/Flop/6-Card-PLO8-6max-USD-2.00-4.00-202310.txt @@ -0,0 +1,37 @@ +PokerMaster Hand #201579300118: 6 Card Omaha Hi/Lo Pot Limit ($2/$4 USD) - 2023/10/03 09:07:54 UTC +Table 'dv0hp 31011613' 6-max Seat #2 is the button +Seat 1: Player0 ($1141 in chips) +Seat 2: Player1 ($1252 in chips) +Seat 4: Player2 ($928 in chips) +Seat 6: Player3 ($1213 in chips) +# {"gt":"PLO6HL","tn":"dv0hp 31011613","tid":1696313564782,"pn":{"0":"Disaster Call","1":"JUICY","3":"Chris Palmer","5":"B🏀🏀kie"},"pids":{"0":7044636183970884691,"1":5707228074119767200,"3":2759167385187450845,"5":2020603134989480303},"hwnd":1053506,"hbcName":"Cooler Central","room":"Prr","ownerClubCode":"dv0hp","pc":{"0":"3XX3S","1":"2QHQC","3":"H3S9T","5":"EW828"}} +Player2: posts small blind $2 +Player3: posts big blind $4 +*** HOLE CARDS *** +Player0: raises $10 to $14 +Player1: folds +Player2: calls $12 +Player3: calls $10 +*** FLOP *** [Qd 6d Jd] +Player2: checks +Player3: checks +Player0: checks +*** TURN *** [Qd 6d Jd] [3s] +Player2: checks +Player3: checks +Player0: checks +*** RIVER *** [Qd 6d Jd 3s] [3h] +Player2: checks +Player3: checks +Player0: checks +*** SHOW DOWN *** +Player2: shows [As Ts Tc 9h 6h 5d] +Player3: shows [Kh Kc 9s 7h 4h 3c] +Player3 collected $41 from pot +*** SUMMARY *** +Total pot $42 | Rake $1 +Board [Qd 6d Jd 3s 3h] +Seat 1: Player0 mucked +Seat 2: Player1 (button) folded before Flop (didn't bet) +Seat 4: Player2 (small blind) showed [As Ts Tc 9h 6h 5d] and lost with XZ +Seat 6: Player3 (big blind) showed [Kh Kc 9s 7h 4h 3c] and won ($41) with XZ \ No newline at end of file diff --git a/pyfpdb/regression-test-files/cash/Stars/Flop/NLHE-6max-INR-1-2-202306.new.symbol.txt b/pyfpdb/regression-test-files/cash/Stars/Flop/NLHE-6max-INR-1-2-202306.new.symbol.txt new file mode 100644 index 000000000..c953381ce --- /dev/null +++ b/pyfpdb/regression-test-files/cash/Stars/Flop/NLHE-6max-INR-1-2-202306.new.symbol.txt @@ -0,0 +1,40 @@ +PokerStars Hand #244265880496: Hold'em No Limit (Rs. 1/Rs. 2 INR) - 2023/06/14 20:33:40 IST [2023/06/14 11:03:40 ET] +Table 'Moguntia' 6-max Seat #5 is the button +Seat 1: Player0 (Rs. 155.47 in chips) +Seat 2: Player1 (Rs. 234.15 in chips) +Seat 3: Player2 (Rs. 602.39 in chips) +Seat 5: Hero (Rs. 202 in chips) +Seat 6: Player3 (Rs. 224.21 in chips) +Player3: posts small blind Rs. 1 +Player0: posts big blind Rs. 2 +*** HOLE CARDS *** +Dealt to Hero [Ac Qd] +Player1: calls Rs. 2 +Player2: folds +Hero: raises Rs. 10 to Rs. 12 +Player3: calls Rs. 11 +Player0: folds +Player1: folds +*** FLOP *** [Ad 8d Qh] +Player3: checks +Hero: bets Rs. 18 +Player3: calls Rs. 18 +*** TURN *** [Ad 8d Qh] [Kc] +Player3: checks +Hero: bets Rs. 48 +Player3: raises Rs. 146.21 to Rs. 194.21 and is all-in +Hero: calls Rs. 124 and is all-in +Uncalled bet (Rs. 22.21) returned to Player3 +*** RIVER *** [Ad 8d Qh Kc] [Ks] +*** SHOW DOWN *** +Player3: shows [Th Jh] (a straight, Ten to Ace) +Hero: shows [Ac Qd] (two pair, Aces and Kings) +Player3 collected Rs. 387.60 from pot +*** SUMMARY *** +Total pot Rs. 408 | Rake Rs. 20.40 +Board [Ad 8d Qh Kc Ks] +Seat 1: Player0 (big blind) folded before Flop +Seat 2: Player1 folded before Flop +Seat 3: Player2 folded before Flop (didn't bet) +Seat 5: Hero (button) showed [Ac Qd] and lost with two pair, Aces and Kings +Seat 6: Player3 (small blind) showed [Th Jh] and won (Rs. 387.60) with a straight, Ten to Ace \ No newline at end of file diff --git a/pyfpdb/regression-test-files/cash/Stars/Flop/NLHE-6max-INR-50-100-202310.MPLPoker.txt b/pyfpdb/regression-test-files/cash/Stars/Flop/NLHE-6max-INR-50-100-202310.MPLPoker.txt new file mode 100644 index 000000000..65c3936be --- /dev/null +++ b/pyfpdb/regression-test-files/cash/Stars/Flop/NLHE-6max-INR-50-100-202310.MPLPoker.txt @@ -0,0 +1,41 @@ +MPLPoker Hand #4227510401: Hold'em No Limit (₹50/₹100) - 2023/10/17 10:36:50 UTC +Table 'NLH 50/100 #31'(1941947783) 6-max (Real Money) Seat #6 is the button +Seat 1: Player0 (₹10,274.40 in chips) +Seat 2: Hero (₹10,000 in chips) +Seat 3: Player1 (₹9,433.91 in chips) +Seat 4: Player2 (₹7,313.75 in chips) +Seat 5: Player3 (₹23,639.03 in chips) +Seat 6: Player4 (₹9,600.18 in chips) +Player0: posts small blind ₹50 +Hero: posts big blind ₹100 +*** HOLE CARDS *** +Dealt to Hero [Ah 8d] +Player1: folds +Player2: folds +Player3: folds +Player4: raises ₹200 to ₹200 +Player0: folds +Hero: calls ₹100 +*** FLOP *** [6s 2c Jc] +Hero: checks +Player4: checks +*** TURN *** [6s 2c Jc] [Ad] +Hero: checks +Player4: bets ₹300 +Hero: calls ₹300 +*** RIVER *** [6s 2c Jc Ad] [Jh] +Hero: checks +Player4: checks +*** SHOW DOWN *** +Hero: shows [Ah 8d] (two pair, Aces and Jacks) +Player4: mucks hand +Hero collected ₹1,050 from pot +*** SUMMARY *** +Total pot ₹1,050 | Rake ₹53.76 +Board [6s 2c Jc Ad Jh] +Seat 1: Player0 (small blind) folded before Flop +Seat 2: Hero (big blind) showed [Ah 8d] and won (₹1,050) with two pair, Aces and Jacks +Seat 3: Player1 folded before Flop (didn't bet) +Seat 4: Player2 folded before Flop (didn't bet) +Seat 5: Player3 folded before Flop (didn't bet) +Seat 6: Player4 (button) mucked \ No newline at end of file diff --git a/pyfpdb/regression-test-files/cash/Stars/Flop/PLO-2max-USD-2.50-5.00-202310.bad.flop.txt b/pyfpdb/regression-test-files/cash/Stars/Flop/PLO-2max-USD-2.50-5.00-202310.bad.flop.txt new file mode 100644 index 000000000..eced43c2b --- /dev/null +++ b/pyfpdb/regression-test-files/cash/Stars/Flop/PLO-2max-USD-2.50-5.00-202310.bad.flop.txt @@ -0,0 +1,31 @@ +PokerStars Zoom Hand #246328968504: Omaha Pot Limit ($2.50/$5.00) - 2023/10/03 18:42:51 CET [2023/10/03 12:42:51 ET] +Table 'Phi Piscium' 2-max Seat #1 is the button +Seat 1: Player0 ($416.76 in chips) +Seat 2: Hero ($667.55 in chips) +Player0: posts small blind $2.50 +Hero: posts big blind $5 +*** HOLE CARDS *** +Dealt to Hero [Qh Ks 8h As] +Player0: calls $2.50 +Hero: raises $10 to $15 +Player0: calls $10 +*** FLOP *** [Qh Ks 8h As] +Hero is disconnected +Hero has timed out +Hero: checks +Player0: checks +*** TURN *** [Qh Ks 8h As] [Qd] +Hero: bets $9.41 +Player0: calls $9.41 +*** RIVER *** [Qh Ks 8h As Qd] [8d] +Hero: checks +Player0: checks +*** SHOW DOWN *** +Hero: shows [Qh Ks 8h As] (a full house, Queens full of Eights) +Player0: mucks hand +Hero collected $47.32 from pot +*** SUMMARY *** +Total pot $48.82 | Rake $1.50 +Board [7s 4h Qc Qd 8d] +Seat 1: Player0 (button) (small blind) mucked [2h 3c Js Kc] +Seat 2: Hero (big blind) showed [Qh Ks 8h As] and won ($47.32) with a full house, Queens full of Eights \ No newline at end of file diff --git a/pyfpdb/regression-test-files/cash/Winamax/Flop/NLHE-6max-EUR-0.01-0.02-202309.HOLD.UP.txt b/pyfpdb/regression-test-files/cash/Winamax/Flop/NLHE-6max-EUR-0.01-0.02-202309.HOLD.UP.txt new file mode 100644 index 000000000..23775dff2 --- /dev/null +++ b/pyfpdb/regression-test-files/cash/Winamax/Flop/NLHE-6max-EUR-0.01-0.02-202309.HOLD.UP.txt @@ -0,0 +1,40 @@ +Winamax Poker - HOLD-UP "Colorado" - HandId: #18802718-2083747-1694790950 - Holdem no limit (0.01€/0.02€) - 2023/09/15 15:15:50 UTC +Table: 'Colorado' 6-max (real money) Seat #6 is the button +Seat 1: Hero (2.02€) +Seat 2: Player0 (2€) +Seat 3: Player1 (2€) +Seat 4: Player2 (1.70€) +Seat 5: Player3 (2.21€) +Seat 6: Player4 (2.33€) +*** ANTE/BLINDS *** +Hero posts small blind 0.01€ +Player0 posts big blind 0.02€ +Dealt to Hero [Ah 5h] +*** PRE-FLOP *** +Player1 folds +Player2 folds +Player3 folds +Player4 raises 0.04€ to 0.06€ +Hero raises 0.18€ to 0.24€ +Player0 folds +Player4 calls 0.18€ +*** FLOP *** [Ad 7d 6h] +Hero bets 0.18€ +Player4 calls 0.18€ +*** TURN *** [Ad 7d 6h][Jc] +Hero checks +Player4 bets 0.30€ +Hero calls 0.30€ +*** RIVER *** [Ad 7d 6h Jc][Qc] +Hero checks +Player4 bets 0.95€ +Hero calls 0.95€ +*** SHOW DOWN *** +Player4 shows [Kh 2h] (High card : Ace) +Hero shows [Ah 5h] (One pair : Aces) +Hero collected 3.02€ from pot +*** SUMMARY *** +Total pot 3.02€ | Rake 0.34€ +Board: [Ad 7d 6h Jc Qc] +Seat 1: Hero (small blind) showed [Ah 5h] and won 3.02€ with One pair : Aces +Seat 6: Player4 (button) showed [Kh 2h] and lost with High card : Ace \ No newline at end of file diff --git a/pyfpdb/regression-test-files/cash/Winning/Flop/5Card-PLO-4max-USD-10-20-202311.Reshuffle.txt b/pyfpdb/regression-test-files/cash/Winning/Flop/5Card-PLO-4max-USD-10-20-202311.Reshuffle.txt new file mode 100644 index 000000000..c50b5ce05 --- /dev/null +++ b/pyfpdb/regression-test-files/cash/Winning/Flop/5Card-PLO-4max-USD-10-20-202311.Reshuffle.txt @@ -0,0 +1,22 @@ +Hand #1917987732 - 5Card Omaha Reshuffle (Pot Limit) - $10.00/$20.00 - 2023/11/03 20:57:05 UTC +Olympia Fields 4-max Seat #4 is the button +Seat 1: Player0 ($5556.08) +Seat 2: Hero ($800.00) +Seat 3: Player1 ($2242.37) +Seat 4: Player2 ($2771.23) +Player0 posts the small blind $10.00 +Hero posts the big blind $20.00 +*** HOLE CARDS *** +Player1 folds +Player2 raises $70.00 to $70.00 +Player0 folds +Dealt to Hero [Jc 7h Kh 6h Kd] +Hero folds +Uncalled bet ($50.00) returned to Player2 +Player2 does not show +*** SUMMARY *** +Total pot $50.00 +Seat 1: Player0 (small blind) folded on the Pre-Flop +Seat 2: Hero (big blind) folded on the Pre-Flop +Seat 3: Player1 folded on the Pre-Flop and did not bet +Seat 4: Player2 did not show and won $50.00 \ No newline at end of file diff --git a/pyfpdb/regression-test-files/cash/Winning/Flop/ALO-4max-USD-5-10-202304.txt b/pyfpdb/regression-test-files/cash/Winning/Flop/ALO-4max-USD-5-10-202304.txt new file mode 100644 index 000000000..e8330daab --- /dev/null +++ b/pyfpdb/regression-test-files/cash/Winning/Flop/ALO-4max-USD-5-10-202304.txt @@ -0,0 +1,17 @@ +Hand #1672582062 - Omaha(All-in or Fold Limit) - $5.00/$10.00 - 2023/04/27 23:37:06 UTC +Boca Raton 4-max Seat #1 is the button +Seat 1: Player0 ($250.00) +Seat 2: Hero ($50.00) +Seat 3: Player1 ($50.00) +Hero posts the small blind $5.00 +Player1 posts the big blind $10.00 +*** HOLE CARDS *** +Dealt to Hero [Ks 5c 3h 6c] +Player0 folds +Hero folds +Player1 does not show +*** SUMMARY *** +Total pot $15.00 +Seat 1: Player0 (button) folded on the Pre-Flop +Seat 2: Hero (small blind) folded on the Pre-Flop +Seat 3: Player1 did not show and won $15.00 \ No newline at end of file diff --git a/pyfpdb/regression-test-files/cash/Winning/Flop/NLO8-9max-USD-3.00-6.00-202311.added.space.txt b/pyfpdb/regression-test-files/cash/Winning/Flop/NLO8-9max-USD-3.00-6.00-202311.added.space.txt new file mode 100644 index 000000000..b1eb9b8d0 --- /dev/null +++ b/pyfpdb/regression-test-files/cash/Winning/Flop/NLO8-9max-USD-3.00-6.00-202311.added.space.txt @@ -0,0 +1,23 @@ +Hand #1916523972 - Omaha H/L (No Limit) - $3.00/$6.00 - 2023/11/02 13:08:56 UTC +Catlettsburg 9-max Seat #2 is the button +Seat 1: Player0 ($502.98) +Seat 2: Player1 ($287.70) +Seat 3: Player2 ($243.00) +Seat 4: Hero ($120.00) +Seat 9: Player3 ($180.77) +Player2 posts the small blind $3.00 +Hero posts the big blind $6.00 +*** HOLE CARDS *** +Dealt to Hero [7d Th 4s Qc] +Player3 folds +Player0 folds +Player1 folds +Player2 folds +Hero does not show +*** SUMMARY *** +Total pot $9.00 +Seat 1: Player0 folded on the Pre-Flop and did not bet +Seat 2: Player1 (button) folded on the Pre-Flop +Seat 3: Player2 (small blind) folded on the Pre-Flop +Seat 4: Hero did not show and won $9.00 +Seat 9: Player3 folded on the Pre-Flop and did not bet \ No newline at end of file diff --git a/pyfpdb/regression-test-files/cash/iPoker/Flop/PLO-6max-KR-50-100-202310.txt b/pyfpdb/regression-test-files/cash/iPoker/Flop/PLO-6max-KR-50-100-202310.txt new file mode 100644 index 000000000..dd70a3f01 --- /dev/null +++ b/pyfpdb/regression-test-files/cash/iPoker/Flop/PLO-6max-KR-50-100-202310.txt @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="utf-8"?> +<session sessioncode="7833284185"> + <general> + <client_version>23.5.1.8</client_version> + <mode>real</mode> + <gametype>Omaha PL 50kr/100kr</gametype> + <tablename>Göteborg 10, 1055504526</tablename> + <tablecurrency>SEK</tablecurrency> + <smallblind>50kr</smallblind> + <bigblind>100kr</bigblind> + <duration>00:46:25</duration> + <gamecount>97</gamecount> + <startdate>2023-10-16 22:37:34</startdate> + <currency>SEK</currency> + <nickname>Hero</nickname> + <bets>50,979.51kr</bets> + <wins>24,753kr</wins> + <chipsin>13,484.51kr</chipsin> + <chipsout>0kr</chipsout> + <statuspoints>150.00</statuspoints> + <awardpoints>0.00</awardpoints> + <ipoints>150.00</ipoints> + <tablesize>6</tablesize> + </general> + <game gamecode="10347371194"> + <general> + <startdate>2023-10-16 22:37:34</startdate> + <players> + <player win="1,790kr" bet="1,494kr" name="Player0" seat="3" dealer="0" chips="4,510kr"/> + <player win="0kr" bet="900kr" name="Hero" seat="6" dealer="1" chips="14,384.51kr"/> + </players> + </general> + <round no="0"> + <action type="1" sum="50kr" no="1" player="Hero"/> + <action type="2" sum="100kr" no="2" player="Player0"/> + </round> + <round no="1"> + <cards type="Pocket" player="Hero">D10 D9 H5 S6</cards> + <action type="23" sum="300kr" no="3" player="Hero"/> + <cards type="Pocket" player="Player0">X X X X</cards> + <action type="23" sum="900kr" no="4" player="Player0"/> + <action type="3" sum="600kr" no="5" player="Hero"/> + </round> + <round no="2"> + <cards type="Flop">HA HK H10</cards> + <action type="5" sum="594kr" no="6" player="Player0"/> + <action type="0" sum="0kr" no="7" player="Hero"/> + </round> + </game> \ No newline at end of file diff --git a/pyfpdb/regression-test-files/cash/iPoker/Flop/PLO-EUR-2.50-5.00-202311.space.delimiter.txt b/pyfpdb/regression-test-files/cash/iPoker/Flop/PLO-EUR-2.50-5.00-202311.space.delimiter.txt new file mode 100644 index 000000000..a3d7284df --- /dev/null +++ b/pyfpdb/regression-test-files/cash/iPoker/Flop/PLO-EUR-2.50-5.00-202311.space.delimiter.txt @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="utf-8"?> +<session sessioncode="5279071523"> + <general> + <client_version>23.9.1.10</client_version> + <mode>real</mode> + <gametype>Omaha PL 2,50€/5€</gametype> + <tablename>Laon, 574963928</tablename> + <tablecurrency>EUR</tablecurrency> + <smallblind>2,50€</smallblind> + <bigblind>5€</bigblind> + <duration>00:31:37</duration> + <gamecount>44</gamecount> + <startdate>2023-11-12 08:16:56</startdate> + <currency>EUR</currency> + <nickname>326594540</nickname> + <bets>1 001,24€</bets> + <wins>1 240,69€</wins> + <chipsin>495€</chipsin> + <chipsout>885,37€</chipsout> + <statuspoints>8,74</statuspoints> + <awardpoints>0,00</awardpoints> + <ipoints>8,74</ipoints> + <tablesize>6</tablesize> + </general> + <game gamecode="7038877872"> + <general> + <startdate>2023-11-12 08:16:56</startdate> + <players> + <player win="0€" bet="15€" chips="199,35€" dealer="0" seat="1" name="Player 1"/> + <player win="0€" bet="75€" chips="1 192,65€" dealer="1" seat="3" name="Player 3"/> + <player win="0€" bet="15€" chips="619,50€" dealer="0" seat="5" name="Player 5"/> + <player win="177,50€" bet="165€" chips="500€" dealer="0" seat="10" name="Player 10"/> + </players> + </general> + <round no="0"> + <action player="Player 5" sum="2,50€" type="1" no="1"/> + <action player="Player 10" sum="5€" type="2" no="2"/> + </round> + <round no="1"> + <cards player="Player 1" type="Pocket">X X X X</cards> + <action player="Player 1" sum="15€" type="23" no="3"/> + <cards player="Player 3" type="Pocket">X X X X</cards> + <action player="Player 3" sum="15€" type="3" no="4"/> + <cards player="Player 5" type="Pocket">X X X X</cards> + <action player="Player 5" sum="12,50€" type="3" no="5"/> + <cards player="Player 10" type="Pocket">X X X X</cards> + <action player="Player 10" sum="75€" type="23" no="6"/> + <action player="Player 1" sum="0€" type="0" no="7"/> + <action player="Player 3" sum="60€" type="3" no="8"/> + <action player="Player 5" sum="0€" type="0" no="9"/> + </round> + <round no="2"> + <cards type="Flop">S8 C5 SQ</cards> + <action player="Player 10" sum="0€" type="4" no="10"/> + <action player="Player 3" sum="0€" type="4" no="11"/> + </round> + <round no="3"> + <cards type="Turn">S6</cards> + <action player="Player 10" sum="90€" type="5" no="12"/> + <action player="Player 3" sum="0€" type="0" no="13"/> + </round> + </game> \ No newline at end of file diff --git a/pyfpdb/regression-test-files/cash/iPoker/Flop/PLO8-GBP-40-80-202308.txt b/pyfpdb/regression-test-files/cash/iPoker/Flop/PLO8-GBP-40-80-202308.txt new file mode 100644 index 000000000..9c7820edf --- /dev/null +++ b/pyfpdb/regression-test-files/cash/iPoker/Flop/PLO8-GBP-40-80-202308.txt @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="utf-8"?> +<session sessioncode="7778277669"> + <general> + <client_version>23.3.1.9</client_version> + <mode>real</mode> + <gametype>Omaha HiLow PL €5/€10</gametype> + <tablename>Black tern, 464241001</tablename> + <tablecurrency>EUR</tablecurrency> + <smallblind>€5</smallblind> + <bigblind>€10</bigblind> + <duration>00:09:32</duration> + <gamecount>22</gamecount> + <startdate>2023-08-12 23:07:42</startdate> + <currency>GBP</currency> + <nickname>Hero</nickname> + <bets>€930</bets> + <wins>€713</wins> + <chipsin>€360</chipsin> + <chipsout>€633</chipsout> + <statuspoints>0.00</statuspoints> + <awardpoints>0.00</awardpoints> + <ipoints>0.00</ipoints> + <tablesize>6</tablesize> + </general> + <game gamecode="10233063324"> + <general> + <startdate>2023-08-12 23:07:42</startdate> + <players> + <player chips="€400" dealer="0" seat="3" bet="€40" name="Hero" win="€0"/> + <player chips="€1,000" dealer="1" seat="8" bet="€80" name="Player0" win="€79"/> + </players> + </general> + <round no="0"> + <action player="Player0" type="1" no="1" sum="€5"/> + <action player="Hero" type="2" no="2" sum="€10"/> + </round> + <round no="1"> + <cards player="Player0" type="Pocket">X X X X</cards> + <action player="Player0" type="23" no="3" sum="€20"/> + <cards player="Hero" type="Pocket">CJ S6 D2 C4</cards> + <action player="Hero" type="3" no="4" sum="€10"/> + </round> + <round no="2"> + <cards type="Flop">C5 DJ D5</cards> + <action player="Hero" type="4" no="5" sum="€0"/> + <action player="Player0" type="5" no="6" sum="€20"/> + <action player="Hero" type="3" no="7" sum="€20"/> + </round> + <round no="3"> + <cards type="Turn">S10</cards> + <action player="Hero" type="4" no="8" sum="€0"/> + <action player="Player0" type="5" no="9" sum="€40"/> + <action player="Hero" type="0" no="10" sum="€0"/> + </round> + </game> \ No newline at end of file diff --git a/pyfpdb/regression-test-files/summaries/PacificPoker/NLHE-FREE-MTT-USD-500-202402.no.Cassava.txt b/pyfpdb/regression-test-files/summaries/PacificPoker/NLHE-FREE-MTT-USD-500-202402.no.Cassava.txt new file mode 100644 index 000000000..fd3419df9 --- /dev/null +++ b/pyfpdb/regression-test-files/summaries/PacificPoker/NLHE-FREE-MTT-USD-500-202402.no.Cassava.txt @@ -0,0 +1,4 @@ +***** Tournament Summary ***** +Tournament ID: 248254954 +Buy-In: Free +Meroveus finished 1636/5294 and won $0.05 diff --git a/pyfpdb/regression-test-files/tour/Stars/Flop/NLHE-2max-Zoom-MTT-USD-0-10.27-0.73-202404.bad.all.in.ante.txt b/pyfpdb/regression-test-files/tour/Stars/Flop/NLHE-2max-Zoom-MTT-USD-0-10.27-0.73-202404.bad.all.in.ante.txt new file mode 100755 index 000000000..73e46ad8d --- /dev/null +++ b/pyfpdb/regression-test-files/tour/Stars/Flop/NLHE-2max-Zoom-MTT-USD-0-10.27-0.73-202404.bad.all.in.ante.txt @@ -0,0 +1,25 @@ +PokerStars Hand #249683115552: Zoom Tournament #3733799296, $0.00+$10.27+$0.73 USD Hold'em No Limit - Level II (20/40) - 2024/03/29 11:37:18 CET [2024/03/29 6:37:18 ET] +Table '3733799296 30' 2-max Seat #1 is the button +Seat 1: Player0 (2249 in chips, $10.27 bounty) +Seat 2: Hero (4 in chips, $10.27 bounty) +Player0: posts the ante 5 +Hero: posts the ante 4 and is all-in +Player0: posts small blind 20 +*** HOLE CARDS *** +Dealt to Hero [Jd 5s] +Uncalled bet (20) returned to Player0 +Player0 is disconnected +*** FLOP *** [Ts 5h 2s] +*** TURN *** [Ts 5h 2s] [2h] +*** RIVER *** [Ts 5h 2s 2h] [Td] +*** SHOW DOWN *** +Player0: shows [8d 6h] (two pair, Tens and Deuces) +Player0 collected 1 from side pot +Hero: shows [Jd 5s] (two pair, Tens and Fives) +Hero collected 8 from main pot +*** SUMMARY *** +Total pot 9 Main pot 8. Side pot 1. | Rake 0 +Board [Ts 5h 2s 2h Td] +Seat 1: Player0 (button) (small blind) showed [8d 6h] and won (1) with two pair, Tens and Deuces +Seat 2: Hero showed [Jd 5s] and won (8) with two pair, Tens and Fives + diff --git a/pyfpdb/regression-test-files/tour/Stars/Flop/NLHE-6max-MTT-EUR-45-45-10-202312.ps.it.txt b/pyfpdb/regression-test-files/tour/Stars/Flop/NLHE-6max-MTT-EUR-45-45-10-202312.ps.it.txt new file mode 100644 index 000000000..ef33b1fdc --- /dev/null +++ b/pyfpdb/regression-test-files/tour/Stars/Flop/NLHE-6max-MTT-EUR-45-45-10-202312.ps.it.txt @@ -0,0 +1,30 @@ +PokerStars Hand #247946884164: Tournament #3688115389, €45+€45+€10 EUR Hold'em No Limit - Level I (125/250) [ADM ID: M5B4211F65DB6CXO] - 2023/12/29 23:04:22 CET [2023/12/29 17:04:22 ET] +Table '3688115389 14' 6-max Seat #2 is the button +Seat 2: Player0 (26200 in chips, €45 bounty) +Seat 3: Player1 (23770 in chips, €45 bounty) +Seat 4: Player2 (25000 in chips, €45 bounty) +Seat 5: Player3 (25000 in chips, €45 bounty) +Seat 6: Hero (25000 in chips, €45 bounty) +Player0: posts the ante 30 +Player1: posts the ante 30 +Player2: posts the ante 30 +Player3: posts the ante 30 +Hero: posts the ante 30 +Player1: posts small blind 125 +Player2: posts big blind 250 +*** HOLE CARDS *** +Dealt to Hero [Jh 2h] +Player3: folds +Hero: folds +Player0: raises 300 to 550 +Player1: folds +Player2: folds +Uncalled bet (300) returned to Player0 +Player0 collected 775 from pot +*** SUMMARY *** +Total pot 775 | Rake 0 +Seat 2: Player0 (button) collected (775) +Seat 3: Player1 (small blind) folded before Flop +Seat 4: Player2 (big blind) folded before Flop +Seat 5: Player3 folded before Flop (didn't bet) +Seat 6: Hero folded before Flop (didn't bet) \ No newline at end of file diff --git a/pyfpdb/regression-test-files/tour/Stars/Flop/NLHE-8max-MTT-USD-11-1-202404.no.level.txt b/pyfpdb/regression-test-files/tour/Stars/Flop/NLHE-8max-MTT-USD-11-1-202404.no.level.txt new file mode 100644 index 000000000..af9da310c --- /dev/null +++ b/pyfpdb/regression-test-files/tour/Stars/Flop/NLHE-8max-MTT-USD-11-1-202404.no.level.txt @@ -0,0 +1,57 @@ +PokerStars Hand #1311989106: Tournament #429329459, $11+$1 USD Hold'em No Limit - Level (2500/5000) - 2024/04/19 21:50:32 UTC +Table 'CHC_429329459 27' 8-max Seat #2 is the button +Seat 1: Player0 (27677 in chips) +Seat 2: Player1 (393380 in chips) +Seat 3: Player2 (114636 in chips) +Seat 4: Player3 (52136 in chips) +Seat 5: Player4 (153950 in chips) +Seat 6: Player5 (214084 in chips) +Seat 7: Player6 (209862 in chips) +Seat 8: Hero (144485 in chips) +Player0: posts the ante 600 +Player1: posts the ante 600 +Player2: posts the ante 600 +Player3: posts the ante 600 +Player4: posts the ante 600 +Player5: posts the ante 600 +Player6: posts the ante 600 +Hero: posts the ante 600 +Player2: posts small blind 2500 +Player3: posts big blind 5000 +*** HOLE CARDS *** +Dealt to Hero [Ah Kc] +Player4: folds +Player5: raises 7500 to 12500 +Player6: folds +Hero: raises 28750 to 41250 +Player0: folds +Player1: folds +Player2: folds +Player3: folds +Player5: calls 28750 +*** FLOP *** [4d Js 9d] +Player5: checks +Hero: bets 18960 +Player5: calls 18960 +*** TURN *** [4d Js 9d] [4c] +Player5: checks +Hero: checks +*** RIVER *** [4d Js 9d 4c] [8h] +Player5: bets 132720 +Hero: calls 83675 and is all-in +Uncalled bet (49045) returned to Player5 +*** SHOW DOWN *** +Player5: shows [Ad 5d] (a pair of Fours) +Hero: shows [Ah Kc] (a pair of Fours) +Hero collected 300070 from pot +*** SUMMARY *** +Total pot 300070 | Rake 0 +Board [4d Js 9d 4c 8h] +Seat 1: Player0 folded before Flop (didn't bet) +Seat 2: Player1 (button) folded before Flop (didn't bet) +Seat 3: Player2 (small blind) folded before Flop +Seat 4: Player3 (big blind) folded before Flop +Seat 5: Player4 folded before Flop (didn't bet) +Seat 6: Player5 showed [Ad 5d] and lost with a pair of Fours +Seat 7: Player6 folded before Flop (didn't bet) +Seat 8: Hero showed [Ah Kc] and won (300070) with a pair of Fours \ No newline at end of file diff --git a/pyfpdb/regression-test-files/tour/Stars/Flop/NLHE-8max-USD-70-202310.SupremaPoker.txt b/pyfpdb/regression-test-files/tour/Stars/Flop/NLHE-8max-USD-70-202310.SupremaPoker.txt new file mode 100644 index 000000000..33685b72f --- /dev/null +++ b/pyfpdb/regression-test-files/tour/Stars/Flop/NLHE-8max-USD-70-202310.SupremaPoker.txt @@ -0,0 +1,55 @@ +SupremaPoker Hand #1696464776829: Tournament #1462518504307, $63+$7 Hold'em No Limit - Level X (700/1400) - 2023/10/05 00:12:56 UTC +Table '1462518504307 60' 8-max Seat #6 is the button +Seat 1: Hero (118054 in chips) +Seat 2: Player0 (160335 in chips) +Seat 3: Player1 (79374 in chips) +Seat 4: Player2 (58112 in chips) +Seat 5: Player3 (139800 in chips) +Seat 6: Player4 (37836 in chips) +Seat 7: Player5 (155628 in chips) +Seat 8: Player6 (56710 in chips) +Player5: posts the ante 150 +Player6: posts the ante 150 +Hero: posts the ante 150 +Player0: posts the ante 150 +Player1: posts the ante 150 +Player2: posts the ante 150 +Player3: posts the ante 150 +Player4: posts the ante 150 +Player5: posts small blind 700 +Player6: posts big blind 1400 +*** HOLE CARDS *** +Dealt to Hero [Qh Kh] +Hero: raises 1400 to 2800 +Player0: folds +Player1: folds +Player2: folds +Player3: folds +Player4: folds +Player5: calls 2100 +Player6: folds +*** FLOP *** [9s 3h Ks] +Player5: checks +Hero: bets 3500 +Player5: calls 3500 +*** TURN *** [9s 3h Ks] [2s] +Player5: bets 10133 +Hero: calls 10133 +*** RIVER *** [9s 3h Ks 2s] [7d] +Player5: bets 139045 and is all-in +Hero: folds +Uncalled bet (139045) returned to Player5 +*** SHOW DOWN *** +Player5: doesn't show hand +Player5 collected 35466 from pot +*** SUMMARY *** +Total pot 35466 | Rake 0 +Board [9s 3h Ks 2s 7d] +Seat 1: Hero folded on the River +Seat 2: Player0 folded before Flop (didn't bet) +Seat 3: Player1 folded before Flop (didn't bet) +Seat 4: Player2 folded before Flop (didn't bet) +Seat 5: Player3 folded before Flop (didn't bet) +Seat 6: Player4 (button) folded before Flop (didn't bet) +Seat 7: Player5 (small blind) collected (35466) +Seat 8: Player6 (big blind) folded before Flop \ No newline at end of file