272 lines
11 KiB
Python
Executable File
272 lines
11 KiB
Python
Executable File
#!/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
|
|
import MySQLdb
|
|
import fpdb_import
|
|
import fpdb_db
|
|
|
|
class table_viewer (threading.Thread):
|
|
def browse_clicked(self, widget, data):
|
|
"""runs when user clicks browse on tv tab"""
|
|
print "start of table_viewer.browser_clicked"
|
|
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"""
|
|
print "start of prepare_data"
|
|
arr=[]
|
|
#first prepare the header row
|
|
if (self.category=="holdem" or self.category=="omahahi" or self.category=="omahahilo"):
|
|
tmp=("Name", "Hands", "VPIP", "PFR", "AF", "FF", "AT", "FT", "AR", "FR")
|
|
streets=(1,2,3)
|
|
else:
|
|
tmp=("Name", "Hands", "VPI3", "A3", "A4", "F4", "A5", "F5", "A6", "F6", "A7", "F7")
|
|
streets=(4,5,6,7)#todo: change this once table has been changed
|
|
arr.append(tmp)
|
|
|
|
#then the data rows
|
|
for i in range(len(self.player_names)):
|
|
tmp=[]
|
|
tmp.append(self.player_names[i][0])
|
|
|
|
self.cursor.execute("""SELECT DISTINCT hands.id FROM hands
|
|
INNER JOIN hands_players ON hands_players.hand_id = hands.id
|
|
WHERE hands.gametype_id=%s AND hands_players.player_id=%s""", (self.gametype_id, self.player_ids[i][0]))
|
|
hand_count=self.cursor.rowcount
|
|
tmp.append(str(hand_count))
|
|
|
|
self.cursor.execute("""SELECT DISTINCT hands.id FROM hands_players
|
|
INNER JOIN hands_players_flags ON hands_players.id = hands_players_flags.hand_player_id
|
|
INNER JOIN hands ON hands_players.hand_id = hands.id
|
|
WHERE hands.gametype_id=%s AND hands_players.player_id=%s
|
|
AND street0_vpi=True""", (self.gametype_id, self.player_ids[i][0]))
|
|
vpi_count=self.cursor.rowcount
|
|
vpi_percent=int(vpi_count/float(hand_count)*100)
|
|
tmp.append(str(vpi_percent))
|
|
|
|
|
|
self.cursor.execute("""SELECT DISTINCT hands.id FROM hands_players
|
|
INNER JOIN hands_players_flags ON hands_players.id = hands_players_flags.hand_player_id
|
|
INNER JOIN hands ON hands_players.hand_id = hands.id
|
|
WHERE hands.gametype_id=%s AND hands_players.player_id=%s
|
|
AND street0_raise=True""", (self.gametype_id, self.player_ids[i][0]))
|
|
raise_count=self.cursor.rowcount
|
|
raise_percent=int(raise_count/float(hand_count)*100)
|
|
tmp.append(str(raise_percent))
|
|
|
|
######start of flop/4th street######
|
|
hand_count
|
|
|
|
play_counts=[]
|
|
raise_counts=[]
|
|
fold_counts=[]
|
|
self.cursor.execute("""SELECT DISTINCT hands.id FROM hands_players
|
|
INNER JOIN hands_players_flags ON hands_players.id = hands_players_flags.hand_player_id
|
|
INNER JOIN hands ON hands_players.hand_id = hands.id
|
|
WHERE hands.gametype_id=%s AND hands_players.player_id=%s
|
|
AND folded_on=0""", (self.gametype_id, self.player_ids[i][0]))
|
|
preflop_fold_count=self.cursor.rowcount
|
|
last_play_count=hand_count-preflop_fold_count
|
|
play_counts.append(last_play_count)
|
|
|
|
for street in streets:
|
|
self.cursor.execute("""SELECT DISTINCT hands.id FROM hands_players
|
|
INNER JOIN hands_players_flags ON hands_players.id = hands_players_flags.hand_player_id
|
|
INNER JOIN hands ON hands_players.hand_id = hands.id
|
|
WHERE hands.gametype_id=%s AND hands_players.player_id=%s
|
|
AND folded_on="""+str(street), (self.gametype_id, self.player_ids[i][0]))
|
|
fold_count=self.cursor.rowcount
|
|
fold_counts.append(fold_count)
|
|
last_play_count-=fold_count
|
|
play_counts.append(last_play_count)
|
|
|
|
self.cursor.execute("""SELECT DISTINCT hands.id FROM hands_players
|
|
INNER JOIN hands_players_flags ON hands_players.id = hands_players_flags.hand_player_id
|
|
INNER JOIN hands ON hands_players.hand_id = hands.id
|
|
WHERE hands.gametype_id=%s AND hands_players.player_id=%s
|
|
AND street"""+str(street)+"_raise=True""", (self.gametype_id, self.player_ids[i][0]))
|
|
raise_counts.append(self.cursor.rowcount)
|
|
|
|
for street in range (len(streets)):
|
|
if play_counts[street]>0:
|
|
raise_percent=int(raise_counts[street]/float(play_counts[street])*100)
|
|
tmp.append(str(raise_percent))
|
|
fold_percent=int(fold_counts[street]/float(play_counts[street])*100)
|
|
tmp.append(str(fold_percent))
|
|
else:
|
|
tmp.append("n/a")
|
|
tmp.append("n/a")
|
|
|
|
arr.append(tmp)
|
|
return arr
|
|
#end def table_viewer.prepare_data
|
|
|
|
def refresh_clicked(self, widget, data):
|
|
"""runs when user clicks refresh"""
|
|
if self.debug: print "start of table_viewer.refresh_clicked"
|
|
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])):
|
|
new_label=gtk.Label(arr[row][column])
|
|
self.data_table.attach(child=new_label, left_attach=column, right_attach=column+1, top_attach=row, bottom_attach=row+1)
|
|
new_label.show()
|
|
#end def table_viewer.refresh_clicked
|
|
|
|
def read_names_clicked(self, widget, data):
|
|
"""runs when user clicks read names"""
|
|
print "start of table_viewer.read_names_clicked"
|
|
print "self.last_read_hand:",self.last_read_hand
|
|
self.db.reconnect()
|
|
self.cursor=self.db.cursor
|
|
self.cursor.execute("""SELECT id FROM hands WHERE site_hand_no=%s""", (self.last_read_hand))
|
|
hands_id_tmp=self.db.cursor.fetchone()
|
|
print "tmp:",hands_id_tmp
|
|
self.hands_id=hands_id_tmp[0]
|
|
|
|
self.db.cursor.execute("SELECT gametype_id FROM hands WHERE id=%s", (self.hands_id, ))
|
|
self.gametype_id=self.db.cursor.fetchone()[0]
|
|
self.cursor.execute("SELECT category FROM gametypes WHERE id=%s", (self.gametype_id, ))
|
|
self.category=self.db.cursor.fetchone()[0]
|
|
print "self.gametype_id", self.gametype_id," category:", self.category, " self.hands_id:", self.hands_id
|
|
|
|
self.db.cursor.execute("""SELECT DISTINCT players.id FROM hands_players
|
|
INNER JOIN players ON hands_players.player_id=players.id
|
|
WHERE hand_id=%s""", (self.hands_id, ))
|
|
self.player_ids=self.db.cursor.fetchall()
|
|
print "self.player_ids:",self.player_ids
|
|
|
|
self.db.cursor.execute("""SELECT DISTINCT players.name FROM hands_players
|
|
INNER JOIN players ON hands_players.player_id=players.id
|
|
WHERE hand_id=%s""", (self.hands_id, ))
|
|
self.player_names=self.db.cursor.fetchall()
|
|
print "self.player_names:",self.player_names
|
|
#end def table_viewer.read_names_clicked
|
|
|
|
def import_clicked(self, widget, data):
|
|
"""runs when user clicks import"""
|
|
print "start of table_viewer.import_clicked"
|
|
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
|
|
|
|
self.quiet=False
|
|
self.failOnError=False
|
|
self.minPrint=0
|
|
self.handCount=0
|
|
|
|
self.last_read_hand=fpdb_import.import_file_dict(self)
|
|
#end def table_viewer.import_clicked
|
|
|
|
def all_clicked(self, widget, data):
|
|
"""runs when user clicks all"""
|
|
print "start of table_viewer.all_clicked"
|
|
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
|
|
|
|
def __init__(self, db, debug=True):
|
|
"""Constructor for table_viewer"""
|
|
self.debug=debug
|
|
if self.debug: print "start of table_viewer constructor"
|
|
self.db=db
|
|
self.cursor=db.cursor
|
|
|
|
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")
|
|
self.settings_hbox.add(self.filename_label)
|
|
self.filename_label.show()
|
|
|
|
self.filename_tbuffer=gtk.TextBuffer()
|
|
self.filename_tbuffer.set_text("/home/sycamore/ps-history/HH20080726 Meliboea - $0.10-$0.20 - Limit Hold'em.txt")
|
|
self.filename_tview=gtk.TextView(self.filename_tbuffer)
|
|
self.settings_hbox.add(self.filename_tview)
|
|
self.filename_tview.show()
|
|
|
|
self.browse_button=gtk.Button("Browse...")
|
|
self.browse_button.connect("clicked", self.browse_clicked, "Browse clicked")
|
|
self.settings_hbox.add(self.browse_button)
|
|
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__
|