Coverage for BovadaSummary.py: 0%
114 statements
« prev ^ index » next coverage.py v7.6.1, created at 2024-09-28 16:41 +0000
« prev ^ index » next coverage.py v7.6.1, created at 2024-09-28 16:41 +0000
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
4#Copyright 2008-2013 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.
18#import L10n
19#_ = L10n.get_translation()
21from decimal_wrapper import Decimal
22import datetime
24from Exceptions import FpdbParseError
25from HandHistoryConverter import *
26from TourneySummary import *
27import BovadaToFpdb
29class BovadaSummary(TourneySummary):
31 substitutions = {
32 'LEGAL_ISO' : "USD", # legal ISO currency codes
33 'LS' : u"\$|", # legal currency symbols - Euro(cp1252, utf-8)
34 'PLYR': r'(?P<PNAME>.+?)',
35 'PLYR1': r'(?P<PNAME1>.+?)',
36 'CUR': u"(\$|)",
37 'NUM' :u".,\d",
38 }
39 codepage = ("utf8", "cp1252")
41 re_Identify = re.compile(u'(Ignition|Bovada|Bodog(\.eu|\sUK|\sCanada|88)?)\sHand')
42 re_AddOn = re.compile(r"^%(PLYR)s ?\[ME\] : Addon (?P<ADDON>[%(NUM)s]+)" % substitutions, re.MULTILINE)
43 re_Rebuyin = re.compile(r"%(PLYR)s ?\[ME\] : Rebuyin (?P<REBUY>[%(NUM)s]+)" % substitutions, re.MULTILINE)
44 re_Ranking = re.compile(r"%(PLYR)s ?\[ME\] : Ranking (?P<RANK>[%(NUM)s]+)(\s+?%(PLYR1)s ?\[ME\] : Prize Cash \[(?P<WINNINGS>%(CUR)s[%(NUM)s]+)\])?" % substitutions, re.MULTILINE)
45 re_Stand = re.compile(r"%(PLYR)s ?\[ME\] : Stand" % substitutions, re.MULTILINE)
47 @staticmethod
48 def getSplitRe(self, head):
49 re_SplitTourneys = re.compile("PokerStars Tournament ")
50 return re_SplitTourneys
52 def parseSummary(self):
53 obj = getattr(BovadaToFpdb, "Bovada", None)
54 hhc = obj(self.config, in_path = self.in_path, sitename = None, autostart = False)
55 m = hhc.re_GameInfo.search(self.summaryText)
56 if m == None:
57 tmp = self.summaryText[0:200]
58 log.error(("BovadaSummary.parseSummary: '%s'") % tmp)
59 raise FpdbParseError
61 info = {}
62 info.update(m.groupdict())
63 m = hhc.re_Buyin.search(self.in_path)
64 if m: info.update(m.groupdict())
66 if info['TOURNO'] is None:
67 tmp = self.summaryText[0:200]
68 log.error(("BovadaSummary.parseSummary: Text does not appear to be a tournament '%s'") % tmp)
69 raise FpdbParseError
70 else:
71 self.tourNo = info['TOURNO']
72 if 'LIMIT' in info:
73 if not info['LIMIT']:
74 self.gametype['limitType'] = 'nl'
75 else:
76 self.gametype['limitType'] = hhc.limits[info['LIMIT']]
77 if 'GAME' in info:
78 self.gametype['category'] = hhc.games[info['GAME']][1]
80 if 'CURRENCY' in info and info['CURRENCY']:
81 self.buyinCurrency = hhc.currencies[info['CURRENCY']]
82 self.currency = self.buyinCurrency
84 if 'DATETIME' in info and info['CURRENCY'] is not None:
85 m1 = hhc.re_DateTime.finditer(info['DATETIME'])
86 datetimestr = "2000/01/01 00:00:00" # default used if time not found
87 for a in m1:
88 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'))
89 #tz = a.group('TZ') # just assume ET??
90 #print " tz = ", tz, " datetime =", datetimestr
91 self.startTime = datetime.datetime.strptime(datetimestr, "%Y/%m/%d %H:%M:%S") # also timezone at end, e.g. " ET"
92 self.startTime = HandHistoryConverter.changeTimezone(self.startTime, "ET", "UTC")
94 self.buyin = 0
95 self.fee = 0
96 self.prizepool = None
97 self.entries = None
99 if self.currency is None:
100 self.buyinCurrency = "FREE"
102 if 'BUYIN' in info and info['BUYIN'] is not None:
103 if info['BIAMT'] is not None and info['BIRAKE'] is not None:
104 if info['BUYIN'].find("$")!=-1:
105 self.buyinCurrency="USD"
106 elif re.match("^[0-9+]*$", info['BUYIN']):
107 self.buyinCurrency="play"
108 else:
109 log.error(("BovadaSummary.parseSummary: Failed to detect currency"))
110 raise FpdbParseError
111 self.currency = self.buyinCurrency
113 info['BIAMT'] = hhc.clearMoneyString(info['BIAMT'].strip(u'$'))
115 if info['BIRAKE']:
116 info['BIRAKE'] = hhc.clearMoneyString(info['BIRAKE'].strip(u'$'))
117 else:
118 info['BIRAKE'] = '0'
120 if info['TICKET'] == None:
121 self.buyin = int(100*Decimal(info['BIAMT']))
122 self.fee = int(100*Decimal(info['BIRAKE']))
123 else:
124 self.buyin = 0
125 self.fee = 0
127 if info['TOURNAME'] is not None:
128 tourneyNameFull = info['TOURNAME'] + ' - ' + info['BIAMT'] + '+' + info['BIRAKE']
129 self.tourneyName = tourneyNameFull
131 if 'TOURNAME' in info and 'Rebuy' in info['TOURNAME']:
132 self.isAddOn, self.isRebuy = True, True
133 self.rebuyCost = self.buyin
134 self.addOnCost = self.buyin
136 rebuys, addons, winnings = None, None, []
137 i = 0
138 m = self.re_Ranking.finditer(self.summaryText)
139 for a in m:
140 mg = a.groupdict()
141 winnings.append([int(mg['RANK']), 0])
142 if mg['WINNINGS'] is not None:
143 if mg['WINNINGS'].find("$")!=-1:
144 self.currency="USD"
145 elif re.match("^[0-9+]*$", mg['WINNINGS']):
146 self.currency="play"
147 winnings[i][1] = int(100*Decimal(self.clearMoneyString(mg['WINNINGS'])))
148 i+=1
150 m = self.re_Rebuyin.finditer(self.summaryText)
151 for a in m:
152 if rebuys == None:
153 rebuys = 0
154 rebuys += 1
156 m = self.re_AddOn.finditer(self.summaryText)
157 for a in m:
158 if addons == None:
159 addons = 0
160 addons += 1
162 i = 0
163 for win in winnings:
164 if len(win)>1:
165 rankId = (i+1)
166 else:
167 rankId = None
168 if i == 0:
169 self.addPlayer(win[0], 'Hero', win[1], self.currency, rebuys, addons, rankId)
170 else:
171 self.addPlayer(win[0], 'Hero', win[1], self.currency, 0, 0, rankId)
172 i+=1