Merge branch 'master' of git://git.assembla.com/fpdboz
This commit is contained in:
		
						commit
						78fdb37f38
					
				|  | @ -479,12 +479,13 @@ class Import: | |||
|         self.hhArchiveBase = node.getAttribute("hhArchiveBase") | ||||
|         self.hhBulkPath = node.getAttribute("hhBulkPath") | ||||
|         self.saveActions = string_to_bool(node.getAttribute("saveActions"), default=False) | ||||
|         self.cacheSessions = string_to_bool(node.getAttribute("cacheSessions"), default=False) | ||||
|         self.fastStoreHudCache = string_to_bool(node.getAttribute("fastStoreHudCache"), default=False) | ||||
|         self.saveStarsHH = string_to_bool(node.getAttribute("saveStarsHH"), default=False) | ||||
| 
 | ||||
|     def __str__(self): | ||||
|         return "    interval = %s\n    callFpdbHud = %s\n    hhArchiveBase = %s\n    saveActions = %s\n    fastStoreHudCache = %s\n" \ | ||||
|             % (self.interval, self.callFpdbHud, self.hhArchiveBase, self.saveActions, self.fastStoreHudCache) | ||||
|             % (self.interval, self.callFpdbHud, self.hhArchiveBase, self.saveActions, self.cacheSessions, self.fastStoreHudCache) | ||||
| 
 | ||||
| class HudUI: | ||||
|     def __init__(self, node): | ||||
|  | @ -1259,6 +1260,9 @@ class Config: | |||
| 
 | ||||
|         try:    imp['saveActions']     = self.imp.saveActions | ||||
|         except:  imp['saveActions']     = False | ||||
|          | ||||
|         try:    imp['cacheSessions']     = self.imp.cacheSessions | ||||
|         except:  imp['cacheSessions']     = False | ||||
| 
 | ||||
|         try:    imp['saveStarsHH'] = self.imp.saveStarsHH | ||||
|         except:  imp['saveStarsHH'] = False | ||||
|  |  | |||
|  | @ -73,7 +73,7 @@ except ImportError: | |||
|     use_numpy = False | ||||
| 
 | ||||
| 
 | ||||
| DB_VERSION = 145 | ||||
| DB_VERSION = 146 | ||||
| 
 | ||||
| 
 | ||||
| # Variance created as sqlite has a bunch of undefined aggregate functions. | ||||
|  | @ -296,8 +296,8 @@ class Database: | |||
| 
 | ||||
|             # vars for hand ids or dates fetched according to above config: | ||||
|             self.hand_1day_ago = 0             # max hand id more than 24 hrs earlier than now | ||||
|             self.date_ndays_ago = 'd00000000'    # date N days ago ('d' + YYMMDD) | ||||
|             self.h_date_ndays_ago = 'd00000000'  # date N days ago ('d' + YYMMDD) for hero | ||||
|             self.date_ndays_ago = 'd000000'    # date N days ago ('d' + YYMMDD) | ||||
|             self.h_date_ndays_ago = 'd000000'  # date N days ago ('d' + YYMMDD) for hero | ||||
|             self.date_nhands_ago = {}          # dates N hands ago per player - not used yet | ||||
| 
 | ||||
|             self.saveActions = False if self.import_options['saveActions'] == False else True | ||||
|  | @ -701,18 +701,18 @@ class Database: | |||
|          | ||||
|         d = timedelta(days=hud_days, hours=tz_day_start_offset) | ||||
|         now = datetime.utcnow() - d | ||||
|         self.date_ndays_ago = "d%02d%02d%02d%02d" % (now.year - 2000, now.month, now.day, tz_day_start_offset) | ||||
|         self.date_ndays_ago = "d%02d%02d%02d" % (now.year - 2000, now.month, now.day) | ||||
|          | ||||
|         d = timedelta(days=h_hud_days, hours=tz_day_start_offset) | ||||
|         now = datetime.utcnow() - d | ||||
|         self.h_date_ndays_ago = "d%02d%02d%02d%02d" % (now.year - 2000, now.month, now.day, tz_day_start_offset) | ||||
|         self.h_date_ndays_ago = "d%02d%02d%02d" % (now.year - 2000, now.month, now.day) | ||||
| 
 | ||||
|     def init_player_hud_stat_vars(self, playerid): | ||||
|         # not sure if this is workable, to be continued ... | ||||
|         try: | ||||
|             # self.date_nhands_ago is used for fetching stats for last n hands (hud_style = 'H') | ||||
|             # This option not used yet - needs to be called for each player :-( | ||||
|             self.date_nhands_ago[str(playerid)] = 'd00000000' | ||||
|             self.date_nhands_ago[str(playerid)] = 'd000000' | ||||
| 
 | ||||
|             # should use aggregated version of query if appropriate | ||||
|             c.execute(self.sql.query['get_date_nhands_ago'], (self.hud_hands, playerid)) | ||||
|  | @ -780,11 +780,11 @@ class Database: | |||
|         if hud_style == 'T': | ||||
|             stylekey = self.date_ndays_ago | ||||
|         elif hud_style == 'A': | ||||
|             stylekey = '000000000'  # all stylekey values should be higher than this | ||||
|             stylekey = '0000000'  # all stylekey values should be higher than this | ||||
|         elif hud_style == 'S': | ||||
|             stylekey = 'zzzzzzzzz'  # all stylekey values should be lower than this | ||||
|             stylekey = 'zzzzzzz'  # all stylekey values should be lower than this | ||||
|         else: | ||||
|             stylekey = '000000000' | ||||
|             stylekey = '0000000' | ||||
|             log.info('hud_style: %s' % hud_style) | ||||
| 
 | ||||
|         #elif hud_style == 'H': | ||||
|  | @ -793,9 +793,9 @@ class Database: | |||
|         if h_hud_style == 'T': | ||||
|             h_stylekey = self.h_date_ndays_ago | ||||
|         elif h_hud_style == 'A': | ||||
|             h_stylekey = '000000000'  # all stylekey values should be higher than this | ||||
|             h_stylekey = '0000000'  # all stylekey values should be higher than this | ||||
|         elif h_hud_style == 'S': | ||||
|             h_stylekey = 'zzzzzzzzz'  # all stylekey values should be lower than this | ||||
|             h_stylekey = 'zzzzzzz'  # all stylekey values should be lower than this | ||||
|         else: | ||||
|             h_stylekey = '00000000' | ||||
|             log.info('h_hud_style: %s' % h_hud_style) | ||||
|  | @ -1832,12 +1832,19 @@ class Database: | |||
|     def storeHudCache(self, gid, pids, starttime, pdata): | ||||
|         """Update cached statistics. If update fails because no record exists, do an insert.""" | ||||
| 
 | ||||
|         tz = datetime.utcnow() - datetime.today() | ||||
|         tz_offset = tz.seconds/3600 | ||||
|         tz_day_start_offset = self.day_start + tz_offset | ||||
|          | ||||
|         d = timedelta(hours=tz_day_start_offset) | ||||
|         starttime_offset = starttime - d | ||||
|          | ||||
|         if self.use_date_in_hudcache: | ||||
|             styleKey = datetime.strftime(starttime, 'd%y%m%d%H') | ||||
|             #styleKey = "d%02d%02d%02d%02d" % (hand_start_time.year-2000, hand_start_time.month, hand_start_time.day, hand_start_time.hour) | ||||
|             styleKey = datetime.strftime(starttime_offset, 'd%y%m%d') | ||||
|             #styleKey = "d%02d%02d%02d" % (hand_start_time.year-2000, hand_start_time.month, hand_start_time.day) | ||||
|         else: | ||||
|             # hard-code styleKey as 'A00000000' (all-time cache, no key) for now | ||||
|             styleKey = 'A00000000' | ||||
|             # hard-code styleKey as 'A000000' (all-time cache, no key) for now | ||||
|             styleKey = 'A000000' | ||||
| 
 | ||||
|         update_hudcache = self.sql.query['update_hudcache'] | ||||
|         update_hudcache = update_hudcache.replace('%s', self.sql.query['placeholder']) | ||||
|  | @ -1959,6 +1966,53 @@ class Database: | |||
|             else: | ||||
|                 #print "DEBUG: Successfully updated HudCacho using UPDATE" | ||||
|                 pass | ||||
|              | ||||
|     def storeSessionsCache(self, pids, starttime, pdata): | ||||
|         """Update cached sessions. If update fails because no record exists, do an insert.""" | ||||
|         #In development | ||||
|         pass | ||||
| 
 | ||||
|         #update_sessionscache = self.sql.query['update_sessionscache'] | ||||
|         #update_sessionscache = update_sessionscache.replace('%s', self.sql.query['placeholder']) | ||||
|         #insert_sessionscache = self.sql.query['insert_sessionscache'] | ||||
|         #insert_sessionscache = insert_sessionscache.replace('%s', self.sql.query['placeholder']) | ||||
|         #merge_sessionscache = self.sql.query['merge_sessionscache'] | ||||
|         #merge_sessionscache = merge_sessionscache.replace('%s', self.sql.query['placeholder']) | ||||
| 
 | ||||
|         #print "DEBUG: %s %s %s" %(hid, pids, pdata) | ||||
|         #inserts = [] | ||||
|         #for p in pdata: | ||||
|             #line = [0]*5 | ||||
| 
 | ||||
|             #line[0] = 1 # HDs | ||||
|             #line[1] = pdata[p]['totalProfit'] | ||||
|              | ||||
|             #line[2] = pids[p]    # playerId | ||||
|             #line[3] = sessionStart | ||||
|             #line[4] = sessionEnd | ||||
|             #inserts.append(line) | ||||
| 
 | ||||
| 
 | ||||
|         #cursor = self.get_cursor() | ||||
| 
 | ||||
|         #for row in inserts: | ||||
|             # Try to do the update first: | ||||
|             #num = cursor.execute(update_sessionscache, row) | ||||
|             #print "DEBUG: values: %s" % row[-3:] | ||||
|             # Test statusmessage to see if update worked, do insert if not | ||||
|             # num is a cursor in sqlite | ||||
|             #if ((self.backend == self.PGSQL and cursor.statusmessage != "UPDATE 1") | ||||
|                     #or (self.backend == self.MYSQL_INNODB and num == 0) | ||||
|                     #or (self.backend == self.SQLITE and num.rowcount == 0)): | ||||
|                 #move the last 6 items in WHERE clause of row from the end of the array | ||||
|                 # to the beginning for the INSERT statement | ||||
|                 #print "DEBUG: using INSERT: %s" % num | ||||
|                 #row = row[-3:] + row[:-3] | ||||
|                 #num = cursor.execute(insert_sessionscache, row) | ||||
|                 #print "DEBUG: Successfully(?: %s) updated HudCacho using INSERT" % num | ||||
|             #else: | ||||
|                 #print "DEBUG: Successfully updated HudCacho using UPDATE" | ||||
|                 #pass | ||||
| 
 | ||||
|     def isDuplicate(self, gametypeID, siteHandNo): | ||||
|         dup = False | ||||
|  |  | |||
|  | @ -33,6 +33,7 @@ class FullTiltPokerSummary(TourneySummary): | |||
|     games = {                          # base, category | ||||
|                               "Hold'em" : ('hold','holdem'),  | ||||
|                                 'Omaha' : ('hold','omahahi'), | ||||
|                             'Omahai Hi' : ('hold','omahahi'), | ||||
|                           'Omaha Hi/Lo' : ('hold','omahahilo'), | ||||
|                                  'Razz' : ('stud','razz'),  | ||||
|                                  'RAZZ' : ('stud','razz'), | ||||
|  | @ -55,7 +56,7 @@ class FullTiltPokerSummary(TourneySummary): | |||
|     re_TourneyInfo = re.compile(u""" | ||||
|                         \s.* | ||||
|                         (?P<TYPE>Tournament|Sit\s\&\sGo)\s\((?P<TOURNO>[0-9]+)\)(\s+)? | ||||
|                         (?P<GAME>Hold\'em|Razz|RAZZ|7\sCard\sStud|7\sCard\sStud\sHi/Lo|Omaha|Omaha\sHi/Lo|Badugi|Triple\sDraw\s2\-7\sLowball|5\sCard\sDraw)\s+ | ||||
|                         (?P<GAME>Hold\'em|Razz|RAZZ|7\sCard\sStud|7\sCard\sStud\sHi/Lo|Omaha|Omaha\sHi|Omaha\sHi/Lo|Badugi|Triple\sDraw\s2\-7\sLowball|5\sCard\sDraw)\s+ | ||||
|                         (?P<LIMIT>No\sLimit|Limit|LIMIT|Pot\sLimit)\s+ | ||||
|                         (Buy-In:\s\$(?P<BUYIN>[.\d]+)(\s\+\s\$(?P<FEE>[.\d]+))?\s+)? | ||||
|                         (Buy-In\sChips:\s(?P<CHIPS>\d+)\s+)? | ||||
|  |  | |||
							
								
								
									
										274
									
								
								pyfpdb/GuiReplayer.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										274
									
								
								pyfpdb/GuiReplayer.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,274 @@ | |||
| #!/usr/bin/env python | ||||
| # -*- coding: utf-8 -*- | ||||
| 
 | ||||
| #Copyright 2010 Maxime Grandchamp | ||||
| #This program is free software: you can redistribute it and/or modify | ||||
| #it under the terms of the GNU Affero General Public License as published by | ||||
| #the Free Software Foundation, version 3 of the License. | ||||
| # | ||||
| #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 Affero General Public License | ||||
| #along with this program. If not, see <http://www.gnu.org/licenses/>. | ||||
| #In the "official" distribution you can find the license in agpl-3.0.txt. | ||||
| 
 | ||||
| import L10n | ||||
| _ = L10n.get_translation() | ||||
| 
 | ||||
| 
 | ||||
| from Hand import * | ||||
| import Configuration | ||||
| import Database | ||||
| import SQL | ||||
| import fpdb_import | ||||
| import Filters | ||||
| import pygtk | ||||
| pygtk.require('2.0') | ||||
| import gtk | ||||
| import math | ||||
| import gobject | ||||
| 
 | ||||
| 
 | ||||
| class GuiReplayer: | ||||
|     def __init__(self, config, querylist, mainwin, debug=True): | ||||
|         self.debug = debug | ||||
|         self.conf = config | ||||
|         self.main_window = mainwin | ||||
|         self.sql = querylist | ||||
| 
 | ||||
|         self.db = Database.Database(self.conf, sql=self.sql) | ||||
| 
 | ||||
|         filters_display = { "Heroes"    : True, | ||||
|                     "Sites"     : True, | ||||
|                     "Games"     : True, | ||||
|                     "Limits"    : True, | ||||
|                     "LimitSep"  : True, | ||||
|                     "LimitType" : True, | ||||
|                     "Type"      : True, | ||||
|                     "Seats"     : True, | ||||
|                     "SeatSep"   : True, | ||||
|                     "Dates"     : True, | ||||
|                     "Groups"    : True, | ||||
|                     "GroupsAll" : True, | ||||
|                     "Button1"   : True, | ||||
|                     "Button2"   : True | ||||
|                   } | ||||
| 
 | ||||
| 
 | ||||
|         self.filters = Filters.Filters(self.db, self.conf, self.sql, display = filters_display) | ||||
|         #self.filters.registerButton1Name(_("Import Hand")) | ||||
|         #self.filters.registerButton1Callback(self.importhand) | ||||
|         #self.filters.registerButton2Name(_("temp")) | ||||
|         #self.filters.registerButton2Callback(self.temp()) | ||||
| 
 | ||||
|         # hierarchy:  self.mainHBox / self.hpane / self.replayBox / self.area | ||||
| 
 | ||||
|         self.mainHBox = gtk.HBox(False, 0) | ||||
|         self.mainHBox.show() | ||||
| 
 | ||||
|         self.leftPanelBox = self.filters.get_vbox() | ||||
| 
 | ||||
|         self.hpane = gtk.HPaned() | ||||
|         self.hpane.pack1(self.leftPanelBox) | ||||
|         self.mainHBox.add(self.hpane) | ||||
| 
 | ||||
|         self.replayBox = gtk.VBox(False, 0) | ||||
|         self.replayBox.show() | ||||
| 
 | ||||
|         self.hpane.pack2(self.replayBox) | ||||
|         self.hpane.show() | ||||
| 
 | ||||
|         self.area=gtk.DrawingArea() | ||||
|         self.pangolayout = self.area.create_pango_layout("") | ||||
|         self.area.connect("expose-event", self.area_expose) | ||||
|         self.style = self.area.get_style() | ||||
|         self.gc = self.style.fg_gc[gtk.STATE_NORMAL] | ||||
|         self.area.show() | ||||
| 
 | ||||
|         self.replayBox.pack_start(self.area) | ||||
| 
 | ||||
|         self.MyHand = self.importhand() | ||||
| 
 | ||||
|         self.maxseats=self.MyHand.maxseats | ||||
| 
 | ||||
|         if self.MyHand.gametype['currency']=="USD":    #TODO: check if there are others .. | ||||
|             self.currency="$" | ||||
|         elif self.MyHand.gametype['currency']=="EUR": | ||||
|             self.currency="€" | ||||
| 
 | ||||
| 
 | ||||
|         self.table={}     #create table with positions, player names, status (live/folded), stacks and chips on table | ||||
|         for i in range(0,self.maxseats):     # radius: 200, center: 250,250 | ||||
|             x= int (round(250+200*math.cos(2*i*math.pi/self.maxseats))) | ||||
|             y= int (round(250+200*math.sin(2*i*math.pi/self.maxseats))) | ||||
|             try: | ||||
|                 self.table[i]={"name":self.MyHand.players[i][1],"stack":Decimal(self.MyHand.players[i][2]),"x":x,"y":y,"chips":0,"status":"live"}               #save coordinates of each player | ||||
|                 try: | ||||
|                     self.table[i]['holecards']=self.MyHand.holecards["PREFLOP"][self.MyHand.players[i][1]][1]+' '+self.MyHand.holecards["PREFLOP"][self.MyHand.players[i][1]][2] | ||||
|                     print "holecards",self.table[i]['holecards'] | ||||
|                 except: | ||||
|                     self.table[i]['holecards']='' | ||||
|             except IndexError:  #if seat is empty | ||||
|                 print "seat",i+1,"out of",self.maxseats,"empty" | ||||
| 
 | ||||
|         self.actions=[]     #create list with all actions | ||||
| 
 | ||||
|         if isinstance(self.MyHand, HoldemOmahaHand): | ||||
|             if self.MyHand.gametype['category'] == 'holdem': | ||||
|                 self.play_holdem() | ||||
| 
 | ||||
|         self.action_number=0 | ||||
|         self.action_level=0 | ||||
|         self.pot=0 | ||||
|         gobject.timeout_add(1000,self.draw_action) | ||||
| 
 | ||||
| 
 | ||||
|     def area_expose(self, area, event): | ||||
|         self.style = self.area.get_style() | ||||
|         self.gc = self.style.fg_gc[gtk.STATE_NORMAL] | ||||
| 
 | ||||
|         playerid='999'  #makes sure we have an error if player is not recognised | ||||
|         for i in range(0,len(self.table)):  #surely there must be a better way to find the player id in the table... | ||||
|             if self.table[i]['name']==self.actions[self.action_number][1]: | ||||
|                 playerid=i | ||||
| 
 | ||||
|         if self.actions[self.action_number][2]=="folds": | ||||
|             self.table[playerid]["status"]="folded" | ||||
| 
 | ||||
|         if self.actions[self.action_number][3]: | ||||
|             self.table[playerid]["stack"] -= Decimal(self.actions[self.action_number][3])  #decreases stack if player bets | ||||
|             self.pot += Decimal(self.actions[self.action_number][3]) #increase pot | ||||
|             self.table[playerid]["chips"] += Decimal(self.actions[self.action_number][3]) #increase player's chips on table | ||||
| 
 | ||||
| 
 | ||||
|         cm = self.gc.get_colormap() #create colormap toi be able to play with colours | ||||
| 
 | ||||
|         color = cm.alloc_color("black") #defaults to black | ||||
|         self.gc.set_foreground(color) | ||||
| 
 | ||||
|         self.area.window.draw_arc(self.gc, 0, 125, 125, 300, 300, 0, 360*64) #table | ||||
| 
 | ||||
|         for i in self.table: | ||||
|             if self.table[i]["status"]=="folded": | ||||
|                 color = cm.alloc_color("grey") #player has folded => greyed out | ||||
|                 self.gc.set_foreground(color) | ||||
|             else: | ||||
|                 color = cm.alloc_color("black") #player is live | ||||
|                 self.gc.set_foreground(color) | ||||
|             self.pangolayout.set_text(self.table[i]["name"]+self.table[i]["holecards"])     #player names + holecards | ||||
|             self.area.window.draw_layout(self.gc, self.table[i]["x"],self.table[i]["y"], self.pangolayout) | ||||
|             self.pangolayout.set_text('$'+str(self.table[i]["stack"]))     #player stacks | ||||
|             self.area.window.draw_layout(self.gc, self.table[i]["x"]+10,self.table[i]["y"]+20, self.pangolayout) | ||||
| 
 | ||||
|         color = cm.alloc_color("green") | ||||
|         self.gc.set_foreground(color) | ||||
| 
 | ||||
|         self.pangolayout.set_text(self.currency+str(self.pot)) #displays pot | ||||
|         self.area.window.draw_layout(self.gc,270,270, self.pangolayout) | ||||
| 
 | ||||
|         if self.actions[self.action_number][0]>1:   #displays flop | ||||
|             self.pangolayout.set_text(self.MyHand.board['FLOP'][0]+" "+self.MyHand.board['FLOP'][1]+" "+self.MyHand.board['FLOP'][2]) | ||||
|             self.area.window.draw_layout(self.gc,210,240, self.pangolayout) | ||||
|         if self.actions[self.action_number][0]>2:   #displays turn | ||||
|             self.pangolayout.set_text(self.MyHand.board['TURN'][0]) | ||||
|             self.area.window.draw_layout(self.gc,270,240, self.pangolayout) | ||||
|         if self.actions[self.action_number][0]>3:   #displays river | ||||
|             self.pangolayout.set_text(self.MyHand.board['RIVER'][0]) | ||||
|             self.area.window.draw_layout(self.gc,290,240, self.pangolayout) | ||||
| 
 | ||||
|         color = cm.alloc_color("red")   #highlights the action | ||||
|         self.gc.set_foreground(color) | ||||
| 
 | ||||
|         self.pangolayout.set_text(self.actions[self.action_number][2]) #displays action | ||||
|         self.area.window.draw_layout(self.gc, self.table[playerid]["x"]+10,self.table[playerid]["y"]+35, self.pangolayout) | ||||
|         if self.actions[self.action_number][3]:  #displays amount | ||||
|             self.pangolayout.set_text(self.currency+self.actions[self.action_number][3]) | ||||
|             self.area.window.draw_layout(self.gc, self.table[playerid]["x"]+10,self.table[playerid]["y"]+55, self.pangolayout) | ||||
| 
 | ||||
|         color = cm.alloc_color("black")      #we don't want to draw the filters and others in red | ||||
|         self.gc.set_foreground(color) | ||||
| 
 | ||||
|     def play_holdem(self): | ||||
|         actions=('BLINDSANTES','PREFLOP','FLOP','TURN','RIVER') | ||||
|         for action in actions: | ||||
|             for i in range(0,len(self.MyHand.actions[action])): | ||||
|                 player=self.MyHand.actions[action][i][0] | ||||
|                 act=self.MyHand.actions[action][i][1] | ||||
|                 try: | ||||
|                     amount=str(self.MyHand.actions[action][i][2]) | ||||
|                 except: | ||||
|                     amount=''   #no amount | ||||
|                 self.actions.append([actions.index(action),player,act,amount])  #create table with all actions | ||||
| 
 | ||||
| 
 | ||||
|     def draw_action(self): | ||||
|         if self.action_number==len(self.actions)-1:     #no more actions, we exit the loop | ||||
|             return False | ||||
| 
 | ||||
|         if self.actions[self.action_number][0]!=self.action_level:  #have we changed street ? | ||||
|             self.action_level=self.actions[self.action_number][0] #record the new street | ||||
|             if self.action_level>1: #we don't want to refresh if simply moving from antes/blinds to preflop action | ||||
|                 alloc = self.area.get_allocation() | ||||
|                 rect = gtk.gdk.Rectangle(0, 0, alloc.width, alloc.height) | ||||
|                 self.area.window.invalidate_rect(rect, True)    #make sure we refresh the whole screen | ||||
| 
 | ||||
|         self.action_number+=1 | ||||
|         if self.area.window: | ||||
|             playerid='999'  #makes sure we have an error if player is not recognised | ||||
|             for i in range(0,len(self.table)):  #surely there must be a better way to find the player id in the table... | ||||
|                 if self.table[i]['name']==self.actions[self.action_number][1]: | ||||
|                     playerid=i | ||||
|                     rect = gtk.gdk.Rectangle(self.table[playerid]["x"],self.table[playerid]["y"],100,100) | ||||
|                     self.area.window.invalidate_rect(rect, True)    #refresh player area of the screen | ||||
|                     rect = gtk.gdk.Rectangle(270,270,100,50) | ||||
|                     self.area.window.invalidate_rect(rect, True)    #refresh pot area | ||||
|             self.area.window.process_updates(True) | ||||
|         print "draw action",self.action_number,self.actions[self.action_number][1],self.actions[self.action_number][2],self.actions[self.action_number][3] | ||||
|         return True | ||||
| 
 | ||||
| 
 | ||||
|     def get_vbox(self): | ||||
|         """returns the vbox of this thread""" | ||||
|         return self.mainHBox | ||||
| 
 | ||||
|     def importhand(self, handnumber=1): | ||||
|         """Temporary function that grabs a Hand object from a specified file. Obviously this will | ||||
|         be replaced by a function to select a hand from the db in the not so distant future. | ||||
|         This code has been shamelessly stolen from Carl | ||||
|         """ | ||||
|         config = Configuration.Config(file = "HUD_config.test.xml") | ||||
|         db = Database.Database(config) | ||||
|         sql = SQL.Sql(db_server = 'sqlite') | ||||
|         settings = {} | ||||
|         settings.update(config.get_db_parameters()) | ||||
|         settings.update(config.get_import_parameters()) | ||||
|         settings.update(config.get_default_paths()) | ||||
|         #db.recreate_tables() | ||||
|         importer = fpdb_import.Importer(False, settings, config, None) | ||||
|         importer.setDropIndexes("don't drop") | ||||
|         importer.setFailOnError(True) | ||||
|         importer.setThreads(-1) | ||||
|         importer.setCallHud(False) | ||||
|         importer.setFakeCacheHHC(True) | ||||
| 
 | ||||
|         #Get a simple regression file with a few hands of Hold'em | ||||
|         filename="regression-test-files/cash/Stars/Flop/NLHE-FR-USD-0.01-0.02-201005.microgrind.txt" | ||||
|         site="PokerStars" | ||||
| 
 | ||||
| 
 | ||||
|         importer.addBulkImportImportFileOrDir(filename, site=site) | ||||
|         (stored, dups, partial, errs, ttime) = importer.runImport() | ||||
| 
 | ||||
| 
 | ||||
|         hhc = importer.getCachedHHC() | ||||
|         handlist = hhc.getProcessedHands() | ||||
|   | ||||
|         return handlist[0] | ||||
| 
 | ||||
| 
 | ||||
|     def temp(self): | ||||
|         pass | ||||
| 
 | ||||
|  | @ -75,10 +75,6 @@ onlinehelp = {'Game':_('Type of Game'), | |||
| class DemoTips(TreeViewTooltips): | ||||
| 
 | ||||
|     def __init__(self, customer_column): | ||||
|         # customer_column is an instance of gtk.TreeViewColumn and | ||||
|         # is being used in the gtk.TreeView to show customer names. | ||||
|         # self.cust_col = customer_column | ||||
| 
 | ||||
|         # call base class init | ||||
|         TreeViewTooltips.__init__(self) | ||||
| 
 | ||||
|  | @ -91,11 +87,6 @@ class DemoTips(TreeViewTooltips): | |||
|         return (display) | ||||
| 
 | ||||
|     def location(self, x, y, w, h): | ||||
|         # rename me to "location" so I override the base class | ||||
|         # method.  This will demonstrate being able to change | ||||
|         # where the tooltip window popups, relative to the | ||||
|         # pointer. | ||||
| 
 | ||||
|         # this will place the tooltip above and to the right | ||||
|         return x + 30, y - (h + 10) | ||||
|          | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
| 
 | ||||
| <FreePokerToolsConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FreePokerToolsConfig.xsd"> | ||||
| 
 | ||||
|     <import callFpdbHud = "True" interval = "10"  fastStoreHudCache="False" hhArchiveBase="~/.fpdb/HandHistories/" saveActions="True"></import> | ||||
|     <import callFpdbHud = "True" interval = "10"  fastStoreHudCache="False" hhArchiveBase="~/.fpdb/HandHistories/" saveActions="True" cacheSessions="False"></import> | ||||
| 
 | ||||
| <!-- These values determine what stats are displayed in the HUD | ||||
| 
 | ||||
|  |  | |||
|  | @ -12,7 +12,7 @@ | |||
|              config_difficulty="expert" | ||||
|              /> | ||||
| 
 | ||||
|     <import callFpdbHud = "True" interval = "10"  fastStoreHudCache="False" hhArchiveBase="~/.fpdb/HandHistories/" saveActions="True"></import> | ||||
|     <import callFpdbHud = "True" interval = "10"  fastStoreHudCache="False" hhArchiveBase="~/.fpdb/HandHistories/" saveActions="True" cacheSessions="False"></import> | ||||
| 
 | ||||
|     <gui_cash_stats> | ||||
|         <col col_name="game"       disp_all="True"  disp_posn="True"  col_title="Game"     xalignment="0.0" field_format="%s"    field_type="str" /> | ||||
|  |  | |||
|  | @ -278,6 +278,9 @@ db: a connected Database object""" | |||
| 
 | ||||
|     def updateHudCache(self, db): | ||||
|         db.storeHudCache(self.dbid_gt, self.dbid_pids, self.startTime, self.stats.getHandsPlayers()) | ||||
|          | ||||
|     def updateSessionsCache(self, db): | ||||
|         db.storeSessionsCache(self.dbid_pids, self.startTime, self.stats.getHandsPlayers()) | ||||
| 
 | ||||
|     def select(self, handId): | ||||
|         """ Function to create Hand object from database """ | ||||
|  |  | |||
|  | @ -45,22 +45,27 @@ class PartyPoker(HandHistoryConverter): | |||
|     codepage = "utf8" | ||||
|     siteId = 9 | ||||
|     filetype = "text" | ||||
|     sym = {'USD': "\$", } | ||||
|     sym        = {'USD': "\$", 'EUR': u"\u20ac", 'T$': ""} | ||||
|     currencies = {"\$": "USD", "$": "USD", u"\xe2\x82\xac": "EUR", u"\u20ac": "EUR", '': "T$"} | ||||
|     substitutions = { | ||||
|                      'LEGAL_ISO' : "USD|EUR",            # legal ISO currency codes | ||||
|                             'LS' : "\$|\u20AC|\xe2\x82\xac|"    # legal currency symbols - Euro(cp1252, utf-8) | ||||
|                     } | ||||
| 
 | ||||
|     # Static regexes | ||||
|     # $5 USD NL Texas Hold'em - Saturday, July 25, 07:53:52 EDT 2009 | ||||
|     # NL Texas Hold'em $1 USD Buy-in Trny:45685440 Level:8  Blinds-Antes(600/1 200 -50) - Sunday, May 17, 11:25:07 MSKS 2009 | ||||
|     re_GameInfoRing     = re.compile(""" | ||||
|             (?P<CURRENCY>\$|)\s*(?P<RINGLIMIT>[.,0-9]+)([.,0-9/$]+)?\s*(?:USD)?\s* | ||||
|     re_GameInfoRing     = re.compile(u""" | ||||
|             (?P<CURRENCY>[%(LS)s])\s*(?P<RINGLIMIT>[.,0-9]+)([.,0-9/$]+)?\s*(?:%(LEGAL_ISO)s)?\s* | ||||
|             (?P<LIMIT>(NL|PL|))\s* | ||||
|             (?P<GAME>(Texas\ Hold\'em|Omaha|7 Card Stud Hi-Lo)) | ||||
|             (?P<GAME>(Texas\ Hold\'em|Omaha|7\ Card\ Stud\ Hi-Lo)) | ||||
|             \s*\-\s* | ||||
|             (?P<DATETIME>.+) | ||||
|             """, re.VERBOSE | re.UNICODE) | ||||
|             """ % substitutions, re.VERBOSE | re.UNICODE) | ||||
|     re_GameInfoTrny     = re.compile(""" | ||||
|             (?P<LIMIT>(NL|PL|))\s* | ||||
|             (?P<GAME>(Texas\ Hold\'em|Omaha))\s+ | ||||
|             (?:(?P<BUYIN>\$?[.,0-9]+)\s*(?P<BUYIN_CURRENCY>USD)?\s*Buy-in\s+)? | ||||
|             (?:(?P<BUYIN>\$?[.,0-9]+)\s*(?P<BUYIN_CURRENCY>%(LEGAL_ISO)s)?\s*Buy-in\s+)? | ||||
|             Trny:\s?(?P<TOURNO>\d+)\s+ | ||||
|             Level:\s*(?P<LEVEL>\d+)\s+ | ||||
|             ((Blinds|Stakes)(?:-Antes)?)\( | ||||
|  | @ -70,15 +75,14 @@ class PartyPoker(HandHistoryConverter): | |||
|             \) | ||||
|             \s*\-\s* | ||||
|             (?P<DATETIME>.+) | ||||
|             """, re.VERBOSE | re.UNICODE) | ||||
|     re_Hid          = re.compile("^Game \#(?P<HID>\d+) starts.") | ||||
|             """ % substitutions, re.VERBOSE | re.UNICODE) | ||||
|     re_Hid          = re.compile("Game \#(?P<HID>\d+) starts.") | ||||
| 
 | ||||
|     re_PlayerInfo   = re.compile(""" | ||||
|     re_PlayerInfo   = re.compile(u""" | ||||
|           Seat\s(?P<SEAT>\d+):\s | ||||
|           (?P<PNAME>.*)\s | ||||
|           \(\s*\$?(?P<CASH>[0-9,.]+)\s*(?:USD|)\s*\) | ||||
|           """ , | ||||
|           re.VERBOSE) | ||||
|           \(\s*[%(LS)s]?(?P<CASH>[0-9,.]+)\s*(?:%(LEGAL_ISO)s|)\s*\) | ||||
|           """ % substitutions, re.VERBOSE| re.UNICODE) | ||||
| 
 | ||||
|     re_HandInfo     = re.compile(""" | ||||
|             ^Table\s+(?P<TTYPE>[$a-zA-Z0-9 ]+)?\s+ | ||||
|  | @ -123,18 +127,16 @@ class PartyPoker(HandHistoryConverter): | |||
| 
 | ||||
|             self.compiledPlayers = players | ||||
|             player_re = "(?P<PNAME>" + "|".join(map(re.escape, players)) + ")" | ||||
|             subst = {'PLYR': player_re, 'CUR_SYM': hand.SYMBOL[hand.gametype['currency']], | ||||
|             subst = {'PLYR': player_re, 'CUR_SYM': self.sym[hand.gametype['currency']], | ||||
|                 'CUR': hand.gametype['currency'] if hand.gametype['currency']!='T$' else ''} | ||||
|             for key in ('CUR_SYM', 'CUR'): | ||||
|                 subst[key] = re.escape(subst[key]) | ||||
|             self.re_PostSB = re.compile( | ||||
|                 r"^%(PLYR)s posts small blind \[%(CUR_SYM)s(?P<SB>[.,0-9]+) ?%(CUR)s\]\." %  subst, | ||||
|                 re.MULTILINE) | ||||
|                 r"^%(PLYR)s posts small blind \[%(CUR_SYM)s(?P<SB>[.,0-9]+) ?%(CUR)s\]\." | ||||
|                 %  subst, re.MULTILINE) | ||||
|             self.re_PostBB = re.compile( | ||||
|                 r"^%(PLYR)s posts big blind \[%(CUR_SYM)s(?P<BB>[.,0-9]+) ?%(CUR)s\]\." %  subst, | ||||
|                 re.MULTILINE) | ||||
|                 u"%(PLYR)s posts big blind \[%(CUR_SYM)s(?P<BB>[.,0-9]+) ?%(CUR)s\]\." | ||||
|                 %  subst, re.MULTILINE) | ||||
|             self.re_PostDead = re.compile( | ||||
|                 r"^%(PLYR)s posts big blind \+ dead \[(?P<BBNDEAD>[.,0-9]+) ?%(CUR_SYM)s\]\." %  subst, | ||||
|                 r"^%(PLYR)s posts big blind + dead \[(?P<BBNDEAD>[.,0-9]+) ?%(CUR_SYM)s\]\." %  subst, | ||||
|                 re.MULTILINE) | ||||
|             self.re_Antes = re.compile( | ||||
|                 r"^%(PLYR)s posts ante \[%(CUR_SYM)s(?P<ANTE>[.,0-9]+) ?%(CUR)s\]" %  subst, | ||||
|  | @ -142,11 +144,10 @@ class PartyPoker(HandHistoryConverter): | |||
|             self.re_HeroCards = re.compile( | ||||
|                 r"^Dealt to %(PLYR)s \[\s*(?P<NEWCARDS>.+)\s*\]" % subst, | ||||
|                 re.MULTILINE) | ||||
|             self.re_Action = re.compile(r""" | ||||
|             self.re_Action = re.compile(u""" | ||||
|                 ^%(PLYR)s\s+(?P<ATYPE>bets|checks|raises|calls|folds|is\sall-In) | ||||
|                 (?:\s+\[%(CUR_SYM)s(?P<BET>[.,\d]+)\s*%(CUR)s\])? | ||||
|                 """ %  subst, | ||||
|                 re.MULTILINE|re.VERBOSE) | ||||
|                 """ %  subst, re.MULTILINE|re.VERBOSE) | ||||
|             self.re_ShownCards = re.compile( | ||||
|                 r"^%s (?P<SHOWED>(?:doesn\'t )?shows?) "  %  player_re + | ||||
|                 r"\[ *(?P<CARDS>.+) *\](?P<COMBINATION>.+)\.", | ||||
|  | @ -181,10 +182,6 @@ class PartyPoker(HandHistoryConverter): | |||
|                         return self._gameType | ||||
|         return self._gameType | ||||
| 
 | ||||
|     @staticmethod | ||||
|     def decode_hand_text(handText): | ||||
|         return handText.encode("latin1").decode(LOCALE_ENCODING) | ||||
| 
 | ||||
|     def determineGameType(self, handText): | ||||
|         """inspect the handText and return the gametype dict | ||||
| 
 | ||||
|  | @ -192,7 +189,6 @@ class PartyPoker(HandHistoryConverter): | |||
|         {'limitType': xxx, 'base': xxx, 'category': xxx}""" | ||||
| 
 | ||||
|         info = {} | ||||
|         handText = self.decode_hand_text(handText) | ||||
|         m = self._getGameType(handText) | ||||
|         m_20BBmin = self.re_20BBmin.search(handText) | ||||
|         if m is None: | ||||
|  | @ -210,7 +206,6 @@ class PartyPoker(HandHistoryConverter): | |||
|                                 'Omaha' : ('hold','omahahi'), | ||||
|                      "7 Card Stud Hi-Lo" : ('stud','studhi'), | ||||
|                } | ||||
|         currencies = { '$':'USD', '':'T$' } | ||||
| 
 | ||||
|         for expectedField in ['LIMIT', 'GAME']: | ||||
|             if mg[expectedField] is None: | ||||
|  | @ -243,7 +238,7 @@ class PartyPoker(HandHistoryConverter): | |||
| 
 | ||||
|             info['bb'] = "%.2f" % (bb) | ||||
|             info['sb'] = "%.2f" % (sb) | ||||
|             info['currency'] = currencies[mg['CURRENCY']] | ||||
|             info['currency'] = self.currencies[mg['CURRENCY']] | ||||
|         else: | ||||
|             info['sb'] = clearMoneyString(mg['SB']) | ||||
|             info['bb'] = clearMoneyString(mg['BB']) | ||||
|  | @ -253,15 +248,11 @@ class PartyPoker(HandHistoryConverter): | |||
| 
 | ||||
| 
 | ||||
|     def readHandInfo(self, hand): | ||||
|         # we should redecode handtext here (as it imposible to it above) | ||||
|         # if you know more accurate way to do it - tell me | ||||
|         hand.handText = self.decode_hand_text(hand.handText) | ||||
| 
 | ||||
|         info = {} | ||||
|         try: | ||||
|             info.update(self.re_Hid.search(hand.handText).groupdict()) | ||||
|         except: | ||||
|             raise FpdbParseError(_("Cannot read HID for current hand")) | ||||
|         except AttributeError, e: | ||||
|             raise FpdbParseError(_("Cannot read HID for current hand: %s" % e)) | ||||
| 
 | ||||
|         try: | ||||
|             info.update(self.re_HandInfo.search(hand.handText,re.DOTALL).groupdict()) | ||||
|  | @ -374,7 +365,6 @@ class PartyPoker(HandHistoryConverter): | |||
|             else: | ||||
|                 #zero stacked players are added later | ||||
|                 zeroStackPlayers.append([int(a.group('SEAT')), a.group('PNAME'), clearMoneyString(a.group('CASH'))]) | ||||
| 
 | ||||
|         if hand.gametype['type'] == 'ring': | ||||
|             #finds first vacant seat after an exact seat | ||||
|             def findFirstEmptySeat(startSeat): | ||||
|  |  | |||
|  | @ -264,7 +264,7 @@ class PokerStars(HandHistoryConverter): | |||
|                             hand.buyinCurrency="PSFP" | ||||
|                         else: | ||||
|                             #FIXME: handle other currencies, FPP, play money | ||||
|                             raise FpdbParseError(_("failed to detect currency")) | ||||
|                             raise FpdbParseError(_("Failed to detect currency: '%s'" % info[key])) | ||||
| 
 | ||||
|                         info['BIAMT'] = info['BIAMT'].strip(u'$€FPP') | ||||
|                          | ||||
|  |  | |||
|  | @ -1064,7 +1064,7 @@ class Sql: | |||
|                         activeSeats SMALLINT NOT NULL, | ||||
|                         position CHAR(1), | ||||
|                         tourneyTypeId SMALLINT UNSIGNED, FOREIGN KEY (tourneyTypeId) REFERENCES TourneyTypes(id), | ||||
|                         styleKey CHAR(9) NOT NULL,  /* 1st char is style (A/T/H/S), other 8 are the key */ | ||||
|                         styleKey CHAR(7) NOT NULL,  /* 1st char is style (A/T/H/S), other 6 are the key */ | ||||
|                         HDs INT NOT NULL, | ||||
| 
 | ||||
|                         wonWhenSeenStreet1 FLOAT, | ||||
|  | @ -1165,7 +1165,7 @@ class Sql: | |||
|                         activeSeats SMALLINT, | ||||
|                         position CHAR(1), | ||||
|                         tourneyTypeId INT, FOREIGN KEY (tourneyTypeId) REFERENCES TourneyTypes(id), | ||||
|                         styleKey CHAR(9) NOT NULL,  /* 1st char is style (A/T/H/S), other 8 are the key */ | ||||
|                         styleKey CHAR(7) NOT NULL,  /* 1st char is style (A/T/H/S), other 6 are the key */ | ||||
|                         HDs INT, | ||||
| 
 | ||||
|                         wonWhenSeenStreet1 FLOAT, | ||||
|  | @ -2047,7 +2047,7 @@ class Sql: | |||
|         # gets a date, would need to use handsplayers (not hudcache) to get exact hand Id | ||||
|         if db_server == 'mysql': | ||||
|             self.query['get_date_nhands_ago'] = """ | ||||
|                 select concat( 'd', date_format(max(h.startTime), '%Y%m%d%H') ) | ||||
|                 select concat( 'd', date_format(max(h.startTime), '%Y%m%d') ) | ||||
|                 from (select hp.playerId | ||||
|                             ,coalesce(greatest(max(hp.handId)-%s,1),1) as maxminusx | ||||
|                       from HandsPlayers hp | ||||
|  | @ -2059,7 +2059,7 @@ class Sql: | |||
|                 """ | ||||
|         elif db_server == 'postgresql': | ||||
|             self.query['get_date_nhands_ago'] = """ | ||||
|                 select 'd' || to_char(max(h3.startTime), 'YYMMDDHH') | ||||
|                 select 'd' || to_char(max(h3.startTime), 'YYMMDD') | ||||
|                 from (select hp.playerId | ||||
|                             ,coalesce(greatest(max(hp.handId)-%s,1),1) as maxminusx | ||||
|                       from HandsPlayers hp | ||||
|  | @ -2071,7 +2071,7 @@ class Sql: | |||
|                 """ | ||||
|         elif db_server == 'sqlite': # untested guess at query: | ||||
|             self.query['get_date_nhands_ago'] = """ | ||||
|                 select 'd' || strftime(max(h3.startTime), 'YYMMDDHH') | ||||
|                 select 'd' || strftime(max(h3.startTime), 'YYMMDD') | ||||
|                 from (select hp.playerId | ||||
|                             ,coalesce(greatest(max(hp.handId)-%s,1),1) as maxminusx | ||||
|                       from HandsPlayers hp | ||||
|  | @ -2479,7 +2479,11 @@ class Sql: | |||
|                       select s.name                                                                 AS siteName | ||||
|                             ,t.tourneyTypeId                                                        AS tourneyTypeId | ||||
|                             ,tt.currency                                                            AS currency | ||||
|                             ,(CASE WHEN tt.currency = 'USD' THEN tt.buyIn/100.0 ELSE tt.buyIn END)  AS buyIn | ||||
|                             ,(CASE | ||||
|                                 WHEN tt.currency = 'USD' THEN tt.buyIn/100.0 | ||||
|                                 WHEN tt.currency = 'EUR' THEN tt.buyIn/100.0 | ||||
|                                 ELSE tt.buyIn | ||||
|                               END)                                                                  AS buyIn | ||||
|                             ,tt.fee/100.0                                                           AS fee | ||||
|                             ,tt.category                                                            AS category | ||||
|                             ,tt.limitType                                                           AS limitType | ||||
|  | @ -2512,7 +2516,11 @@ class Sql: | |||
|                       select s.name                                                                 AS siteName | ||||
|                             ,t.tourneyTypeId                                                        AS tourneyTypeId | ||||
|                             ,tt.currency                                                            AS currency | ||||
|                             ,(CASE WHEN tt.currency = 'USD' THEN tt.buyIn/100.0 ELSE tt.buyIn END)  AS buyIn | ||||
|                             ,(CASE | ||||
|                                 WHEN tt.currency = 'USD' THEN tt.buyIn/100.0 | ||||
|                                 WHEN tt.currency = 'EUR' THEN tt.buyIn/100.0 | ||||
|                                 ELSE tt.buyIn | ||||
|                               END)                                                                  AS buyIn | ||||
|                             ,tt.fee/100.0                                                           AS fee | ||||
|                             ,tt.category                                                            AS category | ||||
|                             ,tt.limitType                                                           AS limitType | ||||
|  | @ -2546,7 +2554,11 @@ class Sql: | |||
|                       select s.name                                                                 AS siteName | ||||
|                             ,t.tourneyTypeId                                                        AS tourneyTypeId | ||||
|                             ,tt.currency                                                            AS currency | ||||
|                             ,(CASE WHEN tt.currency = 'USD' THEN tt.buyIn/100.0 ELSE tt.buyIn END)  AS buyIn | ||||
|                             ,(CASE | ||||
|                                 WHEN tt.currency = 'USD' THEN tt.buyIn/100.0 | ||||
|                                 WHEN tt.currency = 'EUR' THEN tt.buyIn/100.0 | ||||
|                                 ELSE tt.buyIn | ||||
|                               END)                                                                  AS buyIn | ||||
|                             ,tt.fee/100.0                                                           AS fee | ||||
|                             ,tt.category                                                            AS category | ||||
|                             ,tt.limitType                                                           AS limitType | ||||
|  | @ -3290,7 +3302,7 @@ class Sql: | |||
|                             else 'E' | ||||
|                        end                                            AS hc_position | ||||
|                       <tourney_select_clause> | ||||
|                       ,date_format(h.startTime, 'd%y%m%d%H') | ||||
|                       ,date_format(h.startTime, 'd%y%m%d') | ||||
|                       ,count(1) | ||||
|                       ,sum(wonWhenSeenStreet1) | ||||
|                       ,sum(wonWhenSeenStreet2) | ||||
|  | @ -3379,7 +3391,7 @@ class Sql: | |||
|                         ,h.seats | ||||
|                         ,hc_position | ||||
|                         <tourney_group_clause> | ||||
|                         ,date_format(h.startTime, 'd%y%m%d%H') | ||||
|                         ,date_format(h.startTime, 'd%y%m%d') | ||||
| """ | ||||
|         elif db_server == 'postgresql': | ||||
|             self.query['rebuildHudCache'] = """ | ||||
|  | @ -3488,7 +3500,7 @@ class Sql: | |||
|                             else 'E' | ||||
|                        end                                            AS hc_position | ||||
|                       <tourney_select_clause> | ||||
|                       ,'d' || to_char(h.startTime, 'YYMMDDHH') | ||||
|                       ,'d' || to_char(h.startTime, 'YYMMDD') | ||||
|                       ,count(1) | ||||
|                       ,sum(wonWhenSeenStreet1) | ||||
|                       ,sum(wonWhenSeenStreet2) | ||||
|  | @ -3577,7 +3589,7 @@ class Sql: | |||
|                         ,h.seats | ||||
|                         ,hc_position | ||||
|                         <tourney_group_clause> | ||||
|                         ,to_char(h.startTime, 'YYMMDDHH') | ||||
|                         ,to_char(h.startTime, 'YYMMDD') | ||||
| """ | ||||
|         else:   # assume sqlite | ||||
|             self.query['rebuildHudCache'] = """ | ||||
|  | @ -3686,7 +3698,7 @@ class Sql: | |||
|                             else 'E' | ||||
|                        end                                            AS hc_position | ||||
|                       <tourney_select_clause> | ||||
|                       ,'d' || substr(strftime('%Y%m%d%H', h.startTime),3,9) | ||||
|                       ,'d' || substr(strftime('%Y%m%d', h.startTime),3,7) | ||||
|                       ,count(1) | ||||
|                       ,sum(wonWhenSeenStreet1) | ||||
|                       ,sum(wonWhenSeenStreet2) | ||||
|  | @ -3775,7 +3787,7 @@ class Sql: | |||
|                         ,h.seats | ||||
|                         ,hc_position | ||||
|                         <tourney_group_clause> | ||||
|                         ,'d' || substr(strftime('%Y%m%d%H', h.startTime),3,9) | ||||
|                         ,'d' || substr(strftime('%Y%m%d', h.startTime),3,7) | ||||
| """ | ||||
| 
 | ||||
|         self.query['insert_hudcache'] = """ | ||||
|  | @ -3968,7 +3980,8 @@ class Sql: | |||
|             AND   playerId=%s | ||||
|             AND   activeSeats=%s | ||||
|             AND   position=%s | ||||
|             AND   tourneyTypeId+0=%s | ||||
|             AND   (case when tourneyTypeId is NULL then 1 else  | ||||
|                    (case when tourneyTypeId+0=%s then 1 else 0 end) end)=1 | ||||
|             AND   styleKey=%s""" | ||||
| 
 | ||||
|         self.query['get_hero_hudcache_start'] = """select min(hc.styleKey) | ||||
|  |  | |||
|  | @ -27,7 +27,7 @@ class Stove: | |||
|     def __init__(self): | ||||
|         self.hand = None | ||||
|         self.board = None | ||||
|         self.range = None | ||||
|         self.h_range = None | ||||
| 
 | ||||
|     def set_board_with_list(self, board): | ||||
|         pass | ||||
|  | @ -58,7 +58,7 @@ class Stove: | |||
| 
 | ||||
|     def set_villain_range_string(self, string): | ||||
|         # Villain's range | ||||
|         range = Range() | ||||
|         h_range = Range() | ||||
|         hands_in_range = string.strip().split(',') | ||||
|         for h in hands_in_range: | ||||
|             _h = h.strip() | ||||
|  | @ -67,11 +67,11 @@ class Stove: | |||
|                 r1 = cc[0] | ||||
|                 r2 = cc[1] | ||||
|                 vp = Cards(r1, r2) | ||||
|                 range.add(vp) | ||||
|                 h_range.add(vp) | ||||
|             else: | ||||
|                 range.expand(expand_hands(_h, pocket_cards, board)) | ||||
|                 h_range.expand(expand_hands(_h, self.hand, self.board)) | ||||
| 
 | ||||
|         self.range = range | ||||
|         self.h_range = h_range | ||||
| 
 | ||||
| 
 | ||||
| class Cards: | ||||
|  | @ -147,37 +147,17 @@ class SumEV: | |||
|         self.n_ties += ev.n_ties | ||||
|         self.n_losses += ev.n_losses | ||||
| 
 | ||||
|     def show(self, hand, range): | ||||
|     def show(self, hand, h_range): | ||||
|         win_pct = 100 * (float(self.n_wins) / float(self.n_hands)) | ||||
|         lose_pct = 100 * (float(self.n_losses) / float(self.n_hands)) | ||||
|         tie_pct = 100 * (float(self.n_ties) / float(self.n_hands)) | ||||
|         print 'Enumerated %d possible plays.' % self.n_hands | ||||
|         print 'Your hand: (%s %s)' % (hand.c1, hand.c2) | ||||
|         print 'Against the range: %s\n' % cards_from_range(range) | ||||
|         print 'Against the range: %s\n' % cards_from_range(h_range) | ||||
|         print '  Win       Lose       Tie' | ||||
|         print ' %5.2f%%    %5.2f%%    %5.2f%%' % (win_pct, lose_pct, tie_pct) | ||||
| 
 | ||||
| 
 | ||||
| def usage(me): | ||||
|     print """Texas Hold'Em odds calculator | ||||
| Calculates odds against a range of hands. | ||||
| 
 | ||||
| To use: %s '<board cards>' '<your hand>' '<opponent's range>' [...] | ||||
| 
 | ||||
| Separate cards with space. | ||||
| Separate hands in range with commas. | ||||
| """ % me | ||||
| 
 | ||||
| def cards_from_range(range): | ||||
|     s = '{' | ||||
|     for h in range: | ||||
|         if h.c1 == '__' and h.c2 == '__': | ||||
|             s += 'random, ' | ||||
|         else: | ||||
|             s += '%s%s, ' % (h.c1, h.c2) | ||||
|     s = s.rstrip(', ') | ||||
|     s += '}' | ||||
|     return s | ||||
| 
 | ||||
| 
 | ||||
| # Expands hand abbreviations such as JJ and AK to full hand ranges. | ||||
|  | @ -202,7 +182,7 @@ def expand_hands(abbrev, hand, board): | |||
|     else: | ||||
|         selection = ANY | ||||
| 
 | ||||
|     range = [] | ||||
|     h_range = [] | ||||
|     considered = set() | ||||
|     for s1 in SUITS: | ||||
|         c1 = r1 + s1 | ||||
|  | @ -216,8 +196,8 @@ def expand_hands(abbrev, hand, board): | |||
|             elif selection == OFFSUIT and s1 == s2: | ||||
|                 continue | ||||
|             if c2 not in considered and c2 not in known_cards: | ||||
|                 range.append(Cards(c1, c2)) | ||||
|     return range | ||||
|                 h_range.append(Cards(c1, c2)) | ||||
|     return h_range | ||||
| 
 | ||||
| 
 | ||||
| def parse_args(args, container): | ||||
|  | @ -229,7 +209,6 @@ def parse_args(args, container): | |||
|     container.set_hero_cards_string(args[2]) | ||||
|     container.set_villain_range_string(args[3]) | ||||
| 
 | ||||
| 
 | ||||
|     return True | ||||
| 
 | ||||
| 
 | ||||
|  | @ -281,7 +260,7 @@ def odds_for_range(holder): | |||
|         iters = random.randint(25000, 125000) | ||||
|     else: | ||||
|         iters = -1 | ||||
|     for h in holder.range.get(): | ||||
|     for h in holder.h_range.get(): | ||||
|         e = odds_for_hand( | ||||
|             [holder.hand.c1, holder.hand.c2], | ||||
|             [h.c1, h.c2], | ||||
|  | @ -290,7 +269,28 @@ def odds_for_range(holder): | |||
|             ) | ||||
|         sev.add(e) | ||||
| 
 | ||||
|     sev.show(holder.hand, holder.range.get()) | ||||
|     sev.show(holder.hand, holder.h_range.get()) | ||||
| 
 | ||||
| def usage(me): | ||||
|     print """Texas Hold'Em odds calculator | ||||
| Calculates odds against a range of hands. | ||||
| 
 | ||||
| To use: %s '<board cards>' '<your hand>' '<opponent's range>' [...] | ||||
| 
 | ||||
| Separate cards with space. | ||||
| Separate hands in range with commas. | ||||
| """ % me | ||||
| 
 | ||||
| def cards_from_range(h_range): | ||||
|     s = '{' | ||||
|     for h in h_range: | ||||
|         if h.c1 == '__' and h.c2 == '__': | ||||
|             s += 'random, ' | ||||
|         else: | ||||
|             s += '%s%s, ' % (h.c1, h.c2) | ||||
|     s = s.rstrip(', ') | ||||
|     s += '}' | ||||
|     return s | ||||
| 
 | ||||
| def main(argv=None): | ||||
|     stove = Stove() | ||||
|  |  | |||
|  | @ -116,6 +116,7 @@ import GuiAutoImport | |||
| import GuiGraphViewer | ||||
| import GuiTourneyGraphViewer | ||||
| import GuiSessionViewer | ||||
| import GuiReplayer | ||||
| import GuiStove | ||||
| import SQL | ||||
| import Database | ||||
|  | @ -779,6 +780,7 @@ class fpdb: | |||
|                   <menuitem action="tourneyviewer"/> | ||||
|                   <menuitem action="posnstats"/> | ||||
|                   <menuitem action="sessionstats"/> | ||||
|                   <menuitem action="replayer"/> | ||||
|                   <menuitem action="stove"/> | ||||
|                 </menu> | ||||
|                 <menu action="database"> | ||||
|  | @ -822,6 +824,7 @@ class fpdb: | |||
|                                  ('tourneyviewer', None, _('Tourney _Viewer'), None, 'Tourney Viewer)', self.tab_tourney_viewer_stats), | ||||
|                                  ('posnstats', None, _('P_ositional Stats (tabulated view, not on sqlite)'), _('<control>O'), 'Positional Stats (tabulated view, not on sqlite)', self.tab_positional_stats), | ||||
|                                  ('sessionstats', None, _('Session Stats'), None, 'Session Stats', self.tab_session_stats), | ||||
|                                  ('replayer', None, _('Hand _Replayer'), None, 'Hand Replayer', self.tab_replayer), | ||||
|                                  ('database', None, _('_Database')), | ||||
|                                  ('maintaindbs', None, _('_Maintain Databases'), None, 'Maintain Databases', self.dia_maintain_dbs), | ||||
|                                  ('createtabs', None, _('Create or Recreate _Tables'), None, 'Create or Recreate Tables ', self.dia_recreate_tables), | ||||
|  | @ -1046,6 +1049,12 @@ class fpdb: | |||
|         ps_tab=new_ps_thread.get_vbox() | ||||
|         self.add_and_display_tab(ps_tab, _("Session Stats")) | ||||
| 
 | ||||
|     def tab_replayer(self, widget, data=None): | ||||
|         new_ps_thread = GuiReplayer.GuiReplayer(self.config, self.sql, self.window) | ||||
|         self.threads.append(new_ps_thread) | ||||
|         ps_tab=new_ps_thread.get_vbox() | ||||
|         self.add_and_display_tab(ps_tab, _("Hand Replayer")) | ||||
| 
 | ||||
|     def tab_main_help(self, widget, data=None): | ||||
|         """Displays a tab with the main fpdb help screen""" | ||||
|         mh_tab=gtk.Label(_("""Fpdb needs translators! | ||||
|  |  | |||
							
								
								
									
										24
									
								
								pyfpdb/fpdb_import.py
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										24
									
								
								pyfpdb/fpdb_import.py
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							|  | @ -83,6 +83,7 @@ class Importer: | |||
|         self.pos_in_file = {}        # dict to remember how far we have read in the file | ||||
|         #Set defaults | ||||
|         self.callHud    = self.config.get_import_parameters().get("callFpdbHud") | ||||
|         self.cacheSessions = self.config.get_import_parameters().get("cacheSessions") | ||||
| 
 | ||||
|         # CONFIGURATION OPTIONS | ||||
|         self.settings.setdefault("minPrint", 30) | ||||
|  | @ -110,6 +111,9 @@ class Importer: | |||
|     #Set functions | ||||
|     def setCallHud(self, value): | ||||
|         self.callHud = value | ||||
|          | ||||
|     def setCacheSessions(self, value): | ||||
|         self.cacheSessions = value | ||||
| 
 | ||||
|     def setMinPrint(self, value): | ||||
|         self.settings['minPrint'] = int(value) | ||||
|  | @ -491,14 +495,22 @@ class Importer: | |||
|                         if hand is not None and not hand.is_duplicate: | ||||
|                             hand.updateHudCache(self.database) | ||||
|                 self.database.commit() | ||||
|                  | ||||
|                 # Call sessionsCache update | ||||
|                 if self.cacheSessions: | ||||
|                     for hand in handlist: | ||||
|                         if hand is not None and not hand.is_duplicate: | ||||
|                             hand.updateSessionsCache(self.database) | ||||
|                 self.database.commit() | ||||
| 
 | ||||
|                 #pipe the Hands.id out to the HUD | ||||
|                 for hid in to_hud: | ||||
|                     try: | ||||
|                         print _("fpdb_import: sending hand to hud"), hand.dbid_hands, "pipe =", self.caller.pipe_to_hud | ||||
|                         self.caller.pipe_to_hud.stdin.write("%s" % (hid) + os.linesep) | ||||
|                     except IOError, e: | ||||
|                         log.error(_("Failed to send hand to HUD: %s") % e) | ||||
|                 if self.caller: | ||||
|                     for hid in to_hud: | ||||
|                         try: | ||||
|                             print _("fpdb_import: sending hand to hud"), hand.dbid_hands, "pipe =", self.caller.pipe_to_hud | ||||
|                             self.caller.pipe_to_hud.stdin.write("%s" % (hid) + os.linesep) | ||||
|                         except IOError, e: | ||||
|                             log.error(_("Failed to send hand to HUD: %s") % e) | ||||
| 
 | ||||
|                 errors = getattr(hhc, 'numErrors') | ||||
|                 stored = getattr(hhc, 'numHands') | ||||
|  |  | |||
|  | @ -0,0 +1,32 @@ | |||
| Game #9864152000 starts. | ||||
| 
 | ||||
| #Game No : 9864152000  | ||||
| ***** Hand History for Game 9864152000 ***** | ||||
| €10 EUR NL Texas Hold'em - Sunday, November 21, 19:00:00 CET 2010 | ||||
| Table Table  183347 (Real Money) | ||||
| Seat 1 is the button | ||||
| Total number of players : 5/6  | ||||
| Seat 3: Hero ( €10 EUR ) | ||||
| Seat 6: Player6 ( €16.49 EUR ) | ||||
| Seat 4: Player4 ( €10.73 EUR ) | ||||
| Seat 1: Player1 ( €8.56 EUR ) | ||||
| Seat 2: Player2 ( €4.90 EUR ) | ||||
| Player2 posts small blind [€0.05 EUR]. | ||||
| Hero posts big blind [€0.10 EUR]. | ||||
| ** Dealing down cards ** | ||||
| Dealt to Hero [  Ah Kc ] | ||||
| Player4 calls [€0.10 EUR] | ||||
| Player6 calls [€0.10 EUR] | ||||
| Player1 calls [€0.10 EUR] | ||||
| Player2 calls [€0.05 EUR] | ||||
| Hero raises [€0.56 EUR] | ||||
| Player4 folds | ||||
| Player6 folds | ||||
| Player1 folds | ||||
| Player2 calls [€0.56 EUR] | ||||
| ** Dealing Flop ** [ 5s, 9d, Ad ] | ||||
| Player2 checks | ||||
| Hero bets [€1.52 EUR] | ||||
| Player2 folds | ||||
| Hero does not show cards. | ||||
| Hero wins €3.04 EUR | ||||
|  | @ -1,3 +1,6 @@ | |||
| Game #9423586142 starts. | ||||
| 
 | ||||
| #Game No : 9423586142 | ||||
| ***** Hand History For Game 9423586142 ***** | ||||
| 0.01/0.02 Texas Hold'em Game Table (NL)  -  Mon Jul 12 13:38:32 EDT 2010 | ||||
| Table 20BB Min Speed #1775757  (Real Money) -- Seat 1 is the button | ||||
|  |  | |||
							
								
								
									
										178
									
								
								utils/pypokertest.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										178
									
								
								utils/pypokertest.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,178 @@ | |||
| # | ||||
| # Copyright (C) 2007, 2008 Loic Dachary <loic@dachary.org> | ||||
| # Copyright (C) 2004, 2005, 2006 Mekensleep | ||||
| # | ||||
| # Mekensleep | ||||
| # 24 rue vieille du temple | ||||
| # 75004 Paris | ||||
| #       licensing@mekensleep.com | ||||
| # | ||||
| # 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 3 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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA. | ||||
| # | ||||
| # Authors: | ||||
| #  Loic Dachary <loic@dachary.org> | ||||
| # | ||||
| #  | ||||
| import sys | ||||
| sys.path.insert(0, ".") | ||||
| sys.path.insert(0, ".libs") | ||||
| 
 | ||||
| from pokereval import PokerEval | ||||
| 
 | ||||
| iterations_low = 100000 | ||||
| iterations_high = 200000 | ||||
| 
 | ||||
| pokereval = PokerEval() | ||||
| 
 | ||||
| if pokereval.best_hand_value("hi", ["Ah", "Ad", "As", "Kh", "Ks" ]) != 101494784: | ||||
|     sys.exit(1) | ||||
| 
 | ||||
| if pokereval.string2card("2h") != 0: | ||||
|     sys.exit(1) | ||||
| 
 | ||||
| print "" | ||||
| pockets = [ ["As", "Ad", "Ac", "Tc", "Ts", "2d", "5c" ], | ||||
|             ["Js", "Jc", "7s", "8c", "8d", "3c", "3h" ], | ||||
|             [255, 255 ] ] | ||||
| print "stud7 (1) result = %s\n" % pokereval.winners(game = "7stud", pockets = pockets, dead = [], board = []) | ||||
| 
 | ||||
| pockets = [[22, 18, 21, 3, 41, 1, 30], [39, 255, 255, 15, 13, 17, 255]] | ||||
| print "stud7 (2) result = %s\n" % pokereval.winners(game = "7stud", pockets = pockets, dead = [], board = []) | ||||
| 
 | ||||
| print [ j + i + "/%d" % pokereval.string2card(j + i) for i in "hdcs" for j in "23456789TJQKA" ] | ||||
| print "deck = %s\n" % pokereval.deck() | ||||
| 
 | ||||
| print "result = %s\n" % pokereval.poker_eval(game = "holdem", pockets = [ ["tc", "ac"],  ["3h", "ah"],  ["8c", "6h"]], dead = [], board = ["7h", "3s", "2c"]) | ||||
| print "winners = %s\n" % pokereval.winners(game = "holdem", pockets = [ ["tc", "ac"],  ["3h", "ah"],  ["8c", "6h"]], dead = [], board = ["7h", "3s", "2c"]) | ||||
| 
 | ||||
| print "result = %s\n" % pokereval.poker_eval(game = "holdem", pockets = [ ["tc", "ac"],  ["th", "ah"],  ["8c", "6h"]], dead = [], board = ["7h", "3s", "2c", "7s", "7d"]) | ||||
| print "winners = %s\n" % pokereval.winners(game = "holdem", pockets = [ ["tc", "ac"],  ["th", "ah"],  ["8c", "6h"]], dead = [], board = ["7h", "3s", "2c", "7s", "7d"]) | ||||
| 
 | ||||
| print "winners (filthy pockets) = %s\n" % pokereval.winners(game = "holdem", pockets = [ ["tc", "ac", 255],  [], [255, 255], ["th", "ah"],  ["8c", "6h"]], dead = [], board = ["7h", "3s", "2c", "7s", "7d"]) | ||||
| 
 | ||||
| print "winners omaha = %s\n" % pokereval.winners(game = "omaha", pockets = [ ["tc", "ac", "ks", "kc" ],  ["th", "ah", "qs", "qc" ],  ["8c", "6h", "js", "jc" ]], dead = [], board = ["7h", "3s", "2c", "7s", "7d"]) | ||||
| print "winners omaha8 = %s\n" % pokereval.winners(game = "omaha8", pockets = [ ["tc", "ac", "ks", "kc" ],  ["th", "ah", "qs", "qc" ],  ["8c", "6h", "js", "jc" ]], dead = [], board = ["7h", "3s", "2c", "7s", "7d"]) | ||||
| 
 | ||||
| hand = ["Ac", "As", "Td", "7s", "7h", "3s", "2c"] | ||||
| best_hand = pokereval.best_hand("hi", hand) | ||||
| print "best hand from %s = %s" % ( hand, pokereval.best_hand("hi", hand) ) | ||||
| print "best hand from %s = (%s) %s " % (hand, best_hand[0], [ pokereval.card2string(i) for i in best_hand[1:] ]) | ||||
| 
 | ||||
| print "" | ||||
| hand = ["Ah", "Ts", "Kh", "Qs", "Js" ] | ||||
| best_hand = pokereval.best_hand("hi", hand) | ||||
| print "best hand from %s = %s" % ( hand, pokereval.best_hand("hi", hand) ) | ||||
| print "best hand from %s = (%s) %s " % (hand, best_hand[0], [ pokereval.card2string(i) for i in best_hand[1:] ]) | ||||
| 
 | ||||
| print "" | ||||
| hand = ["2h", "Kh", "Qh", "Jh", "Th" ] | ||||
| best_hand = pokereval.best_hand("hi", hand) | ||||
| print "best hand from %s = %s" % ( hand, pokereval.best_hand("hi", hand) ) | ||||
| print "best hand from %s = (%s) %s " % (hand, best_hand[0], [ pokereval.card2string(i) for i in best_hand[1:] ]) | ||||
| 
 | ||||
| print "" | ||||
| hand = ['2s', '3s', 'Jd', 'Ks', 'As', '4d', '5h', '7d', '9c'] | ||||
| best_hand = pokereval.best_hand("hi", hand) | ||||
| print "best hand from %s = %s" % ( hand, pokereval.best_hand("hi", hand) ) | ||||
| print "best hand from %s = (%s) %s " % (hand, best_hand[0], [ pokereval.card2string(i) for i in best_hand[1:] ]) | ||||
| 
 | ||||
| print "" | ||||
| hand = ['As', '2s', '4d', '4s', '5c', '5d', '7s'] | ||||
| best_hand = pokereval.best_hand("low", hand) | ||||
| print "1/ low hand from %s = %s" % ( hand, pokereval.best("low", hand) ) | ||||
| print "best low hand from %s = (%s) %s " % (hand, best_hand[0], [ pokereval.card2string(i) for i in best_hand[1:] ]) | ||||
| 
 | ||||
| print "" | ||||
| hand = ['As', '2s', '4d', '4s', '5c', '5d', '8s'] | ||||
| best_hand = pokereval.best_hand("low", hand) | ||||
| print "2/ low hand from %s = %s" % ( hand, pokereval.best("low", hand) ) | ||||
| print "best low hand from %s = (%s) %s " % (hand, best_hand[0], [ pokereval.card2string(i) for i in best_hand[1:] ]) | ||||
| 
 | ||||
| print "" | ||||
| hand = ['7d', '6c', '5h', '4d', 'As'] | ||||
| best_hand = pokereval.best_hand("low", hand) | ||||
| print "3/ low hand from %s = %s" % ( hand, pokereval.best("low", hand) ) | ||||
| print "best low hand from %s = (%s) %s " % (hand, best_hand[0], [ pokereval.card2string(i) for i in best_hand[1:] ]) | ||||
| 
 | ||||
| print "" | ||||
| board = [ 'As', '4d', '5h', '7d', '9c' ] | ||||
| hand = [ '2s', 'Ts', 'Jd', 'Ks' ] | ||||
| best_hand = pokereval.best_hand("low", hand, board) | ||||
| print "4/ low hand from %s / %s = %s" % ( hand, board, pokereval.best("low", hand, board) ) | ||||
| print "best low hand from %s / %s = (%s) %s " % (hand, board, best_hand[0], [ pokereval.card2string(i) for i in best_hand[1:] ]) | ||||
| 
 | ||||
| print "" | ||||
| board = [ 'As', '4d', '6h', '7d', '3c' ] | ||||
| hand = [ '2s', '5s', 'Jd', 'Ks' ] | ||||
| best_hand = pokereval.best_hand("low", hand, board) | ||||
| print "low hand from %s / %s = %s" % ( hand, board, pokereval.best("low", hand, board) ) | ||||
| print "best low hand from %s / %s = (%s) %s " % (hand, board, best_hand[0], [ pokereval.card2string(i) for i in best_hand[1:] ]) | ||||
| 
 | ||||
| print "" | ||||
| board = [ 'Jc', '4c', '3c', '5c', '9c' ] | ||||
| hand = [ '2c', 'Ac', '5h', '9d' ] | ||||
| best_hand = pokereval.best_hand("hi", hand, board) | ||||
| print "hi hand from %s / %s = %s" % ( hand, board, pokereval.best("hi", hand, board) ) | ||||
| print "best hi hand from %s / %s = (%s) %s " % (hand, board, best_hand[0], pokereval.card2string(best_hand[1:])) | ||||
| 
 | ||||
| print "" | ||||
| board = [ 'Jd', '9c', 'Jc', 'Tc', '2h' ] | ||||
| hand = [ '2c', '4c', 'Th', '6s' ] | ||||
| best_hand = pokereval.best_hand("low", hand, board) | ||||
| print "5/ low hand from %s / %s = %s" % ( hand, board, pokereval.best("low", hand, board) ) | ||||
| print "best low hand from %s / %s = (%s) %s " % (hand, board, best_hand[0], [ pokereval.card2string(i) for i in best_hand[1:] ]) | ||||
| 
 | ||||
| print "" | ||||
| board = [ 'Ks', 'Jd', '7s', '4d', 'Js' ] | ||||
| hand = [ '2d', '6c', 'Ac', '5c' ] | ||||
| best_hand = pokereval.best_hand("low", hand, board) | ||||
| print "6/ low hand from %s / %s = %s" % ( hand, board, pokereval.best("low", hand, board) ) | ||||
| print "best low hand from %s / %s = (%s) %s " % (hand, board, best_hand[0], [ pokereval.card2string(i) for i in best_hand[1:] ]) | ||||
| 
 | ||||
| if len(sys.argv) > 2: | ||||
| 
 | ||||
|     print "f0 result = %s\n" % pokereval.poker_eval(game = "holdem", fill_pockets = 1, pockets = [ ["As", "3s"],  ["__", "__"],  ["__", "__"]], dead = [], board = ["__", "Qs", "2c", "Ac", "Kc"]) | ||||
| 
 | ||||
|     print "" | ||||
|     print "f1 result = %s\n" % pokereval.poker_eval(game = "holdem", fill_pockets = 1, pockets = [ ["As", "3s"],  ["__", "__"],  ["__", "__"]], dead = [], board = ["7s", "Qs", "2c", "Ac", "Kc"]) | ||||
| 
 | ||||
| 
 | ||||
|     print "" | ||||
|     print "f2 result = %s\n" % pokereval.poker_eval(game = "holdem", fill_pockets = 1, iterations = iterations_low, pockets = [ ["As", "3s"],  ["__", "__"],  ["__", "__"]], dead = [], board = ["__", "__", "__", "__", "__"]) | ||||
| 
 | ||||
|     print "" | ||||
|     print "f3 result = %s\n" % pokereval.poker_eval(game = "holdem", fill_pockets = 1, iterations = iterations_high, pockets = [ ["As", "Ac"],  ["__", "__"],  ["__", "__"]], dead = [], board = ["__", "__", "__", "__", "__"]) | ||||
| 
 | ||||
|     print "" | ||||
|     print "f4 result = %s\n" % pokereval.poker_eval(game = "holdem", fill_pockets = 1, iterations = iterations_high, pockets = [ ["As", "Ks"],  ["__", "__"],  ["__", "__"]], dead = [], board = ["__", "__", "__", "__", "__"]) | ||||
| 
 | ||||
|     print "" | ||||
|     print "f5 result = %s\n" % pokereval.poker_eval(game = "holdem", fill_pockets = 1, iterations = iterations_high, pockets = [ ["2s", "2c"],  ["__", "__"],  ["__", "__"]], dead = [], board = ["__", "__", "__", "__", "__"]) | ||||
| 
 | ||||
|     print "" | ||||
|     print "f6 result = %s\n" % pokereval.poker_eval(game = "holdem", fill_pockets = 1, iterations = iterations_high, pockets = [ ["Js", "Jc"],  ["__", "__"],  ["__", "__"]], dead = [], board = ["__", "__", "__", "__", "__"]) | ||||
| 
 | ||||
|     print "" | ||||
|     print "f7 result = %s\n" % pokereval.poker_eval(game = "omaha", fill_pockets = 1, iterations = iterations_high, pockets = [ ["Js", "Jc", "7s", "8c"],  ["__", "__", "__", "__"],  ["__", "__", "__", "__"]], dead = [], board = ["__", "__", "__", "__", "__"]) | ||||
| 
 | ||||
| print "" | ||||
| hand = ['As', 'Ad'] | ||||
| print "handval %s = %d " % (hand, pokereval.evaln(hand)) | ||||
| 
 | ||||
| print "" | ||||
| hand = ['Qc', '7d'] | ||||
| print "handval %s = %d " % (hand, pokereval.evaln(hand)) | ||||
| 
 | ||||
| pokereval = None | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user