Merge branch 'master' of git://github.com/grindi/fpdb-grindi
This commit is contained in:
		
						commit
						0877e428ef
					
				| 
						 | 
				
			
			@ -41,7 +41,7 @@ class Absolute(HandHistoryConverter):
 | 
			
		|||
#Seat 6 - FETS63 ($0.75 in chips)
 | 
			
		||||
#Board [10s 5d Kh Qh 8c]
 | 
			
		||||
 | 
			
		||||
    re_GameInfo     = re.compile(ur"^Stage #([0-9]+): (?P<GAME>Holdem|)  (?P<LIMIT>No Limit|) (?P<CURRENCY>\$| €|)(?P<BB>[0-9]*[.0-9]+)", re.MULTILINE)
 | 
			
		||||
    re_GameInfo     = re.compile(ur"^Stage #([0-9]+): (?P<GAME>Holdem|)  (?P<LIMIT>No Limit|Pot Limit|Normal) (?P<CURRENCY>\$| €|)(?P<BB>[0-9]*[.0-9]+)", re.MULTILINE)
 | 
			
		||||
    re_HandInfo     = re.compile(ur"^Stage #(?P<HID>[0-9]+): .*(?P<DATETIME>\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d).*\nTable: (?P<TABLE>.*) \(Real Money\)", re.MULTILINE)
 | 
			
		||||
    re_Button       = re.compile(ur"Seat #(?P<BUTTON>[0-9]) is the ?[dead]* dealer$", re.MULTILINE) # TODO: that's not the right way to match for "dead" dealer is it?
 | 
			
		||||
    re_PlayerInfo   = re.compile(ur"^Seat (?P<SEAT>[0-9]) - (?P<PNAME>.*) \((?:\$| €|)(?P<CASH>[0-9]*[.0-9]+) in chips\)", re.MULTILINE)
 | 
			
		||||
| 
						 | 
				
			
			@ -112,7 +112,7 @@ or None if we fail to get the info """
 | 
			
		|||
        mg = m.groupdict()
 | 
			
		||||
        
 | 
			
		||||
        # translations from captured groups to our info strings
 | 
			
		||||
        limits = { 'No Limit':'nl', 'PL':'pl', '':'fl' }
 | 
			
		||||
        limits = { 'No Limit':'nl', 'Pot Limit':'pl', 'Normal':'fl' }
 | 
			
		||||
        games = {              # base, category
 | 
			
		||||
                  "Holdem" : ('hold','holdem'), 
 | 
			
		||||
                    'Omaha' : ('hold','omahahi'), 
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -596,8 +596,8 @@ class Config:
 | 
			
		|||
            path = os.path.expanduser(self.supported_sites[site].HH_path)
 | 
			
		||||
            assert(os.path.isdir(path) or os.path.isfile(path)) # maybe it should try another site?
 | 
			
		||||
            paths['hud-defaultPath'] = paths['bulkImport-defaultPath'] = path
 | 
			
		||||
        except:
 | 
			
		||||
            paths['hud-defaultPath'] = paths['bulkImport-defaultPath'] = "default"
 | 
			
		||||
        except AssertionError: 
 | 
			
		||||
            paths['hud-defaultPath'] = paths['bulkImport-defaultPath'] = "** ERROR DEFAULT PATH IN CONFIG DOES NOT EXIST **"
 | 
			
		||||
        return paths
 | 
			
		||||
    
 | 
			
		||||
    def get_frames(self, site = "PokerStars"):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,7 @@
 | 
			
		|||
class FpdbParseError(Exception): 
 | 
			
		||||
class FPDBError(Exception):
 | 
			
		||||
    pass
 | 
			
		||||
 | 
			
		||||
class FpdbParseError(FPDBError): 
 | 
			
		||||
    def __init__(self,hid=None):
 | 
			
		||||
        self.hid = hid
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,7 +33,8 @@ class Fulltilt(HandHistoryConverter):
 | 
			
		|||
    siteId   = 1 # Needs to match id entry in Sites database
 | 
			
		||||
 | 
			
		||||
    # Static regexes
 | 
			
		||||
    re_GameInfo     = re.compile('''(?:(?P<TOURNAMENT>.+)\s\((?P<TOURNO>\d+)\),\s)?
 | 
			
		||||
    re_GameInfo     = re.compile('''.*\#(?P<HID>[0-9]+):\s
 | 
			
		||||
                                    (?:(?P<TOURNAMENT>.+)\s\((?P<TOURNO>\d+)\),\s)?
 | 
			
		||||
                                    .+
 | 
			
		||||
                                    -\s(?P<CURRENCY>\$|)?
 | 
			
		||||
                                    (?P<SB>[.0-9]+)/
 | 
			
		||||
| 
						 | 
				
			
			@ -56,7 +57,7 @@ class Fulltilt(HandHistoryConverter):
 | 
			
		|||
                                    (?:.*?\n(?P<CANCELLED>Hand\s\#(?P=HID)\shas\sbeen\scanceled))?
 | 
			
		||||
                                 ''', re.VERBOSE|re.DOTALL)
 | 
			
		||||
    re_Button       = re.compile('^The button is in seat #(?P<BUTTON>\d+)', re.MULTILINE)
 | 
			
		||||
    re_PlayerInfo   = re.compile('Seat (?P<SEAT>[0-9]+): (?P<PNAME>.*) \(\$?(?P<CASH>[,.0-9]+)\)$', re.MULTILINE)
 | 
			
		||||
    re_PlayerInfo   = re.compile('Seat (?P<SEAT>[0-9]+): (?P<PNAME>.*) \(\$?(?P<CASH>[,.0-9]+)\)', re.MULTILINE)
 | 
			
		||||
    re_Board        = re.compile(r"\[(?P<CARDS>.+)\]")
 | 
			
		||||
 | 
			
		||||
# These regexes are for FTP only
 | 
			
		||||
| 
						 | 
				
			
			@ -66,6 +67,7 @@ class Fulltilt(HandHistoryConverter):
 | 
			
		|||
 | 
			
		||||
    mixes = { 'HORSE': 'horse', '7-Game': '7game', 'HOSE': 'hose', 'HA': 'ha'}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def compilePlayerRegexs(self,  hand):
 | 
			
		||||
        players = set([player[1] for player in hand.players])
 | 
			
		||||
        if not players <= self.compiledPlayers: # x <= y means 'x is subset of y'
 | 
			
		||||
| 
						 | 
				
			
			@ -81,7 +83,7 @@ class Fulltilt(HandHistoryConverter):
 | 
			
		|||
            self.re_HeroCards        = re.compile(r"^Dealt to %s(?: \[(?P<OLDCARDS>.+?)\])?( \[(?P<NEWCARDS>.+?)\])" % player_re, re.MULTILINE)
 | 
			
		||||
            self.re_Action           = re.compile(r"^%s(?P<ATYPE> bets| checks| raises to| completes it to| calls| folds)( \$?(?P<BET>[.,\d]+))?" % player_re, re.MULTILINE)
 | 
			
		||||
            self.re_ShowdownAction   = re.compile(r"^%s shows \[(?P<CARDS>.*)\]" % player_re, re.MULTILINE)
 | 
			
		||||
            self.re_CollectPot       = re.compile(r"^Seat (?P<SEAT>[0-9]+): %s (\(button\) |\(small blind\) |\(big blind\) )?(collected|showed \[.*\] and won) \(\$(?P<POT>[.\d]+)\)(, mucked| with.*)" % player_re, re.MULTILINE)
 | 
			
		||||
            self.re_CollectPot       = re.compile(r"^Seat (?P<SEAT>[0-9]+): %s (\(button\) |\(small blind\) |\(big blind\) )?(collected|showed \[.*\] and won) \(\$?(?P<POT>[.,\d]+)\)(, mucked| with.*)" % player_re, re.MULTILINE)
 | 
			
		||||
            self.re_SitsOut          = re.compile(r"^%s sits out" % player_re, re.MULTILINE)
 | 
			
		||||
            self.re_ShownCards       = re.compile(r"^Seat (?P<SEAT>[0-9]+): %s \(.*\) showed \[(?P<CARDS>.*)\].*" % player_re, re.MULTILINE)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -110,7 +112,7 @@ class Fulltilt(HandHistoryConverter):
 | 
			
		|||
        if not m: 
 | 
			
		||||
            return None
 | 
			
		||||
        mg = m.groupdict()
 | 
			
		||||
 | 
			
		||||
        print mg
 | 
			
		||||
        # translations from captured groups to our info strings
 | 
			
		||||
        limits = { 'No Limit':'nl', 'Pot Limit':'pl', 'Limit':'fl' }
 | 
			
		||||
        games = {              # base, category
 | 
			
		||||
| 
						 | 
				
			
			@ -132,7 +134,7 @@ class Fulltilt(HandHistoryConverter):
 | 
			
		|||
        if mg['TOURNO'] == None:  info['type'] = "ring"
 | 
			
		||||
        else:                     info['type'] = "tour"
 | 
			
		||||
        # NB: SB, BB must be interpreted as blinds or bets depending on limit type.
 | 
			
		||||
        if info['type'] == "tour": return None # importer is screwed on tournies, pass on those hands so we don't interrupt other autoimporting
 | 
			
		||||
#        if info['type'] == "tour": return None # importer is screwed on tournies, pass on those hands so we don't interrupt other autoimporting
 | 
			
		||||
        return info
 | 
			
		||||
 | 
			
		||||
    def readHandInfo(self, hand):
 | 
			
		||||
| 
						 | 
				
			
			@ -157,6 +159,16 @@ class Fulltilt(HandHistoryConverter):
 | 
			
		|||
            hand.gametype['currency'] = 'play'
 | 
			
		||||
            
 | 
			
		||||
        # TODO: if there's a way to figure these out, we should.. otherwise we have to stuff it with unknowns
 | 
			
		||||
        re_SNGBuyInFee  = re.compile('''(?P<CURRENCY>\$)?(?P<BUYIN>[.0-9]+) \+ \$?(?P<FEE>[.0-9]+) (?P<EXTRA_INFO>[\sA-Za-z&()]+)?''')
 | 
			
		||||
        # TO DO : See if important info can be retrieved from EXTRA_INFO (sould be things like Turbo, Matrix, KO, ...)
 | 
			
		||||
        try:
 | 
			
		||||
            n = re_SNGBuyInFee.search(m.group('TOURNAMENT'))
 | 
			
		||||
            #print "cur %s BUYIN %s FEE %s EXTRA %s" %(n.group('CURRENCY'), n.group('BUYIN'), n.group('FEE'), n.group('EXTRA_INFO'))
 | 
			
		||||
            hand.buyin = "%s%s+%s%s" %(n.group('CURRENCY'), n.group('BUYIN'), n.group('CURRENCY'), n.group('FEE'))
 | 
			
		||||
        except:
 | 
			
		||||
            #print "Unable to collect BuyIn/Fee Info"
 | 
			
		||||
            logging.info("Unable to collect BuyIn/Fee Info from HandInfo")
 | 
			
		||||
 | 
			
		||||
        if hand.buyin == None:
 | 
			
		||||
            hand.buyin = "$0.00+$0.00"
 | 
			
		||||
        if hand.level == None:
 | 
			
		||||
| 
						 | 
				
			
			@ -300,7 +312,7 @@ class Fulltilt(HandHistoryConverter):
 | 
			
		|||
 | 
			
		||||
    def readCollectPot(self,hand):
 | 
			
		||||
        for m in self.re_CollectPot.finditer(hand.handText):
 | 
			
		||||
            hand.addCollectPot(player=m.group('PNAME'),pot=m.group('POT'))
 | 
			
		||||
            hand.addCollectPot(player=m.group('PNAME'),pot=re.sub(u',',u'',m.group('POT')))
 | 
			
		||||
 | 
			
		||||
    def readShownCards(self,hand):
 | 
			
		||||
        for m in self.re_ShownCards.finditer(hand.handText):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -136,13 +136,20 @@ class GuiAutoImport (threading.Thread):
 | 
			
		|||
    def do_import(self):
 | 
			
		||||
        """Callback for timer to do an import iteration."""
 | 
			
		||||
        if self.doAutoImportBool:
 | 
			
		||||
            self.startButton.set_label(u' I M P O R T I N G  ')
 | 
			
		||||
            self.importer.runUpdated()
 | 
			
		||||
            sys.stdout.write(".")
 | 
			
		||||
            sys.stdout.flush()
 | 
			
		||||
            gobject.timeout_add(1000, self.reset_startbutton)
 | 
			
		||||
            return True
 | 
			
		||||
        else:
 | 
			
		||||
            return False
 | 
			
		||||
        
 | 
			
		||||
    def reset_startbutton(self):
 | 
			
		||||
        self.startButton.set_label(u'  _Stop Autoimport  ')
 | 
			
		||||
        return False
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def startClicked(self, widget, data):
 | 
			
		||||
        """runs when user clicks start on auto import tab"""
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -161,33 +168,34 @@ class GuiAutoImport (threading.Thread):
 | 
			
		|||
            # - Ideally we want to release the lock if the auto-import is killed by some 
 | 
			
		||||
            # kind of exception - is this possible?
 | 
			
		||||
            if self.settings['global_lock'].acquire(False):   # returns false immediately if lock not acquired
 | 
			
		||||
                try:
 | 
			
		||||
                print "\nGlobal lock taken ..."
 | 
			
		||||
                self.doAutoImportBool = True
 | 
			
		||||
                widget.set_label(u'  _Stop Autoimport  ')
 | 
			
		||||
                if self.pipe_to_hud is None:
 | 
			
		||||
                    if os.name == 'nt':
 | 
			
		||||
                            command = "python HUD_main.py" + " " + self.settings['cl_options']
 | 
			
		||||
                            bs = 0    # windows is not happy with line buffing here
 | 
			
		||||
                            self.pipe_to_hud = subprocess.Popen(command, bufsize = bs, stdin = subprocess.PIPE, 
 | 
			
		||||
                                                            universal_newlines=True)
 | 
			
		||||
                        command = "python HUD_main.py " + self.settings['cl_options']
 | 
			
		||||
                        bs = 0
 | 
			
		||||
                    else:
 | 
			
		||||
                        command = os.path.join(sys.path[0], 'HUD_main.py')
 | 
			
		||||
                            cl = [command, ] + string.split(self.settings['cl_options'])
 | 
			
		||||
                            self.pipe_to_hud = subprocess.Popen(cl, bufsize = 1, stdin = subprocess.PIPE, 
 | 
			
		||||
                        command = [command, ] + string.split(self.settings['cl_options'])
 | 
			
		||||
                        bs = 1
 | 
			
		||||
                    try:
 | 
			
		||||
                        self.pipe_to_hud = subprocess.Popen(command, bufsize = bs, stdin = subprocess.PIPE,
 | 
			
		||||
                                                            universal_newlines = True)
 | 
			
		||||
                    except:
 | 
			
		||||
                        err = traceback.extract_tb(sys.exc_info()[2])[-1]
 | 
			
		||||
                        print "*** Error: " + err[2] + "(" + str(err[1]) + "): " + str(sys.exc_info()[1])
 | 
			
		||||
                    
 | 
			
		||||
                        # Add directories to importer object.
 | 
			
		||||
                    print "self.pipe_to_hud = ", self.pipe_to_hud
 | 
			
		||||
                    if self.pipe_to_hud is not None:
 | 
			
		||||
                        for site in self.input_settings:
 | 
			
		||||
                            self.importer.addImportDirectory(self.input_settings[site][0], True, site, self.input_settings[site][1])
 | 
			
		||||
                            print "Adding import directories - Site: " + site + " dir: "+ str(self.input_settings[site][0])
 | 
			
		||||
                            print "+Import directory - Site: " + site + " dir: " + str(self.input_settings[site][0])
 | 
			
		||||
                            self.do_import()
 | 
			
		||||
                            
 | 
			
		||||
                            interval = int(self.intervalEntry.get_text())
 | 
			
		||||
                            gobject.timeout_add(interval*1000, self.do_import)
 | 
			
		||||
                except:
 | 
			
		||||
                    err = traceback.extract_tb(sys.exc_info()[2])[-1]
 | 
			
		||||
                    print "***Error: "+err[2]+"("+str(err[1])+"): "+str(sys.exc_info()[1])
 | 
			
		||||
                        
 | 
			
		||||
            else:
 | 
			
		||||
                print "auto-import aborted - global lock not available"
 | 
			
		||||
        else: # toggled off
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -243,7 +243,6 @@ class fpdb:
 | 
			
		|||
        if self.obtain_global_lock():  # returns true if successful
 | 
			
		||||
 | 
			
		||||
            #lock_released = False
 | 
			
		||||
            try:
 | 
			
		||||
            dia_confirm = gtk.MessageDialog(parent=None, flags=0, type=gtk.MESSAGE_WARNING,
 | 
			
		||||
                    buttons=(gtk.BUTTONS_YES_NO), message_format="Confirm deleting and recreating tables")
 | 
			
		||||
            diastring = "Please confirm that you want to (re-)create the tables. If there already are tables in the database " \
 | 
			
		||||
| 
						 | 
				
			
			@ -265,8 +264,6 @@ class fpdb:
 | 
			
		|||
                #    self.fdb_lock.fdb.recreate_tables()
 | 
			
		||||
            elif response == gtk.RESPONSE_NO:
 | 
			
		||||
                print 'User cancelled recreating tables'
 | 
			
		||||
            except:
 | 
			
		||||
                pass
 | 
			
		||||
            #if not lock_released:
 | 
			
		||||
            self.release_global_lock()
 | 
			
		||||
    #end def dia_recreate_tables
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user