Merge branch 'master' of git://git.assembla.com/free_poker_tools
This commit is contained in:
		
						commit
						1eb17e90e1
					
				|  | @ -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'),  | ||||
|  |  | |||
|  | @ -311,7 +311,7 @@ class Config: | |||
|         try: | ||||
|             print "Reading configuration file %s\n" % (file) | ||||
|             doc = xml.dom.minidom.parse(file) | ||||
|         except: | ||||
|         except:  | ||||
|             print "Error parsing %s.  See error log file." % (file) | ||||
|             traceback.print_exc(file=sys.stderr) | ||||
|             print "press enter to continue" | ||||
|  | @ -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 | ||||
| 
 | ||||
|  |  | |||
|  | @ -57,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 | ||||
|  | @ -67,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' | ||||
|  | @ -82,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) | ||||
| 
 | ||||
|  | @ -154,7 +155,7 @@ class Fulltilt(HandHistoryConverter): | |||
|             return [] | ||||
|         return re.split(self.re_SplitHands,  self.obs) | ||||
| 
 | ||||
|     def readHandInfo(self, hand): | ||||
|     def readHandInfo(self, hand):  | ||||
|         m =  self.re_HandInfo.search(hand.handText) | ||||
|         if(m == None): | ||||
|             logging.info("Didn't match re_HandInfo") | ||||
|  | @ -176,6 +177,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: | ||||
|  | @ -319,7 +330,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,12 +136,23 @@ 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): | ||||
|         if self.pipe_to_hud is not None: | ||||
|             self.startButton.set_label(u'  _Stop Autoimport  ') | ||||
|         else: | ||||
|             self.startButton.set_label(u'  _Start Autoimport  ') | ||||
|          | ||||
|         return False | ||||
| 
 | ||||
| 
 | ||||
|     def startClicked(self, widget, data): | ||||
|         """runs when user clicks start on auto import tab""" | ||||
|  | @ -161,33 +172,32 @@ 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) | ||||
|                         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,  | ||||
|                                                             universal_newlines=True) | ||||
| 
 | ||||
|                         # Add directories to importer object. | ||||
|                 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 | ||||
|                     else: | ||||
|                         command = os.path.join(sys.path[0], 'HUD_main.py') | ||||
|                         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]) | ||||
|                     else:                     | ||||
|                         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()) | ||||
|                              | ||||
|                             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,30 +243,27 @@ 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 " \ | ||||
|                             +self.db.fdb.database+" on "+self.db.fdb.host+" they will be deleted." | ||||
|                 dia_confirm.format_secondary_text(diastring)#todo: make above string with bold for db, host and deleted | ||||
|             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 " \ | ||||
|                         +self.db.fdb.database+" on "+self.db.fdb.host+" they will be deleted." | ||||
|             dia_confirm.format_secondary_text(diastring)#todo: make above string with bold for db, host and deleted | ||||
| 
 | ||||
|                 response = dia_confirm.run() | ||||
|                 dia_confirm.destroy() | ||||
|                 if response == gtk.RESPONSE_YES: | ||||
|                     #if self.db.fdb.backend == self.fdb_lock.fdb.MYSQL_INNODB: | ||||
|                         # mysql requires locks on all tables or none - easier to release this lock  | ||||
|                         # than lock all the other tables | ||||
|                         # ToDo: lock all other tables so that lock doesn't have to be released | ||||
|                     #    self.release_global_lock() | ||||
|                     #    lock_released = True | ||||
|                     self.db.recreate_tables() | ||||
|                     #else: | ||||
|                         # for other dbs use same connection as holds global lock | ||||
|                     #    self.fdb_lock.fdb.recreate_tables() | ||||
|                 elif response == gtk.RESPONSE_NO: | ||||
|                     print 'User cancelled recreating tables' | ||||
|             except: | ||||
|                 pass | ||||
|             response = dia_confirm.run() | ||||
|             dia_confirm.destroy() | ||||
|             if response == gtk.RESPONSE_YES: | ||||
|                 #if self.db.fdb.backend == self.fdb_lock.fdb.MYSQL_INNODB: | ||||
|                     # mysql requires locks on all tables or none - easier to release this lock  | ||||
|                     # than lock all the other tables | ||||
|                     # ToDo: lock all other tables so that lock doesn't have to be released | ||||
|                 #    self.release_global_lock() | ||||
|                 #    lock_released = True | ||||
|                 self.db.recreate_tables() | ||||
|                 #else: | ||||
|                     # for other dbs use same connection as holds global lock | ||||
|                 #    self.fdb_lock.fdb.recreate_tables() | ||||
|             elif response == gtk.RESPONSE_NO: | ||||
|                 print 'User cancelled recreating tables' | ||||
|             #if not lock_released: | ||||
|             self.release_global_lock() | ||||
|     #end def dia_recreate_tables | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user