Coverage for PokerTrackerSummary.py: 0%

133 statements  

« prev     ^ index     » next       coverage.py v7.6.4, created at 2024-11-07 02:19 +0000

1#!/usr/bin/env python 

2# -*- coding: utf-8 -*- 

3 

4# Copyright 2008-2012 Chaz Littlejohn 

5# This program is free software: you can redistribute it and/or modify 

6# it under the terms of the GNU Affero General Public License as published by 

7# the Free Software Foundation, version 3 of the License. 

8# 

9# This program is distributed in the hope that it will be useful, 

10# but WITHOUT ANY WARRANTY; without even the implied warranty of 

11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 

12# GNU General Public License for more details. 

13# 

14# You should have received a copy of the GNU Affero General Public License 

15# along with this program. If not, see <http://www.gnu.org/licenses/>. 

16# In the "official" distribution you can find the license in agpl-3.0.txt. 

17 

18 

19# import L10n 

20# _ = L10n.get_translation() 

21 

22from HandHistoryConverter import FpdbParseError 

23import re 

24import logging 

25import datetime 

26from TourneySummary import TourneySummary 

27from decimal import Decimal 

28 

29# PokerStars HH Format 

30log = logging.getLogger("parser") 

31 

32 

33class PokerTrackerSummary(TourneySummary): 

34 hhtype = "summary" 

35 limits = {"NL": "nl", "No Limit": "nl", "Pot Limit": "pl", "PL": "pl", "FL": "fl", "Limit": "fl", "LIMIT": "fl"} 

36 games = { # base, category 

37 "Hold'em": ("hold", "holdem"), 

38 "Texas Hold'em": ("hold", "holdem"), 

39 "Holdem": ("hold", "holdem"), 

40 "Omaha": ("hold", "omahahi"), 

41 "Omaha Hi": ("hold", "omahahi"), 

42 "Omaha Hi/Lo": ("hold", "omahahilo"), 

43 } 

44 

45 substitutions = { 

46 "LEGAL_ISO": "USD|EUR|GBP|CAD|FPP", # legal ISO currency codes 

47 "LS": "\$|€|\£|P|SC|", # legal currency symbols - Euro(cp1252, utf-8) 

48 "PLYR": r"(?P<PNAME>.+?)", 

49 "NUM": ".,\d", 

50 "CUR": "(\$|€||\£|)", 

51 } 

52 

53 re_Identify = re.compile("PokerTracker") 

54 

55 re_TourneyInfo = re.compile( 

56 """ 

57 \s(3|4)\sTournament\sSummary\s+ 

58 Site:\s(?P<SITE>.+?)\s+ 

59 Game:\s(?P<GAME>Holdem|Texas\sHold\'em|Omaha|Omaha\sHi|Omaha\sHi\/Lo)\s+ 

60 Tournament\s\#:\s(?P<TOURNO>[0-9]+)\s+ 

61 Started:\s(?P<DATETIME>.+?)\s+ 

62 Finished:\s(?P<DATETIME1>.+?)\s+ 

63 Buyin:\s(?P<CURRENCY>[%(LS)s]?)(?P<BUYIN>[,.0-9]+)\s+ 

64 (Bounty:\s[%(LS)s]?(?P<BOUNTY>[,.0-9]+)\s+)? 

65 Fee:\s[%(LS)s]?(?P<FEE>[,.0-9]+)\s+ 

66 (Prize\sPool:\s[%(LS)s]?(?P<PRIZEPOOL>[,.0-9]+)\s+)? 

67 (Rebuy:\s[%(LS)s]?(?P<REBUYAMT>[,.0-9]+)\s+)? 

68 (Addon:\s[%(LS)s]?(?P<ADDON>[,.0-9]+)\s+)? 

69 Initial\sStack:\s(?P<STACK>[0-9]+)\s+ 

70 Table\sType:\s(?P<TYPE>.+?)\s+ 

71 Tourney\sType:\s(?P<LIMIT>No\sLimit|Limit|LIMIT|Pot\sLimit|N\/A)\s+ 

72 Players:\s(?P<ENTRIES>\d+)\s+ 

73 """ 

74 % substitutions, 

75 re.VERBOSE | re.MULTILINE, 

76 ) 

77 

78 re_Max = re.compile("\((?P<MAX>\d+)\smax\)\s") 

79 re_Speed = re.compile("(?P<SPEED>Turbo|Hyper\-Turbo)") 

80 re_Sng = re.compile("\s(?P<SNG>SNG)\s") 

81 

82 re_Player = re.compile( 

83 """ 

84 Place:\s(?P<RANK>[0-9]+),\s 

85 Player:\s(?P<NAME>.*),\s 

86 Won:\s(?P<CUR>[%(LS)s]?)(?P<WINNINGS>[,.0-9]+), 

87 (\sBounties:\s(?P<KOS>\d+),)? 

88 (\sRebuys:\s(?P<REBUYS>\d+),)? 

89 (\sAddons:\s(?P<ADDONS>\d+),)? 

90 """ 

91 % substitutions, 

92 re.VERBOSE, 

93 ) 

94 

95 re_DateTime = re.compile( 

96 """(?P<Y>[0-9]{4})\/(?P<M>[0-9]{2})\/(?P<D>[0-9]{2})[\- ]+(?P<H>[0-9]+):(?P<MIN>[0-9]+):(?P<S>[0-9]+)""", 

97 re.MULTILINE, 

98 ) 

99 

100 codepage = ["utf-8", "cp1252"] 

101 

102 siteNameMap = { 

103 "Pacific Poker": "PacificPoker", 

104 "MicroGaming": "Microgaming", 

105 "PokerStars": "PokerStars", 

106 "Full Tilt": "Fulltilt", 

107 "Party Poker": "PartyPoker", 

108 "Merge": "Merge", 

109 "Winamax": "Winamax", 

110 } 

111 

112 @staticmethod 

113 def getSplitRe(self, head): 

114 re_SplitTourneys = re.compile("PokerTracker") 

115 return re_SplitTourneys 

116 

117 def parseSummary(self): 

118 m = self.re_TourneyInfo.search(self.summaryText) 

119 if m is None: 

120 tmp = self.summaryText[0:200] 

121 log.error(("PokerTrackerSummary.parseSummary: '%s'") % tmp) 

122 raise FpdbParseError 

123 

124 # print "DEBUG: m.groupdict(): %s" % m.groupdict() 

125 

126 mg = m.groupdict() 

127 if "SITE" in mg: 

128 if self.siteNameMap.get(mg["SITE"]) is not None: 

129 self.siteName = self.siteNameMap.get(mg["SITE"]) 

130 self.siteId = self.SITEIDS.get(self.siteName) 

131 else: 

132 tmp = self.summaryText[0:200] 

133 log.error(("PokerTrackerSummary.parseSummary: Unsupported site summary '%s'") % tmp) 

134 raise FpdbParseError 

135 if "TOURNO" in mg: 

136 self.tourNo = mg["TOURNO"] 

137 if "GAME" in mg: 

138 self.gametype["category"] = self.games[mg["GAME"]][1] 

139 if mg["LIMIT"] in self.limits: 

140 self.gametype["limitType"] = self.limits[mg["LIMIT"]] 

141 elif self.gametype["category"] == "holdem": 

142 self.gametype["limitType"] = "nl" 

143 else: 

144 self.gametype["limitType"] = "pl" 

145 if "TYPE" in mg: 

146 self.tourneyName = mg["TYPE"] 

147 t1 = self.re_Max.search(self.tourneyName) 

148 if t1: 

149 self.maxseats = int(t1.group("MAX")) 

150 t2 = self.re_Speed.search(self.tourneyName) 

151 if t2: 

152 if t2.group("SPEED") == "Turbo": 

153 self.speed = "Turbo" 

154 elif t2.group("SPEED") == "Hyper-Turbo": 

155 self.speed = "Hyper" 

156 t3 = self.re_Sng.search(self.tourneyName) 

157 if t3: 

158 self.isSng = True 

159 if "DEEP" in self.tourneyName: 

160 self.stack = "Deep" 

161 if "SATELLITE" in self.tourneyName: 

162 self.isSatellite = True 

163 if mg["BUYIN"] is not None: 

164 self.buyin = int(100 * float(self.clearMoneyString(mg["BUYIN"]))) 

165 if mg["FEE"] is not None: 

166 self.fee = int(100 * float(self.clearMoneyString(mg["FEE"]))) 

167 if "REBUYAMT" in mg and mg["REBUYAMT"] is not None: 

168 self.isRebuy = True 

169 self.rebuyCost = int(100 * float(self.clearMoneyString(mg["REBUYAMT"]))) 

170 if "PRIZEPOOL" in mg and mg["PRIZEPOOL"] is not None: 

171 self.prizepool = int(100 * float(self.clearMoneyString(mg["PRIZEPOOL"]))) 

172 if "ADDON" in mg and mg["ADDON"] is not None: 

173 self.isAddOn = True 

174 self.addOnCost = int(100 * float(self.clearMoneyString(mg["ADDON"]))) 

175 if "BOUNTY" in mg and mg["BOUNTY"] is not None: 

176 self.koBounty = int(100 * float(self.clearMoneyString(mg["BOUNTY"]))) 

177 self.isKO = True 

178 if "ENTRIES" in mg: 

179 self.entries = mg["ENTRIES"] 

180 if "DATETIME" in mg: 

181 m1 = self.re_DateTime.finditer(mg["DATETIME"]) 

182 for a in m1: 

183 datetimestr = "%s/%s/%s %s:%s:%s" % ( 

184 a.group("Y"), 

185 a.group("M"), 

186 a.group("D"), 

187 a.group("H"), 

188 a.group("MIN"), 

189 a.group("S"), 

190 ) 

191 else: 

192 datetimestr = "2000/01/01 00:00:00" # default used if time not found 

193 

194 self.startTime = datetime.datetime.strptime( 

195 datetimestr, "%Y/%m/%d %H:%M:%S" 

196 ) # also timezone at end, e.g. " ET" 

197 

198 if mg["CURRENCY"] == "$": 

199 self.buyinCurrency = "USD" 

200 elif mg["CURRENCY"] == "€": 

201 self.buyinCurrency = "EUR" 

202 elif mg["CURRENCY"] in ("SC", "P"): 

203 self.buyinCurrency = "PSFP" 

204 elif not mg["CURRENCY"]: 

205 self.buyinCurrency = "play" 

206 if self.buyin == 0: 

207 self.buyinCurrency = "FREE" 

208 self.currency = self.buyinCurrency 

209 

210 if self.buyinCurrency not in ("FREE", "PSFP") and "ENTRIES" in mg and self.prizepool == 0: 

211 self.prizepool = int(Decimal(self.clearMoneyString(mg["BUYIN"]))) * int(self.entries) 

212 

213 m = self.re_Player.finditer(self.summaryText) 

214 for a in m: 

215 mg = a.groupdict() 

216 # print "DEBUG: a.groupdict(): %s" % mg 

217 name = mg["NAME"] 

218 rank = int(mg["RANK"]) 

219 winnings = 0 

220 rebuyCount = None 

221 addOnCount = None 

222 koCount = None 

223 if len(name) > 0: 

224 if "WINNINGS" in mg and mg["WINNINGS"] is not None: 

225 # winning1 = mg["WINNINGS"] 

226 # winning2 = self.clearMoneyString(winning1) 

227 # winning3 = int(float(winning2)) 

228 winnings = int(100 * float(self.clearMoneyString(mg["WINNINGS"]))) 

229 

230 if "REBUYS" in mg and mg["REBUYS"] is not None: 

231 rebuyCount = int(mg["REBUYS"]) 

232 

233 if "ADDONS" in mg and mg["ADDONS"] is not None: 

234 addOnCount = int(mg["ADDONS"]) 

235 

236 if "KOS" in mg and mg["KOS"] is not None: 

237 koCount = int(mg["KOS"]) 

238 

239 if "CUR" in mg and mg["CUR"] is not None: 

240 if mg["CUR"] == "$": 

241 self.currency = "USD" 

242 elif mg["CUR"] == "€": 

243 self.currency = "EUR" 

244 elif mg["CUR"] in ("P", "SC"): 

245 self.currency = "PSFP" 

246 

247 if rank == 0: 

248 # print "stillplaying" 

249 rank = None 

250 winnings = None 

251 

252 if len(name) == 0: 

253 log.debug("DEBUG: a.groupdict(): %s" % (mg)) 

254 

255 # print "DEBUG: addPlayer(%s, %s, %s, %s, None, None, None)" %(rank, name, winnings, self.currency) 

256 # print "DEBUG: self.buyin: %s self.fee %s" %(self.buyin, self.fee) 

257 self.addPlayer(rank, name, winnings, self.currency, rebuyCount, addOnCount, koCount) 

258 

259 # print self 

260 

261 

262# end class PokerStarsSummary