Merge branch 'master' of git://git.assembla.com/fpdboz
Conflicts: pyfpdb/Configuration.py pyfpdb/HUD_main.py
This commit is contained in:
		
						commit
						76680e8511
					
				| 
						 | 
					@ -26,7 +26,7 @@ except:
 | 
				
			||||||
	diaSQLLibMissing = gtk.Dialog(title="Fatal Error - SQL interface library missing", parent=None, flags=0, buttons=(gtk.STOCK_QUIT,gtk.RESPONSE_OK))
 | 
						diaSQLLibMissing = gtk.Dialog(title="Fatal Error - SQL interface library missing", parent=None, flags=0, buttons=(gtk.STOCK_QUIT,gtk.RESPONSE_OK))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	print "Please note that the CLI importer only works with MySQL, if you use PostgreSQL this error is expected."
 | 
						print "Please note that the CLI importer only works with MySQL, if you use PostgreSQL this error is expected."
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
import fpdb_import
 | 
					import fpdb_import
 | 
				
			||||||
import fpdb_db
 | 
					import fpdb_db
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,9 +36,9 @@ if __name__ == "__main__":
 | 
				
			||||||
	parser.add_option("-c", "--handCount", default="0", type="int",
 | 
						parser.add_option("-c", "--handCount", default="0", type="int",
 | 
				
			||||||
					help="Number of hands to import (default 0 means unlimited)")
 | 
										help="Number of hands to import (default 0 means unlimited)")
 | 
				
			||||||
	parser.add_option("-d", "--database", default="fpdb", help="The MySQL database to use (default fpdb)")
 | 
						parser.add_option("-d", "--database", default="fpdb", help="The MySQL database to use (default fpdb)")
 | 
				
			||||||
	parser.add_option("-e", "--errorFile", default="failed.txt", 
 | 
						parser.add_option("-e", "--errorFile", default="failed.txt",
 | 
				
			||||||
					help="File to store failed hands into. (default: failed.txt) Not implemented.")
 | 
										help="File to store failed hands into. (default: failed.txt) Not implemented.")
 | 
				
			||||||
	parser.add_option("-f", "--inputFile", "--file", "--inputfile", default="stdin", 
 | 
						parser.add_option("-f", "--inputFile", "--file", "--inputfile", default="stdin",
 | 
				
			||||||
					help="The file you want to import (remember to use quotes if necessary)")
 | 
										help="The file you want to import (remember to use quotes if necessary)")
 | 
				
			||||||
	parser.add_option("-m", "--minPrint", "--status", default="50", type="int",
 | 
						parser.add_option("-m", "--minPrint", "--status", default="50", type="int",
 | 
				
			||||||
					help="How often to print a one-line status report (0 means never, default is 50)")
 | 
										help="How often to print a one-line status report (0 means never, default is 50)")
 | 
				
			||||||
| 
						 | 
					@ -51,8 +51,8 @@ if __name__ == "__main__":
 | 
				
			||||||
	parser.add_option("-x", "--failOnError", action="store_true",
 | 
						parser.add_option("-x", "--failOnError", action="store_true",
 | 
				
			||||||
					help="If this option is passed it quits when it encounters any error")
 | 
										help="If this option is passed it quits when it encounters any error")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	(options, sys.argv) = parser.parse_args()
 | 
						(options, argv) = parser.parse_args()
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	settings={'callFpdbHud':False, 'db-backend':2}
 | 
						settings={'callFpdbHud':False, 'db-backend':2}
 | 
				
			||||||
	settings['db-host']=options.server
 | 
						settings['db-host']=options.server
 | 
				
			||||||
	settings['db-user']=options.user
 | 
						settings['db-user']=options.user
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -55,7 +55,6 @@ def get_exec_path():
 | 
				
			||||||
    if hasattr(sys, "frozen"):  # compiled by py2exe
 | 
					    if hasattr(sys, "frozen"):  # compiled by py2exe
 | 
				
			||||||
        return os.path.dirname(sys.executable)
 | 
					        return os.path.dirname(sys.executable)
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        print "argv=", sys.argv
 | 
					 | 
				
			||||||
        pathname = os.path.dirname(sys.argv[0])
 | 
					        pathname = os.path.dirname(sys.argv[0])
 | 
				
			||||||
        return os.path.abspath(pathname)
 | 
					        return os.path.abspath(pathname)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -537,6 +536,9 @@ class Config:
 | 
				
			||||||
            file = None
 | 
					            file = None
 | 
				
			||||||
        return file
 | 
					        return file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_doc(self):
 | 
				
			||||||
 | 
					        return self.doc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_site_node(self, site):
 | 
					    def get_site_node(self, site):
 | 
				
			||||||
        for site_node in self.doc.getElementsByTagName("site"):
 | 
					        for site_node in self.doc.getElementsByTagName("site"):
 | 
				
			||||||
            if site_node.getAttribute("site_name") == site:
 | 
					            if site_node.getAttribute("site_name") == site:
 | 
				
			||||||
| 
						 | 
					@ -571,11 +573,9 @@ class Config:
 | 
				
			||||||
                    return location_node
 | 
					                    return location_node
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def save(self, file = None):
 | 
					    def save(self, file = None):
 | 
				
			||||||
        if file is not None:
 | 
					        if file is None:
 | 
				
			||||||
            with open(file, 'w') as f:
 | 
					            file = self.file
 | 
				
			||||||
                self.doc.writexml(f)
 | 
					        shutil.move(file, file+".backup")
 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            shutil.move(self.file, self.file+".backup")
 | 
					 | 
				
			||||||
        with open(file, 'w') as f:
 | 
					        with open(file, 'w') as f:
 | 
				
			||||||
            self.doc.writexml(f)
 | 
					            self.doc.writexml(f)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -689,38 +689,50 @@ class Config:
 | 
				
			||||||
        except:
 | 
					        except:
 | 
				
			||||||
            hui['label'] = default_text
 | 
					            hui['label'] = default_text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try:    hui['hud_style']        = self.ui.hud_style
 | 
				
			||||||
 | 
					        except: hui['hud_style']        = 'A'  # default is show stats for All-time, also S(session) and T(ime)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try:    hui['hud_days']        = int(self.ui.hud_days)
 | 
				
			||||||
 | 
					        except: hui['hud_days']        = 90
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        try:    hui['aggregate_ring']   = self.ui.aggregate_ring
 | 
					        try:    hui['aggregate_ring']   = self.ui.aggregate_ring
 | 
				
			||||||
        except: hui['aggregate_ring']   = False
 | 
					        except: hui['aggregate_ring']   = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        try:    hui['aggregate_tour']   = self.ui.aggregate_tour
 | 
					        try:    hui['aggregate_tour']   = self.ui.aggregate_tour
 | 
				
			||||||
        except: hui['aggregate_tour']   = True
 | 
					        except: hui['aggregate_tour']   = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        try:    hui['hud_style']        = self.ui.hud_style
 | 
					 | 
				
			||||||
        except: hui['hud_style']        = 'A'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        try:    hui['hud_days']        = int(self.ui.hud_days)
 | 
					 | 
				
			||||||
        except: hui['hud_days']        = 90
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        try:    hui['agg_bb_mult']    = self.ui.agg_bb_mult
 | 
					        try:    hui['agg_bb_mult']    = self.ui.agg_bb_mult
 | 
				
			||||||
        except: hui['agg_bb_mult']    = 1
 | 
					        except: hui['agg_bb_mult']    = 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try:    hui['seats_style']    = self.ui.seats_style
 | 
				
			||||||
 | 
					        except: hui['seats_style']    = 'C'  # A / C / E, use A(ll) / C(ustom) / E(xact) seat numbers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try:    hui['seats_cust_nums']    = self.ui.seats_cust_nums
 | 
				
			||||||
 | 
					        except: hui['seats_cust_nums']    = ['n/a', 'n/a', (2,2), (3,4), (3,5), (4,6), (5,7), (6,8), (7,9), (8,10), (8,10)]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Hero specific
 | 
					        # Hero specific
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        try:    hui['h_aggregate_ring'] = self.ui.h_aggregate_ring
 | 
					 | 
				
			||||||
        except: hui['h_aggregate_ring'] = False
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        try:    hui['h_aggregate_tour'] = self.ui.h_aggregate_tour
 | 
					 | 
				
			||||||
        except: hui['h_aggregate_tour'] = True
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        try:    hui['h_hud_style']    = self.ui.h_hud_style
 | 
					        try:    hui['h_hud_style']    = self.ui.h_hud_style
 | 
				
			||||||
        except: hui['h_hud_style']    = 'S'
 | 
					        except: hui['h_hud_style']    = 'S'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        try:    hui['h_hud_days']     = int(self.ui.h_hud_days)
 | 
					        try:    hui['h_hud_days']     = int(self.ui.h_hud_days)
 | 
				
			||||||
        except: hui['h_hud_days']     = 30
 | 
					        except: hui['h_hud_days']     = 30
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try:    hui['h_aggregate_ring'] = self.ui.h_aggregate_ring
 | 
				
			||||||
 | 
					        except: hui['h_aggregate_ring'] = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try:    hui['h_aggregate_tour'] = self.ui.h_aggregate_tour
 | 
				
			||||||
 | 
					        except: hui['h_aggregate_tour'] = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        try:    hui['h_agg_bb_mult']    = self.ui.h_agg_bb_mult
 | 
					        try:    hui['h_agg_bb_mult']    = self.ui.h_agg_bb_mult
 | 
				
			||||||
        except: hui['h_agg_bb_mult']    = 1
 | 
					        except: hui['h_agg_bb_mult']    = 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try:    hui['h_seats_style']    = self.ui.h_seats_style
 | 
				
			||||||
 | 
					        except: hui['h_seats_style']    = 'E'  # A / C / E, use A(ll) / C(ustom) / E(xact) seat numbers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try:    hui['h_seats_cust_nums']    = self.ui.h_seats_cust_nums
 | 
				
			||||||
 | 
					        except: hui['h_seats_cust_nums']    = ['n/a', 'n/a', (2,2), (3,4), (3,5), (4,6), (5,7), (6,8), (7,9), (8,10), (8,10)]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return hui
 | 
					        return hui
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -965,8 +977,14 @@ if __name__== "__main__":
 | 
				
			||||||
    for game in c.get_supported_games():
 | 
					    for game in c.get_supported_games():
 | 
				
			||||||
        print c.get_game_parameters(game)
 | 
					        print c.get_game_parameters(game)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for hud_param, value in c.get_hud_ui_parameters().iteritems():
 | 
				
			||||||
 | 
					        print "hud param %s = %s" % (hud_param, value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    print "start up path = ", c.execution_path("")
 | 
					    print "start up path = ", c.execution_path("")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    from xml.dom.ext import PrettyPrint
 | 
					    try:
 | 
				
			||||||
    for site_node in c.doc.getElementsByTagName("site"):
 | 
					        from xml.dom.ext import PrettyPrint
 | 
				
			||||||
        PrettyPrint(site_node, stream=sys.stdout, encoding="utf-8")
 | 
					        for site_node in c.doc.getElementsByTagName("site"):
 | 
				
			||||||
 | 
					            PrettyPrint(site_node, stream=sys.stdout, encoding="utf-8")
 | 
				
			||||||
 | 
					    except:
 | 
				
			||||||
 | 
					        print "xml.dom.ext needs PyXML to be installed!"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -433,17 +433,50 @@ class Database:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_stats_from_hand( self, hand, type   # type is "ring" or "tour"
 | 
					    def get_stats_from_hand( self, hand, type   # type is "ring" or "tour"
 | 
				
			||||||
                           , hud_params = {'hud_style':'A', 'agg_bb_mult':1000
 | 
					                           , hud_params = {'hud_style':'A', 'agg_bb_mult':1000
 | 
				
			||||||
                                          ,'h_hud_style':'S', 'h_agg_bb_mult':1000}
 | 
					                                          ,'seats_style':'A', 'seats_cust_nums':['n/a', 'n/a', (2,2), (3,4), (3,5), (4,6), (5,7), (6,8), (7,9), (8,10), (8,10)]
 | 
				
			||||||
 | 
					                                          ,'h_hud_style':'S', 'h_agg_bb_mult':1000
 | 
				
			||||||
 | 
					                                          ,'h_seats_style':'A', 'h_seats_cust_nums':['n/a', 'n/a', (2,2), (3,4), (3,5), (4,6), (5,7), (6,8), (7,9), (8,10), (8,10)]
 | 
				
			||||||
 | 
					                                          }
 | 
				
			||||||
                           , hero_id = -1
 | 
					                           , hero_id = -1
 | 
				
			||||||
 | 
					                           , num_seats = 6
 | 
				
			||||||
                           ):
 | 
					                           ):
 | 
				
			||||||
        hud_style   = hud_params['hud_style']
 | 
					        hud_style   = hud_params['hud_style']
 | 
				
			||||||
        agg_bb_mult = hud_params['agg_bb_mult']
 | 
					        agg_bb_mult = hud_params['agg_bb_mult']
 | 
				
			||||||
 | 
					        seats_style = hud_params['seats_style']
 | 
				
			||||||
 | 
					        seats_cust_nums = hud_params['seats_cust_nums']
 | 
				
			||||||
        h_hud_style   = hud_params['h_hud_style']
 | 
					        h_hud_style   = hud_params['h_hud_style']
 | 
				
			||||||
        h_agg_bb_mult = hud_params['h_agg_bb_mult']
 | 
					        h_agg_bb_mult = hud_params['h_agg_bb_mult']
 | 
				
			||||||
 | 
					        h_seats_style = hud_params['h_seats_style']
 | 
				
			||||||
 | 
					        h_seats_cust_nums = hud_params['h_seats_cust_nums']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        stat_dict = {}
 | 
					        stat_dict = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if seats_style == 'A':
 | 
				
			||||||
 | 
					            seats_min, seats_max = 0, 10
 | 
				
			||||||
 | 
					        elif seats_style == 'C':
 | 
				
			||||||
 | 
					            seats_min, seats_max = seats_cust_nums[num_seats][0], seats_cust_nums[num_seats][1]
 | 
				
			||||||
 | 
					        elif seats_style == 'E':
 | 
				
			||||||
 | 
					            seats_min, seats_max = num_seats, num_seats
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            seats_min, seats_max = 0, 10
 | 
				
			||||||
 | 
					            print "bad seats_style value:", seats_style
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if h_seats_style == 'A':
 | 
				
			||||||
 | 
					            h_seats_min, h_seats_max = 0, 10
 | 
				
			||||||
 | 
					        elif h_seats_style == 'C':
 | 
				
			||||||
 | 
					            h_seats_min, h_seats_max = h_seats_cust_nums[num_seats][0], h_seats_cust_nums[num_seats][1]
 | 
				
			||||||
 | 
					        elif h_seats_style == 'E':
 | 
				
			||||||
 | 
					            h_seats_min, h_seats_max = num_seats, num_seats
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            h_seats_min, h_seats_max = 0, 10
 | 
				
			||||||
 | 
					            print "bad h_seats_style value:", h_seats_style
 | 
				
			||||||
 | 
					        print "opp seats style", seats_style, "hero seats style", h_seats_style
 | 
				
			||||||
 | 
					        print "opp seats:", seats_min, seats_max, " hero seats:", h_seats_min, h_seats_max
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if hud_style == 'S' or h_hud_style == 'S':
 | 
					        if hud_style == 'S' or h_hud_style == 'S':
 | 
				
			||||||
            self.get_stats_from_hand_session(hand, stat_dict, hero_id, hud_style, h_hud_style)
 | 
					            self.get_stats_from_hand_session(hand, stat_dict, hero_id
 | 
				
			||||||
 | 
					                                            ,hud_style, seats_min, seats_max
 | 
				
			||||||
 | 
					                                            ,h_hud_style, h_seats_min, h_seats_max)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if hud_style == 'S' and h_hud_style == 'S':
 | 
					            if hud_style == 'S' and h_hud_style == 'S':
 | 
				
			||||||
                return stat_dict
 | 
					                return stat_dict
 | 
				
			||||||
| 
						 | 
					@ -475,7 +508,9 @@ class Database:
 | 
				
			||||||
        #    h_stylekey = date_nhands_ago  needs array by player here ...
 | 
					        #    h_stylekey = date_nhands_ago  needs array by player here ...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        query = 'get_stats_from_hand_aggregated'
 | 
					        query = 'get_stats_from_hand_aggregated'
 | 
				
			||||||
        subs = (hand, hero_id, stylekey, agg_bb_mult, agg_bb_mult, hero_id, h_stylekey, h_agg_bb_mult, h_agg_bb_mult)
 | 
					        subs = (hand
 | 
				
			||||||
 | 
					               ,hero_id, stylekey, agg_bb_mult, agg_bb_mult, seats_min, seats_max  # hero params
 | 
				
			||||||
 | 
					               ,hero_id, h_stylekey, h_agg_bb_mult, h_agg_bb_mult, h_seats_min, h_seats_max)    # villain params
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #print "get stats: hud style =", hud_style, "query =", query, "subs =", subs
 | 
					        #print "get stats: hud style =", hud_style, "query =", query, "subs =", subs
 | 
				
			||||||
        c = self.connection.cursor()
 | 
					        c = self.connection.cursor()
 | 
				
			||||||
| 
						 | 
					@ -495,12 +530,15 @@ class Database:
 | 
				
			||||||
        return stat_dict
 | 
					        return stat_dict
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # uses query on handsplayers instead of hudcache to get stats on just this session
 | 
					    # uses query on handsplayers instead of hudcache to get stats on just this session
 | 
				
			||||||
    def get_stats_from_hand_session(self, hand, stat_dict, hero_id, hud_style, h_hud_style):
 | 
					    def get_stats_from_hand_session(self, hand, stat_dict, hero_id
 | 
				
			||||||
 | 
					                                   ,hud_style, seats_min, seats_max
 | 
				
			||||||
 | 
					                                   ,h_hud_style, h_seats_min, h_seats_max):
 | 
				
			||||||
        """Get stats for just this session (currently defined as any play in the last 24 hours - to
 | 
					        """Get stats for just this session (currently defined as any play in the last 24 hours - to
 | 
				
			||||||
           be improved at some point ...)
 | 
					           be improved at some point ...)
 | 
				
			||||||
           h_hud_style and hud_style params indicate whether to get stats for hero and/or others
 | 
					           h_hud_style and hud_style params indicate whether to get stats for hero and/or others
 | 
				
			||||||
           - only fetch heros stats if h_hud_style == 'S',
 | 
					           - only fetch heros stats if h_hud_style == 'S',
 | 
				
			||||||
             and only fetch others stats if hud_style == 'S'
 | 
					             and only fetch others stats if hud_style == 'S'
 | 
				
			||||||
 | 
					           seats_min/max params give seats limits, only include stats if between these values
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        query = self.sql.query['get_stats_from_hand_session']
 | 
					        query = self.sql.query['get_stats_from_hand_session']
 | 
				
			||||||
| 
						 | 
					@ -509,7 +547,8 @@ class Database:
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            query = query.replace("<signed>", '')
 | 
					            query = query.replace("<signed>", '')
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        subs = (self.hand_1day_ago, hand)
 | 
					        subs = (self.hand_1day_ago, hand, hero_id, seats_min, seats_max
 | 
				
			||||||
 | 
					                                        , hero_id, h_seats_min, h_seats_max)
 | 
				
			||||||
        c = self.get_cursor()
 | 
					        c = self.get_cursor()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # now get the stats
 | 
					        # now get the stats
 | 
				
			||||||
| 
						 | 
					@ -524,6 +563,7 @@ class Database:
 | 
				
			||||||
            # Loop through stats adding them to appropriate stat_dict:
 | 
					            # Loop through stats adding them to appropriate stat_dict:
 | 
				
			||||||
            while row:
 | 
					            while row:
 | 
				
			||||||
                playerid = row[0]
 | 
					                playerid = row[0]
 | 
				
			||||||
 | 
					                seats = row[1]
 | 
				
			||||||
                if (playerid == hero_id and h_hud_style == 'S') or (playerid != hero_id and hud_style == 'S'):
 | 
					                if (playerid == hero_id and h_hud_style == 'S') or (playerid != hero_id and hud_style == 'S'):
 | 
				
			||||||
                    for name, val in zip(colnames, row):
 | 
					                    for name, val in zip(colnames, row):
 | 
				
			||||||
                        if not playerid in stat_dict:
 | 
					                        if not playerid in stat_dict:
 | 
				
			||||||
| 
						 | 
					@ -535,7 +575,7 @@ class Database:
 | 
				
			||||||
                            stat_dict[playerid][name.lower()] += val
 | 
					                            stat_dict[playerid][name.lower()] += val
 | 
				
			||||||
                    n += 1
 | 
					                    n += 1
 | 
				
			||||||
                    if n >= 10000: break  # todo: don't think this is needed so set nice and high 
 | 
					                    if n >= 10000: break  # todo: don't think this is needed so set nice and high 
 | 
				
			||||||
                                         #       for now - comment out or remove?
 | 
					                                          # prevents infinite loop so leave for now - comment out or remove?
 | 
				
			||||||
                row = c.fetchone()
 | 
					                row = c.fetchone()
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            log.error("ERROR: query %s result does not have player_id as first column" % (query,))
 | 
					            log.error("ERROR: query %s result does not have player_id as first column" % (query,))
 | 
				
			||||||
| 
						 | 
					@ -1343,7 +1383,9 @@ class Database:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        q = q.replace('%s', self.sql.query['placeholder'])
 | 
					        q = q.replace('%s', self.sql.query['placeholder'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.cursor.execute(q, (
 | 
					        c = self.connection.cursor()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        c.execute(q, (
 | 
				
			||||||
                p['tableName'], 
 | 
					                p['tableName'], 
 | 
				
			||||||
                p['gameTypeId'], 
 | 
					                p['gameTypeId'], 
 | 
				
			||||||
                p['siteHandNo'], 
 | 
					                p['siteHandNo'], 
 | 
				
			||||||
| 
						 | 
					@ -1374,7 +1416,7 @@ class Database:
 | 
				
			||||||
                p['street4Pot'],
 | 
					                p['street4Pot'],
 | 
				
			||||||
                p['showdownPot']
 | 
					                p['showdownPot']
 | 
				
			||||||
        ))
 | 
					        ))
 | 
				
			||||||
        return self.get_last_insert_id(self.cursor)
 | 
					        return self.get_last_insert_id(c)
 | 
				
			||||||
    # def storeHand
 | 
					    # def storeHand
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def storeHandsPlayers(self, hid, pids, pdata):
 | 
					    def storeHandsPlayers(self, hid, pids, pdata):
 | 
				
			||||||
| 
						 | 
					@ -1393,16 +1435,39 @@ class Database:
 | 
				
			||||||
                             pdata[p]['card6'],
 | 
					                             pdata[p]['card6'],
 | 
				
			||||||
                             pdata[p]['card7'],
 | 
					                             pdata[p]['card7'],
 | 
				
			||||||
                             pdata[p]['winnings'],
 | 
					                             pdata[p]['winnings'],
 | 
				
			||||||
 | 
					                             pdata[p]['rake'],
 | 
				
			||||||
 | 
					                             pdata[p]['totalProfit'],
 | 
				
			||||||
                             pdata[p]['street0VPI'],
 | 
					                             pdata[p]['street0VPI'],
 | 
				
			||||||
                             pdata[p]['street1Seen'],
 | 
					                             pdata[p]['street1Seen'],
 | 
				
			||||||
                             pdata[p]['street2Seen'],
 | 
					                             pdata[p]['street2Seen'],
 | 
				
			||||||
                             pdata[p]['street3Seen'],
 | 
					                             pdata[p]['street3Seen'],
 | 
				
			||||||
                             pdata[p]['street4Seen'],
 | 
					                             pdata[p]['street4Seen'],
 | 
				
			||||||
 | 
					                             pdata[p]['sawShowdown'],
 | 
				
			||||||
 | 
					                             pdata[p]['wonAtSD'],
 | 
				
			||||||
                             pdata[p]['street0Aggr'],
 | 
					                             pdata[p]['street0Aggr'],
 | 
				
			||||||
                             pdata[p]['street1Aggr'],
 | 
					                             pdata[p]['street1Aggr'],
 | 
				
			||||||
                             pdata[p]['street2Aggr'],
 | 
					                             pdata[p]['street2Aggr'],
 | 
				
			||||||
                             pdata[p]['street3Aggr'],
 | 
					                             pdata[p]['street3Aggr'],
 | 
				
			||||||
                             pdata[p]['street4Aggr']
 | 
					                             pdata[p]['street4Aggr'],
 | 
				
			||||||
 | 
					                             pdata[p]['street1CBChance'],
 | 
				
			||||||
 | 
					                             pdata[p]['street2CBChance'],
 | 
				
			||||||
 | 
					                             pdata[p]['street3CBChance'],
 | 
				
			||||||
 | 
					                             pdata[p]['street4CBChance'],
 | 
				
			||||||
 | 
					                             pdata[p]['street1CBDone'],
 | 
				
			||||||
 | 
					                             pdata[p]['street2CBDone'],
 | 
				
			||||||
 | 
					                             pdata[p]['street3CBDone'],
 | 
				
			||||||
 | 
					                             pdata[p]['street4CBDone'],
 | 
				
			||||||
 | 
					                             pdata[p]['wonWhenSeenStreet1'],
 | 
				
			||||||
 | 
					                             pdata[p]['street0Calls'],
 | 
				
			||||||
 | 
					                             pdata[p]['street1Calls'],
 | 
				
			||||||
 | 
					                             pdata[p]['street2Calls'],
 | 
				
			||||||
 | 
					                             pdata[p]['street3Calls'],
 | 
				
			||||||
 | 
					                             pdata[p]['street4Calls'],
 | 
				
			||||||
 | 
					                             pdata[p]['street0Bets'],
 | 
				
			||||||
 | 
					                             pdata[p]['street1Bets'],
 | 
				
			||||||
 | 
					                             pdata[p]['street2Bets'],
 | 
				
			||||||
 | 
					                             pdata[p]['street3Bets'],
 | 
				
			||||||
 | 
					                             pdata[p]['street4Bets'],
 | 
				
			||||||
                            ) )
 | 
					                            ) )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        q = """INSERT INTO HandsPlayers (
 | 
					        q = """INSERT INTO HandsPlayers (
 | 
				
			||||||
| 
						 | 
					@ -1418,19 +1483,46 @@ class Database:
 | 
				
			||||||
            card6,
 | 
					            card6,
 | 
				
			||||||
            card7,
 | 
					            card7,
 | 
				
			||||||
            winnings,
 | 
					            winnings,
 | 
				
			||||||
 | 
					            rake,
 | 
				
			||||||
 | 
					            totalProfit,
 | 
				
			||||||
            street0VPI,
 | 
					            street0VPI,
 | 
				
			||||||
            street1Seen,
 | 
					            street1Seen,
 | 
				
			||||||
            street2Seen,
 | 
					            street2Seen,
 | 
				
			||||||
            street3Seen,
 | 
					            street3Seen,
 | 
				
			||||||
            street4Seen,
 | 
					            street4Seen,
 | 
				
			||||||
 | 
					            sawShowdown,
 | 
				
			||||||
 | 
					            wonAtSD,
 | 
				
			||||||
            street0Aggr,
 | 
					            street0Aggr,
 | 
				
			||||||
            street1Aggr,
 | 
					            street1Aggr,
 | 
				
			||||||
            street2Aggr,
 | 
					            street2Aggr,
 | 
				
			||||||
            street3Aggr,
 | 
					            street3Aggr,
 | 
				
			||||||
            street4Aggr
 | 
					            street4Aggr,
 | 
				
			||||||
 | 
					            street1CBChance,
 | 
				
			||||||
 | 
					            street2CBChance,
 | 
				
			||||||
 | 
					            street3CBChance,
 | 
				
			||||||
 | 
					            street4CBChance,
 | 
				
			||||||
 | 
					            street1CBDone,
 | 
				
			||||||
 | 
					            street2CBDone,
 | 
				
			||||||
 | 
					            street3CBDone,
 | 
				
			||||||
 | 
					            street4CBDone,
 | 
				
			||||||
 | 
					            wonWhenSeenStreet1,
 | 
				
			||||||
 | 
					            street0Calls,
 | 
				
			||||||
 | 
					            street1Calls,
 | 
				
			||||||
 | 
					            street2Calls,
 | 
				
			||||||
 | 
					            street3Calls,
 | 
				
			||||||
 | 
					            street4Calls,
 | 
				
			||||||
 | 
					            street0Bets,
 | 
				
			||||||
 | 
					            street1Bets,
 | 
				
			||||||
 | 
					            street2Bets,
 | 
				
			||||||
 | 
					            street3Bets,
 | 
				
			||||||
 | 
					            street4Bets
 | 
				
			||||||
           )
 | 
					           )
 | 
				
			||||||
           VALUES (
 | 
					           VALUES (
 | 
				
			||||||
                %s, %s,
 | 
					                %s, %s, %s, %s, %s,
 | 
				
			||||||
 | 
					                %s, %s, %s, %s, %s,
 | 
				
			||||||
 | 
					                %s, %s, %s, %s, %s,
 | 
				
			||||||
 | 
					                %s, %s, %s, %s, %s,
 | 
				
			||||||
 | 
					                %s, %s, %s, %s, %s,
 | 
				
			||||||
                %s, %s, %s, %s, %s,
 | 
					                %s, %s, %s, %s, %s,
 | 
				
			||||||
                %s, %s, %s, %s, %s,
 | 
					                %s, %s, %s, %s, %s,
 | 
				
			||||||
                %s, %s, %s, %s, %s,
 | 
					                %s, %s, %s, %s, %s,
 | 
				
			||||||
| 
						 | 
					@ -1440,11 +1532,8 @@ class Database:
 | 
				
			||||||
#            position,
 | 
					#            position,
 | 
				
			||||||
#            tourneyTypeId,
 | 
					#            tourneyTypeId,
 | 
				
			||||||
#            startCards,
 | 
					#            startCards,
 | 
				
			||||||
#            rake,
 | 
					 | 
				
			||||||
#            totalProfit,
 | 
					 | 
				
			||||||
#            street0_3BChance,
 | 
					#            street0_3BChance,
 | 
				
			||||||
#            street0_3BDone,
 | 
					#            street0_3BDone,
 | 
				
			||||||
#            sawShowdown,
 | 
					 | 
				
			||||||
#            otherRaisedStreet1,
 | 
					#            otherRaisedStreet1,
 | 
				
			||||||
#            otherRaisedStreet2,
 | 
					#            otherRaisedStreet2,
 | 
				
			||||||
#            otherRaisedStreet3,
 | 
					#            otherRaisedStreet3,
 | 
				
			||||||
| 
						 | 
					@ -1453,22 +1542,12 @@ class Database:
 | 
				
			||||||
#            foldToOtherRaisedStreet2,
 | 
					#            foldToOtherRaisedStreet2,
 | 
				
			||||||
#            foldToOtherRaisedStreet3,
 | 
					#            foldToOtherRaisedStreet3,
 | 
				
			||||||
#            foldToOtherRaisedStreet4,
 | 
					#            foldToOtherRaisedStreet4,
 | 
				
			||||||
#            wonWhenSeenStreet1,
 | 
					 | 
				
			||||||
#            wonAtSD,
 | 
					 | 
				
			||||||
#            stealAttemptChance,
 | 
					#            stealAttemptChance,
 | 
				
			||||||
#            stealAttempted,
 | 
					#            stealAttempted,
 | 
				
			||||||
#            foldBbToStealChance,
 | 
					#            foldBbToStealChance,
 | 
				
			||||||
#            foldedBbToSteal,
 | 
					#            foldedBbToSteal,
 | 
				
			||||||
#            foldSbToStealChance,
 | 
					#            foldSbToStealChance,
 | 
				
			||||||
#            foldedSbToSteal,
 | 
					#            foldedSbToSteal,
 | 
				
			||||||
#            street1CBChance,
 | 
					 | 
				
			||||||
#            street1CBDone,
 | 
					 | 
				
			||||||
#            street2CBChance,
 | 
					 | 
				
			||||||
#            street2CBDone,
 | 
					 | 
				
			||||||
#            street3CBChance,
 | 
					 | 
				
			||||||
#            street3CBDone,
 | 
					 | 
				
			||||||
#            street4CBChance,
 | 
					 | 
				
			||||||
#            street4CBDone,
 | 
					 | 
				
			||||||
#            foldToStreet1CBChance,
 | 
					#            foldToStreet1CBChance,
 | 
				
			||||||
#            foldToStreet1CBDone,
 | 
					#            foldToStreet1CBDone,
 | 
				
			||||||
#            foldToStreet2CBChance,
 | 
					#            foldToStreet2CBChance,
 | 
				
			||||||
| 
						 | 
					@ -1485,21 +1564,13 @@ class Database:
 | 
				
			||||||
#            street3CheckCallRaiseDone,
 | 
					#            street3CheckCallRaiseDone,
 | 
				
			||||||
#            street4CheckCallRaiseChance,
 | 
					#            street4CheckCallRaiseChance,
 | 
				
			||||||
#            street4CheckCallRaiseDone,
 | 
					#            street4CheckCallRaiseDone,
 | 
				
			||||||
#            street0Calls,
 | 
					 | 
				
			||||||
#            street1Calls,
 | 
					 | 
				
			||||||
#            street2Calls,
 | 
					 | 
				
			||||||
#            street3Calls,
 | 
					 | 
				
			||||||
#            street4Calls,
 | 
					 | 
				
			||||||
#            street0Bets,
 | 
					 | 
				
			||||||
#            street1Bets,
 | 
					 | 
				
			||||||
#            street2Bets,
 | 
					 | 
				
			||||||
#            street3Bets,
 | 
					 | 
				
			||||||
#            street4Bets
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        q = q.replace('%s', self.sql.query['placeholder'])
 | 
					        q = q.replace('%s', self.sql.query['placeholder'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #print "DEBUG: inserts: %s" %inserts
 | 
					        #print "DEBUG: inserts: %s" %inserts
 | 
				
			||||||
        self.cursor.executemany(q, inserts)
 | 
					        #print "DEBUG: q: %s" % q
 | 
				
			||||||
 | 
					        c = self.connection.cursor()
 | 
				
			||||||
 | 
					        c.executemany(q, inserts)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def storeHudCacheNew(self, gid, pid, hc):
 | 
					    def storeHudCacheNew(self, gid, pid, hc):
 | 
				
			||||||
        q = """INSERT INTO HudCache (
 | 
					        q = """INSERT INTO HudCache (
 | 
				
			||||||
| 
						 | 
					@ -1641,6 +1712,15 @@ class Database:
 | 
				
			||||||
#            street4CheckCallRaiseChance,
 | 
					#            street4CheckCallRaiseChance,
 | 
				
			||||||
#            street4CheckCallRaiseDone)
 | 
					#            street4CheckCallRaiseDone)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def isDuplicate(self, gametypeID, siteHandNo):
 | 
				
			||||||
 | 
					        dup = False
 | 
				
			||||||
 | 
					        c = self.get_cursor()
 | 
				
			||||||
 | 
					        c.execute(self.sql.query['isAlreadyInDB'], (gametypeID, siteHandNo))
 | 
				
			||||||
 | 
					        result = c.fetchall()
 | 
				
			||||||
 | 
					        if len(result) > 0:
 | 
				
			||||||
 | 
					            dup = True
 | 
				
			||||||
 | 
					        return dup
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def getGameTypeId(self, siteid, game):
 | 
					    def getGameTypeId(self, siteid, game):
 | 
				
			||||||
        c = self.get_cursor()
 | 
					        c = self.get_cursor()
 | 
				
			||||||
        #FIXME: Fixed for NL at the moment
 | 
					        #FIXME: Fixed for NL at the moment
 | 
				
			||||||
| 
						 | 
					@ -1680,6 +1760,13 @@ class Database:
 | 
				
			||||||
        q = "SELECT name, id FROM Players WHERE siteid=%s and name=%s"
 | 
					        q = "SELECT name, id FROM Players WHERE siteid=%s and name=%s"
 | 
				
			||||||
        q = q.replace('%s', self.sql.query['placeholder'])
 | 
					        q = q.replace('%s', self.sql.query['placeholder'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        #NOTE/FIXME?: MySQL has ON DUPLICATE KEY UPDATE
 | 
				
			||||||
 | 
					        #Usage:
 | 
				
			||||||
 | 
					        #        INSERT INTO `tags` (`tag`, `count`)
 | 
				
			||||||
 | 
					        #         VALUES ($tag, 1)
 | 
				
			||||||
 | 
					        #           ON DUPLICATE KEY UPDATE `count`=`count`+1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #print "DEBUG: name: %s site: %s" %(name, site_id)
 | 
					        #print "DEBUG: name: %s site: %s" %(name, site_id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        c.execute (q, (site_id, name))
 | 
					        c.execute (q, (site_id, name))
 | 
				
			||||||
| 
						 | 
					@ -2699,7 +2786,9 @@ if __name__=="__main__":
 | 
				
			||||||
#    db_connection = Database(c, 'PTrackSv2', 'razz') # mysql razz
 | 
					#    db_connection = Database(c, 'PTrackSv2', 'razz') # mysql razz
 | 
				
			||||||
#    db_connection = Database(c, 'ptracks', 'razz') # postgres
 | 
					#    db_connection = Database(c, 'ptracks', 'razz') # postgres
 | 
				
			||||||
    print "database connection object = ", db_connection.connection
 | 
					    print "database connection object = ", db_connection.connection
 | 
				
			||||||
    db_connection.recreate_tables()
 | 
					    # db_connection.recreate_tables()
 | 
				
			||||||
 | 
					    db_connection.dropAllIndexes()
 | 
				
			||||||
 | 
					    db_connection.createAllIndexes()
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    h = db_connection.get_last_hand()
 | 
					    h = db_connection.get_last_hand()
 | 
				
			||||||
    print "last hand = ", h
 | 
					    print "last hand = ", h
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
"""Database manager
 | 
					"""Database manager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@todo: (gtk) how to validate user input in gtk.Dialog? as soon as the user clicks ok the dialog is dead. we use a while loop as workaround. not nice 
 | 
					@todo: (gtk) how to validate user input in gtk.Dialog? as soon as the user clicks ok the dialog is dead. we use a while loop as workaround. not nice
 | 
				
			||||||
@todo: (fpdb) we need the application name 'fpdb' from somewhere to put it in dialog titles
 | 
					@todo: (fpdb) we need the application name 'fpdb' from somewhere to put it in dialog titles
 | 
				
			||||||
@todo: (fpdb) config object should be initialized globally and accessible from all modules via Configuration.py
 | 
					@todo: (fpdb) config object should be initialized globally and accessible from all modules via Configuration.py
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,10 +24,10 @@ import gobject
 | 
				
			||||||
#*******************************************************************************************************
 | 
					#*******************************************************************************************************
 | 
				
			||||||
class DatabaseManager(gobject.GObject):
 | 
					class DatabaseManager(gobject.GObject):
 | 
				
			||||||
    DatabaseTypes = {}
 | 
					    DatabaseTypes = {}
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    @classmethod
 | 
					    @classmethod
 | 
				
			||||||
    def from_fpdb(klass, data, defaultDatabaseType=None):
 | 
					    def from_fpdb(klass, data, defaultDatabaseType=None):
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        #NOTE: if no databases are present in config fpdb fails with
 | 
					        #NOTE: if no databases are present in config fpdb fails with
 | 
				
			||||||
        #    Traceback (most recent call last):
 | 
					        #    Traceback (most recent call last):
 | 
				
			||||||
        #      File "/home/me2/Scr/Repos/fpdb-mme/pyfpdb/DatabaseManager.py", line 783, in <module>
 | 
					        #      File "/home/me2/Scr/Repos/fpdb-mme/pyfpdb/DatabaseManager.py", line 783, in <module>
 | 
				
			||||||
| 
						 | 
					@ -38,12 +38,12 @@ class DatabaseManager(gobject.GObject):
 | 
				
			||||||
        #        db = self.get_db_parameters()
 | 
					        #        db = self.get_db_parameters()
 | 
				
			||||||
        #      File "/home/me2/Scr/Repos/fpdb-mme/pyfpdb/Configuration.py", line 583, in get_db_parameters
 | 
					        #      File "/home/me2/Scr/Repos/fpdb-mme/pyfpdb/Configuration.py", line 583, in get_db_parameters
 | 
				
			||||||
        #        name = self.db_selected
 | 
					        #        name = self.db_selected
 | 
				
			||||||
        #    AttributeError: Config instance has no attribute 'db_selected'        
 | 
					        #    AttributeError: Config instance has no attribute 'db_selected'
 | 
				
			||||||
        import sys
 | 
					        import sys
 | 
				
			||||||
        import Options
 | 
					        import Options
 | 
				
			||||||
        import Configuration
 | 
					        import Configuration
 | 
				
			||||||
        #NOTE: fpdb should perform this globally
 | 
					        #NOTE: fpdb should perform this globally
 | 
				
			||||||
        (options, sys.argv) = Options.fpdb_options()
 | 
					        (options, argv) = Options.fpdb_options()
 | 
				
			||||||
        config = Configuration.Config(file=options.config, dbname=options.dbname)
 | 
					        config = Configuration.Config(file=options.config, dbname=options.dbname)
 | 
				
			||||||
        #TODO: handle no database present
 | 
					        #TODO: handle no database present
 | 
				
			||||||
        defaultDatabaseName = config.get_db_parameters().get('db-databaseName', None)
 | 
					        defaultDatabaseName = config.get_db_parameters().get('db-databaseName', None)
 | 
				
			||||||
| 
						 | 
					@ -54,7 +54,7 @@ class DatabaseManager(gobject.GObject):
 | 
				
			||||||
            #NOTE: Config does not seem to validate user input, so anything may end up here
 | 
					            #NOTE: Config does not seem to validate user input, so anything may end up here
 | 
				
			||||||
            if databaseKlass is None:
 | 
					            if databaseKlass is None:
 | 
				
			||||||
                raise ValueError('Unknown databasetype: %s' % fpdbDatabase.db_server)
 | 
					                raise ValueError('Unknown databasetype: %s' % fpdbDatabase.db_server)
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
            database = databaseKlass()
 | 
					            database = databaseKlass()
 | 
				
			||||||
            if database.Type == 'sqlite':
 | 
					            if database.Type == 'sqlite':
 | 
				
			||||||
                database.name = fpdbDatabase.db_name
 | 
					                database.name = fpdbDatabase.db_name
 | 
				
			||||||
| 
						 | 
					@ -66,17 +66,17 @@ class DatabaseManager(gobject.GObject):
 | 
				
			||||||
                database.port = int(fpdbDatabase.db_ip)
 | 
					                database.port = int(fpdbDatabase.db_ip)
 | 
				
			||||||
                database.user = fpdbDatabase.db_user
 | 
					                database.user = fpdbDatabase.db_user
 | 
				
			||||||
                database.password = fpdbDatabase.db_pass
 | 
					                database.password = fpdbDatabase.db_pass
 | 
				
			||||||
            databases.append(database)            
 | 
					            databases.append(database)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        return klass(databases=databases, defaultDatabaseType=defaultDatabaseType)
 | 
					        return klass(databases=databases, defaultDatabaseType=defaultDatabaseType)
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    def to_fpdb(self):
 | 
					    def to_fpdb(self):
 | 
				
			||||||
        pass
 | 
					        pass
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    def __init__(self, databases=None, defaultDatabaseType=None):
 | 
					    def __init__(self, databases=None, defaultDatabaseType=None):
 | 
				
			||||||
        gobject.GObject.__init__(self)
 | 
					        gobject.GObject.__init__(self)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        self._defaultDatabaseType = defaultDatabaseType
 | 
					        self._defaultDatabaseType = defaultDatabaseType
 | 
				
			||||||
        self._databases = [] if databases is None else list(databases)
 | 
					        self._databases = [] if databases is None else list(databases)
 | 
				
			||||||
        self._activeDatabase = None
 | 
					        self._activeDatabase = None
 | 
				
			||||||
| 
						 | 
					@ -98,21 +98,21 @@ class DatabaseManager(gobject.GObject):
 | 
				
			||||||
        self._databases.append(database)
 | 
					        self._databases.append(database)
 | 
				
			||||||
    def remove_database(self, database):
 | 
					    def remove_database(self, database):
 | 
				
			||||||
        self._databases.remove(database)
 | 
					        self._databases.remove(database)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
    def activate_database(self, database):
 | 
					    def activate_database(self, database):
 | 
				
			||||||
        if self._activeDatabase is not None:
 | 
					        if self._activeDatabase is not None:
 | 
				
			||||||
            self._activeDatabase.status = self._activeDatabase.StatusInactive
 | 
					            self._activeDatabase.status = self._activeDatabase.StatusInactive
 | 
				
			||||||
            #TODO: finalize database
 | 
					            #TODO: finalize database
 | 
				
			||||||
            self.emit('database-deactivated', self.database_id(self._activeDatabase) )
 | 
					            self.emit('database-deactivated', self.database_id(self._activeDatabase) )
 | 
				
			||||||
                        
 | 
					
 | 
				
			||||||
        database.status = database.StatusActive
 | 
					        database.status = database.StatusActive
 | 
				
			||||||
        #TODO: activate database
 | 
					        #TODO: activate database
 | 
				
			||||||
        self._activeDatabase = database
 | 
					        self._activeDatabase = database
 | 
				
			||||||
        self.emit('database-activated', self.database_id(database) )
 | 
					        self.emit('database-activated', self.database_id(database) )
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
    def active_database(self):
 | 
					    def active_database(self):
 | 
				
			||||||
        return self._activeDatabase
 | 
					        return self._activeDatabase
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
# register DatabaseManager signals
 | 
					# register DatabaseManager signals
 | 
				
			||||||
gobject.type_register(DatabaseManager)
 | 
					gobject.type_register(DatabaseManager)
 | 
				
			||||||
gobject.signal_new('database-activated', DatabaseManager, gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (int, ))
 | 
					gobject.signal_new('database-activated', DatabaseManager, gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (int, ))
 | 
				
			||||||
| 
						 | 
					@ -134,20 +134,20 @@ class DatabaseTypeBase(object):
 | 
				
			||||||
    StatusActive = 'active'
 | 
					    StatusActive = 'active'
 | 
				
			||||||
    StatusInactive = 'inactive'
 | 
					    StatusInactive = 'inactive'
 | 
				
			||||||
    StatusError = 'error'        #TODO: not implemented
 | 
					    StatusError = 'error'        #TODO: not implemented
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    #TODO: not happy with returning error string. just being too lazy to impl dozens of error codes for later translation
 | 
					    #TODO: not happy with returning error string. just being too lazy to impl dozens of error codes for later translation
 | 
				
			||||||
    def init_new_database(self):
 | 
					    def init_new_database(self):
 | 
				
			||||||
        """initializes a new empty database
 | 
					        """initializes a new empty database
 | 
				
			||||||
        @return: (str) error if something goes wrong, None otherwise
 | 
					        @return: (str) error if something goes wrong, None otherwise
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        raise NotImplementedError()
 | 
					        raise NotImplementedError()
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
    def validate_database(self):
 | 
					    def validate_database(self):
 | 
				
			||||||
        """checks if the database is valid
 | 
					        """checks if the database is valid
 | 
				
			||||||
        @return: (str) error if something goes wrong, None otherwise
 | 
					        @return: (str) error if something goes wrong, None otherwise
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        raise NotImplementedError()
 | 
					        raise NotImplementedError()
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
class DatabaseTypePostgres(DatabaseTypeBase):
 | 
					class DatabaseTypePostgres(DatabaseTypeBase):
 | 
				
			||||||
    Type = 'postgresql'
 | 
					    Type = 'postgresql'
 | 
				
			||||||
    @classmethod
 | 
					    @classmethod
 | 
				
			||||||
| 
						 | 
					@ -161,15 +161,15 @@ class DatabaseTypePostgres(DatabaseTypeBase):
 | 
				
			||||||
        self.password = password
 | 
					        self.password = password
 | 
				
			||||||
        self.database = database
 | 
					        self.database = database
 | 
				
			||||||
        self.status = self.StatusInactive
 | 
					        self.status = self.StatusInactive
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    #TODO: implement
 | 
					    #TODO: implement
 | 
				
			||||||
    def init_new_database(self):
 | 
					    def init_new_database(self):
 | 
				
			||||||
        pass
 | 
					        pass
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
    #TODO: implement
 | 
					    #TODO: implement
 | 
				
			||||||
    def validate_database(self):
 | 
					    def validate_database(self):
 | 
				
			||||||
        pass
 | 
					        pass
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
class DatabaseTypeMysql(DatabaseTypeBase):
 | 
					class DatabaseTypeMysql(DatabaseTypeBase):
 | 
				
			||||||
    Type = 'mysql'
 | 
					    Type = 'mysql'
 | 
				
			||||||
    @classmethod
 | 
					    @classmethod
 | 
				
			||||||
| 
						 | 
					@ -183,11 +183,11 @@ class DatabaseTypeMysql(DatabaseTypeBase):
 | 
				
			||||||
        self.password = password
 | 
					        self.password = password
 | 
				
			||||||
        self.database = database
 | 
					        self.database = database
 | 
				
			||||||
        self.status = self.StatusInactive
 | 
					        self.status = self.StatusInactive
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    #TODO: implement
 | 
					    #TODO: implement
 | 
				
			||||||
    def init_new_database(self):
 | 
					    def init_new_database(self):
 | 
				
			||||||
        pass
 | 
					        pass
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
    #TODO: implement
 | 
					    #TODO: implement
 | 
				
			||||||
    def validate_database(self):
 | 
					    def validate_database(self):
 | 
				
			||||||
        pass
 | 
					        pass
 | 
				
			||||||
| 
						 | 
					@ -202,7 +202,7 @@ class DatabaseTypeSqLite(DatabaseTypeBase):
 | 
				
			||||||
        self.name = name
 | 
					        self.name = name
 | 
				
			||||||
        self.file = file
 | 
					        self.file = file
 | 
				
			||||||
        self.status = self.StatusInactive
 | 
					        self.status = self.StatusInactive
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
    def init_new_database(self):
 | 
					    def init_new_database(self):
 | 
				
			||||||
        # make shure all attrs are specified
 | 
					        # make shure all attrs are specified
 | 
				
			||||||
        if not self.file:
 | 
					        if not self.file:
 | 
				
			||||||
| 
						 | 
					@ -212,15 +212,15 @@ class DatabaseTypeSqLite(DatabaseTypeBase):
 | 
				
			||||||
            open(self.file, 'w').close()
 | 
					            open(self.file, 'w').close()
 | 
				
			||||||
        except IOError:
 | 
					        except IOError:
 | 
				
			||||||
            return 'can not write file'
 | 
					            return 'can not write file'
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
        #TODO: init tables (...)
 | 
					        #TODO: init tables (...)
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
    def validate_database(self):
 | 
					    def validate_database(self):
 | 
				
			||||||
        pass
 | 
					        pass
 | 
				
			||||||
        #TODO: check if tables (...) exist
 | 
					        #TODO: check if tables (...) exist
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#TODO: how do we want to handle unsupported database types?
 | 
					#TODO: how do we want to handle unsupported database types?
 | 
				
			||||||
# ..uncomment to remove unsupported database types
 | 
					# ..uncomment to remove unsupported database types
 | 
				
			||||||
| 
						 | 
					@ -235,7 +235,7 @@ class DatabaseTypeSqLite(DatabaseTypeBase):
 | 
				
			||||||
#TODO: there is no title (on linux), wtf?
 | 
					#TODO: there is no title (on linux), wtf?
 | 
				
			||||||
def DialogError(parent=None, msg=''):
 | 
					def DialogError(parent=None, msg=''):
 | 
				
			||||||
    dlg = gtk.MessageDialog(
 | 
					    dlg = gtk.MessageDialog(
 | 
				
			||||||
                parent=parent, 
 | 
					                parent=parent,
 | 
				
			||||||
                flags=gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
 | 
					                flags=gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
 | 
				
			||||||
                type=gtk.MESSAGE_ERROR,
 | 
					                type=gtk.MESSAGE_ERROR,
 | 
				
			||||||
                buttons=gtk.BUTTONS_OK,
 | 
					                buttons=gtk.BUTTONS_OK,
 | 
				
			||||||
| 
						 | 
					@ -248,33 +248,33 @@ def DialogError(parent=None, msg=''):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#TODO: derrive from gtk.VBox?
 | 
					#TODO: derrive from gtk.VBox?
 | 
				
			||||||
class WidgetDatabaseProperties(gtk.VBox):
 | 
					class WidgetDatabaseProperties(gtk.VBox):
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
    ModeNew = 0
 | 
					    ModeNew = 0
 | 
				
			||||||
    ModeEdit = 1
 | 
					    ModeEdit = 1
 | 
				
			||||||
    ModeAdd = 2
 | 
					    ModeAdd = 2
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
    class SqLiteFileChooserButton(gtk.HBox):
 | 
					    class SqLiteFileChooserButton(gtk.HBox):
 | 
				
			||||||
        #NOTE: for some weird reason it is impossible to let the user choose a non exiting filename with gtk.FileChooserButton, so impl our own on the fly
 | 
					        #NOTE: for some weird reason it is impossible to let the user choose a non exiting filename with gtk.FileChooserButton, so impl our own on the fly
 | 
				
			||||||
        def __init__(self, widgetDatabaseProperties, parentWidget):
 | 
					        def __init__(self, widgetDatabaseProperties, parentWidget):
 | 
				
			||||||
            gtk.HBox.__init__(self)
 | 
					            gtk.HBox.__init__(self)
 | 
				
			||||||
            self.set_homogeneous(False)
 | 
					            self.set_homogeneous(False)
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
            self.parentWidget = parentWidget
 | 
					            self.parentWidget = parentWidget
 | 
				
			||||||
            self.widgetDatabaseProperties = widgetDatabaseProperties
 | 
					            self.widgetDatabaseProperties = widgetDatabaseProperties
 | 
				
			||||||
            self.entry = gtk.Entry()
 | 
					            self.entry = gtk.Entry()
 | 
				
			||||||
            self.button = gtk.Button('...')
 | 
					            self.button = gtk.Button('...')
 | 
				
			||||||
            self.button.connect('clicked', self.on_button_clicked)
 | 
					            self.button.connect('clicked', self.on_button_clicked)
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
            # layout widgets
 | 
					            # layout widgets
 | 
				
			||||||
            self.pack_start(self.entry, True, True)
 | 
					            self.pack_start(self.entry, True, True)
 | 
				
			||||||
            self.pack_start(self.button, False, False)
 | 
					            self.pack_start(self.button, False, False)
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
        def get_filename(self):
 | 
					        def get_filename(self):
 | 
				
			||||||
            return self.entry.get_text()
 | 
					            return self.entry.get_text()
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
        def set_filename(self, name):
 | 
					        def set_filename(self, name):
 | 
				
			||||||
            self.entry.set_text(name)
 | 
					            self.entry.set_text(name)
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
        def on_button_clicked(self, button):
 | 
					        def on_button_clicked(self, button):
 | 
				
			||||||
            if self.widgetDatabaseProperties.mode == WidgetDatabaseProperties.ModeAdd:
 | 
					            if self.widgetDatabaseProperties.mode == WidgetDatabaseProperties.ModeAdd:
 | 
				
			||||||
                action = gtk.FILE_CHOOSER_ACTION_OPEN
 | 
					                action = gtk.FILE_CHOOSER_ACTION_OPEN
 | 
				
			||||||
| 
						 | 
					@ -283,13 +283,13 @@ class WidgetDatabaseProperties(gtk.VBox):
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                raise ValueError('unsupported dialog mode')
 | 
					                raise ValueError('unsupported dialog mode')
 | 
				
			||||||
            dlg = gtk.FileChooserDialog(
 | 
					            dlg = gtk.FileChooserDialog(
 | 
				
			||||||
                    title='Choose an exiting database file or type in name of a new one', 
 | 
					                    title='Choose an exiting database file or type in name of a new one',
 | 
				
			||||||
                    parent=self.parentWidget, 
 | 
					                    parent=self.parentWidget,
 | 
				
			||||||
                    action=action, 
 | 
					                    action=action,
 | 
				
			||||||
                    buttons=(
 | 
					                    buttons=(
 | 
				
			||||||
                            gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
 | 
					                            gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
 | 
				
			||||||
                            gtk.STOCK_OK, gtk.RESPONSE_OK,
 | 
					                            gtk.STOCK_OK, gtk.RESPONSE_OK,
 | 
				
			||||||
                            ), 
 | 
					                            ),
 | 
				
			||||||
                    backend=None
 | 
					                    backend=None
 | 
				
			||||||
                    )
 | 
					                    )
 | 
				
			||||||
            dlg.set_default_response(gtk.RESPONSE_OK)
 | 
					            dlg.set_default_response(gtk.RESPONSE_OK)
 | 
				
			||||||
| 
						 | 
					@ -298,8 +298,8 @@ class WidgetDatabaseProperties(gtk.VBox):
 | 
				
			||||||
                fileName = dlg.get_filename()
 | 
					                fileName = dlg.get_filename()
 | 
				
			||||||
                self.set_filename(fileName)
 | 
					                self.set_filename(fileName)
 | 
				
			||||||
            dlg.destroy()
 | 
					            dlg.destroy()
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    #TODO: bit ugly this thingy. try to find a better way to map database attrs to gtk widgets
 | 
					    #TODO: bit ugly this thingy. try to find a better way to map database attrs to gtk widgets
 | 
				
			||||||
    class FieldWidget(object):
 | 
					    class FieldWidget(object):
 | 
				
			||||||
        def __init__(self, text='', attrDatabase='', widget=None, attrGet=None, attrSet=None, defaultValue=None, canEdit=False, tooltip=''):
 | 
					        def __init__(self, text='', attrDatabase='', widget=None, attrGet=None, attrSet=None, defaultValue=None, canEdit=False, tooltip=''):
 | 
				
			||||||
| 
						 | 
					@ -310,15 +310,15 @@ class WidgetDatabaseProperties(gtk.VBox):
 | 
				
			||||||
            self._attrDatabase = attrDatabase
 | 
					            self._attrDatabase = attrDatabase
 | 
				
			||||||
            self._widget = widget
 | 
					            self._widget = widget
 | 
				
			||||||
            self._defaultValue = defaultValue
 | 
					            self._defaultValue = defaultValue
 | 
				
			||||||
            self._attrGetter=None, 
 | 
					            self._attrGetter=None,
 | 
				
			||||||
            self._attrGet = attrGet 
 | 
					            self._attrGet = attrGet
 | 
				
			||||||
            self._attrSet = attrSet 
 | 
					            self._attrSet = attrSet
 | 
				
			||||||
            self._canEdit = canEdit
 | 
					            self._canEdit = canEdit
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
            self._label.set_tooltip_text(tooltip)
 | 
					            self._label.set_tooltip_text(tooltip)
 | 
				
			||||||
            self._widget.set_tooltip_text(tooltip)
 | 
					            self._widget.set_tooltip_text(tooltip)
 | 
				
			||||||
                    
 | 
					
 | 
				
			||||||
        def widget(self): 
 | 
					        def widget(self):
 | 
				
			||||||
            return self._widget
 | 
					            return self._widget
 | 
				
			||||||
        def label(self):
 | 
					        def label(self):
 | 
				
			||||||
            return self._label
 | 
					            return self._label
 | 
				
			||||||
| 
						 | 
					@ -335,10 +335,10 @@ class WidgetDatabaseProperties(gtk.VBox):
 | 
				
			||||||
            setattr(database, self._attrDatabase, getattr(self._widget, self._attrGet)() )
 | 
					            setattr(database, self._attrDatabase, getattr(self._widget, self._attrGet)() )
 | 
				
			||||||
        def reset_value(self):
 | 
					        def reset_value(self):
 | 
				
			||||||
            getattr(self._widget, self._attrSet)(self._defaultValue)
 | 
					            getattr(self._widget, self._attrSet)(self._defaultValue)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
    def __init__(self, databaseManager, database, mode=ModeEdit, parentWidget=None):
 | 
					    def __init__(self, databaseManager, database, mode=ModeEdit, parentWidget=None):
 | 
				
			||||||
            gtk.VBox.__init__(self)
 | 
					            gtk.VBox.__init__(self)
 | 
				
			||||||
                        
 | 
					
 | 
				
			||||||
            self.databaseManager = databaseManager
 | 
					            self.databaseManager = databaseManager
 | 
				
			||||||
            self.database = database
 | 
					            self.database = database
 | 
				
			||||||
            self.mode = mode
 | 
					            self.mode = mode
 | 
				
			||||||
| 
						 | 
					@ -346,76 +346,76 @@ class WidgetDatabaseProperties(gtk.VBox):
 | 
				
			||||||
            self.fieldWidgets = (
 | 
					            self.fieldWidgets = (
 | 
				
			||||||
                        self.FieldWidget(
 | 
					                        self.FieldWidget(
 | 
				
			||||||
                                text='Name:',
 | 
					                                text='Name:',
 | 
				
			||||||
                                attrDatabase='name', 
 | 
					                                attrDatabase='name',
 | 
				
			||||||
                                widget=gtk.Entry(),
 | 
					                                widget=gtk.Entry(),
 | 
				
			||||||
                                defaultValue='',
 | 
					                                defaultValue='',
 | 
				
			||||||
                                attrGet='get_text', 
 | 
					                                attrGet='get_text',
 | 
				
			||||||
                                attrSet='set_text', 
 | 
					                                attrSet='set_text',
 | 
				
			||||||
                                canEdit=True,
 | 
					                                canEdit=True,
 | 
				
			||||||
                                tooltip='Any name you like to name the database '
 | 
					                                tooltip='Any name you like to name the database '
 | 
				
			||||||
                        ),
 | 
					                        ),
 | 
				
			||||||
                        self.FieldWidget(
 | 
					                        self.FieldWidget(
 | 
				
			||||||
                            text='File:', 
 | 
					                            text='File:',
 | 
				
			||||||
                            attrDatabase='file', 
 | 
					                            attrDatabase='file',
 | 
				
			||||||
                            widget=self.SqLiteFileChooserButton(self, self.parentWidget), 
 | 
					                            widget=self.SqLiteFileChooserButton(self, self.parentWidget),
 | 
				
			||||||
                            defaultValue='',
 | 
					                            defaultValue='',
 | 
				
			||||||
                            attrGet='get_filename', 
 | 
					                            attrGet='get_filename',
 | 
				
			||||||
                            attrSet='set_filename', 
 | 
					                            attrSet='set_filename',
 | 
				
			||||||
                            canEdit=False, 
 | 
					                            canEdit=False,
 | 
				
			||||||
                            tooltip='Fully qualified path of the file to hold the database '
 | 
					                            tooltip='Fully qualified path of the file to hold the database '
 | 
				
			||||||
                        ),
 | 
					                        ),
 | 
				
			||||||
                        self.FieldWidget(
 | 
					                        self.FieldWidget(
 | 
				
			||||||
                            text='Host:', 
 | 
					                            text='Host:',
 | 
				
			||||||
                            attrDatabase='host', 
 | 
					                            attrDatabase='host',
 | 
				
			||||||
                            widget=gtk.Entry(), 
 | 
					                            widget=gtk.Entry(),
 | 
				
			||||||
                            defaultValue='',
 | 
					                            defaultValue='',
 | 
				
			||||||
                            attrGet='get_text', 
 | 
					                            attrGet='get_text',
 | 
				
			||||||
                            attrSet='set_text', 
 | 
					                            attrSet='set_text',
 | 
				
			||||||
                            canEdit=False, 
 | 
					                            canEdit=False,
 | 
				
			||||||
                            tooltip='Host the database is located at'
 | 
					                            tooltip='Host the database is located at'
 | 
				
			||||||
                        ),
 | 
					                        ),
 | 
				
			||||||
                        self.FieldWidget(
 | 
					                        self.FieldWidget(
 | 
				
			||||||
                            text='Port:', 
 | 
					                            text='Port:',
 | 
				
			||||||
                            attrDatabase='port', 
 | 
					                            attrDatabase='port',
 | 
				
			||||||
                            widget=gtk.SpinButton(adjustment=gtk.Adjustment(value=0, lower=0, upper=999999, step_incr=1, page_incr=10) ), 
 | 
					                            widget=gtk.SpinButton(adjustment=gtk.Adjustment(value=0, lower=0, upper=999999, step_incr=1, page_incr=10) ),
 | 
				
			||||||
                            defaultValue=0,
 | 
					                            defaultValue=0,
 | 
				
			||||||
                            attrGet='get_value', 
 | 
					                            attrGet='get_value',
 | 
				
			||||||
                            attrSet='set_value', 
 | 
					                            attrSet='set_value',
 | 
				
			||||||
                            canEdit=False, 
 | 
					                            canEdit=False,
 | 
				
			||||||
                            tooltip='Port to use to connect to the host'
 | 
					                            tooltip='Port to use to connect to the host'
 | 
				
			||||||
                        ),
 | 
					                        ),
 | 
				
			||||||
                        self.FieldWidget(
 | 
					                        self.FieldWidget(
 | 
				
			||||||
                            text='User:', 
 | 
					                            text='User:',
 | 
				
			||||||
                            attrDatabase='user', 
 | 
					                            attrDatabase='user',
 | 
				
			||||||
                            widget=gtk.Entry(), 
 | 
					                            widget=gtk.Entry(),
 | 
				
			||||||
                            defaultValue='',
 | 
					                            defaultValue='',
 | 
				
			||||||
                            attrGet='get_text', 
 | 
					                            attrGet='get_text',
 | 
				
			||||||
                            attrSet='set_text', 
 | 
					                            attrSet='set_text',
 | 
				
			||||||
                            canEdit=False, 
 | 
					                            canEdit=False,
 | 
				
			||||||
                            tooltip='User name used to login to the host'
 | 
					                            tooltip='User name used to login to the host'
 | 
				
			||||||
                        ),
 | 
					                        ),
 | 
				
			||||||
                        self.FieldWidget(
 | 
					                        self.FieldWidget(
 | 
				
			||||||
                            text='Pwd:', 
 | 
					                            text='Pwd:',
 | 
				
			||||||
                            attrDatabase='password', 
 | 
					                            attrDatabase='password',
 | 
				
			||||||
                            widget=gtk.Entry(), 
 | 
					                            widget=gtk.Entry(),
 | 
				
			||||||
                            defaultValue='',
 | 
					                            defaultValue='',
 | 
				
			||||||
                            attrGet='get_text', 
 | 
					                            attrGet='get_text',
 | 
				
			||||||
                            attrSet='set_text', 
 | 
					                            attrSet='set_text',
 | 
				
			||||||
                            canEdit=False, 
 | 
					                            canEdit=False,
 | 
				
			||||||
                            tooltip='Password used to login to the host'
 | 
					                            tooltip='Password used to login to the host'
 | 
				
			||||||
                        ),
 | 
					                        ),
 | 
				
			||||||
                        self.FieldWidget(
 | 
					                        self.FieldWidget(
 | 
				
			||||||
                            text='Db:', 
 | 
					                            text='Db:',
 | 
				
			||||||
                            attrDatabase='database', 
 | 
					                            attrDatabase='database',
 | 
				
			||||||
                            widget=gtk.Entry(), 
 | 
					                            widget=gtk.Entry(),
 | 
				
			||||||
                            defaultValue='',
 | 
					                            defaultValue='',
 | 
				
			||||||
                            attrGet='get_text', 
 | 
					                            attrGet='get_text',
 | 
				
			||||||
                            attrSet='set_text', 
 | 
					                            attrSet='set_text',
 | 
				
			||||||
                            canEdit=False,
 | 
					                            canEdit=False,
 | 
				
			||||||
                            tooltip='Name of the database'
 | 
					                            tooltip='Name of the database'
 | 
				
			||||||
                        ),
 | 
					                        ),
 | 
				
			||||||
                    )
 | 
					                    )
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
            # setup database type combo
 | 
					            # setup database type combo
 | 
				
			||||||
            self.comboType = gtk.ComboBox()
 | 
					            self.comboType = gtk.ComboBox()
 | 
				
			||||||
            listStore= gtk.ListStore(str, str)
 | 
					            listStore= gtk.ListStore(str, str)
 | 
				
			||||||
| 
						 | 
					@ -424,7 +424,7 @@ class WidgetDatabaseProperties(gtk.VBox):
 | 
				
			||||||
            self.comboType.pack_start(cell, True)
 | 
					            self.comboType.pack_start(cell, True)
 | 
				
			||||||
            self.comboType.add_attribute(cell, 'text', 0)
 | 
					            self.comboType.add_attribute(cell, 'text', 0)
 | 
				
			||||||
            self.comboType.connect('changed', self.on_combo_type_changed)
 | 
					            self.comboType.connect('changed', self.on_combo_type_changed)
 | 
				
			||||||
                    
 | 
					
 | 
				
			||||||
            # fill database type combo with available database klasses. we store (databaseDisplayName, databaseType) in our model for later lookup
 | 
					            # fill database type combo with available database klasses. we store (databaseDisplayName, databaseType) in our model for later lookup
 | 
				
			||||||
            iCurrentDatabase = 0
 | 
					            iCurrentDatabase = 0
 | 
				
			||||||
            databaseTypes = [(klass.display_name(), klass.Type) for klass in databaseManager.DatabaseTypes.values()]
 | 
					            databaseTypes = [(klass.display_name(), klass.Type) for klass in databaseManager.DatabaseTypes.values()]
 | 
				
			||||||
| 
						 | 
					@ -435,7 +435,7 @@ class WidgetDatabaseProperties(gtk.VBox):
 | 
				
			||||||
                    iCurrentDatabase = i
 | 
					                    iCurrentDatabase = i
 | 
				
			||||||
            if self.mode == self.ModeEdit or len(databaseTypes) < 2:
 | 
					            if self.mode == self.ModeEdit or len(databaseTypes) < 2:
 | 
				
			||||||
                self.comboType.set_button_sensitivity(gtk.SENSITIVITY_OFF)
 | 
					                self.comboType.set_button_sensitivity(gtk.SENSITIVITY_OFF)
 | 
				
			||||||
                
 | 
					
 | 
				
			||||||
            # init and layout field widgets
 | 
					            # init and layout field widgets
 | 
				
			||||||
            self.pack_start(self.comboType, False, False, 2)
 | 
					            self.pack_start(self.comboType, False, False, 2)
 | 
				
			||||||
            table = gtk.Table(rows=len(self.fieldWidgets) +1, columns=2, homogeneous=False)
 | 
					            table = gtk.Table(rows=len(self.fieldWidgets) +1, columns=2, homogeneous=False)
 | 
				
			||||||
| 
						 | 
					@ -443,11 +443,11 @@ class WidgetDatabaseProperties(gtk.VBox):
 | 
				
			||||||
            for i,fieldWidget in enumerate(self.fieldWidgets):
 | 
					            for i,fieldWidget in enumerate(self.fieldWidgets):
 | 
				
			||||||
                table.attach(fieldWidget.label(), 0, 1, i, i+1, xoptions=gtk.FILL)
 | 
					                table.attach(fieldWidget.label(), 0, 1, i, i+1, xoptions=gtk.FILL)
 | 
				
			||||||
                table.attach(fieldWidget.widget(), 1, 2, i, i+1)
 | 
					                table.attach(fieldWidget.widget(), 1, 2, i, i+1)
 | 
				
			||||||
                
 | 
					
 | 
				
			||||||
            # init widget
 | 
					            # init widget
 | 
				
			||||||
            self.comboType.set_active(iCurrentDatabase)
 | 
					            self.comboType.set_active(iCurrentDatabase)
 | 
				
			||||||
            self._adjust_widgets(self.database)
 | 
					            self._adjust_widgets(self.database)
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    def _adjust_widgets(self, database):
 | 
					    def _adjust_widgets(self, database):
 | 
				
			||||||
        for fieldWidget in self.fieldWidgets:
 | 
					        for fieldWidget in self.fieldWidgets:
 | 
				
			||||||
            isSensitive = fieldWidget.is_sensitive(database)
 | 
					            isSensitive = fieldWidget.is_sensitive(database)
 | 
				
			||||||
| 
						 | 
					@ -458,24 +458,24 @@ class WidgetDatabaseProperties(gtk.VBox):
 | 
				
			||||||
            if self.mode == self.ModeEdit:
 | 
					            if self.mode == self.ModeEdit:
 | 
				
			||||||
                isSensitive = isSensitive and fieldWidget.can_edit()
 | 
					                isSensitive = isSensitive and fieldWidget.can_edit()
 | 
				
			||||||
            fieldWidget.set_sensitive(isSensitive)
 | 
					            fieldWidget.set_sensitive(isSensitive)
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    def on_combo_type_changed(self, combo):
 | 
					    def on_combo_type_changed(self, combo):
 | 
				
			||||||
        i = self.comboType.get_active()
 | 
					        i = self.comboType.get_active()
 | 
				
			||||||
        if i < 0:
 | 
					        if i < 0:
 | 
				
			||||||
            return
 | 
					            return
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
        # check if we need to init a new database
 | 
					        # check if we need to init a new database
 | 
				
			||||||
        currentDatabaseType = self.comboType.get_model()[i][1]
 | 
					        currentDatabaseType = self.comboType.get_model()[i][1]
 | 
				
			||||||
        if currentDatabaseType == self.database.Type:
 | 
					        if currentDatabaseType == self.database.Type:
 | 
				
			||||||
            return
 | 
					            return
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
        # create new empty database
 | 
					        # create new empty database
 | 
				
			||||||
        #NOTE: we dont register it in DatabaseManager
 | 
					        #NOTE: we dont register it in DatabaseManager
 | 
				
			||||||
        self.database = self.databaseManager.DatabaseTypes[currentDatabaseType]()
 | 
					        self.database = self.databaseManager.DatabaseTypes[currentDatabaseType]()
 | 
				
			||||||
        self._adjust_widgets(self.database)
 | 
					        self._adjust_widgets(self.database)
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    def get_database(self):
 | 
					    def get_database(self):
 | 
				
			||||||
        for fieldWidget in self.fieldWidgets:
 | 
					        for fieldWidget in self.fieldWidgets:
 | 
				
			||||||
            if fieldWidget.is_sensitive(self.database):
 | 
					            if fieldWidget.is_sensitive(self.database):
 | 
				
			||||||
| 
						 | 
					@ -486,7 +486,7 @@ class WidgetDatabaseProperties(gtk.VBox):
 | 
				
			||||||
class DialogDatabaseProperties(gtk.Dialog):
 | 
					class DialogDatabaseProperties(gtk.Dialog):
 | 
				
			||||||
    def __init__(self, databaseManager, database, parent=None,  mode=WidgetDatabaseProperties.ModeEdit, title=''):
 | 
					    def __init__(self, databaseManager, database, parent=None,  mode=WidgetDatabaseProperties.ModeEdit, title=''):
 | 
				
			||||||
        gtk.Dialog.__init__(self,
 | 
					        gtk.Dialog.__init__(self,
 | 
				
			||||||
                title=title, 
 | 
					                title=title,
 | 
				
			||||||
                parent=parent,
 | 
					                parent=parent,
 | 
				
			||||||
                flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
 | 
					                flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
 | 
				
			||||||
                buttons=(
 | 
					                buttons=(
 | 
				
			||||||
| 
						 | 
					@ -495,7 +495,7 @@ class DialogDatabaseProperties(gtk.Dialog):
 | 
				
			||||||
                        )
 | 
					                        )
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
        self.connect('response', self.on_dialog_response)
 | 
					        self.connect('response', self.on_dialog_response)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        # setup widget
 | 
					        # setup widget
 | 
				
			||||||
        self.widgetDatabaseProperties = WidgetDatabaseProperties(databaseManager,database, mode=mode, parentWidget=self)
 | 
					        self.widgetDatabaseProperties = WidgetDatabaseProperties(databaseManager,database, mode=mode, parentWidget=self)
 | 
				
			||||||
        self.vbox.pack_start(self.widgetDatabaseProperties, True, True)
 | 
					        self.vbox.pack_start(self.widgetDatabaseProperties, True, True)
 | 
				
			||||||
| 
						 | 
					@ -503,23 +503,23 @@ class DialogDatabaseProperties(gtk.Dialog):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_widget_database_properties(self):
 | 
					    def get_widget_database_properties(self):
 | 
				
			||||||
        return self.widgetDatabaseProperties
 | 
					        return self.widgetDatabaseProperties
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    def on_dialog_response(self, dlg, responseId):
 | 
					    def on_dialog_response(self, dlg, responseId):
 | 
				
			||||||
        if responseId == gtk.RESPONSE_REJECT:
 | 
					        if responseId == gtk.RESPONSE_REJECT:
 | 
				
			||||||
            pass
 | 
					            pass
 | 
				
			||||||
        elif responseId == gtk.RESPONSE_ACCEPT:
 | 
					        elif responseId == gtk.RESPONSE_ACCEPT:
 | 
				
			||||||
            pass
 | 
					            pass
 | 
				
			||||||
            
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#TODO: derrive from gtk.VBox?    
 | 
					
 | 
				
			||||||
 | 
					#TODO: derrive from gtk.VBox?
 | 
				
			||||||
# ..is there a way to derrive from gtk.Widget or similar? this would make parentWidget kw obsolete
 | 
					# ..is there a way to derrive from gtk.Widget or similar? this would make parentWidget kw obsolete
 | 
				
			||||||
class WidgetDatabaseManager(gtk.VBox):
 | 
					class WidgetDatabaseManager(gtk.VBox):
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    def __init__(self, databaseManager, parentWidget=None):
 | 
					    def __init__(self, databaseManager, parentWidget=None):
 | 
				
			||||||
        gtk.VBox.__init__(self)
 | 
					        gtk.VBox.__init__(self)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        self.parentWidget = parentWidget
 | 
					        self.parentWidget = parentWidget
 | 
				
			||||||
        self.databaseManager = databaseManager
 | 
					        self.databaseManager = databaseManager
 | 
				
			||||||
        self.databaseManager.connect('database-activated', self.on_database_manager_database_activated)
 | 
					        self.databaseManager.connect('database-activated', self.on_database_manager_database_activated)
 | 
				
			||||||
| 
						 | 
					@ -529,17 +529,17 @@ class WidgetDatabaseManager(gtk.VBox):
 | 
				
			||||||
                DatabaseTypeBase.StatusInactive: 'Inactive',
 | 
					                DatabaseTypeBase.StatusInactive: 'Inactive',
 | 
				
			||||||
                DatabaseTypeBase.StatusError: 'Error',
 | 
					                DatabaseTypeBase.StatusError: 'Error',
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
        #TODO: dono how to make word wrap work as expected
 | 
					        #TODO: dono how to make word wrap work as expected
 | 
				
			||||||
        self.labelInfo = gtk.Label('database management')
 | 
					        self.labelInfo = gtk.Label('database management')
 | 
				
			||||||
        self.labelInfo.set_line_wrap(True)
 | 
					        self.labelInfo.set_line_wrap(True)
 | 
				
			||||||
        self.labelInfo.set_selectable(True)
 | 
					        self.labelInfo.set_selectable(True)
 | 
				
			||||||
        self.labelInfo.set_single_line_mode(False)
 | 
					        self.labelInfo.set_single_line_mode(False)
 | 
				
			||||||
        self.labelInfo.set_alignment(0, 0)
 | 
					        self.labelInfo.set_alignment(0, 0)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        # database management buttons
 | 
					        # database management buttons
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        #TODO: bit messy the distinction New/Add/Edit. we'd have to pass three flags to DialogDatabaseProperties
 | 
					        #TODO: bit messy the distinction New/Add/Edit. we'd have to pass three flags to DialogDatabaseProperties
 | 
				
			||||||
        # to handle this. maybe drop Edit (is just a Remove + Add), to keep things simple
 | 
					        # to handle this. maybe drop Edit (is just a Remove + Add), to keep things simple
 | 
				
			||||||
        self.buttonDatabaseActivate = gtk.Button("Activate")
 | 
					        self.buttonDatabaseActivate = gtk.Button("Activate")
 | 
				
			||||||
| 
						 | 
					@ -560,13 +560,13 @@ class WidgetDatabaseManager(gtk.VBox):
 | 
				
			||||||
        self.buttonDatabaseRemove.set_tooltip_text('removes the database from the list')
 | 
					        self.buttonDatabaseRemove.set_tooltip_text('removes the database from the list')
 | 
				
			||||||
        self.buttonDatabaseRemove.set_sensitive(False)
 | 
					        self.buttonDatabaseRemove.set_sensitive(False)
 | 
				
			||||||
        self.buttonDatabaseRemove.connect('clicked', self.on_button_database_remove_clicked)
 | 
					        self.buttonDatabaseRemove.connect('clicked', self.on_button_database_remove_clicked)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        #TODO: i dont think we should do any real database management here. maybe drop it
 | 
					        #TODO: i dont think we should do any real database management here. maybe drop it
 | 
				
			||||||
        #self.buttonDatabaseDelete = gtk.Button("Delete")
 | 
					        #self.buttonDatabaseDelete = gtk.Button("Delete")
 | 
				
			||||||
        #self.buttonDatabaseDelete.set_tooltip_text('removes the database from the list and deletes it')
 | 
					        #self.buttonDatabaseDelete.set_tooltip_text('removes the database from the list and deletes it')
 | 
				
			||||||
        #self.buttonDatabaseDelete.set_sensitive(False)
 | 
					        #self.buttonDatabaseDelete.set_sensitive(False)
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
        # init database tree        
 | 
					        # init database tree
 | 
				
			||||||
        self.treeDatabases = gtk.TreeView()
 | 
					        self.treeDatabases = gtk.TreeView()
 | 
				
			||||||
        treeDatabaseColumns = (    # name, displayName, dataType
 | 
					        treeDatabaseColumns = (    # name, displayName, dataType
 | 
				
			||||||
                ('name', 'Name', str),
 | 
					                ('name', 'Name', str),
 | 
				
			||||||
| 
						 | 
					@ -584,7 +584,7 @@ class WidgetDatabaseManager(gtk.VBox):
 | 
				
			||||||
                col.set_visible(False)
 | 
					                col.set_visible(False)
 | 
				
			||||||
            self.treeDatabaseColumns[name] = i
 | 
					            self.treeDatabaseColumns[name] = i
 | 
				
			||||||
        self.treeDatabases.get_selection().connect('changed', self.on_tree_databases_selection_changed)
 | 
					        self.treeDatabases.get_selection().connect('changed', self.on_tree_databases_selection_changed)
 | 
				
			||||||
                
 | 
					
 | 
				
			||||||
        # layout widgets
 | 
					        # layout widgets
 | 
				
			||||||
        vbox = gtk.VBox(self)
 | 
					        vbox = gtk.VBox(self)
 | 
				
			||||||
        vbox.pack_start(self.labelInfo, False, False, 2)
 | 
					        vbox.pack_start(self.labelInfo, False, False, 2)
 | 
				
			||||||
| 
						 | 
					@ -602,12 +602,12 @@ class WidgetDatabaseManager(gtk.VBox):
 | 
				
			||||||
        #vbox.pack_start(self.buttonDatabaseDelete, False, False, 2)
 | 
					        #vbox.pack_start(self.buttonDatabaseDelete, False, False, 2)
 | 
				
			||||||
        box = gtk.VBox()
 | 
					        box = gtk.VBox()
 | 
				
			||||||
        vbox.pack_start(box, True, True, 0)
 | 
					        vbox.pack_start(box, True, True, 0)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        hbox.pack_start(gtk.VSeparator(), False, False, 2)
 | 
					        hbox.pack_start(gtk.VSeparator(), False, False, 2)
 | 
				
			||||||
        hbox.pack_end(self.treeDatabases, True, True, 2)
 | 
					        hbox.pack_end(self.treeDatabases, True, True, 2)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        self.show_all()
 | 
					        self.show_all()
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        # init widget
 | 
					        # init widget
 | 
				
			||||||
        model = self.treeDatabases.get_model()
 | 
					        model = self.treeDatabases.get_model()
 | 
				
			||||||
        for database in self.databaseManager:
 | 
					        for database in self.databaseManager:
 | 
				
			||||||
| 
						 | 
					@ -616,8 +616,8 @@ class WidgetDatabaseManager(gtk.VBox):
 | 
				
			||||||
            model.set_value(it, self.treeDatabaseColumns['status'], self.databaseStatusNames[database.status] )
 | 
					            model.set_value(it, self.treeDatabaseColumns['status'], self.databaseStatusNames[database.status] )
 | 
				
			||||||
            model.set_value(it, self.treeDatabaseColumns['type'], database.display_name() )
 | 
					            model.set_value(it, self.treeDatabaseColumns['type'], database.display_name() )
 | 
				
			||||||
            model.set_value(it, self.treeDatabaseColumns['_id'], self.databaseManager.database_id(database))
 | 
					            model.set_value(it, self.treeDatabaseColumns['_id'], self.databaseManager.database_id(database))
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    def on_database_manager_database_activated(self, databaseManager, idDatabase):
 | 
					    def on_database_manager_database_activated(self, databaseManager, idDatabase):
 | 
				
			||||||
        database = self.databaseManager.database_from_id(idDatabase)
 | 
					        database = self.databaseManager.database_from_id(idDatabase)
 | 
				
			||||||
        model = self.treeDatabases.get_model()
 | 
					        model = self.treeDatabases.get_model()
 | 
				
			||||||
| 
						 | 
					@ -627,8 +627,8 @@ class WidgetDatabaseManager(gtk.VBox):
 | 
				
			||||||
                break
 | 
					                break
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            raise ValueError('database not found')
 | 
					            raise ValueError('database not found')
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    def on_database_manager_database_deactivated(self, databaseManager, idDatabase):
 | 
					    def on_database_manager_database_deactivated(self, databaseManager, idDatabase):
 | 
				
			||||||
        database = self.databaseManager.database_from_id(idDatabase)
 | 
					        database = self.databaseManager.database_from_id(idDatabase)
 | 
				
			||||||
        model = self.treeDatabases.get_model()
 | 
					        model = self.treeDatabases.get_model()
 | 
				
			||||||
| 
						 | 
					@ -638,31 +638,31 @@ class WidgetDatabaseManager(gtk.VBox):
 | 
				
			||||||
                break
 | 
					                break
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            raise ValueError('database not found')
 | 
					            raise ValueError('database not found')
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    def on_button_database_activate_clicked(self, button):
 | 
					    def on_button_database_activate_clicked(self, button):
 | 
				
			||||||
        selection = self.treeDatabases.get_selection()
 | 
					        selection = self.treeDatabases.get_selection()
 | 
				
			||||||
        if selection is None:
 | 
					        if selection is None:
 | 
				
			||||||
                return
 | 
					                return
 | 
				
			||||||
                
 | 
					
 | 
				
			||||||
        model, it = selection.get_selected()
 | 
					        model, it = selection.get_selected()
 | 
				
			||||||
        idDatabase = model.get_value(it, self.treeDatabaseColumns['_id'])
 | 
					        idDatabase = model.get_value(it, self.treeDatabaseColumns['_id'])
 | 
				
			||||||
        database = self.databaseManager.database_from_id(idDatabase)
 | 
					        database = self.databaseManager.database_from_id(idDatabase)
 | 
				
			||||||
        self.databaseManager.activate_database(database)
 | 
					        self.databaseManager.activate_database(database)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    #TODO: for some reason i have to click OK/Cancel twice to close the dialog        
 | 
					    #TODO: for some reason i have to click OK/Cancel twice to close the dialog
 | 
				
			||||||
    def on_button_database_new_clicked(self, button):
 | 
					    def on_button_database_new_clicked(self, button):
 | 
				
			||||||
        databaseKlass = self.databaseManager.get_default_database_type()
 | 
					        databaseKlass = self.databaseManager.get_default_database_type()
 | 
				
			||||||
        if databaseKlass is None:
 | 
					        if databaseKlass is None:
 | 
				
			||||||
            raise ValueError('no default database type set')
 | 
					            raise ValueError('no default database type set')
 | 
				
			||||||
        database = databaseKlass()
 | 
					        database = databaseKlass()
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        while True:
 | 
					        while True:
 | 
				
			||||||
            dlg = DialogDatabaseProperties(
 | 
					            dlg = DialogDatabaseProperties(
 | 
				
			||||||
                    self.databaseManager, 
 | 
					                    self.databaseManager,
 | 
				
			||||||
                    database, 
 | 
					                    database,
 | 
				
			||||||
                    parent=self.parentWidget, 
 | 
					                    parent=self.parentWidget,
 | 
				
			||||||
                    mode=WidgetDatabaseProperties.ModeNew,
 | 
					                    mode=WidgetDatabaseProperties.ModeNew,
 | 
				
			||||||
                    title='New database'
 | 
					                    title='New database'
 | 
				
			||||||
                    )
 | 
					                    )
 | 
				
			||||||
| 
						 | 
					@ -679,11 +679,11 @@ class WidgetDatabaseManager(gtk.VBox):
 | 
				
			||||||
                database = None
 | 
					                database = None
 | 
				
			||||||
            dlg.destroy()
 | 
					            dlg.destroy()
 | 
				
			||||||
            break
 | 
					            break
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
                        
 | 
					
 | 
				
			||||||
            if database is None:
 | 
					            if database is None:
 | 
				
			||||||
                return
 | 
					                return
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
            self.databaseManager.add_database(database)
 | 
					            self.databaseManager.add_database(database)
 | 
				
			||||||
            model = self.treeDatabases.get_model()
 | 
					            model = self.treeDatabases.get_model()
 | 
				
			||||||
            it = model.append()
 | 
					            it = model.append()
 | 
				
			||||||
| 
						 | 
					@ -691,19 +691,19 @@ class WidgetDatabaseManager(gtk.VBox):
 | 
				
			||||||
            model.set_value(it, self.treeDatabaseColumns['status'], self.databaseStatusNames[database.status] )
 | 
					            model.set_value(it, self.treeDatabaseColumns['status'], self.databaseStatusNames[database.status] )
 | 
				
			||||||
            model.set_value(it, self.treeDatabaseColumns['type'], database.display_name() )
 | 
					            model.set_value(it, self.treeDatabaseColumns['type'], database.display_name() )
 | 
				
			||||||
            model.set_value(it, self.treeDatabaseColumns['_id'], self.databaseManager.database_id(database))
 | 
					            model.set_value(it, self.treeDatabaseColumns['_id'], self.databaseManager.database_id(database))
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    def on_button_database_add_clicked(self, button):
 | 
					    def on_button_database_add_clicked(self, button):
 | 
				
			||||||
        databaseKlass = self.databaseManager.get_default_database_type()
 | 
					        databaseKlass = self.databaseManager.get_default_database_type()
 | 
				
			||||||
        if databaseKlass is None:
 | 
					        if databaseKlass is None:
 | 
				
			||||||
            raise ValueError('no defult database type set')
 | 
					            raise ValueError('no defult database type set')
 | 
				
			||||||
        database = databaseKlass()
 | 
					        database = databaseKlass()
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        while True:
 | 
					        while True:
 | 
				
			||||||
            dlg = DialogDatabaseProperties(
 | 
					            dlg = DialogDatabaseProperties(
 | 
				
			||||||
                    self.databaseManager, 
 | 
					                    self.databaseManager,
 | 
				
			||||||
                    database, 
 | 
					                    database,
 | 
				
			||||||
                    parent=self.parentWidget, 
 | 
					                    parent=self.parentWidget,
 | 
				
			||||||
                    mode=WidgetDatabaseProperties.ModeAdd,
 | 
					                    mode=WidgetDatabaseProperties.ModeAdd,
 | 
				
			||||||
                    title='Add database'
 | 
					                    title='Add database'
 | 
				
			||||||
                    )
 | 
					                    )
 | 
				
			||||||
| 
						 | 
					@ -719,11 +719,11 @@ class WidgetDatabaseManager(gtk.VBox):
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                database = None
 | 
					                database = None
 | 
				
			||||||
            dlg.destroy()
 | 
					            dlg.destroy()
 | 
				
			||||||
            break    
 | 
					            break
 | 
				
			||||||
                        
 | 
					
 | 
				
			||||||
            if database is None:
 | 
					            if database is None:
 | 
				
			||||||
                return
 | 
					                return
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
            self.databaseManager.add_database(database)
 | 
					            self.databaseManager.add_database(database)
 | 
				
			||||||
            model = self.treeDatabases.get_model()
 | 
					            model = self.treeDatabases.get_model()
 | 
				
			||||||
            it = model.append()
 | 
					            it = model.append()
 | 
				
			||||||
| 
						 | 
					@ -732,20 +732,20 @@ class WidgetDatabaseManager(gtk.VBox):
 | 
				
			||||||
            model.set_value(it, self.treeDatabaseColumns['type'], database.display_name() )
 | 
					            model.set_value(it, self.treeDatabaseColumns['type'], database.display_name() )
 | 
				
			||||||
            model.set_value(it, self.treeDatabaseColumns['_id'], self.databaseManager.database_id(database))
 | 
					            model.set_value(it, self.treeDatabaseColumns['_id'], self.databaseManager.database_id(database))
 | 
				
			||||||
        dlg.destroy()
 | 
					        dlg.destroy()
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
    def on_button_database_edit_clicked(self, button):
 | 
					    def on_button_database_edit_clicked(self, button):
 | 
				
			||||||
        selection = self.treeDatabases.get_selection()
 | 
					        selection = self.treeDatabases.get_selection()
 | 
				
			||||||
        if selection is None:
 | 
					        if selection is None:
 | 
				
			||||||
                return
 | 
					                return
 | 
				
			||||||
                
 | 
					
 | 
				
			||||||
        model, it = selection.get_selected()
 | 
					        model, it = selection.get_selected()
 | 
				
			||||||
        idDatabase = model.get_value(it, self.treeDatabaseColumns['_id'])
 | 
					        idDatabase = model.get_value(it, self.treeDatabaseColumns['_id'])
 | 
				
			||||||
        database = self.databaseManager.database_from_id(idDatabase)
 | 
					        database = self.databaseManager.database_from_id(idDatabase)
 | 
				
			||||||
        dlg = DialogDatabaseProperties(
 | 
					        dlg = DialogDatabaseProperties(
 | 
				
			||||||
                self.databaseManager, 
 | 
					                self.databaseManager,
 | 
				
			||||||
                database, 
 | 
					                database,
 | 
				
			||||||
                parent=self.parentWidget, 
 | 
					                parent=self.parentWidget,
 | 
				
			||||||
                mode=WidgetDatabaseProperties.ModeEdit, 
 | 
					                mode=WidgetDatabaseProperties.ModeEdit,
 | 
				
			||||||
                title='Edit database'
 | 
					                title='Edit database'
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
        response = dlg.run()
 | 
					        response = dlg.run()
 | 
				
			||||||
| 
						 | 
					@ -759,31 +759,31 @@ class WidgetDatabaseManager(gtk.VBox):
 | 
				
			||||||
                model.set_value(it, self.treeDatabaseColumns['name'], database.name)
 | 
					                model.set_value(it, self.treeDatabaseColumns['name'], database.name)
 | 
				
			||||||
        dlg.destroy()
 | 
					        dlg.destroy()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    def on_button_database_remove_clicked(self, button):
 | 
					    def on_button_database_remove_clicked(self, button):
 | 
				
			||||||
        selection = self.treeDatabases.get_selection()
 | 
					        selection = self.treeDatabases.get_selection()
 | 
				
			||||||
        if selection is None:
 | 
					        if selection is None:
 | 
				
			||||||
                return
 | 
					                return
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        model, it = selection.get_selected()
 | 
					        model, it = selection.get_selected()
 | 
				
			||||||
        #TODO: finalize database
 | 
					        #TODO: finalize database
 | 
				
			||||||
        model.remove(it)
 | 
					        model.remove(it)
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    def on_tree_databases_selection_changed(self, treeSelection):
 | 
					    def on_tree_databases_selection_changed(self, treeSelection):
 | 
				
			||||||
        hasSelection = bool(treeSelection.count_selected_rows())
 | 
					        hasSelection = bool(treeSelection.count_selected_rows())
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        # enable/disable selection dependend widgets
 | 
					        # enable/disable selection dependend widgets
 | 
				
			||||||
        self.buttonDatabaseActivate.set_sensitive(hasSelection)
 | 
					        self.buttonDatabaseActivate.set_sensitive(hasSelection)
 | 
				
			||||||
        self.buttonDatabaseEdit.set_sensitive(hasSelection)
 | 
					        self.buttonDatabaseEdit.set_sensitive(hasSelection)
 | 
				
			||||||
        self.buttonDatabaseRemove.set_sensitive(hasSelection)
 | 
					        self.buttonDatabaseRemove.set_sensitive(hasSelection)
 | 
				
			||||||
        #self.buttonDatabaseDelete.set_sensitive(hasSelection)
 | 
					        #self.buttonDatabaseDelete.set_sensitive(hasSelection)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class DialogDatabaseManager(gtk.Dialog):
 | 
					class DialogDatabaseManager(gtk.Dialog):
 | 
				
			||||||
    def __init__(self, databaseManager, parent=None):
 | 
					    def __init__(self, databaseManager, parent=None):
 | 
				
			||||||
        gtk.Dialog.__init__(self,
 | 
					        gtk.Dialog.__init__(self,
 | 
				
			||||||
        title="Databases", 
 | 
					        title="Databases",
 | 
				
			||||||
                parent=parent,
 | 
					                parent=parent,
 | 
				
			||||||
                flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
 | 
					                flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
 | 
				
			||||||
                buttons=(
 | 
					                buttons=(
 | 
				
			||||||
| 
						 | 
					@ -794,11 +794,11 @@ class DialogDatabaseManager(gtk.Dialog):
 | 
				
			||||||
        self.widgetDatabaseManager = WidgetDatabaseManager(databaseManager, parentWidget=self)
 | 
					        self.widgetDatabaseManager = WidgetDatabaseManager(databaseManager, parentWidget=self)
 | 
				
			||||||
        self.vbox.pack_start(self.widgetDatabaseManager, True, True)
 | 
					        self.vbox.pack_start(self.widgetDatabaseManager, True, True)
 | 
				
			||||||
        self.show_all()
 | 
					        self.show_all()
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
#**************************************************************************************************
 | 
					#**************************************************************************************************
 | 
				
			||||||
if __name__ == '__main__':
 | 
					if __name__ == '__main__':
 | 
				
			||||||
    databaseManager = DatabaseManager.from_fpdb('', defaultDatabaseType=DatabaseTypeSqLite)
 | 
					    databaseManager = DatabaseManager.from_fpdb('', defaultDatabaseType=DatabaseTypeSqLite)
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    #d = DialogDatabaseProperties(
 | 
					    #d = DialogDatabaseProperties(
 | 
				
			||||||
    #        DatabaseManager(defaultDatabaseType=DatabaseTypeSqLite),
 | 
					    #        DatabaseManager(defaultDatabaseType=DatabaseTypeSqLite),
 | 
				
			||||||
            #database=DatabaseTypePostgres(),
 | 
					            #database=DatabaseTypePostgres(),
 | 
				
			||||||
| 
						 | 
					@ -808,5 +808,3 @@ if __name__ == '__main__':
 | 
				
			||||||
    d.connect("destroy", gtk.main_quit)
 | 
					    d.connect("destroy", gtk.main_quit)
 | 
				
			||||||
    d.run()
 | 
					    d.run()
 | 
				
			||||||
    #gtk.main()
 | 
					    #gtk.main()
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,7 +18,7 @@
 | 
				
			||||||
#fpdb modules
 | 
					#fpdb modules
 | 
				
			||||||
import Card
 | 
					import Card
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DEBUG = True
 | 
					DEBUG = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if DEBUG:
 | 
					if DEBUG:
 | 
				
			||||||
    import pprint
 | 
					    import pprint
 | 
				
			||||||
| 
						 | 
					@ -39,12 +39,24 @@ class DerivedStats():
 | 
				
			||||||
            #Init vars that may not be used, but still need to be inserted.
 | 
					            #Init vars that may not be used, but still need to be inserted.
 | 
				
			||||||
            # All stud street4 need this when importing holdem
 | 
					            # All stud street4 need this when importing holdem
 | 
				
			||||||
            self.handsplayers[player[1]]['winnings']    = 0
 | 
					            self.handsplayers[player[1]]['winnings']    = 0
 | 
				
			||||||
 | 
					            self.handsplayers[player[1]]['rake']        = 0
 | 
				
			||||||
 | 
					            self.handsplayers[player[1]]['totalProfit'] = 0
 | 
				
			||||||
            self.handsplayers[player[1]]['street4Seen'] = False
 | 
					            self.handsplayers[player[1]]['street4Seen'] = False
 | 
				
			||||||
            self.handsplayers[player[1]]['street4Aggr'] = False
 | 
					            self.handsplayers[player[1]]['street4Aggr'] = False
 | 
				
			||||||
 | 
					            self.handsplayers[player[1]]['wonWhenSeenStreet1'] = False
 | 
				
			||||||
 | 
					            self.handsplayers[player[1]]['sawShowdown'] = False
 | 
				
			||||||
 | 
					            self.handsplayers[player[1]]['wonAtSD']     = False
 | 
				
			||||||
 | 
					            for i in range(5): 
 | 
				
			||||||
 | 
					                self.handsplayers[player[1]]['street%dCalls' % i] = 0
 | 
				
			||||||
 | 
					                self.handsplayers[player[1]]['street%dBets' % i] = 0
 | 
				
			||||||
 | 
					            for i in range(1,5):
 | 
				
			||||||
 | 
					                self.handsplayers[player[1]]['street%dCBChance' %i] = False
 | 
				
			||||||
 | 
					                self.handsplayers[player[1]]['street%dCBDone' %i] = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.assembleHands(self.hand)
 | 
					        self.assembleHands(self.hand)
 | 
				
			||||||
        self.assembleHandsPlayers(self.hand)
 | 
					        self.assembleHandsPlayers(self.hand)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if DEBUG:
 | 
					        if DEBUG:
 | 
				
			||||||
            print "Hands:"
 | 
					            print "Hands:"
 | 
				
			||||||
            pp.pprint(self.hands)
 | 
					            pp.pprint(self.hands)
 | 
				
			||||||
| 
						 | 
					@ -95,33 +107,56 @@ class DerivedStats():
 | 
				
			||||||
        #print "DEBUG: playersAtStreet 1:'%s' 2:'%s' 3:'%s' 4:'%s'" %(self.hands['playersAtStreet1'],self.hands['playersAtStreet2'],self.hands['playersAtStreet3'],self.hands['playersAtStreet4'])
 | 
					        #print "DEBUG: playersAtStreet 1:'%s' 2:'%s' 3:'%s' 4:'%s'" %(self.hands['playersAtStreet1'],self.hands['playersAtStreet2'],self.hands['playersAtStreet3'],self.hands['playersAtStreet4'])
 | 
				
			||||||
        self.streetXRaises(hand) # Empty function currently
 | 
					        self.streetXRaises(hand) # Empty function currently
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # comment TEXT,
 | 
					 | 
				
			||||||
        # commentTs DATETIME
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def assembleHandsPlayers(self, hand):
 | 
					    def assembleHandsPlayers(self, hand):
 | 
				
			||||||
        #street0VPI/vpip already called in Hand
 | 
					        #street0VPI/vpip already called in Hand
 | 
				
			||||||
 | 
					        # sawShowdown is calculated in playersAtStreetX, as that calculation gives us a convenient list of names
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #hand.players = [[seat, name, chips],[seat, name, chips]]
 | 
					        #hand.players = [[seat, name, chips],[seat, name, chips]]
 | 
				
			||||||
        for player in hand.players:
 | 
					        for player in hand.players:
 | 
				
			||||||
            self.handsplayers[player[1]]['seatNo'] = player[0]
 | 
					            self.handsplayers[player[1]]['seatNo'] = player[0]
 | 
				
			||||||
            self.handsplayers[player[1]]['startCash'] = player[2]
 | 
					            self.handsplayers[player[1]]['startCash'] = player[2]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Winnings is a non-negative value of money collected from the pot, which already includes the
 | 
					 | 
				
			||||||
        # rake taken out. hand.collectees is Decimal, database requires cents
 | 
					 | 
				
			||||||
        for player in hand.collectees:
 | 
					 | 
				
			||||||
            self.handsplayers[player]['winnings'] = int(100 * hand.collectees[player])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for i, street in enumerate(hand.actionStreets[2:]):
 | 
					        for i, street in enumerate(hand.actionStreets[2:]):
 | 
				
			||||||
            self.seen(self.hand, i+1)
 | 
					            self.seen(self.hand, i+1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for i, street in enumerate(hand.actionStreets[1:]):
 | 
					        for i, street in enumerate(hand.actionStreets[1:]):
 | 
				
			||||||
            self.aggr(self.hand, i)
 | 
					            self.aggr(self.hand, i)
 | 
				
			||||||
 | 
					            self.calls(self.hand, i)
 | 
				
			||||||
 | 
					            self.bets(self.hand, i)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        default_holecards = ["Xx", "Xx", "Xx", "Xx"]
 | 
					        # Winnings is a non-negative value of money collected from the pot, which already includes the
 | 
				
			||||||
 | 
					        # rake taken out. hand.collectees is Decimal, database requires cents
 | 
				
			||||||
 | 
					        for player in hand.collectees:
 | 
				
			||||||
 | 
					            self.handsplayers[player]['winnings'] = int(100 * hand.collectees[player])
 | 
				
			||||||
 | 
					            #FIXME: This is pretty dodgy, rake = hand.rake/#collectees
 | 
				
			||||||
 | 
					            # You can really only pay rake when you collect money, but
 | 
				
			||||||
 | 
					            # different sites calculate rake differently.
 | 
				
			||||||
 | 
					            # Should be fine for split-pots, but won't be accurate for multi-way pots
 | 
				
			||||||
 | 
					            self.handsplayers[player]['rake'] = int(100* hand.rake)/len(hand.collectees)
 | 
				
			||||||
 | 
					            if self.handsplayers[player]['street1Seen'] == True:
 | 
				
			||||||
 | 
					                self.handsplayers[player]['wonWhenSeenStreet1'] = True
 | 
				
			||||||
 | 
					            if self.handsplayers[player]['sawShowdown'] == True:
 | 
				
			||||||
 | 
					                self.handsplayers[player]['wonAtSD'] = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for player in hand.pot.committed:
 | 
				
			||||||
 | 
					            self.handsplayers[player]['totalProfit'] = int(self.handsplayers[player]['winnings'] - (100*hand.pot.committed[player]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.calcCBets(hand)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        #default_holecards = ["Xx", "Xx", "Xx", "Xx"]
 | 
				
			||||||
 | 
					        #if hand.gametype['base'] == "hold":
 | 
				
			||||||
 | 
					        #    pass
 | 
				
			||||||
 | 
					        #elif hand.gametype['base'] == "stud":
 | 
				
			||||||
 | 
					        #    pass
 | 
				
			||||||
 | 
					        #else:
 | 
				
			||||||
 | 
					        #    # Flop hopefully...
 | 
				
			||||||
 | 
					        #    pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for street in hand.holeStreets:
 | 
					        for street in hand.holeStreets:
 | 
				
			||||||
            for player in hand.players:
 | 
					            for player in hand.players:
 | 
				
			||||||
                for i in range(1,8): self.handsplayers[player[1]]['card%d' % i] = 0
 | 
					                for i in range(1,8): self.handsplayers[player[1]]['card%d' % i] = 0
 | 
				
			||||||
                if player[1] in hand.holecards[street].keys():
 | 
					                #print "DEBUG: hand.holecards[%s]: %s" % (street, hand.holecards[street])
 | 
				
			||||||
 | 
					                if player[1] in hand.holecards[street].keys() and hand.gametype['base'] == "hold":
 | 
				
			||||||
                    self.handsplayers[player[1]]['card1'] = Card.encodeCard(hand.holecards[street][player[1]][1][0])
 | 
					                    self.handsplayers[player[1]]['card1'] = Card.encodeCard(hand.holecards[street][player[1]][1][0])
 | 
				
			||||||
                    self.handsplayers[player[1]]['card2'] = Card.encodeCard(hand.holecards[street][player[1]][1][1])
 | 
					                    self.handsplayers[player[1]]['card2'] = Card.encodeCard(hand.holecards[street][player[1]][1][1])
 | 
				
			||||||
                    try:
 | 
					                    try:
 | 
				
			||||||
| 
						 | 
					@ -174,7 +209,11 @@ class DerivedStats():
 | 
				
			||||||
            self.hands['playersAtStreet%d' % (i+1)] = len(set.union(alliners, actors))
 | 
					            self.hands['playersAtStreet%d' % (i+1)] = len(set.union(alliners, actors))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        actions = hand.actions[hand.actionStreets[-1]]
 | 
					        actions = hand.actions[hand.actionStreets[-1]]
 | 
				
			||||||
        self.hands['playersAtShowdown'] = len(set.union(self.pfba(actions) - self.pfba(actions, l=('folds',)),  alliners))
 | 
					        pas = set.union(self.pfba(actions) - self.pfba(actions, l=('folds',)),  alliners)
 | 
				
			||||||
 | 
					        self.hands['playersAtShowdown'] = len(pas)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for player in pas:
 | 
				
			||||||
 | 
					            self.handsplayers[player]['sawShowdown'] = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def streetXRaises(self, hand):
 | 
					    def streetXRaises(self, hand):
 | 
				
			||||||
        # self.actions[street] is a list of all actions in a tuple, contining the action as the second element
 | 
					        # self.actions[street] is a list of all actions in a tuple, contining the action as the second element
 | 
				
			||||||
| 
						 | 
					@ -188,6 +227,20 @@ class DerivedStats():
 | 
				
			||||||
        for (i, street) in enumerate(hand.actionStreets[1:]):
 | 
					        for (i, street) in enumerate(hand.actionStreets[1:]):
 | 
				
			||||||
            self.hands['street%dRaises' % i] = len(filter( lambda action: action[1] in ('raises','bets'), hand.actions[street]))
 | 
					            self.hands['street%dRaises' % i] = len(filter( lambda action: action[1] in ('raises','bets'), hand.actions[street]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def calcCBets(self, hand):
 | 
				
			||||||
 | 
					        # Continuation Bet chance, action:
 | 
				
			||||||
 | 
					        # Had the last bet (initiative) on previous street, got called, close street action
 | 
				
			||||||
 | 
					        #   Then no bets before the player with initiatives first action on current street
 | 
				
			||||||
 | 
					        # ie. if player on street-1 had initiative
 | 
				
			||||||
 | 
					        #                and no donkbets occurred
 | 
				
			||||||
 | 
					        for i, street in enumerate(hand.actionStreets[2:], start=1):
 | 
				
			||||||
 | 
					            name = self.lastBetOrRaiser(hand.actionStreets[i])
 | 
				
			||||||
 | 
					            if name:
 | 
				
			||||||
 | 
					                chance = self.noBetsBefore(hand.actionStreets[i+1], name)
 | 
				
			||||||
 | 
					                self.handsplayers[name]['street%dCBChance' %i] = True
 | 
				
			||||||
 | 
					                if chance == True:
 | 
				
			||||||
 | 
					                    self.handsplayers[name]['street%dCBDone' %i] = self.betStreet(hand.actionStreets[i+1], name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def seen(self, hand, i):
 | 
					    def seen(self, hand, i):
 | 
				
			||||||
        pas = set()
 | 
					        pas = set()
 | 
				
			||||||
        for act in hand.actions[hand.actionStreets[i+1]]:
 | 
					        for act in hand.actions[hand.actionStreets[i+1]]:
 | 
				
			||||||
| 
						 | 
					@ -211,6 +264,20 @@ class DerivedStats():
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                self.handsplayers[player[1]]['street%sAggr' % i] = False
 | 
					                self.handsplayers[player[1]]['street%sAggr' % i] = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def calls(self, hand, i):
 | 
				
			||||||
 | 
					        callers = []
 | 
				
			||||||
 | 
					        for act in hand.actions[hand.actionStreets[i+1]]:
 | 
				
			||||||
 | 
					            if act[1] in ('calls'):
 | 
				
			||||||
 | 
					                self.handsplayers[act[0]]['street%sCalls' % i] = 1 + self.handsplayers[act[0]]['street%sCalls' % i]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # CG - I'm sure this stat is wrong
 | 
				
			||||||
 | 
					    # Best guess is that raise = 2 bets
 | 
				
			||||||
 | 
					    def bets(self, hand, i):
 | 
				
			||||||
 | 
					        betters = []
 | 
				
			||||||
 | 
					        for act in hand.actions[hand.actionStreets[i+1]]:
 | 
				
			||||||
 | 
					            if act[1] in ('bets'):
 | 
				
			||||||
 | 
					                self.handsplayers[act[0]]['street%sBets' % i] = 1 + self.handsplayers[act[0]]['street%sBets' % i]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def countPlayers(self, hand):
 | 
					    def countPlayers(self, hand):
 | 
				
			||||||
        pass
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -226,3 +293,35 @@ class DerivedStats():
 | 
				
			||||||
            if f is not None and action[1] in f: continue
 | 
					            if f is not None and action[1] in f: continue
 | 
				
			||||||
            players.add(action[0])
 | 
					            players.add(action[0])
 | 
				
			||||||
        return players
 | 
					        return players
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def noBetsBefore(self, street, player):
 | 
				
			||||||
 | 
					        """Returns true if there were no bets before the specified players turn, false otherwise"""
 | 
				
			||||||
 | 
					        betOrRaise = False
 | 
				
			||||||
 | 
					        for act in self.hand.actions[street]:
 | 
				
			||||||
 | 
					            #Must test for player first in case UTG
 | 
				
			||||||
 | 
					            if act[0] == player:
 | 
				
			||||||
 | 
					                betOrRaise = True
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					            if act[1] in ('bets', 'raises'):
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					        return betOrRaise
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def betStreet(self, street, player):
 | 
				
			||||||
 | 
					        """Returns true if player bet/raised the street as their first action"""
 | 
				
			||||||
 | 
					        betOrRaise = False
 | 
				
			||||||
 | 
					        for act in self.hand.actions[street]:
 | 
				
			||||||
 | 
					            if act[0] == player and act[1] in ('bets', 'raises'):
 | 
				
			||||||
 | 
					                betOrRaise = True
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					        return betOrRaise
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def lastBetOrRaiser(self, street):
 | 
				
			||||||
 | 
					        """Returns player name that placed the last bet or raise for that street.
 | 
				
			||||||
 | 
					            None if there were no bets or raises on that street"""
 | 
				
			||||||
 | 
					        lastbet = None
 | 
				
			||||||
 | 
					        for act in self.hand.actions[street]:
 | 
				
			||||||
 | 
					            if act[1] in ('bets', 'raises'):
 | 
				
			||||||
 | 
					                lastbet = act[0]
 | 
				
			||||||
 | 
					        return lastbet
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,5 +27,12 @@ class FpdbMySQLAccessDenied(FpdbDatabaseError):
 | 
				
			||||||
    def __str__(self):
 | 
					    def __str__(self):
 | 
				
			||||||
        return repr(self.value +" " + self.errmsg)
 | 
					        return repr(self.value +" " + self.errmsg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class FpdbMySQLNoDatabase(FpdbDatabaseError):
 | 
				
			||||||
 | 
					    def __init__(self, value='', errmsg=''):
 | 
				
			||||||
 | 
					        self.value = value
 | 
				
			||||||
 | 
					        self.errmsg = errmsg
 | 
				
			||||||
 | 
					    def __str__(self):
 | 
				
			||||||
 | 
					        return repr(self.value +" " + self.errmsg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class DuplicateError(FpdbError):
 | 
					class DuplicateError(FpdbError):
 | 
				
			||||||
    pass
 | 
					    pass
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -69,7 +69,7 @@ class Filters(threading.Thread):
 | 
				
			||||||
        self.sbGroups = {}
 | 
					        self.sbGroups = {}
 | 
				
			||||||
        self.numHands = 0
 | 
					        self.numHands = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Outer Packing box        
 | 
					        # Outer Packing box
 | 
				
			||||||
        self.mainVBox = gtk.VBox(False, 0)
 | 
					        self.mainVBox = gtk.VBox(False, 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        playerFrame = gtk.Frame("Hero:")
 | 
					        playerFrame = gtk.Frame("Hero:")
 | 
				
			||||||
| 
						 | 
					@ -312,9 +312,11 @@ class Filters(threading.Thread):
 | 
				
			||||||
                    self.cbAllLimits.set_active(False)
 | 
					                    self.cbAllLimits.set_active(False)
 | 
				
			||||||
            if not self.limits[limit]:
 | 
					            if not self.limits[limit]:
 | 
				
			||||||
                if limit.isdigit():
 | 
					                if limit.isdigit():
 | 
				
			||||||
                    self.cbFL.set_active(False)
 | 
					                    if self.cbFl is not None:
 | 
				
			||||||
 | 
					                        self.cbFl.set_active(False)
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
                    self.cbNL.set_active(False)
 | 
					                    if self.cbNL is not None:
 | 
				
			||||||
 | 
					                        self.cbNL.set_active(False)
 | 
				
			||||||
        elif limit == "all":
 | 
					        elif limit == "all":
 | 
				
			||||||
            if self.limits[limit]:
 | 
					            if self.limits[limit]:
 | 
				
			||||||
                #for cb in self.cbLimits.values():
 | 
					                #for cb in self.cbLimits.values():
 | 
				
			||||||
| 
						 | 
					@ -332,7 +334,7 @@ class Filters(threading.Thread):
 | 
				
			||||||
        elif limit == "fl":
 | 
					        elif limit == "fl":
 | 
				
			||||||
            if not self.limits[limit]:
 | 
					            if not self.limits[limit]:
 | 
				
			||||||
                # only toggle all fl limits off if they are all currently on
 | 
					                # only toggle all fl limits off if they are all currently on
 | 
				
			||||||
                # this stops turning one off from cascading into 'fl' box off 
 | 
					                # this stops turning one off from cascading into 'fl' box off
 | 
				
			||||||
                # and then all fl limits being turned off
 | 
					                # and then all fl limits being turned off
 | 
				
			||||||
                all_fl_on = True
 | 
					                all_fl_on = True
 | 
				
			||||||
                for cb in self.cbLimits.values():
 | 
					                for cb in self.cbLimits.values():
 | 
				
			||||||
| 
						 | 
					@ -359,7 +361,7 @@ class Filters(threading.Thread):
 | 
				
			||||||
        elif limit == "nl":
 | 
					        elif limit == "nl":
 | 
				
			||||||
            if not self.limits[limit]:
 | 
					            if not self.limits[limit]:
 | 
				
			||||||
                # only toggle all nl limits off if they are all currently on
 | 
					                # only toggle all nl limits off if they are all currently on
 | 
				
			||||||
                # this stops turning one off from cascading into 'nl' box off 
 | 
					                # this stops turning one off from cascading into 'nl' box off
 | 
				
			||||||
                # and then all nl limits being turned off
 | 
					                # and then all nl limits being turned off
 | 
				
			||||||
                all_nl_on = True
 | 
					                all_nl_on = True
 | 
				
			||||||
                for cb in self.cbLimits.values():
 | 
					                for cb in self.cbLimits.values():
 | 
				
			||||||
| 
						 | 
					@ -731,11 +733,11 @@ def main(argv=None):
 | 
				
			||||||
        gtk.main_quit()
 | 
					        gtk.main_quit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    parser = OptionParser()
 | 
					    parser = OptionParser()
 | 
				
			||||||
    (options, sys.argv) = parser.parse_args(args = argv)
 | 
					    (options, argv) = parser.parse_args(args = argv)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    config = Configuration.Config()
 | 
					    config = Configuration.Config()
 | 
				
			||||||
    db = None
 | 
					    db = None
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    db = fpdb_db.fpdb_db()
 | 
					    db = fpdb_db.fpdb_db()
 | 
				
			||||||
    db.do_connect(config)
 | 
					    db.do_connect(config)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -750,5 +752,3 @@ def main(argv=None):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if __name__ == '__main__':
 | 
					if __name__ == '__main__':
 | 
				
			||||||
   sys.exit(main())
 | 
					   sys.exit(main())
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -53,7 +53,7 @@ class GuiAutoImport (threading.Thread):
 | 
				
			||||||
        self.importer.setFailOnError(False)
 | 
					        self.importer.setFailOnError(False)
 | 
				
			||||||
        self.importer.setHandCount(0)
 | 
					        self.importer.setHandCount(0)
 | 
				
			||||||
#        self.importer.setWatchTime()
 | 
					#        self.importer.setWatchTime()
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        self.server = settings['db-host']
 | 
					        self.server = settings['db-host']
 | 
				
			||||||
        self.user = settings['db-user']
 | 
					        self.user = settings['db-user']
 | 
				
			||||||
        self.password = settings['db-password']
 | 
					        self.password = settings['db-password']
 | 
				
			||||||
| 
						 | 
					@ -63,7 +63,7 @@ class GuiAutoImport (threading.Thread):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        hbox = gtk.HBox(True, 0) # contains 2 equal vboxes
 | 
					        hbox = gtk.HBox(True, 0) # contains 2 equal vboxes
 | 
				
			||||||
        self.mainVBox.pack_start(hbox, False, False, 0)
 | 
					        self.mainVBox.pack_start(hbox, False, False, 0)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        vbox1 = gtk.VBox(True, 0)
 | 
					        vbox1 = gtk.VBox(True, 0)
 | 
				
			||||||
        hbox.pack_start(vbox1, True, True, 0)
 | 
					        hbox.pack_start(vbox1, True, True, 0)
 | 
				
			||||||
        vbox2 = gtk.VBox(True, 0)
 | 
					        vbox2 = gtk.VBox(True, 0)
 | 
				
			||||||
| 
						 | 
					@ -144,13 +144,13 @@ class GuiAutoImport (threading.Thread):
 | 
				
			||||||
            gobject.timeout_add(1000, self.reset_startbutton)
 | 
					            gobject.timeout_add(1000, self.reset_startbutton)
 | 
				
			||||||
            return True
 | 
					            return True
 | 
				
			||||||
        return False
 | 
					        return False
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
    def reset_startbutton(self):
 | 
					    def reset_startbutton(self):
 | 
				
			||||||
        if self.pipe_to_hud is not None:
 | 
					        if self.pipe_to_hud is not None:
 | 
				
			||||||
            self.startButton.set_label(u'  _Stop Autoimport  ')
 | 
					            self.startButton.set_label(u'  _Stop Autoimport  ')
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            self.startButton.set_label(u'  _Start Autoimport  ')
 | 
					            self.startButton.set_label(u'  _Start Autoimport  ')
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        return False
 | 
					        return False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -169,7 +169,7 @@ class GuiAutoImport (threading.Thread):
 | 
				
			||||||
        if widget.get_active(): # toggled on
 | 
					        if widget.get_active(): # toggled on
 | 
				
			||||||
            # - Does the lock acquisition need to be more sophisticated for multiple dirs?
 | 
					            # - Does the lock acquisition need to be more sophisticated for multiple dirs?
 | 
				
			||||||
            # (see comment above about what to do if pipe already open)
 | 
					            # (see comment above about what to do if pipe already open)
 | 
				
			||||||
            # - Ideally we want to release the lock if the auto-import is killed by some 
 | 
					            # - Ideally we want to release the lock if the auto-import is killed by some
 | 
				
			||||||
            # kind of exception - is this possible?
 | 
					            # kind of exception - is this possible?
 | 
				
			||||||
            if self.settings['global_lock'].acquire(False):   # returns false immediately if lock not acquired
 | 
					            if self.settings['global_lock'].acquire(False):   # returns false immediately if lock not acquired
 | 
				
			||||||
                print "\nGlobal lock taken ..."
 | 
					                print "\nGlobal lock taken ..."
 | 
				
			||||||
| 
						 | 
					@ -183,7 +183,7 @@ class GuiAutoImport (threading.Thread):
 | 
				
			||||||
                        command = os.path.join(sys.path[0], 'HUD_main.py')
 | 
					                        command = os.path.join(sys.path[0], 'HUD_main.py')
 | 
				
			||||||
                        command = [command, ] + string.split(self.settings['cl_options'])
 | 
					                        command = [command, ] + string.split(self.settings['cl_options'])
 | 
				
			||||||
                        bs = 1
 | 
					                        bs = 1
 | 
				
			||||||
                        
 | 
					
 | 
				
			||||||
                    try:
 | 
					                    try:
 | 
				
			||||||
                        self.pipe_to_hud = subprocess.Popen(command, bufsize=bs,
 | 
					                        self.pipe_to_hud = subprocess.Popen(command, bufsize=bs,
 | 
				
			||||||
                                                            stdin=subprocess.PIPE,
 | 
					                                                            stdin=subprocess.PIPE,
 | 
				
			||||||
| 
						 | 
					@ -191,17 +191,17 @@ class GuiAutoImport (threading.Thread):
 | 
				
			||||||
                    except:
 | 
					                    except:
 | 
				
			||||||
                        err = traceback.extract_tb(sys.exc_info()[2])[-1]
 | 
					                        err = traceback.extract_tb(sys.exc_info()[2])[-1]
 | 
				
			||||||
                        print "*** GuiAutoImport Error opening pipe: " + err[2] + "(" + str(err[1]) + "): " + str(sys.exc_info()[1])
 | 
					                        print "*** GuiAutoImport Error opening pipe: " + err[2] + "(" + str(err[1]) + "): " + str(sys.exc_info()[1])
 | 
				
			||||||
                    else:                    
 | 
					                    else:
 | 
				
			||||||
                        for site in self.input_settings:
 | 
					                        for site in self.input_settings:
 | 
				
			||||||
                            self.importer.addImportDirectory(self.input_settings[site][0], True, site, self.input_settings[site][1])
 | 
					                            self.importer.addImportDirectory(self.input_settings[site][0], True, site, self.input_settings[site][1])
 | 
				
			||||||
                            print " * Add", site, " import directory", str(self.input_settings[site][0])
 | 
					                            print " * Add", site, " import directory", str(self.input_settings[site][0])
 | 
				
			||||||
                            print "+Import directory - Site: " + site + " dir: " + str(self.input_settings[site][0])
 | 
					                            print "+Import directory - Site: " + site + " dir: " + str(self.input_settings[site][0])
 | 
				
			||||||
                            self.do_import()                            
 | 
					                            self.do_import()
 | 
				
			||||||
                            interval = int(self.intervalEntry.get_text())
 | 
					                            interval = int(self.intervalEntry.get_text())
 | 
				
			||||||
                    if self.importtimer != 0:
 | 
					                    if self.importtimer != 0:
 | 
				
			||||||
                        gobject.source_remove(self.importtimer)
 | 
					                        gobject.source_remove(self.importtimer)
 | 
				
			||||||
                    self.importtimer = gobject.timeout_add(interval * 1000, self.do_import)
 | 
					                    self.importtimer = gobject.timeout_add(interval * 1000, self.do_import)
 | 
				
			||||||
                        
 | 
					
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                print "auto-import aborted - global lock not available"
 | 
					                print "auto-import aborted - global lock not available"
 | 
				
			||||||
        else: # toggled off
 | 
					        else: # toggled off
 | 
				
			||||||
| 
						 | 
					@ -258,7 +258,7 @@ class GuiAutoImport (threading.Thread):
 | 
				
			||||||
            vbox1.pack_start(pathHBox1, False, True, 0)
 | 
					            vbox1.pack_start(pathHBox1, False, True, 0)
 | 
				
			||||||
            pathHBox2 = gtk.HBox(False, 0)
 | 
					            pathHBox2 = gtk.HBox(False, 0)
 | 
				
			||||||
            vbox2.pack_start(pathHBox2, False, True, 0)
 | 
					            vbox2.pack_start(pathHBox2, False, True, 0)
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
            params = self.config.get_site_parameters(site)
 | 
					            params = self.config.get_site_parameters(site)
 | 
				
			||||||
            paths = self.config.get_default_paths(site)
 | 
					            paths = self.config.get_default_paths(site)
 | 
				
			||||||
            self.createSiteLine(pathHBox1, pathHBox2, site, False, paths['hud-defaultPath'], params['converter'], params['enabled'])
 | 
					            self.createSiteLine(pathHBox1, pathHBox2, site, False, paths['hud-defaultPath'], params['converter'], params['enabled'])
 | 
				
			||||||
| 
						 | 
					@ -281,7 +281,7 @@ if __name__== "__main__":
 | 
				
			||||||
    parser.add_option("-q", "--quiet", action="store_false", dest="gui", default=True, help="don't start gui")
 | 
					    parser.add_option("-q", "--quiet", action="store_false", dest="gui", default=True, help="don't start gui")
 | 
				
			||||||
    parser.add_option("-m", "--minPrint", "--status", dest="minPrint", default="0", type="int",
 | 
					    parser.add_option("-m", "--minPrint", "--status", dest="minPrint", default="0", type="int",
 | 
				
			||||||
                    help="How often to print a one-line status report (0 (default) means never)")
 | 
					                    help="How often to print a one-line status report (0 (default) means never)")
 | 
				
			||||||
    (options, sys.argv) = parser.parse_args()
 | 
					    (options, argv) = parser.parse_args()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    config = Configuration.Config()
 | 
					    config = Configuration.Config()
 | 
				
			||||||
#    db = fpdb_db.fpdb_db()
 | 
					#    db = fpdb_db.fpdb_db()
 | 
				
			||||||
| 
						 | 
					@ -305,4 +305,3 @@ if __name__== "__main__":
 | 
				
			||||||
        gtk.main()
 | 
					        gtk.main()
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        pass
 | 
					        pass
 | 
				
			||||||
    
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -43,7 +43,7 @@ class GuiBulkImport():
 | 
				
			||||||
    def dopulse(self):
 | 
					    def dopulse(self):
 | 
				
			||||||
        self.progressbar.pulse()
 | 
					        self.progressbar.pulse()
 | 
				
			||||||
        return True
 | 
					        return True
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
    def load_clicked(self, widget, data=None):
 | 
					    def load_clicked(self, widget, data=None):
 | 
				
			||||||
        stored = None
 | 
					        stored = None
 | 
				
			||||||
        dups = None
 | 
					        dups = None
 | 
				
			||||||
| 
						 | 
					@ -58,9 +58,9 @@ class GuiBulkImport():
 | 
				
			||||||
                self.progressbar.set_text("Importing...")
 | 
					                self.progressbar.set_text("Importing...")
 | 
				
			||||||
                self.progressbar.pulse()
 | 
					                self.progressbar.pulse()
 | 
				
			||||||
                while gtk.events_pending(): # see http://faq.pygtk.org/index.py?req=index for more hints (3.7)
 | 
					                while gtk.events_pending(): # see http://faq.pygtk.org/index.py?req=index for more hints (3.7)
 | 
				
			||||||
                    gtk.main_iteration(False)                
 | 
					                    gtk.main_iteration(False)
 | 
				
			||||||
                self.timer = gobject.timeout_add(100, self.dopulse)
 | 
					                self.timer = gobject.timeout_add(100, self.dopulse)
 | 
				
			||||||
                
 | 
					
 | 
				
			||||||
                #    get the dir to import from the chooser
 | 
					                #    get the dir to import from the chooser
 | 
				
			||||||
                selected = self.chooser.get_filenames()
 | 
					                selected = self.chooser.get_filenames()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -87,7 +87,7 @@ class GuiBulkImport():
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
                    self.importer.setDropHudCache("auto")
 | 
					                    self.importer.setDropHudCache("auto")
 | 
				
			||||||
                sitename = self.cbfilter.get_model()[self.cbfilter.get_active()][0]
 | 
					                sitename = self.cbfilter.get_model()[self.cbfilter.get_active()][0]
 | 
				
			||||||
                
 | 
					
 | 
				
			||||||
                for selection in selected:
 | 
					                for selection in selected:
 | 
				
			||||||
                    self.importer.addBulkImportImportFileOrDir(selection, site = sitename)
 | 
					                    self.importer.addBulkImportImportFileOrDir(selection, site = sitename)
 | 
				
			||||||
                self.importer.setCallHud(False)
 | 
					                self.importer.setCallHud(False)
 | 
				
			||||||
| 
						 | 
					@ -99,7 +99,7 @@ class GuiBulkImport():
 | 
				
			||||||
#                    raise Exceptions.FpdbError
 | 
					#                    raise Exceptions.FpdbError
 | 
				
			||||||
#                finally:
 | 
					#                finally:
 | 
				
			||||||
                gobject.source_remove(self.timer)
 | 
					                gobject.source_remove(self.timer)
 | 
				
			||||||
                    
 | 
					
 | 
				
			||||||
                ttime = time() - starttime
 | 
					                ttime = time() - starttime
 | 
				
			||||||
                if ttime == 0:
 | 
					                if ttime == 0:
 | 
				
			||||||
                    ttime = 1
 | 
					                    ttime = 1
 | 
				
			||||||
| 
						 | 
					@ -324,9 +324,9 @@ def main(argv=None):
 | 
				
			||||||
                    help="If this option is passed it quits when it encounters any error")
 | 
					                    help="If this option is passed it quits when it encounters any error")
 | 
				
			||||||
    parser.add_option("-m", "--minPrint", "--status", dest="minPrint", default="0", type="int",
 | 
					    parser.add_option("-m", "--minPrint", "--status", dest="minPrint", default="0", type="int",
 | 
				
			||||||
                    help="How often to print a one-line status report (0 (default) means never)")
 | 
					                    help="How often to print a one-line status report (0 (default) means never)")
 | 
				
			||||||
    parser.add_option("-u", "--usage", action="store_true", dest="usage", default=False, 
 | 
					    parser.add_option("-u", "--usage", action="store_true", dest="usage", default=False,
 | 
				
			||||||
                    help="Print some useful one liners")
 | 
					                    help="Print some useful one liners")
 | 
				
			||||||
    (options, sys.argv) = parser.parse_args(args = argv)
 | 
					    (options, argv) = parser.parse_args(args = argv)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if options.usage == True:
 | 
					    if options.usage == True:
 | 
				
			||||||
        #Print usage examples and exit
 | 
					        #Print usage examples and exit
 | 
				
			||||||
| 
						 | 
					@ -339,7 +339,7 @@ def main(argv=None):
 | 
				
			||||||
        sys.exit(0)
 | 
					        sys.exit(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    config = Configuration.Config()
 | 
					    config = Configuration.Config()
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    settings = {}
 | 
					    settings = {}
 | 
				
			||||||
    settings['minPrint'] = options.minPrint
 | 
					    settings['minPrint'] = options.minPrint
 | 
				
			||||||
    if os.name == 'nt': settings['os'] = 'windows'
 | 
					    if os.name == 'nt': settings['os'] = 'windows'
 | 
				
			||||||
| 
						 | 
					@ -362,7 +362,7 @@ def main(argv=None):
 | 
				
			||||||
        gtk.main()
 | 
					        gtk.main()
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        #Do something useful
 | 
					        #Do something useful
 | 
				
			||||||
        importer = fpdb_import.Importer(False,settings, config) 
 | 
					        importer = fpdb_import.Importer(False,settings, config)
 | 
				
			||||||
        # importer.setDropIndexes("auto")
 | 
					        # importer.setDropIndexes("auto")
 | 
				
			||||||
        importer.setDropIndexes("don't drop")
 | 
					        importer.setDropIndexes("don't drop")
 | 
				
			||||||
        importer.setFailOnError(options.failOnError)
 | 
					        importer.setFailOnError(options.failOnError)
 | 
				
			||||||
| 
						 | 
					@ -377,4 +377,3 @@ def main(argv=None):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if __name__ == '__main__':
 | 
					if __name__ == '__main__':
 | 
				
			||||||
    sys.exit(main())
 | 
					    sys.exit(main())
 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -152,14 +152,17 @@ class GuiGraphViewer (threading.Thread):
 | 
				
			||||||
            if not sitenos:
 | 
					            if not sitenos:
 | 
				
			||||||
                #Should probably pop up here.
 | 
					                #Should probably pop up here.
 | 
				
			||||||
                print "No sites selected - defaulting to PokerStars"
 | 
					                print "No sites selected - defaulting to PokerStars"
 | 
				
			||||||
 | 
					                self.db.rollback()
 | 
				
			||||||
                return
 | 
					                return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if not playerids:
 | 
					            if not playerids:
 | 
				
			||||||
                print "No player ids found"
 | 
					                print "No player ids found"
 | 
				
			||||||
 | 
					                self.db.rollback()
 | 
				
			||||||
                return
 | 
					                return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if not limits:
 | 
					            if not limits:
 | 
				
			||||||
                print "No limits found"
 | 
					                print "No limits found"
 | 
				
			||||||
 | 
					                self.db.rollback()
 | 
				
			||||||
                return
 | 
					                return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            #Set graph properties
 | 
					            #Set graph properties
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										169
									
								
								pyfpdb/GuiPrefs.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										169
									
								
								pyfpdb/GuiPrefs.py
									
									
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,169 @@
 | 
				
			||||||
 | 
					#!/usr/bin/python
 | 
				
			||||||
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#Copyright 2008 Carl Gherardi
 | 
				
			||||||
 | 
					#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 in the docs folder of the package.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import xml.dom.minidom
 | 
				
			||||||
 | 
					from xml.dom.minidom import Node
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import pygtk
 | 
				
			||||||
 | 
					pygtk.require('2.0')
 | 
				
			||||||
 | 
					import gtk
 | 
				
			||||||
 | 
					import gobject
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import Configuration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class GuiPrefs:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self, config, mainwin, dia):
 | 
				
			||||||
 | 
					        self.config = config
 | 
				
			||||||
 | 
					        self.main_window = mainwin
 | 
				
			||||||
 | 
					        self.dialog = dia
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.tree_box = gtk.ScrolledWindow()
 | 
				
			||||||
 | 
					        self.tree_box.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.dialog.add(self.tree_box)
 | 
				
			||||||
 | 
					        self.dialog.show()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.doc = None
 | 
				
			||||||
 | 
					        self.configStore = None
 | 
				
			||||||
 | 
					        self.configView = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.fillFrames()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def fillFrames(self):
 | 
				
			||||||
 | 
					        self.doc = self.config.get_doc()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.configStore = gtk.TreeStore(gobject.TYPE_PYOBJECT, gobject.TYPE_STRING, gobject.TYPE_STRING)
 | 
				
			||||||
 | 
					        self.configView = gtk.TreeView(self.configStore)
 | 
				
			||||||
 | 
					        self.configView.set_enable_tree_lines(True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        configColumn = gtk.TreeViewColumn("Setting")
 | 
				
			||||||
 | 
					        self.configView.append_column(configColumn)
 | 
				
			||||||
 | 
					        cRender = gtk.CellRendererText()
 | 
				
			||||||
 | 
					        configColumn.pack_start(cRender, True)
 | 
				
			||||||
 | 
					        configColumn.add_attribute(cRender, 'text', 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        configColumn = gtk.TreeViewColumn("Value")
 | 
				
			||||||
 | 
					        self.configView.append_column(configColumn)
 | 
				
			||||||
 | 
					        cRender = gtk.CellRendererText()
 | 
				
			||||||
 | 
					        configColumn.pack_start(cRender, True)
 | 
				
			||||||
 | 
					        configColumn.add_attribute(cRender, 'text', 2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if self.doc.documentElement.tagName == 'FreePokerToolsConfig':
 | 
				
			||||||
 | 
					            self.configStore.clear()
 | 
				
			||||||
 | 
					            self.root = self.configStore.append( None, [self.doc.documentElement, "fpdb", None] )
 | 
				
			||||||
 | 
					            for elem in self.doc.documentElement.childNodes:
 | 
				
			||||||
 | 
					                iter = self.addTreeRows(self.root, elem)
 | 
				
			||||||
 | 
					            if self.root != None:
 | 
				
			||||||
 | 
					                self.configView.expand_row(self.configStore.get_path(self.root), False)
 | 
				
			||||||
 | 
					            self.configView.connect("row-activated", self.rowChosen)
 | 
				
			||||||
 | 
					            self.configView.show()
 | 
				
			||||||
 | 
					            self.tree_box.add(self.configView)
 | 
				
			||||||
 | 
					            self.tree_box.show()
 | 
				
			||||||
 | 
					            self.dialog.show()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def addTreeRows(self, parent, node):
 | 
				
			||||||
 | 
					        if (node.nodeType == node.ELEMENT_NODE):
 | 
				
			||||||
 | 
					            (setting, value) = (node.nodeName, None)
 | 
				
			||||||
 | 
					        elif (node.nodeType == node.TEXT_NODE):
 | 
				
			||||||
 | 
					            # text nodes hold the whitespace (or whatever) between the xml elements, not used here
 | 
				
			||||||
 | 
					            (setting, value) = ("TEXT: ["+node.nodeValue+"|"+node.nodeValue+"]", node.data)
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            (setting, value) = ("?? "+node.nodeValue, "type="+str(node.nodeType))
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        #iter = self.configStore.append( parent, [node.nodeValue, None] )
 | 
				
			||||||
 | 
					        iter = None
 | 
				
			||||||
 | 
					        if node.nodeType != node.TEXT_NODE and node.nodeType != node.COMMENT_NODE:
 | 
				
			||||||
 | 
					            iter = self.configStore.append( parent, [node, setting, value] )
 | 
				
			||||||
 | 
					            if node.hasAttributes():
 | 
				
			||||||
 | 
					                for i in xrange(node.attributes.length):
 | 
				
			||||||
 | 
					                    self.configStore.append( iter, [node, node.attributes.item(i).localName, node.attributes.item(i).value] )
 | 
				
			||||||
 | 
					            if node.hasChildNodes():
 | 
				
			||||||
 | 
					                for elem in node.childNodes:
 | 
				
			||||||
 | 
					                    self.addTreeRows(iter, elem)
 | 
				
			||||||
 | 
					        return iter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def rowChosen(self, tview, path, something2, data=None):
 | 
				
			||||||
 | 
					        # tview should= self.configStore
 | 
				
			||||||
 | 
					        tmodel = tview.get_model()
 | 
				
			||||||
 | 
					        iter = tmodel.get_iter(path)
 | 
				
			||||||
 | 
					        if tmodel.iter_has_child(iter):
 | 
				
			||||||
 | 
					            # toggle children display
 | 
				
			||||||
 | 
					            if tview.row_expanded(path):
 | 
				
			||||||
 | 
					                tview.collapse_row(tmodel.get_path(iter))
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                tview.expand_row(tmodel.get_path(iter), False)
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            # display value and allow edit
 | 
				
			||||||
 | 
					            name = tmodel.get_value( iter, 1 )
 | 
				
			||||||
 | 
					            val = tmodel.get_value( iter, 2 )
 | 
				
			||||||
 | 
					            dia_edit = gtk.Dialog(name,
 | 
				
			||||||
 | 
					                                  self.main_window,
 | 
				
			||||||
 | 
					                                  gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
 | 
				
			||||||
 | 
					                                  (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
 | 
				
			||||||
 | 
					                                   gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
 | 
				
			||||||
 | 
					            #dia_edit.set_default_size(350, 100)
 | 
				
			||||||
 | 
					            entry = gtk.Entry()
 | 
				
			||||||
 | 
					            if val:
 | 
				
			||||||
 | 
					                entry.set_text(val)
 | 
				
			||||||
 | 
					            entry.set_width_chars(40)
 | 
				
			||||||
 | 
					            dia_edit.vbox.pack_start(entry, False, False, 0)
 | 
				
			||||||
 | 
					            entry.show()
 | 
				
			||||||
 | 
					            entry.connect("activate", self.__set_entry, dia_edit)
 | 
				
			||||||
 | 
					            response = dia_edit.run()
 | 
				
			||||||
 | 
					            if response == gtk.RESPONSE_ACCEPT:
 | 
				
			||||||
 | 
					                # update configStore
 | 
				
			||||||
 | 
					                new_val = entry.get_text()
 | 
				
			||||||
 | 
					                tmodel.set_value(iter, 2, new_val)
 | 
				
			||||||
 | 
					                tmodel.get_value(iter, 0).setAttribute(name, new_val)
 | 
				
			||||||
 | 
					            dia_edit.destroy()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __set_entry(self, w, dia=None):
 | 
				
			||||||
 | 
					        if dia is not None:
 | 
				
			||||||
 | 
					            dia.response(gtk.RESPONSE_ACCEPT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if __name__=="__main__":
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    config = Configuration.Config()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    win = gtk.Window(gtk.WINDOW_TOPLEVEL)
 | 
				
			||||||
 | 
					    win.set_title("Test Preferences Dialog")
 | 
				
			||||||
 | 
					    win.set_border_width(1)
 | 
				
			||||||
 | 
					    win.set_default_size(600, 500)
 | 
				
			||||||
 | 
					    win.set_resizable(True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dia = gtk.Dialog("Preferences",
 | 
				
			||||||
 | 
					                     win,
 | 
				
			||||||
 | 
					                     gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
 | 
				
			||||||
 | 
					                     (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
 | 
				
			||||||
 | 
					                      gtk.STOCK_SAVE, gtk.RESPONSE_ACCEPT))
 | 
				
			||||||
 | 
					    dia.set_default_size(500, 500)
 | 
				
			||||||
 | 
					    prefs = GuiPrefs(config, win, dia.vbox)
 | 
				
			||||||
 | 
					    response = dia.run()
 | 
				
			||||||
 | 
					    if response == gtk.RESPONSE_ACCEPT:
 | 
				
			||||||
 | 
					        # save updated config
 | 
				
			||||||
 | 
					        config.save()
 | 
				
			||||||
 | 
					    dia.destroy()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										581
									
								
								pyfpdb/HUD_config.test.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										581
									
								
								pyfpdb/HUD_config.test.xml
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,581 @@
 | 
				
			||||||
 | 
					<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<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>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- These values determine what stats are displayed in the HUD
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    The following values define how opponents' stats are done, the first 2 determine
 | 
				
			||||||
 | 
					    the time period stats are displayed for, the next 3 determine what blind levels
 | 
				
			||||||
 | 
					    are included (i.e. aggregated):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    stat_range :
 | 
				
			||||||
 | 
					        - A/S/T
 | 
				
			||||||
 | 
					        - if set to A, includes stats from all time
 | 
				
			||||||
 | 
					        - if set to S, includes stats from current session
 | 
				
			||||||
 | 
					        - if set to T, includes stats from last N days; set value in stat_days
 | 
				
			||||||
 | 
					        - defaults to A
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    stat_days :
 | 
				
			||||||
 | 
					        - a numeric value
 | 
				
			||||||
 | 
					        - only used if stat_range is set to 'T', this value tells how many days are
 | 
				
			||||||
 | 
					          included in the stat calculation
 | 
				
			||||||
 | 
					        - defaults to 90
 | 
				
			||||||
 | 
					        - value not used by default as it depends on stat_range setting
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    aggregate_ring_game_stats :
 | 
				
			||||||
 | 
					        - True/False
 | 
				
			||||||
 | 
					        - if set to True, opponents stats include other blind levels during ring games
 | 
				
			||||||
 | 
					        - defaults to False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    aggregate_tourney_stats :
 | 
				
			||||||
 | 
					        - True/False
 | 
				
			||||||
 | 
					        - if set to True, opponents stats include other blind levels during tourneys
 | 
				
			||||||
 | 
					        - defaults to True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    aggregation_level_multiplier :
 | 
				
			||||||
 | 
					        - float value
 | 
				
			||||||
 | 
					        - defines how many blind levels are included in stats displayed in HUD
 | 
				
			||||||
 | 
					        - if value is M, stats for blind levels are combined if the higher level
 | 
				
			||||||
 | 
					          is less than or equal to M times the lower blind level
 | 
				
			||||||
 | 
					        - defaults to 3, meaning blind levels from 1/3 of the current level to 3
 | 
				
			||||||
 | 
					          times the current level are included in the stats displayed in the HUD
 | 
				
			||||||
 | 
					        - e.g. if current big blind is 50, stats for blind levels from big blind
 | 
				
			||||||
 | 
					          of 16.7 (50 divided by 3) to big blind of 150 (50 times 3) are included
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    The following values define how hero's stats are done, the first 2 determine
 | 
				
			||||||
 | 
					    the time period stats are displayed for, the next 3 determine what blind levels
 | 
				
			||||||
 | 
					    are included (i.e. aggregated):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    hero_stat_range :
 | 
				
			||||||
 | 
					        - A/S/T
 | 
				
			||||||
 | 
					        - if set to A, includes stats from all time
 | 
				
			||||||
 | 
					        - if set to S, includes stats from current session
 | 
				
			||||||
 | 
					        - if set to T, includes stats from last N days; set value in hero_stat_days
 | 
				
			||||||
 | 
					        - defaults to S
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    hero_stat_days :
 | 
				
			||||||
 | 
					        - a numeric value
 | 
				
			||||||
 | 
					        - if hero_stat_range is set to 'T', this value tells how many days are 
 | 
				
			||||||
 | 
					          included in the stat calculation
 | 
				
			||||||
 | 
					        - defaults to 30
 | 
				
			||||||
 | 
					        - value not used by default as it depends on hero_stat_range setting
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    aggregate_hero_ring_game_stats :
 | 
				
			||||||
 | 
					        - True/False
 | 
				
			||||||
 | 
					        - if set to True, hero's stats are calculated over multiple blind levels
 | 
				
			||||||
 | 
					        - defaults to False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    aggregate_hero_tourney_stats :
 | 
				
			||||||
 | 
					        - True/False
 | 
				
			||||||
 | 
					        - if set to True, hero's stats are calculated over multiple blind levels
 | 
				
			||||||
 | 
					        - defaults to False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    hero_aggregation_level_multiplier :
 | 
				
			||||||
 | 
					        - float value
 | 
				
			||||||
 | 
					        - defines how many blind levels are included in stats displayed in HUD
 | 
				
			||||||
 | 
					        - if value is M, stats for blind levels are combined if the higher level
 | 
				
			||||||
 | 
					          is less than or equal to M times the lower blind level
 | 
				
			||||||
 | 
					        - defaults to 1, meaning only stats from current blind level are included
 | 
				
			||||||
 | 
					        - e.g. if set to 3 and current big blind is 50, stats for blind levels from 
 | 
				
			||||||
 | 
					          16.7 (50 divided by 3) to big blind of 150 (50 times 3) are included
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					    <hud_ui
 | 
				
			||||||
 | 
					    stat_range="A"
 | 
				
			||||||
 | 
					    stat_days="90"
 | 
				
			||||||
 | 
					    aggregate_ring_game_stats="False"
 | 
				
			||||||
 | 
					    aggregate_tourney_stats="True"
 | 
				
			||||||
 | 
					    aggregation_level_multiplier="3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    hero_stat_range="S"
 | 
				
			||||||
 | 
					    hero_stat_days="30"
 | 
				
			||||||
 | 
					    aggregate_hero_ring_game_stats="False"
 | 
				
			||||||
 | 
					    aggregate_hero_tourney_stats="False"
 | 
				
			||||||
 | 
					    hero_aggregation_level_multiplier="1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    label="FPDB Menu - Right-click
 | 
				
			||||||
 | 
					Left-Drag to Move"
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <supported_sites>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <site enabled="True"
 | 
				
			||||||
 | 
					              site_name="PokerStars"
 | 
				
			||||||
 | 
					              table_finder="PokerStars.exe"
 | 
				
			||||||
 | 
					              screen_name="YOUR SCREEN NAME HERE"
 | 
				
			||||||
 | 
					              site_path="C:/Program Files/PokerStars/"
 | 
				
			||||||
 | 
					              HH_path="C:/Program Files/PokerStars/HandHistory/YOUR SCREEN NAME HERE/"
 | 
				
			||||||
 | 
					              decoder="pokerstars_decode_table"
 | 
				
			||||||
 | 
					              converter="PokerStarsToFpdb"
 | 
				
			||||||
 | 
					              bgcolor="#000000"
 | 
				
			||||||
 | 
					              fgcolor="#FFFFFF"
 | 
				
			||||||
 | 
					              hudopacity="1.0"
 | 
				
			||||||
 | 
					              font="Sans"
 | 
				
			||||||
 | 
					              font_size="8"
 | 
				
			||||||
 | 
					              supported_games="holdem,razz,omahahi,omahahilo,studhi,studhilo">
 | 
				
			||||||
 | 
					            <layout max="8" width="792" height="546" fav_seat="0">
 | 
				
			||||||
 | 
					                <location seat="1" x="684" y="61">  </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="689" y="239"> </location>
 | 
				
			||||||
 | 
					                <location seat="3" x="692" y="346"> </location>
 | 
				
			||||||
 | 
					                <location seat="4" x="525" y="402"> </location>
 | 
				
			||||||
 | 
					                <location seat="5" x="259" y="402"> </location>
 | 
				
			||||||
 | 
					                <location seat="6" x="0"   y="348"> </location>
 | 
				
			||||||
 | 
					                <location seat="7" x="0"   y="240"> </location>
 | 
				
			||||||
 | 
					                <location seat="8" x="0"   y="35">  </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					            <layout max="6" width="792" height="546" fav_seat="0">
 | 
				
			||||||
 | 
					                <location seat="1" x="681" y="119"> </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="681" y="301"> </location>
 | 
				
			||||||
 | 
					                <location seat="3" x="487" y="369"> </location>
 | 
				
			||||||
 | 
					                <location seat="4" x="226" y="369"> </location>
 | 
				
			||||||
 | 
					                <location seat="5" x="0"   y="301"> </location>
 | 
				
			||||||
 | 
					                <location seat="6" x="0"   y="119"> </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					            <layout max="10" width="792" height="546" fav_seat="0">
 | 
				
			||||||
 | 
					                <location seat="1" x="684" y="61">  </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="689" y="239"> </location>
 | 
				
			||||||
 | 
					                <location seat="3" x="692" y="346"> </location>
 | 
				
			||||||
 | 
					                <location seat="4" x="586" y="393"> </location>
 | 
				
			||||||
 | 
					                <location seat="5" x="421" y="440"> </location>
 | 
				
			||||||
 | 
					                <location seat="6" x="267" y="440"> </location>
 | 
				
			||||||
 | 
					                <location seat="7" x="0"   y="361"> </location>
 | 
				
			||||||
 | 
					                <location seat="8" x="0"   y="280">  </location>
 | 
				
			||||||
 | 
					                <location seat="9" x="121" y="280">  </location>
 | 
				
			||||||
 | 
					                <location seat="10" x="46"  y="30">  </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					            <layout max="9" width="792" height="546" fav_seat="0">
 | 
				
			||||||
 | 
					                <location seat="1" x="560" y="0">  </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="679" y="123"> </location>
 | 
				
			||||||
 | 
					                <location seat="3" x="688" y="309"> </location>
 | 
				
			||||||
 | 
					                <location seat="4" x="483" y="370"> </location>
 | 
				
			||||||
 | 
					                <location seat="5" x="444" y="413"> </location>
 | 
				
			||||||
 | 
					                <location seat="6" x="224" y="372"> </location>
 | 
				
			||||||
 | 
					                <location seat="7" x="0"   y="307"> </location>
 | 
				
			||||||
 | 
					                <location seat="8" x="0"   y="121">  </location>
 | 
				
			||||||
 | 
					                <location seat="9" x="140" y="0">  </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					            <layout fav_seat="0" height="546" max="2" width="792">
 | 
				
			||||||
 | 
					                <location seat="1" x="651" y="288"> </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="10"  y="288"> </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					        </site>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <site enabled="True"
 | 
				
			||||||
 | 
					              site_name="Full Tilt Poker"
 | 
				
			||||||
 | 
					              table_finder="FullTiltPoker"
 | 
				
			||||||
 | 
					              screen_name="YOUR SCREEN NAME HERE"
 | 
				
			||||||
 | 
					              site_path="C:/Program Files/Full Tilt Poker/"
 | 
				
			||||||
 | 
					              HH_path="C:/Program Files/Full Tilt Poker/HandHistory/YOUR SCREEN NAME HERE/"
 | 
				
			||||||
 | 
					              decoder="fulltilt_decode_table"
 | 
				
			||||||
 | 
					              converter="FulltiltToFpdb"
 | 
				
			||||||
 | 
					              bgcolor="#000000"
 | 
				
			||||||
 | 
					              fgcolor="#FFFFFF"
 | 
				
			||||||
 | 
					              hudopacity="1.0"
 | 
				
			||||||
 | 
					              font="Sans"
 | 
				
			||||||
 | 
					              font_size="8"
 | 
				
			||||||
 | 
					              supported_games="holdem,razz,omahahi,omahahilo,studhi,studhilo">
 | 
				
			||||||
 | 
					            <layout fav_seat="0" height="547" max="8" width="794">
 | 
				
			||||||
 | 
					                <location seat="1" x="640" y="64">  </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="650" y="230"> </location>
 | 
				
			||||||
 | 
					                <location seat="3" x="650" y="385"> </location>
 | 
				
			||||||
 | 
					                <location seat="4" x="588" y="425"> </location>
 | 
				
			||||||
 | 
					                <location seat="5" x="92" y="425"> </location>
 | 
				
			||||||
 | 
					                <location seat="6" x="0" y="373"> </location>
 | 
				
			||||||
 | 
					                <location seat="7" x="0" y="223"> </location>
 | 
				
			||||||
 | 
					                <location seat="8" x="25" y="50">  </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					            <layout fav_seat="0" height="547" max="6" width="794">
 | 
				
			||||||
 | 
					                <location seat="1" x="640" y="58"> </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="654" y="288"> </location>
 | 
				
			||||||
 | 
					                <location seat="3" x="615" y="424"> </location>
 | 
				
			||||||
 | 
					                <location seat="4" x="70" y="421"> </location>
 | 
				
			||||||
 | 
					                <location seat="5" x="0" y="280"> </location>
 | 
				
			||||||
 | 
					                <location seat="6" x="70" y="58"> </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					            <layout fav_seat="0" height="547" max="2" width="794">
 | 
				
			||||||
 | 
					                <location seat="1" x="651" y="288"> </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="10"  y="288"> </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					            <layout fav_seat="0" height="547" max="9" width="794">
 | 
				
			||||||
 | 
					                <location seat="1" x="634" y="38">  </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="667" y="184"> </location>
 | 
				
			||||||
 | 
					                <location seat="3" x="667" y="321"> </location>
 | 
				
			||||||
 | 
					                <location seat="4" x="667" y="445"> </location>
 | 
				
			||||||
 | 
					                <location seat="5" x="337" y="459"> </location>
 | 
				
			||||||
 | 
					                <location seat="6" x="0" y="400"> </location>
 | 
				
			||||||
 | 
					                <location seat="7" x="0" y="322"> </location>
 | 
				
			||||||
 | 
					                <location seat="8" x="0" y="181">  </location>
 | 
				
			||||||
 | 
					                <location seat="9" x="70" y="53">  </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					        </site>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <site enabled="False"
 | 
				
			||||||
 | 
					              site_name="Everleaf"
 | 
				
			||||||
 | 
					              table_finder="Everleaf.exe"
 | 
				
			||||||
 | 
					              screen_name="YOUR SCREEN NAME HERE"
 | 
				
			||||||
 | 
					              site_path=""
 | 
				
			||||||
 | 
					              HH_path=""
 | 
				
			||||||
 | 
					              decoder="everleaf_decode_table"
 | 
				
			||||||
 | 
					              converter="EverleafToFpdb"
 | 
				
			||||||
 | 
					              supported_games="holdem">
 | 
				
			||||||
 | 
					            <layout fav_seat="0" height="547" max="8" width="794">
 | 
				
			||||||
 | 
					                <location seat="1" x="640" y="64">  </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="650" y="230"> </location>
 | 
				
			||||||
 | 
					                <location seat="3" x="650" y="385"> </location>
 | 
				
			||||||
 | 
					                <location seat="4" x="588" y="425"> </location>
 | 
				
			||||||
 | 
					                <location seat="5" x="92" y="425"> </location>
 | 
				
			||||||
 | 
					                <location seat="6" x="0" y="373"> </location>
 | 
				
			||||||
 | 
					                <location seat="7" x="0" y="223"> </location>
 | 
				
			||||||
 | 
					                <location seat="8" x="25" y="50">  </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					            <layout fav_seat="0" height="547" max="6" width="794">
 | 
				
			||||||
 | 
					                <location seat="1" x="640" y="58"> </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="654" y="288"> </location>
 | 
				
			||||||
 | 
					                <location seat="3" x="615" y="424"> </location>
 | 
				
			||||||
 | 
					                <location seat="4" x="70" y="421"> </location>
 | 
				
			||||||
 | 
					                <location seat="5" x="0" y="280"> </location>
 | 
				
			||||||
 | 
					                <location seat="6" x="70" y="58"> </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					            <layout fav_seat="0" height="547" max="2" width="794">
 | 
				
			||||||
 | 
					                <location seat="1" x="651" y="288"> </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="10"  y="288"> </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					            <layout fav_seat="0" height="547" max="9" width="794">
 | 
				
			||||||
 | 
					                <location seat="1" x="634" y="38">  </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="667" y="184"> </location>
 | 
				
			||||||
 | 
					                <location seat="3" x="667" y="321"> </location>
 | 
				
			||||||
 | 
					                <location seat="4" x="667" y="445"> </location>
 | 
				
			||||||
 | 
					                <location seat="5" x="337" y="459"> </location>
 | 
				
			||||||
 | 
					                <location seat="6" x="0" y="400"> </location>
 | 
				
			||||||
 | 
					                <location seat="7" x="0" y="322"> </location>
 | 
				
			||||||
 | 
					                <location seat="8" x="0" y="181">  </location>
 | 
				
			||||||
 | 
					                <location seat="9" x="70" y="53">  </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					        </site>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <site enabled="False"
 | 
				
			||||||
 | 
					              site_name="Win2day"
 | 
				
			||||||
 | 
					              table_finder="Win2day.exe"
 | 
				
			||||||
 | 
					              screen_name="YOUR SCREEN NAME HERE"
 | 
				
			||||||
 | 
					              site_path=""
 | 
				
			||||||
 | 
					              HH_path=""
 | 
				
			||||||
 | 
					              decoder="everleaf_decode_table"
 | 
				
			||||||
 | 
					              converter="Win2dayToFpdb"
 | 
				
			||||||
 | 
					              supported_games="holdem">
 | 
				
			||||||
 | 
					            <layout fav_seat="0" height="547" max="8" width="794">
 | 
				
			||||||
 | 
					                <location seat="1" x="640" y="64">  </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="650" y="230"> </location>
 | 
				
			||||||
 | 
					                <location seat="3" x="650" y="385"> </location>
 | 
				
			||||||
 | 
					                <location seat="4" x="588" y="425"> </location>
 | 
				
			||||||
 | 
					                <location seat="5" x="92" y="425"> </location>
 | 
				
			||||||
 | 
					                <location seat="6" x="0" y="373"> </location>
 | 
				
			||||||
 | 
					                <location seat="7" x="0" y="223"> </location>
 | 
				
			||||||
 | 
					                <location seat="8" x="25" y="50">  </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					            <layout fav_seat="0" height="547" max="6" width="794">
 | 
				
			||||||
 | 
					                <location seat="1" x="640" y="58"> </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="654" y="288"> </location>
 | 
				
			||||||
 | 
					                <location seat="3" x="615" y="424"> </location>
 | 
				
			||||||
 | 
					                <location seat="4" x="70" y="421"> </location>
 | 
				
			||||||
 | 
					                <location seat="5" x="0" y="280"> </location>
 | 
				
			||||||
 | 
					                <location seat="6" x="70" y="58"> </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					            <layout fav_seat="0" height="547" max="2" width="794">
 | 
				
			||||||
 | 
					                <location seat="1" x="651" y="288"> </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="10"  y="288"> </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					            <layout fav_seat="0" height="547" max="9" width="794">
 | 
				
			||||||
 | 
					                <location seat="1" x="634" y="38">  </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="667" y="184"> </location>
 | 
				
			||||||
 | 
					                <location seat="3" x="667" y="321"> </location>
 | 
				
			||||||
 | 
					                <location seat="4" x="667" y="445"> </location>
 | 
				
			||||||
 | 
					                <location seat="5" x="337" y="459"> </location>
 | 
				
			||||||
 | 
					                <location seat="6" x="0" y="400"> </location>
 | 
				
			||||||
 | 
					                <location seat="7" x="0" y="322"> </location>
 | 
				
			||||||
 | 
					                <location seat="8" x="0" y="181">  </location>
 | 
				
			||||||
 | 
					                <location seat="9" x="70" y="53">  </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					        </site>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <site enabled="False"
 | 
				
			||||||
 | 
					              site_name="Absolute"
 | 
				
			||||||
 | 
					              table_finder="AbsolutePoker.exe"
 | 
				
			||||||
 | 
					              screen_name="YOUR SCREEN NAME HERE"
 | 
				
			||||||
 | 
					              site_path=""
 | 
				
			||||||
 | 
					              HH_path=""
 | 
				
			||||||
 | 
					              decoder="everleaf_decode_table"
 | 
				
			||||||
 | 
					              converter="AbsoluteToFpdb"
 | 
				
			||||||
 | 
					              supported_games="holdem">
 | 
				
			||||||
 | 
					            <layout fav_seat="0" height="547" max="8" width="794">
 | 
				
			||||||
 | 
					                <location seat="1" x="640" y="64">  </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="650" y="230"> </location>
 | 
				
			||||||
 | 
					                <location seat="3" x="650" y="385"> </location>
 | 
				
			||||||
 | 
					                <location seat="4" x="588" y="425"> </location>
 | 
				
			||||||
 | 
					                <location seat="5" x="92" y="425"> </location>
 | 
				
			||||||
 | 
					                <location seat="6" x="0" y="373"> </location>
 | 
				
			||||||
 | 
					                <location seat="7" x="0" y="223"> </location>
 | 
				
			||||||
 | 
					                <location seat="8" x="25" y="50">  </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					            <layout fav_seat="0" height="547" max="6" width="794">
 | 
				
			||||||
 | 
					                <location seat="1" x="640" y="58"> </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="654" y="288"> </location>
 | 
				
			||||||
 | 
					                <location seat="3" x="615" y="424"> </location>
 | 
				
			||||||
 | 
					                <location seat="4" x="70" y="421"> </location>
 | 
				
			||||||
 | 
					                <location seat="5" x="0" y="280"> </location>
 | 
				
			||||||
 | 
					                <location seat="6" x="70" y="58"> </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					            <layout fav_seat="0" height="547" max="2" width="794">
 | 
				
			||||||
 | 
					                <location seat="1" x="651" y="288"> </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="10"  y="288"> </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					            <layout fav_seat="0" height="547" max="9" width="794">
 | 
				
			||||||
 | 
					                <location seat="1" x="634" y="38">  </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="667" y="184"> </location>
 | 
				
			||||||
 | 
					                <location seat="3" x="667" y="321"> </location>
 | 
				
			||||||
 | 
					                <location seat="4" x="667" y="445"> </location>
 | 
				
			||||||
 | 
					                <location seat="5" x="337" y="459"> </location>
 | 
				
			||||||
 | 
					                <location seat="6" x="0" y="400"> </location>
 | 
				
			||||||
 | 
					                <location seat="7" x="0" y="322"> </location>
 | 
				
			||||||
 | 
					                <location seat="8" x="0" y="181">  </location>
 | 
				
			||||||
 | 
					                <location seat="9" x="70" y="53">  </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					        </site>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <site enabled="False"
 | 
				
			||||||
 | 
					              site_name="PartyPoker"
 | 
				
			||||||
 | 
					              table_finder="PartyGaming.exe"
 | 
				
			||||||
 | 
					              screen_name="YOUR SCREEN NAME HERE"
 | 
				
			||||||
 | 
					              site_path="C:/Program Files/PartyGaming/PartyPoker"
 | 
				
			||||||
 | 
					              HH_path="C:/Program Files/PartyGaming/PartyPoker/HandHistory/YOUR SCREEN NAME HERE/"
 | 
				
			||||||
 | 
					              decoder="everleaf_decode_table"
 | 
				
			||||||
 | 
					              converter="PartyPokerToFpdb"
 | 
				
			||||||
 | 
					              supported_games="holdem">
 | 
				
			||||||
 | 
					            <layout fav_seat="0" height="547" max="8" width="794">
 | 
				
			||||||
 | 
					                <location seat="1" x="640" y="64">  </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="650" y="230"> </location>
 | 
				
			||||||
 | 
					                <location seat="3" x="650" y="385"> </location>
 | 
				
			||||||
 | 
					                <location seat="4" x="588" y="425"> </location>
 | 
				
			||||||
 | 
					                <location seat="5" x="92" y="425"> </location>
 | 
				
			||||||
 | 
					                <location seat="6" x="0" y="373"> </location>
 | 
				
			||||||
 | 
					                <location seat="7" x="0" y="223"> </location>
 | 
				
			||||||
 | 
					                <location seat="8" x="25" y="50">  </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					            <layout fav_seat="0" height="547" max="6" width="794">
 | 
				
			||||||
 | 
					                <location seat="1" x="640" y="58"> </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="654" y="288"> </location>
 | 
				
			||||||
 | 
					                <location seat="3" x="615" y="424"> </location>
 | 
				
			||||||
 | 
					                <location seat="4" x="70" y="421"> </location>
 | 
				
			||||||
 | 
					                <location seat="5" x="0" y="280"> </location>
 | 
				
			||||||
 | 
					                <location seat="6" x="70" y="58"> </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					            <layout fav_seat="0" height="547" max="2" width="794">
 | 
				
			||||||
 | 
					                <location seat="1" x="651" y="288"> </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="10"  y="288"> </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					            <layout fav_seat="0" height="547" max="9" width="794">
 | 
				
			||||||
 | 
					                <location seat="1" x="634" y="38">  </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="667" y="184"> </location>
 | 
				
			||||||
 | 
					                <location seat="3" x="667" y="321"> </location>
 | 
				
			||||||
 | 
					                <location seat="4" x="667" y="445"> </location>
 | 
				
			||||||
 | 
					                <location seat="5" x="337" y="459"> </location>
 | 
				
			||||||
 | 
					                <location seat="6" x="0" y="400"> </location>
 | 
				
			||||||
 | 
					                <location seat="7" x="0" y="322"> </location>
 | 
				
			||||||
 | 
					                <location seat="8" x="0" y="181">  </location>
 | 
				
			||||||
 | 
					                <location seat="9" x="70" y="53">  </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					        </site>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <site enabled="False"
 | 
				
			||||||
 | 
					              site_name="Betfair"
 | 
				
			||||||
 | 
					              table_finder="Betfair Poker.exe"
 | 
				
			||||||
 | 
					              screen_name="YOUR SCREEN NAME HERE"
 | 
				
			||||||
 | 
					              site_path="C:/Program Files/Betfair/Betfair Poker/"
 | 
				
			||||||
 | 
					              HH_path="C:/Program Files/Betfair/Betfair Poker/HandHistory/YOUR SCREEN NAME HERE/"
 | 
				
			||||||
 | 
					              decoder="everleaf_decode_table"
 | 
				
			||||||
 | 
					              converter="BetfairToFpdb"
 | 
				
			||||||
 | 
					              supported_games="holdem">
 | 
				
			||||||
 | 
					            <layout fav_seat="0" height="547" max="8" width="794">
 | 
				
			||||||
 | 
					                <location seat="1" x="640" y="64">  </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="650" y="230"> </location>
 | 
				
			||||||
 | 
					                <location seat="3" x="650" y="385"> </location>
 | 
				
			||||||
 | 
					                <location seat="4" x="588" y="425"> </location>
 | 
				
			||||||
 | 
					                <location seat="5" x="92" y="425"> </location>
 | 
				
			||||||
 | 
					                <location seat="6" x="0" y="373"> </location>
 | 
				
			||||||
 | 
					                <location seat="7" x="0" y="223"> </location>
 | 
				
			||||||
 | 
					                <location seat="8" x="25" y="50">  </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					            <layout fav_seat="0" height="547" max="6" width="794">
 | 
				
			||||||
 | 
					                <location seat="1" x="640" y="58"> </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="654" y="288"> </location>
 | 
				
			||||||
 | 
					                <location seat="3" x="615" y="424"> </location>
 | 
				
			||||||
 | 
					                <location seat="4" x="70" y="421"> </location>
 | 
				
			||||||
 | 
					                <location seat="5" x="0" y="280"> </location>
 | 
				
			||||||
 | 
					                <location seat="6" x="70" y="58"> </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					            <layout fav_seat="0" height="547" max="2" width="794">
 | 
				
			||||||
 | 
					                <location seat="1" x="651" y="288"> </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="10"  y="288"> </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					            <layout fav_seat="0" height="547" max="9" width="794">
 | 
				
			||||||
 | 
					                <location seat="1" x="634" y="38">  </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="667" y="184"> </location>
 | 
				
			||||||
 | 
					                <location seat="3" x="667" y="321"> </location>
 | 
				
			||||||
 | 
					                <location seat="4" x="667" y="445"> </location>
 | 
				
			||||||
 | 
					                <location seat="5" x="337" y="459"> </location>
 | 
				
			||||||
 | 
					                <location seat="6" x="0" y="400"> </location>
 | 
				
			||||||
 | 
					                <location seat="7" x="0" y="322"> </location>
 | 
				
			||||||
 | 
					                <location seat="8" x="0" y="181">  </location>
 | 
				
			||||||
 | 
					                <location seat="9" x="70" y="53">  </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					        </site>
 | 
				
			||||||
 | 
					    </supported_sites>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <supported_games>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <game cols="3" db="fpdb" game_name="holdem" rows="2" aux="mucked">
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="0" popup="default" row="0" stat_name="vpip" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="1" popup="default" row="0" stat_name="pfr" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="2" popup="default" row="0" stat_name="ffreq1" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="0" popup="default" row="1" stat_name="n" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="1" popup="default" row="1" stat_name="wtsd" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="2" popup="default" row="1" stat_name="wmsd" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					        </game>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <game cols="3" db="fpdb" game_name="razz" rows="2" aux="stud_mucked">
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="0" popup="default" row="0" stat_name="vpip" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="1" popup="default" row="0" stat_name="pfr" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="2" popup="default" row="0" stat_name="ffreq1" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="0" popup="default" row="1" stat_name="n" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="1" popup="default" row="1" stat_name="wtsd" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="2" popup="default" row="1" stat_name="wmsd" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					        </game>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <game cols="3" db="fpdb" game_name="omahahi" rows="2" aux="mucked">
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="0" popup="default" row="0" stat_name="vpip" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="1" popup="default" row="0" stat_name="pfr" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="2" popup="default" row="0" stat_name="ffreq1" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="0" popup="default" row="1" stat_name="n" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="1" popup="default" row="1" stat_name="wtsd" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="2" popup="default" row="1" stat_name="wmsd" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					        </game>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <game cols="3" db="fpdb" game_name="omahahilo" rows="2" aux="mucked">
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="0" popup="default" row="0" stat_name="vpip" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="1" popup="default" row="0" stat_name="pfr" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="2" popup="default" row="0" stat_name="ffreq1" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="0" popup="default" row="1" stat_name="n" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="1" popup="default" row="1" stat_name="wtsd" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="2" popup="default" row="1" stat_name="wmsd" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					        </game>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <game cols="3" db="fpdb" game_name="studhi" rows="2" aux="stud_mucked">
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="0" popup="default" row="0" stat_name="vpip" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="1" popup="default" row="0" stat_name="pfr" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="2" popup="default" row="0" stat_name="ffreq1" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="0" popup="default" row="1" stat_name="n" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="1" popup="default" row="1" stat_name="wtsd" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="2" popup="default" row="1" stat_name="wmsd" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					        </game>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <game cols="3" db="fpdb" game_name="studhilo" rows="2" aux="stud_mucked">
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="0" popup="default" row="0" stat_name="vpip" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="1" popup="default" row="0" stat_name="pfr" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="2" popup="default" row="0" stat_name="ffreq1" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="0" popup="default" row="1" stat_name="n" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="1" popup="default" row="1" stat_name="wtsd" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					            <stat click="tog_decorate" col="2" popup="default" row="1" stat_name="wmsd" tip="tip1"> </stat>
 | 
				
			||||||
 | 
					        </game>
 | 
				
			||||||
 | 
					    </supported_games>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <popup_windows>
 | 
				
			||||||
 | 
					        <pu pu_name="default">
 | 
				
			||||||
 | 
					            <pu_stat pu_stat_name="n"> </pu_stat>
 | 
				
			||||||
 | 
					            <pu_stat pu_stat_name="vpip"> </pu_stat>
 | 
				
			||||||
 | 
					            <pu_stat pu_stat_name="pfr"> </pu_stat>
 | 
				
			||||||
 | 
					            <pu_stat pu_stat_name="three_B_0"> </pu_stat>
 | 
				
			||||||
 | 
					            <pu_stat pu_stat_name="steal"> </pu_stat>
 | 
				
			||||||
 | 
					            <pu_stat pu_stat_name="f_BB_steal"> </pu_stat>
 | 
				
			||||||
 | 
					            <pu_stat pu_stat_name="f_SB_steal"> </pu_stat>
 | 
				
			||||||
 | 
					            <pu_stat pu_stat_name="wmsd"> </pu_stat>
 | 
				
			||||||
 | 
					            <pu_stat pu_stat_name="wtsd"> </pu_stat>
 | 
				
			||||||
 | 
					            <pu_stat pu_stat_name="WMsF"> </pu_stat>
 | 
				
			||||||
 | 
					            <pu_stat pu_stat_name="a_freq1"> </pu_stat>
 | 
				
			||||||
 | 
					            <pu_stat pu_stat_name="a_freq2"> </pu_stat>
 | 
				
			||||||
 | 
					            <pu_stat pu_stat_name="a_freq3"> </pu_stat>
 | 
				
			||||||
 | 
					            <pu_stat pu_stat_name="a_freq4"> </pu_stat>
 | 
				
			||||||
 | 
					            <pu_stat pu_stat_name="cb1"> </pu_stat>
 | 
				
			||||||
 | 
					            <pu_stat pu_stat_name="cb2"> </pu_stat>
 | 
				
			||||||
 | 
					            <pu_stat pu_stat_name="cb3"> </pu_stat>
 | 
				
			||||||
 | 
					            <pu_stat pu_stat_name="cb4"> </pu_stat>
 | 
				
			||||||
 | 
					            <pu_stat pu_stat_name="ffreq1"> </pu_stat>
 | 
				
			||||||
 | 
					            <pu_stat pu_stat_name="ffreq2"> </pu_stat>
 | 
				
			||||||
 | 
					            <pu_stat pu_stat_name="ffreq3"> </pu_stat>
 | 
				
			||||||
 | 
					            <pu_stat pu_stat_name="ffreq4"> </pu_stat>
 | 
				
			||||||
 | 
					        </pu>
 | 
				
			||||||
 | 
					    </popup_windows>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <aux_windows>
 | 
				
			||||||
 | 
					        <aw card_ht="42" card_wd="30" class="Stud_mucked" cols="11" deck="Cards01.png" module="Mucked" name="stud_mucked" rows="8"> </aw>
 | 
				
			||||||
 | 
					        <aw class="Hello" module="Hello" name="Hello"> </aw>
 | 
				
			||||||
 | 
					        <aw class="Hello_Menu" module="Hello" name="Hello_menu"> </aw>
 | 
				
			||||||
 | 
					        <aw class="Hello_plus" module="Hello" name="Hello_plus"> </aw>
 | 
				
			||||||
 | 
					        <aw card_ht="42" card_wd="30" class="Flop_Mucked" deck="Cards01.png" module="Mucked" name="mucked" opacity="0.7" timeout="5">
 | 
				
			||||||
 | 
					            <layout height="546" max="6" width="792">
 | 
				
			||||||
 | 
					                <location seat="1" x="555" y="169"> </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="572" y="276"> </location>
 | 
				
			||||||
 | 
					                <location seat="3" x="363" y="348"> </location>
 | 
				
			||||||
 | 
					                <location seat="4" x="150" y="273"> </location>
 | 
				
			||||||
 | 
					                <location seat="5" x="150" y="169">  </location>
 | 
				
			||||||
 | 
					                <location seat="6" x="363" y="113">  </location>
 | 
				
			||||||
 | 
					                <location common="1" x="323" y="232"> </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					            <layout height="546" max="9" width="792">
 | 
				
			||||||
 | 
					                <location seat="1" x="486" y="113">  </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="555" y="169"> </location>
 | 
				
			||||||
 | 
					                <location seat="3" x="572" y="276"> </location>
 | 
				
			||||||
 | 
					                <location seat="4" x="522" y="345"> </location>
 | 
				
			||||||
 | 
					                <location seat="5" x="363" y="348"> </location>
 | 
				
			||||||
 | 
					                <location seat="6" x="217" y="341"> </location>
 | 
				
			||||||
 | 
					                <location seat="7" x="150" y="273"> </location>
 | 
				
			||||||
 | 
					                <location seat="8" x="150" y="169">  </location>
 | 
				
			||||||
 | 
					                <location seat="9" x="230" y="115">  </location>
 | 
				
			||||||
 | 
					                <location common="1" x="323" y="232"> </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					            <layout height="546" max="10" width="792">
 | 
				
			||||||
 | 
					                <location seat="1" x="486" y="113">  </location>
 | 
				
			||||||
 | 
					                <location seat="2" x="499" y="138"> </location>
 | 
				
			||||||
 | 
					                <location seat="3" x="522" y="212"> </location>
 | 
				
			||||||
 | 
					                <location seat="4" x="501" y="281"> </location>
 | 
				
			||||||
 | 
					                <location seat="5" x="402" y="323"> </location>
 | 
				
			||||||
 | 
					                <location seat="6" x="243" y="311"> </location>
 | 
				
			||||||
 | 
					                <location seat="7" x="203" y="262"> </location>
 | 
				
			||||||
 | 
					                <location seat="8" x="170" y="185">  </location>
 | 
				
			||||||
 | 
					                <location seat="9" x="183" y="128">  </location>
 | 
				
			||||||
 | 
					                <location seat="10" x="213" y="86">  </location>
 | 
				
			||||||
 | 
					                <location common="1" x="317" y="237"> </location>
 | 
				
			||||||
 | 
					            </layout>
 | 
				
			||||||
 | 
					        </aw>
 | 
				
			||||||
 | 
					    </aux_windows>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <hhcs>
 | 
				
			||||||
 | 
					        <hhc site="PokerStars" converter="PokerStarsToFpdb"/>
 | 
				
			||||||
 | 
					        <hhc site="Full Tilt Poker" converter="FulltiltToFpdb"/>
 | 
				
			||||||
 | 
					        <hhc site="Everleaf" converter="EverleafToFpdb"/>
 | 
				
			||||||
 | 
					        <hhc site="Win2day" converter="Win2dayToFpdb"/>
 | 
				
			||||||
 | 
					        <hhc site="Absolute" converter="AbsoluteToFpdb"/>
 | 
				
			||||||
 | 
					        <hhc site="PartyPoker" converter="PartyPokerToFpdb"/>
 | 
				
			||||||
 | 
					        <hhc site="Betfair" converter="BetfairToFpdb"/>
 | 
				
			||||||
 | 
					        <hhc site="Partouche" converter="PartoucheToFpdb"/>
 | 
				
			||||||
 | 
					    </hhcs>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <supported_databases>
 | 
				
			||||||
 | 
					        <database db_ip="localhost" db_name=":memory:" db_pass="fpdb" db_server="sqlite" db_user="fpdb"/>
 | 
				
			||||||
 | 
					    </supported_databases>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</FreePokerToolsConfig>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -129,9 +129,9 @@ class HUD_main(object):
 | 
				
			||||||
                    m.update_gui(new_hand_id)
 | 
					                    m.update_gui(new_hand_id)
 | 
				
			||||||
                self.hud_dict[table_name].update(new_hand_id, self.config)
 | 
					                self.hud_dict[table_name].update(new_hand_id, self.config)
 | 
				
			||||||
                self.hud_dict[table_name].reposition_windows()
 | 
					                self.hud_dict[table_name].reposition_windows()
 | 
				
			||||||
                return False
 | 
					 | 
				
			||||||
            finally:
 | 
					            finally:
 | 
				
			||||||
                gtk.gdk.threads_leave()
 | 
					                gtk.gdk.threads_leave()
 | 
				
			||||||
 | 
					            return False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.hud_dict[table_name] = Hud.Hud(self, table, max, poker_game, self.config, self.db_connection)
 | 
					        self.hud_dict[table_name] = Hud.Hud(self, table, max, poker_game, self.config, self.db_connection)
 | 
				
			||||||
        self.hud_dict[table_name].table_name = table_name
 | 
					        self.hud_dict[table_name].table_name = table_name
 | 
				
			||||||
| 
						 | 
					@ -166,9 +166,13 @@ class HUD_main(object):
 | 
				
			||||||
#    function idle_func() to be run by the gui thread, at its leisure.
 | 
					#    function idle_func() to be run by the gui thread, at its leisure.
 | 
				
			||||||
        def idle_func():
 | 
					        def idle_func():
 | 
				
			||||||
            gtk.gdk.threads_enter()
 | 
					            gtk.gdk.threads_enter()
 | 
				
			||||||
            try: 
 | 
					            self.hud_dict[table_name].update(new_hand_id, config)
 | 
				
			||||||
                self.hud_dict[table_name].update(new_hand_id, config)
 | 
					            # The HUD could get destroyed in the above call ^^, which leaves us with a KeyError here vv
 | 
				
			||||||
 | 
					            # if we ever get an error we need to expect ^^ then we need to handle it vv - Eric
 | 
				
			||||||
 | 
					            try:
 | 
				
			||||||
                [aw.update_gui(new_hand_id) for aw in self.hud_dict[table_name].aux_windows]
 | 
					                [aw.update_gui(new_hand_id) for aw in self.hud_dict[table_name].aux_windows]
 | 
				
			||||||
 | 
					            except KeyError:
 | 
				
			||||||
 | 
					                pass
 | 
				
			||||||
            finally:
 | 
					            finally:
 | 
				
			||||||
                gtk.gdk.threads_leave()
 | 
					                gtk.gdk.threads_leave()
 | 
				
			||||||
            return False
 | 
					            return False
 | 
				
			||||||
| 
						 | 
					@ -204,7 +208,7 @@ class HUD_main(object):
 | 
				
			||||||
#        get basic info about the new hand from the db
 | 
					#        get basic info about the new hand from the db
 | 
				
			||||||
#        if there is a db error, complain, skip hand, and proceed
 | 
					#        if there is a db error, complain, skip hand, and proceed
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
                (table_name, max, poker_game, type, site_id, site_name, tour_number, tab_number) = \
 | 
					                (table_name, max, poker_game, type, site_id, site_name, num_seats, tour_number, tab_number) = \
 | 
				
			||||||
                                self.db_connection.get_table_info(new_hand_id)
 | 
					                                self.db_connection.get_table_info(new_hand_id)
 | 
				
			||||||
            except Exception, err:
 | 
					            except Exception, err:
 | 
				
			||||||
                self.log.error("db error: skipping %s" % new_hand_id)
 | 
					                self.log.error("db error: skipping %s" % new_hand_id)
 | 
				
			||||||
| 
						 | 
					@ -220,8 +224,16 @@ class HUD_main(object):
 | 
				
			||||||
                # get stats using hud's specific params and get cards
 | 
					                # get stats using hud's specific params and get cards
 | 
				
			||||||
                self.db_connection.init_hud_stat_vars( self.hud_dict[temp_key].hud_params['hud_days']
 | 
					                self.db_connection.init_hud_stat_vars( self.hud_dict[temp_key].hud_params['hud_days']
 | 
				
			||||||
                                                     , self.hud_dict[temp_key].hud_params['h_hud_days'])
 | 
					                                                     , self.hud_dict[temp_key].hud_params['h_hud_days'])
 | 
				
			||||||
                stat_dict = self.db_connection.get_stats_from_hand(new_hand_id, type, self.hud_dict[temp_key].hud_params, self.hero_ids[site_id])
 | 
					                stat_dict = self.db_connection.get_stats_from_hand(new_hand_id, type, self.hud_dict[temp_key].hud_params
 | 
				
			||||||
                self.hud_dict[temp_key].stat_dict = stat_dict
 | 
					                                                                  ,self.hero_ids[site_id], num_seats)
 | 
				
			||||||
 | 
					                try:
 | 
				
			||||||
 | 
					                    self.hud_dict[temp_key].stat_dict = stat_dict
 | 
				
			||||||
 | 
					                except KeyError:    # HUD instance has been killed off, key is stale
 | 
				
			||||||
 | 
					                    sys.stderr.write('hud_dict[%s] was not found\n' % temp_key)
 | 
				
			||||||
 | 
					                    sys.stderr.write('will not send hand\n')
 | 
				
			||||||
 | 
					                    # Unlocks table, copied from end of function
 | 
				
			||||||
 | 
					                    self.db_connection.connection.rollback()
 | 
				
			||||||
 | 
					                    return
 | 
				
			||||||
                cards      = self.db_connection.get_cards(new_hand_id)
 | 
					                cards      = self.db_connection.get_cards(new_hand_id)
 | 
				
			||||||
                comm_cards = self.db_connection.get_common_cards(new_hand_id)
 | 
					                comm_cards = self.db_connection.get_common_cards(new_hand_id)
 | 
				
			||||||
                if comm_cards != {}: # stud!
 | 
					                if comm_cards != {}: # stud!
 | 
				
			||||||
| 
						 | 
					@ -234,7 +246,8 @@ class HUD_main(object):
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                # get stats using default params--also get cards
 | 
					                # get stats using default params--also get cards
 | 
				
			||||||
                self.db_connection.init_hud_stat_vars( self.hud_params['hud_days'], self.hud_params['h_hud_days'] )
 | 
					                self.db_connection.init_hud_stat_vars( self.hud_params['hud_days'], self.hud_params['h_hud_days'] )
 | 
				
			||||||
                stat_dict = self.db_connection.get_stats_from_hand(new_hand_id, type, self.hud_params, self.hero_ids[site_id])
 | 
					                stat_dict = self.db_connection.get_stats_from_hand(new_hand_id, type, self.hud_params
 | 
				
			||||||
 | 
					                                                                  ,self.hero_ids[site_id], num_seats)
 | 
				
			||||||
                cards      = self.db_connection.get_cards(new_hand_id)
 | 
					                cards      = self.db_connection.get_cards(new_hand_id)
 | 
				
			||||||
                comm_cards = self.db_connection.get_common_cards(new_hand_id)
 | 
					                comm_cards = self.db_connection.get_common_cards(new_hand_id)
 | 
				
			||||||
                if comm_cards != {}: # stud!
 | 
					                if comm_cards != {}: # stud!
 | 
				
			||||||
| 
						 | 
					@ -253,7 +266,12 @@ class HUD_main(object):
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
                    tablewindow.max = max
 | 
					                    tablewindow.max = max
 | 
				
			||||||
                    tablewindow.site = site_name
 | 
					                    tablewindow.site = site_name
 | 
				
			||||||
                    self.create_HUD(new_hand_id, tablewindow, temp_key, max, poker_game, type, stat_dict, cards)
 | 
					                    # Test that the table window still exists
 | 
				
			||||||
 | 
					                    if hasattr(tablewindow, 'number'):
 | 
				
			||||||
 | 
					                        self.create_HUD(new_hand_id, tablewindow, temp_key, max, poker_game, type, stat_dict, cards)
 | 
				
			||||||
 | 
					                    else:
 | 
				
			||||||
 | 
					                        sys.stderr.write('Table "%s" no longer exists\n', table_name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            self.db_connection.connection.rollback()
 | 
					            self.db_connection.connection.rollback()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if __name__== "__main__":
 | 
					if __name__== "__main__":
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -210,24 +210,24 @@ db: a connected fpdb_db object"""
 | 
				
			||||||
        #####
 | 
					        #####
 | 
				
			||||||
        # End prep functions
 | 
					        # End prep functions
 | 
				
			||||||
        #####
 | 
					        #####
 | 
				
			||||||
 | 
					 | 
				
			||||||
        # HandsActions - all actions for all players for all streets - self.actions
 | 
					 | 
				
			||||||
        # HudCache data can be generated from HandsActions (HandsPlayers?)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        # Hands - Summary information of hand indexed by handId - gameinfo
 | 
					 | 
				
			||||||
        hh = self.stats.getHands()
 | 
					        hh = self.stats.getHands()
 | 
				
			||||||
        hh['gameTypeId'] = gtid
 | 
					 | 
				
			||||||
        # seats TINYINT NOT NULL,
 | 
					 | 
				
			||||||
        hh['seats'] = len(sqlids)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #print hh
 | 
					        if not db.isDuplicate(gtid, hh['siteHandNo']):
 | 
				
			||||||
        handid = db.storeHand(hh)
 | 
					            # Hands - Summary information of hand indexed by handId - gameinfo
 | 
				
			||||||
        # HandsPlayers - ? ... Do we fix winnings?
 | 
					            hh['gameTypeId'] = gtid
 | 
				
			||||||
        db.storeHandsPlayers(handid, sqlids, self.stats.getHandsPlayers())
 | 
					            # seats TINYINT NOT NULL,
 | 
				
			||||||
        # Tourneys ?
 | 
					            hh['seats'] = len(sqlids)
 | 
				
			||||||
        # TourneysPlayers
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        pass
 | 
					            handid = db.storeHand(hh)
 | 
				
			||||||
 | 
					            db.storeHandsPlayers(handid, sqlids, self.stats.getHandsPlayers())
 | 
				
			||||||
 | 
					            # HandsActions - all actions for all players for all streets - self.actions
 | 
				
			||||||
 | 
					            # HudCache data can be generated from HandsActions (HandsPlayers?)
 | 
				
			||||||
 | 
					            # Tourneys ?
 | 
				
			||||||
 | 
					            # TourneysPlayers
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            log.info("Hand.insert(): hid #: %s is a duplicate" % hh['siteHandNo'])
 | 
				
			||||||
 | 
					            #Raise Duplicate exception?
 | 
				
			||||||
 | 
					            pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def select(self, handId):
 | 
					    def select(self, handId):
 | 
				
			||||||
        """ Function to create Hand object from database """
 | 
					        """ Function to create Hand object from database """
 | 
				
			||||||
| 
						 | 
					@ -510,7 +510,7 @@ Map the tuple self.gametype onto the pokerstars string describing it
 | 
				
			||||||
    def printHand(self):
 | 
					    def printHand(self):
 | 
				
			||||||
        self.writeHand(sys.stdout)
 | 
					        self.writeHand(sys.stdout)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def actionString(self, act):
 | 
					    def actionString(self, act, street=None):
 | 
				
			||||||
        if act[1] == 'folds':
 | 
					        if act[1] == 'folds':
 | 
				
			||||||
            return ("%s: folds " %(act[0]))
 | 
					            return ("%s: folds " %(act[0]))
 | 
				
			||||||
        elif act[1] == 'checks':
 | 
					        elif act[1] == 'checks':
 | 
				
			||||||
| 
						 | 
					@ -535,7 +535,7 @@ Map the tuple self.gametype onto the pokerstars string describing it
 | 
				
			||||||
        elif act[1] == 'bringin':
 | 
					        elif act[1] == 'bringin':
 | 
				
			||||||
            return ("%s: brings in for %s%s%s" %(act[0], self.sym, act[2], ' and is all-in' if act[3] else ''))
 | 
					            return ("%s: brings in for %s%s%s" %(act[0], self.sym, act[2], ' and is all-in' if act[3] else ''))
 | 
				
			||||||
        elif act[1] == 'discards':
 | 
					        elif act[1] == 'discards':
 | 
				
			||||||
            return ("%s: discards %s %s%s" %(act[0], act[2], 'card' if act[2] == 1 else 'cards' , " [" + " ".join(self.discards[act[0]]['DRAWONE']) + "]" if self.hero == act[0] else ''))
 | 
					            return ("%s: discards %s %s%s" %(act[0], act[2], 'card' if act[2] == 1 else 'cards' , " [" + " ".join(self.discards[street][act[0]]) + "]" if self.hero == act[0] else ''))
 | 
				
			||||||
        elif act[1] == 'stands pat':
 | 
					        elif act[1] == 'stands pat':
 | 
				
			||||||
            return ("%s: stands pat" %(act[0]))
 | 
					            return ("%s: stands pat" %(act[0]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -872,7 +872,7 @@ class DrawHand(Hand):
 | 
				
			||||||
        self.streetList = ['BLINDSANTES', 'DEAL', 'DRAWONE', 'DRAWTWO', 'DRAWTHREE']
 | 
					        self.streetList = ['BLINDSANTES', 'DEAL', 'DRAWONE', 'DRAWTWO', 'DRAWTHREE']
 | 
				
			||||||
        self.allStreets = ['BLINDSANTES', 'DEAL', 'DRAWONE', 'DRAWTWO', 'DRAWTHREE']
 | 
					        self.allStreets = ['BLINDSANTES', 'DEAL', 'DRAWONE', 'DRAWTWO', 'DRAWTHREE']
 | 
				
			||||||
        self.holeStreets = ['DEAL', 'DRAWONE', 'DRAWTWO', 'DRAWTHREE']
 | 
					        self.holeStreets = ['DEAL', 'DRAWONE', 'DRAWTWO', 'DRAWTHREE']
 | 
				
			||||||
        self.actionStreets =  ['PREDEAL', 'DEAL', 'DRAWONE', 'DRAWTWO', 'DRAWTHREE']
 | 
					        self.actionStreets =  ['BLINDSANTES', 'DEAL', 'DRAWONE', 'DRAWTWO', 'DRAWTHREE']
 | 
				
			||||||
        self.communityStreets = []
 | 
					        self.communityStreets = []
 | 
				
			||||||
        Hand.__init__(self, sitename, gametype, handText)
 | 
					        Hand.__init__(self, sitename, gametype, handText)
 | 
				
			||||||
        self.sb = gametype['sb']
 | 
					        self.sb = gametype['sb']
 | 
				
			||||||
| 
						 | 
					@ -953,6 +953,13 @@ class DrawHand(Hand):
 | 
				
			||||||
            act = (player, 'discards', num)
 | 
					            act = (player, 'discards', num)
 | 
				
			||||||
        self.actions[street].append(act)
 | 
					        self.actions[street].append(act)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def holecardsAsSet(self, street, player):
 | 
				
			||||||
 | 
					        """Return holdcards: (oc, nc) as set()"""
 | 
				
			||||||
 | 
					        (nc,oc) = self.holecards[street][player]
 | 
				
			||||||
 | 
					        nc = set(nc)
 | 
				
			||||||
 | 
					        oc = set(oc)
 | 
				
			||||||
 | 
					        return (nc, oc)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def getStreetTotals(self):
 | 
					    def getStreetTotals(self):
 | 
				
			||||||
        # street1Pot INT,                  /* pot size at flop/street4 */
 | 
					        # street1Pot INT,                  /* pot size at flop/street4 */
 | 
				
			||||||
        # street2Pot INT,                  /* pot size at turn/street5 */
 | 
					        # street2Pot INT,                  /* pot size at turn/street5 */
 | 
				
			||||||
| 
						 | 
					@ -979,18 +986,19 @@ class DrawHand(Hand):
 | 
				
			||||||
        if 'DEAL' in self.actions:
 | 
					        if 'DEAL' in self.actions:
 | 
				
			||||||
            print >>fh, _("*** DEALING HANDS ***")
 | 
					            print >>fh, _("*** DEALING HANDS ***")
 | 
				
			||||||
            for player in [x[1] for x in self.players if x[1] in players_who_act_ondeal]:
 | 
					            for player in [x[1] for x in self.players if x[1] in players_who_act_ondeal]:
 | 
				
			||||||
                if 'DEAL' in self.holecards[player]:
 | 
					                if 'DEAL' in self.holecards:
 | 
				
			||||||
                    (nc,oc) = self.holecards[player]['DEAL']
 | 
					                    if self.holecards['DEAL'].has_key(player):
 | 
				
			||||||
                    print >>fh, _("Dealt to %s: [%s]") % (player, " ".join(nc))
 | 
					                        (nc,oc) = self.holecards['DEAL'][player]
 | 
				
			||||||
 | 
					                        print >>fh, _("Dealt to %s: [%s]") % (player, " ".join(nc))
 | 
				
			||||||
            for act in self.actions['DEAL']:
 | 
					            for act in self.actions['DEAL']:
 | 
				
			||||||
                print >>fh, self.actionString(act)
 | 
					                print >>fh, self.actionString(act, 'DEAL')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if 'DRAWONE' in self.actions:
 | 
					        if 'DRAWONE' in self.actions:
 | 
				
			||||||
            print >>fh, _("*** FIRST DRAW ***")
 | 
					            print >>fh, _("*** FIRST DRAW ***")
 | 
				
			||||||
            for act in self.actions['DRAWONE']:
 | 
					            for act in self.actions['DRAWONE']:
 | 
				
			||||||
                print >>fh, self.actionString(act)
 | 
					                print >>fh, self.actionString(act, 'DRAWONE')
 | 
				
			||||||
                if act[0] == self.hero and act[1] == 'discards':
 | 
					                if act[0] == self.hero and act[1] == 'discards':
 | 
				
			||||||
                    (nc,oc) = self.holecards['DRAWONE'][act[0]]
 | 
					                    (nc,oc) = self.holecardsAsSet('DRAWONE', act[0])
 | 
				
			||||||
                    dc = self.discards['DRAWONE'][act[0]]
 | 
					                    dc = self.discards['DRAWONE'][act[0]]
 | 
				
			||||||
                    kc = oc - dc
 | 
					                    kc = oc - dc
 | 
				
			||||||
                    print >>fh, _("Dealt to %s [%s] [%s]" % (act[0], " ".join(kc), " ".join(nc)))
 | 
					                    print >>fh, _("Dealt to %s [%s] [%s]" % (act[0], " ".join(kc), " ".join(nc)))
 | 
				
			||||||
| 
						 | 
					@ -998,9 +1006,9 @@ class DrawHand(Hand):
 | 
				
			||||||
        if 'DRAWTWO' in self.actions:
 | 
					        if 'DRAWTWO' in self.actions:
 | 
				
			||||||
            print >>fh, _("*** SECOND DRAW ***")
 | 
					            print >>fh, _("*** SECOND DRAW ***")
 | 
				
			||||||
            for act in self.actions['DRAWTWO']:
 | 
					            for act in self.actions['DRAWTWO']:
 | 
				
			||||||
                print >>fh, self.actionString(act)
 | 
					                print >>fh, self.actionString(act, 'DRAWTWO')
 | 
				
			||||||
                if act[0] == self.hero and act[1] == 'discards':
 | 
					                if act[0] == self.hero and act[1] == 'discards':
 | 
				
			||||||
                    (nc,oc) = self.holecards['DRAWTWO'][act[0]]
 | 
					                    (nc,oc) = self.holecardsAsSet('DRAWONE', act[0])
 | 
				
			||||||
                    dc = self.discards['DRAWTWO'][act[0]]
 | 
					                    dc = self.discards['DRAWTWO'][act[0]]
 | 
				
			||||||
                    kc = oc - dc
 | 
					                    kc = oc - dc
 | 
				
			||||||
                    print >>fh, _("Dealt to %s [%s] [%s]" % (act[0], " ".join(kc), " ".join(nc)))
 | 
					                    print >>fh, _("Dealt to %s [%s] [%s]" % (act[0], " ".join(kc), " ".join(nc)))
 | 
				
			||||||
| 
						 | 
					@ -1008,9 +1016,9 @@ class DrawHand(Hand):
 | 
				
			||||||
        if 'DRAWTHREE' in self.actions:
 | 
					        if 'DRAWTHREE' in self.actions:
 | 
				
			||||||
            print >>fh, _("*** THIRD DRAW ***")
 | 
					            print >>fh, _("*** THIRD DRAW ***")
 | 
				
			||||||
            for act in self.actions['DRAWTHREE']:
 | 
					            for act in self.actions['DRAWTHREE']:
 | 
				
			||||||
                print >>fh, self.actionString(act)
 | 
					                print >>fh, self.actionString(act, 'DRAWTHREE')
 | 
				
			||||||
                if act[0] == self.hero and act[1] == 'discards':
 | 
					                if act[0] == self.hero and act[1] == 'discards':
 | 
				
			||||||
                    (nc,oc) = self.holecards['DRAWTHREE'][act[0]]
 | 
					                    (nc,oc) = self.holecardsAsSet('DRAWONE', act[0])
 | 
				
			||||||
                    dc = self.discards['DRAWTHREE'][act[0]]
 | 
					                    dc = self.discards['DRAWTHREE'][act[0]]
 | 
				
			||||||
                    kc = oc - dc
 | 
					                    kc = oc - dc
 | 
				
			||||||
                    print >>fh, _("Dealt to %s [%s] [%s]" % (act[0], " ".join(kc), " ".join(nc)))
 | 
					                    print >>fh, _("Dealt to %s [%s] [%s]" % (act[0], " ".join(kc), " ".join(nc)))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -94,7 +94,7 @@ follow :  whether to tail -f the input"""
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
                    log.info("Created directory '%s'" % out_dir)
 | 
					                    log.info("Created directory '%s'" % out_dir)
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
                self.out_fh = codecs.open(self.out_path, 'w', 'cp1252')
 | 
					                self.out_fh = codecs.open(self.out_path, 'w', 'utf8')
 | 
				
			||||||
            except:
 | 
					            except:
 | 
				
			||||||
                log.error("out_path %s couldn't be opened" % (self.out_path))
 | 
					                log.error("out_path %s couldn't be opened" % (self.out_path))
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
| 
						 | 
					@ -261,8 +261,8 @@ which it expects to find at self.re_TailSplitHands -- see for e.g. Everleaf.py.
 | 
				
			||||||
        gametype = self.determineGameType(handText)
 | 
					        gametype = self.determineGameType(handText)
 | 
				
			||||||
        log.debug("gametype %s" % gametype)
 | 
					        log.debug("gametype %s" % gametype)
 | 
				
			||||||
        hand = None
 | 
					        hand = None
 | 
				
			||||||
 | 
					        l = None
 | 
				
			||||||
        if gametype is None: 
 | 
					        if gametype is None: 
 | 
				
			||||||
            l = None
 | 
					 | 
				
			||||||
            gametype = "unmatched"
 | 
					            gametype = "unmatched"
 | 
				
			||||||
            # TODO: not ideal, just trying to not error.
 | 
					            # TODO: not ideal, just trying to not error.
 | 
				
			||||||
            # TODO: Need to count failed hands.
 | 
					            # TODO: Need to count failed hands.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										264
									
								
								pyfpdb/Hud.py
									
									
									
									
									
								
							
							
						
						
									
										264
									
								
								pyfpdb/Hud.py
									
									
									
									
									
								
							| 
						 | 
					@ -6,17 +6,17 @@ Create and manage the hud overlays.
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
#    Copyright 2008, 2009  Ray E. Barker
 | 
					#    Copyright 2008, 2009  Ray E. Barker
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#    
 | 
					#
 | 
				
			||||||
#    This program is free software; you can redistribute it and/or modify
 | 
					#    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
 | 
					#    it under the terms of the GNU General Public License as published by
 | 
				
			||||||
#    the Free Software Foundation; either version 2 of the License, or
 | 
					#    the Free Software Foundation; either version 2 of the License, or
 | 
				
			||||||
#    (at your option) any later version.
 | 
					#    (at your option) any later version.
 | 
				
			||||||
#    
 | 
					#
 | 
				
			||||||
#    This program is distributed in the hope that it will be useful,
 | 
					#    This program is distributed in the hope that it will be useful,
 | 
				
			||||||
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					#    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 | 
					#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 | 
				
			||||||
#    GNU General Public License for more details.
 | 
					#    GNU General Public License for more details.
 | 
				
			||||||
#    
 | 
					#
 | 
				
			||||||
#    You should have received a copy of the GNU General Public License
 | 
					#    You should have received a copy of the GNU General Public License
 | 
				
			||||||
#    along with this program; if not, write to the Free Software
 | 
					#    along with this program; if not, write to the Free Software
 | 
				
			||||||
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 | 
					#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 | 
				
			||||||
| 
						 | 
					@ -57,7 +57,7 @@ def importName(module_name, name):
 | 
				
			||||||
    return(getattr(module, name))
 | 
					    return(getattr(module, name))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Hud:
 | 
					class Hud:
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    def __init__(self, parent, table, max, poker_game, config, db_connection):
 | 
					    def __init__(self, parent, table, max, poker_game, config, db_connection):
 | 
				
			||||||
#    __init__ is (now) intended to be called from the stdin thread, so it
 | 
					#    __init__ is (now) intended to be called from the stdin thread, so it
 | 
				
			||||||
#    cannot touch the gui
 | 
					#    cannot touch the gui
 | 
				
			||||||
| 
						 | 
					@ -74,16 +74,16 @@ class Hud:
 | 
				
			||||||
        self.site          = table.site
 | 
					        self.site          = table.site
 | 
				
			||||||
        self.mw_created    = False
 | 
					        self.mw_created    = False
 | 
				
			||||||
        self.hud_params    = parent.hud_params
 | 
					        self.hud_params    = parent.hud_params
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.stat_windows  = {}
 | 
					        self.stat_windows  = {}
 | 
				
			||||||
        self.popup_windows = {}
 | 
					        self.popup_windows = {}
 | 
				
			||||||
        self.aux_windows   = []
 | 
					        self.aux_windows   = []
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        (font, font_size) = config.get_default_font(self.table.site)
 | 
					        (font, font_size) = config.get_default_font(self.table.site)
 | 
				
			||||||
        self.colors        = config.get_default_colors(self.table.site)
 | 
					        self.colors        = config.get_default_colors(self.table.site)
 | 
				
			||||||
        self.hud_ui     = config.get_hud_ui_parameters()
 | 
					        self.hud_ui     = config.get_hud_ui_parameters()
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        self.backgroundcolor = gtk.gdk.color_parse(self.colors['hudbgcolor'])
 | 
					        self.backgroundcolor = gtk.gdk.color_parse(self.colors['hudbgcolor'])
 | 
				
			||||||
        self.foregroundcolor = gtk.gdk.color_parse(self.colors['hudfgcolor'])
 | 
					        self.foregroundcolor = gtk.gdk.color_parse(self.colors['hudfgcolor'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -98,7 +98,7 @@ class Hud:
 | 
				
			||||||
                if my_import == None:
 | 
					                if my_import == None:
 | 
				
			||||||
                    continue
 | 
					                    continue
 | 
				
			||||||
                self.aux_windows.append(my_import(self, config, aux_params))
 | 
					                self.aux_windows.append(my_import(self, config, aux_params))
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        self.creation_attrs = None
 | 
					        self.creation_attrs = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def create_mw(self):
 | 
					    def create_mw(self):
 | 
				
			||||||
| 
						 | 
					@ -110,16 +110,16 @@ class Hud:
 | 
				
			||||||
        win.set_skip_taskbar_hint(True)
 | 
					        win.set_skip_taskbar_hint(True)
 | 
				
			||||||
        win.set_decorated(False)
 | 
					        win.set_decorated(False)
 | 
				
			||||||
        win.set_opacity(self.colors["hudopacity"])
 | 
					        win.set_opacity(self.colors["hudopacity"])
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        eventbox = gtk.EventBox()
 | 
					        eventbox = gtk.EventBox()
 | 
				
			||||||
        label = gtk.Label(self.hud_ui['label'])
 | 
					        label = gtk.Label(self.hud_ui['label'])
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        win.add(eventbox)
 | 
					        win.add(eventbox)
 | 
				
			||||||
        eventbox.add(label)
 | 
					        eventbox.add(label)
 | 
				
			||||||
                        
 | 
					
 | 
				
			||||||
        label.modify_bg(gtk.STATE_NORMAL, self.backgroundcolor)
 | 
					        label.modify_bg(gtk.STATE_NORMAL, self.backgroundcolor)
 | 
				
			||||||
        label.modify_fg(gtk.STATE_NORMAL, self.foregroundcolor)
 | 
					        label.modify_fg(gtk.STATE_NORMAL, self.foregroundcolor)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        eventbox.modify_bg(gtk.STATE_NORMAL, self.backgroundcolor)
 | 
					        eventbox.modify_bg(gtk.STATE_NORMAL, self.backgroundcolor)
 | 
				
			||||||
        eventbox.modify_fg(gtk.STATE_NORMAL, self.foregroundcolor)
 | 
					        eventbox.modify_fg(gtk.STATE_NORMAL, self.foregroundcolor)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -128,20 +128,20 @@ class Hud:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#    A popup menu for the main window
 | 
					#    A popup menu for the main window
 | 
				
			||||||
        menu = gtk.Menu()
 | 
					        menu = gtk.Menu()
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        killitem = gtk.MenuItem('Kill This HUD')
 | 
					        killitem = gtk.MenuItem('Kill This HUD')
 | 
				
			||||||
        menu.append(killitem)
 | 
					        menu.append(killitem)
 | 
				
			||||||
        if self.parent is not None:
 | 
					        if self.parent is not None:
 | 
				
			||||||
            killitem.connect("activate", self.parent.kill_hud, self.table_name)
 | 
					            killitem.connect("activate", self.parent.kill_hud, self.table_name)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        saveitem = gtk.MenuItem('Save HUD Layout')
 | 
					        saveitem = gtk.MenuItem('Save HUD Layout')
 | 
				
			||||||
        menu.append(saveitem)
 | 
					        menu.append(saveitem)
 | 
				
			||||||
        saveitem.connect("activate", self.save_layout)
 | 
					        saveitem.connect("activate", self.save_layout)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        repositem = gtk.MenuItem('Reposition StatWindows')
 | 
					        repositem = gtk.MenuItem('Reposition StatWindows')
 | 
				
			||||||
        menu.append(repositem)
 | 
					        menu.append(repositem)
 | 
				
			||||||
        repositem.connect("activate", self.reposition_windows)
 | 
					        repositem.connect("activate", self.reposition_windows)
 | 
				
			||||||
                
 | 
					
 | 
				
			||||||
        aggitem = gtk.MenuItem('Show Player Stats')
 | 
					        aggitem = gtk.MenuItem('Show Player Stats')
 | 
				
			||||||
        menu.append(aggitem)
 | 
					        menu.append(aggitem)
 | 
				
			||||||
        self.aggMenu = gtk.Menu()
 | 
					        self.aggMenu = gtk.Menu()
 | 
				
			||||||
| 
						 | 
					@ -150,49 +150,67 @@ class Hud:
 | 
				
			||||||
        item = gtk.CheckMenuItem('For This Blind Level Only')
 | 
					        item = gtk.CheckMenuItem('For This Blind Level Only')
 | 
				
			||||||
        self.aggMenu.append(item)
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
        item.connect("activate", self.set_aggregation, ('P',1))
 | 
					        item.connect("activate", self.set_aggregation, ('P',1))
 | 
				
			||||||
        setattr(self, 'h_aggBBmultItem1', item) 
 | 
					        setattr(self, 'h_aggBBmultItem1', item)
 | 
				
			||||||
        # 
 | 
					        #
 | 
				
			||||||
        item = gtk.MenuItem('For Multiple Blind Levels:')
 | 
					        item = gtk.MenuItem('For Multiple Blind Levels:')
 | 
				
			||||||
        self.aggMenu.append(item)
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
        # 
 | 
					        #
 | 
				
			||||||
        item = gtk.CheckMenuItem('  0.5 to 2.0 x Current Blinds')
 | 
					        item = gtk.CheckMenuItem('  0.5 to 2.0 x Current Blinds')
 | 
				
			||||||
        self.aggMenu.append(item)
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
        item.connect("activate", self.set_aggregation, ('P',2))
 | 
					        item.connect("activate", self.set_aggregation, ('P',2))
 | 
				
			||||||
        setattr(self, 'h_aggBBmultItem2', item) 
 | 
					        setattr(self, 'h_aggBBmultItem2', item)
 | 
				
			||||||
        # 
 | 
					        #
 | 
				
			||||||
        item = gtk.CheckMenuItem('  0.33 to 3.0 x Current Blinds')
 | 
					        item = gtk.CheckMenuItem('  0.33 to 3.0 x Current Blinds')
 | 
				
			||||||
        self.aggMenu.append(item)
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
        item.connect("activate", self.set_aggregation, ('P',3))
 | 
					        item.connect("activate", self.set_aggregation, ('P',3))
 | 
				
			||||||
        setattr(self, 'h_aggBBmultItem3', item) 
 | 
					        setattr(self, 'h_aggBBmultItem3', item)
 | 
				
			||||||
        # 
 | 
					        #
 | 
				
			||||||
        item = gtk.CheckMenuItem('  0.1 to 10 x Current Blinds')
 | 
					        item = gtk.CheckMenuItem('  0.1 to 10 x Current Blinds')
 | 
				
			||||||
        self.aggMenu.append(item)
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
        item.connect("activate", self.set_aggregation, ('P',10))
 | 
					        item.connect("activate", self.set_aggregation, ('P',10))
 | 
				
			||||||
        setattr(self, 'h_aggBBmultItem10', item) 
 | 
					        setattr(self, 'h_aggBBmultItem10', item)
 | 
				
			||||||
        # 
 | 
					        #
 | 
				
			||||||
        item = gtk.CheckMenuItem('  All Levels')
 | 
					        item = gtk.CheckMenuItem('  All Levels')
 | 
				
			||||||
        self.aggMenu.append(item)
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
        item.connect("activate", self.set_aggregation, ('P',10000))
 | 
					        item.connect("activate", self.set_aggregation, ('P',10000))
 | 
				
			||||||
        setattr(self, 'h_aggBBmultItem10000', item) 
 | 
					        setattr(self, 'h_aggBBmultItem10000', item) 
 | 
				
			||||||
        # 
 | 
					        # 
 | 
				
			||||||
        item = gtk.MenuItem('Since:')
 | 
					        item = gtk.MenuItem('For #Seats:')
 | 
				
			||||||
        self.aggMenu.append(item)
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
        # 
 | 
					        # 
 | 
				
			||||||
 | 
					        item = gtk.CheckMenuItem('  Any Number')
 | 
				
			||||||
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
 | 
					        item.connect("activate", self.set_seats_style, ('P','A'))
 | 
				
			||||||
 | 
					        setattr(self, 'h_seatsStyleOptionA', item)
 | 
				
			||||||
 | 
					        # 
 | 
				
			||||||
 | 
					        item = gtk.CheckMenuItem('  Custom')
 | 
				
			||||||
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
 | 
					        item.connect("activate", self.set_seats_style, ('P','C'))
 | 
				
			||||||
 | 
					        setattr(self, 'h_seatsStyleOptionC', item) 
 | 
				
			||||||
 | 
					        # 
 | 
				
			||||||
 | 
					        item = gtk.CheckMenuItem('  Exact')
 | 
				
			||||||
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
 | 
					        item.connect("activate", self.set_seats_style, ('P','E'))
 | 
				
			||||||
 | 
					        setattr(self, 'h_seatsStyleOptionE', item) 
 | 
				
			||||||
 | 
					        # 
 | 
				
			||||||
 | 
					        item = gtk.MenuItem('Since:')
 | 
				
			||||||
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
 | 
					        #
 | 
				
			||||||
        item = gtk.CheckMenuItem('  All Time')
 | 
					        item = gtk.CheckMenuItem('  All Time')
 | 
				
			||||||
        self.aggMenu.append(item)
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
        item.connect("activate", self.set_hud_style, ('P','A'))
 | 
					        item.connect("activate", self.set_hud_style, ('P','A'))
 | 
				
			||||||
        setattr(self, 'h_hudStyleOptionA', item)
 | 
					        setattr(self, 'h_hudStyleOptionA', item)
 | 
				
			||||||
        # 
 | 
					        #
 | 
				
			||||||
        item = gtk.CheckMenuItem('  Session')
 | 
					        item = gtk.CheckMenuItem('  Session')
 | 
				
			||||||
        self.aggMenu.append(item)
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
        item.connect("activate", self.set_hud_style, ('P','S'))
 | 
					        item.connect("activate", self.set_hud_style, ('P','S'))
 | 
				
			||||||
        setattr(self, 'h_hudStyleOptionS', item) 
 | 
					        setattr(self, 'h_hudStyleOptionS', item)
 | 
				
			||||||
        # 
 | 
					        #
 | 
				
			||||||
        item = gtk.CheckMenuItem('  %s Days' % (self.hud_params['h_hud_days']))
 | 
					        item = gtk.CheckMenuItem('  %s Days' % (self.hud_params['h_hud_days']))
 | 
				
			||||||
        self.aggMenu.append(item)
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
        item.connect("activate", self.set_hud_style, ('P','T'))
 | 
					        item.connect("activate", self.set_hud_style, ('P','T'))
 | 
				
			||||||
        setattr(self, 'h_hudStyleOptionT', item) 
 | 
					        setattr(self, 'h_hudStyleOptionT', item)
 | 
				
			||||||
                
 | 
					
 | 
				
			||||||
        aggitem = gtk.MenuItem('Show Opponent Stats')
 | 
					        aggitem = gtk.MenuItem('Show Opponent Stats')
 | 
				
			||||||
        menu.append(aggitem)
 | 
					        menu.append(aggitem)
 | 
				
			||||||
        self.aggMenu = gtk.Menu()
 | 
					        self.aggMenu = gtk.Menu()
 | 
				
			||||||
| 
						 | 
					@ -201,48 +219,66 @@ class Hud:
 | 
				
			||||||
        item = gtk.CheckMenuItem('For This Blind Level Only')
 | 
					        item = gtk.CheckMenuItem('For This Blind Level Only')
 | 
				
			||||||
        self.aggMenu.append(item)
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
        item.connect("activate", self.set_aggregation, ('O',1))
 | 
					        item.connect("activate", self.set_aggregation, ('O',1))
 | 
				
			||||||
        setattr(self, 'aggBBmultItem1', item) 
 | 
					        setattr(self, 'aggBBmultItem1', item)
 | 
				
			||||||
        # 
 | 
					        #
 | 
				
			||||||
        item = gtk.MenuItem('For Multiple Blind Levels:')
 | 
					        item = gtk.MenuItem('For Multiple Blind Levels:')
 | 
				
			||||||
        self.aggMenu.append(item)
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
        # 
 | 
					        #
 | 
				
			||||||
        item = gtk.CheckMenuItem('  0.5 to 2.0 x Current Blinds')
 | 
					        item = gtk.CheckMenuItem('  0.5 to 2.0 x Current Blinds')
 | 
				
			||||||
        self.aggMenu.append(item)
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
        item.connect("activate", self.set_aggregation, ('O',2))
 | 
					        item.connect("activate", self.set_aggregation, ('O',2))
 | 
				
			||||||
        setattr(self, 'aggBBmultItem2', item) 
 | 
					        setattr(self, 'aggBBmultItem2', item)
 | 
				
			||||||
        # 
 | 
					        #
 | 
				
			||||||
        item = gtk.CheckMenuItem('  0.33 to 3.0 x Current Blinds')
 | 
					        item = gtk.CheckMenuItem('  0.33 to 3.0 x Current Blinds')
 | 
				
			||||||
        self.aggMenu.append(item)
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
        item.connect("activate", self.set_aggregation, ('O',3))
 | 
					        item.connect("activate", self.set_aggregation, ('O',3))
 | 
				
			||||||
        setattr(self, 'aggBBmultItem3', item) 
 | 
					        setattr(self, 'aggBBmultItem3', item)
 | 
				
			||||||
        # 
 | 
					        #
 | 
				
			||||||
        item = gtk.CheckMenuItem('  0.1 to 10 x Current Blinds')
 | 
					        item = gtk.CheckMenuItem('  0.1 to 10 x Current Blinds')
 | 
				
			||||||
        self.aggMenu.append(item)
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
        item.connect("activate", self.set_aggregation, ('O',10))
 | 
					        item.connect("activate", self.set_aggregation, ('O',10))
 | 
				
			||||||
        setattr(self, 'aggBBmultItem10', item) 
 | 
					        setattr(self, 'aggBBmultItem10', item)
 | 
				
			||||||
        # 
 | 
					        #
 | 
				
			||||||
        item = gtk.CheckMenuItem('  All Levels')
 | 
					        item = gtk.CheckMenuItem('  All Levels')
 | 
				
			||||||
        self.aggMenu.append(item)
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
        item.connect("activate", self.set_aggregation, ('O',10000))
 | 
					        item.connect("activate", self.set_aggregation, ('O',10000))
 | 
				
			||||||
        setattr(self, 'aggBBmultItem10000', item) 
 | 
					        setattr(self, 'aggBBmultItem10000', item) 
 | 
				
			||||||
        # 
 | 
					        # 
 | 
				
			||||||
        item = gtk.MenuItem('Since:')
 | 
					        item = gtk.MenuItem('For #Seats:')
 | 
				
			||||||
        self.aggMenu.append(item)
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
        # 
 | 
					        # 
 | 
				
			||||||
 | 
					        item = gtk.CheckMenuItem('  Any Number')
 | 
				
			||||||
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
 | 
					        item.connect("activate", self.set_seats_style, ('O','A'))
 | 
				
			||||||
 | 
					        setattr(self, 'seatsStyleOptionA', item)
 | 
				
			||||||
 | 
					        # 
 | 
				
			||||||
 | 
					        item = gtk.CheckMenuItem('  Custom')
 | 
				
			||||||
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
 | 
					        item.connect("activate", self.set_seats_style, ('O','C'))
 | 
				
			||||||
 | 
					        setattr(self, 'seatsStyleOptionC', item) 
 | 
				
			||||||
 | 
					        # 
 | 
				
			||||||
 | 
					        item = gtk.CheckMenuItem('  Exact')
 | 
				
			||||||
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
 | 
					        item.connect("activate", self.set_seats_style, ('O','E'))
 | 
				
			||||||
 | 
					        setattr(self, 'seatsStyleOptionE', item) 
 | 
				
			||||||
 | 
					        # 
 | 
				
			||||||
 | 
					        item = gtk.MenuItem('Since:')
 | 
				
			||||||
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
 | 
					        #
 | 
				
			||||||
        item = gtk.CheckMenuItem('  All Time')
 | 
					        item = gtk.CheckMenuItem('  All Time')
 | 
				
			||||||
        self.aggMenu.append(item)
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
        item.connect("activate", self.set_hud_style, ('O','A'))
 | 
					        item.connect("activate", self.set_hud_style, ('O','A'))
 | 
				
			||||||
        setattr(self, 'hudStyleOptionA', item)
 | 
					        setattr(self, 'hudStyleOptionA', item)
 | 
				
			||||||
        # 
 | 
					        #
 | 
				
			||||||
        item = gtk.CheckMenuItem('  Session')
 | 
					        item = gtk.CheckMenuItem('  Session')
 | 
				
			||||||
        self.aggMenu.append(item)
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
        item.connect("activate", self.set_hud_style, ('O','S'))
 | 
					        item.connect("activate", self.set_hud_style, ('O','S'))
 | 
				
			||||||
        setattr(self, 'hudStyleOptionS', item) 
 | 
					        setattr(self, 'hudStyleOptionS', item)
 | 
				
			||||||
        # 
 | 
					        #
 | 
				
			||||||
        item = gtk.CheckMenuItem('  %s Days' % (self.hud_params['h_hud_days']))
 | 
					        item = gtk.CheckMenuItem('  %s Days' % (self.hud_params['h_hud_days']))
 | 
				
			||||||
        self.aggMenu.append(item)
 | 
					        self.aggMenu.append(item)
 | 
				
			||||||
        item.connect("activate", self.set_hud_style, ('O','T'))
 | 
					        item.connect("activate", self.set_hud_style, ('O','T'))
 | 
				
			||||||
        setattr(self, 'hudStyleOptionT', item) 
 | 
					        setattr(self, 'hudStyleOptionT', item)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # set active on current options:
 | 
					        # set active on current options:
 | 
				
			||||||
        if self.hud_params['h_agg_bb_mult'] == 1:
 | 
					        if self.hud_params['h_agg_bb_mult'] == 1:
 | 
				
			||||||
| 
						 | 
					@ -267,6 +303,20 @@ class Hud:
 | 
				
			||||||
        elif self.hud_params['agg_bb_mult'] > 9000:
 | 
					        elif self.hud_params['agg_bb_mult'] > 9000:
 | 
				
			||||||
            getattr(self, 'aggBBmultItem10000').set_active(True)
 | 
					            getattr(self, 'aggBBmultItem10000').set_active(True)
 | 
				
			||||||
        #
 | 
					        #
 | 
				
			||||||
 | 
					        if self.hud_params['h_seats_style'] == 'A':
 | 
				
			||||||
 | 
					            getattr(self, 'h_seatsStyleOptionA').set_active(True)
 | 
				
			||||||
 | 
					        elif self.hud_params['h_seats_style'] == 'C':
 | 
				
			||||||
 | 
					            getattr(self, 'h_seatsStyleOptionC').set_active(True)
 | 
				
			||||||
 | 
					        elif self.hud_params['h_seats_style'] == 'E':
 | 
				
			||||||
 | 
					            getattr(self, 'h_seatsStyleOptionE').set_active(True)
 | 
				
			||||||
 | 
					        #
 | 
				
			||||||
 | 
					        if self.hud_params['seats_style'] == 'A':
 | 
				
			||||||
 | 
					            getattr(self, 'seatsStyleOptionA').set_active(True)
 | 
				
			||||||
 | 
					        elif self.hud_params['seats_style'] == 'C':
 | 
				
			||||||
 | 
					            getattr(self, 'seatsStyleOptionC').set_active(True)
 | 
				
			||||||
 | 
					        elif self.hud_params['seats_style'] == 'E':
 | 
				
			||||||
 | 
					            getattr(self, 'seatsStyleOptionE').set_active(True)
 | 
				
			||||||
 | 
					        #
 | 
				
			||||||
        if self.hud_params['h_hud_style'] == 'A':
 | 
					        if self.hud_params['h_hud_style'] == 'A':
 | 
				
			||||||
            getattr(self, 'h_hudStyleOptionA').set_active(True)
 | 
					            getattr(self, 'h_hudStyleOptionA').set_active(True)
 | 
				
			||||||
        elif self.hud_params['h_hud_style'] == 'S':
 | 
					        elif self.hud_params['h_hud_style'] == 'S':
 | 
				
			||||||
| 
						 | 
					@ -280,13 +330,13 @@ class Hud:
 | 
				
			||||||
            getattr(self, 'hudStyleOptionS').set_active(True)
 | 
					            getattr(self, 'hudStyleOptionS').set_active(True)
 | 
				
			||||||
        elif self.hud_params['hud_style'] == 'T':
 | 
					        elif self.hud_params['hud_style'] == 'T':
 | 
				
			||||||
            getattr(self, 'hudStyleOptionT').set_active(True)
 | 
					            getattr(self, 'hudStyleOptionT').set_active(True)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        eventbox.connect_object("button-press-event", self.on_button_press, menu)
 | 
					        eventbox.connect_object("button-press-event", self.on_button_press, menu)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        debugitem = gtk.MenuItem('Debug StatWindows')
 | 
					        debugitem = gtk.MenuItem('Debug StatWindows')
 | 
				
			||||||
        menu.append(debugitem)
 | 
					        menu.append(debugitem)
 | 
				
			||||||
        debugitem.connect("activate", self.debug_stat_windows)
 | 
					        debugitem.connect("activate", self.debug_stat_windows)
 | 
				
			||||||
                
 | 
					
 | 
				
			||||||
        item5 = gtk.MenuItem('Set max seats')
 | 
					        item5 = gtk.MenuItem('Set max seats')
 | 
				
			||||||
        menu.append(item5)
 | 
					        menu.append(item5)
 | 
				
			||||||
        maxSeatsMenu = gtk.Menu()
 | 
					        maxSeatsMenu = gtk.Menu()
 | 
				
			||||||
| 
						 | 
					@ -296,8 +346,8 @@ class Hud:
 | 
				
			||||||
            item.ms = i
 | 
					            item.ms = i
 | 
				
			||||||
            maxSeatsMenu.append(item)
 | 
					            maxSeatsMenu.append(item)
 | 
				
			||||||
            item.connect("activate", self.change_max_seats)
 | 
					            item.connect("activate", self.change_max_seats)
 | 
				
			||||||
            setattr(self, 'maxSeatsMenuItem%d' % (i-1), item) 
 | 
					            setattr(self, 'maxSeatsMenuItem%d' % (i-1), item)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        eventbox.connect_object("button-press-event", self.on_button_press, menu)
 | 
					        eventbox.connect_object("button-press-event", self.on_button_press, menu)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.mw_created = True
 | 
					        self.mw_created = True
 | 
				
			||||||
| 
						 | 
					@ -305,7 +355,7 @@ class Hud:
 | 
				
			||||||
        menu.show_all()
 | 
					        menu.show_all()
 | 
				
			||||||
        self.main_window.show_all()
 | 
					        self.main_window.show_all()
 | 
				
			||||||
        self.topify_window(self.main_window)
 | 
					        self.topify_window(self.main_window)
 | 
				
			||||||
          
 | 
					
 | 
				
			||||||
    def change_max_seats(self, widget):
 | 
					    def change_max_seats(self, widget):
 | 
				
			||||||
        if self.max != widget.ms:
 | 
					        if self.max != widget.ms:
 | 
				
			||||||
            print 'change_max_seats', widget.ms
 | 
					            print 'change_max_seats', widget.ms
 | 
				
			||||||
| 
						 | 
					@ -344,6 +394,29 @@ class Hud:
 | 
				
			||||||
                    if mult != str(num):
 | 
					                    if mult != str(num):
 | 
				
			||||||
                        getattr(self, 'aggBBmultItem'+mult).set_active(False)
 | 
					                        getattr(self, 'aggBBmultItem'+mult).set_active(False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def set_seats_style(self, widget, val):
 | 
				
			||||||
 | 
					        (player_opp, style) = val
 | 
				
			||||||
 | 
					        if player_opp == 'P':
 | 
				
			||||||
 | 
					            param = 'h_seats_style'
 | 
				
			||||||
 | 
					            prefix = 'h_'
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            param = 'seats_style'
 | 
				
			||||||
 | 
					            prefix = ''
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if style == 'A' and getattr(self, prefix+'seatsStyleOptionA').get_active():
 | 
				
			||||||
 | 
					            self.hud_params[param] = 'A'
 | 
				
			||||||
 | 
					            getattr(self, prefix+'seatsStyleOptionC').set_active(False)
 | 
				
			||||||
 | 
					            getattr(self, prefix+'seatsStyleOptionE').set_active(False)
 | 
				
			||||||
 | 
					        elif style == 'C' and getattr(self, prefix+'seatsStyleOptionC').get_active():
 | 
				
			||||||
 | 
					            self.hud_params[param] = 'C'
 | 
				
			||||||
 | 
					            getattr(self, prefix+'seatsStyleOptionA').set_active(False)
 | 
				
			||||||
 | 
					            getattr(self, prefix+'seatsStyleOptionE').set_active(False)
 | 
				
			||||||
 | 
					        elif style == 'E' and getattr(self, prefix+'seatsStyleOptionE').get_active():
 | 
				
			||||||
 | 
					            self.hud_params[param] = 'E'
 | 
				
			||||||
 | 
					            getattr(self, prefix+'seatsStyleOptionA').set_active(False)
 | 
				
			||||||
 | 
					            getattr(self, prefix+'seatsStyleOptionC').set_active(False)
 | 
				
			||||||
 | 
					        print "setting self.hud_params[%s] = %s" % (param, style)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def set_hud_style(self, widget, val):
 | 
					    def set_hud_style(self, widget, val):
 | 
				
			||||||
        (player_opp, style) = val
 | 
					        (player_opp, style) = val
 | 
				
			||||||
        if player_opp == 'P':
 | 
					        if player_opp == 'P':
 | 
				
			||||||
| 
						 | 
					@ -352,7 +425,7 @@ class Hud:
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            param = 'hud_style'
 | 
					            param = 'hud_style'
 | 
				
			||||||
            prefix = ''
 | 
					            prefix = ''
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        if style == 'A' and getattr(self, prefix+'hudStyleOptionA').get_active():
 | 
					        if style == 'A' and getattr(self, prefix+'hudStyleOptionA').get_active():
 | 
				
			||||||
            self.hud_params[param] = 'A'
 | 
					            self.hud_params[param] = 'A'
 | 
				
			||||||
            getattr(self, prefix+'hudStyleOptionS').set_active(False)
 | 
					            getattr(self, prefix+'hudStyleOptionS').set_active(False)
 | 
				
			||||||
| 
						 | 
					@ -431,7 +504,7 @@ class Hud:
 | 
				
			||||||
#        print self.table, "\n", self.main_window.window.get_transient_for()
 | 
					#        print self.table, "\n", self.main_window.window.get_transient_for()
 | 
				
			||||||
        for w in self.stat_windows:
 | 
					        for w in self.stat_windows:
 | 
				
			||||||
            print self.stat_windows[w].window.window.get_transient_for()
 | 
					            print self.stat_windows[w].window.window.get_transient_for()
 | 
				
			||||||
                
 | 
					
 | 
				
			||||||
    def save_layout(self, *args):
 | 
					    def save_layout(self, *args):
 | 
				
			||||||
        new_layout = [(0, 0)] * self.max
 | 
					        new_layout = [(0, 0)] * self.max
 | 
				
			||||||
        for sw in self.stat_windows:
 | 
					        for sw in self.stat_windows:
 | 
				
			||||||
| 
						 | 
					@ -447,7 +520,7 @@ class Hud:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def adj_seats(self, hand, config):
 | 
					    def adj_seats(self, hand, config):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#        Need range here, not xrange -> need the actual list        
 | 
					#        Need range here, not xrange -> need the actual list
 | 
				
			||||||
        adj = range(0, self.max + 1) # default seat adjustments = no adjustment
 | 
					        adj = range(0, self.max + 1) # default seat adjustments = no adjustment
 | 
				
			||||||
#    does the user have a fav_seat?
 | 
					#    does the user have a fav_seat?
 | 
				
			||||||
        if self.max not in config.supported_sites[self.table.site].layout:
 | 
					        if self.max not in config.supported_sites[self.table.site].layout:
 | 
				
			||||||
| 
						 | 
					@ -481,12 +554,12 @@ class Hud:
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#    this method also manages the creating and destruction of stat
 | 
					#    this method also manages the creating and destruction of stat
 | 
				
			||||||
#    windows via calls to the Stat_Window class
 | 
					#    windows via calls to the Stat_Window class
 | 
				
			||||||
        self.creation_attrs = hand, config, stat_dict, cards 
 | 
					        self.creation_attrs = hand, config, stat_dict, cards
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.hand = hand  
 | 
					        self.hand = hand
 | 
				
			||||||
        if not self.mw_created:
 | 
					        if not self.mw_created:
 | 
				
			||||||
            self.create_mw()
 | 
					            self.create_mw()
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
        self.stat_dict = stat_dict
 | 
					        self.stat_dict = stat_dict
 | 
				
			||||||
        self.cards = cards
 | 
					        self.cards = cards
 | 
				
			||||||
        sys.stderr.write("------------------------------------------------------------\nCreating hud from hand %s\n" % hand)
 | 
					        sys.stderr.write("------------------------------------------------------------\nCreating hud from hand %s\n" % hand)
 | 
				
			||||||
| 
						 | 
					@ -498,24 +571,24 @@ class Hud:
 | 
				
			||||||
            loc = self.config.get_locations(self.table.site, 9)
 | 
					            loc = self.config.get_locations(self.table.site, 9)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#    create the stat windows
 | 
					#    create the stat windows
 | 
				
			||||||
        for i in xrange(1, self.max + 1):           
 | 
					        for i in xrange(1, self.max + 1):
 | 
				
			||||||
            (x, y) = loc[adj[i]]
 | 
					            (x, y) = loc[adj[i]]
 | 
				
			||||||
            if i in self.stat_windows:
 | 
					            if i in self.stat_windows:
 | 
				
			||||||
                self.stat_windows[i].relocate(x, y)
 | 
					                self.stat_windows[i].relocate(x, y)
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                self.stat_windows[i] = Stat_Window(game = config.supported_games[self.poker_game],
 | 
					                self.stat_windows[i] = Stat_Window(game = config.supported_games[self.poker_game],
 | 
				
			||||||
                                               parent = self,
 | 
					                                               parent = self,
 | 
				
			||||||
                                               table = self.table, 
 | 
					                                               table = self.table,
 | 
				
			||||||
                                               x = x,
 | 
					                                               x = x,
 | 
				
			||||||
                                               y = y,
 | 
					                                               y = y,
 | 
				
			||||||
                                               seat = i,
 | 
					                                               seat = i,
 | 
				
			||||||
                                               adj = adj[i], 
 | 
					                                               adj = adj[i],
 | 
				
			||||||
                                               player_id = 'fake',
 | 
					                                               player_id = 'fake',
 | 
				
			||||||
                                               font = self.font)
 | 
					                                               font = self.font)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.stats = []
 | 
					        self.stats = []
 | 
				
			||||||
        game = config.supported_games[self.poker_game]
 | 
					        game = config.supported_games[self.poker_game]
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        for i in xrange(0, game.rows + 1):
 | 
					        for i in xrange(0, game.rows + 1):
 | 
				
			||||||
            row_list = [''] * game.cols
 | 
					            row_list = [''] * game.cols
 | 
				
			||||||
            self.stats.append(row_list)
 | 
					            self.stats.append(row_list)
 | 
				
			||||||
| 
						 | 
					@ -523,14 +596,15 @@ class Hud:
 | 
				
			||||||
            self.stats[config.supported_games[self.poker_game].stats[stat].row] \
 | 
					            self.stats[config.supported_games[self.poker_game].stats[stat].row] \
 | 
				
			||||||
                      [config.supported_games[self.poker_game].stats[stat].col] = \
 | 
					                      [config.supported_games[self.poker_game].stats[stat].col] = \
 | 
				
			||||||
                      config.supported_games[self.poker_game].stats[stat].stat_name
 | 
					                      config.supported_games[self.poker_game].stats[stat].stat_name
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        if os.name == "nt":
 | 
					        if os.name == "nt":
 | 
				
			||||||
            gobject.timeout_add(500, self.update_table_position)
 | 
					            gobject.timeout_add(500, self.update_table_position)
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
    def update(self, hand, config):
 | 
					    def update(self, hand, config):
 | 
				
			||||||
        self.hand = hand   # this is the last hand, so it is available later
 | 
					        self.hand = hand   # this is the last hand, so it is available later
 | 
				
			||||||
        if os.name == 'nt':
 | 
					        if os.name == 'nt':
 | 
				
			||||||
            self.update_table_position()
 | 
					            if self.update_table_position() == False: # we got killed by finding our table was gone
 | 
				
			||||||
 | 
					                return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for s in self.stat_dict:
 | 
					        for s in self.stat_dict:
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
| 
						 | 
					@ -546,18 +620,18 @@ class Hud:
 | 
				
			||||||
                self.max = 10
 | 
					                self.max = 10
 | 
				
			||||||
                self.create(hand, config, self.stat_dict, self.cards)
 | 
					                self.create(hand, config, self.stat_dict, self.cards)
 | 
				
			||||||
                self.stat_windows[statd['seat']].player_id = statd['player_id']
 | 
					                self.stat_windows[statd['seat']].player_id = statd['player_id']
 | 
				
			||||||
                
 | 
					
 | 
				
			||||||
            for r in xrange(0, config.supported_games[self.poker_game].rows):
 | 
					            for r in xrange(0, config.supported_games[self.poker_game].rows):
 | 
				
			||||||
                for c in xrange(0, config.supported_games[self.poker_game].cols):
 | 
					                for c in xrange(0, config.supported_games[self.poker_game].cols):
 | 
				
			||||||
                    this_stat = config.supported_games[self.poker_game].stats[self.stats[r][c]]
 | 
					                    this_stat = config.supported_games[self.poker_game].stats[self.stats[r][c]]
 | 
				
			||||||
                    number = Stats.do_stat(self.stat_dict, player = statd['player_id'], stat = self.stats[r][c])
 | 
					                    number = Stats.do_stat(self.stat_dict, player = statd['player_id'], stat = self.stats[r][c])
 | 
				
			||||||
                    statstring = "%s%s%s" % (this_stat.hudprefix, str(number[1]), this_stat.hudsuffix)
 | 
					                    statstring = "%s%s%s" % (this_stat.hudprefix, str(number[1]), this_stat.hudsuffix)
 | 
				
			||||||
                    window = self.stat_windows[statd['seat']]
 | 
					                    window = self.stat_windows[statd['seat']]
 | 
				
			||||||
                    
 | 
					
 | 
				
			||||||
                    if this_stat.hudcolor != "":
 | 
					                    if this_stat.hudcolor != "":
 | 
				
			||||||
                        self.label.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self.colors['hudfgcolor']))
 | 
					                        self.label.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self.colors['hudfgcolor']))
 | 
				
			||||||
                        window.label[r][c].modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse(this_stat.hudcolor))
 | 
					                        window.label[r][c].modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse(this_stat.hudcolor))
 | 
				
			||||||
                    
 | 
					
 | 
				
			||||||
                    window.label[r][c].set_text(statstring)
 | 
					                    window.label[r][c].set_text(statstring)
 | 
				
			||||||
                    if statstring != "xxx": # is there a way to tell if this particular stat window is visible already, or no?
 | 
					                    if statstring != "xxx": # is there a way to tell if this particular stat window is visible already, or no?
 | 
				
			||||||
                        window.window.show_all()
 | 
					                        window.window.show_all()
 | 
				
			||||||
| 
						 | 
					@ -567,7 +641,7 @@ class Hud:
 | 
				
			||||||
    def topify_window(self, window):
 | 
					    def topify_window(self, window):
 | 
				
			||||||
        window.set_focus_on_map(False)
 | 
					        window.set_focus_on_map(False)
 | 
				
			||||||
        window.set_accept_focus(False)
 | 
					        window.set_accept_focus(False)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        if not self.table.gdkhandle:
 | 
					        if not self.table.gdkhandle:
 | 
				
			||||||
            self.table.gdkhandle = gtk.gdk.window_foreign_new(int(self.table.number)) # gtk handle to poker window
 | 
					            self.table.gdkhandle = gtk.gdk.window_foreign_new(int(self.table.number)) # gtk handle to poker window
 | 
				
			||||||
        window.window.set_transient_for(self.table.gdkhandle)
 | 
					        window.window.set_transient_for(self.table.gdkhandle)
 | 
				
			||||||
| 
						 | 
					@ -575,7 +649,7 @@ class Hud:
 | 
				
			||||||
class Stat_Window:
 | 
					class Stat_Window:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def button_press_cb(self, widget, event, *args):
 | 
					    def button_press_cb(self, widget, event, *args):
 | 
				
			||||||
#    This handles all callbacks from button presses on the event boxes in 
 | 
					#    This handles all callbacks from button presses on the event boxes in
 | 
				
			||||||
#    the stat windows.  There is a bit of an ugly kludge to separate single-
 | 
					#    the stat windows.  There is a bit of an ugly kludge to separate single-
 | 
				
			||||||
#    and double-clicks.
 | 
					#    and double-clicks.
 | 
				
			||||||
        self.window.show_all()
 | 
					        self.window.show_all()
 | 
				
			||||||
| 
						 | 
					@ -599,15 +673,15 @@ class Stat_Window:
 | 
				
			||||||
                self.window.begin_move_drag(event.button, int(event.x_root), int(event.y_root), event.time)
 | 
					                self.window.begin_move_drag(event.button, int(event.x_root), int(event.y_root), event.time)
 | 
				
			||||||
            return True
 | 
					            return True
 | 
				
			||||||
        return False
 | 
					        return False
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    def noop(self, arga=None, argb=None): # i'm going to try to connect the focus-in and focus-out events here, to see if that fixes any of the focus problems.
 | 
					    def noop(self, arga=None, argb=None): # i'm going to try to connect the focus-in and focus-out events here, to see if that fixes any of the focus problems.
 | 
				
			||||||
        return True
 | 
					        return True
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    def kill_popup(self, popup):
 | 
					    def kill_popup(self, popup):
 | 
				
			||||||
        print "remove popup", popup
 | 
					        print "remove popup", popup
 | 
				
			||||||
        self.popups.remove(popup)        
 | 
					        self.popups.remove(popup)
 | 
				
			||||||
        popup.window.destroy()
 | 
					        popup.window.destroy()
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
    def kill_popups(self):
 | 
					    def kill_popups(self):
 | 
				
			||||||
        map(lambda x: x.window.destroy(), self.popups)
 | 
					        map(lambda x: x.window.destroy(), self.popups)
 | 
				
			||||||
        self.popups = { }
 | 
					        self.popups = { }
 | 
				
			||||||
| 
						 | 
					@ -639,10 +713,10 @@ class Stat_Window:
 | 
				
			||||||
        self.window.set_focus_on_map(False)
 | 
					        self.window.set_focus_on_map(False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        grid = gtk.Table(rows = game.rows, columns = game.cols, homogeneous = False)
 | 
					        grid = gtk.Table(rows = game.rows, columns = game.cols, homogeneous = False)
 | 
				
			||||||
        self.grid = grid    
 | 
					        self.grid = grid
 | 
				
			||||||
        self.window.add(grid)
 | 
					        self.window.add(grid)
 | 
				
			||||||
        self.window.modify_bg(gtk.STATE_NORMAL, parent.backgroundcolor)
 | 
					        self.window.modify_bg(gtk.STATE_NORMAL, parent.backgroundcolor)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        self.e_box = []
 | 
					        self.e_box = []
 | 
				
			||||||
        self.frame = []
 | 
					        self.frame = []
 | 
				
			||||||
        self.label = []
 | 
					        self.label = []
 | 
				
			||||||
| 
						 | 
					@ -658,10 +732,10 @@ class Stat_Window:
 | 
				
			||||||
                if usegtkframes:
 | 
					                if usegtkframes:
 | 
				
			||||||
                    self.frame[r].append( gtk.Frame() )
 | 
					                    self.frame[r].append( gtk.Frame() )
 | 
				
			||||||
                e_box[r].append( gtk.EventBox() )
 | 
					                e_box[r].append( gtk.EventBox() )
 | 
				
			||||||
                
 | 
					
 | 
				
			||||||
                e_box[r][c].modify_bg(gtk.STATE_NORMAL, parent.backgroundcolor)
 | 
					                e_box[r][c].modify_bg(gtk.STATE_NORMAL, parent.backgroundcolor)
 | 
				
			||||||
                e_box[r][c].modify_fg(gtk.STATE_NORMAL, parent.foregroundcolor)
 | 
					                e_box[r][c].modify_fg(gtk.STATE_NORMAL, parent.foregroundcolor)
 | 
				
			||||||
                
 | 
					
 | 
				
			||||||
                Stats.do_tip(e_box[r][c], 'stuff')
 | 
					                Stats.do_tip(e_box[r][c], 'stuff')
 | 
				
			||||||
                if usegtkframes:
 | 
					                if usegtkframes:
 | 
				
			||||||
                    grid.attach(self.frame[r][c], c, c+1, r, r+1, xpadding = game.xpad, ypadding = game.ypad)
 | 
					                    grid.attach(self.frame[r][c], c, c+1, r, r+1, xpadding = game.xpad, ypadding = game.ypad)
 | 
				
			||||||
| 
						 | 
					@ -669,7 +743,7 @@ class Stat_Window:
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
                    grid.attach(e_box[r][c], c, c+1, r, r+1, xpadding = game.xpad, ypadding = game.ypad)
 | 
					                    grid.attach(e_box[r][c], c, c+1, r, r+1, xpadding = game.xpad, ypadding = game.ypad)
 | 
				
			||||||
                label[r].append( gtk.Label('xxx') )
 | 
					                label[r].append( gtk.Label('xxx') )
 | 
				
			||||||
                
 | 
					
 | 
				
			||||||
                if usegtkframes:
 | 
					                if usegtkframes:
 | 
				
			||||||
                    self.frame[r][c].modify_bg(gtk.STATE_NORMAL, parent.backgroundcolor)
 | 
					                    self.frame[r][c].modify_bg(gtk.STATE_NORMAL, parent.backgroundcolor)
 | 
				
			||||||
                label[r][c].modify_bg(gtk.STATE_NORMAL, parent.backgroundcolor)
 | 
					                label[r][c].modify_bg(gtk.STATE_NORMAL, parent.backgroundcolor)
 | 
				
			||||||
| 
						 | 
					@ -690,17 +764,17 @@ class Stat_Window:
 | 
				
			||||||
        self.window.set_focus_on_map(False)
 | 
					        self.window.set_focus_on_map(False)
 | 
				
			||||||
        self.window.set_accept_focus(False)
 | 
					        self.window.set_accept_focus(False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        self.window.move(self.x, self.y)
 | 
					        self.window.move(self.x, self.y)
 | 
				
			||||||
        self.window.realize() # window must be realized before it has a gdkwindow so we can attach it to the table window..
 | 
					        self.window.realize() # window must be realized before it has a gdkwindow so we can attach it to the table window..
 | 
				
			||||||
        self.topify_window(self.window)
 | 
					        self.topify_window(self.window)
 | 
				
			||||||
                   
 | 
					
 | 
				
			||||||
        self.window.hide()
 | 
					        self.window.hide()
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
    def topify_window(self, window):
 | 
					    def topify_window(self, window):
 | 
				
			||||||
        window.set_focus_on_map(False)
 | 
					        window.set_focus_on_map(False)
 | 
				
			||||||
        window.set_accept_focus(False)
 | 
					        window.set_accept_focus(False)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        if not self.table.gdkhandle:
 | 
					        if not self.table.gdkhandle:
 | 
				
			||||||
            self.table.gdkhandle = gtk.gdk.window_foreign_new(int(self.table.number)) # gtk handle to poker window
 | 
					            self.table.gdkhandle = gtk.gdk.window_foreign_new(int(self.table.number)) # gtk handle to poker window
 | 
				
			||||||
#        window.window.reparent(self.table.gdkhandle, 0, 0)
 | 
					#        window.window.reparent(self.table.gdkhandle, 0, 0)
 | 
				
			||||||
| 
						 | 
					@ -723,11 +797,11 @@ class Popup_window:
 | 
				
			||||||
        self.window.set_title("popup")
 | 
					        self.window.set_title("popup")
 | 
				
			||||||
        self.window.set_property("skip-taskbar-hint", True)
 | 
					        self.window.set_property("skip-taskbar-hint", True)
 | 
				
			||||||
        self.window.set_focus_on_map(False)
 | 
					        self.window.set_focus_on_map(False)
 | 
				
			||||||
        self.window.set_accept_focus(False)        
 | 
					        self.window.set_accept_focus(False)
 | 
				
			||||||
        self.window.set_transient_for(parent.get_toplevel())
 | 
					        self.window.set_transient_for(parent.get_toplevel())
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        self.window.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
 | 
					        self.window.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        self.ebox = gtk.EventBox()
 | 
					        self.ebox = gtk.EventBox()
 | 
				
			||||||
        self.ebox.connect("button_press_event", self.button_press_cb)
 | 
					        self.ebox.connect("button_press_event", self.button_press_cb)
 | 
				
			||||||
        self.lab  = gtk.Label("stuff\nstuff\nstuff")
 | 
					        self.lab  = gtk.Label("stuff\nstuff\nstuff")
 | 
				
			||||||
| 
						 | 
					@ -735,14 +809,14 @@ class Popup_window:
 | 
				
			||||||
#    need an event box so we can respond to clicks
 | 
					#    need an event box so we can respond to clicks
 | 
				
			||||||
        self.window.add(self.ebox)
 | 
					        self.window.add(self.ebox)
 | 
				
			||||||
        self.ebox.add(self.lab)
 | 
					        self.ebox.add(self.lab)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        self.ebox.modify_bg(gtk.STATE_NORMAL, stat_window.parent.backgroundcolor)
 | 
					        self.ebox.modify_bg(gtk.STATE_NORMAL, stat_window.parent.backgroundcolor)
 | 
				
			||||||
        self.ebox.modify_fg(gtk.STATE_NORMAL, stat_window.parent.foregroundcolor)
 | 
					        self.ebox.modify_fg(gtk.STATE_NORMAL, stat_window.parent.foregroundcolor)
 | 
				
			||||||
        self.window.modify_bg(gtk.STATE_NORMAL, stat_window.parent.backgroundcolor)
 | 
					        self.window.modify_bg(gtk.STATE_NORMAL, stat_window.parent.backgroundcolor)
 | 
				
			||||||
        self.window.modify_fg(gtk.STATE_NORMAL, stat_window.parent.foregroundcolor)
 | 
					        self.window.modify_fg(gtk.STATE_NORMAL, stat_window.parent.foregroundcolor)
 | 
				
			||||||
        self.lab.modify_bg(gtk.STATE_NORMAL, stat_window.parent.backgroundcolor)
 | 
					        self.lab.modify_bg(gtk.STATE_NORMAL, stat_window.parent.backgroundcolor)
 | 
				
			||||||
        self.lab.modify_fg(gtk.STATE_NORMAL, stat_window.parent.foregroundcolor)
 | 
					        self.lab.modify_fg(gtk.STATE_NORMAL, stat_window.parent.foregroundcolor)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
#    figure out the row, col address of the click that activated the popup
 | 
					#    figure out the row, col address of the click that activated the popup
 | 
				
			||||||
        row = 0
 | 
					        row = 0
 | 
				
			||||||
        col = 0
 | 
					        col = 0
 | 
				
			||||||
| 
						 | 
					@ -769,7 +843,7 @@ class Popup_window:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#    get a database connection
 | 
					#    get a database connection
 | 
				
			||||||
#        db_connection = Database.Database(stat_window.parent.config, stat_window.parent.db_name, 'temp')
 | 
					#        db_connection = Database.Database(stat_window.parent.config, stat_window.parent.db_name, 'temp')
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
#    calculate the stat_dict and then create the text for the pu
 | 
					#    calculate the stat_dict and then create the text for the pu
 | 
				
			||||||
#        stat_dict = db_connection.get_stats_from_hand(stat_window.parent.hand, stat_window.player_id)
 | 
					#        stat_dict = db_connection.get_stats_from_hand(stat_window.parent.hand, stat_window.player_id)
 | 
				
			||||||
#        stat_dict = self.db_connection.get_stats_from_hand(stat_window.parent.hand)
 | 
					#        stat_dict = self.db_connection.get_stats_from_hand(stat_window.parent.hand)
 | 
				
			||||||
| 
						 | 
					@ -781,16 +855,16 @@ class Popup_window:
 | 
				
			||||||
            number = Stats.do_stat(stat_dict, player = int(stat_window.player_id), stat = s)
 | 
					            number = Stats.do_stat(stat_dict, player = int(stat_window.player_id), stat = s)
 | 
				
			||||||
            mo_text += number[5] + " " + number[4] + "\n"
 | 
					            mo_text += number[5] + " " + number[4] + "\n"
 | 
				
			||||||
            pu_text += number[3] + "\n"
 | 
					            pu_text += number[3] + "\n"
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.lab.set_text(pu_text)
 | 
					        self.lab.set_text(pu_text)
 | 
				
			||||||
        Stats.do_tip(self.lab, mo_text)
 | 
					        Stats.do_tip(self.lab, mo_text)
 | 
				
			||||||
        self.window.show_all()
 | 
					        self.window.show_all()
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        self.window.set_transient_for(stat_window.window)
 | 
					        self.window.set_transient_for(stat_window.window)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def button_press_cb(self, widget, event, *args):
 | 
					    def button_press_cb(self, widget, event, *args):
 | 
				
			||||||
#    This handles all callbacks from button presses on the event boxes in 
 | 
					#    This handles all callbacks from button presses on the event boxes in
 | 
				
			||||||
#    the popup windows.  There is a bit of an ugly kludge to separate single-
 | 
					#    the popup windows.  There is a bit of an ugly kludge to separate single-
 | 
				
			||||||
#    and double-clicks.  This is the same code as in the Stat_window class
 | 
					#    and double-clicks.  This is the same code as in the Stat_window class
 | 
				
			||||||
        if event.button == 1:   # left button event
 | 
					        if event.button == 1:   # left button event
 | 
				
			||||||
| 
						 | 
					@ -808,7 +882,7 @@ class Popup_window:
 | 
				
			||||||
    def toggle_decorated(self, widget):
 | 
					    def toggle_decorated(self, widget):
 | 
				
			||||||
        top = widget.get_toplevel()
 | 
					        top = widget.get_toplevel()
 | 
				
			||||||
        (x, y) = top.get_position()
 | 
					        (x, y) = top.get_position()
 | 
				
			||||||
                    
 | 
					
 | 
				
			||||||
        if top.get_decorated():
 | 
					        if top.get_decorated():
 | 
				
			||||||
            top.set_decorated(0)
 | 
					            top.set_decorated(0)
 | 
				
			||||||
            top.move(x, y)
 | 
					            top.move(x, y)
 | 
				
			||||||
| 
						 | 
					@ -819,7 +893,7 @@ class Popup_window:
 | 
				
			||||||
    def topify_window(self, window):
 | 
					    def topify_window(self, window):
 | 
				
			||||||
        window.set_focus_on_map(False)
 | 
					        window.set_focus_on_map(False)
 | 
				
			||||||
        window.set_accept_focus(False)
 | 
					        window.set_accept_focus(False)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        if not self.table.gdkhandle:
 | 
					        if not self.table.gdkhandle:
 | 
				
			||||||
            self.table.gdkhandle = gtk.gdk.window_foreign_new(int(self.table.number)) # gtk handle to poker window
 | 
					            self.table.gdkhandle = gtk.gdk.window_foreign_new(int(self.table.number)) # gtk handle to poker window
 | 
				
			||||||
#        window.window.reparent(self.table.gdkhandle, 0, 0)
 | 
					#        window.window.reparent(self.table.gdkhandle, 0, 0)
 | 
				
			||||||
| 
						 | 
					@ -833,14 +907,14 @@ if __name__== "__main__":
 | 
				
			||||||
    label = gtk.Label('Fake main window, blah blah, blah\nblah, blah')
 | 
					    label = gtk.Label('Fake main window, blah blah, blah\nblah, blah')
 | 
				
			||||||
    main_window.add(label)
 | 
					    main_window.add(label)
 | 
				
			||||||
    main_window.show_all()
 | 
					    main_window.show_all()
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    c = Configuration.Config()
 | 
					    c = Configuration.Config()
 | 
				
			||||||
    #tables = Tables.discover(c)
 | 
					    #tables = Tables.discover(c)
 | 
				
			||||||
    t = Tables.discover_table_by_name(c, "Corona")
 | 
					    t = Tables.discover_table_by_name(c, "Corona")
 | 
				
			||||||
    if t is None:
 | 
					    if t is None:
 | 
				
			||||||
        print "Table not found."
 | 
					        print "Table not found."
 | 
				
			||||||
    db = Database.Database(c, 'fpdb', 'holdem')
 | 
					    db = Database.Database(c, 'fpdb', 'holdem')
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    stat_dict = db.get_stats_from_hand(1)
 | 
					    stat_dict = db.get_stats_from_hand(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#    for t in tables:
 | 
					#    for t in tables:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -39,7 +39,7 @@ def fpdb_options():
 | 
				
			||||||
    return (options, argv)
 | 
					    return (options, argv)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if __name__== "__main__":
 | 
					if __name__== "__main__":
 | 
				
			||||||
    (options, sys.argv) = fpdb_options()
 | 
					    (options, argv) = fpdb_options()
 | 
				
			||||||
    print "errorsToConsole =", options.errorsToConsole
 | 
					    print "errorsToConsole =", options.errorsToConsole
 | 
				
			||||||
    print "database name   =", options.dbname
 | 
					    print "database name   =", options.dbname
 | 
				
			||||||
    print "config file     =", options.config
 | 
					    print "config file     =", options.config
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -50,7 +50,7 @@ class PokerStars(HandHistoryConverter):
 | 
				
			||||||
          \s?(?P<TOUR_ISO>%(LEGAL_ISO)s)?
 | 
					          \s?(?P<TOUR_ISO>%(LEGAL_ISO)s)?
 | 
				
			||||||
          )\s)?                          # close paren of tournament info
 | 
					          )\s)?                          # close paren of tournament info
 | 
				
			||||||
          (?P<MIXED>HORSE|8\-Game|HOSE)?\s?\(?
 | 
					          (?P<MIXED>HORSE|8\-Game|HOSE)?\s?\(?
 | 
				
			||||||
          (?P<GAME>Hold\'em|Razz|7\sCard\sStud|7\sCard\sStud\sHi/Lo|Omaha|Omaha\sHi/Lo|Badugi|Triple\sDraw\s2\-7\sLowball)\s
 | 
					          (?P<GAME>Hold\'em|Razz|7\sCard\sStud|7\sCard\sStud\sHi/Lo|Omaha|Omaha\sHi/Lo|Badugi|Triple\sDraw\s2\-7\sLowball|5\sCard\sDraw)\s
 | 
				
			||||||
          (?P<LIMIT>No\sLimit|Limit|Pot\sLimit)\)?,?\s
 | 
					          (?P<LIMIT>No\sLimit|Limit|Pot\sLimit)\)?,?\s
 | 
				
			||||||
          (-\sLevel\s(?P<LEVEL>[IVXLC]+)\s)?
 | 
					          (-\sLevel\s(?P<LEVEL>[IVXLC]+)\s)?
 | 
				
			||||||
          \(?                            # open paren of the stakes
 | 
					          \(?                            # open paren of the stakes
 | 
				
			||||||
| 
						 | 
					@ -101,7 +101,7 @@ class PokerStars(HandHistoryConverter):
 | 
				
			||||||
            self.re_HeroCards        = re.compile(r"^Dealt to %(PLYR)s(?: \[(?P<OLDCARDS>.+?)\])?( \[(?P<NEWCARDS>.+?)\])" % subst, re.MULTILINE)
 | 
					            self.re_HeroCards        = re.compile(r"^Dealt to %(PLYR)s(?: \[(?P<OLDCARDS>.+?)\])?( \[(?P<NEWCARDS>.+?)\])" % subst, re.MULTILINE)
 | 
				
			||||||
            self.re_Action           = re.compile(r"""
 | 
					            self.re_Action           = re.compile(r"""
 | 
				
			||||||
                        ^%(PLYR)s:(?P<ATYPE>\sbets|\schecks|\sraises|\scalls|\sfolds|\sdiscards|\sstands\spat)
 | 
					                        ^%(PLYR)s:(?P<ATYPE>\sbets|\schecks|\sraises|\scalls|\sfolds|\sdiscards|\sstands\spat)
 | 
				
			||||||
                        (\s%(CUR)s(?P<BET>[.\d]+))?(\sto\s%(CUR)s(?P<BETTO>[.\d]+))?  # the number discarded goes in <BET>
 | 
					                        (\s(%(CUR)s)?(?P<BET>[.\d]+))?(\sto\s%(CUR)s(?P<BETTO>[.\d]+))?  # the number discarded goes in <BET>
 | 
				
			||||||
                        (\scards?(\s\[(?P<DISCARDED>.+?)\])?)?"""
 | 
					                        (\scards?(\s\[(?P<DISCARDED>.+?)\])?)?"""
 | 
				
			||||||
                         %  subst, re.MULTILINE|re.VERBOSE)
 | 
					                         %  subst, re.MULTILINE|re.VERBOSE)
 | 
				
			||||||
            self.re_ShowdownAction   = re.compile(r"^%s: shows \[(?P<CARDS>.*)\]" %  player_re, re.MULTILINE)
 | 
					            self.re_ShowdownAction   = re.compile(r"^%s: shows \[(?P<CARDS>.*)\]" %  player_re, re.MULTILINE)
 | 
				
			||||||
| 
						 | 
					@ -133,6 +133,7 @@ class PokerStars(HandHistoryConverter):
 | 
				
			||||||
        info = {}
 | 
					        info = {}
 | 
				
			||||||
        m = self.re_GameInfo.search(handText)
 | 
					        m = self.re_GameInfo.search(handText)
 | 
				
			||||||
        if not m:
 | 
					        if not m:
 | 
				
			||||||
 | 
					            print "DEBUG: determineGameType(): did not match"
 | 
				
			||||||
            return None
 | 
					            return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        mg = m.groupdict()
 | 
					        mg = m.groupdict()
 | 
				
			||||||
| 
						 | 
					@ -147,6 +148,7 @@ class PokerStars(HandHistoryConverter):
 | 
				
			||||||
                    '7 Card Stud Hi/Lo' : ('stud','studhilo'),
 | 
					                    '7 Card Stud Hi/Lo' : ('stud','studhilo'),
 | 
				
			||||||
                               'Badugi' : ('draw','badugi'),
 | 
					                               'Badugi' : ('draw','badugi'),
 | 
				
			||||||
              'Triple Draw 2-7 Lowball' : ('draw','27_3draw'),
 | 
					              'Triple Draw 2-7 Lowball' : ('draw','27_3draw'),
 | 
				
			||||||
 | 
					                          '5 Card Draw' : ('draw','fivedraw')
 | 
				
			||||||
               }
 | 
					               }
 | 
				
			||||||
        currencies = { u'€':'EUR', '$':'USD', '':'T$' }
 | 
					        currencies = { u'€':'EUR', '$':'USD', '':'T$' }
 | 
				
			||||||
#    I don't think this is doing what we think. mg will always have all 
 | 
					#    I don't think this is doing what we think. mg will always have all 
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										123
									
								
								pyfpdb/SQL.py
									
									
									
									
									
								
							
							
						
						
									
										123
									
								
								pyfpdb/SQL.py
									
									
									
									
									
								
							| 
						 | 
					@ -1402,6 +1402,7 @@ class Sql:
 | 
				
			||||||
                                  AND    gt1.bigblind <= gt2.bigblind * %s  /* bigblind similar size */
 | 
					                                  AND    gt1.bigblind <= gt2.bigblind * %s  /* bigblind similar size */
 | 
				
			||||||
                                  AND    gt1.bigblind >= gt2.bigblind / %s
 | 
					                                  AND    gt1.bigblind >= gt2.bigblind / %s
 | 
				
			||||||
                                  AND    gt2.id = h.gametypeId)
 | 
					                                  AND    gt2.id = h.gametypeId)
 | 
				
			||||||
 | 
					                           AND hc.activeSeats between %s and %s
 | 
				
			||||||
                          )
 | 
					                          )
 | 
				
			||||||
                       OR
 | 
					                       OR
 | 
				
			||||||
                          (    hp.playerId = %s
 | 
					                          (    hp.playerId = %s
 | 
				
			||||||
| 
						 | 
					@ -1415,6 +1416,7 @@ class Sql:
 | 
				
			||||||
                                  AND    gt1.bigblind <= gt2.bigblind * %s  /* bigblind similar size */
 | 
					                                  AND    gt1.bigblind <= gt2.bigblind * %s  /* bigblind similar size */
 | 
				
			||||||
                                  AND    gt1.bigblind >= gt2.bigblind / %s
 | 
					                                  AND    gt1.bigblind >= gt2.bigblind / %s
 | 
				
			||||||
                                  AND    gt2.id = h.gametypeId)
 | 
					                                  AND    gt2.id = h.gametypeId)
 | 
				
			||||||
 | 
					                           AND hc.activeSeats between %s and %s
 | 
				
			||||||
                          )
 | 
					                          )
 | 
				
			||||||
                      )
 | 
					                      )
 | 
				
			||||||
                GROUP BY hc.PlayerId, p.name
 | 
					                GROUP BY hc.PlayerId, p.name
 | 
				
			||||||
| 
						 | 
					@ -1432,11 +1434,11 @@ class Sql:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if db_server == 'mysql':
 | 
					        if db_server == 'mysql':
 | 
				
			||||||
            self.query['get_stats_from_hand_session'] = """
 | 
					            self.query['get_stats_from_hand_session'] = """
 | 
				
			||||||
                    SELECT hp.playerId                                              AS player_id,
 | 
					                    SELECT hp.playerId                                              AS player_id, /* playerId and seats must */
 | 
				
			||||||
 | 
					                           h.seats                                                  AS seats,     /* be first and second field */
 | 
				
			||||||
                           hp.handId                                                AS hand_id,
 | 
					                           hp.handId                                                AS hand_id,
 | 
				
			||||||
                           hp.seatNo                                                AS seat,
 | 
					                           hp.seatNo                                                AS seat,
 | 
				
			||||||
                           p.name                                                   AS screen_name,
 | 
					                           p.name                                                   AS screen_name,
 | 
				
			||||||
                           h.seats                                                  AS seats,
 | 
					 | 
				
			||||||
                           1                                                        AS n,
 | 
					                           1                                                        AS n,
 | 
				
			||||||
                           cast(hp2.street0VPI as <signed>integer)                  AS vpip,
 | 
					                           cast(hp2.street0VPI as <signed>integer)                  AS vpip,
 | 
				
			||||||
                           cast(hp2.street0Aggr as <signed>integer)                 AS pfr,
 | 
					                           cast(hp2.street0Aggr as <signed>integer)                 AS pfr,
 | 
				
			||||||
| 
						 | 
					@ -1494,21 +1496,30 @@ class Sql:
 | 
				
			||||||
                           cast(hp2.street4CheckCallRaiseChance as <signed>integer) AS ccr_opp_4,
 | 
					                           cast(hp2.street4CheckCallRaiseChance as <signed>integer) AS ccr_opp_4,
 | 
				
			||||||
                           cast(hp2.street4CheckCallRaiseDone as <signed>integer)   AS ccr_4
 | 
					                           cast(hp2.street4CheckCallRaiseDone as <signed>integer)   AS ccr_4
 | 
				
			||||||
                    FROM
 | 
					                    FROM
 | 
				
			||||||
                         Hands h         /* players in this hand */
 | 
					                         Hands h
 | 
				
			||||||
                         INNER JOIN Hands h2         ON (h2.id > %s AND   h2.tableName = h.tableName)
 | 
					                         INNER JOIN Hands h2         ON (h2.id > %s AND   h2.tableName = h.tableName)
 | 
				
			||||||
                         INNER JOIN HandsPlayers hp  ON (h.id = hp.handId)
 | 
					                         INNER JOIN HandsPlayers hp  ON (h.id = hp.handId)         /* players in this hand */
 | 
				
			||||||
                         INNER JOIN HandsPlayers hp2 ON (hp2.playerId+0 = hp.playerId+0 AND (hp2.handId = h2.id+0))  /* other hands by these players */
 | 
					                         INNER JOIN HandsPlayers hp2 ON (hp2.playerId+0 = hp.playerId+0 AND (hp2.handId = h2.id+0))  /* other hands by these players */
 | 
				
			||||||
                         INNER JOIN Players p        ON (p.id = hp2.PlayerId+0)
 | 
					                         INNER JOIN Players p        ON (p.id = hp2.PlayerId+0)
 | 
				
			||||||
                    WHERE hp.handId = %s
 | 
					                    WHERE hp.handId = %s
 | 
				
			||||||
                    /* check activeseats once this data returned (don't want to do that here as it might
 | 
					                    /* check activeseats once this data returned (don't want to do that here as it might
 | 
				
			||||||
                       assume a session ended just because the number of seats dipped for a few hands)
 | 
					                       assume a session ended just because the number of seats dipped for a few hands)
 | 
				
			||||||
                    */
 | 
					                    */
 | 
				
			||||||
 | 
					                    AND   (   /* 2 separate parts for hero and opponents */
 | 
				
			||||||
 | 
					                              (    hp2.playerId != %s
 | 
				
			||||||
 | 
					                               AND h2.seats between %s and %s
 | 
				
			||||||
 | 
					                              )
 | 
				
			||||||
 | 
					                           OR
 | 
				
			||||||
 | 
					                              (    hp2.playerId = %s
 | 
				
			||||||
 | 
					                               AND h2.seats between %s and %s
 | 
				
			||||||
 | 
					                              )
 | 
				
			||||||
 | 
					                          )
 | 
				
			||||||
                    ORDER BY h.handStart desc, hp2.PlayerId
 | 
					                    ORDER BY h.handStart desc, hp2.PlayerId
 | 
				
			||||||
                    /* order rows by handstart descending so that we can stop reading rows when
 | 
					                    /* order rows by handstart descending so that we can stop reading rows when
 | 
				
			||||||
                       there's a gap over X minutes between hands (ie. when we get back to start of
 | 
					                       there's a gap over X minutes between hands (ie. when we get back to start of
 | 
				
			||||||
                       the session */
 | 
					                       the session */
 | 
				
			||||||
                """
 | 
					                """
 | 
				
			||||||
        else:  # assume postgresql
 | 
					        elif db_server == 'postgresql':
 | 
				
			||||||
            self.query['get_stats_from_hand_session'] = """
 | 
					            self.query['get_stats_from_hand_session'] = """
 | 
				
			||||||
                    SELECT hp.playerId                                              AS player_id,
 | 
					                    SELECT hp.playerId                                              AS player_id,
 | 
				
			||||||
                           hp.handId                                                AS hand_id,
 | 
					                           hp.handId                                                AS hand_id,
 | 
				
			||||||
| 
						 | 
					@ -1582,6 +1593,103 @@ class Sql:
 | 
				
			||||||
                    /* check activeseats once this data returned (don't want to do that here as it might
 | 
					                    /* check activeseats once this data returned (don't want to do that here as it might
 | 
				
			||||||
                       assume a session ended just because the number of seats dipped for a few hands)
 | 
					                       assume a session ended just because the number of seats dipped for a few hands)
 | 
				
			||||||
                    */
 | 
					                    */
 | 
				
			||||||
 | 
					                    AND   (   /* 2 separate parts for hero and opponents */
 | 
				
			||||||
 | 
					                              (    hp2.playerId != %s
 | 
				
			||||||
 | 
					                               AND h2.seats between %s and %s
 | 
				
			||||||
 | 
					                              )
 | 
				
			||||||
 | 
					                           OR
 | 
				
			||||||
 | 
					                              (    hp2.playerId = %s
 | 
				
			||||||
 | 
					                               AND h2.seats between %s and %s
 | 
				
			||||||
 | 
					                              )
 | 
				
			||||||
 | 
					                          )
 | 
				
			||||||
 | 
					                    ORDER BY h.handStart desc, hp2.PlayerId
 | 
				
			||||||
 | 
					                    /* order rows by handstart descending so that we can stop reading rows when
 | 
				
			||||||
 | 
					                       there's a gap over X minutes between hands (ie. when we get back to start of
 | 
				
			||||||
 | 
					                       the session */
 | 
				
			||||||
 | 
					                """
 | 
				
			||||||
 | 
					        elif db_server == 'sqlite':
 | 
				
			||||||
 | 
					            self.query['get_stats_from_hand_session'] = """
 | 
				
			||||||
 | 
					                    SELECT hp.playerId                                              AS player_id,
 | 
				
			||||||
 | 
					                           hp.handId                                                AS hand_id,
 | 
				
			||||||
 | 
					                           hp.seatNo                                                AS seat,
 | 
				
			||||||
 | 
					                           p.name                                                   AS screen_name,
 | 
				
			||||||
 | 
					                           h.seats                                                  AS seats,
 | 
				
			||||||
 | 
					                           1                                                        AS n,
 | 
				
			||||||
 | 
					                           cast(hp2.street0VPI as <signed>integer)                  AS vpip,
 | 
				
			||||||
 | 
					                           cast(hp2.street0Aggr as <signed>integer)                 AS pfr,
 | 
				
			||||||
 | 
					                           cast(hp2.street0_3BChance as <signed>integer)            AS TB_opp_0,
 | 
				
			||||||
 | 
					                           cast(hp2.street0_3BDone as <signed>integer)              AS TB_0,
 | 
				
			||||||
 | 
					                           cast(hp2.street1Seen as <signed>integer)                 AS saw_f,
 | 
				
			||||||
 | 
					                           cast(hp2.street1Seen as <signed>integer)                 AS saw_1,
 | 
				
			||||||
 | 
					                           cast(hp2.street2Seen as <signed>integer)                 AS saw_2,
 | 
				
			||||||
 | 
					                           cast(hp2.street3Seen as <signed>integer)                 AS saw_3,
 | 
				
			||||||
 | 
					                           cast(hp2.street4Seen as <signed>integer)                 AS saw_4,
 | 
				
			||||||
 | 
					                           cast(hp2.sawShowdown as <signed>integer)                 AS sd,
 | 
				
			||||||
 | 
					                           cast(hp2.street1Aggr as <signed>integer)                 AS aggr_1,
 | 
				
			||||||
 | 
					                           cast(hp2.street2Aggr as <signed>integer)                 AS aggr_2,
 | 
				
			||||||
 | 
					                           cast(hp2.street3Aggr as <signed>integer)                 AS aggr_3,
 | 
				
			||||||
 | 
					                           cast(hp2.street4Aggr as <signed>integer)                 AS aggr_4,
 | 
				
			||||||
 | 
					                           cast(hp2.otherRaisedStreet1 as <signed>integer)          AS was_raised_1,
 | 
				
			||||||
 | 
					                           cast(hp2.otherRaisedStreet2 as <signed>integer)          AS was_raised_2,
 | 
				
			||||||
 | 
					                           cast(hp2.otherRaisedStreet3 as <signed>integer)          AS was_raised_3,
 | 
				
			||||||
 | 
					                           cast(hp2.otherRaisedStreet4 as <signed>integer)          AS was_raised_4,
 | 
				
			||||||
 | 
					                           cast(hp2.foldToOtherRaisedStreet1 as <signed>integer)    AS f_freq_1,
 | 
				
			||||||
 | 
					                           cast(hp2.foldToOtherRaisedStreet2 as <signed>integer)    AS f_freq_2,
 | 
				
			||||||
 | 
					                           cast(hp2.foldToOtherRaisedStreet3 as <signed>integer)    AS f_freq_3,
 | 
				
			||||||
 | 
					                           cast(hp2.foldToOtherRaisedStreet4 as <signed>integer)    AS f_freq_4,
 | 
				
			||||||
 | 
					                           cast(hp2.wonWhenSeenStreet1 as <signed>integer)          AS w_w_s_1,
 | 
				
			||||||
 | 
					                           cast(hp2.wonAtSD as <signed>integer)                     AS wmsd,
 | 
				
			||||||
 | 
					                           cast(hp2.stealAttemptChance as <signed>integer)          AS steal_opp,
 | 
				
			||||||
 | 
					                           cast(hp2.stealAttempted as <signed>integer)              AS steal,
 | 
				
			||||||
 | 
					                           cast(hp2.foldSbToStealChance as <signed>integer)         AS SBstolen,
 | 
				
			||||||
 | 
					                           cast(hp2.foldedSbToSteal as <signed>integer)             AS SBnotDef,
 | 
				
			||||||
 | 
					                           cast(hp2.foldBbToStealChance as <signed>integer)         AS BBstolen,
 | 
				
			||||||
 | 
					                           cast(hp2.foldedBbToSteal as <signed>integer)             AS BBnotDef,
 | 
				
			||||||
 | 
					                           cast(hp2.street1CBChance as <signed>integer)             AS CB_opp_1,
 | 
				
			||||||
 | 
					                           cast(hp2.street1CBDone as <signed>integer)               AS CB_1,
 | 
				
			||||||
 | 
					                           cast(hp2.street2CBChance as <signed>integer)             AS CB_opp_2,
 | 
				
			||||||
 | 
					                           cast(hp2.street2CBDone as <signed>integer)               AS CB_2,
 | 
				
			||||||
 | 
					                           cast(hp2.street3CBChance as <signed>integer)             AS CB_opp_3,
 | 
				
			||||||
 | 
					                           cast(hp2.street3CBDone as <signed>integer)               AS CB_3,
 | 
				
			||||||
 | 
					                           cast(hp2.street4CBChance as <signed>integer)             AS CB_opp_4,
 | 
				
			||||||
 | 
					                           cast(hp2.street4CBDone as <signed>integer)               AS CB_4,
 | 
				
			||||||
 | 
					                           cast(hp2.foldToStreet1CBChance as <signed>integer)       AS f_cb_opp_1,
 | 
				
			||||||
 | 
					                           cast(hp2.foldToStreet1CBDone as <signed>integer)         AS f_cb_1,
 | 
				
			||||||
 | 
					                           cast(hp2.foldToStreet2CBChance as <signed>integer)       AS f_cb_opp_2,
 | 
				
			||||||
 | 
					                           cast(hp2.foldToStreet2CBDone as <signed>integer)         AS f_cb_2,
 | 
				
			||||||
 | 
					                           cast(hp2.foldToStreet3CBChance as <signed>integer)       AS f_cb_opp_3,
 | 
				
			||||||
 | 
					                           cast(hp2.foldToStreet3CBDone as <signed>integer)         AS f_cb_3,
 | 
				
			||||||
 | 
					                           cast(hp2.foldToStreet4CBChance as <signed>integer)       AS f_cb_opp_4,
 | 
				
			||||||
 | 
					                           cast(hp2.foldToStreet4CBDone as <signed>integer)         AS f_cb_4,
 | 
				
			||||||
 | 
					                           cast(hp2.totalProfit as <signed>integer)                 AS net,
 | 
				
			||||||
 | 
					                           cast(hp2.street1CheckCallRaiseChance as <signed>integer) AS ccr_opp_1,
 | 
				
			||||||
 | 
					                           cast(hp2.street1CheckCallRaiseDone as <signed>integer)   AS ccr_1,
 | 
				
			||||||
 | 
					                           cast(hp2.street2CheckCallRaiseChance as <signed>integer) AS ccr_opp_2,
 | 
				
			||||||
 | 
					                           cast(hp2.street2CheckCallRaiseDone as <signed>integer)   AS ccr_2,
 | 
				
			||||||
 | 
					                           cast(hp2.street3CheckCallRaiseChance as <signed>integer) AS ccr_opp_3,
 | 
				
			||||||
 | 
					                           cast(hp2.street3CheckCallRaiseDone as <signed>integer)   AS ccr_3,
 | 
				
			||||||
 | 
					                           cast(hp2.street4CheckCallRaiseChance as <signed>integer) AS ccr_opp_4,
 | 
				
			||||||
 | 
					                           cast(hp2.street4CheckCallRaiseDone as <signed>integer)   AS ccr_4
 | 
				
			||||||
 | 
					                    FROM Hands h                                                  /* this hand */
 | 
				
			||||||
 | 
					                         INNER JOIN Hands h2         ON (    h2.id > %s           /* other hands */
 | 
				
			||||||
 | 
					                                                         AND h2.tableName = h.tableName)
 | 
				
			||||||
 | 
					                         INNER JOIN HandsPlayers hp  ON (h.id = hp.handId)        /* players in this hand */
 | 
				
			||||||
 | 
					                         INNER JOIN HandsPlayers hp2 ON (    hp2.playerId+0 = hp.playerId+0
 | 
				
			||||||
 | 
					                                                         AND hp2.handId = h2.id)  /* other hands by these players */
 | 
				
			||||||
 | 
					                         INNER JOIN Players p        ON (p.id = hp2.PlayerId+0)
 | 
				
			||||||
 | 
					                    WHERE h.id = %s
 | 
				
			||||||
 | 
					                    /* check activeseats once this data returned (don't want to do that here as it might
 | 
				
			||||||
 | 
					                       assume a session ended just because the number of seats dipped for a few hands)
 | 
				
			||||||
 | 
					                    */
 | 
				
			||||||
 | 
					                    AND   (   /* 2 separate parts for hero and opponents */
 | 
				
			||||||
 | 
					                              (    hp2.playerId != %s
 | 
				
			||||||
 | 
					                               AND h2.seats between %s and %s
 | 
				
			||||||
 | 
					                              )
 | 
				
			||||||
 | 
					                           OR
 | 
				
			||||||
 | 
					                              (    hp2.playerId = %s
 | 
				
			||||||
 | 
					                               AND h2.seats between %s and %s
 | 
				
			||||||
 | 
					                              )
 | 
				
			||||||
 | 
					                          )
 | 
				
			||||||
                    ORDER BY h.handStart desc, hp2.PlayerId
 | 
					                    ORDER BY h.handStart desc, hp2.PlayerId
 | 
				
			||||||
                    /* order rows by handstart descending so that we can stop reading rows when
 | 
					                    /* order rows by handstart descending so that we can stop reading rows when
 | 
				
			||||||
                       there's a gap over X minutes between hands (ie. when we get back to start of
 | 
					                       there's a gap over X minutes between hands (ie. when we get back to start of
 | 
				
			||||||
| 
						 | 
					@ -1605,10 +1713,13 @@ class Sql:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.query['get_table_name'] = """
 | 
					        self.query['get_table_name'] = """
 | 
				
			||||||
                SELECT h.tableName, h.maxSeats, gt.category, gt.type, s.id, s.name
 | 
					                SELECT h.tableName, h.maxSeats, gt.category, gt.type, s.id, s.name
 | 
				
			||||||
                FROM Hands h, Gametypes gt, Sites s
 | 
					                     , count(1) as numseats
 | 
				
			||||||
 | 
					                FROM Hands h, Gametypes gt, Sites s, HandsPlayers hp
 | 
				
			||||||
                WHERE h.id = %s
 | 
					                WHERE h.id = %s
 | 
				
			||||||
                    AND   gt.id = h.gametypeId
 | 
					                    AND   gt.id = h.gametypeId
 | 
				
			||||||
                    AND   s.id = gt.siteID
 | 
					                    AND   s.id = gt.siteID
 | 
				
			||||||
 | 
					                    AND   hp.handId = h.id
 | 
				
			||||||
 | 
					                GROUP BY h.tableName, h.maxSeats, gt.category, gt.type, s.id, s.name
 | 
				
			||||||
            """
 | 
					            """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.query['get_actual_seat'] = """
 | 
					        self.query['get_actual_seat'] = """
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,17 +3,17 @@
 | 
				
			||||||
    Based on HUD_main .. who knows if we want to actually use this or not
 | 
					    Based on HUD_main .. who knows if we want to actually use this or not
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
#    Copyright 2008, 2009,  Eric Blade
 | 
					#    Copyright 2008, 2009,  Eric Blade
 | 
				
			||||||
#    
 | 
					#
 | 
				
			||||||
#    This program is free software; you can redistribute it and/or modify
 | 
					#    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
 | 
					#    it under the terms of the GNU General Public License as published by
 | 
				
			||||||
#    the Free Software Foundation; either version 2 of the License, or
 | 
					#    the Free Software Foundation; either version 2 of the License, or
 | 
				
			||||||
#    (at your option) any later version.
 | 
					#    (at your option) any later version.
 | 
				
			||||||
#    
 | 
					#
 | 
				
			||||||
#    This program is distributed in the hope that it will be useful,
 | 
					#    This program is distributed in the hope that it will be useful,
 | 
				
			||||||
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					#    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 | 
					#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 | 
				
			||||||
#    GNU General Public License for more details.
 | 
					#    GNU General Public License for more details.
 | 
				
			||||||
#    
 | 
					#
 | 
				
			||||||
#    You should have received a copy of the GNU General Public License
 | 
					#    You should have received a copy of the GNU General Public License
 | 
				
			||||||
#    along with this program; if not, write to the Free Software
 | 
					#    along with this program; if not, write to the Free Software
 | 
				
			||||||
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 | 
					#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 | 
				
			||||||
| 
						 | 
					@ -31,7 +31,7 @@ import os
 | 
				
			||||||
import Options
 | 
					import Options
 | 
				
			||||||
import traceback
 | 
					import traceback
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(options, sys.argv) = Options.fpdb_options()
 | 
					(options, argv) = Options.fpdb_options()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if not options.errorsToConsole:
 | 
					if not options.errorsToConsole:
 | 
				
			||||||
    print "Note: error output is being diverted to fpdb-error-log.txt and HUD-error.txt. Any major error will be reported there _only_."
 | 
					    print "Note: error output is being diverted to fpdb-error-log.txt and HUD-error.txt. Any major error will be reported there _only_."
 | 
				
			||||||
| 
						 | 
					@ -55,7 +55,7 @@ import SummaryEverleaf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Tournament:
 | 
					class Tournament:
 | 
				
			||||||
    """Tournament will hold the information about a tournament, I guess ? Remember I'm new to this language, so I don't know the best ways to do things"""
 | 
					    """Tournament will hold the information about a tournament, I guess ? Remember I'm new to this language, so I don't know the best ways to do things"""
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    def __init__(self, parent, site, tid): # site should probably be something in the config object, but i don't know how the config object works right now, so we're going to make it a str ..
 | 
					    def __init__(self, parent, site, tid): # site should probably be something in the config object, but i don't know how the config object works right now, so we're going to make it a str ..
 | 
				
			||||||
        print "Tournament init"
 | 
					        print "Tournament init"
 | 
				
			||||||
        self.parent = parent
 | 
					        self.parent = parent
 | 
				
			||||||
| 
						 | 
					@ -74,7 +74,7 @@ class Tournament:
 | 
				
			||||||
        self.prizepool = 0
 | 
					        self.prizepool = 0
 | 
				
			||||||
        self.players = {} # eventually i'd guess we'd probably want to fill this with playername:playerid's
 | 
					        self.players = {} # eventually i'd guess we'd probably want to fill this with playername:playerid's
 | 
				
			||||||
        self.results = {} # i'd guess we'd want to load this up with playerid's instead of playernames, too, as well, also
 | 
					        self.results = {} # i'd guess we'd want to load this up with playerid's instead of playernames, too, as well, also
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        # if site == "Everleaf": # this should be attached to a button that says "retrieve tournament info" or something for sites that we know how to do it for
 | 
					        # if site == "Everleaf": # this should be attached to a button that says "retrieve tournament info" or something for sites that we know how to do it for
 | 
				
			||||||
        summary = SummaryEverleaf.EverleafSummary()
 | 
					        summary = SummaryEverleaf.EverleafSummary()
 | 
				
			||||||
        self.site = summary.parser.SiteName
 | 
					        self.site = summary.parser.SiteName
 | 
				
			||||||
| 
						 | 
					@ -87,9 +87,9 @@ class Tournament:
 | 
				
			||||||
        self.rebuys = (summary.parser.TourneyRebuys == "yes")
 | 
					        self.rebuys = (summary.parser.TourneyRebuys == "yes")
 | 
				
			||||||
        self.prizepool = summary.parser.TourneyPool
 | 
					        self.prizepool = summary.parser.TourneyPool
 | 
				
			||||||
        self.numplayers = summary.parser.TourneyPlayers
 | 
					        self.numplayers = summary.parser.TourneyPlayers
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        self.openwindow() # let's start by getting any info we need.. meh
 | 
					        self.openwindow() # let's start by getting any info we need.. meh
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
    def openwindow(self, widget=None):
 | 
					    def openwindow(self, widget=None):
 | 
				
			||||||
        if self.window is not None:
 | 
					        if self.window is not None:
 | 
				
			||||||
            self.window.show() # isn't there a better way to bring something to the front? not that GTK focus works right anyway, ever
 | 
					            self.window.show() # isn't there a better way to bring something to the front? not that GTK focus works right anyway, ever
 | 
				
			||||||
| 
						 | 
					@ -102,24 +102,24 @@ class Tournament:
 | 
				
			||||||
            self.window.set_border_width(1)
 | 
					            self.window.set_border_width(1)
 | 
				
			||||||
            self.window.set_default_size(480,640)
 | 
					            self.window.set_default_size(480,640)
 | 
				
			||||||
            self.window.set_resizable(True)
 | 
					            self.window.set_resizable(True)
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
            self.main_vbox = gtk.VBox(False, 1)
 | 
					            self.main_vbox = gtk.VBox(False, 1)
 | 
				
			||||||
            self.main_vbox.set_border_width(1)
 | 
					            self.main_vbox.set_border_width(1)
 | 
				
			||||||
            self.window.add(self.main_vbox)
 | 
					            self.window.add(self.main_vbox)
 | 
				
			||||||
            self.window.show()
 | 
					            self.window.show()
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
    def addrebuy(self, widget=None):
 | 
					    def addrebuy(self, widget=None):
 | 
				
			||||||
        t = self
 | 
					        t = self
 | 
				
			||||||
        t.numrebuys += 1
 | 
					        t.numrebuys += 1
 | 
				
			||||||
        t.mylabel.set_label("%s - %s - %s - %s - %s %s - %s - %s - %s - %s - %s" % (t.site, t.id, t.starttime, t.endtime, t.structure, t.game, t.buyin, t.fee, t.numrebuys, t.numplayers, t.prizepool))
 | 
					        t.mylabel.set_label("%s - %s - %s - %s - %s %s - %s - %s - %s - %s - %s" % (t.site, t.id, t.starttime, t.endtime, t.structure, t.game, t.buyin, t.fee, t.numrebuys, t.numplayers, t.prizepool))
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
    def delete_event(self, widget, event, data=None):
 | 
					    def delete_event(self, widget, event, data=None):
 | 
				
			||||||
        return False
 | 
					        return False
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    def destroy(self, widget, data=None):
 | 
					    def destroy(self, widget, data=None):
 | 
				
			||||||
        return False
 | 
					        return False
 | 
				
			||||||
    #end def destroy        
 | 
					    #end def destroy
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ttracker_main(object):
 | 
					class ttracker_main(object):
 | 
				
			||||||
    """A main() object to own both the read_stdin thread and the gui."""
 | 
					    """A main() object to own both the read_stdin thread and the gui."""
 | 
				
			||||||
| 
						 | 
					@ -143,11 +143,11 @@ class ttracker_main(object):
 | 
				
			||||||
        self.addbutton = gtk.Button(label="Enter Tournament")
 | 
					        self.addbutton = gtk.Button(label="Enter Tournament")
 | 
				
			||||||
        self.addbutton.connect("clicked", self.addClicked, "add tournament")
 | 
					        self.addbutton.connect("clicked", self.addClicked, "add tournament")
 | 
				
			||||||
        self.vb.add(self.addbutton)
 | 
					        self.vb.add(self.addbutton)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        self.main_window.add(self.vb)
 | 
					        self.main_window.add(self.vb)
 | 
				
			||||||
        self.main_window.set_title("FPDB Tournament Tracker")
 | 
					        self.main_window.set_title("FPDB Tournament Tracker")
 | 
				
			||||||
        self.main_window.show_all()
 | 
					        self.main_window.show_all()
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
    def addClicked(self, widget, data): # what is "data"? i'm guessing anything i pass in after the function name in connect() but unsure because the documentation sucks
 | 
					    def addClicked(self, widget, data): # what is "data"? i'm guessing anything i pass in after the function name in connect() but unsure because the documentation sucks
 | 
				
			||||||
        print "addClicked", widget, data
 | 
					        print "addClicked", widget, data
 | 
				
			||||||
        t = Tournament(self, None, None)
 | 
					        t = Tournament(self, None, None)
 | 
				
			||||||
| 
						 | 
					@ -162,7 +162,7 @@ class ttracker_main(object):
 | 
				
			||||||
            rebuybutton = gtk.Button(label="Rebuy")
 | 
					            rebuybutton = gtk.Button(label="Rebuy")
 | 
				
			||||||
            rebuybutton.connect("clicked", t.addrebuy)
 | 
					            rebuybutton.connect("clicked", t.addrebuy)
 | 
				
			||||||
            self.vb.add(rebuybutton)
 | 
					            self.vb.add(rebuybutton)
 | 
				
			||||||
            self.vb.add(editbutton) # These should probably be put in.. a.. h-box? i don't know.. 
 | 
					            self.vb.add(editbutton) # These should probably be put in.. a.. h-box? i don't know..
 | 
				
			||||||
            self.vb.add(mylabel)
 | 
					            self.vb.add(mylabel)
 | 
				
			||||||
            self.main_window.resize_children()
 | 
					            self.main_window.resize_children()
 | 
				
			||||||
            self.main_window.show()
 | 
					            self.main_window.show()
 | 
				
			||||||
| 
						 | 
					@ -172,29 +172,29 @@ class ttracker_main(object):
 | 
				
			||||||
            t.mylabel = mylabel
 | 
					            t.mylabel = mylabel
 | 
				
			||||||
            t.editbutton = editbutton
 | 
					            t.editbutton = editbutton
 | 
				
			||||||
            t.rebuybutton = rebuybutton
 | 
					            t.rebuybutton = rebuybutton
 | 
				
			||||||
            self.vb.show()            
 | 
					            self.vb.show()
 | 
				
			||||||
            print self.tourney_list
 | 
					            print self.tourney_list
 | 
				
			||||||
          
 | 
					
 | 
				
			||||||
            return True
 | 
					            return True
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            return False
 | 
					            return False
 | 
				
			||||||
        # when we move the start command over to the main program, we can have the main program ask for the tourney id, and pipe it into the stdin here
 | 
					        # when we move the start command over to the main program, we can have the main program ask for the tourney id, and pipe it into the stdin here
 | 
				
			||||||
        # at least that was my initial thought on it
 | 
					        # at least that was my initial thought on it
 | 
				
			||||||
           
 | 
					
 | 
				
			||||||
    def destroy(*args):             # call back for terminating the main eventloop
 | 
					    def destroy(*args):             # call back for terminating the main eventloop
 | 
				
			||||||
        gtk.main_quit()
 | 
					        gtk.main_quit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def create_HUD(self, new_hand_id, table, table_name, max, poker_game, stat_dict, cards):
 | 
					    def create_HUD(self, new_hand_id, table, table_name, max, poker_game, stat_dict, cards):
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        def idle_func():
 | 
					        def idle_func():
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
            gtk.gdk.threads_enter()
 | 
					            gtk.gdk.threads_enter()
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
                newlabel = gtk.Label("%s - %s" % (table.site, table_name))
 | 
					                newlabel = gtk.Label("%s - %s" % (table.site, table_name))
 | 
				
			||||||
                self.vb.add(newlabel)
 | 
					                self.vb.add(newlabel)
 | 
				
			||||||
                newlabel.show()
 | 
					                newlabel.show()
 | 
				
			||||||
                self.main_window.resize_children()
 | 
					                self.main_window.resize_children()
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
                self.hud_dict[table_name].tablehudlabel = newlabel
 | 
					                self.hud_dict[table_name].tablehudlabel = newlabel
 | 
				
			||||||
                self.hud_dict[table_name].create(new_hand_id, self.config, stat_dict, cards)
 | 
					                self.hud_dict[table_name].create(new_hand_id, self.config, stat_dict, cards)
 | 
				
			||||||
                for m in self.hud_dict[table_name].aux_windows:
 | 
					                for m in self.hud_dict[table_name].aux_windows:
 | 
				
			||||||
| 
						 | 
					@ -212,11 +212,11 @@ class ttracker_main(object):
 | 
				
			||||||
        self.hud_dict[table_name].cards = cards
 | 
					        self.hud_dict[table_name].cards = cards
 | 
				
			||||||
        [aw.update_data(new_hand_id, self.db_connection) for aw in self.hud_dict[table_name].aux_windows]
 | 
					        [aw.update_data(new_hand_id, self.db_connection) for aw in self.hud_dict[table_name].aux_windows]
 | 
				
			||||||
        gobject.idle_add(idle_func)
 | 
					        gobject.idle_add(idle_func)
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    def update_HUD(self, new_hand_id, table_name, config):
 | 
					    def update_HUD(self, new_hand_id, table_name, config):
 | 
				
			||||||
        """Update a HUD gui from inside the non-gui read_stdin thread."""
 | 
					        """Update a HUD gui from inside the non-gui read_stdin thread."""
 | 
				
			||||||
#    This is written so that only 1 thread can touch the gui--mainly
 | 
					#    This is written so that only 1 thread can touch the gui--mainly
 | 
				
			||||||
#    for compatibility with Windows. This method dispatches the 
 | 
					#    for compatibility with Windows. This method dispatches the
 | 
				
			||||||
#    function idle_func() to be run by the gui thread, at its leisure.
 | 
					#    function idle_func() to be run by the gui thread, at its leisure.
 | 
				
			||||||
        def idle_func():
 | 
					        def idle_func():
 | 
				
			||||||
            gtk.gdk.threads_enter()
 | 
					            gtk.gdk.threads_enter()
 | 
				
			||||||
| 
						 | 
					@ -227,7 +227,7 @@ class ttracker_main(object):
 | 
				
			||||||
            finally:
 | 
					            finally:
 | 
				
			||||||
                gtk.gdk.threads_leave()
 | 
					                gtk.gdk.threads_leave()
 | 
				
			||||||
        gobject.idle_add(idle_func)
 | 
					        gobject.idle_add(idle_func)
 | 
				
			||||||
     
 | 
					
 | 
				
			||||||
    def read_stdin(self):            # This is the thread function
 | 
					    def read_stdin(self):            # This is the thread function
 | 
				
			||||||
        """Do all the non-gui heavy lifting for the HUD program."""
 | 
					        """Do all the non-gui heavy lifting for the HUD program."""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -238,7 +238,7 @@ class ttracker_main(object):
 | 
				
			||||||
        self.db_connection = Database.Database(self.config, self.db_name, 'temp')
 | 
					        self.db_connection = Database.Database(self.config, self.db_name, 'temp')
 | 
				
			||||||
#        self.db_connection.init_hud_stat_vars(hud_days)
 | 
					#        self.db_connection.init_hud_stat_vars(hud_days)
 | 
				
			||||||
        tourny_finder = re.compile('(\d+) (\d+)')
 | 
					        tourny_finder = re.compile('(\d+) (\d+)')
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
        while 1: # wait for a new hand number on stdin
 | 
					        while 1: # wait for a new hand number on stdin
 | 
				
			||||||
            new_hand_id = sys.stdin.readline()
 | 
					            new_hand_id = sys.stdin.readline()
 | 
				
			||||||
            new_hand_id = string.rstrip(new_hand_id)
 | 
					            new_hand_id = string.rstrip(new_hand_id)
 | 
				
			||||||
| 
						 | 
					@ -248,7 +248,7 @@ class ttracker_main(object):
 | 
				
			||||||
#    get basic info about the new hand from the db
 | 
					#    get basic info about the new hand from the db
 | 
				
			||||||
#    if there is a db error, complain, skip hand, and proceed
 | 
					#    if there is a db error, complain, skip hand, and proceed
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
                (table_name, max, poker_game, type, site_id) = self.db_connection.get_table_name(new_hand_id)
 | 
					                (table_name, max, poker_game, type, site_id, numseats) = self.db_connection.get_table_name(new_hand_id)
 | 
				
			||||||
                stat_dict = self.db_connection.get_stats_from_hand(new_hand_id, aggregate_stats[type]
 | 
					                stat_dict = self.db_connection.get_stats_from_hand(new_hand_id, aggregate_stats[type]
 | 
				
			||||||
                                                                  ,hud_style, agg_bb_mult)
 | 
					                                                                  ,hud_style, agg_bb_mult)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -272,7 +272,7 @@ class ttracker_main(object):
 | 
				
			||||||
                    print "could not find tournament: skipping "
 | 
					                    print "could not find tournament: skipping "
 | 
				
			||||||
                    sys.stderr.write("Could not find tournament %d in hand %d. Skipping.\n" % (int(tour_number), int(new_hand_id)))
 | 
					                    sys.stderr.write("Could not find tournament %d in hand %d. Skipping.\n" % (int(tour_number), int(new_hand_id)))
 | 
				
			||||||
                    continue
 | 
					                    continue
 | 
				
			||||||
                    
 | 
					
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                temp_key = table_name
 | 
					                temp_key = table_name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -282,7 +282,7 @@ class ttracker_main(object):
 | 
				
			||||||
                self.hud_dict[temp_key].cards = cards
 | 
					                self.hud_dict[temp_key].cards = cards
 | 
				
			||||||
                [aw.update_data(new_hand_id, self.db_connection) for aw in self.hud_dict[temp_key].aux_windows]
 | 
					                [aw.update_data(new_hand_id, self.db_connection) for aw in self.hud_dict[temp_key].aux_windows]
 | 
				
			||||||
                self.update_HUD(new_hand_id, temp_key, self.config)
 | 
					                self.update_HUD(new_hand_id, temp_key, self.config)
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
#    Or create a new HUD
 | 
					#    Or create a new HUD
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                if type == "tour":
 | 
					                if type == "tour":
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,12 +9,12 @@ Routines for detecting and handling poker client windows for MS Windows.
 | 
				
			||||||
#    it under the terms of the GNU General Public License as published by
 | 
					#    it under the terms of the GNU General Public License as published by
 | 
				
			||||||
#    the Free Software Foundation; either version 2 of the License, or
 | 
					#    the Free Software Foundation; either version 2 of the License, or
 | 
				
			||||||
#    (at your option) any later version.
 | 
					#    (at your option) any later version.
 | 
				
			||||||
#    
 | 
					#
 | 
				
			||||||
#    This program is distributed in the hope that it will be useful,
 | 
					#    This program is distributed in the hope that it will be useful,
 | 
				
			||||||
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					#    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 | 
					#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 | 
				
			||||||
#    GNU General Public License for more details.
 | 
					#    GNU General Public License for more details.
 | 
				
			||||||
#    
 | 
					#
 | 
				
			||||||
#    You should have received a copy of the GNU General Public License
 | 
					#    You should have received a copy of the GNU General Public License
 | 
				
			||||||
#    along with this program; if not, write to the Free Software
 | 
					#    along with this program; if not, write to the Free Software
 | 
				
			||||||
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 | 
					#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 | 
				
			||||||
| 
						 | 
					@ -56,9 +56,13 @@ class Table(Table_Window):
 | 
				
			||||||
                if 'Chat:' in titles[hwnd]: continue # Some sites (FTP? PS? Others?) have seperable or seperately constructed chat windows
 | 
					                if 'Chat:' in titles[hwnd]: continue # Some sites (FTP? PS? Others?) have seperable or seperately constructed chat windows
 | 
				
			||||||
                self.window = hwnd
 | 
					                self.window = hwnd
 | 
				
			||||||
                break
 | 
					                break
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
        if self.window == None:
 | 
					        try:
 | 
				
			||||||
            print "Window %s not found. Skipping." % search_string
 | 
					            if self.window == None:
 | 
				
			||||||
 | 
					                print "Window %s not found. Skipping." % search_string
 | 
				
			||||||
 | 
					                return None
 | 
				
			||||||
 | 
					        except AttributeError:
 | 
				
			||||||
 | 
					            print "self.window doesn't exist? why?"
 | 
				
			||||||
            return None
 | 
					            return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        (x, y, width, height) = win32gui.GetWindowRect(hwnd)
 | 
					        (x, y, width, height) = win32gui.GetWindowRect(hwnd)
 | 
				
			||||||
| 
						 | 
					@ -70,7 +74,7 @@ class Table(Table_Window):
 | 
				
			||||||
        print "x = %s y = %s width = %s height = %s" % (self.x, self.y, self.width, self.height)
 | 
					        print "x = %s y = %s width = %s height = %s" % (self.x, self.y, self.width, self.height)
 | 
				
			||||||
        #self.height = int(height) - b_width - tb_height
 | 
					        #self.height = int(height) - b_width - tb_height
 | 
				
			||||||
        #self.width  = int(width) - 2*b_width
 | 
					        #self.width  = int(width) - 2*b_width
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        self.exe    = self.get_nt_exe(hwnd)
 | 
					        self.exe    = self.get_nt_exe(hwnd)
 | 
				
			||||||
        self.title  = titles[hwnd]
 | 
					        self.title  = titles[hwnd]
 | 
				
			||||||
        self.site   = ""
 | 
					        self.site   = ""
 | 
				
			||||||
| 
						 | 
					@ -99,37 +103,37 @@ class Table(Table_Window):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_nt_exe(self, hwnd):
 | 
					    def get_nt_exe(self, hwnd):
 | 
				
			||||||
        """Finds the name of the executable that the given window handle belongs to."""
 | 
					        """Finds the name of the executable that the given window handle belongs to."""
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        # Request privileges to enable "debug process", so we can later use PROCESS_VM_READ, retardedly required to GetModuleFileNameEx()
 | 
					        # Request privileges to enable "debug process", so we can later use PROCESS_VM_READ, retardedly required to GetModuleFileNameEx()
 | 
				
			||||||
        priv_flags = win32security.TOKEN_ADJUST_PRIVILEGES | win32security.TOKEN_QUERY
 | 
					        priv_flags = win32security.TOKEN_ADJUST_PRIVILEGES | win32security.TOKEN_QUERY
 | 
				
			||||||
        hToken = win32security.OpenProcessToken (win32api.GetCurrentProcess(), priv_flags)
 | 
					        hToken = win32security.OpenProcessToken (win32api.GetCurrentProcess(), priv_flags)
 | 
				
			||||||
        # enable "debug process"
 | 
					        # enable "debug process"
 | 
				
			||||||
        privilege_id = win32security.LookupPrivilegeValue (None, win32security.SE_DEBUG_NAME)
 | 
					        privilege_id = win32security.LookupPrivilegeValue (None, win32security.SE_DEBUG_NAME)
 | 
				
			||||||
        old_privs = win32security.AdjustTokenPrivileges (hToken, 0, [(privilege_id, win32security.SE_PRIVILEGE_ENABLED)])
 | 
					        old_privs = win32security.AdjustTokenPrivileges (hToken, 0, [(privilege_id, win32security.SE_PRIVILEGE_ENABLED)])
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        # Open the process, and query it's filename
 | 
					        # Open the process, and query it's filename
 | 
				
			||||||
        processid = win32process.GetWindowThreadProcessId(hwnd)
 | 
					        processid = win32process.GetWindowThreadProcessId(hwnd)
 | 
				
			||||||
        pshandle = win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION | win32con.PROCESS_VM_READ, False, processid[1])
 | 
					        pshandle = win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION | win32con.PROCESS_VM_READ, False, processid[1])
 | 
				
			||||||
        exename = win32process.GetModuleFileNameEx(pshandle, 0)
 | 
					        exename = win32process.GetModuleFileNameEx(pshandle, 0)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        # clean up
 | 
					        # clean up
 | 
				
			||||||
        win32api.CloseHandle(pshandle)
 | 
					        win32api.CloseHandle(pshandle)
 | 
				
			||||||
        win32api.CloseHandle(hToken)
 | 
					        win32api.CloseHandle(hToken)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        return exename
 | 
					        return exename
 | 
				
			||||||
    def topify(self, hud):
 | 
					    def topify(self, hud):
 | 
				
			||||||
        """Set the specified gtk window to stayontop in MS Windows."""
 | 
					        """Set the specified gtk window to stayontop in MS Windows."""
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
#        def windowEnumerationHandler(hwnd, resultList):
 | 
					#        def windowEnumerationHandler(hwnd, resultList):
 | 
				
			||||||
#            '''Callback for win32gui.EnumWindows() to generate list of window handles.'''
 | 
					#            '''Callback for win32gui.EnumWindows() to generate list of window handles.'''
 | 
				
			||||||
#            resultList.append((hwnd, win32gui.GetWindowText(hwnd)))
 | 
					#            resultList.append((hwnd, win32gui.GetWindowText(hwnd)))
 | 
				
			||||||
#    
 | 
					#
 | 
				
			||||||
#        unique_name = 'unique name for finding this window'
 | 
					#        unique_name = 'unique name for finding this window'
 | 
				
			||||||
#        real_name = hud.main_window.get_title()
 | 
					#        real_name = hud.main_window.get_title()
 | 
				
			||||||
#        hud.main_window.set_title(unique_name)
 | 
					#        hud.main_window.set_title(unique_name)
 | 
				
			||||||
#        tl_windows = []
 | 
					#        tl_windows = []
 | 
				
			||||||
#        win32gui.EnumWindows(windowEnumerationHandler, tl_windows)
 | 
					#        win32gui.EnumWindows(windowEnumerationHandler, tl_windows)
 | 
				
			||||||
#            
 | 
					#
 | 
				
			||||||
#        for w in tl_windows:
 | 
					#        for w in tl_windows:
 | 
				
			||||||
#            if w[1] == unique_name:
 | 
					#            if w[1] == unique_name:
 | 
				
			||||||
#                hud.main_window.gdkhandle = gtk.gdk.window_foreign_new(w[0])
 | 
					#                hud.main_window.gdkhandle = gtk.gdk.window_foreign_new(w[0])
 | 
				
			||||||
| 
						 | 
					@ -139,14 +143,13 @@ class Table(Table_Window):
 | 
				
			||||||
        (innerx, innery) = self.gdkhandle.get_origin()
 | 
					        (innerx, innery) = self.gdkhandle.get_origin()
 | 
				
			||||||
        b_width = rect.x - innerx
 | 
					        b_width = rect.x - innerx
 | 
				
			||||||
        tb_height = rect.y - innery
 | 
					        tb_height = rect.y - innery
 | 
				
			||||||
#                
 | 
					#
 | 
				
			||||||
#                style = win32gui.GetWindowLong(self.number, win32con.GWL_EXSTYLE)
 | 
					#                style = win32gui.GetWindowLong(self.number, win32con.GWL_EXSTYLE)
 | 
				
			||||||
#                style |= win32con.WS_CLIPCHILDREN
 | 
					#                style |= win32con.WS_CLIPCHILDREN
 | 
				
			||||||
#                win32gui.SetWindowLong(self.number, win32con.GWL_EXSTYLE, style)
 | 
					#                win32gui.SetWindowLong(self.number, win32con.GWL_EXSTYLE, style)
 | 
				
			||||||
#                break
 | 
					#                break
 | 
				
			||||||
                
 | 
					
 | 
				
			||||||
#        hud.main_window.set_title(real_name)
 | 
					#        hud.main_window.set_title(real_name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def win_enum_handler(hwnd, titles):
 | 
					def win_enum_handler(hwnd, titles):
 | 
				
			||||||
    titles[hwnd] = win32gui.GetWindowText(hwnd)
 | 
					    titles[hwnd] = win32gui.GetWindowText(hwnd)
 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										135
									
								
								pyfpdb/fpdb.py
									
									
									
									
									
								
							
							
						
						
									
										135
									
								
								pyfpdb/fpdb.py
									
									
									
									
									
								
							| 
						 | 
					@ -69,6 +69,7 @@ import gtk
 | 
				
			||||||
import interlocks
 | 
					import interlocks
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import GuiPrefs
 | 
				
			||||||
import GuiBulkImport
 | 
					import GuiBulkImport
 | 
				
			||||||
import GuiPlayerStats
 | 
					import GuiPlayerStats
 | 
				
			||||||
import GuiPositionalStats
 | 
					import GuiPositionalStats
 | 
				
			||||||
| 
						 | 
					@ -94,37 +95,97 @@ class fpdb:
 | 
				
			||||||
        self.add_tab(new_tab, new_tab_name)
 | 
					        self.add_tab(new_tab, new_tab_name)
 | 
				
			||||||
        self.display_tab(new_tab_name)
 | 
					        self.display_tab(new_tab_name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def add_tab(self, new_tab, new_tab_name):
 | 
					    def add_tab(self, new_page, new_tab_name):
 | 
				
			||||||
        """adds a tab, namely creates the button and displays it and appends all the relevant arrays"""
 | 
					        """adds a tab, namely creates the button and displays it and appends all the relevant arrays"""
 | 
				
			||||||
        for i in self.tab_names: #todo: check this is valid
 | 
					        for name in self.nb_tabs: #todo: check this is valid
 | 
				
			||||||
            if i == new_tab_name:
 | 
					            if name == new_tab_name:
 | 
				
			||||||
                return # if tab already exists, just go to it
 | 
					                return # if tab already exists, just go to it
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.tabs.append(new_tab)
 | 
					        used_before = False
 | 
				
			||||||
        self.tab_names.append(new_tab_name)
 | 
					        for i, name in enumerate(self.tab_names): #todo: check this is valid
 | 
				
			||||||
 | 
					            if name == new_tab_name:
 | 
				
			||||||
 | 
					                used_before = True
 | 
				
			||||||
 | 
					                event_box = self.tabs[i]
 | 
				
			||||||
 | 
					                page = self.pages[i]
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        new_tab_sel_button = gtk.ToggleButton(new_tab_name)
 | 
					        if not used_before:
 | 
				
			||||||
        new_tab_sel_button.connect("clicked", self.tab_clicked, new_tab_name)
 | 
					            event_box = self.create_custom_tab(new_tab_name, self.nb)
 | 
				
			||||||
        self.tab_box.add(new_tab_sel_button)
 | 
					            page = new_page
 | 
				
			||||||
        new_tab_sel_button.show()
 | 
					            self.pages.append(new_page)
 | 
				
			||||||
        self.tab_buttons.append(new_tab_sel_button)
 | 
					            self.tabs.append(event_box)
 | 
				
			||||||
 | 
					            self.tab_names.append(new_tab_name)
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        #self.nb.append_page(new_page, gtk.Label(new_tab_name))
 | 
				
			||||||
 | 
					        self.nb.append_page(page, event_box)
 | 
				
			||||||
 | 
					        self.nb_tabs.append(new_tab_name)
 | 
				
			||||||
 | 
					        page.show()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def display_tab(self, new_tab_name):
 | 
					    def display_tab(self, new_tab_name):
 | 
				
			||||||
        """displays the indicated tab"""
 | 
					        """displays the indicated tab"""
 | 
				
			||||||
        tab_no = -1
 | 
					        tab_no = -1
 | 
				
			||||||
        for i, name in enumerate(self.tab_names):
 | 
					        for i, name in enumerate(self.nb_tabs):
 | 
				
			||||||
            if name == new_tab_name:
 | 
					            if new_tab_name == name:
 | 
				
			||||||
                tab_no = i
 | 
					                tab_no = i
 | 
				
			||||||
                break
 | 
					                break
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if tab_no == -1:
 | 
					        if tab_no < 0 or tab_no >= self.nb.get_n_pages():
 | 
				
			||||||
            raise FpdbError("invalid tab_no")
 | 
					            raise FpdbError("invalid tab_no " + str(tab_no))
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            self.main_vbox.remove(self.current_tab)
 | 
					            self.nb.set_current_page(tab_no)
 | 
				
			||||||
            self.current_tab=self.tabs[tab_no]
 | 
					
 | 
				
			||||||
            self.main_vbox.add(self.current_tab)
 | 
					    def create_custom_tab(self, text, nb):
 | 
				
			||||||
            self.tab_buttons[tab_no].set_active(True)
 | 
					        #create a custom tab for notebook containing a 
 | 
				
			||||||
            self.current_tab.show()
 | 
					        #label and a button with STOCK_ICON
 | 
				
			||||||
 | 
					        eventBox = gtk.EventBox()
 | 
				
			||||||
 | 
					        tabBox = gtk.HBox(False, 2)
 | 
				
			||||||
 | 
					        tabLabel = gtk.Label(text)
 | 
				
			||||||
 | 
					        tabBox.pack_start(tabLabel, False)       
 | 
				
			||||||
 | 
					        eventBox.add(tabBox)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if nb.get_n_pages() > 0:
 | 
				
			||||||
 | 
					            tabButton = gtk.Button()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            tabButton.connect('clicked', self.remove_tab, (nb, text))
 | 
				
			||||||
 | 
					            #Add a picture on a button
 | 
				
			||||||
 | 
					            self.add_icon_to_button(tabButton)
 | 
				
			||||||
 | 
					            tabBox.pack_start(tabButton, False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # needed, otherwise even calling show_all on the notebook won't
 | 
				
			||||||
 | 
					        # make the hbox contents appear.
 | 
				
			||||||
 | 
					        tabBox.show_all()
 | 
				
			||||||
 | 
					        return eventBox
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def add_icon_to_button(self, button):
 | 
				
			||||||
 | 
					        iconBox = gtk.HBox(False, 0)        
 | 
				
			||||||
 | 
					        image = gtk.Image()
 | 
				
			||||||
 | 
					        image.set_from_stock(gtk.STOCK_CLOSE, gtk.ICON_SIZE_MENU)
 | 
				
			||||||
 | 
					        gtk.Button.set_relief(button, gtk.RELIEF_NONE)
 | 
				
			||||||
 | 
					        settings = gtk.Widget.get_settings(button);
 | 
				
			||||||
 | 
					        (w,h) = gtk.icon_size_lookup_for_settings(settings, gtk.ICON_SIZE_MENU);
 | 
				
			||||||
 | 
					        gtk.Widget.set_size_request (button, w + 4, h + 4);
 | 
				
			||||||
 | 
					        image.show()
 | 
				
			||||||
 | 
					        iconBox.pack_start(image, True, False, 0)
 | 
				
			||||||
 | 
					        button.add(iconBox)
 | 
				
			||||||
 | 
					        iconBox.show()
 | 
				
			||||||
 | 
					        return 
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # Remove a page from the notebook
 | 
				
			||||||
 | 
					    def remove_tab(self, button, data):
 | 
				
			||||||
 | 
					        (nb, text) = data
 | 
				
			||||||
 | 
					        page = -1
 | 
				
			||||||
 | 
					        #print "\n remove_tab: start", text
 | 
				
			||||||
 | 
					        for i, tab in enumerate(self.nb_tabs):
 | 
				
			||||||
 | 
					            if text == tab:
 | 
				
			||||||
 | 
					                page = i
 | 
				
			||||||
 | 
					        #print "   page =", page
 | 
				
			||||||
 | 
					        if page >= 0 and page < self.nb.get_n_pages():
 | 
				
			||||||
 | 
					            #print "   removing page", page
 | 
				
			||||||
 | 
					            del self.nb_tabs[page]
 | 
				
			||||||
 | 
					            nb.remove_page(page)
 | 
				
			||||||
 | 
					        # Need to refresh the widget -- 
 | 
				
			||||||
 | 
					        # This forces the widget to redraw itself.
 | 
				
			||||||
 | 
					        #nb.queue_draw_area(0,0,-1,-1) needed or not??
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def delete_event(self, widget, event, data=None):
 | 
					    def delete_event(self, widget, event, data=None):
 | 
				
			||||||
        return False
 | 
					        return False
 | 
				
			||||||
| 
						 | 
					@ -146,6 +207,20 @@ class fpdb:
 | 
				
			||||||
        dia.run()
 | 
					        dia.run()
 | 
				
			||||||
        dia.destroy()
 | 
					        dia.destroy()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def dia_preferences(self, widget, data=None):
 | 
				
			||||||
 | 
					        dia = gtk.Dialog("Preferences",
 | 
				
			||||||
 | 
					                         self.window,
 | 
				
			||||||
 | 
					                         gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
 | 
				
			||||||
 | 
					                         (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
 | 
				
			||||||
 | 
					                          gtk.STOCK_SAVE, gtk.RESPONSE_ACCEPT))
 | 
				
			||||||
 | 
					        dia.set_default_size(500, 500)
 | 
				
			||||||
 | 
					        prefs = GuiPrefs.GuiPrefs(self.config, self.window, dia.vbox)
 | 
				
			||||||
 | 
					        response = dia.run()
 | 
				
			||||||
 | 
					        if response == gtk.RESPONSE_ACCEPT:
 | 
				
			||||||
 | 
					            # save updated config
 | 
				
			||||||
 | 
					            self.config.save()
 | 
				
			||||||
 | 
					        dia.destroy()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def dia_create_del_database(self, widget, data=None):
 | 
					    def dia_create_del_database(self, widget, data=None):
 | 
				
			||||||
        self.warning_box("Unimplemented: Create/Delete Database")
 | 
					        self.warning_box("Unimplemented: Create/Delete Database")
 | 
				
			||||||
        self.obtain_global_lock()
 | 
					        self.obtain_global_lock()
 | 
				
			||||||
| 
						 | 
					@ -350,6 +425,7 @@ class fpdb:
 | 
				
			||||||
                  <menuitem action="LoadProf"/>
 | 
					                  <menuitem action="LoadProf"/>
 | 
				
			||||||
                  <menuitem action="EditProf"/>
 | 
					                  <menuitem action="EditProf"/>
 | 
				
			||||||
                  <menuitem action="SaveProf"/>
 | 
					                  <menuitem action="SaveProf"/>
 | 
				
			||||||
 | 
					                  <menuitem action="Preferences"/>
 | 
				
			||||||
                  <separator/>
 | 
					                  <separator/>
 | 
				
			||||||
                  <menuitem action="Quit"/>
 | 
					                  <menuitem action="Quit"/>
 | 
				
			||||||
                </menu>
 | 
					                </menu>
 | 
				
			||||||
| 
						 | 
					@ -396,6 +472,7 @@ class fpdb:
 | 
				
			||||||
                                 ('LoadProf', None, '_Load Profile (broken)', '<control>L', 'Load your profile', self.dia_load_profile),
 | 
					                                 ('LoadProf', None, '_Load Profile (broken)', '<control>L', 'Load your profile', self.dia_load_profile),
 | 
				
			||||||
                                 ('EditProf', None, '_Edit Profile (todo)', '<control>E', 'Edit your profile', self.dia_edit_profile),
 | 
					                                 ('EditProf', None, '_Edit Profile (todo)', '<control>E', 'Edit your profile', self.dia_edit_profile),
 | 
				
			||||||
                                 ('SaveProf', None, '_Save Profile (todo)', '<control>S', 'Save your profile', self.dia_save_profile),
 | 
					                                 ('SaveProf', None, '_Save Profile (todo)', '<control>S', 'Save your profile', self.dia_save_profile),
 | 
				
			||||||
 | 
					                                 ('Preferences', None, '_Preferences', None, 'Edit your preferences', self.dia_preferences),
 | 
				
			||||||
                                 ('import', None, '_Import'),
 | 
					                                 ('import', None, '_Import'),
 | 
				
			||||||
                                 ('sethharchive', None, '_Set HandHistory Archive Directory', None, 'Set HandHistory Archive Directory', self.select_hhArchiveBase),
 | 
					                                 ('sethharchive', None, '_Set HandHistory Archive Directory', None, 'Set HandHistory Archive Directory', self.select_hhArchiveBase),
 | 
				
			||||||
                                 ('bulkimp', None, '_Bulk Import', '<control>B', 'Bulk Import', self.tab_bulk_import),
 | 
					                                 ('bulkimp', None, '_Bulk Import', '<control>B', 'Bulk Import', self.tab_bulk_import),
 | 
				
			||||||
| 
						 | 
					@ -456,6 +533,10 @@ class fpdb:
 | 
				
			||||||
        except Exceptions.FpdbMySQLAccessDenied:
 | 
					        except Exceptions.FpdbMySQLAccessDenied:
 | 
				
			||||||
            self.warning_box("MySQL Server reports: Access denied. Are your permissions set correctly?")
 | 
					            self.warning_box("MySQL Server reports: Access denied. Are your permissions set correctly?")
 | 
				
			||||||
            exit()
 | 
					            exit()
 | 
				
			||||||
 | 
					        except Exceptions.FpdbMySQLNoDatabase:
 | 
				
			||||||
 | 
					            msg = "MySQL client reports: 2002 error. Unable to connect - Please check that the MySQL service has been started"
 | 
				
			||||||
 | 
					            self.warning_box(msg)
 | 
				
			||||||
 | 
					            exit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#        except FpdbMySQLFailedError:
 | 
					#        except FpdbMySQLFailedError:
 | 
				
			||||||
#            self.warning_box("Unable to connect to MySQL! Is the MySQL server running?!", "FPDB ERROR")
 | 
					#            self.warning_box("Unable to connect to MySQL! Is the MySQL server running?!", "FPDB ERROR")
 | 
				
			||||||
| 
						 | 
					@ -611,18 +692,14 @@ This program is licensed under the AGPL3, see docs"""+os.sep+"agpl-3.0.txt")
 | 
				
			||||||
        menubar.show()
 | 
					        menubar.show()
 | 
				
			||||||
        #done menubar
 | 
					        #done menubar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.nb = gtk.Notebook()
 | 
				
			||||||
 | 
					        self.nb.set_show_tabs(True)
 | 
				
			||||||
 | 
					        self.nb.show()
 | 
				
			||||||
 | 
					        self.main_vbox.pack_start(self.nb, True, True, 0)
 | 
				
			||||||
 | 
					        self.pages=[]
 | 
				
			||||||
        self.tabs=[]
 | 
					        self.tabs=[]
 | 
				
			||||||
        self.tab_names=[]
 | 
					        self.tab_names=[]
 | 
				
			||||||
        self.tab_buttons=[]
 | 
					        self.nb_tabs=[]
 | 
				
			||||||
        self.tab_box = gtk.HBox(True,1)
 | 
					 | 
				
			||||||
        self.main_vbox.pack_start(self.tab_box, False, True, 0)
 | 
					 | 
				
			||||||
        self.tab_box.show()
 | 
					 | 
				
			||||||
        #done tab bar
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        self.current_tab = gtk.VBox(False,1)
 | 
					 | 
				
			||||||
        self.current_tab.set_border_width(1)
 | 
					 | 
				
			||||||
        self.main_vbox.add(self.current_tab)
 | 
					 | 
				
			||||||
        self.current_tab.show()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.tab_main_help(None, None)
 | 
					        self.tab_main_help(None, None)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -106,6 +106,8 @@ class fpdb_db:
 | 
				
			||||||
            except MySQLdb.Error, ex:
 | 
					            except MySQLdb.Error, ex:
 | 
				
			||||||
                if ex.args[0] == 1045:
 | 
					                if ex.args[0] == 1045:
 | 
				
			||||||
                    raise FpdbMySQLAccessDenied(ex.args[0], ex.args[1])
 | 
					                    raise FpdbMySQLAccessDenied(ex.args[0], ex.args[1])
 | 
				
			||||||
 | 
					                elif ex.args[0] == 2002:
 | 
				
			||||||
 | 
					                    raise FpdbMySQLNoDatabase(ex.args[0], ex.args[1])
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
                    print "*** WARNING UNKNOWN MYSQL ERROR", ex
 | 
					                    print "*** WARNING UNKNOWN MYSQL ERROR", ex
 | 
				
			||||||
        elif backend == fpdb_db.PGSQL:
 | 
					        elif backend == fpdb_db.PGSQL:
 | 
				
			||||||
| 
						 | 
					@ -149,11 +151,11 @@ class fpdb_db:
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                logging.warning("SQLite won't work well without 'sqlalchemy' installed.")
 | 
					                logging.warning("SQLite won't work well without 'sqlalchemy' installed.")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if not os.path.isdir(Configuration.DIR_DATABASES):
 | 
					            if not os.path.isdir(Configuration.DIR_DATABASES) and not database ==  ":memory:":
 | 
				
			||||||
                print "Creating directory: '%s'" % (Configuration.DIR_DATABASES)
 | 
					                print "Creating directory: '%s'" % (Configuration.DIR_DATABASES)
 | 
				
			||||||
                os.mkdir(Configuration.DIR_DATABASES)
 | 
					                os.mkdir(Configuration.DIR_DATABASES)
 | 
				
			||||||
            self.db = sqlite3.connect( os.path.join(Configuration.DIR_DATABASES, database)
 | 
					                database = os.path.join(Configuration.DIR_DATABASE, database)
 | 
				
			||||||
                                     , detect_types=sqlite3.PARSE_DECLTYPES )
 | 
					            self.db = sqlite3.connect(database, detect_types=sqlite3.PARSE_DECLTYPES )
 | 
				
			||||||
            sqlite3.register_converter("bool", lambda x: bool(int(x)))
 | 
					            sqlite3.register_converter("bool", lambda x: bool(int(x)))
 | 
				
			||||||
            sqlite3.register_adapter(bool, lambda x: "1" if x else "0")
 | 
					            sqlite3.register_adapter(bool, lambda x: "1" if x else "0")
 | 
				
			||||||
            self.db.create_function("floor", 1, math.floor)
 | 
					            self.db.create_function("floor", 1, math.floor)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,7 +51,7 @@ except ImportError:
 | 
				
			||||||
    log.debug("Import database module: MySQLdb not found")
 | 
					    log.debug("Import database module: MySQLdb not found")
 | 
				
			||||||
else:
 | 
					else:
 | 
				
			||||||
    mysqlLibFound = True
 | 
					    mysqlLibFound = True
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
try:
 | 
					try:
 | 
				
			||||||
    import psycopg2
 | 
					    import psycopg2
 | 
				
			||||||
except ImportError:
 | 
					except ImportError:
 | 
				
			||||||
| 
						 | 
					@ -81,7 +81,7 @@ class Importer:
 | 
				
			||||||
        self.pos_in_file = {}        # dict to remember how far we have read in the file
 | 
					        self.pos_in_file = {}        # dict to remember how far we have read in the file
 | 
				
			||||||
        #Set defaults
 | 
					        #Set defaults
 | 
				
			||||||
        self.callHud    = self.config.get_import_parameters().get("callFpdbHud")
 | 
					        self.callHud    = self.config.get_import_parameters().get("callFpdbHud")
 | 
				
			||||||
       
 | 
					
 | 
				
			||||||
        # CONFIGURATION OPTIONS
 | 
					        # CONFIGURATION OPTIONS
 | 
				
			||||||
        self.settings.setdefault("minPrint", 30)
 | 
					        self.settings.setdefault("minPrint", 30)
 | 
				
			||||||
        self.settings.setdefault("handCount", 0)
 | 
					        self.settings.setdefault("handCount", 0)
 | 
				
			||||||
| 
						 | 
					@ -243,9 +243,9 @@ class Importer:
 | 
				
			||||||
                #self.writeq.join()
 | 
					                #self.writeq.join()
 | 
				
			||||||
                #using empty() might be more reliable:
 | 
					                #using empty() might be more reliable:
 | 
				
			||||||
                while not self.writeq.empty() and len(threading.enumerate()) > 1:
 | 
					                while not self.writeq.empty() and len(threading.enumerate()) > 1:
 | 
				
			||||||
                    # TODO: Do we need to actually tell the progress indicator to move, or is it already moving, and we just need to process events... 
 | 
					                    # TODO: Do we need to actually tell the progress indicator to move, or is it already moving, and we just need to process events...
 | 
				
			||||||
                    while gtk.events_pending(): # see http://faq.pygtk.org/index.py?req=index for more hints (3.7)
 | 
					                    while gtk.events_pending(): # see http://faq.pygtk.org/index.py?req=index for more hints (3.7)
 | 
				
			||||||
                        gtk.main_iteration(False)                
 | 
					                        gtk.main_iteration(False)
 | 
				
			||||||
                    sleep(0.5)
 | 
					                    sleep(0.5)
 | 
				
			||||||
                print "                              ... writers finished"
 | 
					                print "                              ... writers finished"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -267,7 +267,7 @@ class Importer:
 | 
				
			||||||
        """"Read filenames in self.filelist and pass to import_file_dict().
 | 
					        """"Read filenames in self.filelist and pass to import_file_dict().
 | 
				
			||||||
            Uses a separate database connection if created as a thread (caller
 | 
					            Uses a separate database connection if created as a thread (caller
 | 
				
			||||||
            passes None or no param as db)."""
 | 
					            passes None or no param as db)."""
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        totstored = 0
 | 
					        totstored = 0
 | 
				
			||||||
        totdups = 0
 | 
					        totdups = 0
 | 
				
			||||||
        totpartial = 0
 | 
					        totpartial = 0
 | 
				
			||||||
| 
						 | 
					@ -300,7 +300,7 @@ class Importer:
 | 
				
			||||||
            except:
 | 
					            except:
 | 
				
			||||||
                pass # if this fails we're probably doomed anyway
 | 
					                pass # if this fails we're probably doomed anyway
 | 
				
			||||||
        if self.settings['handsInDB'] < 5000:  return "drop"
 | 
					        if self.settings['handsInDB'] < 5000:  return "drop"
 | 
				
			||||||
        if len(self.filelist) < 50:            return "don't drop"     
 | 
					        if len(self.filelist) < 50:            return "don't drop"
 | 
				
			||||||
        if self.settings['handsInDB'] > 50000: return "don't drop"
 | 
					        if self.settings['handsInDB'] > 50000: return "don't drop"
 | 
				
			||||||
        return "drop"
 | 
					        return "drop"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -313,7 +313,7 @@ class Importer:
 | 
				
			||||||
        size_per_hand = 1300.0  # wag based on a PS 6-up FLHE file. Actual value not hugely important
 | 
					        size_per_hand = 1300.0  # wag based on a PS 6-up FLHE file. Actual value not hugely important
 | 
				
			||||||
                                # as values of scale and increment compensate for it anyway.
 | 
					                                # as values of scale and increment compensate for it anyway.
 | 
				
			||||||
                                # decimal used to force float arithmetic
 | 
					                                # decimal used to force float arithmetic
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        # get number of hands in db
 | 
					        # get number of hands in db
 | 
				
			||||||
        if 'handsInDB' not in self.settings:
 | 
					        if 'handsInDB' not in self.settings:
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
| 
						 | 
					@ -322,7 +322,7 @@ class Importer:
 | 
				
			||||||
                self.settings['handsInDB'] = tmpcursor.fetchone()[0]
 | 
					                self.settings['handsInDB'] = tmpcursor.fetchone()[0]
 | 
				
			||||||
            except:
 | 
					            except:
 | 
				
			||||||
                pass # if this fails we're probably doomed anyway
 | 
					                pass # if this fails we're probably doomed anyway
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        # add up size of import files
 | 
					        # add up size of import files
 | 
				
			||||||
        total_size = 0.0
 | 
					        total_size = 0.0
 | 
				
			||||||
        for file in self.filelist:
 | 
					        for file in self.filelist:
 | 
				
			||||||
| 
						 | 
					@ -344,12 +344,12 @@ class Importer:
 | 
				
			||||||
        #Check for new files in monitored directories
 | 
					        #Check for new files in monitored directories
 | 
				
			||||||
        #todo: make efficient - always checks for new file, should be able to use mtime of directory
 | 
					        #todo: make efficient - always checks for new file, should be able to use mtime of directory
 | 
				
			||||||
        # ^^ May not work on windows
 | 
					        # ^^ May not work on windows
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        #rulog = open('runUpdated.txt', 'a')
 | 
					        #rulog = open('runUpdated.txt', 'a')
 | 
				
			||||||
        #rulog.writelines("runUpdated ... ")
 | 
					        #rulog.writelines("runUpdated ... ")
 | 
				
			||||||
        for site in self.dirlist:
 | 
					        for site in self.dirlist:
 | 
				
			||||||
            self.addImportDirectory(self.dirlist[site][0], False, site, self.dirlist[site][1])
 | 
					            self.addImportDirectory(self.dirlist[site][0], False, site, self.dirlist[site][1])
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
        for file in self.filelist:
 | 
					        for file in self.filelist:
 | 
				
			||||||
            if os.path.exists(file):
 | 
					            if os.path.exists(file):
 | 
				
			||||||
                stat_info = os.stat(file)
 | 
					                stat_info = os.stat(file)
 | 
				
			||||||
| 
						 | 
					@ -369,13 +369,13 @@ class Importer:
 | 
				
			||||||
                        self.updatedtime[file] = time()
 | 
					                        self.updatedtime[file] = time()
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                self.removeFromFileList[file] = True
 | 
					                self.removeFromFileList[file] = True
 | 
				
			||||||
                
 | 
					
 | 
				
			||||||
        self.addToDirList = filter(lambda x: self.addImportDirectory(x, True, self.addToDirList[x][0], self.addToDirList[x][1]), self.addToDirList)
 | 
					        self.addToDirList = filter(lambda x: self.addImportDirectory(x, True, self.addToDirList[x][0], self.addToDirList[x][1]), self.addToDirList)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for file in self.removeFromFileList:
 | 
					        for file in self.removeFromFileList:
 | 
				
			||||||
            if file in self.filelist:
 | 
					            if file in self.filelist:
 | 
				
			||||||
                del self.filelist[file]
 | 
					                del self.filelist[file]
 | 
				
			||||||
       
 | 
					
 | 
				
			||||||
        self.addToDirList = {}
 | 
					        self.addToDirList = {}
 | 
				
			||||||
        self.removeFromFileList = {}
 | 
					        self.removeFromFileList = {}
 | 
				
			||||||
        self.database.rollback()
 | 
					        self.database.rollback()
 | 
				
			||||||
| 
						 | 
					@ -385,7 +385,7 @@ class Importer:
 | 
				
			||||||
    # This is now an internal function that should not be called directly.
 | 
					    # This is now an internal function that should not be called directly.
 | 
				
			||||||
    def import_file_dict(self, db, file, site, filter, q=None):
 | 
					    def import_file_dict(self, db, file, site, filter, q=None):
 | 
				
			||||||
        #print "import_file_dict"
 | 
					        #print "import_file_dict"
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        if os.path.isdir(file):
 | 
					        if os.path.isdir(file):
 | 
				
			||||||
            self.addToDirList[file] = [site] + [filter]
 | 
					            self.addToDirList[file] = [site] + [filter]
 | 
				
			||||||
            return
 | 
					            return
 | 
				
			||||||
| 
						 | 
					@ -393,7 +393,7 @@ class Importer:
 | 
				
			||||||
        conv = None
 | 
					        conv = None
 | 
				
			||||||
        (stored, duplicates, partial, errors, ttime) = (0, 0, 0, 0, 0)
 | 
					        (stored, duplicates, partial, errors, ttime) = (0, 0, 0, 0, 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        file =  file.decode(fpdb_simple.LOCALE_ENCODING) 
 | 
					        file =  file.decode(fpdb_simple.LOCALE_ENCODING)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Load filter, process file, pass returned filename to import_fpdb_file
 | 
					        # Load filter, process file, pass returned filename to import_fpdb_file
 | 
				
			||||||
        if self.settings['threads'] > 0 and self.writeq is not None:
 | 
					        if self.settings['threads'] > 0 and self.writeq is not None:
 | 
				
			||||||
| 
						 | 
					@ -473,7 +473,7 @@ class Importer:
 | 
				
			||||||
        ttime = time() - starttime
 | 
					        ttime = time() - starttime
 | 
				
			||||||
        if q is None:
 | 
					        if q is None:
 | 
				
			||||||
            log.info("Total stored: %(stored)d\tduplicates:%(duplicates)d\terrors:%(errors)d\ttime:%(ttime)s" % locals())
 | 
					            log.info("Total stored: %(stored)d\tduplicates:%(duplicates)d\terrors:%(errors)d\ttime:%(ttime)s" % locals())
 | 
				
			||||||
       
 | 
					
 | 
				
			||||||
        if not stored:
 | 
					        if not stored:
 | 
				
			||||||
            if duplicates:
 | 
					            if duplicates:
 | 
				
			||||||
                for line_no in xrange(len(self.lines)):
 | 
					                for line_no in xrange(len(self.lines)):
 | 
				
			||||||
| 
						 | 
					@ -488,7 +488,7 @@ class Importer:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return (stored, duplicates, partial, errors, ttime)
 | 
					        return (stored, duplicates, partial, errors, ttime)
 | 
				
			||||||
    # end def import_fpdb_file
 | 
					    # end def import_fpdb_file
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def import_fpdb_lines(self, db, lines, starttime, file, site, q = None):
 | 
					    def import_fpdb_lines(self, db, lines, starttime, file, site, q = None):
 | 
				
			||||||
        """Import an fpdb hand history held in the list lines, could be one hand or many"""
 | 
					        """Import an fpdb hand history held in the list lines, could be one hand or many"""
 | 
				
			||||||
| 
						 | 
					@ -496,7 +496,7 @@ class Importer:
 | 
				
			||||||
        #db.lock_for_insert() # should be ok when using one thread, but doesn't help??
 | 
					        #db.lock_for_insert() # should be ok when using one thread, but doesn't help??
 | 
				
			||||||
        while gtk.events_pending():
 | 
					        while gtk.events_pending():
 | 
				
			||||||
            gtk.main_iteration(False)
 | 
					            gtk.main_iteration(False)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        try: # sometimes we seem to be getting an empty self.lines, in which case, we just want to return.
 | 
					        try: # sometimes we seem to be getting an empty self.lines, in which case, we just want to return.
 | 
				
			||||||
            firstline = lines[0]
 | 
					            firstline = lines[0]
 | 
				
			||||||
        except:
 | 
					        except:
 | 
				
			||||||
| 
						 | 
					@ -524,7 +524,7 @@ class Importer:
 | 
				
			||||||
            if len(lines[i]) < 2: #Wierd way to detect for '\r\n' or '\n'
 | 
					            if len(lines[i]) < 2: #Wierd way to detect for '\r\n' or '\n'
 | 
				
			||||||
                endpos = i
 | 
					                endpos = i
 | 
				
			||||||
                hand = lines[startpos:endpos]
 | 
					                hand = lines[startpos:endpos]
 | 
				
			||||||
       
 | 
					
 | 
				
			||||||
                if len(hand[0]) < 2:
 | 
					                if len(hand[0]) < 2:
 | 
				
			||||||
                    hand=hand[1:]
 | 
					                    hand=hand[1:]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -548,7 +548,7 @@ class Importer:
 | 
				
			||||||
                        if self.callHud:
 | 
					                        if self.callHud:
 | 
				
			||||||
                            #print "call to HUD here. handsId:",handsId
 | 
					                            #print "call to HUD here. handsId:",handsId
 | 
				
			||||||
                            #pipe the Hands.id out to the HUD
 | 
					                            #pipe the Hands.id out to the HUD
 | 
				
			||||||
                            print "fpdb_import: sending hand to hud", handsId, "pipe =", self.caller.pipe_to_hud
 | 
					                            # print "fpdb_import: sending hand to hud", handsId, "pipe =", self.caller.pipe_to_hud
 | 
				
			||||||
                            self.caller.pipe_to_hud.stdin.write("%s" % (handsId) + os.linesep)
 | 
					                            self.caller.pipe_to_hud.stdin.write("%s" % (handsId) + os.linesep)
 | 
				
			||||||
                    except Exceptions.DuplicateError:
 | 
					                    except Exceptions.DuplicateError:
 | 
				
			||||||
                        duplicates += 1
 | 
					                        duplicates += 1
 | 
				
			||||||
| 
						 | 
					@ -574,7 +574,7 @@ class Importer:
 | 
				
			||||||
                    if self.settings['minPrint']:
 | 
					                    if self.settings['minPrint']:
 | 
				
			||||||
                        if not ((stored+duplicates+errors) % self.settings['minPrint']):
 | 
					                        if not ((stored+duplicates+errors) % self.settings['minPrint']):
 | 
				
			||||||
                            print "stored:", stored, "   duplicates:", duplicates, "errors:", errors
 | 
					                            print "stored:", stored, "   duplicates:", duplicates, "errors:", errors
 | 
				
			||||||
           
 | 
					
 | 
				
			||||||
                    if self.settings['handCount']:
 | 
					                    if self.settings['handCount']:
 | 
				
			||||||
                        if ((stored+duplicates+errors) >= self.settings['handCount']):
 | 
					                        if ((stored+duplicates+errors) >= self.settings['handCount']):
 | 
				
			||||||
                            if not self.settings['quiet']:
 | 
					                            if not self.settings['quiet']:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,971 @@
 | 
				
			||||||
 | 
					PokerStars Game #35839001292:  Triple Draw 2-7 Lowball Limit ($0.10/$0.20 USD) - 2009/11/25 14:12:58 ET
 | 
				
			||||||
 | 
					Table 'Theodora VI' 6-max Seat #5 is the button
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($4 in chips) 
 | 
				
			||||||
 | 
					Seat 2: rumble1111 ($4.58 in chips) 
 | 
				
			||||||
 | 
					Seat 3: Eisenherz73 ($7.54 in chips) 
 | 
				
			||||||
 | 
					Seat 4: cypis28 ($1.40 in chips) 
 | 
				
			||||||
 | 
					Seat 5: bakter9 ($0.78 in chips) 
 | 
				
			||||||
 | 
					Seat 6: TheLabman ($6.31 in chips) 
 | 
				
			||||||
 | 
					TheLabman: posts small blind $0.05
 | 
				
			||||||
 | 
					s0rrow: posts big blind $0.10
 | 
				
			||||||
 | 
					*** DEALING HANDS ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [8s Ts 8h 2s 3s]
 | 
				
			||||||
 | 
					rumble1111: calls $0.10
 | 
				
			||||||
 | 
					Eisenherz73: folds 
 | 
				
			||||||
 | 
					cypis28: raises $0.10 to $0.20
 | 
				
			||||||
 | 
					bakter9: raises $0.10 to $0.30
 | 
				
			||||||
 | 
					TheLabman: folds 
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					rumble1111: calls $0.20
 | 
				
			||||||
 | 
					cypis28: raises $0.10 to $0.40
 | 
				
			||||||
 | 
					Betting is capped
 | 
				
			||||||
 | 
					bakter9: calls $0.10
 | 
				
			||||||
 | 
					rumble1111: calls $0.10
 | 
				
			||||||
 | 
					*** FIRST DRAW ***
 | 
				
			||||||
 | 
					rumble1111: discards 2 cards
 | 
				
			||||||
 | 
					cypis28: discards 2 cards
 | 
				
			||||||
 | 
					bakter9: discards 1 card
 | 
				
			||||||
 | 
					rumble1111: checks 
 | 
				
			||||||
 | 
					cypis28: bets $0.10
 | 
				
			||||||
 | 
					bakter9: raises $0.10 to $0.20
 | 
				
			||||||
 | 
					rumble1111: folds 
 | 
				
			||||||
 | 
					cypis28: calls $0.10
 | 
				
			||||||
 | 
					*** SECOND DRAW ***
 | 
				
			||||||
 | 
					cypis28: discards 1 card
 | 
				
			||||||
 | 
					bakter9: stands pat 
 | 
				
			||||||
 | 
					cypis28: bets $0.20
 | 
				
			||||||
 | 
					bakter9: calls $0.18 and is all-in
 | 
				
			||||||
 | 
					Uncalled bet ($0.02) returned to cypis28
 | 
				
			||||||
 | 
					*** THIRD DRAW ***
 | 
				
			||||||
 | 
					cypis28: stands pat 
 | 
				
			||||||
 | 
					bakter9: stands pat 
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					cypis28: shows [7c 6d 9c 4s 2c] (Lo: 9,7,6,4,2)
 | 
				
			||||||
 | 
					bakter9: shows [7s 5s 8d 4h 3c] (Lo: 8,7,5,4,3)
 | 
				
			||||||
 | 
					bakter9 collected $2.01 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $2.11 | Rake $0.10 
 | 
				
			||||||
 | 
					Seat 1: s0rrow (big blind) folded before the Draw
 | 
				
			||||||
 | 
					Seat 2: rumble1111 folded after the 1st Draw
 | 
				
			||||||
 | 
					Seat 3: Eisenherz73 folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 4: cypis28 showed [7c 6d 9c 4s 2c] and lost with Lo: 9,7,6,4,2
 | 
				
			||||||
 | 
					Seat 5: bakter9 (button) showed [7s 5s 8d 4h 3c] and won ($2.01) with Lo: 8,7,5,4,3
 | 
				
			||||||
 | 
					Seat 6: TheLabman (small blind) folded before the Draw
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35839050562:  Triple Draw 2-7 Lowball Limit ($0.10/$0.20 USD) - 2009/11/25 14:14:02 ET
 | 
				
			||||||
 | 
					Table 'Theodora VI' 6-max Seat #6 is the button
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($3.90 in chips) 
 | 
				
			||||||
 | 
					Seat 2: rumble1111 ($4.18 in chips) 
 | 
				
			||||||
 | 
					Seat 3: Eisenherz73 ($7.54 in chips) 
 | 
				
			||||||
 | 
					Seat 4: cypis28 ($0.62 in chips) 
 | 
				
			||||||
 | 
					Seat 5: bakter9 ($2.01 in chips) 
 | 
				
			||||||
 | 
					Seat 6: TheLabman ($6.26 in chips) 
 | 
				
			||||||
 | 
					s0rrow: posts small blind $0.05
 | 
				
			||||||
 | 
					rumble1111: posts big blind $0.10
 | 
				
			||||||
 | 
					*** DEALING HANDS ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [Kh Th 3d Tc 7c]
 | 
				
			||||||
 | 
					Eisenherz73: folds 
 | 
				
			||||||
 | 
					cypis28: folds 
 | 
				
			||||||
 | 
					bakter9: calls $0.10
 | 
				
			||||||
 | 
					TheLabman: folds 
 | 
				
			||||||
 | 
					s0rrow: calls $0.05
 | 
				
			||||||
 | 
					rumble1111: checks 
 | 
				
			||||||
 | 
					*** FIRST DRAW ***
 | 
				
			||||||
 | 
					s0rrow: discards 2 cards [Kh Th]
 | 
				
			||||||
 | 
					Dealt to s0rrow [3d Tc 7c] [5c Qs]
 | 
				
			||||||
 | 
					rumble1111: discards 2 cards
 | 
				
			||||||
 | 
					bakter9: discards 2 cards
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					rumble1111: bets $0.10
 | 
				
			||||||
 | 
					bakter9: folds 
 | 
				
			||||||
 | 
					s0rrow: calls $0.10
 | 
				
			||||||
 | 
					*** SECOND DRAW ***
 | 
				
			||||||
 | 
					s0rrow: discards 2 cards [Qs Tc]
 | 
				
			||||||
 | 
					Dealt to s0rrow [3d 7c 5c] [4c 2s]
 | 
				
			||||||
 | 
					rumble1111: stands pat 
 | 
				
			||||||
 | 
					s0rrow: bets $0.20
 | 
				
			||||||
 | 
					rumble1111: calls $0.20
 | 
				
			||||||
 | 
					*** THIRD DRAW ***
 | 
				
			||||||
 | 
					s0rrow: stands pat on [3d 7c 5c 4c 2s]
 | 
				
			||||||
 | 
					rumble1111: discards 1 card
 | 
				
			||||||
 | 
					s0rrow: bets $0.20
 | 
				
			||||||
 | 
					rumble1111: calls $0.20
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					s0rrow: shows [5c 4c 3d 2s 7c] (Lo: 7,5,4,3,2)
 | 
				
			||||||
 | 
					rumble1111: mucks hand 
 | 
				
			||||||
 | 
					s0rrow collected $1.24 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $1.30 | Rake $0.06 
 | 
				
			||||||
 | 
					Seat 1: s0rrow (small blind) showed [5c 4c 3d 2s 7c] and won ($1.24) with Lo: 7,5,4,3,2
 | 
				
			||||||
 | 
					Seat 2: rumble1111 (big blind) mucked [8s 7d 3c 6d 2h]
 | 
				
			||||||
 | 
					Seat 3: Eisenherz73 folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 4: cypis28 folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 5: bakter9 folded after the 1st Draw
 | 
				
			||||||
 | 
					Seat 6: TheLabman (button) folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35839109592:  Triple Draw 2-7 Lowball Limit ($0.10/$0.20 USD) - 2009/11/25 14:15:18 ET
 | 
				
			||||||
 | 
					Table 'Theodora VI' 6-max Seat #1 is the button
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($4.54 in chips) 
 | 
				
			||||||
 | 
					Seat 2: rumble1111 ($3.58 in chips) 
 | 
				
			||||||
 | 
					Seat 3: Eisenherz73 ($7.54 in chips) 
 | 
				
			||||||
 | 
					Seat 4: cypis28 ($0.62 in chips) 
 | 
				
			||||||
 | 
					Seat 5: bakter9 ($1.91 in chips) 
 | 
				
			||||||
 | 
					Seat 6: TheLabman ($6.26 in chips) 
 | 
				
			||||||
 | 
					rumble1111: posts small blind $0.05
 | 
				
			||||||
 | 
					Eisenherz73: posts big blind $0.10
 | 
				
			||||||
 | 
					*** DEALING HANDS ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [Tc 9s Qc 8h 3d]
 | 
				
			||||||
 | 
					cypis28: folds 
 | 
				
			||||||
 | 
					bakter9: folds 
 | 
				
			||||||
 | 
					TheLabman: folds 
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					rumble1111: folds 
 | 
				
			||||||
 | 
					Uncalled bet ($0.05) returned to Eisenherz73
 | 
				
			||||||
 | 
					Eisenherz73 collected $0.10 from pot
 | 
				
			||||||
 | 
					Eisenherz73: doesn't show hand 
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.10 | Rake $0 
 | 
				
			||||||
 | 
					Seat 1: s0rrow (button) folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 2: rumble1111 (small blind) folded before the Draw
 | 
				
			||||||
 | 
					Seat 3: Eisenherz73 (big blind) collected ($0.10)
 | 
				
			||||||
 | 
					Seat 4: cypis28 folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 5: bakter9 folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 6: TheLabman folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35839118248:  Triple Draw 2-7 Lowball Limit ($0.10/$0.20 USD) - 2009/11/25 14:15:29 ET
 | 
				
			||||||
 | 
					Table 'Theodora VI' 6-max Seat #2 is the button
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($4.54 in chips) 
 | 
				
			||||||
 | 
					Seat 2: rumble1111 ($3.53 in chips) 
 | 
				
			||||||
 | 
					Seat 3: Eisenherz73 ($7.59 in chips) 
 | 
				
			||||||
 | 
					Seat 4: cypis28 ($0.62 in chips) 
 | 
				
			||||||
 | 
					Seat 5: bakter9 ($1.91 in chips) 
 | 
				
			||||||
 | 
					Seat 6: TheLabman ($6.26 in chips) 
 | 
				
			||||||
 | 
					Eisenherz73: posts small blind $0.05
 | 
				
			||||||
 | 
					cypis28: posts big blind $0.10
 | 
				
			||||||
 | 
					*** DEALING HANDS ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [Js 3d Qc 9s 5h]
 | 
				
			||||||
 | 
					bakter9: raises $0.10 to $0.20
 | 
				
			||||||
 | 
					TheLabman: folds 
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					rumble1111: folds 
 | 
				
			||||||
 | 
					Eisenherz73: folds 
 | 
				
			||||||
 | 
					cypis28: raises $0.10 to $0.30
 | 
				
			||||||
 | 
					bakter9: raises $0.10 to $0.40
 | 
				
			||||||
 | 
					Betting is capped
 | 
				
			||||||
 | 
					cypis28: calls $0.10
 | 
				
			||||||
 | 
					*** FIRST DRAW ***
 | 
				
			||||||
 | 
					cypis28: discards 2 cards
 | 
				
			||||||
 | 
					bakter9: discards 1 card
 | 
				
			||||||
 | 
					cypis28: bets $0.10
 | 
				
			||||||
 | 
					bakter9: raises $0.10 to $0.20
 | 
				
			||||||
 | 
					cypis28: raises $0.02 to $0.22 and is all-in
 | 
				
			||||||
 | 
					bakter9: calls $0.02
 | 
				
			||||||
 | 
					*** SECOND DRAW ***
 | 
				
			||||||
 | 
					cypis28: discards 1 card
 | 
				
			||||||
 | 
					bakter9: stands pat 
 | 
				
			||||||
 | 
					*** THIRD DRAW ***
 | 
				
			||||||
 | 
					cypis28: stands pat 
 | 
				
			||||||
 | 
					bakter9: stands pat 
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					cypis28: shows [7h 3s 2h 8h 6h] (Lo: 8,7,6,3,2)
 | 
				
			||||||
 | 
					bakter9: shows [4d 7c 2c 5s 6d] (Lo: 7,6,5,4,2)
 | 
				
			||||||
 | 
					bakter9 collected $1.23 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $1.29 | Rake $0.06 
 | 
				
			||||||
 | 
					Seat 1: s0rrow folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 2: rumble1111 (button) folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 3: Eisenherz73 (small blind) folded before the Draw
 | 
				
			||||||
 | 
					Seat 4: cypis28 (big blind) showed [7h 3s 2h 8h 6h] and lost with Lo: 8,7,6,3,2
 | 
				
			||||||
 | 
					Seat 5: bakter9 showed [4d 7c 2c 5s 6d] and won ($1.23) with Lo: 7,6,5,4,2
 | 
				
			||||||
 | 
					Seat 6: TheLabman folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35839149377:  Triple Draw 2-7 Lowball Limit ($0.10/$0.20 USD) - 2009/11/25 14:16:10 ET
 | 
				
			||||||
 | 
					Table 'Theodora VI' 6-max Seat #3 is the button
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($4.54 in chips) 
 | 
				
			||||||
 | 
					Seat 2: rumble1111 ($3.53 in chips) 
 | 
				
			||||||
 | 
					Seat 3: Eisenherz73 ($7.54 in chips) 
 | 
				
			||||||
 | 
					Seat 5: bakter9 ($2.52 in chips) 
 | 
				
			||||||
 | 
					Seat 6: TheLabman ($6.26 in chips) 
 | 
				
			||||||
 | 
					bakter9: posts small blind $0.05
 | 
				
			||||||
 | 
					TheLabman: posts big blind $0.10
 | 
				
			||||||
 | 
					*** DEALING HANDS ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [2c 3c Ts Jc Kc]
 | 
				
			||||||
 | 
					cypis28 leaves the table
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					rumble1111: folds 
 | 
				
			||||||
 | 
					Eisenherz73: folds 
 | 
				
			||||||
 | 
					bakter9: calls $0.05
 | 
				
			||||||
 | 
					TheLabman: checks 
 | 
				
			||||||
 | 
					*** FIRST DRAW ***
 | 
				
			||||||
 | 
					bakter9: discards 2 cards
 | 
				
			||||||
 | 
					tom1206 joins the table at seat #4 
 | 
				
			||||||
 | 
					TheLabman: discards 4 cards
 | 
				
			||||||
 | 
					bakter9: checks 
 | 
				
			||||||
 | 
					TheLabman: checks 
 | 
				
			||||||
 | 
					*** SECOND DRAW ***
 | 
				
			||||||
 | 
					bakter9: discards 1 card
 | 
				
			||||||
 | 
					TheLabman: discards 3 cards
 | 
				
			||||||
 | 
					bakter9: checks 
 | 
				
			||||||
 | 
					TheLabman: checks 
 | 
				
			||||||
 | 
					*** THIRD DRAW ***
 | 
				
			||||||
 | 
					bakter9: discards 1 card
 | 
				
			||||||
 | 
					TheLabman: discards 1 card
 | 
				
			||||||
 | 
					bakter9: bets $0.20
 | 
				
			||||||
 | 
					TheLabman: calls $0.20
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					bakter9: shows [5d 4h 8h 7d 6h] (Lo: a straight, Four to Eight)
 | 
				
			||||||
 | 
					TheLabman: shows [3h 6d 7h 5h 8d] (Lo: 8,7,6,5,3)
 | 
				
			||||||
 | 
					TheLabman collected $0.58 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.60 | Rake $0.02 
 | 
				
			||||||
 | 
					Seat 1: s0rrow folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 2: rumble1111 folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 3: Eisenherz73 (button) folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 5: bakter9 (small blind) showed [5d 4h 8h 7d 6h] and lost with Lo: a straight, Four to Eight
 | 
				
			||||||
 | 
					Seat 6: TheLabman (big blind) showed [3h 6d 7h 5h 8d] and won ($0.58) with Lo: 8,7,6,5,3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35839176665:  Triple Draw 2-7 Lowball Limit ($0.10/$0.20 USD) - 2009/11/25 14:16:46 ET
 | 
				
			||||||
 | 
					Table 'Theodora VI' 6-max Seat #5 is the button
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($4.54 in chips) 
 | 
				
			||||||
 | 
					Seat 2: rumble1111 ($3.53 in chips) 
 | 
				
			||||||
 | 
					Seat 3: Eisenherz73 ($7.54 in chips) 
 | 
				
			||||||
 | 
					Seat 4: tom1206 ($4 in chips) 
 | 
				
			||||||
 | 
					Seat 5: bakter9 ($2.22 in chips) 
 | 
				
			||||||
 | 
					Seat 6: TheLabman ($6.54 in chips) 
 | 
				
			||||||
 | 
					TheLabman: posts small blind $0.05
 | 
				
			||||||
 | 
					s0rrow: posts big blind $0.10
 | 
				
			||||||
 | 
					tom1206: posts big blind $0.10
 | 
				
			||||||
 | 
					*** DEALING HANDS ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [5d Js 7d Jd 4d]
 | 
				
			||||||
 | 
					rumble1111: calls $0.10
 | 
				
			||||||
 | 
					Eisenherz73: calls $0.10
 | 
				
			||||||
 | 
					tom1206: checks 
 | 
				
			||||||
 | 
					bakter9: folds 
 | 
				
			||||||
 | 
					TheLabman: calls $0.05
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					*** FIRST DRAW ***
 | 
				
			||||||
 | 
					TheLabman: discards 3 cards
 | 
				
			||||||
 | 
					s0rrow: discards 2 cards [Js Jd]
 | 
				
			||||||
 | 
					Dealt to s0rrow [5d 7d 4d] [6d 2s]
 | 
				
			||||||
 | 
					rumble1111: discards 2 cards
 | 
				
			||||||
 | 
					Eisenherz73: discards 2 cards
 | 
				
			||||||
 | 
					tom1206: discards 2 cards
 | 
				
			||||||
 | 
					TheLabman: checks 
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					rumble1111: checks 
 | 
				
			||||||
 | 
					Eisenherz73: checks 
 | 
				
			||||||
 | 
					tom1206: checks 
 | 
				
			||||||
 | 
					*** SECOND DRAW ***
 | 
				
			||||||
 | 
					TheLabman: discards 3 cards
 | 
				
			||||||
 | 
					s0rrow: stands pat on [5d 7d 4d 6d 2s]
 | 
				
			||||||
 | 
					rumble1111: discards 2 cards
 | 
				
			||||||
 | 
					Eisenherz73: discards 1 card
 | 
				
			||||||
 | 
					tom1206: discards 2 cards
 | 
				
			||||||
 | 
					TheLabman: checks 
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					rumble1111: checks 
 | 
				
			||||||
 | 
					Eisenherz73: checks 
 | 
				
			||||||
 | 
					tom1206: checks 
 | 
				
			||||||
 | 
					*** THIRD DRAW ***
 | 
				
			||||||
 | 
					TheLabman: discards 2 cards
 | 
				
			||||||
 | 
					s0rrow: stands pat on [5d 7d 4d 6d 2s]
 | 
				
			||||||
 | 
					rumble1111: discards 1 card
 | 
				
			||||||
 | 
					The deck is reshuffled
 | 
				
			||||||
 | 
					Eisenherz73: discards 1 card
 | 
				
			||||||
 | 
					tom1206: discards 2 cards
 | 
				
			||||||
 | 
					TheLabman: checks 
 | 
				
			||||||
 | 
					s0rrow: bets $0.20
 | 
				
			||||||
 | 
					rumble1111: folds 
 | 
				
			||||||
 | 
					Eisenherz73: folds 
 | 
				
			||||||
 | 
					Eisenherz73 is sitting out
 | 
				
			||||||
 | 
					Eisenherz73 leaves the table
 | 
				
			||||||
 | 
					tom1206: folds 
 | 
				
			||||||
 | 
					TheLabman: folds 
 | 
				
			||||||
 | 
					Uncalled bet ($0.20) returned to s0rrow
 | 
				
			||||||
 | 
					X USN-USMC joins the table at seat #3 
 | 
				
			||||||
 | 
					s0rrow collected $0.48 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.50 | Rake $0.02 
 | 
				
			||||||
 | 
					Seat 1: s0rrow (big blind) collected ($0.48)
 | 
				
			||||||
 | 
					Seat 2: rumble1111 folded after the 3rd Draw
 | 
				
			||||||
 | 
					Seat 3: Eisenherz73 folded after the 3rd Draw
 | 
				
			||||||
 | 
					Seat 4: tom1206 folded after the 3rd Draw
 | 
				
			||||||
 | 
					Seat 5: bakter9 (button) folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 6: TheLabman (small blind) folded after the 3rd Draw
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35839272371:  Triple Draw 2-7 Lowball Limit ($0.10/$0.20 USD) - 2009/11/25 14:18:50 ET
 | 
				
			||||||
 | 
					Table 'Theodora VI' 6-max Seat #6 is the button
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($4.92 in chips) 
 | 
				
			||||||
 | 
					Seat 2: rumble1111 ($3.43 in chips) 
 | 
				
			||||||
 | 
					Seat 3: X USN-USMC ($4 in chips) 
 | 
				
			||||||
 | 
					Seat 4: tom1206 ($3.90 in chips) 
 | 
				
			||||||
 | 
					Seat 5: bakter9 ($2.22 in chips) 
 | 
				
			||||||
 | 
					Seat 6: TheLabman ($6.44 in chips) 
 | 
				
			||||||
 | 
					s0rrow: posts small blind $0.05
 | 
				
			||||||
 | 
					rumble1111: posts big blind $0.10
 | 
				
			||||||
 | 
					X USN-USMC: posts big blind $0.10
 | 
				
			||||||
 | 
					*** DEALING HANDS ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [Th Js Kd 2h Qc]
 | 
				
			||||||
 | 
					X USN-USMC: checks 
 | 
				
			||||||
 | 
					tom1206 has timed out
 | 
				
			||||||
 | 
					tom1206: folds 
 | 
				
			||||||
 | 
					tom1206 is sitting out
 | 
				
			||||||
 | 
					bakter9: folds 
 | 
				
			||||||
 | 
					TheLabman: calls $0.10
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					tom1206 has returned
 | 
				
			||||||
 | 
					rumble1111: checks 
 | 
				
			||||||
 | 
					*** FIRST DRAW ***
 | 
				
			||||||
 | 
					rumble1111: discards 3 cards
 | 
				
			||||||
 | 
					X USN-USMC: discards 1 card
 | 
				
			||||||
 | 
					TheLabman: discards 2 cards
 | 
				
			||||||
 | 
					rumble1111: checks 
 | 
				
			||||||
 | 
					X USN-USMC: bets $0.10
 | 
				
			||||||
 | 
					TheLabman: calls $0.10
 | 
				
			||||||
 | 
					rumble1111: calls $0.10
 | 
				
			||||||
 | 
					*** SECOND DRAW ***
 | 
				
			||||||
 | 
					rumble1111 said, "other fckers"
 | 
				
			||||||
 | 
					rumble1111: discards 1 card
 | 
				
			||||||
 | 
					X USN-USMC: discards 1 card
 | 
				
			||||||
 | 
					TheLabman: discards 1 card
 | 
				
			||||||
 | 
					rumble1111: checks 
 | 
				
			||||||
 | 
					X USN-USMC: bets $0.20
 | 
				
			||||||
 | 
					TheLabman: calls $0.20
 | 
				
			||||||
 | 
					rumble1111: calls $0.20
 | 
				
			||||||
 | 
					*** THIRD DRAW ***
 | 
				
			||||||
 | 
					rumble1111: discards 1 card
 | 
				
			||||||
 | 
					X USN-USMC: discards 1 card
 | 
				
			||||||
 | 
					TheLabman: discards 1 card
 | 
				
			||||||
 | 
					rumble1111: checks 
 | 
				
			||||||
 | 
					X USN-USMC: bets $0.20
 | 
				
			||||||
 | 
					TheLabman: folds 
 | 
				
			||||||
 | 
					rumble1111: folds 
 | 
				
			||||||
 | 
					Uncalled bet ($0.20) returned to X USN-USMC
 | 
				
			||||||
 | 
					X USN-USMC collected $1.19 from pot
 | 
				
			||||||
 | 
					X USN-USMC: doesn't show hand 
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $1.25 | Rake $0.06 
 | 
				
			||||||
 | 
					Seat 1: s0rrow (small blind) folded before the Draw
 | 
				
			||||||
 | 
					Seat 2: rumble1111 (big blind) folded after the 3rd Draw
 | 
				
			||||||
 | 
					Seat 3: X USN-USMC collected ($1.19)
 | 
				
			||||||
 | 
					Seat 4: tom1206 folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 5: bakter9 folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 6: TheLabman (button) folded after the 3rd Draw
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35839360555:  Triple Draw 2-7 Lowball Limit ($0.10/$0.20 USD) - 2009/11/25 14:20:53 ET
 | 
				
			||||||
 | 
					Table 'Theodora VI' 6-max Seat #1 is the button
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($4.87 in chips) 
 | 
				
			||||||
 | 
					Seat 2: rumble1111 ($3.03 in chips) 
 | 
				
			||||||
 | 
					Seat 3: X USN-USMC ($4.79 in chips) 
 | 
				
			||||||
 | 
					Seat 4: tom1206 ($3.90 in chips) 
 | 
				
			||||||
 | 
					Seat 5: bakter9 ($2.22 in chips) 
 | 
				
			||||||
 | 
					Seat 6: TheLabman ($6.04 in chips) 
 | 
				
			||||||
 | 
					rumble1111: posts small blind $0.05
 | 
				
			||||||
 | 
					X USN-USMC: posts big blind $0.10
 | 
				
			||||||
 | 
					*** DEALING HANDS ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [9s Kh 2d Ks 4c]
 | 
				
			||||||
 | 
					tom1206: raises $0.10 to $0.20
 | 
				
			||||||
 | 
					bakter9: folds 
 | 
				
			||||||
 | 
					TheLabman: folds 
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					rumble1111: calls $0.15
 | 
				
			||||||
 | 
					X USN-USMC: calls $0.10
 | 
				
			||||||
 | 
					*** FIRST DRAW ***
 | 
				
			||||||
 | 
					rumble1111: discards 3 cards
 | 
				
			||||||
 | 
					X USN-USMC: discards 2 cards
 | 
				
			||||||
 | 
					tom1206: discards 2 cards
 | 
				
			||||||
 | 
					rumble1111: checks 
 | 
				
			||||||
 | 
					X USN-USMC: bets $0.10
 | 
				
			||||||
 | 
					tom1206: calls $0.10
 | 
				
			||||||
 | 
					rumble1111: calls $0.10
 | 
				
			||||||
 | 
					*** SECOND DRAW ***
 | 
				
			||||||
 | 
					rumble1111: discards 3 cards
 | 
				
			||||||
 | 
					X USN-USMC: stands pat 
 | 
				
			||||||
 | 
					tom1206: discards 1 card
 | 
				
			||||||
 | 
					rumble1111: checks 
 | 
				
			||||||
 | 
					X USN-USMC: bets $0.20
 | 
				
			||||||
 | 
					tom1206: raises $0.20 to $0.40
 | 
				
			||||||
 | 
					rumble1111: calls $0.40
 | 
				
			||||||
 | 
					X USN-USMC: calls $0.20
 | 
				
			||||||
 | 
					*** THIRD DRAW ***
 | 
				
			||||||
 | 
					rumble1111: discards 2 cards
 | 
				
			||||||
 | 
					X USN-USMC: stands pat 
 | 
				
			||||||
 | 
					tom1206: stands pat 
 | 
				
			||||||
 | 
					rumble1111: bets $0.20
 | 
				
			||||||
 | 
					X USN-USMC: folds 
 | 
				
			||||||
 | 
					tom1206: calls $0.20
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					rumble1111: shows [7d 4s 2s 3s 6c] (Lo: 7,6,4,3,2)
 | 
				
			||||||
 | 
					tom1206: mucks hand 
 | 
				
			||||||
 | 
					rumble1111 collected $2.38 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $2.50 | Rake $0.12 
 | 
				
			||||||
 | 
					Seat 1: s0rrow (button) folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 2: rumble1111 (small blind) showed [7d 4s 2s 3s 6c] and won ($2.38) with Lo: 7,6,4,3,2
 | 
				
			||||||
 | 
					Seat 3: X USN-USMC (big blind) folded after the 3rd Draw
 | 
				
			||||||
 | 
					Seat 4: tom1206 mucked [4h 6d 8d 5c 3d]
 | 
				
			||||||
 | 
					Seat 5: bakter9 folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 6: TheLabman folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35839412131:  Triple Draw 2-7 Lowball Limit ($0.10/$0.20 USD) - 2009/11/25 14:21:58 ET
 | 
				
			||||||
 | 
					Table 'Theodora VI' 6-max Seat #2 is the button
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($4.87 in chips) 
 | 
				
			||||||
 | 
					Seat 2: rumble1111 ($4.51 in chips) 
 | 
				
			||||||
 | 
					Seat 3: X USN-USMC ($4.09 in chips) 
 | 
				
			||||||
 | 
					Seat 4: tom1206 ($3 in chips) 
 | 
				
			||||||
 | 
					Seat 5: bakter9 ($2.22 in chips) 
 | 
				
			||||||
 | 
					Seat 6: TheLabman ($6.04 in chips) 
 | 
				
			||||||
 | 
					X USN-USMC: posts small blind $0.05
 | 
				
			||||||
 | 
					tom1206: posts big blind $0.10
 | 
				
			||||||
 | 
					*** DEALING HANDS ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [8c 3s Tc Ac Qd]
 | 
				
			||||||
 | 
					bakter9: calls $0.10
 | 
				
			||||||
 | 
					TheLabman: calls $0.10
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					rumble1111: calls $0.10
 | 
				
			||||||
 | 
					X USN-USMC: calls $0.05
 | 
				
			||||||
 | 
					tom1206: checks 
 | 
				
			||||||
 | 
					*** FIRST DRAW ***
 | 
				
			||||||
 | 
					X USN-USMC: discards 4 cards
 | 
				
			||||||
 | 
					tom1206: discards 3 cards
 | 
				
			||||||
 | 
					bakter9: discards 2 cards
 | 
				
			||||||
 | 
					TheLabman: discards 3 cards
 | 
				
			||||||
 | 
					rumble1111: discards 3 cards
 | 
				
			||||||
 | 
					X USN-USMC: checks 
 | 
				
			||||||
 | 
					tom1206: checks 
 | 
				
			||||||
 | 
					bakter9: checks 
 | 
				
			||||||
 | 
					TheLabman: checks 
 | 
				
			||||||
 | 
					rumble1111: checks 
 | 
				
			||||||
 | 
					*** SECOND DRAW ***
 | 
				
			||||||
 | 
					X USN-USMC: discards 2 cards
 | 
				
			||||||
 | 
					tom1206: discards 2 cards
 | 
				
			||||||
 | 
					bakter9: discards 1 card
 | 
				
			||||||
 | 
					TheLabman: discards 2 cards
 | 
				
			||||||
 | 
					The deck is reshuffled
 | 
				
			||||||
 | 
					rumble1111: discards 1 card
 | 
				
			||||||
 | 
					X USN-USMC: bets $0.20
 | 
				
			||||||
 | 
					tom1206: calls $0.20
 | 
				
			||||||
 | 
					bakter9: calls $0.20
 | 
				
			||||||
 | 
					TheLabman: folds 
 | 
				
			||||||
 | 
					rumble1111: calls $0.20
 | 
				
			||||||
 | 
					*** THIRD DRAW ***
 | 
				
			||||||
 | 
					X USN-USMC: discards 1 card
 | 
				
			||||||
 | 
					tom1206: discards 1 card
 | 
				
			||||||
 | 
					bakter9: discards 1 card
 | 
				
			||||||
 | 
					rumble1111: stands pat 
 | 
				
			||||||
 | 
					X USN-USMC: checks 
 | 
				
			||||||
 | 
					tom1206: bets $0.20
 | 
				
			||||||
 | 
					bakter9: calls $0.20
 | 
				
			||||||
 | 
					rumble1111: folds 
 | 
				
			||||||
 | 
					X USN-USMC: folds 
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					tom1206: shows [4s 3h 7d 8s 2c] (Lo: 8,7,4,3,2)
 | 
				
			||||||
 | 
					bakter9: shows [8d 5c 7c 2d 6h] (Lo: 8,7,6,5,2)
 | 
				
			||||||
 | 
					tom1206 collected $1.62 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $1.70 | Rake $0.08 
 | 
				
			||||||
 | 
					Seat 1: s0rrow folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 2: rumble1111 (button) folded after the 3rd Draw
 | 
				
			||||||
 | 
					Seat 3: X USN-USMC (small blind) folded after the 3rd Draw
 | 
				
			||||||
 | 
					Seat 4: tom1206 (big blind) showed [4s 3h 7d 8s 2c] and won ($1.62) with Lo: 8,7,4,3,2
 | 
				
			||||||
 | 
					Seat 5: bakter9 showed [8d 5c 7c 2d 6h] and lost with Lo: 8,7,6,5,2
 | 
				
			||||||
 | 
					Seat 6: TheLabman folded after the 2nd Draw
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35839484932:  Triple Draw 2-7 Lowball Limit ($0.10/$0.20 USD) - 2009/11/25 14:23:30 ET
 | 
				
			||||||
 | 
					Table 'Theodora VI' 6-max Seat #3 is the button
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($4.87 in chips) 
 | 
				
			||||||
 | 
					Seat 2: rumble1111 ($4.21 in chips) 
 | 
				
			||||||
 | 
					Seat 3: X USN-USMC ($3.79 in chips) 
 | 
				
			||||||
 | 
					Seat 4: tom1206 ($4.12 in chips) 
 | 
				
			||||||
 | 
					Seat 5: bakter9 ($1.72 in chips) 
 | 
				
			||||||
 | 
					Seat 6: TheLabman ($5.94 in chips) 
 | 
				
			||||||
 | 
					tom1206: posts small blind $0.05
 | 
				
			||||||
 | 
					bakter9: posts big blind $0.10
 | 
				
			||||||
 | 
					*** DEALING HANDS ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [3d 7h 7c Jh 5s]
 | 
				
			||||||
 | 
					TheLabman: folds 
 | 
				
			||||||
 | 
					s0rrow: calls $0.10
 | 
				
			||||||
 | 
					rumble1111: folds 
 | 
				
			||||||
 | 
					rumble1111 leaves the table
 | 
				
			||||||
 | 
					X USN-USMC: folds 
 | 
				
			||||||
 | 
					tom1206: calls $0.05
 | 
				
			||||||
 | 
					bakter9: raises $0.10 to $0.20
 | 
				
			||||||
 | 
					s0rrow: calls $0.10
 | 
				
			||||||
 | 
					tom1206: calls $0.10
 | 
				
			||||||
 | 
					*** FIRST DRAW ***
 | 
				
			||||||
 | 
					tom1206: discards 3 cards
 | 
				
			||||||
 | 
					bakter9: discards 2 cards
 | 
				
			||||||
 | 
					s0rrow: discards 2 cards [7c Jh]
 | 
				
			||||||
 | 
					Dealt to s0rrow [3d 7h 5s] [9h Ad]
 | 
				
			||||||
 | 
					tom1206: checks 
 | 
				
			||||||
 | 
					bakter9: bets $0.10
 | 
				
			||||||
 | 
					s0rrow: calls $0.10
 | 
				
			||||||
 | 
					tom1206: calls $0.10
 | 
				
			||||||
 | 
					*** SECOND DRAW ***
 | 
				
			||||||
 | 
					tom1206: discards 2 cards
 | 
				
			||||||
 | 
					bakter9: discards 1 card
 | 
				
			||||||
 | 
					s0rrow: discards 1 card [9h]
 | 
				
			||||||
 | 
					Dealt to s0rrow [3d 7h 5s Ad] [4c]
 | 
				
			||||||
 | 
					tom1206: bets $0.20
 | 
				
			||||||
 | 
					bakter9: raises $0.20 to $0.40
 | 
				
			||||||
 | 
					bakter9 said, "zzzzzzzzzzzzzzzzzzz"
 | 
				
			||||||
 | 
					s0rrow: calls $0.40
 | 
				
			||||||
 | 
					tom1206: calls $0.20
 | 
				
			||||||
 | 
					*** THIRD DRAW ***
 | 
				
			||||||
 | 
					tom1206: discards 1 card
 | 
				
			||||||
 | 
					bakter9: stands pat 
 | 
				
			||||||
 | 
					s0rrow: stands pat on [3d 7h 5s Ad 4c]
 | 
				
			||||||
 | 
					tom1206: checks 
 | 
				
			||||||
 | 
					bakter9: bets $0.20
 | 
				
			||||||
 | 
					s0rrow: calls $0.20
 | 
				
			||||||
 | 
					tom1206: raises $0.20 to $0.40
 | 
				
			||||||
 | 
					bakter9: calls $0.20
 | 
				
			||||||
 | 
					s0rrow: calls $0.20
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					tom1206: shows [4h 3c Qc 2c 6c] (Lo: Q,6,4,3,2)
 | 
				
			||||||
 | 
					bakter9: shows [3h 5d 2s 8c 6s] (Lo: 8,6,5,3,2)
 | 
				
			||||||
 | 
					s0rrow: mucks hand 
 | 
				
			||||||
 | 
					bakter9 collected $3.14 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $3.30 | Rake $0.16 
 | 
				
			||||||
 | 
					Seat 1: s0rrow mucked [3d 7h 4c Ad 5s]
 | 
				
			||||||
 | 
					Seat 2: rumble1111 folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 3: X USN-USMC (button) folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 4: tom1206 (small blind) showed [4h 3c Qc 2c 6c] and lost with Lo: Q,6,4,3,2
 | 
				
			||||||
 | 
					Seat 5: bakter9 (big blind) showed [3h 5d 2s 8c 6s] and won ($3.14) with Lo: 8,6,5,3,2
 | 
				
			||||||
 | 
					Seat 6: TheLabman folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35839619404:  Triple Draw 2-7 Lowball Limit ($0.10/$0.20 USD) - 2009/11/25 14:26:21 ET
 | 
				
			||||||
 | 
					Table 'Theodora VI' 6-max Seat #4 is the button
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($3.77 in chips) 
 | 
				
			||||||
 | 
					Seat 3: X USN-USMC ($3.79 in chips) 
 | 
				
			||||||
 | 
					Seat 4: tom1206 ($3.02 in chips) 
 | 
				
			||||||
 | 
					Seat 5: bakter9 ($3.76 in chips) 
 | 
				
			||||||
 | 
					Seat 6: TheLabman ($5.94 in chips) 
 | 
				
			||||||
 | 
					bakter9: posts small blind $0.05
 | 
				
			||||||
 | 
					TheLabman: posts big blind $0.10
 | 
				
			||||||
 | 
					*** DEALING HANDS ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [Ah 7s Ad 5d As]
 | 
				
			||||||
 | 
					bakter9 said, "ty"
 | 
				
			||||||
 | 
					s0rrow: raises $0.10 to $0.20
 | 
				
			||||||
 | 
					X USN-USMC: folds 
 | 
				
			||||||
 | 
					tom1206: folds 
 | 
				
			||||||
 | 
					bakter9: folds 
 | 
				
			||||||
 | 
					TheLabman: calls $0.10
 | 
				
			||||||
 | 
					*** FIRST DRAW ***
 | 
				
			||||||
 | 
					TheLabman: discards 2 cards
 | 
				
			||||||
 | 
					s0rrow: discards 2 cards [7s Ad]
 | 
				
			||||||
 | 
					Dealt to s0rrow [Ah 5d As] [5h 8s]
 | 
				
			||||||
 | 
					TheLabman: checks 
 | 
				
			||||||
 | 
					Mamega joins the table at seat #2 
 | 
				
			||||||
 | 
					s0rrow: bets $0.10
 | 
				
			||||||
 | 
					TheLabman: calls $0.10
 | 
				
			||||||
 | 
					*** SECOND DRAW ***
 | 
				
			||||||
 | 
					TheLabman: discards 1 card
 | 
				
			||||||
 | 
					s0rrow: stands pat on [Ah 5d As 5h 8s]
 | 
				
			||||||
 | 
					TheLabman: checks 
 | 
				
			||||||
 | 
					s0rrow: bets $0.20
 | 
				
			||||||
 | 
					TheLabman: calls $0.20
 | 
				
			||||||
 | 
					*** THIRD DRAW ***
 | 
				
			||||||
 | 
					TheLabman: discards 1 card
 | 
				
			||||||
 | 
					s0rrow: stands pat on [Ah 5d As 5h 8s]
 | 
				
			||||||
 | 
					TheLabman: checks 
 | 
				
			||||||
 | 
					s0rrow: bets $0.20
 | 
				
			||||||
 | 
					TheLabman: folds 
 | 
				
			||||||
 | 
					Uncalled bet ($0.20) returned to s0rrow
 | 
				
			||||||
 | 
					s0rrow collected $1 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $1.05 | Rake $0.05 
 | 
				
			||||||
 | 
					Seat 1: s0rrow collected ($1)
 | 
				
			||||||
 | 
					Seat 3: X USN-USMC folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 4: tom1206 (button) folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 5: bakter9 (small blind) folded before the Draw
 | 
				
			||||||
 | 
					Seat 6: TheLabman (big blind) folded after the 3rd Draw
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35839669792:  Triple Draw 2-7 Lowball Limit ($0.10/$0.20 USD) - 2009/11/25 14:27:24 ET
 | 
				
			||||||
 | 
					Table 'Theodora VI' 6-max Seat #5 is the button
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($4.27 in chips) 
 | 
				
			||||||
 | 
					Seat 3: X USN-USMC ($3.79 in chips) 
 | 
				
			||||||
 | 
					Seat 4: tom1206 ($3.02 in chips) 
 | 
				
			||||||
 | 
					Seat 5: bakter9 ($3.71 in chips) 
 | 
				
			||||||
 | 
					Seat 6: TheLabman ($5.44 in chips) 
 | 
				
			||||||
 | 
					TheLabman: posts small blind $0.05
 | 
				
			||||||
 | 
					s0rrow: posts big blind $0.10
 | 
				
			||||||
 | 
					Mamega: sits out 
 | 
				
			||||||
 | 
					*** DEALING HANDS ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [3h 6d 9s 5s Kc]
 | 
				
			||||||
 | 
					X USN-USMC: calls $0.10
 | 
				
			||||||
 | 
					tom1206: calls $0.10
 | 
				
			||||||
 | 
					bakter9: folds 
 | 
				
			||||||
 | 
					TheLabman: calls $0.05
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					*** FIRST DRAW ***
 | 
				
			||||||
 | 
					TheLabman: discards 1 card
 | 
				
			||||||
 | 
					s0rrow: discards 1 card [Kc]
 | 
				
			||||||
 | 
					Dealt to s0rrow [3h 6d 9s 5s] [Jh]
 | 
				
			||||||
 | 
					X USN-USMC: discards 2 cards
 | 
				
			||||||
 | 
					tom1206: discards 2 cards
 | 
				
			||||||
 | 
					TheLabman: checks 
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					X USN-USMC: bets $0.10
 | 
				
			||||||
 | 
					tom1206: raises $0.10 to $0.20
 | 
				
			||||||
 | 
					TheLabman: calls $0.20
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					X USN-USMC: calls $0.10
 | 
				
			||||||
 | 
					*** SECOND DRAW ***
 | 
				
			||||||
 | 
					TheLabman: discards 1 card
 | 
				
			||||||
 | 
					X USN-USMC: discards 1 card
 | 
				
			||||||
 | 
					tom1206: stands pat 
 | 
				
			||||||
 | 
					TheLabman: checks 
 | 
				
			||||||
 | 
					X USN-USMC: bets $0.20
 | 
				
			||||||
 | 
					tom1206: raises $0.20 to $0.40
 | 
				
			||||||
 | 
					TheLabman: calls $0.40
 | 
				
			||||||
 | 
					X USN-USMC: raises $0.20 to $0.60
 | 
				
			||||||
 | 
					tom1206: calls $0.20
 | 
				
			||||||
 | 
					TheLabman: calls $0.20
 | 
				
			||||||
 | 
					*** THIRD DRAW ***
 | 
				
			||||||
 | 
					TheLabman: stands pat 
 | 
				
			||||||
 | 
					X USN-USMC: stands pat 
 | 
				
			||||||
 | 
					tom1206: stands pat 
 | 
				
			||||||
 | 
					TheLabman: checks 
 | 
				
			||||||
 | 
					X USN-USMC: bets $0.20
 | 
				
			||||||
 | 
					tom1206: calls $0.20
 | 
				
			||||||
 | 
					TheLabman: calls $0.20
 | 
				
			||||||
 | 
					bakter9 leaves the table
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					X USN-USMC: shows [3s 4s 7s 2d 6c] (Lo: 7,6,4,3,2)
 | 
				
			||||||
 | 
					tom1206: mucks hand 
 | 
				
			||||||
 | 
					TheLabman: mucks hand 
 | 
				
			||||||
 | 
					X USN-USMC collected $3.24 from pot
 | 
				
			||||||
 | 
					LumBita joins the table at seat #5 
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $3.40 | Rake $0.16 
 | 
				
			||||||
 | 
					Seat 1: s0rrow (big blind) folded after the 1st Draw
 | 
				
			||||||
 | 
					Seat 3: X USN-USMC showed [3s 4s 7s 2d 6c] and won ($3.24) with Lo: 7,6,4,3,2
 | 
				
			||||||
 | 
					Seat 4: tom1206 mucked [8d 7c 4h 5h 3d]
 | 
				
			||||||
 | 
					Seat 5: bakter9 (button) folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 6: TheLabman (small blind) mucked [4d 6h 7h 2s 5c]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35839735773:  Triple Draw 2-7 Lowball Limit ($0.10/$0.20 USD) - 2009/11/25 14:28:48 ET
 | 
				
			||||||
 | 
					Table 'Theodora VI' 6-max Seat #6 is the button
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($4.17 in chips) 
 | 
				
			||||||
 | 
					Seat 2: Mamega ($4 in chips) 
 | 
				
			||||||
 | 
					Seat 3: X USN-USMC ($5.93 in chips) 
 | 
				
			||||||
 | 
					Seat 4: tom1206 ($1.92 in chips) 
 | 
				
			||||||
 | 
					Seat 5: LumBita ($1 in chips) 
 | 
				
			||||||
 | 
					Seat 6: TheLabman ($4.34 in chips) 
 | 
				
			||||||
 | 
					s0rrow: posts small blind $0.05
 | 
				
			||||||
 | 
					Mamega: posts big blind $0.10
 | 
				
			||||||
 | 
					LumBita: posts big blind $0.10
 | 
				
			||||||
 | 
					*** DEALING HANDS ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [5c Kc Js Ts Jc]
 | 
				
			||||||
 | 
					X USN-USMC: calls $0.10
 | 
				
			||||||
 | 
					tom1206: calls $0.10
 | 
				
			||||||
 | 
					LumBita: checks 
 | 
				
			||||||
 | 
					TheLabman: folds 
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					Mamega: checks 
 | 
				
			||||||
 | 
					*** FIRST DRAW ***
 | 
				
			||||||
 | 
					Mamega: stands pat 
 | 
				
			||||||
 | 
					X USN-USMC: discards 2 cards
 | 
				
			||||||
 | 
					tom1206: discards 3 cards
 | 
				
			||||||
 | 
					LumBita: discards 1 card
 | 
				
			||||||
 | 
					Mamega: checks 
 | 
				
			||||||
 | 
					X USN-USMC: bets $0.10
 | 
				
			||||||
 | 
					tom1206: calls $0.10
 | 
				
			||||||
 | 
					LumBita: calls $0.10
 | 
				
			||||||
 | 
					Mamega: folds 
 | 
				
			||||||
 | 
					*** SECOND DRAW ***
 | 
				
			||||||
 | 
					X USN-USMC: discards 1 card
 | 
				
			||||||
 | 
					tom1206: discards 1 card
 | 
				
			||||||
 | 
					LumBita: stands pat 
 | 
				
			||||||
 | 
					X USN-USMC: checks 
 | 
				
			||||||
 | 
					tom1206: checks 
 | 
				
			||||||
 | 
					LumBita: bets $0.20
 | 
				
			||||||
 | 
					X USN-USMC: calls $0.20
 | 
				
			||||||
 | 
					tom1206: calls $0.20
 | 
				
			||||||
 | 
					*** THIRD DRAW ***
 | 
				
			||||||
 | 
					X USN-USMC: discards 1 card
 | 
				
			||||||
 | 
					tom1206: discards 1 card
 | 
				
			||||||
 | 
					LumBita: stands pat 
 | 
				
			||||||
 | 
					X USN-USMC: checks 
 | 
				
			||||||
 | 
					tom1206: checks 
 | 
				
			||||||
 | 
					LumBita: checks 
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					X USN-USMC: shows [2h 4h 7d 5s 6c] (Lo: 7,6,5,4,2)
 | 
				
			||||||
 | 
					tom1206: mucks hand 
 | 
				
			||||||
 | 
					LumBita: mucks hand 
 | 
				
			||||||
 | 
					X USN-USMC collected $1.29 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $1.35 | Rake $0.06 
 | 
				
			||||||
 | 
					Seat 1: s0rrow (small blind) folded before the Draw
 | 
				
			||||||
 | 
					Seat 2: Mamega (big blind) folded after the 1st Draw
 | 
				
			||||||
 | 
					Seat 3: X USN-USMC showed [2h 4h 7d 5s 6c] and won ($1.29) with Lo: 7,6,5,4,2
 | 
				
			||||||
 | 
					Seat 4: tom1206 mucked [7h 8c 3s 4d 5h]
 | 
				
			||||||
 | 
					Seat 5: LumBita mucked [4s 8s 3h 6h 2d]
 | 
				
			||||||
 | 
					Seat 6: TheLabman (button) folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35839797257:  Triple Draw 2-7 Lowball Limit ($0.10/$0.20 USD) - 2009/11/25 14:30:09 ET
 | 
				
			||||||
 | 
					Table 'Theodora VI' 6-max Seat #1 is the button
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($4.12 in chips) 
 | 
				
			||||||
 | 
					Seat 2: Mamega ($3.90 in chips) 
 | 
				
			||||||
 | 
					Seat 3: X USN-USMC ($6.82 in chips) 
 | 
				
			||||||
 | 
					Seat 4: tom1206 ($1.52 in chips) 
 | 
				
			||||||
 | 
					Seat 5: LumBita ($0.60 in chips) 
 | 
				
			||||||
 | 
					Seat 6: TheLabman ($4.34 in chips) 
 | 
				
			||||||
 | 
					Mamega: posts small blind $0.05
 | 
				
			||||||
 | 
					X USN-USMC: posts big blind $0.10
 | 
				
			||||||
 | 
					*** DEALING HANDS ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [2c Ah 3h 8h 5s]
 | 
				
			||||||
 | 
					tom1206: calls $0.10
 | 
				
			||||||
 | 
					LumBita: calls $0.10
 | 
				
			||||||
 | 
					TheLabman: folds 
 | 
				
			||||||
 | 
					s0rrow: raises $0.10 to $0.20
 | 
				
			||||||
 | 
					Mamega: folds 
 | 
				
			||||||
 | 
					X USN-USMC: folds 
 | 
				
			||||||
 | 
					tom1206: calls $0.10
 | 
				
			||||||
 | 
					LumBita: calls $0.10
 | 
				
			||||||
 | 
					*** FIRST DRAW ***
 | 
				
			||||||
 | 
					tom1206: discards 2 cards
 | 
				
			||||||
 | 
					LumBita: discards 2 cards
 | 
				
			||||||
 | 
					s0rrow: discards 1 card [8h]
 | 
				
			||||||
 | 
					Dealt to s0rrow [2c Ah 3h 5s] [8d]
 | 
				
			||||||
 | 
					tom1206: checks 
 | 
				
			||||||
 | 
					LumBita: checks 
 | 
				
			||||||
 | 
					s0rrow: bets $0.10
 | 
				
			||||||
 | 
					tom1206: calls $0.10
 | 
				
			||||||
 | 
					LumBita: calls $0.10
 | 
				
			||||||
 | 
					*** SECOND DRAW ***
 | 
				
			||||||
 | 
					tom1206: discards 2 cards
 | 
				
			||||||
 | 
					LumBita: stands pat 
 | 
				
			||||||
 | 
					s0rrow: discards 1 card [8d]
 | 
				
			||||||
 | 
					Dealt to s0rrow [2c Ah 3h 5s] [2s]
 | 
				
			||||||
 | 
					tom1206: checks 
 | 
				
			||||||
 | 
					LumBita: bets $0.20
 | 
				
			||||||
 | 
					s0rrow: calls $0.20
 | 
				
			||||||
 | 
					tom1206: calls $0.20
 | 
				
			||||||
 | 
					*** THIRD DRAW ***
 | 
				
			||||||
 | 
					tom1206: discards 1 card
 | 
				
			||||||
 | 
					LumBita: stands pat 
 | 
				
			||||||
 | 
					s0rrow: discards 1 card [2s]
 | 
				
			||||||
 | 
					Dealt to s0rrow [2c Ah 3h 5s] [Qd]
 | 
				
			||||||
 | 
					tom1206: checks 
 | 
				
			||||||
 | 
					LumBita: bets $0.10 and is all-in
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					tom1206: folds 
 | 
				
			||||||
 | 
					Uncalled bet ($0.10) returned to LumBita
 | 
				
			||||||
 | 
					LumBita collected $1.57 from pot
 | 
				
			||||||
 | 
					LumBita: doesn't show hand 
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $1.65 | Rake $0.08 
 | 
				
			||||||
 | 
					Seat 1: s0rrow (button) folded after the 3rd Draw
 | 
				
			||||||
 | 
					Seat 2: Mamega (small blind) folded before the Draw
 | 
				
			||||||
 | 
					Seat 3: X USN-USMC (big blind) folded before the Draw
 | 
				
			||||||
 | 
					Seat 4: tom1206 folded after the 3rd Draw
 | 
				
			||||||
 | 
					Seat 5: LumBita collected ($1.57)
 | 
				
			||||||
 | 
					Seat 6: TheLabman folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35839866916:  Triple Draw 2-7 Lowball Limit ($0.10/$0.20 USD) - 2009/11/25 14:31:36 ET
 | 
				
			||||||
 | 
					Table 'Theodora VI' 6-max Seat #2 is the button
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($3.62 in chips) 
 | 
				
			||||||
 | 
					Seat 2: Mamega ($3.85 in chips) 
 | 
				
			||||||
 | 
					Seat 3: X USN-USMC ($6.72 in chips) 
 | 
				
			||||||
 | 
					Seat 4: tom1206 ($1.02 in chips) 
 | 
				
			||||||
 | 
					Seat 5: LumBita ($1.67 in chips) 
 | 
				
			||||||
 | 
					Seat 6: TheLabman ($4.34 in chips) 
 | 
				
			||||||
 | 
					X USN-USMC: posts small blind $0.05
 | 
				
			||||||
 | 
					tom1206: posts big blind $0.10
 | 
				
			||||||
 | 
					*** DEALING HANDS ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [Jd 5c 2s 5h Qs]
 | 
				
			||||||
 | 
					LumBita: calls $0.10
 | 
				
			||||||
 | 
					TheLabman: folds 
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					Mamega: folds 
 | 
				
			||||||
 | 
					X USN-USMC: calls $0.05
 | 
				
			||||||
 | 
					tom1206: checks 
 | 
				
			||||||
 | 
					*** FIRST DRAW ***
 | 
				
			||||||
 | 
					X USN-USMC: discards 3 cards
 | 
				
			||||||
 | 
					tom1206: discards 4 cards
 | 
				
			||||||
 | 
					LumBita: discards 2 cards
 | 
				
			||||||
 | 
					X USN-USMC: checks 
 | 
				
			||||||
 | 
					tom1206: checks 
 | 
				
			||||||
 | 
					LumBita: checks 
 | 
				
			||||||
 | 
					*** SECOND DRAW ***
 | 
				
			||||||
 | 
					X USN-USMC: discards 2 cards
 | 
				
			||||||
 | 
					tom1206: discards 3 cards
 | 
				
			||||||
 | 
					LumBita: discards 2 cards
 | 
				
			||||||
 | 
					X USN-USMC: checks 
 | 
				
			||||||
 | 
					tom1206: checks 
 | 
				
			||||||
 | 
					LumBita: checks 
 | 
				
			||||||
 | 
					*** THIRD DRAW ***
 | 
				
			||||||
 | 
					X USN-USMC: discards 2 cards
 | 
				
			||||||
 | 
					tom1206: discards 2 cards
 | 
				
			||||||
 | 
					LumBita: discards 1 card
 | 
				
			||||||
 | 
					X USN-USMC: bets $0.20
 | 
				
			||||||
 | 
					tom1206: calls $0.20
 | 
				
			||||||
 | 
					LumBita: folds 
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					X USN-USMC: shows [4h 3h 2d 7h 6d] (Lo: 7,6,4,3,2)
 | 
				
			||||||
 | 
					tom1206: mucks hand 
 | 
				
			||||||
 | 
					X USN-USMC collected $0.67 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.70 | Rake $0.03 
 | 
				
			||||||
 | 
					Seat 1: s0rrow folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 2: Mamega (button) folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 3: X USN-USMC (small blind) showed [4h 3h 2d 7h 6d] and won ($0.67) with Lo: 7,6,4,3,2
 | 
				
			||||||
 | 
					Seat 4: tom1206 (big blind) mucked [7c 5d 9s Th 8d]
 | 
				
			||||||
 | 
					Seat 5: LumBita folded after the 3rd Draw
 | 
				
			||||||
 | 
					Seat 6: TheLabman folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35839926911:  Triple Draw 2-7 Lowball Limit ($0.10/$0.20 USD) - 2009/11/25 14:32:52 ET
 | 
				
			||||||
 | 
					Table 'Theodora VI' 6-max Seat #3 is the button
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($3.62 in chips) 
 | 
				
			||||||
 | 
					Seat 2: Mamega ($3.85 in chips) 
 | 
				
			||||||
 | 
					Seat 3: X USN-USMC ($7.09 in chips) 
 | 
				
			||||||
 | 
					Seat 4: tom1206 ($0.72 in chips) 
 | 
				
			||||||
 | 
					Seat 5: LumBita ($1.57 in chips) 
 | 
				
			||||||
 | 
					Seat 6: TheLabman ($4.34 in chips) 
 | 
				
			||||||
 | 
					tom1206: posts small blind $0.05
 | 
				
			||||||
 | 
					LumBita: posts big blind $0.10
 | 
				
			||||||
 | 
					*** DEALING HANDS ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [Qd 2d 5s Ah 8d]
 | 
				
			||||||
 | 
					TheLabman: folds 
 | 
				
			||||||
 | 
					s0rrow: calls $0.10
 | 
				
			||||||
 | 
					Mamega: folds 
 | 
				
			||||||
 | 
					X USN-USMC: folds 
 | 
				
			||||||
 | 
					tom1206: folds 
 | 
				
			||||||
 | 
					LumBita: checks 
 | 
				
			||||||
 | 
					*** FIRST DRAW ***
 | 
				
			||||||
 | 
					LumBita: discards 3 cards
 | 
				
			||||||
 | 
					s0rrow: discards 2 cards [Qd 8d]
 | 
				
			||||||
 | 
					Dealt to s0rrow [2d 5s Ah] [Jc 8h]
 | 
				
			||||||
 | 
					LumBita: checks 
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					*** SECOND DRAW ***
 | 
				
			||||||
 | 
					LumBita: discards 2 cards
 | 
				
			||||||
 | 
					s0rrow: discards 1 card [Jc]
 | 
				
			||||||
 | 
					Dealt to s0rrow [2d 5s Ah 8h] [9s]
 | 
				
			||||||
 | 
					LumBita: bets $0.20
 | 
				
			||||||
 | 
					s0rrow: calls $0.20
 | 
				
			||||||
 | 
					*** THIRD DRAW ***
 | 
				
			||||||
 | 
					LumBita: stands pat 
 | 
				
			||||||
 | 
					s0rrow: stands pat on [2d 5s Ah 8h 9s]
 | 
				
			||||||
 | 
					LumBita: checks 
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					LumBita: shows [7h 2s 5c 8c 6c] (Lo: 8,7,6,5,2)
 | 
				
			||||||
 | 
					s0rrow: mucks hand 
 | 
				
			||||||
 | 
					LumBita collected $0.62 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.65 | Rake $0.03 
 | 
				
			||||||
 | 
					Seat 1: s0rrow mucked [9s 2d 5s Ah 8h]
 | 
				
			||||||
 | 
					Seat 2: Mamega folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 3: X USN-USMC (button) folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 4: tom1206 (small blind) folded before the Draw
 | 
				
			||||||
 | 
					Seat 5: LumBita (big blind) showed [7h 2s 5c 8c 6c] and won ($0.62) with Lo: 8,7,6,5,2
 | 
				
			||||||
 | 
					Seat 6: TheLabman folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35839959625:  Triple Draw 2-7 Lowball Limit ($0.10/$0.20 USD) - 2009/11/25 14:33:33 ET
 | 
				
			||||||
 | 
					Table 'Theodora VI' 6-max Seat #4 is the button
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($3.32 in chips) 
 | 
				
			||||||
 | 
					Seat 2: Mamega ($3.85 in chips) 
 | 
				
			||||||
 | 
					Seat 3: X USN-USMC ($7.09 in chips) 
 | 
				
			||||||
 | 
					Seat 4: tom1206 ($0.67 in chips) 
 | 
				
			||||||
 | 
					Seat 5: LumBita ($1.89 in chips) 
 | 
				
			||||||
 | 
					Seat 6: TheLabman ($4.34 in chips) 
 | 
				
			||||||
 | 
					LumBita: posts small blind $0.05
 | 
				
			||||||
 | 
					TheLabman: posts big blind $0.10
 | 
				
			||||||
 | 
					*** DEALING HANDS ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [Jd As 8h 3s 7c]
 | 
				
			||||||
 | 
					s0rrow: calls $0.10
 | 
				
			||||||
 | 
					Mamega: folds 
 | 
				
			||||||
 | 
					X USN-USMC: folds 
 | 
				
			||||||
 | 
					tom1206: calls $0.10
 | 
				
			||||||
 | 
					LumBita: calls $0.05
 | 
				
			||||||
 | 
					TheLabman: checks 
 | 
				
			||||||
 | 
					*** FIRST DRAW ***
 | 
				
			||||||
 | 
					LumBita: discards 2 cards
 | 
				
			||||||
 | 
					TheLabman: discards 1 card
 | 
				
			||||||
 | 
					s0rrow: discards 1 card [Jd]
 | 
				
			||||||
 | 
					Dealt to s0rrow [As 8h 3s 7c] [4h]
 | 
				
			||||||
 | 
					tom1206: discards 2 cards
 | 
				
			||||||
 | 
					LumBita: checks 
 | 
				
			||||||
 | 
					TheLabman: bets $0.10
 | 
				
			||||||
 | 
					s0rrow: calls $0.10
 | 
				
			||||||
 | 
					tom1206: raises $0.10 to $0.20
 | 
				
			||||||
 | 
					LumBita: calls $0.20
 | 
				
			||||||
 | 
					TheLabman: calls $0.10
 | 
				
			||||||
 | 
					s0rrow: calls $0.10
 | 
				
			||||||
 | 
					*** SECOND DRAW ***
 | 
				
			||||||
 | 
					LumBita: discards 1 card
 | 
				
			||||||
 | 
					TheLabman: discards 1 card
 | 
				
			||||||
 | 
					s0rrow: discards 1 card [8h]
 | 
				
			||||||
 | 
					Dealt to s0rrow [As 3s 7c 4h] [8d]
 | 
				
			||||||
 | 
					tom1206: stands pat 
 | 
				
			||||||
 | 
					LumBita: checks 
 | 
				
			||||||
 | 
					TheLabman: checks 
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					tom1206: bets $0.20
 | 
				
			||||||
 | 
					LumBita: calls $0.20
 | 
				
			||||||
 | 
					TheLabman: calls $0.20
 | 
				
			||||||
 | 
					s0rrow: calls $0.20
 | 
				
			||||||
 | 
					*** THIRD DRAW ***
 | 
				
			||||||
 | 
					LumBita: discards 1 card
 | 
				
			||||||
 | 
					TheLabman: discards 1 card
 | 
				
			||||||
 | 
					s0rrow: stands pat on [As 3s 7c 4h 8d]
 | 
				
			||||||
 | 
					tom1206: stands pat 
 | 
				
			||||||
 | 
					LumBita: checks 
 | 
				
			||||||
 | 
					TheLabman: checks 
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					tom1206: bets $0.17 and is all-in
 | 
				
			||||||
 | 
					LumBita: calls $0.17
 | 
				
			||||||
 | 
					TheLabman: folds 
 | 
				
			||||||
 | 
					s0rrow: calls $0.17
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					tom1206: shows [5c 6c 4d 2h 8c] (Lo: 8,6,5,4,2)
 | 
				
			||||||
 | 
					LumBita: mucks hand 
 | 
				
			||||||
 | 
					s0rrow: mucks hand 
 | 
				
			||||||
 | 
					tom1206 collected $2.39 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $2.51 | Rake $0.12 
 | 
				
			||||||
 | 
					Seat 1: s0rrow mucked [4h As 8d 3s 7c]
 | 
				
			||||||
 | 
					Seat 2: Mamega folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 3: X USN-USMC folded before the Draw (didn't bet)
 | 
				
			||||||
 | 
					Seat 4: tom1206 (button) showed [5c 6c 4d 2h 8c] and won ($2.39) with Lo: 8,6,5,4,2
 | 
				
			||||||
 | 
					Seat 5: LumBita (small blind) mucked [4c 3d 9c 7h 6h]
 | 
				
			||||||
 | 
					Seat 6: TheLabman (big blind) folded after the 3rd Draw
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -0,0 +1,835 @@
 | 
				
			||||||
 | 
					PokerStars Game #35874004239:  7 Card Stud Limit ($0.04/$0.08 USD) - 2009/11/26 10:08:43 ET
 | 
				
			||||||
 | 
					Table 'Atalante II' 8-max
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($1.60 in chips) 
 | 
				
			||||||
 | 
					Seat 3: Nikolay Zem ($1.84 in chips) 
 | 
				
			||||||
 | 
					Seat 4: totof51 ($1.34 in chips) 
 | 
				
			||||||
 | 
					Seat 5: trs2758 ($1.76 in chips) 
 | 
				
			||||||
 | 
					Seat 8: MasterTrini1 ($2.49 in chips) 
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					Nikolay Zem: posts the ante $0.01
 | 
				
			||||||
 | 
					totof51: posts the ante $0.01
 | 
				
			||||||
 | 
					trs2758: posts the ante $0.01
 | 
				
			||||||
 | 
					MasterTrini1: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [3d Th As]
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [9s]
 | 
				
			||||||
 | 
					Dealt to totof51 [Td]
 | 
				
			||||||
 | 
					Dealt to trs2758 [7d]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [2c]
 | 
				
			||||||
 | 
					MasterTrini1: brings in for $0.02
 | 
				
			||||||
 | 
					s0rrow: calls $0.02
 | 
				
			||||||
 | 
					Nikolay Zem: calls $0.02
 | 
				
			||||||
 | 
					totof51: calls $0.02
 | 
				
			||||||
 | 
					trs2758: calls $0.02
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [3d Th As] [Qc]
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [9s] [6h]
 | 
				
			||||||
 | 
					Dealt to totof51 [Td] [4s]
 | 
				
			||||||
 | 
					Dealt to trs2758 [7d] [8d]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [2c] [8c]
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					Nikolay Zem: checks 
 | 
				
			||||||
 | 
					totof51: checks 
 | 
				
			||||||
 | 
					trs2758: checks 
 | 
				
			||||||
 | 
					MasterTrini1: bets $0.04
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					Nikolay Zem: calls $0.04
 | 
				
			||||||
 | 
					totof51: folds 
 | 
				
			||||||
 | 
					trs2758: calls $0.04
 | 
				
			||||||
 | 
					*** 5th STREET ***
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [9s 6h] [7s]
 | 
				
			||||||
 | 
					Dealt to trs2758 [7d 8d] [8h]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [2c 8c] [7h]
 | 
				
			||||||
 | 
					RoadDevil joins the table at seat #6 
 | 
				
			||||||
 | 
					trs2758: bets $0.08
 | 
				
			||||||
 | 
					MasterTrini1: calls $0.08
 | 
				
			||||||
 | 
					Nikolay Zem: calls $0.08
 | 
				
			||||||
 | 
					*** 6th STREET ***
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [9s 6h 7s] [Qh]
 | 
				
			||||||
 | 
					Dealt to trs2758 [7d 8d 8h] [Ts]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [2c 8c 7h] [5d]
 | 
				
			||||||
 | 
					trs2758: bets $0.08
 | 
				
			||||||
 | 
					MasterTrini1: calls $0.08
 | 
				
			||||||
 | 
					Nikolay Zem: folds 
 | 
				
			||||||
 | 
					*** RIVER ***
 | 
				
			||||||
 | 
					trs2758: bets $0.08
 | 
				
			||||||
 | 
					MasterTrini1: folds 
 | 
				
			||||||
 | 
					Uncalled bet ($0.08) returned to trs2758
 | 
				
			||||||
 | 
					trs2758 collected $0.64 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.67 | Rake $0.03 
 | 
				
			||||||
 | 
					Seat 1: s0rrow folded on the 4th Street
 | 
				
			||||||
 | 
					Seat 3: Nikolay Zem folded on the 6th Street
 | 
				
			||||||
 | 
					Seat 4: totof51 folded on the 4th Street
 | 
				
			||||||
 | 
					Seat 5: trs2758 collected ($0.64)
 | 
				
			||||||
 | 
					Seat 8: MasterTrini1 folded on the River
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35874039554:  7 Card Stud Limit ($0.04/$0.08 USD) - 2009/11/26 10:09:44 ET
 | 
				
			||||||
 | 
					Table 'Atalante II' 8-max
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($1.57 in chips) 
 | 
				
			||||||
 | 
					Seat 3: Nikolay Zem ($1.69 in chips) 
 | 
				
			||||||
 | 
					Seat 4: totof51 ($1.31 in chips) 
 | 
				
			||||||
 | 
					Seat 5: trs2758 ($2.17 in chips) 
 | 
				
			||||||
 | 
					Seat 6: RoadDevil ($1.60 in chips) 
 | 
				
			||||||
 | 
					Seat 8: MasterTrini1 ($2.26 in chips) 
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					Nikolay Zem: posts the ante $0.01
 | 
				
			||||||
 | 
					totof51: posts the ante $0.01
 | 
				
			||||||
 | 
					trs2758: posts the ante $0.01
 | 
				
			||||||
 | 
					RoadDevil: posts the ante $0.01
 | 
				
			||||||
 | 
					MasterTrini1: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [3s Qd 9h]
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [7d]
 | 
				
			||||||
 | 
					Dealt to totof51 [7c]
 | 
				
			||||||
 | 
					Dealt to trs2758 [5h]
 | 
				
			||||||
 | 
					Dealt to RoadDevil [5d]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [Ts]
 | 
				
			||||||
 | 
					RoadDevil: brings in for $0.02
 | 
				
			||||||
 | 
					MasterTrini1: calls $0.02
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					Nikolay Zem: calls $0.02
 | 
				
			||||||
 | 
					totof51: calls $0.02
 | 
				
			||||||
 | 
					trs2758: calls $0.02
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [7d] [Td]
 | 
				
			||||||
 | 
					Dealt to totof51 [7c] [Th]
 | 
				
			||||||
 | 
					Dealt to trs2758 [5h] [8s]
 | 
				
			||||||
 | 
					Dealt to RoadDevil [5d] [Js]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [Ts] [5c]
 | 
				
			||||||
 | 
					RoadDevil: checks 
 | 
				
			||||||
 | 
					MasterTrini1: checks 
 | 
				
			||||||
 | 
					Nikolay Zem: checks 
 | 
				
			||||||
 | 
					totof51: bets $0.04
 | 
				
			||||||
 | 
					trs2758: calls $0.04
 | 
				
			||||||
 | 
					RoadDevil: folds 
 | 
				
			||||||
 | 
					MasterTrini1: calls $0.04
 | 
				
			||||||
 | 
					Nikolay Zem: calls $0.04
 | 
				
			||||||
 | 
					*** 5th STREET ***
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [7d Td] [3d]
 | 
				
			||||||
 | 
					Dealt to totof51 [7c Th] [9s]
 | 
				
			||||||
 | 
					Dealt to trs2758 [5h 8s] [4s]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [Ts 5c] [6h]
 | 
				
			||||||
 | 
					totof51: bets $0.08
 | 
				
			||||||
 | 
					trs2758: folds 
 | 
				
			||||||
 | 
					MasterTrini1: calls $0.08
 | 
				
			||||||
 | 
					Nikolay Zem: calls $0.08
 | 
				
			||||||
 | 
					*** 6th STREET ***
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [7d Td 3d] [Tc]
 | 
				
			||||||
 | 
					Dealt to totof51 [7c Th 9s] [Ah]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [Ts 5c 6h] [Jh]
 | 
				
			||||||
 | 
					Nikolay Zem: checks 
 | 
				
			||||||
 | 
					totof51: bets $0.08
 | 
				
			||||||
 | 
					MasterTrini1: calls $0.08
 | 
				
			||||||
 | 
					Nikolay Zem: calls $0.08
 | 
				
			||||||
 | 
					*** RIVER ***
 | 
				
			||||||
 | 
					Nikolay Zem: checks 
 | 
				
			||||||
 | 
					totof51: checks 
 | 
				
			||||||
 | 
					MasterTrini1: checks 
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					Nikolay Zem: shows [Ac 4d 7d Td 3d Tc 2h] (a pair of Tens)
 | 
				
			||||||
 | 
					totof51: mucks hand 
 | 
				
			||||||
 | 
					totof51 is sitting out
 | 
				
			||||||
 | 
					MasterTrini1: shows [4c 6d Ts 5c 6h Jh 9c] (a pair of Sixes)
 | 
				
			||||||
 | 
					totof51 leaves the table
 | 
				
			||||||
 | 
					Nikolay Zem collected $0.77 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.80 | Rake $0.03 
 | 
				
			||||||
 | 
					Seat 1: s0rrow folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 3: Nikolay Zem showed [Ac 4d 7d Td 3d Tc 2h] and won ($0.77) with a pair of Tens
 | 
				
			||||||
 | 
					Seat 4: totof51 mucked [3c 7s 7c Th 9s Ah Qc]
 | 
				
			||||||
 | 
					Seat 5: trs2758 folded on the 5th Street
 | 
				
			||||||
 | 
					Seat 6: RoadDevil folded on the 4th Street
 | 
				
			||||||
 | 
					Seat 8: MasterTrini1 showed [4c 6d Ts 5c 6h Jh 9c] and lost with a pair of Sixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35874081088:  7 Card Stud Limit ($0.04/$0.08 USD) - 2009/11/26 10:10:56 ET
 | 
				
			||||||
 | 
					Table 'Atalante II' 8-max
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($1.56 in chips) 
 | 
				
			||||||
 | 
					Seat 3: Nikolay Zem ($2.23 in chips) 
 | 
				
			||||||
 | 
					Seat 5: trs2758 ($2.10 in chips) 
 | 
				
			||||||
 | 
					Seat 6: RoadDevil ($1.57 in chips) 
 | 
				
			||||||
 | 
					Seat 8: MasterTrini1 ($2.03 in chips) 
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					Nikolay Zem: posts the ante $0.01
 | 
				
			||||||
 | 
					trs2758: posts the ante $0.01
 | 
				
			||||||
 | 
					RoadDevil: posts the ante $0.01
 | 
				
			||||||
 | 
					MasterTrini1: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [5h 5c 2s]
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [Ad]
 | 
				
			||||||
 | 
					Dealt to trs2758 [6h]
 | 
				
			||||||
 | 
					Dealt to RoadDevil [4h]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [8h]
 | 
				
			||||||
 | 
					s0rrow: bets $0.04
 | 
				
			||||||
 | 
					Nikolay Zem: calls $0.04
 | 
				
			||||||
 | 
					trs2758: folds 
 | 
				
			||||||
 | 
					RoadDevil: calls $0.04
 | 
				
			||||||
 | 
					MasterTrini1: raises $0.04 to $0.08
 | 
				
			||||||
 | 
					s0rrow: calls $0.04
 | 
				
			||||||
 | 
					Nikolay Zem: calls $0.04
 | 
				
			||||||
 | 
					RoadDevil: calls $0.04
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [5h 5c 2s] [As]
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [Ad] [4s]
 | 
				
			||||||
 | 
					Dealt to RoadDevil [4h] [Tc]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [8h] [6d]
 | 
				
			||||||
 | 
					Nikolay Zem: checks 
 | 
				
			||||||
 | 
					RoadDevil: checks 
 | 
				
			||||||
 | 
					MasterTrini1: bets $0.04
 | 
				
			||||||
 | 
					s0rrow: calls $0.04
 | 
				
			||||||
 | 
					Nikolay Zem: folds 
 | 
				
			||||||
 | 
					RoadDevil: folds 
 | 
				
			||||||
 | 
					*** 5th STREET ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [5h 5c 2s As] [5d]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [8h 6d] [Ac]
 | 
				
			||||||
 | 
					MasterTrini1: bets $0.08
 | 
				
			||||||
 | 
					s0rrow: raises $0.08 to $0.16
 | 
				
			||||||
 | 
					MasterTrini1: calls $0.08
 | 
				
			||||||
 | 
					*** 6th STREET ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [5h 5c 2s As 5d] [Ah]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [8h 6d Ac] [Js]
 | 
				
			||||||
 | 
					s0rrow: bets $0.08
 | 
				
			||||||
 | 
					MasterTrini1: calls $0.08
 | 
				
			||||||
 | 
					*** RIVER ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [5h 5c 2s As 5d Ah] [4d]
 | 
				
			||||||
 | 
					s0rrow: bets $0.08
 | 
				
			||||||
 | 
					MasterTrini1: calls $0.08
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					s0rrow: shows [5h 5c 2s As 5d Ah 4d] (a full house, Fives full of Aces)
 | 
				
			||||||
 | 
					MasterTrini1: mucks hand 
 | 
				
			||||||
 | 
					s0rrow collected $1.04 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $1.09 | Rake $0.05 
 | 
				
			||||||
 | 
					Seat 1: s0rrow showed [5h 5c 2s As 5d Ah 4d] and won ($1.04) with a full house, Fives full of Aces
 | 
				
			||||||
 | 
					Seat 3: Nikolay Zem folded on the 4th Street
 | 
				
			||||||
 | 
					Seat 5: trs2758 folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 6: RoadDevil folded on the 4th Street
 | 
				
			||||||
 | 
					Seat 8: MasterTrini1 mucked [Qs Qd 8h 6d Ac Js Jc]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35874124553:  7 Card Stud Limit ($0.04/$0.08 USD) - 2009/11/26 10:12:11 ET
 | 
				
			||||||
 | 
					Table 'Atalante II' 8-max
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($2.15 in chips) 
 | 
				
			||||||
 | 
					Seat 3: Nikolay Zem ($2.14 in chips) 
 | 
				
			||||||
 | 
					Seat 5: trs2758 ($2.09 in chips) 
 | 
				
			||||||
 | 
					Seat 6: RoadDevil ($1.48 in chips) 
 | 
				
			||||||
 | 
					Seat 8: MasterTrini1 ($1.58 in chips) 
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					Nikolay Zem: posts the ante $0.01
 | 
				
			||||||
 | 
					trs2758: posts the ante $0.01
 | 
				
			||||||
 | 
					RoadDevil: posts the ante $0.01
 | 
				
			||||||
 | 
					MasterTrini1: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [Js Kc 3d]
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [6c]
 | 
				
			||||||
 | 
					Dealt to trs2758 [4d]
 | 
				
			||||||
 | 
					Dealt to RoadDevil [6d]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [9h]
 | 
				
			||||||
 | 
					s0rrow: brings in for $0.02
 | 
				
			||||||
 | 
					Nikolay Zem: folds 
 | 
				
			||||||
 | 
					trs2758: folds 
 | 
				
			||||||
 | 
					RoadDevil: calls $0.02
 | 
				
			||||||
 | 
					MasterTrini1: calls $0.02
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [Js Kc 3d] [2h]
 | 
				
			||||||
 | 
					Dealt to RoadDevil [6d] [Ah]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [9h] [8c]
 | 
				
			||||||
 | 
					RoadDevil: checks 
 | 
				
			||||||
 | 
					MasterTrini1: bets $0.04
 | 
				
			||||||
 | 
					rv2020 joins the table at seat #4 
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					RoadDevil: calls $0.04
 | 
				
			||||||
 | 
					*** 5th STREET ***
 | 
				
			||||||
 | 
					Dealt to RoadDevil [6d Ah] [Td]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [9h 8c] [5s]
 | 
				
			||||||
 | 
					RoadDevil: checks 
 | 
				
			||||||
 | 
					MasterTrini1: bets $0.08
 | 
				
			||||||
 | 
					RoadDevil: calls $0.08
 | 
				
			||||||
 | 
					*** 6th STREET ***
 | 
				
			||||||
 | 
					Dealt to RoadDevil [6d Ah Td] [4c]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [9h 8c 5s] [5h]
 | 
				
			||||||
 | 
					MasterTrini1: bets $0.08
 | 
				
			||||||
 | 
					RoadDevil: calls $0.08
 | 
				
			||||||
 | 
					*** RIVER ***
 | 
				
			||||||
 | 
					MasterTrini1: bets $0.08
 | 
				
			||||||
 | 
					RoadDevil: calls $0.08
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					MasterTrini1: shows [6s 7d 9h 8c 5s 5h 9d] (a straight, Five to Nine)
 | 
				
			||||||
 | 
					RoadDevil: mucks hand 
 | 
				
			||||||
 | 
					MasterTrini1 collected $0.64 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.67 | Rake $0.03 
 | 
				
			||||||
 | 
					Seat 1: s0rrow folded on the 4th Street
 | 
				
			||||||
 | 
					Seat 3: Nikolay Zem folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 5: trs2758 folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 6: RoadDevil mucked [4s 8d 6d Ah Td 4c 8h]
 | 
				
			||||||
 | 
					Seat 8: MasterTrini1 showed [6s 7d 9h 8c 5s 5h 9d] and won ($0.64) with a straight, Five to Nine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35874153086:  7 Card Stud Limit ($0.04/$0.08 USD) - 2009/11/26 10:13:01 ET
 | 
				
			||||||
 | 
					Table 'Atalante II' 8-max
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($2.12 in chips) 
 | 
				
			||||||
 | 
					Seat 3: Nikolay Zem ($2.13 in chips) 
 | 
				
			||||||
 | 
					Seat 4: rv2020 ($1 in chips) 
 | 
				
			||||||
 | 
					Seat 5: trs2758 ($2.08 in chips) 
 | 
				
			||||||
 | 
					Seat 6: RoadDevil ($1.17 in chips) 
 | 
				
			||||||
 | 
					Seat 8: MasterTrini1 ($1.91 in chips) 
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					Nikolay Zem: posts the ante $0.01
 | 
				
			||||||
 | 
					rv2020: posts the ante $0.01
 | 
				
			||||||
 | 
					trs2758: posts the ante $0.01
 | 
				
			||||||
 | 
					RoadDevil: posts the ante $0.01
 | 
				
			||||||
 | 
					MasterTrini1: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [As 8s 6h]
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [4c]
 | 
				
			||||||
 | 
					Dealt to rv2020 [2s]
 | 
				
			||||||
 | 
					Dealt to trs2758 [7s]
 | 
				
			||||||
 | 
					Dealt to RoadDevil [7c]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [Qd]
 | 
				
			||||||
 | 
					rv2020: brings in for $0.02
 | 
				
			||||||
 | 
					trs2758: calls $0.02
 | 
				
			||||||
 | 
					RoadDevil: calls $0.02
 | 
				
			||||||
 | 
					MasterTrini1: calls $0.02
 | 
				
			||||||
 | 
					s0rrow: calls $0.02
 | 
				
			||||||
 | 
					Nikolay Zem: folds 
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [As 8s 6h] [3s]
 | 
				
			||||||
 | 
					Dealt to rv2020 [2s] [6d]
 | 
				
			||||||
 | 
					Dealt to trs2758 [7s] [Ah]
 | 
				
			||||||
 | 
					Dealt to RoadDevil [7c] [4h]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [Qd] [Ad]
 | 
				
			||||||
 | 
					MasterTrini1: checks 
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					rv2020: checks 
 | 
				
			||||||
 | 
					trs2758: checks 
 | 
				
			||||||
 | 
					RoadDevil: checks 
 | 
				
			||||||
 | 
					*** 5th STREET ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [As 8s 6h 3s] [Jh]
 | 
				
			||||||
 | 
					Dealt to rv2020 [2s 6d] [Qh]
 | 
				
			||||||
 | 
					Dealt to trs2758 [7s Ah] [4d]
 | 
				
			||||||
 | 
					Dealt to RoadDevil [7c 4h] [7h]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [Qd Ad] [5h]
 | 
				
			||||||
 | 
					RoadDevil: checks 
 | 
				
			||||||
 | 
					MasterTrini1: checks 
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					rv2020: checks 
 | 
				
			||||||
 | 
					trs2758: checks 
 | 
				
			||||||
 | 
					*** 6th STREET ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [As 8s 6h 3s Jh] [Tc]
 | 
				
			||||||
 | 
					Dealt to rv2020 [2s 6d Qh] [9h]
 | 
				
			||||||
 | 
					Dealt to trs2758 [7s Ah 4d] [3d]
 | 
				
			||||||
 | 
					Dealt to RoadDevil [7c 4h 7h] [5c]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [Qd Ad 5h] [Td]
 | 
				
			||||||
 | 
					RoadDevil: checks 
 | 
				
			||||||
 | 
					MasterTrini1: checks 
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					rv2020: checks 
 | 
				
			||||||
 | 
					trs2758: checks 
 | 
				
			||||||
 | 
					*** RIVER ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [As 8s 6h 3s Jh Tc] [Qs]
 | 
				
			||||||
 | 
					RoadDevil: checks 
 | 
				
			||||||
 | 
					MasterTrini1: checks 
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					rv2020: checks 
 | 
				
			||||||
 | 
					trs2758: checks 
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					s0rrow: shows [As 8s 6h 3s Jh Tc Qs] (high card Ace)
 | 
				
			||||||
 | 
					rv2020: shows [8c Ac 2s 6d Qh 9h 2d] (a pair of Deuces)
 | 
				
			||||||
 | 
					trs2758: mucks hand 
 | 
				
			||||||
 | 
					RoadDevil: shows [Jd Qc 7c 4h 7h 5c Kc] (a pair of Sevens)
 | 
				
			||||||
 | 
					MasterTrini1: shows [Jc 2h Qd Ad 5h Td Ks] (a straight, Ten to Ace)
 | 
				
			||||||
 | 
					MasterTrini1 collected $0.16 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.16 | Rake $0 
 | 
				
			||||||
 | 
					Seat 1: s0rrow showed [As 8s 6h 3s Jh Tc Qs] and lost with high card Ace
 | 
				
			||||||
 | 
					Seat 3: Nikolay Zem folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 4: rv2020 showed [8c Ac 2s 6d Qh 9h 2d] and lost with a pair of Deuces
 | 
				
			||||||
 | 
					Seat 5: trs2758 mucked [2c 9s 7s Ah 4d 3d 8d]
 | 
				
			||||||
 | 
					Seat 6: RoadDevil showed [Jd Qc 7c 4h 7h 5c Kc] and lost with a pair of Sevens
 | 
				
			||||||
 | 
					Seat 8: MasterTrini1 showed [Jc 2h Qd Ad 5h Td Ks] and won ($0.16) with a straight, Ten to Ace
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35874195699:  7 Card Stud Limit ($0.04/$0.08 USD) - 2009/11/26 10:14:15 ET
 | 
				
			||||||
 | 
					Table 'Atalante II' 8-max
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($2.09 in chips) 
 | 
				
			||||||
 | 
					Seat 3: Nikolay Zem ($2.12 in chips) 
 | 
				
			||||||
 | 
					Seat 4: rv2020 ($0.97 in chips) 
 | 
				
			||||||
 | 
					Seat 5: trs2758 ($2.05 in chips) 
 | 
				
			||||||
 | 
					Seat 6: RoadDevil ($1.14 in chips) 
 | 
				
			||||||
 | 
					Seat 8: MasterTrini1 ($2.04 in chips) 
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					Nikolay Zem: posts the ante $0.01
 | 
				
			||||||
 | 
					rv2020: posts the ante $0.01
 | 
				
			||||||
 | 
					trs2758: posts the ante $0.01
 | 
				
			||||||
 | 
					RoadDevil: posts the ante $0.01
 | 
				
			||||||
 | 
					MasterTrini1: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [6c 4c Th]
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [9d]
 | 
				
			||||||
 | 
					Dealt to rv2020 [4s]
 | 
				
			||||||
 | 
					Dealt to trs2758 [3h]
 | 
				
			||||||
 | 
					Dealt to RoadDevil [Ac]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [5d]
 | 
				
			||||||
 | 
					trs2758: brings in for $0.02
 | 
				
			||||||
 | 
					RoadDevil: folds 
 | 
				
			||||||
 | 
					MasterTrini1: calls $0.02
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					Nikolay Zem: calls $0.02
 | 
				
			||||||
 | 
					rv2020: folds 
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [9d] [3s]
 | 
				
			||||||
 | 
					Dealt to trs2758 [3h] [Jd]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [5d] [2d]
 | 
				
			||||||
 | 
					trs2758: checks 
 | 
				
			||||||
 | 
					MasterTrini1: checks 
 | 
				
			||||||
 | 
					Nikolay Zem: checks 
 | 
				
			||||||
 | 
					*** 5th STREET ***
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [9d 3s] [9c]
 | 
				
			||||||
 | 
					Dealt to trs2758 [3h Jd] [2h]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [5d 2d] [7d]
 | 
				
			||||||
 | 
					Nikolay Zem: bets $0.08
 | 
				
			||||||
 | 
					trs2758: folds 
 | 
				
			||||||
 | 
					MasterTrini1: raises $0.08 to $0.16
 | 
				
			||||||
 | 
					Nikolay Zem: calls $0.08
 | 
				
			||||||
 | 
					*** 6th STREET ***
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [9d 3s 9c] [Td]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [5d 2d 7d] [5h]
 | 
				
			||||||
 | 
					Nikolay Zem: checks 
 | 
				
			||||||
 | 
					MasterTrini1: checks 
 | 
				
			||||||
 | 
					*** RIVER ***
 | 
				
			||||||
 | 
					Nikolay Zem: bets $0.08
 | 
				
			||||||
 | 
					MasterTrini1: folds 
 | 
				
			||||||
 | 
					Uncalled bet ($0.08) returned to Nikolay Zem
 | 
				
			||||||
 | 
					Nikolay Zem collected $0.42 from pot
 | 
				
			||||||
 | 
					Nikolay Zem: doesn't show hand 
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.44 | Rake $0.02 
 | 
				
			||||||
 | 
					Seat 1: s0rrow folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 3: Nikolay Zem collected ($0.42)
 | 
				
			||||||
 | 
					Seat 4: rv2020 folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 5: trs2758 folded on the 5th Street
 | 
				
			||||||
 | 
					Seat 6: RoadDevil folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 8: MasterTrini1 folded on the River
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35874220204:  7 Card Stud Limit ($0.04/$0.08 USD) - 2009/11/26 10:14:58 ET
 | 
				
			||||||
 | 
					Table 'Atalante II' 8-max
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($2.08 in chips) 
 | 
				
			||||||
 | 
					Seat 3: Nikolay Zem ($2.35 in chips) 
 | 
				
			||||||
 | 
					Seat 4: rv2020 ($0.96 in chips) 
 | 
				
			||||||
 | 
					Seat 5: trs2758 ($2.02 in chips) 
 | 
				
			||||||
 | 
					Seat 6: RoadDevil ($1.13 in chips) 
 | 
				
			||||||
 | 
					Seat 8: MasterTrini1 ($1.85 in chips) 
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					Nikolay Zem: posts the ante $0.01
 | 
				
			||||||
 | 
					rv2020: posts the ante $0.01
 | 
				
			||||||
 | 
					trs2758: posts the ante $0.01
 | 
				
			||||||
 | 
					RoadDevil: posts the ante $0.01
 | 
				
			||||||
 | 
					MasterTrini1: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [Jd 9d 2h]
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [Ad]
 | 
				
			||||||
 | 
					Dealt to rv2020 [2c]
 | 
				
			||||||
 | 
					Dealt to trs2758 [8c]
 | 
				
			||||||
 | 
					Dealt to RoadDevil [3s]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [3h]
 | 
				
			||||||
 | 
					rv2020: brings in for $0.02
 | 
				
			||||||
 | 
					trs2758: calls $0.02
 | 
				
			||||||
 | 
					RoadDevil: folds 
 | 
				
			||||||
 | 
					MasterTrini1: calls $0.02
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					Nikolay Zem: calls $0.02
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [Ad] [9h]
 | 
				
			||||||
 | 
					Dealt to rv2020 [2c] [4d]
 | 
				
			||||||
 | 
					Dealt to trs2758 [8c] [Qd]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [3h] [Qs]
 | 
				
			||||||
 | 
					Nikolay Zem: checks 
 | 
				
			||||||
 | 
					rv2020: bets $0.04
 | 
				
			||||||
 | 
					trs2758: calls $0.04
 | 
				
			||||||
 | 
					MasterTrini1: calls $0.04
 | 
				
			||||||
 | 
					Nikolay Zem: folds 
 | 
				
			||||||
 | 
					*** 5th STREET ***
 | 
				
			||||||
 | 
					Dealt to rv2020 [2c 4d] [Jh]
 | 
				
			||||||
 | 
					Dealt to trs2758 [8c Qd] [Js]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [3h Qs] [4h]
 | 
				
			||||||
 | 
					trs2758: checks 
 | 
				
			||||||
 | 
					MasterTrini1: bets $0.08
 | 
				
			||||||
 | 
					rv2020: raises $0.08 to $0.16
 | 
				
			||||||
 | 
					trs2758: calls $0.16
 | 
				
			||||||
 | 
					MasterTrini1: calls $0.08
 | 
				
			||||||
 | 
					*** 6th STREET ***
 | 
				
			||||||
 | 
					Dealt to rv2020 [2c 4d Jh] [7c]
 | 
				
			||||||
 | 
					Dealt to trs2758 [8c Qd Js] [5c]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [3h Qs 4h] [7h]
 | 
				
			||||||
 | 
					trs2758: checks 
 | 
				
			||||||
 | 
					MasterTrini1: checks 
 | 
				
			||||||
 | 
					rv2020: bets $0.08
 | 
				
			||||||
 | 
					trs2758: folds 
 | 
				
			||||||
 | 
					MasterTrini1: calls $0.08
 | 
				
			||||||
 | 
					*** RIVER ***
 | 
				
			||||||
 | 
					MasterTrini1: checks 
 | 
				
			||||||
 | 
					rv2020: checks 
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					rv2020: shows [As Ac 2c 4d Jh 7c 3c] (a pair of Aces)
 | 
				
			||||||
 | 
					MasterTrini1: mucks hand 
 | 
				
			||||||
 | 
					rv2020 collected $0.86 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.90 | Rake $0.04 
 | 
				
			||||||
 | 
					Seat 1: s0rrow folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 3: Nikolay Zem folded on the 4th Street
 | 
				
			||||||
 | 
					Seat 4: rv2020 showed [As Ac 2c 4d Jh 7c 3c] and won ($0.86) with a pair of Aces
 | 
				
			||||||
 | 
					Seat 5: trs2758 folded on the 6th Street
 | 
				
			||||||
 | 
					Seat 6: RoadDevil folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 8: MasterTrini1 mucked [6s 8s 3h Qs 4h 7h 6d]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35874259784:  7 Card Stud Limit ($0.04/$0.08 USD) - 2009/11/26 10:16:07 ET
 | 
				
			||||||
 | 
					Table 'Atalante II' 8-max
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($2.07 in chips) 
 | 
				
			||||||
 | 
					Seat 3: Nikolay Zem ($2.32 in chips) 
 | 
				
			||||||
 | 
					Seat 4: rv2020 ($1.51 in chips) 
 | 
				
			||||||
 | 
					Seat 5: trs2758 ($1.79 in chips) 
 | 
				
			||||||
 | 
					Seat 6: RoadDevil ($1.12 in chips) 
 | 
				
			||||||
 | 
					Seat 8: MasterTrini1 ($1.54 in chips) 
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					Nikolay Zem: posts the ante $0.01
 | 
				
			||||||
 | 
					rv2020: posts the ante $0.01
 | 
				
			||||||
 | 
					trs2758: posts the ante $0.01
 | 
				
			||||||
 | 
					RoadDevil: posts the ante $0.01
 | 
				
			||||||
 | 
					MasterTrini1: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [7d 6h 9s]
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [Js]
 | 
				
			||||||
 | 
					Dealt to rv2020 [3d]
 | 
				
			||||||
 | 
					Dealt to trs2758 [7s]
 | 
				
			||||||
 | 
					Dealt to RoadDevil [Qh]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [5d]
 | 
				
			||||||
 | 
					rv2020: brings in for $0.02
 | 
				
			||||||
 | 
					trs2758: folds 
 | 
				
			||||||
 | 
					RoadDevil: calls $0.02
 | 
				
			||||||
 | 
					MasterTrini1: calls $0.02
 | 
				
			||||||
 | 
					s0rrow: calls $0.02
 | 
				
			||||||
 | 
					Nikolay Zem: calls $0.02
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [7d 6h 9s] [Kc]
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [Js] [6s]
 | 
				
			||||||
 | 
					Dealt to rv2020 [3d] [Jd]
 | 
				
			||||||
 | 
					Dealt to RoadDevil [Qh] [Th]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [5d] [8c]
 | 
				
			||||||
 | 
					Katica65 was removed from the table for failing to post
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					Nikolay Zem: checks 
 | 
				
			||||||
 | 
					danjr655 joins the table at seat #2 
 | 
				
			||||||
 | 
					rv2020: checks 
 | 
				
			||||||
 | 
					RoadDevil: checks 
 | 
				
			||||||
 | 
					MasterTrini1: checks 
 | 
				
			||||||
 | 
					*** 5th STREET ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [7d 6h 9s Kc] [Ah]
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [Js 6s] [Ad]
 | 
				
			||||||
 | 
					Dealt to rv2020 [3d Jd] [Tc]
 | 
				
			||||||
 | 
					Dealt to RoadDevil [Qh Th] [Qc]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [5d 8c] [3h]
 | 
				
			||||||
 | 
					RoadDevil: bets $0.08
 | 
				
			||||||
 | 
					MasterTrini1: folds 
 | 
				
			||||||
 | 
					s0rrow: raises $0.08 to $0.16
 | 
				
			||||||
 | 
					Nikolay Zem: calls $0.16
 | 
				
			||||||
 | 
					rv2020: folds 
 | 
				
			||||||
 | 
					RoadDevil: calls $0.08
 | 
				
			||||||
 | 
					*** 6th STREET ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [7d 6h 9s Kc Ah] [4d]
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [Js 6s Ad] [4s]
 | 
				
			||||||
 | 
					Dealt to RoadDevil [Qh Th Qc] [7h]
 | 
				
			||||||
 | 
					RoadDevil: checks 
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					Nikolay Zem: bets $0.08
 | 
				
			||||||
 | 
					RoadDevil: calls $0.08
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					*** RIVER ***
 | 
				
			||||||
 | 
					RoadDevil: checks 
 | 
				
			||||||
 | 
					Nikolay Zem: bets $0.08
 | 
				
			||||||
 | 
					RoadDevil: calls $0.08
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					Nikolay Zem: shows [Qs 3s Js 6s Ad 4s 2s] (a flush, Queen high)
 | 
				
			||||||
 | 
					RoadDevil: mucks hand 
 | 
				
			||||||
 | 
					Nikolay Zem collected $0.92 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.96 | Rake $0.04 
 | 
				
			||||||
 | 
					Seat 1: s0rrow folded on the 6th Street
 | 
				
			||||||
 | 
					Seat 3: Nikolay Zem showed [Qs 3s Js 6s Ad 4s 2s] and won ($0.92) with a flush, Queen high
 | 
				
			||||||
 | 
					Seat 4: rv2020 folded on the 5th Street
 | 
				
			||||||
 | 
					Seat 5: trs2758 folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 6: RoadDevil mucked [2h Ts Qh Th Qc 7h Kd]
 | 
				
			||||||
 | 
					Seat 8: MasterTrini1 folded on the 5th Street
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35874289931:  7 Card Stud Limit ($0.04/$0.08 USD) - 2009/11/26 10:16:59 ET
 | 
				
			||||||
 | 
					Table 'Atalante II' 8-max
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($1.88 in chips) 
 | 
				
			||||||
 | 
					Seat 2: danjr655 ($0.45 in chips) 
 | 
				
			||||||
 | 
					Seat 3: Nikolay Zem ($2.89 in chips) 
 | 
				
			||||||
 | 
					Seat 4: rv2020 ($1.48 in chips) 
 | 
				
			||||||
 | 
					Seat 5: trs2758 ($1.78 in chips) 
 | 
				
			||||||
 | 
					Seat 6: RoadDevil ($0.77 in chips) 
 | 
				
			||||||
 | 
					Seat 8: MasterTrini1 ($1.51 in chips) 
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					danjr655: posts the ante $0.01
 | 
				
			||||||
 | 
					Nikolay Zem: posts the ante $0.01
 | 
				
			||||||
 | 
					rv2020: posts the ante $0.01
 | 
				
			||||||
 | 
					trs2758: posts the ante $0.01
 | 
				
			||||||
 | 
					RoadDevil: posts the ante $0.01
 | 
				
			||||||
 | 
					MasterTrini1: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [2d Qs 8c]
 | 
				
			||||||
 | 
					Dealt to danjr655 [5d]
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [Jc]
 | 
				
			||||||
 | 
					Dealt to rv2020 [8d]
 | 
				
			||||||
 | 
					Dealt to trs2758 [Kd]
 | 
				
			||||||
 | 
					Dealt to RoadDevil [4s]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [6h]
 | 
				
			||||||
 | 
					RoadDevil: brings in for $0.02
 | 
				
			||||||
 | 
					Trackr21 joins the table at seat #7 
 | 
				
			||||||
 | 
					MasterTrini1: calls $0.02
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					danjr655: folds 
 | 
				
			||||||
 | 
					Nikolay Zem: calls $0.02
 | 
				
			||||||
 | 
					rv2020: calls $0.02
 | 
				
			||||||
 | 
					trs2758: calls $0.02
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [Jc] [2h]
 | 
				
			||||||
 | 
					Dealt to rv2020 [8d] [Jd]
 | 
				
			||||||
 | 
					Dealt to trs2758 [Kd] [Ks]
 | 
				
			||||||
 | 
					Dealt to RoadDevil [4s] [6c]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [6h] [4c]
 | 
				
			||||||
 | 
					Pair on board - a double bet is allowed
 | 
				
			||||||
 | 
					trs2758: bets $0.04
 | 
				
			||||||
 | 
					RoadDevil: calls $0.04
 | 
				
			||||||
 | 
					MasterTrini1: calls $0.04
 | 
				
			||||||
 | 
					Nikolay Zem: folds 
 | 
				
			||||||
 | 
					rv2020: folds 
 | 
				
			||||||
 | 
					*** 5th STREET ***
 | 
				
			||||||
 | 
					Dealt to trs2758 [Kd Ks] [7c]
 | 
				
			||||||
 | 
					Dealt to RoadDevil [4s 6c] [9d]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [6h 4c] [3h]
 | 
				
			||||||
 | 
					trs2758: bets $0.08
 | 
				
			||||||
 | 
					RoadDevil: folds 
 | 
				
			||||||
 | 
					MasterTrini1: raises $0.08 to $0.16
 | 
				
			||||||
 | 
					trs2758: raises $0.08 to $0.24
 | 
				
			||||||
 | 
					MasterTrini1: raises $0.08 to $0.32
 | 
				
			||||||
 | 
					Betting is capped
 | 
				
			||||||
 | 
					trs2758: calls $0.08
 | 
				
			||||||
 | 
					*** 6th STREET ***
 | 
				
			||||||
 | 
					Dealt to trs2758 [Kd Ks 7c] [9h]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [6h 4c 3h] [3c]
 | 
				
			||||||
 | 
					trs2758: checks 
 | 
				
			||||||
 | 
					MasterTrini1: bets $0.08
 | 
				
			||||||
 | 
					trs2758: calls $0.08
 | 
				
			||||||
 | 
					*** RIVER ***
 | 
				
			||||||
 | 
					trs2758: checks 
 | 
				
			||||||
 | 
					MasterTrini1: checks 
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					trs2758: shows [Ac 2c Kd Ks 7c 9h 9c] (two pair, Kings and Nines)
 | 
				
			||||||
 | 
					MasterTrini1: shows [5h 8h 6h 4c 3h 3c As] (a pair of Threes)
 | 
				
			||||||
 | 
					trs2758 collected $1.04 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $1.09 | Rake $0.05 
 | 
				
			||||||
 | 
					Seat 1: s0rrow folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 2: danjr655 folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 3: Nikolay Zem folded on the 4th Street
 | 
				
			||||||
 | 
					Seat 4: rv2020 folded on the 4th Street
 | 
				
			||||||
 | 
					Seat 5: trs2758 showed [Ac 2c Kd Ks 7c 9h 9c] and won ($1.04) with two pair, Kings and Nines
 | 
				
			||||||
 | 
					Seat 6: RoadDevil folded on the 5th Street
 | 
				
			||||||
 | 
					Seat 8: MasterTrini1 showed [5h 8h 6h 4c 3h 3c As] and lost with a pair of Threes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35874334277:  7 Card Stud Limit ($0.04/$0.08 USD) - 2009/11/26 10:18:16 ET
 | 
				
			||||||
 | 
					Table 'Atalante II' 8-max
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($1.87 in chips) 
 | 
				
			||||||
 | 
					Seat 2: danjr655 ($0.44 in chips) 
 | 
				
			||||||
 | 
					Seat 3: Nikolay Zem ($2.86 in chips) 
 | 
				
			||||||
 | 
					Seat 4: rv2020 ($1.45 in chips) 
 | 
				
			||||||
 | 
					Seat 5: trs2758 ($2.35 in chips) 
 | 
				
			||||||
 | 
					Seat 6: RoadDevil ($0.70 in chips) 
 | 
				
			||||||
 | 
					Seat 7: Trackr21 ($1.60 in chips) 
 | 
				
			||||||
 | 
					Seat 8: MasterTrini1 ($1.04 in chips) 
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					danjr655: posts the ante $0.01
 | 
				
			||||||
 | 
					Nikolay Zem: posts the ante $0.01
 | 
				
			||||||
 | 
					rv2020: posts the ante $0.01
 | 
				
			||||||
 | 
					trs2758: posts the ante $0.01
 | 
				
			||||||
 | 
					RoadDevil: posts the ante $0.01
 | 
				
			||||||
 | 
					Trackr21: posts the ante $0.01
 | 
				
			||||||
 | 
					MasterTrini1: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [7d Qs 8s]
 | 
				
			||||||
 | 
					Dealt to danjr655 [8d]
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [6d]
 | 
				
			||||||
 | 
					Dealt to rv2020 [4d]
 | 
				
			||||||
 | 
					Dealt to trs2758 [Ad]
 | 
				
			||||||
 | 
					Dealt to RoadDevil [Td]
 | 
				
			||||||
 | 
					Dealt to Trackr21 [Jh]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [5s]
 | 
				
			||||||
 | 
					rv2020: brings in for $0.02
 | 
				
			||||||
 | 
					trs2758: calls $0.02
 | 
				
			||||||
 | 
					RoadDevil: folds 
 | 
				
			||||||
 | 
					Trackr21: folds 
 | 
				
			||||||
 | 
					MasterTrini1: calls $0.02
 | 
				
			||||||
 | 
					s0rrow: calls $0.02
 | 
				
			||||||
 | 
					danjr655: folds 
 | 
				
			||||||
 | 
					Nikolay Zem: calls $0.02
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [7d Qs 8s] [2s]
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [6d] [2h]
 | 
				
			||||||
 | 
					Dealt to rv2020 [4d] [Kd]
 | 
				
			||||||
 | 
					Dealt to trs2758 [Ad] [Kh]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [5s] [5c]
 | 
				
			||||||
 | 
					Pair on board - a double bet is allowed
 | 
				
			||||||
 | 
					MasterTrini1: bets $0.08
 | 
				
			||||||
 | 
					s0rrow: calls $0.08
 | 
				
			||||||
 | 
					Nikolay Zem: folds 
 | 
				
			||||||
 | 
					rv2020: calls $0.08
 | 
				
			||||||
 | 
					trs2758: calls $0.08
 | 
				
			||||||
 | 
					*** 5th STREET ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [7d Qs 8s 2s] [As]
 | 
				
			||||||
 | 
					Dealt to rv2020 [4d Kd] [Qd]
 | 
				
			||||||
 | 
					Dealt to trs2758 [Ad Kh] [3h]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [5s 5c] [Js]
 | 
				
			||||||
 | 
					MasterTrini1: checks 
 | 
				
			||||||
 | 
					s0rrow: bets $0.08
 | 
				
			||||||
 | 
					rv2020: folds 
 | 
				
			||||||
 | 
					trs2758: folds 
 | 
				
			||||||
 | 
					MasterTrini1: calls $0.08
 | 
				
			||||||
 | 
					*** 6th STREET ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [7d Qs 8s 2s As] [5d]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [5s 5c Js] [2c]
 | 
				
			||||||
 | 
					MasterTrini1: checks 
 | 
				
			||||||
 | 
					s0rrow: bets $0.08
 | 
				
			||||||
 | 
					MasterTrini1: calls $0.08
 | 
				
			||||||
 | 
					*** RIVER ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [7d Qs 8s 2s As 5d] [7h]
 | 
				
			||||||
 | 
					MasterTrini1: checks 
 | 
				
			||||||
 | 
					s0rrow: bets $0.08
 | 
				
			||||||
 | 
					MasterTrini1: calls $0.08
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					s0rrow: shows [7d Qs 8s 2s As 5d 7h] (a pair of Sevens)
 | 
				
			||||||
 | 
					MasterTrini1: mucks hand 
 | 
				
			||||||
 | 
					s0rrow collected $0.94 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.98 | Rake $0.04 
 | 
				
			||||||
 | 
					Seat 1: s0rrow showed [7d Qs 8s 2s As 5d 7h] and won ($0.94) with a pair of Sevens
 | 
				
			||||||
 | 
					Seat 2: danjr655 folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 3: Nikolay Zem folded on the 4th Street
 | 
				
			||||||
 | 
					Seat 4: rv2020 folded on the 5th Street
 | 
				
			||||||
 | 
					Seat 5: trs2758 folded on the 5th Street
 | 
				
			||||||
 | 
					Seat 6: RoadDevil folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 7: Trackr21 folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 8: MasterTrini1 mucked [Ac 9d 5s 5c Js 2c Kc]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35874382643:  7 Card Stud Limit ($0.04/$0.08 USD) - 2009/11/26 10:19:39 ET
 | 
				
			||||||
 | 
					Table 'Atalante II' 8-max
 | 
				
			||||||
 | 
					Seat 1: s0rrow ($2.46 in chips) 
 | 
				
			||||||
 | 
					Seat 2: danjr655 ($0.43 in chips) 
 | 
				
			||||||
 | 
					Seat 3: Nikolay Zem ($2.83 in chips) 
 | 
				
			||||||
 | 
					Seat 4: rv2020 ($1.34 in chips) 
 | 
				
			||||||
 | 
					Seat 5: trs2758 ($2.24 in chips) 
 | 
				
			||||||
 | 
					Seat 6: RoadDevil ($0.69 in chips) 
 | 
				
			||||||
 | 
					Seat 7: Trackr21 ($1.59 in chips) 
 | 
				
			||||||
 | 
					Seat 8: MasterTrini1 ($0.69 in chips) 
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					danjr655: posts the ante $0.01
 | 
				
			||||||
 | 
					Nikolay Zem: posts the ante $0.01
 | 
				
			||||||
 | 
					rv2020: posts the ante $0.01
 | 
				
			||||||
 | 
					trs2758: posts the ante $0.01
 | 
				
			||||||
 | 
					RoadDevil: posts the ante $0.01
 | 
				
			||||||
 | 
					Trackr21: posts the ante $0.01
 | 
				
			||||||
 | 
					MasterTrini1: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [8d 3d 8c]
 | 
				
			||||||
 | 
					Dealt to danjr655 [Kd]
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [9c]
 | 
				
			||||||
 | 
					Dealt to rv2020 [4h]
 | 
				
			||||||
 | 
					Dealt to trs2758 [6c]
 | 
				
			||||||
 | 
					Dealt to RoadDevil [6d]
 | 
				
			||||||
 | 
					Dealt to Trackr21 [5d]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [8h]
 | 
				
			||||||
 | 
					rv2020: brings in for $0.02
 | 
				
			||||||
 | 
					trs2758: folds 
 | 
				
			||||||
 | 
					RoadDevil: calls $0.02
 | 
				
			||||||
 | 
					Trackr21: calls $0.02
 | 
				
			||||||
 | 
					MasterTrini1: calls $0.02
 | 
				
			||||||
 | 
					s0rrow: calls $0.02
 | 
				
			||||||
 | 
					danjr655: calls $0.02
 | 
				
			||||||
 | 
					Nikolay Zem: calls $0.02
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [8d 3d 8c] [Qc]
 | 
				
			||||||
 | 
					Dealt to danjr655 [Kd] [Kc]
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [9c] [Jd]
 | 
				
			||||||
 | 
					Dealt to rv2020 [4h] [8s]
 | 
				
			||||||
 | 
					Dealt to RoadDevil [6d] [4s]
 | 
				
			||||||
 | 
					Dealt to Trackr21 [5d] [4d]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [8h] [As]
 | 
				
			||||||
 | 
					Pair on board - a double bet is allowed
 | 
				
			||||||
 | 
					danjr655: bets $0.04
 | 
				
			||||||
 | 
					Nikolay Zem: calls $0.04
 | 
				
			||||||
 | 
					rv2020: folds 
 | 
				
			||||||
 | 
					RoadDevil: folds 
 | 
				
			||||||
 | 
					Trackr21: calls $0.04
 | 
				
			||||||
 | 
					MasterTrini1: calls $0.04
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					*** 5th STREET ***
 | 
				
			||||||
 | 
					Dealt to danjr655 [Kd Kc] [2h]
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [9c Jd] [Qs]
 | 
				
			||||||
 | 
					Dealt to Trackr21 [5d 4d] [3h]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [8h As] [Th]
 | 
				
			||||||
 | 
					danjr655: bets $0.08
 | 
				
			||||||
 | 
					Nikolay Zem: calls $0.08
 | 
				
			||||||
 | 
					Trackr21: calls $0.08
 | 
				
			||||||
 | 
					s0rrow is sitting out
 | 
				
			||||||
 | 
					MasterTrini1: calls $0.08
 | 
				
			||||||
 | 
					*** 6th STREET ***
 | 
				
			||||||
 | 
					Dealt to danjr655 [Kd Kc 2h] [7s]
 | 
				
			||||||
 | 
					Dealt to Nikolay Zem [9c Jd Qs] [9d]
 | 
				
			||||||
 | 
					Dealt to Trackr21 [5d 4d 3h] [5s]
 | 
				
			||||||
 | 
					Dealt to MasterTrini1 [8h As Th] [9h]
 | 
				
			||||||
 | 
					danjr655: checks 
 | 
				
			||||||
 | 
					Nikolay Zem: checks 
 | 
				
			||||||
 | 
					Trackr21: checks 
 | 
				
			||||||
 | 
					MasterTrini1: checks 
 | 
				
			||||||
 | 
					*** RIVER ***
 | 
				
			||||||
 | 
					danjr655: checks 
 | 
				
			||||||
 | 
					Nikolay Zem: checks 
 | 
				
			||||||
 | 
					Trackr21: bets $0.08
 | 
				
			||||||
 | 
					MasterTrini1: folds 
 | 
				
			||||||
 | 
					danjr655: folds 
 | 
				
			||||||
 | 
					Nikolay Zem: calls $0.08
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					Trackr21: shows [6h Ah 5d 4d 3h 5s 5c] (three of a kind, Fives)
 | 
				
			||||||
 | 
					Nikolay Zem: mucks hand 
 | 
				
			||||||
 | 
					Trackr21 collected $0.82 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.86 | Rake $0.04 
 | 
				
			||||||
 | 
					Seat 1: s0rrow folded on the 4th Street
 | 
				
			||||||
 | 
					Seat 2: danjr655 folded on the River
 | 
				
			||||||
 | 
					Seat 3: Nikolay Zem mucked [7c 7d 9c Jd Qs 9d Ad]
 | 
				
			||||||
 | 
					Seat 4: rv2020 folded on the 4th Street
 | 
				
			||||||
 | 
					Seat 5: trs2758 folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 6: RoadDevil folded on the 4th Street
 | 
				
			||||||
 | 
					Seat 7: Trackr21 showed [6h Ah 5d 4d 3h 5s 5c] and won ($0.82) with three of a kind, Fives
 | 
				
			||||||
 | 
					Seat 8: MasterTrini1 folded on the River
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,611 @@
 | 
				
			||||||
 | 
					PokerStars Game #35874487284:  7 Card Stud Hi/Lo Limit ($0.04/$0.08 USD) - 2009/11/26 10:22:32 ET
 | 
				
			||||||
 | 
					Table 'Dawn II' 8-max
 | 
				
			||||||
 | 
					Seat 3: gashpor ($1.46 in chips) 
 | 
				
			||||||
 | 
					Seat 4: denny501 ($0.93 in chips) 
 | 
				
			||||||
 | 
					Seat 5: s0rrow ($1.60 in chips) 
 | 
				
			||||||
 | 
					Seat 8: rdiezchang ($1.16 in chips) 
 | 
				
			||||||
 | 
					gashpor: posts the ante $0.01
 | 
				
			||||||
 | 
					denny501: posts the ante $0.01
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					rdiezchang: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to gashpor [Kc]
 | 
				
			||||||
 | 
					Dealt to denny501 [7c]
 | 
				
			||||||
 | 
					Dealt to s0rrow [5d Ks 2h]
 | 
				
			||||||
 | 
					Dealt to rdiezchang [3d]
 | 
				
			||||||
 | 
					s0rrow: brings in for $0.02
 | 
				
			||||||
 | 
					rdiezchang: calls $0.02
 | 
				
			||||||
 | 
					gashpor: calls $0.02
 | 
				
			||||||
 | 
					denny501: calls $0.02
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to gashpor [Kc] [4d]
 | 
				
			||||||
 | 
					Dealt to denny501 [7c] [Qh]
 | 
				
			||||||
 | 
					Dealt to s0rrow [5d Ks 2h] [9h]
 | 
				
			||||||
 | 
					Dealt to rdiezchang [3d] [7s]
 | 
				
			||||||
 | 
					Soroka69 joins the table at seat #7 
 | 
				
			||||||
 | 
					gashpor: checks 
 | 
				
			||||||
 | 
					poconoman is connected 
 | 
				
			||||||
 | 
					denny501: checks 
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					rdiezchang: checks 
 | 
				
			||||||
 | 
					*** 5th STREET ***
 | 
				
			||||||
 | 
					Dealt to gashpor [Kc 4d] [Qd]
 | 
				
			||||||
 | 
					Dealt to denny501 [7c Qh] [9s]
 | 
				
			||||||
 | 
					Dealt to s0rrow [5d Ks 2h 9h] [Js]
 | 
				
			||||||
 | 
					Dealt to rdiezchang [3d 7s] [Jh]
 | 
				
			||||||
 | 
					gashpor: checks 
 | 
				
			||||||
 | 
					denny501: checks 
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					rdiezchang: checks 
 | 
				
			||||||
 | 
					*** 6th STREET ***
 | 
				
			||||||
 | 
					Dealt to gashpor [Kc 4d Qd] [5s]
 | 
				
			||||||
 | 
					Dealt to denny501 [7c Qh 9s] [6s]
 | 
				
			||||||
 | 
					Dealt to s0rrow [5d Ks 2h 9h Js] [4c]
 | 
				
			||||||
 | 
					Dealt to rdiezchang [3d 7s Jh] [5c]
 | 
				
			||||||
 | 
					123smoothie joins the table at seat #2 
 | 
				
			||||||
 | 
					gashpor: checks 
 | 
				
			||||||
 | 
					denny501: checks 
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					rdiezchang: bets $0.08
 | 
				
			||||||
 | 
					gashpor: folds 
 | 
				
			||||||
 | 
					denny501: folds 
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					Uncalled bet ($0.08) returned to rdiezchang
 | 
				
			||||||
 | 
					rdiezchang collected $0.12 from pot
 | 
				
			||||||
 | 
					rdiezchang: doesn't show hand 
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.12 | Rake $0 
 | 
				
			||||||
 | 
					Seat 3: gashpor folded on the 6th Street
 | 
				
			||||||
 | 
					Seat 4: denny501 folded on the 6th Street
 | 
				
			||||||
 | 
					Seat 5: s0rrow folded on the 6th Street
 | 
				
			||||||
 | 
					Seat 8: rdiezchang collected ($0.12)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35874523510:  7 Card Stud Hi/Lo Limit ($0.04/$0.08 USD) - 2009/11/26 10:23:32 ET
 | 
				
			||||||
 | 
					Table 'Dawn II' 8-max
 | 
				
			||||||
 | 
					Seat 2: 123smoothie ($1.60 in chips) 
 | 
				
			||||||
 | 
					Seat 3: gashpor ($1.43 in chips) 
 | 
				
			||||||
 | 
					Seat 4: denny501 ($0.90 in chips) 
 | 
				
			||||||
 | 
					Seat 5: s0rrow ($1.57 in chips) 
 | 
				
			||||||
 | 
					Seat 7: Soroka69 ($1 in chips) 
 | 
				
			||||||
 | 
					Seat 8: rdiezchang ($1.25 in chips) 
 | 
				
			||||||
 | 
					123smoothie: posts the ante $0.01
 | 
				
			||||||
 | 
					gashpor: posts the ante $0.01
 | 
				
			||||||
 | 
					denny501: posts the ante $0.01
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					Soroka69: posts the ante $0.01
 | 
				
			||||||
 | 
					rdiezchang: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to 123smoothie [9h]
 | 
				
			||||||
 | 
					Dealt to gashpor [4s]
 | 
				
			||||||
 | 
					Dealt to denny501 [Qs]
 | 
				
			||||||
 | 
					Dealt to s0rrow [Qd Js Kc]
 | 
				
			||||||
 | 
					Dealt to Soroka69 [6s]
 | 
				
			||||||
 | 
					Dealt to rdiezchang [8d]
 | 
				
			||||||
 | 
					poconoman was removed from the table for failing to post
 | 
				
			||||||
 | 
					gashpor: brings in for $0.02
 | 
				
			||||||
 | 
					TomSludge joins the table at seat #6 
 | 
				
			||||||
 | 
					denny501: calls $0.02
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					Soroka69: calls $0.02
 | 
				
			||||||
 | 
					rdiezchang: calls $0.02
 | 
				
			||||||
 | 
					u.pressure joins the table at seat #1 
 | 
				
			||||||
 | 
					123smoothie: calls $0.02
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to 123smoothie [9h] [Ah]
 | 
				
			||||||
 | 
					Dealt to gashpor [4s] [6h]
 | 
				
			||||||
 | 
					Dealt to denny501 [Qs] [4d]
 | 
				
			||||||
 | 
					Dealt to Soroka69 [6s] [3c]
 | 
				
			||||||
 | 
					Dealt to rdiezchang [8d] [Ac]
 | 
				
			||||||
 | 
					123smoothie: checks 
 | 
				
			||||||
 | 
					gashpor: checks 
 | 
				
			||||||
 | 
					denny501: checks 
 | 
				
			||||||
 | 
					Soroka69: checks 
 | 
				
			||||||
 | 
					rdiezchang: checks 
 | 
				
			||||||
 | 
					*** 5th STREET ***
 | 
				
			||||||
 | 
					Dealt to 123smoothie [9h Ah] [5d]
 | 
				
			||||||
 | 
					Dealt to gashpor [4s 6h] [8h]
 | 
				
			||||||
 | 
					Dealt to denny501 [Qs 4d] [Tc]
 | 
				
			||||||
 | 
					Dealt to Soroka69 [6s 3c] [6c]
 | 
				
			||||||
 | 
					Dealt to rdiezchang [8d Ac] [8c]
 | 
				
			||||||
 | 
					rdiezchang: bets $0.08
 | 
				
			||||||
 | 
					123smoothie: calls $0.08
 | 
				
			||||||
 | 
					gashpor: calls $0.08
 | 
				
			||||||
 | 
					denny501: folds 
 | 
				
			||||||
 | 
					Soroka69: folds 
 | 
				
			||||||
 | 
					*** 6th STREET ***
 | 
				
			||||||
 | 
					Dealt to 123smoothie [9h Ah 5d] [4c]
 | 
				
			||||||
 | 
					Dealt to gashpor [4s 6h 8h] [Qh]
 | 
				
			||||||
 | 
					Dealt to rdiezchang [8d Ac 8c] [Jd]
 | 
				
			||||||
 | 
					rdiezchang: bets $0.08
 | 
				
			||||||
 | 
					123smoothie: calls $0.08
 | 
				
			||||||
 | 
					gashpor: calls $0.08
 | 
				
			||||||
 | 
					*** RIVER ***
 | 
				
			||||||
 | 
					rdiezchang: bets $0.08
 | 
				
			||||||
 | 
					123smoothie: calls $0.08
 | 
				
			||||||
 | 
					gashpor: folds 
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					rdiezchang: shows [Ad 5s 8d Ac 8c Jd Th] (HI: two pair, Aces and Eights)
 | 
				
			||||||
 | 
					123smoothie: mucks hand 
 | 
				
			||||||
 | 
					rdiezchang collected $0.77 from pot
 | 
				
			||||||
 | 
					No low hand qualified
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.80 | Rake $0.03 
 | 
				
			||||||
 | 
					Seat 2: 123smoothie mucked [9c Jc 9h Ah 5d 4c Qc]
 | 
				
			||||||
 | 
					Seat 3: gashpor folded on the River
 | 
				
			||||||
 | 
					Seat 4: denny501 folded on the 5th Street
 | 
				
			||||||
 | 
					Seat 5: s0rrow folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 7: Soroka69 folded on the 5th Street
 | 
				
			||||||
 | 
					Seat 8: rdiezchang showed [Ad 5s 8d Ac 8c Jd Th] and won ($0.77) with HI: two pair, Aces and Eights
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35874576282:  7 Card Stud Hi/Lo Limit ($0.04/$0.08 USD) - 2009/11/26 10:24:59 ET
 | 
				
			||||||
 | 
					Table 'Dawn II' 8-max
 | 
				
			||||||
 | 
					Seat 1: u.pressure ($11 in chips) 
 | 
				
			||||||
 | 
					Seat 2: 123smoothie ($1.33 in chips) 
 | 
				
			||||||
 | 
					Seat 3: gashpor ($1.24 in chips) 
 | 
				
			||||||
 | 
					Seat 4: denny501 ($0.87 in chips) 
 | 
				
			||||||
 | 
					Seat 5: s0rrow ($1.56 in chips) 
 | 
				
			||||||
 | 
					Seat 6: TomSludge ($1.60 in chips) 
 | 
				
			||||||
 | 
					Seat 7: Soroka69 ($0.97 in chips) 
 | 
				
			||||||
 | 
					Seat 8: rdiezchang ($1.75 in chips) 
 | 
				
			||||||
 | 
					u.pressure: posts the ante $0.01
 | 
				
			||||||
 | 
					123smoothie: posts the ante $0.01
 | 
				
			||||||
 | 
					gashpor: posts the ante $0.01
 | 
				
			||||||
 | 
					denny501: posts the ante $0.01
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					TomSludge: posts the ante $0.01
 | 
				
			||||||
 | 
					Soroka69: posts the ante $0.01
 | 
				
			||||||
 | 
					rdiezchang: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to u.pressure [Qs]
 | 
				
			||||||
 | 
					Dealt to 123smoothie [4h]
 | 
				
			||||||
 | 
					Dealt to gashpor [4c]
 | 
				
			||||||
 | 
					Dealt to denny501 [8s]
 | 
				
			||||||
 | 
					Dealt to s0rrow [Ah Kd 8d]
 | 
				
			||||||
 | 
					Dealt to TomSludge [Ks]
 | 
				
			||||||
 | 
					Dealt to Soroka69 [3h]
 | 
				
			||||||
 | 
					Dealt to rdiezchang [5s]
 | 
				
			||||||
 | 
					Soroka69: brings in for $0.02
 | 
				
			||||||
 | 
					rdiezchang: calls $0.02
 | 
				
			||||||
 | 
					u.pressure: calls $0.02
 | 
				
			||||||
 | 
					123smoothie: calls $0.02
 | 
				
			||||||
 | 
					gashpor: calls $0.02
 | 
				
			||||||
 | 
					denny501: folds 
 | 
				
			||||||
 | 
					s0rrow: calls $0.02
 | 
				
			||||||
 | 
					TomSludge: folds 
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to u.pressure [Qs] [Td]
 | 
				
			||||||
 | 
					Dealt to 123smoothie [4h] [9d]
 | 
				
			||||||
 | 
					Dealt to gashpor [4c] [Jc]
 | 
				
			||||||
 | 
					Dealt to s0rrow [Ah Kd 8d] [Kc]
 | 
				
			||||||
 | 
					Dealt to Soroka69 [3h] [Ad]
 | 
				
			||||||
 | 
					Dealt to rdiezchang [5s] [7c]
 | 
				
			||||||
 | 
					Soroka69: checks 
 | 
				
			||||||
 | 
					rdiezchang: checks 
 | 
				
			||||||
 | 
					u.pressure: checks 
 | 
				
			||||||
 | 
					123smoothie: checks 
 | 
				
			||||||
 | 
					gashpor: checks 
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					*** 5th STREET ***
 | 
				
			||||||
 | 
					Dealt to u.pressure [Qs Td] [Jh]
 | 
				
			||||||
 | 
					Dealt to 123smoothie [4h 9d] [2c]
 | 
				
			||||||
 | 
					Dealt to gashpor [4c Jc] [5h]
 | 
				
			||||||
 | 
					Dealt to s0rrow [Ah Kd 8d Kc] [2d]
 | 
				
			||||||
 | 
					Dealt to Soroka69 [3h Ad] [Qd]
 | 
				
			||||||
 | 
					Dealt to rdiezchang [5s 7c] [4d]
 | 
				
			||||||
 | 
					Soroka69: checks 
 | 
				
			||||||
 | 
					rdiezchang: checks 
 | 
				
			||||||
 | 
					u.pressure: checks 
 | 
				
			||||||
 | 
					123smoothie: checks 
 | 
				
			||||||
 | 
					gashpor: bets $0.08
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					Soroka69: calls $0.08
 | 
				
			||||||
 | 
					rdiezchang: calls $0.08
 | 
				
			||||||
 | 
					u.pressure: calls $0.08
 | 
				
			||||||
 | 
					123smoothie: folds 
 | 
				
			||||||
 | 
					*** 6th STREET ***
 | 
				
			||||||
 | 
					Dealt to u.pressure [Qs Td Jh] [6d]
 | 
				
			||||||
 | 
					Dealt to gashpor [4c Jc 5h] [7s]
 | 
				
			||||||
 | 
					Dealt to Soroka69 [3h Ad Qd] [9s]
 | 
				
			||||||
 | 
					Dealt to rdiezchang [5s 7c 4d] [Th]
 | 
				
			||||||
 | 
					Soroka69: checks 
 | 
				
			||||||
 | 
					rdiezchang: checks 
 | 
				
			||||||
 | 
					u.pressure: checks 
 | 
				
			||||||
 | 
					gashpor: checks 
 | 
				
			||||||
 | 
					*** RIVER ***
 | 
				
			||||||
 | 
					Soroka69: checks 
 | 
				
			||||||
 | 
					rdiezchang: checks 
 | 
				
			||||||
 | 
					u.pressure: checks 
 | 
				
			||||||
 | 
					gashpor: bets $0.08
 | 
				
			||||||
 | 
					Soroka69: folds 
 | 
				
			||||||
 | 
					rdiezchang: calls $0.08
 | 
				
			||||||
 | 
					u.pressure: calls $0.08
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					gashpor: shows [7h 2h 4c Jc 5h 7s 8c] (HI: a pair of Sevens; LO: 8,7,5,4,2)
 | 
				
			||||||
 | 
					rdiezchang: shows [As Qh 5s 7c 4d Th Ac] (HI: a pair of Aces)
 | 
				
			||||||
 | 
					u.pressure: shows [Qc Kh Qs Td Jh 6d 6s] (HI: two pair, Queens and Sixes)
 | 
				
			||||||
 | 
					u.pressure collected $0.37 from pot
 | 
				
			||||||
 | 
					gashpor collected $0.36 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.76 | Rake $0.03 
 | 
				
			||||||
 | 
					Seat 1: u.pressure showed [Qc Kh Qs Td Jh 6d 6s] and won ($0.37) with HI: two pair, Queens and Sixes
 | 
				
			||||||
 | 
					Seat 2: 123smoothie folded on the 5th Street
 | 
				
			||||||
 | 
					Seat 3: gashpor showed [7h 2h 4c Jc 5h 7s 8c] and won ($0.36) with HI: a pair of Sevens; LO: 8,7,5,4,2
 | 
				
			||||||
 | 
					Seat 4: denny501 folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 5: s0rrow folded on the 5th Street
 | 
				
			||||||
 | 
					Seat 6: TomSludge folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 7: Soroka69 folded on the River
 | 
				
			||||||
 | 
					Seat 8: rdiezchang showed [As Qh 5s 7c 4d Th Ac] and lost with HI: a pair of Aces
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35874635170:  7 Card Stud Hi/Lo Limit ($0.04/$0.08 USD) - 2009/11/26 10:26:37 ET
 | 
				
			||||||
 | 
					Table 'Dawn II' 8-max
 | 
				
			||||||
 | 
					Seat 1: u.pressure ($11.18 in chips) 
 | 
				
			||||||
 | 
					Seat 2: 123smoothie ($1.30 in chips) 
 | 
				
			||||||
 | 
					Seat 3: gashpor ($1.41 in chips) 
 | 
				
			||||||
 | 
					Seat 4: denny501 ($0.86 in chips) 
 | 
				
			||||||
 | 
					Seat 5: s0rrow ($1.53 in chips) 
 | 
				
			||||||
 | 
					Seat 6: TomSludge ($1.59 in chips) 
 | 
				
			||||||
 | 
					Seat 7: Soroka69 ($0.86 in chips) 
 | 
				
			||||||
 | 
					Seat 8: rdiezchang ($1.56 in chips) 
 | 
				
			||||||
 | 
					u.pressure: posts the ante $0.01
 | 
				
			||||||
 | 
					123smoothie: posts the ante $0.01
 | 
				
			||||||
 | 
					gashpor: posts the ante $0.01
 | 
				
			||||||
 | 
					denny501: posts the ante $0.01
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					TomSludge: posts the ante $0.01
 | 
				
			||||||
 | 
					Soroka69: posts the ante $0.01
 | 
				
			||||||
 | 
					rdiezchang: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to u.pressure [8c]
 | 
				
			||||||
 | 
					Dealt to 123smoothie [2c]
 | 
				
			||||||
 | 
					Dealt to gashpor [Qd]
 | 
				
			||||||
 | 
					Dealt to denny501 [9d]
 | 
				
			||||||
 | 
					Dealt to s0rrow [Ts 5c Js]
 | 
				
			||||||
 | 
					Dealt to TomSludge [3h]
 | 
				
			||||||
 | 
					Dealt to Soroka69 [7s]
 | 
				
			||||||
 | 
					Dealt to rdiezchang [6c]
 | 
				
			||||||
 | 
					123smoothie: brings in for $0.02
 | 
				
			||||||
 | 
					gashpor: folds 
 | 
				
			||||||
 | 
					denny501: calls $0.02
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					TomSludge: folds 
 | 
				
			||||||
 | 
					Soroka69: calls $0.02
 | 
				
			||||||
 | 
					rdiezchang: calls $0.02
 | 
				
			||||||
 | 
					u.pressure: folds 
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to 123smoothie [2c] [8d]
 | 
				
			||||||
 | 
					Dealt to denny501 [9d] [3d]
 | 
				
			||||||
 | 
					Dealt to Soroka69 [7s] [Th]
 | 
				
			||||||
 | 
					Dealt to rdiezchang [6c] [Ac]
 | 
				
			||||||
 | 
					rdiezchang: bets $0.04
 | 
				
			||||||
 | 
					123smoothie: calls $0.04
 | 
				
			||||||
 | 
					denny501: calls $0.04
 | 
				
			||||||
 | 
					Soroka69: folds 
 | 
				
			||||||
 | 
					*** 5th STREET ***
 | 
				
			||||||
 | 
					Dealt to 123smoothie [2c 8d] [3c]
 | 
				
			||||||
 | 
					Dealt to denny501 [9d 3d] [As]
 | 
				
			||||||
 | 
					Dealt to rdiezchang [6c Ac] [6s]
 | 
				
			||||||
 | 
					rdiezchang: bets $0.08
 | 
				
			||||||
 | 
					123smoothie: calls $0.08
 | 
				
			||||||
 | 
					denny501: calls $0.08
 | 
				
			||||||
 | 
					*** 6th STREET ***
 | 
				
			||||||
 | 
					Dealt to 123smoothie [2c 8d 3c] [3s]
 | 
				
			||||||
 | 
					Dealt to denny501 [9d 3d As] [Kc]
 | 
				
			||||||
 | 
					Dealt to rdiezchang [6c Ac 6s] [Qc]
 | 
				
			||||||
 | 
					rdiezchang: bets $0.08
 | 
				
			||||||
 | 
					123smoothie: calls $0.08
 | 
				
			||||||
 | 
					denny501: folds 
 | 
				
			||||||
 | 
					*** RIVER ***
 | 
				
			||||||
 | 
					rdiezchang: bets $0.08
 | 
				
			||||||
 | 
					123smoothie: calls $0.08
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					rdiezchang: shows [8s 7c 6c Ac 6s Qc Qs] (HI: two pair, Queens and Sixes)
 | 
				
			||||||
 | 
					123smoothie: mucks hand 
 | 
				
			||||||
 | 
					rdiezchang collected $0.80 from pot
 | 
				
			||||||
 | 
					No low hand qualified
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.84 | Rake $0.04 
 | 
				
			||||||
 | 
					Seat 1: u.pressure folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 2: 123smoothie mucked [2d 7d 2c 8d 3c 3s Tc]
 | 
				
			||||||
 | 
					Seat 3: gashpor folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 4: denny501 folded on the 6th Street
 | 
				
			||||||
 | 
					Seat 5: s0rrow folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 6: TomSludge folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 7: Soroka69 folded on the 4th Street
 | 
				
			||||||
 | 
					Seat 8: rdiezchang showed [8s 7c 6c Ac 6s Qc Qs] and won ($0.80) with HI: two pair, Queens and Sixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35874676388:  7 Card Stud Hi/Lo Limit ($0.04/$0.08 USD) - 2009/11/26 10:27:46 ET
 | 
				
			||||||
 | 
					Table 'Dawn II' 8-max
 | 
				
			||||||
 | 
					Seat 1: u.pressure ($11.17 in chips) 
 | 
				
			||||||
 | 
					Seat 2: 123smoothie ($0.99 in chips) 
 | 
				
			||||||
 | 
					Seat 3: gashpor ($1.40 in chips) 
 | 
				
			||||||
 | 
					Seat 4: denny501 ($0.71 in chips) 
 | 
				
			||||||
 | 
					Seat 5: s0rrow ($1.52 in chips) 
 | 
				
			||||||
 | 
					Seat 6: TomSludge ($1.58 in chips) 
 | 
				
			||||||
 | 
					Seat 7: Soroka69 ($0.83 in chips) 
 | 
				
			||||||
 | 
					Seat 8: rdiezchang ($2.05 in chips) 
 | 
				
			||||||
 | 
					u.pressure: posts the ante $0.01
 | 
				
			||||||
 | 
					123smoothie: posts the ante $0.01
 | 
				
			||||||
 | 
					gashpor: posts the ante $0.01
 | 
				
			||||||
 | 
					denny501: posts the ante $0.01
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					TomSludge: posts the ante $0.01
 | 
				
			||||||
 | 
					Soroka69: posts the ante $0.01
 | 
				
			||||||
 | 
					rdiezchang: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to u.pressure [Td]
 | 
				
			||||||
 | 
					Dealt to 123smoothie [4c]
 | 
				
			||||||
 | 
					Dealt to gashpor [5d]
 | 
				
			||||||
 | 
					Dealt to denny501 [2c]
 | 
				
			||||||
 | 
					Dealt to s0rrow [7c 3s 5h]
 | 
				
			||||||
 | 
					Dealt to TomSludge [8s]
 | 
				
			||||||
 | 
					Dealt to Soroka69 [7d]
 | 
				
			||||||
 | 
					Dealt to rdiezchang [Ad]
 | 
				
			||||||
 | 
					denny501: brings in for $0.02
 | 
				
			||||||
 | 
					s0rrow: calls $0.02
 | 
				
			||||||
 | 
					TomSludge: folds 
 | 
				
			||||||
 | 
					Soroka69: calls $0.02
 | 
				
			||||||
 | 
					rdiezchang: calls $0.02
 | 
				
			||||||
 | 
					u.pressure: folds 
 | 
				
			||||||
 | 
					123smoothie: calls $0.02
 | 
				
			||||||
 | 
					gashpor: calls $0.02
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to 123smoothie [4c] [3c]
 | 
				
			||||||
 | 
					Dealt to gashpor [5d] [Qd]
 | 
				
			||||||
 | 
					Dealt to denny501 [2c] [7s]
 | 
				
			||||||
 | 
					Dealt to s0rrow [7c 3s 5h] [Qc]
 | 
				
			||||||
 | 
					Dealt to Soroka69 [7d] [5s]
 | 
				
			||||||
 | 
					Dealt to rdiezchang [Ad] [Js]
 | 
				
			||||||
 | 
					rdiezchang: checks 
 | 
				
			||||||
 | 
					123smoothie: checks 
 | 
				
			||||||
 | 
					gashpor: checks 
 | 
				
			||||||
 | 
					denny501: folds 
 | 
				
			||||||
 | 
					denny501 leaves the table
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					Soroka69: checks 
 | 
				
			||||||
 | 
					*** 5th STREET ***
 | 
				
			||||||
 | 
					Dealt to 123smoothie [4c 3c] [9s]
 | 
				
			||||||
 | 
					Dealt to gashpor [5d Qd] [Jd]
 | 
				
			||||||
 | 
					Dealt to s0rrow [7c 3s 5h Qc] [Kc]
 | 
				
			||||||
 | 
					Dealt to Soroka69 [7d 5s] [5c]
 | 
				
			||||||
 | 
					Dealt to rdiezchang [Ad Js] [Ts]
 | 
				
			||||||
 | 
					LainaRahat joins the table at seat #4 
 | 
				
			||||||
 | 
					Soroka69: checks 
 | 
				
			||||||
 | 
					rdiezchang: checks 
 | 
				
			||||||
 | 
					123smoothie: checks 
 | 
				
			||||||
 | 
					gashpor: bets $0.08
 | 
				
			||||||
 | 
					s0rrow: calls $0.08
 | 
				
			||||||
 | 
					Soroka69: calls $0.08
 | 
				
			||||||
 | 
					rdiezchang: folds 
 | 
				
			||||||
 | 
					123smoothie: folds 
 | 
				
			||||||
 | 
					*** 6th STREET ***
 | 
				
			||||||
 | 
					Dealt to gashpor [5d Qd Jd] [9d]
 | 
				
			||||||
 | 
					Dealt to s0rrow [7c 3s 5h Qc Kc] [6d]
 | 
				
			||||||
 | 
					Dealt to Soroka69 [7d 5s 5c] [2s]
 | 
				
			||||||
 | 
					Soroka69: checks 
 | 
				
			||||||
 | 
					gashpor: bets $0.08
 | 
				
			||||||
 | 
					s0rrow: calls $0.08
 | 
				
			||||||
 | 
					Soroka69: calls $0.08
 | 
				
			||||||
 | 
					*** RIVER ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [7c 3s 5h Qc Kc 6d] [4d]
 | 
				
			||||||
 | 
					Soroka69: checks 
 | 
				
			||||||
 | 
					gashpor: bets $0.08
 | 
				
			||||||
 | 
					s0rrow: calls $0.08
 | 
				
			||||||
 | 
					Soroka69: folds 
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					gashpor: shows [4h 3d 5d Qd Jd 9d 6h] (HI: a flush, Queen high)
 | 
				
			||||||
 | 
					s0rrow: shows [7c 3s 5h Qc Kc 6d 4d] (HI: a straight, Three to Seven; LO: 7,6,5,4,3)
 | 
				
			||||||
 | 
					gashpor collected $0.40 from pot
 | 
				
			||||||
 | 
					s0rrow collected $0.40 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.84 | Rake $0.04 
 | 
				
			||||||
 | 
					Seat 1: u.pressure folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 2: 123smoothie folded on the 5th Street
 | 
				
			||||||
 | 
					Seat 3: gashpor showed [4h 3d 5d Qd Jd 9d 6h] and won ($0.40) with HI: a flush, Queen high
 | 
				
			||||||
 | 
					Seat 4: denny501 folded on the 4th Street
 | 
				
			||||||
 | 
					Seat 5: s0rrow showed [7c 3s 5h Qc Kc 6d 4d] and won ($0.40) with HI: a straight, Three to Seven; LO: 7,6,5,4,3
 | 
				
			||||||
 | 
					Seat 6: TomSludge folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 7: Soroka69 folded on the River
 | 
				
			||||||
 | 
					Seat 8: rdiezchang folded on the 5th Street
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35874733203:  7 Card Stud Hi/Lo Limit ($0.04/$0.08 USD) - 2009/11/26 10:29:22 ET
 | 
				
			||||||
 | 
					Table 'Dawn II' 8-max
 | 
				
			||||||
 | 
					Seat 1: u.pressure ($11.16 in chips) 
 | 
				
			||||||
 | 
					Seat 2: 123smoothie ($0.96 in chips) 
 | 
				
			||||||
 | 
					Seat 3: gashpor ($1.53 in chips) 
 | 
				
			||||||
 | 
					Seat 4: LainaRahat ($2 in chips) 
 | 
				
			||||||
 | 
					Seat 5: s0rrow ($1.65 in chips) 
 | 
				
			||||||
 | 
					Seat 6: TomSludge ($1.57 in chips) 
 | 
				
			||||||
 | 
					Seat 7: Soroka69 ($0.64 in chips) 
 | 
				
			||||||
 | 
					Seat 8: rdiezchang ($2.02 in chips) 
 | 
				
			||||||
 | 
					u.pressure: posts the ante $0.01
 | 
				
			||||||
 | 
					123smoothie: posts the ante $0.01
 | 
				
			||||||
 | 
					gashpor: posts the ante $0.01
 | 
				
			||||||
 | 
					LainaRahat: posts the ante $0.01
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					TomSludge: posts the ante $0.01
 | 
				
			||||||
 | 
					Soroka69: posts the ante $0.01
 | 
				
			||||||
 | 
					rdiezchang: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to u.pressure [Js]
 | 
				
			||||||
 | 
					Dealt to 123smoothie [Kc]
 | 
				
			||||||
 | 
					Dealt to gashpor [Kd]
 | 
				
			||||||
 | 
					Dealt to LainaRahat [Ts]
 | 
				
			||||||
 | 
					Dealt to s0rrow [Qd Ad 2s]
 | 
				
			||||||
 | 
					Dealt to TomSludge [4h]
 | 
				
			||||||
 | 
					Dealt to Soroka69 [3c]
 | 
				
			||||||
 | 
					Dealt to rdiezchang [3h]
 | 
				
			||||||
 | 
					s0rrow: brings in for $0.02
 | 
				
			||||||
 | 
					TomSludge: folds 
 | 
				
			||||||
 | 
					Soroka69: calls $0.02
 | 
				
			||||||
 | 
					rdiezchang: folds 
 | 
				
			||||||
 | 
					u.pressure: folds 
 | 
				
			||||||
 | 
					123smoothie: calls $0.02
 | 
				
			||||||
 | 
					gashpor: folds 
 | 
				
			||||||
 | 
					LainaRahat: calls $0.02
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to 123smoothie [Kc] [7d]
 | 
				
			||||||
 | 
					Dealt to LainaRahat [Ts] [4c]
 | 
				
			||||||
 | 
					Dealt to s0rrow [Qd Ad 2s] [As]
 | 
				
			||||||
 | 
					Dealt to Soroka69 [3c] [Qc]
 | 
				
			||||||
 | 
					rdiezchang leaves the table
 | 
				
			||||||
 | 
					s0rrow: bets $0.04
 | 
				
			||||||
 | 
					Soroka69: raises $0.04 to $0.08
 | 
				
			||||||
 | 
					geo_441 joins the table at seat #8 
 | 
				
			||||||
 | 
					123smoothie: folds 
 | 
				
			||||||
 | 
					LainaRahat: calls $0.08
 | 
				
			||||||
 | 
					s0rrow: calls $0.04
 | 
				
			||||||
 | 
					*** 5th STREET ***
 | 
				
			||||||
 | 
					Dealt to LainaRahat [Ts 4c] [Ks]
 | 
				
			||||||
 | 
					Dealt to s0rrow [Qd Ad 2s As] [2h]
 | 
				
			||||||
 | 
					Dealt to Soroka69 [3c Qc] [6h]
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					Soroka69: bets $0.08
 | 
				
			||||||
 | 
					LainaRahat: calls $0.08
 | 
				
			||||||
 | 
					s0rrow: calls $0.08
 | 
				
			||||||
 | 
					*** 6th STREET ***
 | 
				
			||||||
 | 
					Dealt to LainaRahat [Ts 4c Ks] [Tc]
 | 
				
			||||||
 | 
					Dealt to s0rrow [Qd Ad 2s As 2h] [8d]
 | 
				
			||||||
 | 
					Dealt to Soroka69 [3c Qc 6h] [7h]
 | 
				
			||||||
 | 
					LainaRahat: checks 
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					Soroka69: checks 
 | 
				
			||||||
 | 
					*** RIVER ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [Qd Ad 2s As 2h 8d] [6c]
 | 
				
			||||||
 | 
					LainaRahat: checks 
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					Soroka69: checks 
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					LainaRahat: shows [Ac 3s Ts 4c Ks Tc Kh] (HI: two pair, Kings and Tens)
 | 
				
			||||||
 | 
					s0rrow: shows [Qd Ad 2s As 2h 8d 6c] (HI: two pair, Aces and Deuces)
 | 
				
			||||||
 | 
					Soroka69: mucks hand 
 | 
				
			||||||
 | 
					s0rrow collected $0.61 from pot
 | 
				
			||||||
 | 
					No low hand qualified
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.64 | Rake $0.03 
 | 
				
			||||||
 | 
					Seat 1: u.pressure folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 2: 123smoothie folded on the 4th Street
 | 
				
			||||||
 | 
					Seat 3: gashpor folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 4: LainaRahat showed [Ac 3s Ts 4c Ks Tc Kh] and lost with HI: two pair, Kings and Tens
 | 
				
			||||||
 | 
					Seat 5: s0rrow showed [Qd Ad 2s As 2h 8d 6c] and won ($0.61) with HI: two pair, Aces and Deuces
 | 
				
			||||||
 | 
					Seat 6: TomSludge folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 7: Soroka69 mucked [2d Qh 3c Qc 6h 7h Jd]
 | 
				
			||||||
 | 
					Seat 8: rdiezchang folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35874789183:  7 Card Stud Hi/Lo Limit ($0.04/$0.08 USD) - 2009/11/26 10:30:56 ET
 | 
				
			||||||
 | 
					Table 'Dawn II' 8-max
 | 
				
			||||||
 | 
					Seat 1: u.pressure ($11.15 in chips) 
 | 
				
			||||||
 | 
					Seat 2: 123smoothie ($0.93 in chips) 
 | 
				
			||||||
 | 
					Seat 3: gashpor ($1.52 in chips) 
 | 
				
			||||||
 | 
					Seat 4: LainaRahat ($1.81 in chips) 
 | 
				
			||||||
 | 
					Seat 5: s0rrow ($2.07 in chips) 
 | 
				
			||||||
 | 
					Seat 6: TomSludge ($1.56 in chips) 
 | 
				
			||||||
 | 
					Seat 7: Soroka69 ($0.45 in chips) 
 | 
				
			||||||
 | 
					Seat 8: geo_441 ($1.60 in chips) 
 | 
				
			||||||
 | 
					u.pressure: posts the ante $0.01
 | 
				
			||||||
 | 
					123smoothie: posts the ante $0.01
 | 
				
			||||||
 | 
					gashpor: posts the ante $0.01
 | 
				
			||||||
 | 
					LainaRahat: posts the ante $0.01
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					TomSludge: posts the ante $0.01
 | 
				
			||||||
 | 
					Soroka69: posts the ante $0.01
 | 
				
			||||||
 | 
					geo_441: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to u.pressure [5c]
 | 
				
			||||||
 | 
					Dealt to 123smoothie [8c]
 | 
				
			||||||
 | 
					Dealt to gashpor [5s]
 | 
				
			||||||
 | 
					Dealt to LainaRahat [2c]
 | 
				
			||||||
 | 
					Dealt to s0rrow [8d Qs Kc]
 | 
				
			||||||
 | 
					Dealt to TomSludge [As]
 | 
				
			||||||
 | 
					Dealt to Soroka69 [Tc]
 | 
				
			||||||
 | 
					Dealt to geo_441 [4d]
 | 
				
			||||||
 | 
					LainaRahat: brings in for $0.02
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					TomSludge: calls $0.02
 | 
				
			||||||
 | 
					Soroka69: calls $0.02
 | 
				
			||||||
 | 
					geo_441: calls $0.02
 | 
				
			||||||
 | 
					u.pressure: folds 
 | 
				
			||||||
 | 
					123smoothie: calls $0.02
 | 
				
			||||||
 | 
					gashpor: calls $0.02
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to 123smoothie [8c] [9d]
 | 
				
			||||||
 | 
					Dealt to gashpor [5s] [5d]
 | 
				
			||||||
 | 
					Dealt to LainaRahat [2c] [2d]
 | 
				
			||||||
 | 
					Dealt to TomSludge [As] [8h]
 | 
				
			||||||
 | 
					Dealt to Soroka69 [Tc] [2h]
 | 
				
			||||||
 | 
					Dealt to geo_441 [4d] [3s]
 | 
				
			||||||
 | 
					gashpor: checks 
 | 
				
			||||||
 | 
					LainaRahat: checks 
 | 
				
			||||||
 | 
					TomSludge: bets $0.04
 | 
				
			||||||
 | 
					Soroka69: calls $0.04
 | 
				
			||||||
 | 
					geo_441: calls $0.04
 | 
				
			||||||
 | 
					123smoothie: calls $0.04
 | 
				
			||||||
 | 
					gashpor: calls $0.04
 | 
				
			||||||
 | 
					LainaRahat: folds 
 | 
				
			||||||
 | 
					*** 5th STREET ***
 | 
				
			||||||
 | 
					Dealt to 123smoothie [8c 9d] [Jd]
 | 
				
			||||||
 | 
					Dealt to gashpor [5s 5d] [Td]
 | 
				
			||||||
 | 
					Dealt to TomSludge [As 8h] [Js]
 | 
				
			||||||
 | 
					Dealt to Soroka69 [Tc 2h] [Qc]
 | 
				
			||||||
 | 
					Dealt to geo_441 [4d 3s] [7c]
 | 
				
			||||||
 | 
					gashpor: checks 
 | 
				
			||||||
 | 
					TomSludge: checks 
 | 
				
			||||||
 | 
					Soroka69: bets $0.08
 | 
				
			||||||
 | 
					geo_441: calls $0.08
 | 
				
			||||||
 | 
					123smoothie: calls $0.08
 | 
				
			||||||
 | 
					gashpor: calls $0.08
 | 
				
			||||||
 | 
					TomSludge: calls $0.08
 | 
				
			||||||
 | 
					*** 6th STREET ***
 | 
				
			||||||
 | 
					Dealt to 123smoothie [8c 9d Jd] [3c]
 | 
				
			||||||
 | 
					Dealt to gashpor [5s 5d Td] [9h]
 | 
				
			||||||
 | 
					Dealt to TomSludge [As 8h Js] [6c]
 | 
				
			||||||
 | 
					Dealt to Soroka69 [Tc 2h Qc] [5h]
 | 
				
			||||||
 | 
					Dealt to geo_441 [4d 3s 7c] [Jh]
 | 
				
			||||||
 | 
					gashpor: checks 
 | 
				
			||||||
 | 
					TomSludge: checks 
 | 
				
			||||||
 | 
					Soroka69: bets $0.08
 | 
				
			||||||
 | 
					geo_441: calls $0.08
 | 
				
			||||||
 | 
					123smoothie: calls $0.08
 | 
				
			||||||
 | 
					gashpor: calls $0.08
 | 
				
			||||||
 | 
					TomSludge: calls $0.08
 | 
				
			||||||
 | 
					*** RIVER ***
 | 
				
			||||||
 | 
					gashpor: checks 
 | 
				
			||||||
 | 
					TomSludge: checks 
 | 
				
			||||||
 | 
					Soroka69: checks 
 | 
				
			||||||
 | 
					geo_441: checks 
 | 
				
			||||||
 | 
					123smoothie: bets $0.08
 | 
				
			||||||
 | 
					gashpor: calls $0.08
 | 
				
			||||||
 | 
					TomSludge: calls $0.08
 | 
				
			||||||
 | 
					Soroka69: calls $0.08
 | 
				
			||||||
 | 
					geo_441: folds 
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					123smoothie: shows [Qd Ks 8c 9d Jd 3c 9c] (HI: a pair of Nines)
 | 
				
			||||||
 | 
					gashpor: shows [4c Th 5s 5d Td 9h Ad] (HI: two pair, Tens and Fives)
 | 
				
			||||||
 | 
					TomSludge: shows [7s Ah As 8h Js 6c Jc] (HI: two pair, Aces and Jacks)
 | 
				
			||||||
 | 
					Soroka69: mucks hand 
 | 
				
			||||||
 | 
					TomSludge collected $1.45 from pot
 | 
				
			||||||
 | 
					No low hand qualified
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $1.52 | Rake $0.07 
 | 
				
			||||||
 | 
					Seat 1: u.pressure folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 2: 123smoothie showed [Qd Ks 8c 9d Jd 3c 9c] and lost with HI: a pair of Nines
 | 
				
			||||||
 | 
					Seat 3: gashpor showed [4c Th 5s 5d Td 9h Ad] and lost with HI: two pair, Tens and Fives
 | 
				
			||||||
 | 
					Seat 4: LainaRahat folded on the 4th Street
 | 
				
			||||||
 | 
					Seat 5: s0rrow folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 6: TomSludge showed [7s Ah As 8h Js 6c Jc] and won ($1.45) with HI: two pair, Aces and Jacks
 | 
				
			||||||
 | 
					Seat 7: Soroka69 mucked [Qh Ts Tc 2h Qc 5h 6s]
 | 
				
			||||||
 | 
					Seat 8: geo_441 folded on the River
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,574 @@
 | 
				
			||||||
 | 
					PokerStars Game #35874566077:  Razz Limit ($0.04/$0.08 USD) - 2009/11/26 10:24:42 ET
 | 
				
			||||||
 | 
					Table 'Gotha II' 8-max
 | 
				
			||||||
 | 
					Seat 1: kobreli ($1.33 in chips) 
 | 
				
			||||||
 | 
					Seat 3: willy32948 ($2.17 in chips) 
 | 
				
			||||||
 | 
					Seat 5: meg100 ($1.71 in chips) 
 | 
				
			||||||
 | 
					Seat 7: s0rrow ($1.60 in chips) 
 | 
				
			||||||
 | 
					Seat 8: SilkZone ($1.65 in chips) 
 | 
				
			||||||
 | 
					kobreli: posts the ante $0.01
 | 
				
			||||||
 | 
					willy32948: posts the ante $0.01
 | 
				
			||||||
 | 
					meg100: posts the ante $0.01
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					SilkZone: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to kobreli [Qc]
 | 
				
			||||||
 | 
					Dealt to willy32948 [6h]
 | 
				
			||||||
 | 
					Dealt to meg100 [3s]
 | 
				
			||||||
 | 
					Dealt to s0rrow [Td 2s 9s]
 | 
				
			||||||
 | 
					Dealt to SilkZone [3h]
 | 
				
			||||||
 | 
					kobreli: brings in for $0.02
 | 
				
			||||||
 | 
					willy32948: calls $0.02
 | 
				
			||||||
 | 
					meg100: calls $0.02
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					SilkZone: calls $0.02
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to kobreli [Qc] [8s]
 | 
				
			||||||
 | 
					Dealt to willy32948 [6h] [7h]
 | 
				
			||||||
 | 
					Dealt to meg100 [3s] [Js]
 | 
				
			||||||
 | 
					Dealt to SilkZone [3h] [3d]
 | 
				
			||||||
 | 
					kurczakkr2 is disconnected 
 | 
				
			||||||
 | 
					willy32948: bets $0.04
 | 
				
			||||||
 | 
					meg100: calls $0.04
 | 
				
			||||||
 | 
					SilkZone: calls $0.04
 | 
				
			||||||
 | 
					kobreli: folds 
 | 
				
			||||||
 | 
					*** 5th STREET ***
 | 
				
			||||||
 | 
					Dealt to willy32948 [6h 7h] [7s]
 | 
				
			||||||
 | 
					Dealt to meg100 [3s Js] [Kh]
 | 
				
			||||||
 | 
					Dealt to SilkZone [3h 3d] [4h]
 | 
				
			||||||
 | 
					meg100: checks 
 | 
				
			||||||
 | 
					SilkZone: bets $0.08
 | 
				
			||||||
 | 
					willy32948: calls $0.08
 | 
				
			||||||
 | 
					meg100: folds 
 | 
				
			||||||
 | 
					*** 6th STREET ***
 | 
				
			||||||
 | 
					Dealt to willy32948 [6h 7h 7s] [Jh]
 | 
				
			||||||
 | 
					Dealt to SilkZone [3h 3d 4h] [9c]
 | 
				
			||||||
 | 
					SilkZone: bets $0.08
 | 
				
			||||||
 | 
					willy32948: folds 
 | 
				
			||||||
 | 
					Uncalled bet ($0.08) returned to SilkZone
 | 
				
			||||||
 | 
					willy32948 leaves the table
 | 
				
			||||||
 | 
					SilkZone collected $0.39 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.41 | Rake $0.02 
 | 
				
			||||||
 | 
					Seat 1: kobreli folded on the 4th Street
 | 
				
			||||||
 | 
					Seat 3: willy32948 folded on the 6th Street
 | 
				
			||||||
 | 
					Seat 5: meg100 folded on the 5th Street
 | 
				
			||||||
 | 
					Seat 7: s0rrow folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 8: SilkZone collected ($0.39)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35874590575:  Razz Limit ($0.04/$0.08 USD) - 2009/11/26 10:25:23 ET
 | 
				
			||||||
 | 
					Table 'Gotha II' 8-max
 | 
				
			||||||
 | 
					Seat 1: kobreli ($1.30 in chips) 
 | 
				
			||||||
 | 
					Seat 5: meg100 ($1.64 in chips) 
 | 
				
			||||||
 | 
					Seat 7: s0rrow ($1.59 in chips) 
 | 
				
			||||||
 | 
					Seat 8: SilkZone ($1.89 in chips) 
 | 
				
			||||||
 | 
					kobreli: posts the ante $0.01
 | 
				
			||||||
 | 
					meg100: posts the ante $0.01
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					SilkZone: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to kobreli [3h]
 | 
				
			||||||
 | 
					Dealt to meg100 [6s]
 | 
				
			||||||
 | 
					Dealt to s0rrow [4c 2h 8h]
 | 
				
			||||||
 | 
					Dealt to SilkZone [Jc]
 | 
				
			||||||
 | 
					SilkZone: brings in for $0.02
 | 
				
			||||||
 | 
					kobreli: calls $0.02
 | 
				
			||||||
 | 
					meg100: calls $0.02
 | 
				
			||||||
 | 
					s0rrow: calls $0.02
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to kobreli [3h] [Ks]
 | 
				
			||||||
 | 
					Dealt to meg100 [6s] [2d]
 | 
				
			||||||
 | 
					Dealt to s0rrow [4c 2h 8h] [7c]
 | 
				
			||||||
 | 
					Dealt to SilkZone [Jc] [3c]
 | 
				
			||||||
 | 
					meg100: checks 
 | 
				
			||||||
 | 
					s0rrow: bets $0.04
 | 
				
			||||||
 | 
					SilkZone: calls $0.04
 | 
				
			||||||
 | 
					kobreli: folds 
 | 
				
			||||||
 | 
					meg100: calls $0.04
 | 
				
			||||||
 | 
					*** 5th STREET ***
 | 
				
			||||||
 | 
					Dealt to meg100 [6s 2d] [5d]
 | 
				
			||||||
 | 
					Dealt to s0rrow [4c 2h 8h 7c] [Ah]
 | 
				
			||||||
 | 
					Dealt to SilkZone [Jc 3c] [8c]
 | 
				
			||||||
 | 
					meg100: checks 
 | 
				
			||||||
 | 
					s0rrow: bets $0.08
 | 
				
			||||||
 | 
					SilkZone: calls $0.08
 | 
				
			||||||
 | 
					meg100: calls $0.08
 | 
				
			||||||
 | 
					*** 6th STREET ***
 | 
				
			||||||
 | 
					Dealt to meg100 [6s 2d 5d] [Qs]
 | 
				
			||||||
 | 
					Dealt to s0rrow [4c 2h 8h 7c Ah] [2s]
 | 
				
			||||||
 | 
					Dealt to SilkZone [Jc 3c 8c] [Kh]
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					SilkZone: checks 
 | 
				
			||||||
 | 
					meg100: checks 
 | 
				
			||||||
 | 
					*** RIVER ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [4c 2h 8h 7c Ah 2s] [5h]
 | 
				
			||||||
 | 
					s0rrow: bets $0.08
 | 
				
			||||||
 | 
					HIWAII2 joins the table at seat #6 
 | 
				
			||||||
 | 
					SilkZone: folds 
 | 
				
			||||||
 | 
					meg100: folds 
 | 
				
			||||||
 | 
					Uncalled bet ($0.08) returned to s0rrow
 | 
				
			||||||
 | 
					s0rrow collected $0.46 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.48 | Rake $0.02 
 | 
				
			||||||
 | 
					Seat 1: kobreli folded on the 4th Street
 | 
				
			||||||
 | 
					Seat 5: meg100 folded on the River
 | 
				
			||||||
 | 
					Seat 7: s0rrow collected ($0.46)
 | 
				
			||||||
 | 
					Seat 8: SilkZone folded on the River
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35874623967:  Razz Limit ($0.04/$0.08 USD) - 2009/11/26 10:26:19 ET
 | 
				
			||||||
 | 
					Table 'Gotha II' 8-max
 | 
				
			||||||
 | 
					Seat 1: kobreli ($1.27 in chips) 
 | 
				
			||||||
 | 
					Seat 5: meg100 ($1.49 in chips) 
 | 
				
			||||||
 | 
					Seat 6: HIWAII2 ($1.13 in chips) 
 | 
				
			||||||
 | 
					Seat 7: s0rrow ($1.90 in chips) 
 | 
				
			||||||
 | 
					Seat 8: SilkZone ($1.74 in chips) 
 | 
				
			||||||
 | 
					kobreli: posts the ante $0.01
 | 
				
			||||||
 | 
					meg100: posts the ante $0.01
 | 
				
			||||||
 | 
					HIWAII2: posts the ante $0.01
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					SilkZone: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to kobreli [8c]
 | 
				
			||||||
 | 
					Dealt to meg100 [7h]
 | 
				
			||||||
 | 
					Dealt to HIWAII2 [Kh]
 | 
				
			||||||
 | 
					Dealt to s0rrow [9h 2s 7c]
 | 
				
			||||||
 | 
					Dealt to SilkZone [6s]
 | 
				
			||||||
 | 
					HIWAII2: brings in for $0.02
 | 
				
			||||||
 | 
					manga130 joins the table at seat #3 
 | 
				
			||||||
 | 
					s0rrow: calls $0.02
 | 
				
			||||||
 | 
					SilkZone: calls $0.02
 | 
				
			||||||
 | 
					kobreli: calls $0.02
 | 
				
			||||||
 | 
					meg100: calls $0.02
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to kobreli [8c] [8s]
 | 
				
			||||||
 | 
					Dealt to meg100 [7h] [As]
 | 
				
			||||||
 | 
					Dealt to HIWAII2 [Kh] [6h]
 | 
				
			||||||
 | 
					Dealt to s0rrow [9h 2s 7c] [6c]
 | 
				
			||||||
 | 
					Dealt to SilkZone [6s] [9c]
 | 
				
			||||||
 | 
					meg100: checks 
 | 
				
			||||||
 | 
					HIWAII2: checks 
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					SilkZone: checks 
 | 
				
			||||||
 | 
					kobreli: checks 
 | 
				
			||||||
 | 
					*** 5th STREET ***
 | 
				
			||||||
 | 
					Dealt to kobreli [8c 8s] [3c]
 | 
				
			||||||
 | 
					Dealt to meg100 [7h As] [5d]
 | 
				
			||||||
 | 
					Dealt to HIWAII2 [Kh 6h] [3d]
 | 
				
			||||||
 | 
					Dealt to s0rrow [9h 2s 7c 6c] [Qh]
 | 
				
			||||||
 | 
					Dealt to SilkZone [6s 9c] [Qs]
 | 
				
			||||||
 | 
					meg100: checks 
 | 
				
			||||||
 | 
					HIWAII2: bets $0.08
 | 
				
			||||||
 | 
					s0rrow: calls $0.08
 | 
				
			||||||
 | 
					SilkZone: folds 
 | 
				
			||||||
 | 
					kobreli: folds 
 | 
				
			||||||
 | 
					meg100: calls $0.08
 | 
				
			||||||
 | 
					*** 6th STREET ***
 | 
				
			||||||
 | 
					Dealt to meg100 [7h As 5d] [5c]
 | 
				
			||||||
 | 
					Dealt to HIWAII2 [Kh 6h 3d] [6d]
 | 
				
			||||||
 | 
					Dealt to s0rrow [9h 2s 7c 6c Qh] [Ad]
 | 
				
			||||||
 | 
					s0rrow: checks 
 | 
				
			||||||
 | 
					meg100: checks 
 | 
				
			||||||
 | 
					HIWAII2: checks 
 | 
				
			||||||
 | 
					*** RIVER ***
 | 
				
			||||||
 | 
					Dealt to s0rrow [9h 2s 7c 6c Qh Ad] [Ac]
 | 
				
			||||||
 | 
					s0rrow: bets $0.08
 | 
				
			||||||
 | 
					meg100: folds 
 | 
				
			||||||
 | 
					HIWAII2: raises $0.08 to $0.16
 | 
				
			||||||
 | 
					s0rrow: calls $0.08
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					HIWAII2: shows [2h 8d Kh 6h 3d 6d 4h] (Lo: 8,6,4,3,2)
 | 
				
			||||||
 | 
					s0rrow: mucks hand 
 | 
				
			||||||
 | 
					HIWAII2 collected $0.68 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.71 | Rake $0.03 
 | 
				
			||||||
 | 
					Seat 1: kobreli folded on the 5th Street
 | 
				
			||||||
 | 
					Seat 5: meg100 folded on the River
 | 
				
			||||||
 | 
					Seat 6: HIWAII2 showed [2h 8d Kh 6h 3d 6d 4h] and won ($0.68) with Lo: 8,6,4,3,2
 | 
				
			||||||
 | 
					Seat 7: s0rrow mucked [9h 2s 7c 6c Qh Ad Ac]
 | 
				
			||||||
 | 
					Seat 8: SilkZone folded on the 5th Street
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35874664176:  Razz Limit ($0.04/$0.08 USD) - 2009/11/26 10:27:26 ET
 | 
				
			||||||
 | 
					Table 'Gotha II' 8-max
 | 
				
			||||||
 | 
					Seat 1: kobreli ($1.24 in chips) 
 | 
				
			||||||
 | 
					Seat 3: manga130 ($0.68 in chips) 
 | 
				
			||||||
 | 
					Seat 5: meg100 ($1.38 in chips) 
 | 
				
			||||||
 | 
					Seat 6: HIWAII2 ($1.54 in chips) 
 | 
				
			||||||
 | 
					Seat 7: s0rrow ($1.63 in chips) 
 | 
				
			||||||
 | 
					Seat 8: SilkZone ($1.71 in chips) 
 | 
				
			||||||
 | 
					kobreli: posts the ante $0.01
 | 
				
			||||||
 | 
					manga130: posts the ante $0.01
 | 
				
			||||||
 | 
					meg100: posts the ante $0.01
 | 
				
			||||||
 | 
					HIWAII2: posts the ante $0.01
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					SilkZone: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to kobreli [Kd]
 | 
				
			||||||
 | 
					Dealt to manga130 [Td]
 | 
				
			||||||
 | 
					Dealt to meg100 [Qh]
 | 
				
			||||||
 | 
					Dealt to HIWAII2 [5h]
 | 
				
			||||||
 | 
					Dealt to s0rrow [9s Qd 2s]
 | 
				
			||||||
 | 
					Dealt to SilkZone [As]
 | 
				
			||||||
 | 
					kobreli: brings in for $0.02
 | 
				
			||||||
 | 
					manga130: folds 
 | 
				
			||||||
 | 
					meg100: folds 
 | 
				
			||||||
 | 
					HIWAII2: calls $0.02
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					SilkZone: calls $0.02
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to kobreli [Kd] [4s]
 | 
				
			||||||
 | 
					Dealt to HIWAII2 [5h] [4h]
 | 
				
			||||||
 | 
					Dealt to SilkZone [As] [Ah]
 | 
				
			||||||
 | 
					HIWAII2: bets $0.04
 | 
				
			||||||
 | 
					SilkZone: folds 
 | 
				
			||||||
 | 
					kobreli: folds 
 | 
				
			||||||
 | 
					Uncalled bet ($0.04) returned to HIWAII2
 | 
				
			||||||
 | 
					HIWAII2 collected $0.12 from pot
 | 
				
			||||||
 | 
					HIWAII2: shows [3d 3s 5h 4h] (Lo: 3,3,5,4)
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.12 | Rake $0 
 | 
				
			||||||
 | 
					Seat 1: kobreli folded on the 4th Street
 | 
				
			||||||
 | 
					Seat 3: manga130 folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 5: meg100 folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 6: HIWAII2 collected ($0.12)
 | 
				
			||||||
 | 
					Seat 7: s0rrow folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 8: SilkZone folded on the 4th Street
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35874682808:  Razz Limit ($0.04/$0.08 USD) - 2009/11/26 10:27:57 ET
 | 
				
			||||||
 | 
					Table 'Gotha II' 8-max
 | 
				
			||||||
 | 
					Seat 1: kobreli ($1.21 in chips) 
 | 
				
			||||||
 | 
					Seat 3: manga130 ($0.67 in chips) 
 | 
				
			||||||
 | 
					Seat 5: meg100 ($1.37 in chips) 
 | 
				
			||||||
 | 
					Seat 6: HIWAII2 ($1.63 in chips) 
 | 
				
			||||||
 | 
					Seat 7: s0rrow ($1.62 in chips) 
 | 
				
			||||||
 | 
					Seat 8: SilkZone ($1.68 in chips) 
 | 
				
			||||||
 | 
					kobreli: posts the ante $0.01
 | 
				
			||||||
 | 
					manga130: posts the ante $0.01
 | 
				
			||||||
 | 
					meg100: posts the ante $0.01
 | 
				
			||||||
 | 
					HIWAII2: posts the ante $0.01
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					SilkZone: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to kobreli [Tc]
 | 
				
			||||||
 | 
					Dealt to manga130 [Qd]
 | 
				
			||||||
 | 
					Dealt to meg100 [9h]
 | 
				
			||||||
 | 
					Dealt to HIWAII2 [5s]
 | 
				
			||||||
 | 
					Dealt to s0rrow [7h 9c Th]
 | 
				
			||||||
 | 
					Dealt to SilkZone [Kh]
 | 
				
			||||||
 | 
					SilkZone: brings in for $0.02
 | 
				
			||||||
 | 
					kobreli: folds 
 | 
				
			||||||
 | 
					manga130: calls $0.02
 | 
				
			||||||
 | 
					meg100: calls $0.02
 | 
				
			||||||
 | 
					HIWAII2: calls $0.02
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to manga130 [Qd] [8s]
 | 
				
			||||||
 | 
					Dealt to meg100 [9h] [Kd]
 | 
				
			||||||
 | 
					Dealt to HIWAII2 [5s] [6s]
 | 
				
			||||||
 | 
					Dealt to SilkZone [Kh] [2d]
 | 
				
			||||||
 | 
					HIWAII2: bets $0.04
 | 
				
			||||||
 | 
					SilkZone: raises $0.04 to $0.08
 | 
				
			||||||
 | 
					manga130: calls $0.08
 | 
				
			||||||
 | 
					meg100: folds 
 | 
				
			||||||
 | 
					HIWAII2: calls $0.04
 | 
				
			||||||
 | 
					*** 5th STREET ***
 | 
				
			||||||
 | 
					Dealt to manga130 [Qd 8s] [3h]
 | 
				
			||||||
 | 
					Dealt to HIWAII2 [5s 6s] [4s]
 | 
				
			||||||
 | 
					Dealt to SilkZone [Kh 2d] [Js]
 | 
				
			||||||
 | 
					HIWAII2: bets $0.08
 | 
				
			||||||
 | 
					SilkZone: calls $0.08
 | 
				
			||||||
 | 
					manga130: calls $0.08
 | 
				
			||||||
 | 
					*** 6th STREET ***
 | 
				
			||||||
 | 
					Dealt to manga130 [Qd 8s 3h] [Ks]
 | 
				
			||||||
 | 
					Dealt to HIWAII2 [5s 6s 4s] [Qs]
 | 
				
			||||||
 | 
					Dealt to SilkZone [Kh 2d Js] [6c]
 | 
				
			||||||
 | 
					HIWAII2: bets $0.08
 | 
				
			||||||
 | 
					SilkZone: calls $0.08
 | 
				
			||||||
 | 
					manga130: calls $0.08
 | 
				
			||||||
 | 
					*** RIVER ***
 | 
				
			||||||
 | 
					HIWAII2: bets $0.08
 | 
				
			||||||
 | 
					SilkZone: raises $0.08 to $0.16
 | 
				
			||||||
 | 
					manga130: folds 
 | 
				
			||||||
 | 
					HIWAII2: folds 
 | 
				
			||||||
 | 
					Uncalled bet ($0.08) returned to SilkZone
 | 
				
			||||||
 | 
					SilkZone collected $0.98 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $1.02 | Rake $0.04 
 | 
				
			||||||
 | 
					Seat 1: kobreli folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 3: manga130 folded on the River
 | 
				
			||||||
 | 
					Seat 5: meg100 folded on the 4th Street
 | 
				
			||||||
 | 
					Seat 6: HIWAII2 folded on the River
 | 
				
			||||||
 | 
					Seat 7: s0rrow folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 8: SilkZone collected ($0.98)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35874721245:  Razz Limit ($0.04/$0.08 USD) - 2009/11/26 10:29:02 ET
 | 
				
			||||||
 | 
					Table 'Gotha II' 8-max
 | 
				
			||||||
 | 
					Seat 1: kobreli ($1.20 in chips) 
 | 
				
			||||||
 | 
					Seat 3: manga130 ($0.40 in chips) 
 | 
				
			||||||
 | 
					Seat 5: meg100 ($1.34 in chips) 
 | 
				
			||||||
 | 
					Seat 6: HIWAII2 ($1.28 in chips) 
 | 
				
			||||||
 | 
					Seat 7: s0rrow ($1.61 in chips) 
 | 
				
			||||||
 | 
					Seat 8: SilkZone ($2.31 in chips) 
 | 
				
			||||||
 | 
					kobreli: posts the ante $0.01
 | 
				
			||||||
 | 
					manga130: posts the ante $0.01
 | 
				
			||||||
 | 
					meg100: posts the ante $0.01
 | 
				
			||||||
 | 
					HIWAII2: posts the ante $0.01
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					SilkZone: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to kobreli [3d]
 | 
				
			||||||
 | 
					Dealt to manga130 [Qc]
 | 
				
			||||||
 | 
					Dealt to meg100 [Qd]
 | 
				
			||||||
 | 
					Dealt to HIWAII2 [Js]
 | 
				
			||||||
 | 
					Dealt to s0rrow [Th Ah Qh]
 | 
				
			||||||
 | 
					Dealt to SilkZone [9d]
 | 
				
			||||||
 | 
					s0rrow: brings in for $0.02
 | 
				
			||||||
 | 
					SilkZone: calls $0.02
 | 
				
			||||||
 | 
					kobreli: calls $0.02
 | 
				
			||||||
 | 
					manga130: calls $0.02
 | 
				
			||||||
 | 
					meg100: folds 
 | 
				
			||||||
 | 
					HIWAII2: folds 
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to kobreli [3d] [Ad]
 | 
				
			||||||
 | 
					Dealt to manga130 [Qc] [6d]
 | 
				
			||||||
 | 
					Dealt to s0rrow [Th Ah Qh] [8s]
 | 
				
			||||||
 | 
					Dealt to SilkZone [9d] [7c]
 | 
				
			||||||
 | 
					kobreli: bets $0.04
 | 
				
			||||||
 | 
					manga130: folds 
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					SilkZone: raises $0.04 to $0.08
 | 
				
			||||||
 | 
					kobreli: raises $0.04 to $0.12
 | 
				
			||||||
 | 
					SilkZone: calls $0.04
 | 
				
			||||||
 | 
					*** 5th STREET ***
 | 
				
			||||||
 | 
					Dealt to kobreli [3d Ad] [Ac]
 | 
				
			||||||
 | 
					Dealt to SilkZone [9d 7c] [Ts]
 | 
				
			||||||
 | 
					SilkZone: checks 
 | 
				
			||||||
 | 
					kobreli: bets $0.08
 | 
				
			||||||
 | 
					SilkZone: calls $0.08
 | 
				
			||||||
 | 
					*** 6th STREET ***
 | 
				
			||||||
 | 
					Dealt to kobreli [3d Ad Ac] [Kh]
 | 
				
			||||||
 | 
					Dealt to SilkZone [9d 7c Ts] [5s]
 | 
				
			||||||
 | 
					SilkZone: bets $0.08
 | 
				
			||||||
 | 
					kobreli: calls $0.08
 | 
				
			||||||
 | 
					*** RIVER ***
 | 
				
			||||||
 | 
					SilkZone: checks 
 | 
				
			||||||
 | 
					kobreli: checks 
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					kobreli: shows [6h 8h 3d Ad Ac Kh 8c] (Lo: K,8,6,3,A)
 | 
				
			||||||
 | 
					SilkZone: shows [2d 4s 9d 7c Ts 5s Tc] (Lo: 9,7,5,4,2)
 | 
				
			||||||
 | 
					SilkZone collected $0.67 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.70 | Rake $0.03 
 | 
				
			||||||
 | 
					Seat 1: kobreli showed [6h 8h 3d Ad Ac Kh 8c] and lost with Lo: K,8,6,3,A
 | 
				
			||||||
 | 
					Seat 3: manga130 folded on the 4th Street
 | 
				
			||||||
 | 
					Seat 5: meg100 folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 6: HIWAII2 folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 7: s0rrow folded on the 4th Street
 | 
				
			||||||
 | 
					Seat 8: SilkZone showed [2d 4s 9d 7c Ts 5s Tc] and won ($0.67) with Lo: 9,7,5,4,2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35874756552:  Razz Limit ($0.04/$0.08 USD) - 2009/11/26 10:30:02 ET
 | 
				
			||||||
 | 
					Table 'Gotha II' 8-max
 | 
				
			||||||
 | 
					Seat 1: kobreli ($0.89 in chips) 
 | 
				
			||||||
 | 
					Seat 3: manga130 ($0.37 in chips) 
 | 
				
			||||||
 | 
					Seat 5: meg100 ($1.33 in chips) 
 | 
				
			||||||
 | 
					Seat 6: HIWAII2 ($1.27 in chips) 
 | 
				
			||||||
 | 
					Seat 7: s0rrow ($1.58 in chips) 
 | 
				
			||||||
 | 
					Seat 8: SilkZone ($2.67 in chips) 
 | 
				
			||||||
 | 
					kobreli: posts the ante $0.01
 | 
				
			||||||
 | 
					manga130: posts the ante $0.01
 | 
				
			||||||
 | 
					meg100: posts the ante $0.01
 | 
				
			||||||
 | 
					HIWAII2: posts the ante $0.01
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					SilkZone: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to kobreli [4s]
 | 
				
			||||||
 | 
					Dealt to manga130 [5h]
 | 
				
			||||||
 | 
					Dealt to meg100 [3h]
 | 
				
			||||||
 | 
					Dealt to HIWAII2 [Qh]
 | 
				
			||||||
 | 
					Dealt to s0rrow [Kd Ad 7d]
 | 
				
			||||||
 | 
					Dealt to SilkZone [9d]
 | 
				
			||||||
 | 
					kobreli said, "this.is.lucky"
 | 
				
			||||||
 | 
					HIWAII2: brings in for $0.02
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					SilkZone: folds 
 | 
				
			||||||
 | 
					kobreli: calls $0.02
 | 
				
			||||||
 | 
					manga130: folds 
 | 
				
			||||||
 | 
					meg100: calls $0.02
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to kobreli [4s] [Tc]
 | 
				
			||||||
 | 
					Dealt to meg100 [3h] [2s]
 | 
				
			||||||
 | 
					Dealt to HIWAII2 [Qh] [7s]
 | 
				
			||||||
 | 
					meg100: bets $0.04
 | 
				
			||||||
 | 
					HIWAII2: folds 
 | 
				
			||||||
 | 
					kobreli: calls $0.04
 | 
				
			||||||
 | 
					*** 5th STREET ***
 | 
				
			||||||
 | 
					Dealt to kobreli [4s Tc] [8d]
 | 
				
			||||||
 | 
					Dealt to meg100 [3h 2s] [Jh]
 | 
				
			||||||
 | 
					kobreli: bets $0.08
 | 
				
			||||||
 | 
					meg100: folds 
 | 
				
			||||||
 | 
					Uncalled bet ($0.08) returned to kobreli
 | 
				
			||||||
 | 
					kobreli collected $0.19 from pot
 | 
				
			||||||
 | 
					kobreli: doesn't show hand 
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.20 | Rake $0.01 
 | 
				
			||||||
 | 
					Seat 1: kobreli collected ($0.19)
 | 
				
			||||||
 | 
					Seat 3: manga130 folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 5: meg100 folded on the 5th Street
 | 
				
			||||||
 | 
					Seat 6: HIWAII2 folded on the 4th Street
 | 
				
			||||||
 | 
					Seat 7: s0rrow folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 8: SilkZone folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35874780027:  Razz Limit ($0.04/$0.08 USD) - 2009/11/26 10:30:41 ET
 | 
				
			||||||
 | 
					Table 'Gotha II' 8-max
 | 
				
			||||||
 | 
					Seat 1: kobreli ($1.01 in chips) 
 | 
				
			||||||
 | 
					Seat 3: manga130 ($0.36 in chips) 
 | 
				
			||||||
 | 
					Seat 5: meg100 ($1.26 in chips) 
 | 
				
			||||||
 | 
					Seat 6: HIWAII2 ($1.24 in chips) 
 | 
				
			||||||
 | 
					Seat 7: s0rrow ($1.57 in chips) 
 | 
				
			||||||
 | 
					Seat 8: SilkZone ($2.66 in chips) 
 | 
				
			||||||
 | 
					kobreli: posts the ante $0.01
 | 
				
			||||||
 | 
					manga130: posts the ante $0.01
 | 
				
			||||||
 | 
					meg100: posts the ante $0.01
 | 
				
			||||||
 | 
					HIWAII2: posts the ante $0.01
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					SilkZone: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to kobreli [6s]
 | 
				
			||||||
 | 
					Dealt to manga130 [9d]
 | 
				
			||||||
 | 
					Dealt to meg100 [5c]
 | 
				
			||||||
 | 
					Dealt to HIWAII2 [Qs]
 | 
				
			||||||
 | 
					Dealt to s0rrow [6d 9c 3d]
 | 
				
			||||||
 | 
					Dealt to SilkZone [Qc]
 | 
				
			||||||
 | 
					HIWAII2: brings in for $0.02
 | 
				
			||||||
 | 
					s0rrow: raises $0.02 to $0.04
 | 
				
			||||||
 | 
					SilkZone: calls $0.04
 | 
				
			||||||
 | 
					kobreli: calls $0.04
 | 
				
			||||||
 | 
					manga130: folds 
 | 
				
			||||||
 | 
					meg100: calls $0.04
 | 
				
			||||||
 | 
					HIWAII2: folds 
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to kobreli [6s] [7h]
 | 
				
			||||||
 | 
					Dealt to meg100 [5c] [5h]
 | 
				
			||||||
 | 
					Dealt to s0rrow [6d 9c 3d] [8s]
 | 
				
			||||||
 | 
					Dealt to SilkZone [Qc] [2c]
 | 
				
			||||||
 | 
					kobreli: bets $0.04
 | 
				
			||||||
 | 
					meg100: folds 
 | 
				
			||||||
 | 
					s0rrow: raises $0.04 to $0.08
 | 
				
			||||||
 | 
					SilkZone: raises $0.04 to $0.12
 | 
				
			||||||
 | 
					kobreli: calls $0.08
 | 
				
			||||||
 | 
					s0rrow: calls $0.04
 | 
				
			||||||
 | 
					*** 5th STREET ***
 | 
				
			||||||
 | 
					Dealt to kobreli [6s 7h] [2h]
 | 
				
			||||||
 | 
					Dealt to s0rrow [6d 9c 3d 8s] [Jh]
 | 
				
			||||||
 | 
					Dealt to SilkZone [Qc 2c] [7c]
 | 
				
			||||||
 | 
					kobreli: bets $0.08
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					SilkZone: calls $0.08
 | 
				
			||||||
 | 
					*** 6th STREET ***
 | 
				
			||||||
 | 
					Dealt to kobreli [6s 7h 2h] [3h]
 | 
				
			||||||
 | 
					Dealt to SilkZone [Qc 2c 7c] [Kd]
 | 
				
			||||||
 | 
					kobreli: bets $0.08
 | 
				
			||||||
 | 
					SilkZone: calls $0.08
 | 
				
			||||||
 | 
					*** RIVER ***
 | 
				
			||||||
 | 
					kobreli: bets $0.08
 | 
				
			||||||
 | 
					SilkZone: raises $0.08 to $0.16
 | 
				
			||||||
 | 
					kobreli: raises $0.08 to $0.24
 | 
				
			||||||
 | 
					SilkZone: raises $0.08 to $0.32
 | 
				
			||||||
 | 
					Betting is capped
 | 
				
			||||||
 | 
					kobreli: calls $0.08
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					SilkZone: shows [3s 5d Qc 2c 7c Kd As] (Lo: 7,5,3,2,A)
 | 
				
			||||||
 | 
					kobreli: shows [Ac Qd 6s 7h 2h 3h 4c] (Lo: 6,4,3,2,A)
 | 
				
			||||||
 | 
					kobreli collected $1.49 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $1.56 | Rake $0.07 
 | 
				
			||||||
 | 
					Seat 1: kobreli showed [Ac Qd 6s 7h 2h 3h 4c] and won ($1.49) with Lo: 6,4,3,2,A
 | 
				
			||||||
 | 
					Seat 3: manga130 folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 5: meg100 folded on the 4th Street
 | 
				
			||||||
 | 
					Seat 6: HIWAII2 folded on the 3rd Street
 | 
				
			||||||
 | 
					Seat 7: s0rrow folded on the 5th Street
 | 
				
			||||||
 | 
					Seat 8: SilkZone showed [3s 5d Qc 2c 7c Kd As] and lost with Lo: 7,5,3,2,A
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PokerStars Game #35874817957:  Razz Limit ($0.04/$0.08 USD) - 2009/11/26 10:31:45 ET
 | 
				
			||||||
 | 
					Table 'Gotha II' 8-max
 | 
				
			||||||
 | 
					Seat 1: kobreli ($1.85 in chips) 
 | 
				
			||||||
 | 
					Seat 3: manga130 ($0.35 in chips) 
 | 
				
			||||||
 | 
					Seat 5: meg100 ($1.21 in chips) 
 | 
				
			||||||
 | 
					Seat 6: HIWAII2 ($1.21 in chips) 
 | 
				
			||||||
 | 
					Seat 7: s0rrow ($1.40 in chips) 
 | 
				
			||||||
 | 
					Seat 8: SilkZone ($2.01 in chips) 
 | 
				
			||||||
 | 
					kobreli: posts the ante $0.01
 | 
				
			||||||
 | 
					manga130: posts the ante $0.01
 | 
				
			||||||
 | 
					meg100: posts the ante $0.01
 | 
				
			||||||
 | 
					HIWAII2: posts the ante $0.01
 | 
				
			||||||
 | 
					s0rrow: posts the ante $0.01
 | 
				
			||||||
 | 
					SilkZone: posts the ante $0.01
 | 
				
			||||||
 | 
					*** 3rd STREET ***
 | 
				
			||||||
 | 
					Dealt to kobreli [As]
 | 
				
			||||||
 | 
					Dealt to manga130 [Ac]
 | 
				
			||||||
 | 
					Dealt to meg100 [Ah]
 | 
				
			||||||
 | 
					Dealt to HIWAII2 [Jd]
 | 
				
			||||||
 | 
					Dealt to s0rrow [6d 4h 3h]
 | 
				
			||||||
 | 
					Dealt to SilkZone [2c]
 | 
				
			||||||
 | 
					HIWAII2: brings in for $0.02
 | 
				
			||||||
 | 
					s0rrow: calls $0.02
 | 
				
			||||||
 | 
					SilkZone: calls $0.02
 | 
				
			||||||
 | 
					kobreli: calls $0.02
 | 
				
			||||||
 | 
					manga130: calls $0.02
 | 
				
			||||||
 | 
					meg100: folds 
 | 
				
			||||||
 | 
					*** 4th STREET ***
 | 
				
			||||||
 | 
					Dealt to kobreli [As] [6s]
 | 
				
			||||||
 | 
					Dealt to manga130 [Ac] [6h]
 | 
				
			||||||
 | 
					Dealt to HIWAII2 [Jd] [Qc]
 | 
				
			||||||
 | 
					Dealt to s0rrow [6d 4h 3h] [3c]
 | 
				
			||||||
 | 
					Dealt to SilkZone [2c] [Th]
 | 
				
			||||||
 | 
					kobreli: bets $0.04
 | 
				
			||||||
 | 
					manga130: calls $0.04
 | 
				
			||||||
 | 
					HIWAII2: folds 
 | 
				
			||||||
 | 
					s0rrow: calls $0.04
 | 
				
			||||||
 | 
					SilkZone: folds 
 | 
				
			||||||
 | 
					*** 5th STREET ***
 | 
				
			||||||
 | 
					Dealt to kobreli [As 6s] [5c]
 | 
				
			||||||
 | 
					Dealt to manga130 [Ac 6h] [5s]
 | 
				
			||||||
 | 
					Dealt to s0rrow [6d 4h 3h 3c] [9s]
 | 
				
			||||||
 | 
					kobreli: bets $0.08
 | 
				
			||||||
 | 
					manga130: calls $0.08
 | 
				
			||||||
 | 
					s0rrow: folds 
 | 
				
			||||||
 | 
					*** 6th STREET ***
 | 
				
			||||||
 | 
					Dealt to kobreli [As 6s 5c] [5d]
 | 
				
			||||||
 | 
					Dealt to manga130 [Ac 6h 5s] [9h]
 | 
				
			||||||
 | 
					manga130: bets $0.08
 | 
				
			||||||
 | 
					kobreli: raises $0.08 to $0.16
 | 
				
			||||||
 | 
					manga130: calls $0.08
 | 
				
			||||||
 | 
					*** RIVER ***
 | 
				
			||||||
 | 
					manga130: bets $0.04 and is all-in
 | 
				
			||||||
 | 
					kobreli: calls $0.04
 | 
				
			||||||
 | 
					*** SHOW DOWN ***
 | 
				
			||||||
 | 
					manga130: shows [Ad 8h Ac 6h 5s 9h Kh] (Lo: 9,8,6,5,A)
 | 
				
			||||||
 | 
					kobreli: shows [3d 2s As 6s 5c 5d 2d] (Lo: 6,5,3,2,A)
 | 
				
			||||||
 | 
					kobreli collected $0.80 from pot
 | 
				
			||||||
 | 
					*** SUMMARY ***
 | 
				
			||||||
 | 
					Total pot $0.84 | Rake $0.04 
 | 
				
			||||||
 | 
					Seat 1: kobreli showed [3d 2s As 6s 5c 5d 2d] and won ($0.80) with Lo: 6,5,3,2,A
 | 
				
			||||||
 | 
					Seat 3: manga130 showed [Ad 8h Ac 6h 5s 9h Kh] and lost with Lo: 9,8,6,5,A
 | 
				
			||||||
 | 
					Seat 5: meg100 folded on the 3rd Street (didn't bet)
 | 
				
			||||||
 | 
					Seat 6: HIWAII2 folded on the 4th Street
 | 
				
			||||||
 | 
					Seat 7: s0rrow folded on the 5th Street
 | 
				
			||||||
 | 
					Seat 8: SilkZone folded on the 4th Street
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										17390
									
								
								pyfpdb/regression-test-files/tour/Stars/Flop/NLHE-USD-MTT-5r-200710.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17390
									
								
								pyfpdb/regression-test-files/tour/Stars/Flop/NLHE-USD-MTT-5r-200710.txt
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -64,5 +64,4 @@ def testSQLiteModFunction():
 | 
				
			||||||
        assert vars[idx]%13 == int(i[0])
 | 
					        assert vars[idx]%13 == int(i[0])
 | 
				
			||||||
        idx = idx+1
 | 
					        idx = idx+1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert 0 == 1
 | 
					 | 
				
			||||||
    cur.execute("DROP TABLE test")
 | 
					    cur.execute("DROP TABLE test")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,6 +3,19 @@ import PokerStarsToFpdb
 | 
				
			||||||
from Hand import *
 | 
					from Hand import *
 | 
				
			||||||
import py
 | 
					import py
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import Configuration
 | 
				
			||||||
 | 
					import Database
 | 
				
			||||||
 | 
					import fpdb_import
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					config = Configuration.Config(file = "HUD_config.test.xml")
 | 
				
			||||||
 | 
					db = Database.Database(config)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					settings = {}
 | 
				
			||||||
 | 
					settings.update(config.get_db_parameters())
 | 
				
			||||||
 | 
					settings.update(config.get_tv_parameters())
 | 
				
			||||||
 | 
					settings.update(config.get_import_parameters())
 | 
				
			||||||
 | 
					settings.update(config.get_default_paths())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#regression-test-files/stars/badugi/ring-fl-badugi.txt
 | 
					#regression-test-files/stars/badugi/ring-fl-badugi.txt
 | 
				
			||||||
#   s0rrow: input: $30.00 end: $22.65 total: ($7.35)
 | 
					#   s0rrow: input: $30.00 end: $22.65 total: ($7.35)
 | 
				
			||||||
#regression-test-files/stars/plo/PLO-6max.txt
 | 
					#regression-test-files/stars/plo/PLO-6max.txt
 | 
				
			||||||
| 
						 | 
					@ -45,37 +58,53 @@ def testGameInfo():
 | 
				
			||||||
        yield checkGameInfo, hhc, header, info
 | 
					        yield checkGameInfo, hhc, header, info
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def testHandInfo():
 | 
					def testFlopImport():
 | 
				
			||||||
    text = u"""PokerStars Game #20461877044:  Hold'em No Limit ($1/$2) - 2008/09/16 18:58:01 ET"""
 | 
					    db.recreate_tables()
 | 
				
			||||||
    hhc = PokerStarsToFpdb.PokerStars(autostart=False)
 | 
					    importer = fpdb_import.Importer(False, settings, config)
 | 
				
			||||||
    h = HoldemOmahaHand(None, "PokerStars", gametype, text, builtFrom = "Test")
 | 
					    importer.setDropIndexes("don't drop")
 | 
				
			||||||
    hhc.readHandInfo(h)
 | 
					    importer.setFailOnError(True)
 | 
				
			||||||
    assert h.handid == '20461877044'
 | 
					    importer.setThreads(-1)
 | 
				
			||||||
    assert h.sitename == 'PokerStars'
 | 
					    importer.addBulkImportImportFileOrDir(
 | 
				
			||||||
    assert h.starttime == (2008, 9, 16, 18, 58, 1, 1, 260, -1)
 | 
					            """regression-test-files/cash/Stars/Flop/NLHE-6max-EUR-0.05-0.10-200911.txt""", site="PokerStars")
 | 
				
			||||||
    
 | 
					    importer.addBulkImportImportFileOrDir(
 | 
				
			||||||
    text = u"""PokerStars Game #18707234955:  Razz Limit ($0.50/$1.00) - 2008/07/09 - 21:41:43 (ET)
 | 
					            """regression-test-files/cash/Stars/Flop/NLHE-6max-USD-0.05-0.10-200911.txt""", site="PokerStars")
 | 
				
			||||||
Table 'Lepus II' 8-max"""
 | 
					    #importer.addBulkImportImportFileOrDir(
 | 
				
			||||||
    hhc = PokerStarsToFpdb.PokerStars(autostart=False)
 | 
					    #        """regression-test-files/tour/Stars/Flop/NLHE-USD-MTT-5r-200710.txt""", site="PokerStars")
 | 
				
			||||||
    h = HoldemOmahaHand(None, "PokerStars", gametype, text, builtFrom = "Test")
 | 
					    importer.addBulkImportImportFileOrDir(
 | 
				
			||||||
    hhc.readHandInfo(h)
 | 
					            """regression-test-files/cash/Stars/Flop/PLO8-6max-USD-0.01-0.02-200911.txt""", site="PokerStars")
 | 
				
			||||||
    assert h.handid == '18707234955'
 | 
					    importer.setCallHud(False)
 | 
				
			||||||
    assert h.sitename == 'PokerStars'
 | 
					    (stored, dups, partial, errs, ttime) = importer.runImport()
 | 
				
			||||||
    assert h.maxseats == 8
 | 
					    importer.clearFileList()
 | 
				
			||||||
    assert h.tablename == 'Lepus II'
 | 
					
 | 
				
			||||||
    assert h.starttime == (2008,7 , 9, 21, 41, 43, 2, 191, -1)
 | 
					    # Should actually do some testing here
 | 
				
			||||||
    
 | 
					    assert 1 == 1
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    text = u"""PokerStars Game #22073591924:  Hold'em No Limit ($0.50/$1.00) - 2008/11/16 1:22:21 CET [2008/11/15 19:22:21 ET]
 | 
					def testStudImport():
 | 
				
			||||||
Table 'Caia II' 6-max Seat #2 is the button"""
 | 
					    db.recreate_tables()
 | 
				
			||||||
    hhc = PokerStarsToFpdb.PokerStars(autostart=False)
 | 
					    importer = fpdb_import.Importer(False, settings, config)
 | 
				
			||||||
    h = HoldemOmahaHand(None, "PokerStars", gametype, text, builtFrom = "Test")
 | 
					    importer.setDropIndexes("don't drop")
 | 
				
			||||||
    hhc.readHandInfo(h)
 | 
					    importer.setFailOnError(True)
 | 
				
			||||||
    assert h.handid == '22073591924'
 | 
					    importer.setThreads(-1)
 | 
				
			||||||
    assert h.sitename == 'PokerStars'
 | 
					    importer.addBulkImportImportFileOrDir(
 | 
				
			||||||
    assert h.maxseats == 6
 | 
					            """regression-test-files/cash/Stars/Stud/7-Stud-USD-0.04-0.08-200911.txt""", site="PokerStars")
 | 
				
			||||||
    assert h.tablename == 'Caia II'
 | 
					    importer.addBulkImportImportFileOrDir(
 | 
				
			||||||
    assert h.buttonpos == '2' # TODO: should this be an int?
 | 
					            """regression-test-files/cash/Stars/Stud/7-StudHL-USD-0.04-0.08-200911.txt""", site="PokerStars")
 | 
				
			||||||
    assert h.starttime == (2008,11 , 15, 19, 22, 21, 5, 320, -1)
 | 
					    importer.addBulkImportImportFileOrDir(
 | 
				
			||||||
    
 | 
					            """regression-test-files/cash/Stars/Stud/Razz-USD-0.04-0.08-200911.txt""", site="PokerStars")
 | 
				
			||||||
    
 | 
					    importer.setCallHud(False)
 | 
				
			||||||
 | 
					    (stored, dups, partial, errs, ttime) = importer.runImport()
 | 
				
			||||||
 | 
					    importer.clearFileList()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def testDrawImport():
 | 
				
			||||||
 | 
					    db.recreate_tables()
 | 
				
			||||||
 | 
					    importer = fpdb_import.Importer(False, settings, config)
 | 
				
			||||||
 | 
					    importer.setDropIndexes("don't drop")
 | 
				
			||||||
 | 
					    importer.setFailOnError(True)
 | 
				
			||||||
 | 
					    importer.setThreads(-1)
 | 
				
			||||||
 | 
					    importer.addBulkImportImportFileOrDir(
 | 
				
			||||||
 | 
					            """regression-test-files/cash/Stars/Draw/3-Draw-Limit-USD-0.10-0.20-200911.txt""", site="PokerStars")
 | 
				
			||||||
 | 
					    importer.addBulkImportImportFileOrDir(
 | 
				
			||||||
 | 
					            """regression-test-files/cash/Stars/Draw/5-Carddraw-USD-0.10-0.20-200911.txt""", site="PokerStars")
 | 
				
			||||||
 | 
					    importer.setCallHud(False)
 | 
				
			||||||
 | 
					    (stored, dups, partial, errs, ttime) = importer.runImport()
 | 
				
			||||||
 | 
					    importer.clearFileList()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user