2008-08-04 05:44:28 +02:00
#!/usr/bin/python
#Copyright 2008 Steffen Jobbagy-Felso
#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 threading
import pygtk
pygtk . require ( ' 2.0 ' )
import gtk
import os
2008-10-07 03:21:43 +02:00
import fpdb_simple
2008-09-16 23:19:50 +02:00
try :
import MySQLdb
except :
diaSQLLibMissing = gtk . Dialog ( title = " Fatal Error - SQL interface library missing " , parent = None , flags = 0 , buttons = ( gtk . STOCK_QUIT , gtk . RESPONSE_OK ) )
label = gtk . Label ( " Please note that the table viewer only works with MySQL, if you use PostgreSQL this error is expected. " )
diaSQLLibMissing . vbox . add ( label )
label . show ( )
label = gtk . Label ( " Since the HUD now runs on all supported plattforms I do not see any point in table viewer anymore, if you disagree please send a message to steffen@sycamoretest.info " )
diaSQLLibMissing . vbox . add ( label )
label . show ( )
response = diaSQLLibMissing . run ( )
#sys.exit(1)
2008-08-04 05:44:28 +02:00
import fpdb_import
import fpdb_db
2008-08-17 02:48:03 +02:00
class GuiTableViewer ( threading . Thread ) :
2008-08-04 09:31:15 +02:00
def hudDivide ( self , a , b ) :
if b == 0 :
return " n/a "
else :
2008-08-06 22:09:29 +02:00
return str ( int ( ( a / float ( b ) ) * 100 ) ) + " % "
2008-08-04 09:31:15 +02:00
#end def hudDivide
2008-08-04 05:44:28 +02:00
def browse_clicked ( self , widget , data ) :
""" runs when user clicks browse on tv tab """
2008-08-06 22:09:29 +02:00
#print "start of table_viewer.browser_clicked"
2008-08-04 05:44:28 +02:00
current_path = self . filename_tbuffer . get_text ( self . filename_tbuffer . get_start_iter ( ) , self . filename_tbuffer . get_end_iter ( ) )
dia_chooser = gtk . FileChooserDialog ( title = " Please choose the file for which you want to open the Table Viewer " ,
action = gtk . FILE_CHOOSER_ACTION_OPEN ,
buttons = ( gtk . STOCK_CANCEL , gtk . RESPONSE_CANCEL , gtk . STOCK_OPEN , gtk . RESPONSE_OK ) )
#dia_chooser.set_current_folder(pathname)
dia_chooser . set_filename ( current_path )
#dia_chooser.set_select_multiple(select_multiple) #not in tv, but want this in bulk import
response = dia_chooser . run ( )
if response == gtk . RESPONSE_OK :
#print dia_chooser.get_filename(), 'selected'
self . filename_tbuffer . set_text ( dia_chooser . get_filename ( ) )
elif response == gtk . RESPONSE_CANCEL :
print ' Closed, no files selected '
dia_chooser . destroy ( )
#end def table_viewer.browse_clicked
def prepare_data ( self ) :
""" prepares the data for display by refresh_clicked, returns a 2D array """
2008-08-06 22:09:29 +02:00
#print "start of prepare_data"
2008-08-04 05:44:28 +02:00
arr = [ ]
#first prepare the header row
if ( self . category == " holdem " or self . category == " omahahi " or self . category == " omahahilo " ) :
2008-08-16 08:16:50 +02:00
tmp = ( " Name " , " HDs " , " VPIP " , " PFR " , " PF3B4B " , " ST " )
2008-08-15 03:45:19 +02:00
if self . settings [ ' tv-combinedStealFold ' ] :
tmp + = ( " FSB " , )
else :
tmp + = ( " FS " , " FB " )
tmp + = ( " CB " , )
if self . settings [ ' tv-combined2B3B ' ] :
tmp + = ( " 23B " , )
else :
tmp + = ( " 2B " , " 3B " )
2008-08-11 01:44:46 +02:00
if self . settings [ ' tv-combinedPostflop ' ] :
2008-08-13 07:50:30 +02:00
tmp + = ( " Postf A " , " Postf F " )
else :
tmp + = ( " AF " , " FF " , " AT " , " FT " , " AR " , " FR " )
2008-08-15 03:45:19 +02:00
2008-08-13 07:50:30 +02:00
tmp + = ( " WtSD " , " W$wsF " , " W$SD " )
2008-08-04 05:44:28 +02:00
else :
2008-08-07 12:08:50 +02:00
raise fpdb_simple . FpdbError ( " reimplement stud " )
2008-08-04 05:44:28 +02:00
arr . append ( tmp )
#then the data rows
2008-08-04 09:31:15 +02:00
for player in range ( len ( self . player_names ) ) :
2008-08-04 05:44:28 +02:00
tmp = [ ]
2008-08-04 09:31:15 +02:00
tmp . append ( self . player_names [ player ] [ 0 ] )
2008-08-04 05:44:28 +02:00
2008-08-06 22:57:02 +02:00
seatCount = len ( self . player_names )
if seatCount > = 8 :
minSeats , maxSeats = 7 , 10
elif seatCount == 7 :
2008-08-07 01:17:51 +02:00
minSeats , maxSeats = 6 , 10
2008-08-06 22:57:02 +02:00
elif seatCount == 6 or seatCount == 5 :
minSeats , maxSeats = seatCount - 1 , seatCount + 1
elif seatCount == 4 :
minSeats , maxSeats = 4 , 5
elif seatCount == 2 or seatCount == 3 :
minSeats , maxSeats = seatCount , seatCount
else :
fpdb_simple . FpdbError ( " invalid seatCount " )
2008-08-18 04:56:59 +02:00
self . cursor . execute ( " SELECT * FROM HudCache WHERE gametypeId= %s AND playerId= %s AND activeSeats>= %s AND activeSeats<= %s " , ( self . gametype_id , self . player_ids [ player ] [ 0 ] , minSeats , maxSeats ) )
2008-08-06 22:57:02 +02:00
rows = self . cursor . fetchall ( )
row = [ ]
for field_no in range ( len ( rows [ 0 ] ) ) :
row . append ( rows [ 0 ] [ field_no ] )
for row_no in range ( len ( rows ) ) :
if row_no == 0 :
pass
else :
for field_no in range ( len ( rows [ row_no ] ) ) :
if field_no < = 3 :
pass
else :
2008-08-16 23:03:27 +02:00
#print "in prep data, row_no:",row_no,"field_no:",field_no
2008-08-06 22:57:02 +02:00
row [ field_no ] + = rows [ row_no ] [ field_no ]
2008-08-04 05:44:28 +02:00
2008-08-18 04:56:59 +02:00
tmp . append ( str ( row [ 6 ] ) ) #Hands
tmp . append ( self . hudDivide ( row [ 7 ] , row [ 6 ] ) ) #VPIP
tmp . append ( self . hudDivide ( row [ 8 ] , row [ 6 ] ) ) #PFR
tmp . append ( self . hudDivide ( row [ 10 ] , row [ 9 ] ) + " ( " + str ( row [ 9 ] ) + " ) " ) #PF3B4B
2008-08-13 07:50:30 +02:00
2008-08-18 04:56:59 +02:00
tmp . append ( self . hudDivide ( row [ 31 ] , row [ 30 ] ) + " ( " + str ( row [ 30 ] ) + " ) " ) #ST
2008-08-15 03:45:19 +02:00
if self . settings [ ' tv-combinedStealFold ' ] :
2008-08-18 04:56:59 +02:00
tmp . append ( self . hudDivide ( row [ 35 ] + row [ 33 ] , row [ 34 ] + row [ 32 ] ) + " ( " + str ( row [ 34 ] + row [ 32 ] ) + " ) " ) #FSB
2008-08-15 03:45:19 +02:00
else :
2008-08-18 04:56:59 +02:00
tmp . append ( self . hudDivide ( row [ 35 ] , row [ 34 ] ) + " ( " + str ( row [ 34 ] ) + " ) " ) #FS
tmp . append ( self . hudDivide ( row [ 33 ] , row [ 32 ] ) + " ( " + str ( row [ 32 ] ) + " ) " ) #FB
2008-08-13 04:29:24 +02:00
2008-08-18 04:56:59 +02:00
tmp . append ( self . hudDivide ( row [ 37 ] , row [ 36 ] ) + " ( " + str ( row [ 36 ] ) + " ) " ) #CB
2008-08-15 03:45:19 +02:00
if self . settings [ ' tv-combined2B3B ' ] :
2008-08-18 04:56:59 +02:00
tmp . append ( self . hudDivide ( row [ 39 ] + row [ 41 ] , row [ 38 ] + row [ 40 ] ) + " ( " + str ( row [ 38 ] + row [ 40 ] ) + " ) " ) #23B
2008-08-15 03:45:19 +02:00
else :
2008-08-18 04:56:59 +02:00
tmp . append ( self . hudDivide ( row [ 39 ] , row [ 38 ] ) + " ( " + str ( row [ 38 ] ) + " ) " ) #2B
tmp . append ( self . hudDivide ( row [ 41 ] , row [ 40 ] ) + " ( " + str ( row [ 40 ] ) + " ) " ) #3B
2008-08-13 07:50:30 +02:00
2008-08-11 01:44:46 +02:00
if self . settings [ ' tv-combinedPostflop ' ] :
2008-08-18 04:56:59 +02:00
aggCount = row [ 16 ] + row [ 17 ] + row [ 18 ]
handCount = row [ 11 ] + row [ 12 ] + row [ 13 ]
foldCount = row [ 24 ] + row [ 25 ] + row [ 26 ]
otherRaiseCount = row [ 20 ] + row [ 21 ] + row [ 22 ]
2008-08-10 04:26:51 +02:00
tmp . append ( self . hudDivide ( aggCount , handCount ) + " ( " + str ( handCount ) + " ) " ) #Agg
tmp . append ( self . hudDivide ( foldCount , otherRaiseCount ) + " ( " + str ( otherRaiseCount ) + " ) " ) #FF
else :
2008-08-18 04:56:59 +02:00
tmp . append ( self . hudDivide ( row [ 16 ] , row [ 11 ] ) + " ( " + str ( row [ 11 ] ) + " ) " ) #AF
tmp . append ( self . hudDivide ( row [ 24 ] , row [ 20 ] ) + " ( " + str ( row [ 20 ] ) + " ) " ) #FF
tmp . append ( self . hudDivide ( row [ 17 ] , row [ 12 ] ) + " ( " + str ( row [ 12 ] ) + " ) " ) #AT
tmp . append ( self . hudDivide ( row [ 25 ] , row [ 21 ] ) + " ( " + str ( row [ 21 ] ) + " ) " ) #FT
tmp . append ( self . hudDivide ( row [ 18 ] , row [ 13 ] ) + " ( " + str ( row [ 13 ] ) + " ) " ) #AR
tmp . append ( self . hudDivide ( row [ 26 ] , row [ 22 ] ) + " ( " + str ( row [ 22 ] ) + " ) " ) #FR
tmp . append ( self . hudDivide ( row [ 15 ] , row [ 11 ] ) ) #WtSD
tmp . append ( self . hudDivide ( row [ 28 ] , row [ 11 ] ) ) #W$wSF
tmp . append ( self . hudDivide ( row [ 29 ] , row [ 15 ] ) + " ( " + str ( row [ 15 ] ) + " ) " ) #W$@SD
2008-08-04 05:44:28 +02:00
arr . append ( tmp )
return arr
#end def table_viewer.prepare_data
def refresh_clicked ( self , widget , data ) :
""" runs when user clicks refresh """
2008-08-06 22:09:29 +02:00
#print "start of table_viewer.refresh_clicked"
2008-08-04 05:44:28 +02:00
arr = self . prepare_data ( )
try : self . data_table . destroy ( )
except AttributeError : pass
self . data_table = gtk . Table ( rows = len ( arr ) , columns = len ( arr [ 0 ] ) , homogeneous = False )
self . main_vbox . pack_start ( self . data_table )
self . data_table . show ( )
for row in range ( len ( arr ) ) :
for column in range ( len ( arr [ row ] ) ) :
2008-08-08 01:07:00 +02:00
eventBox = gtk . EventBox ( )
2008-08-04 05:44:28 +02:00
new_label = gtk . Label ( arr [ row ] [ column ] )
2008-08-08 01:07:00 +02:00
if row % 2 == 0 : #
bg_col = " white "
if column == 0 or ( column > = 5 and column < = 10 ) :
bg_col = " lightgrey "
else :
bg_col = " lightgrey "
if column == 0 or ( column > = 5 and column < = 10 ) :
bg_col = " grey "
2008-08-16 23:03:27 +02:00
#style = eventBox.get_style()
#style.font.height=8
#eventBox.set_style(style)
2008-08-08 01:07:00 +02:00
eventBox . modify_bg ( gtk . STATE_NORMAL , gtk . gdk . color_parse ( bg_col ) )
eventBox . add ( new_label )
self . data_table . attach ( child = eventBox , left_attach = column , right_attach = column + 1 , top_attach = row , bottom_attach = row + 1 )
eventBox . show ( )
2008-08-04 05:44:28 +02:00
new_label . show ( )
#end def table_viewer.refresh_clicked
def read_names_clicked ( self , widget , data ) :
""" runs when user clicks read names """
2008-08-06 22:09:29 +02:00
#print "start of table_viewer.read_names_clicked"
2008-08-04 05:44:28 +02:00
self . db . reconnect ( )
self . cursor = self . db . cursor
2008-08-22 21:32:20 +02:00
self . hands_id = self . last_read_hand_id
2008-08-04 05:44:28 +02:00
2008-08-15 02:45:40 +02:00
self . db . cursor . execute ( " SELECT gametypeId FROM Hands WHERE id= %s " , ( self . hands_id , ) )
2008-08-04 05:44:28 +02:00
self . gametype_id = self . db . cursor . fetchone ( ) [ 0 ]
2008-08-15 02:45:40 +02:00
self . cursor . execute ( " SELECT category FROM Gametypes WHERE id= %s " , ( self . gametype_id , ) )
2008-08-04 05:44:28 +02:00
self . category = self . db . cursor . fetchone ( ) [ 0 ]
2008-08-06 22:09:29 +02:00
#print "self.gametype_id", self.gametype_id," category:", self.category, " self.hands_id:", self.hands_id
2008-08-04 05:44:28 +02:00
2008-08-15 02:45:40 +02:00
self . db . cursor . execute ( """ SELECT DISTINCT Players.id FROM HandsPlayers
INNER JOIN Players ON HandsPlayers . playerId = Players . id
WHERE handId = % s """ , (self.hands_id, ))
2008-08-04 05:44:28 +02:00
self . player_ids = self . db . cursor . fetchall ( )
2008-08-06 22:09:29 +02:00
#print "self.player_ids:",self.player_ids
2008-08-04 05:44:28 +02:00
2008-08-15 02:45:40 +02:00
self . db . cursor . execute ( """ SELECT DISTINCT Players.name FROM HandsPlayers
INNER JOIN Players ON HandsPlayers . playerId = Players . id
WHERE handId = % s """ , (self.hands_id, ))
2008-08-04 05:44:28 +02:00
self . player_names = self . db . cursor . fetchall ( )
2008-08-06 22:09:29 +02:00
#print "self.player_names:",self.player_names
2008-08-04 05:44:28 +02:00
#end def table_viewer.read_names_clicked
def import_clicked ( self , widget , data ) :
""" runs when user clicks import """
2008-08-06 22:09:29 +02:00
#print "start of table_viewer.import_clicked"
2008-08-04 05:44:28 +02:00
self . inputFile = self . filename_tbuffer . get_text ( self . filename_tbuffer . get_start_iter ( ) , self . filename_tbuffer . get_end_iter ( ) )
self . server = self . db . host
self . database = self . db . database
self . user = self . db . user
self . password = self . db . password
2008-10-11 19:12:30 +02:00
self . importer = fpdb_import . Importer ( self , self . settings )
2008-10-11 19:42:08 +02:00
self . importer . setMinPrint ( 0 )
2008-10-11 20:14:06 +02:00
self . importer . setQuiet ( False )
self . importer . setFailOnError ( False )
self . importer . setHandCount ( 0 )
2008-08-04 05:44:28 +02:00
2008-10-11 19:12:30 +02:00
self . last_read_hand_id = self . importer . import_file_dict ( )
2008-08-04 05:44:28 +02:00
#end def table_viewer.import_clicked
def all_clicked ( self , widget , data ) :
""" runs when user clicks all """
2008-08-06 22:09:29 +02:00
#print "start of table_viewer.all_clicked"
2008-08-04 05:44:28 +02:00
self . import_clicked ( widget , data )
self . read_names_clicked ( widget , data )
self . refresh_clicked ( widget , data )
#end def table_viewer.all_clicked
def get_vbox ( self ) :
""" returns the vbox of this thread """
return self . main_vbox
#end def get_vbox
2008-08-11 01:44:46 +02:00
def __init__ ( self , db , settings , debug = True ) :
2008-08-04 05:44:28 +02:00
""" Constructor for table_viewer """
self . debug = debug
2008-08-06 22:09:29 +02:00
#print "start of table_viewer constructor"
2008-08-04 05:44:28 +02:00
self . db = db
self . cursor = db . cursor
2008-08-11 01:44:46 +02:00
self . settings = settings
2008-08-04 05:44:28 +02:00
self . main_vbox = gtk . VBox ( False , 0 )
self . main_vbox . show ( )
self . settings_hbox = gtk . HBox ( False , 0 )
self . main_vbox . pack_end ( self . settings_hbox , False , True , 0 )
self . settings_hbox . show ( )
self . filename_label = gtk . Label ( " Path of history file " )
2008-08-07 13:14:53 +02:00
self . settings_hbox . pack_start ( self . filename_label , False , False )
2008-08-04 05:44:28 +02:00
self . filename_label . show ( )
self . filename_tbuffer = gtk . TextBuffer ( )
2008-08-17 02:48:03 +02:00
self . filename_tbuffer . set_text ( self . settings [ ' hud-defaultPath ' ] )
2008-08-04 05:44:28 +02:00
self . filename_tview = gtk . TextView ( self . filename_tbuffer )
2008-08-07 13:14:53 +02:00
self . settings_hbox . pack_start ( self . filename_tview , True , True , padding = 5 )
2008-08-04 05:44:28 +02:00
self . filename_tview . show ( )
self . browse_button = gtk . Button ( " Browse... " )
self . browse_button . connect ( " clicked " , self . browse_clicked , " Browse clicked " )
2008-08-07 13:14:53 +02:00
self . settings_hbox . pack_start ( self . browse_button , False , False )
2008-08-04 05:44:28 +02:00
self . browse_button . show ( )
self . button_hbox = gtk . HBox ( False , 0 )
self . main_vbox . pack_end ( self . button_hbox , False , True , 0 )
self . button_hbox . show ( )
#self.import_button = gtk.Button("Import")
#self.import_button.connect("clicked", self.import_clicked, "Import clicked")
#self.button_hbox.add(self.import_button)
#self.import_button.show()
#self.read_names_button = gtk.Button("Read Names")
#self.read_names_button.connect("clicked", self.read_names_clicked, "Read clicked")
#self.button_hbox.add(self.read_names_button)
#self.read_names_button.show()
#self.refresh_button = gtk.Button("Show/Refresh data")
#self.refresh_button.connect("clicked", self.refresh_clicked, "Refresh clicked")
#self.button_hbox.add(self.refresh_button)
#self.refresh_button.show()
self . all_button = gtk . Button ( " Import&Read&Refresh " )
self . all_button . connect ( " clicked " , self . all_clicked , " All clicked " )
self . button_hbox . add ( self . all_button )
self . all_button . show ( )
#end of table_viewer.__init__