diff --git a/Configuration.py b/Configuration.py
deleted file mode 100644
index 55b8ed2b..00000000
--- a/Configuration.py
+++ /dev/null
@@ -1,278 +0,0 @@
-#!/usr/bin/env python
-"""Configuration.py
-
-Handles HUD configuration files.
-"""
-# Copyright 2008, Ray E. Barker
-
-#
-# 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
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# 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 General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-########################################################################
-
-# Standard Library modules
-import shutil
-import xml.dom.minidom
-from xml.dom.minidom import Node
-
-class Layout:
- def __init__(self, max):
- self.max = int(max)
- self.location = []
- for i in range(self.max + 1): self.location.append(None)
-
- def __str__(self):
- temp = " Layout = %d max, width= %d, height = %d, fav_seat = %d\n" % (self.max, self.width, self.height, self.fav_seat)
- temp = temp + " Locations = "
- for i in range(1, len(self.location)):
- temp = temp + "(%d,%d)" % self.location[i]
-
- return temp + "\n"
-
-class Site:
- def __init__(self, node):
- self.site_name = node.getAttribute("site_name")
- self.table_finder = node.getAttribute("table_finder")
- self.screen_name = node.getAttribute("screen_name")
- self.site_path = node.getAttribute("site_path")
- self.HH_path = node.getAttribute("HH_path")
- self.decoder = node.getAttribute("decoder")
- self.layout = {}
-
- for layout_node in node.getElementsByTagName('layout'):
- max = int( layout_node.getAttribute('max') )
- lo = Layout(max)
- lo.fav_seat = int( layout_node.getAttribute('fav_seat') )
- lo.width = int( layout_node.getAttribute('width') )
- lo.height = int( layout_node.getAttribute('height') )
-
- for location_node in layout_node.getElementsByTagName('location'):
- lo.location[int( location_node.getAttribute('seat') )] = (int( location_node.getAttribute('x') ), int( location_node.getAttribute('y')))
-
- self.layout[lo.max] = lo
-
- def __str__(self):
- temp = "Site = " + self.site_name + "\n"
- for key in dir(self):
- if key.startswith('__'): continue
- if key == 'layout': continue
- value = getattr(self, key)
- if callable(value): continue
- temp = temp + ' ' + key + " = " + value + "\n"
-
- for layout in self.layout:
- temp = temp + "%s" % self.layout[layout]
-
- return temp
-
-class Stat:
- def __init__(self):
- pass
-
- def __str__(self):
- temp = " stat_name = %s, row = %d, col = %d, tip = %s, click = %s, popup = %s\n" % (self.stat_name, self.row, self.col, self.tip, self.click, self.popup)
- return temp
-
-class Game:
- def __init__(self, node):
- self.game_name = node.getAttribute("game_name")
- self.db = node.getAttribute("db")
- self.rows = int( node.getAttribute("rows") )
- self.cols = int( node.getAttribute("cols") )
-
- self.stats = {}
- for stat_node in node.getElementsByTagName('stat'):
- stat = Stat()
- stat.stat_name = stat_node.getAttribute("stat_name")
- stat.row = int( stat_node.getAttribute("row") )
- stat.col = int( stat_node.getAttribute("col") )
- stat.tip = stat_node.getAttribute("tip")
- stat.click = stat_node.getAttribute("click")
- stat.popup = stat_node.getAttribute("popup")
-
- self.stats[stat.stat_name] = stat
-
- def __str__(self):
- temp = "Game = " + self.game_name + "\n"
- temp = temp + " db = %s\n" % self.db
- temp = temp + " rows = %d\n" % self.rows
- temp = temp + " cols = %d\n" % self.cols
-
- for stat in self.stats.keys():
- temp = temp + "%s" % self.stats[stat]
-
- return temp
-
-class Database:
- def __init__(self, node):
- self.db_name = node.getAttribute("db_name")
- self.db_server = node.getAttribute("db_server")
- self.db_ip = node.getAttribute("db_ip")
- self.db_user = node.getAttribute("db_user")
- self.db_type = node.getAttribute("db_type")
- self.db_pass = node.getAttribute("db_pass")
-
- def __str__(self):
- temp = 'Database = ' + self.db_name + '\n'
- for key in dir(self):
- if key.startswith('__'): continue
- value = getattr(self, key)
- if callable(value): continue
- temp = temp + ' ' + key + " = " + value + "\n"
- return temp
-
-class Mucked:
- def __init__(self, node):
- self.name = node.getAttribute("mw_name")
- self.cards = node.getAttribute("deck")
- self.card_wd = node.getAttribute("card_wd")
- self.card_ht = node.getAttribute("card_ht")
- self.rows = node.getAttribute("rows")
- self.cols = node.getAttribute("cols")
- self.format = node.getAttribute("stud")
-
- def __str__(self):
- temp = 'Mucked = ' + self.name + "\n"
- for key in dir(self):
- if key.startswith('__'): continue
- value = getattr(self, key)
- if callable(value): continue
- temp = temp + ' ' + key + " = " + value + "\n"
- return temp
-
-class Popup:
- def __init__(self, node):
- self.name = node.getAttribute("pu_name")
- self.pu_stats = []
- for stat_node in node.getElementsByTagName('pu_stat'):
- self.pu_stats.append(stat_node.getAttribute("pu_stat_name"))
-
- def __str__(self):
- temp = "Popup = " + self.name + "\n"
- for stat in self.pu_stats:
- temp = temp + " " + stat
- return temp + "\n"
-
-class Config:
- def __init__(self, file = 'HUD_config.xml'):
-
- doc = xml.dom.minidom.parse(file)
-
- self.doc = doc
- self.file = file
- self.supported_sites = {}
- self.supported_games = {}
- self.supported_databases = {}
- self.mucked_windows = {}
- self.popup_windows = {}
-
-# s_sites = doc.getElementsByTagName("supported_sites")
- for site_node in doc.getElementsByTagName("site"):
- site = Site(node = site_node)
- self.supported_sites[site.site_name] = site
-
- s_games = doc.getElementsByTagName("supported_games")
- for game_node in doc.getElementsByTagName("game"):
- game = Game(node = game_node)
- self.supported_games[game.game_name] = game
-
- s_dbs = doc.getElementsByTagName("supported_databases")
- for db_node in doc.getElementsByTagName("database"):
- db = Database(node = db_node)
- self.supported_databases[db.db_name] = db
-
- s_dbs = doc.getElementsByTagName("mucked_windows")
- for mw_node in doc.getElementsByTagName("mw"):
- mw = Mucked(node = mw_node)
- self.mucked_windows[mw.name] = mw
-
- s_dbs = doc.getElementsByTagName("popup_windows")
- for pu_node in doc.getElementsByTagName("pu"):
- pu = Popup(node = pu_node)
- self.popup_windows[pu.name] = pu
-
- def get_site_node(self, site):
- for site_node in self.doc.getElementsByTagName("site"):
- if site_node.getAttribute("site_name") == site:
- return site_node
-
- def get_layout_node(self, site_node, layout):
- for layout_node in site_node.getElementsByTagName("layout"):
- if int( layout_node.getAttribute("max") ) == int( layout ):
- return layout_node
-
- def get_location_node(self, layout_node, seat):
- for location_node in layout_node.getElementsByTagName("location"):
- if int( location_node.getAttribute("seat") ) == int( seat ):
- return location_node
-
- def save(self, file = None):
- if not file == None:
- f = open(file, 'w')
- self.doc.writexml(f)
- f.close()
- else:
- shutil.move(self.file, self.file+".backup")
- f = open(self.file, 'w')
- self.doc.writexml(f)
- f.close
-
- def edit_layout(self, site_name, max, width = None, height = None,
- fav_seat = None, locations = None):
- site_node = self.get_site_node(site_name)
- layout_node = self.get_layout_node(site_node, max)
- for i in range(1, max + 1):
- location_node = self.get_location_node(layout_node, i)
- location_node.setAttribute("x", str( locations[i-1][0] ))
- location_node.setAttribute("y", str( locations[i-1][1] ))
- self.supported_sites[site_name].layout[max].location[i] = ( locations[i-1][0], locations[i-1][1] )
-
-if __name__== "__main__":
- c = Config()
-
- print "\n----------- SUPPORTED SITES -----------"
- for s in c.supported_sites.keys():
- print c.supported_sites[s]
-
- print "----------- END SUPPORTED SITES -----------"
-
-
- print "\n----------- SUPPORTED GAMES -----------"
- for game in c.supported_games.keys():
- print c.supported_games[game]
-
- print "----------- END SUPPORTED GAMES -----------"
-
-
- print "\n----------- SUPPORTED DATABASES -----------"
- for db in c.supported_databases.keys():
- print c.supported_databases[db]
-
- print "----------- END SUPPORTED DATABASES -----------"
-
- print "\n----------- MUCKED WINDOW FORMATS -----------"
- for w in c.mucked_windows.keys():
- print c.mucked_windows[w]
-
- print "----------- END MUCKED WINDOW FORMATS -----------"
-
- print "\n----------- POPUP WINDOW FORMATS -----------"
- for w in c.popup_windows.keys():
- print c.popup_windows[w]
-
- print "----------- END MUCKED WINDOW FORMATS -----------"
-
- c.edit_layout("PokerStars", 6, locations=( (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6) ))
- c.save(file="testout.xml")
\ No newline at end of file
diff --git a/Database.py b/Database.py
deleted file mode 100644
index d634e134..00000000
--- a/Database.py
+++ /dev/null
@@ -1,183 +0,0 @@
-#!/usr/bin/env python
-"""Database.py
-
-Create and manage the database objects.
-"""
-# Copyright 2008, Ray E. Barker
-#
-# 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
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# 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 General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-########################################################################
-
-# postmaster -D /var/lib/pgsql/data
-
-# Standard Library modules
-import sys
-
-# pyGTK modules
-
-# FreePokerTools modules
-import Configuration
-import SQL
-
-# pgdb database module for posgres via DB-API
-import psycopg2
-# pgdb uses pyformat. is that fixed or an option?
-
-# mysql bindings
-import MySQLdb
-
-class Database:
- def __init__(self, c, db_name, game):
- if c.supported_databases[db_name].db_server == 'postgresql':
- self.connection = psycopg2.connect(host = c.supported_databases[db_name].db_ip,
- user = c.supported_databases[db_name].db_user,
- password = c.supported_databases[db_name].db_pass,
- database = c.supported_databases[db_name].db_name)
-
- elif c.supported_databases[db_name].db_server == 'mysql':
- self.connection = MySQLdb.connect(host = c.supported_databases[db_name].db_ip,
- user = c.supported_databases[db_name].db_user,
- passwd = c.supported_databases[db_name].db_pass,
- db = c.supported_databases[db_name].db_name)
-
- else:
- print "Database not recognized."
- return(0)
-
- self.type = c.supported_databases[db_name].db_type
- self.sql = SQL.Sql(game = game, type = self.type)
-
- def close_connection(self):
- self.connection.close()
-
- def get_table_name(self, hand_id):
- c = self.connection.cursor()
- c.execute(self.sql.query['get_table_name'], (hand_id, ))
- row = c.fetchone()
- return row
-
- def get_last_hand(self):
- c = self.connection.cursor()
- c.execute(self.sql.query['get_last_hand'])
- row = c.fetchone()
- return row[0]
-
- def get_xml(self, hand_id):
- c = self.connection.cursor()
- c.execute(self.sql.query['get_xml'], (hand_id))
- row = c.fetchone()
- return row[0]
-
- def get_recent_hands(self, last_hand):
- c = self.connection.cursor()
- c.execute(self.sql.query['get_recent_hands'], {'last_hand': last_hand})
- return c.fetchall()
-
- def get_hand_info(self, new_hand_id):
- c = self.connection.cursor()
- c.execute(self.sql.query['get_hand_info'], new_hand_id)
- return c.fetchall()
-
-# def get_cards(self, hand):
-# this version is for the PTrackSv2 db
-# c = self.connection.cursor()
-# c.execute(self.sql.query['get_cards'], hand)
-# colnames = [desc[0] for desc in c.description]
-# cards = {}
-# for row in c.fetchall():
-# s_dict = {}
-# for name, val in zip(colnames, row):
-# s_dict[name] = val
-# cards[s_dict['seat_number']] = s_dict
-# return (cards)
-
- def get_cards(self, hand):
-# this version is for the fpdb db
- c = self.connection.cursor()
- c.execute(self.sql.query['get_cards'], hand)
- colnames = [desc[0] for desc in c.description]
- cards = {}
- for row in c.fetchall():
- s_dict = {}
- for name, val in zip(colnames, row):
- s_dict[name] = val
- cards[s_dict['seat_number']] = s_dict
- return (cards)
-
- def get_stats_from_hand(self, hand, player_id = False):
- c = self.connection.cursor()
-
- if not player_id: player_id = "%"
-# get the players in the hand and their seats
-# c.execute(self.sql.query['get_players_from_hand'], (hand, player_id))
- c.execute(self.sql.query['get_players_from_hand'], (hand, ))
- names = {}
- seats = {}
- for row in c.fetchall():
- names[row[0]] = row[2]
- seats[row[0]] = row[1]
-
-# now get the stats
-# c.execute(self.sql.query['get_stats_from_hand'], (hand, hand, player_id))
- c.execute(self.sql.query['get_stats_from_hand'], (hand, hand))
- colnames = [desc[0] for desc in c.description]
- stat_dict = {}
- for row in c.fetchall():
- t_dict = {}
- for name, val in zip(colnames, row):
- t_dict[name] = val
-# print t_dict
- t_dict['screen_name'] = names[t_dict['player_id']]
- t_dict['seat'] = seats[t_dict['player_id']]
- stat_dict[t_dict['player_id']] = t_dict
- return stat_dict
-
- def get_player_id(self, config, site, player_name):
- print "site = %s, player name = %s" % (site, player_name)
- c = self.connection.cursor()
- c.execute(self.sql.query['get_player_id'], {'player': player_name, 'site': site})
- row = c.fetchone()
- return row[0]
-
-if __name__=="__main__":
- c = Configuration.Config()
-
-# db_connection = Database(c, 'fpdb', 'holdem') # mysql fpdb holdem
- db_connection = Database(c, 'fpdb-p', 'test') # mysql fpdb holdem
-# db_connection = Database(c, 'PTrackSv2', 'razz') # mysql razz
-# db_connection = Database(c, 'ptracks', 'razz') # postgres
- print "database connection object = ", db_connection.connection
- print "database type = ", db_connection.type
-
- h = db_connection.get_last_hand()
- print "last hand = ", h
-
- hero = db_connection.get_player_id(c, 'PokerStars', 'nutOmatic')
- print "nutOmatic is id_player = %d" % hero
-
- stat_dict = db_connection.get_stats_from_hand(h)
- for p in stat_dict.keys():
- print p, " ", stat_dict[p]
-
- print "nutOmatics stats:"
- stat_dict = db_connection.get_stats_from_hand(h, hero)
- for p in stat_dict.keys():
- print p, " ", stat_dict[p]
-
- db_connection.close_connection
-
- print "press enter to continue"
- sys.stdin.readline()
diff --git a/HUD_config.xml.example b/HUD_config.xml.example
deleted file mode 100644
index 423787c5..00000000
--- a/HUD_config.xml.example
+++ /dev/null
@@ -1,146 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/HUD_main.py b/HUD_main.py
deleted file mode 100755
index a839c2a1..00000000
--- a/HUD_main.py
+++ /dev/null
@@ -1,140 +0,0 @@
-#!/usr/bin/env python
-
-"""Hud_main.py
-
-Main for FreePokerTools HUD.
-"""
-# Copyright 2008, Ray E. Barker
-#
-# 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
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# 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 General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-########################################################################
-
-# to do kill window on my seat
-# to do adjust for preferred seat
-# to do allow window resizing
-# to do hud to echo, but ignore non numbers
-# to do no hud window for hero
-# to do things to add to config.xml
-# to do font and size
-# to do bg and fg color
-# to do opacity
-
-# Standard Library modules
-import sys
-import os
-import thread
-import Queue
-
-errorfile = open('HUD-error.txt', 'w')
-sys.stderr = errorfile
-
-# pyGTK modules
-import pygtk
-import gtk
-import gobject
-
-# FreePokerTools modules
-import Configuration
-import Database
-import Tables
-import Hud
-
-# global dict for keeping the huds
-hud_dict = {}
-
-db_connection = 0;
-config = 0;
-
-def destroy(*args): # call back for terminating the main eventloop
- gtk.main_quit()
-
-def process_new_hand(new_hand_id, db_name):
-# there is a new hand_id to be processed
-# read the hand_id from stdin and strip whitespace
- global hud_dict
-
- for h in hud_dict.keys():
- if hud_dict[h].deleted:
- del(hud_dict[h])
-
- db_connection = Database.Database(config, db_name, 'temp')
- (table_name, max, poker_game) = db_connection.get_table_name(new_hand_id)
-# if a hud for this table exists, just update it
- if hud_dict.has_key(table_name):
- hud_dict[table_name].update(new_hand_id, db_connection, config)
-# otherwise create a new hud
- else:
- table_windows = Tables.discover(config)
- for t in table_windows.keys():
- if table_windows[t].name == table_name:
- hud_dict[table_name] = Hud.Hud(table_windows[t], max, poker_game, config, db_name)
- hud_dict[table_name].create(new_hand_id, config)
- hud_dict[table_name].update(new_hand_id, db_connection, config)
- break
-# print "table name \"%s\" not identified, no hud created" % (table_name)
- db_connection.close_connection()
- return(1)
-
-def check_stdin(db_name):
- try:
- hand_no = dataQueue.get(block=False)
- process_new_hand(hand_no, db_name)
- except:
- pass
-
- return True
-
-def read_stdin(source, condition, db_name):
- new_hand_id = sys.stdin.readline()
- process_new_hand(new_hand_id, db_name)
- return True
-
-def producer(): # This is the thread function
- while True:
- hand_no = sys.stdin.readline() # reads stdin
- dataQueue.put(hand_no) # and puts result on the queue
-
-if __name__== "__main__":
- sys.stderr.write("HUD_main starting\n")
-
- try:
- db_name = sys.argv[1]
- except:
- db_name = 'fpdb-p'
- sys.stderr.write("Using db name = %s\n" % (db_name))
-
- config = Configuration.Config()
-# db_connection = Database.Database(config, 'fpdb', 'holdem')
-
- if os.name == 'posix':
- s_id = gobject.io_add_watch(sys.stdin, gobject.IO_IN, read_stdin, db_name)
- elif os.name == 'nt':
- dataQueue = Queue.Queue() # shared global. infinite size
- gobject.threads_init() # this is required
- thread.start_new_thread(producer, ()) # starts the thread
- gobject.timeout_add(1000, check_stdin, db_name)
- else:
- print "Sorry your operating system is not supported."
- sys.exit()
-
- main_window = gtk.Window()
- main_window.connect("destroy", destroy)
- label = gtk.Label('Closing this window will exit from the HUD.')
- main_window.add(label)
- main_window.set_title("HUD Main Window")
- main_window.show_all()
-
- gtk.main()
diff --git a/HandHistory.py b/HandHistory.py
deleted file mode 100644
index dd2fa427..00000000
--- a/HandHistory.py
+++ /dev/null
@@ -1,194 +0,0 @@
-#!/usr/bin/env python
-"""HandHistory.py
-
-Parses HandHistory xml files and returns requested objects.
-"""
-# Copyright 2008, Ray E. Barker
-#
-# 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
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# 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 General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-########################################################################
-# Standard Library modules
-import xml.dom.minidom
-from xml.dom.minidom import Node
-
-class HandHistory:
- def __init__(self, xml_string, elements = ('ALL')):
-
- doc = xml.dom.minidom.parseString(xml_string)
- if elements == ('ALL'):
- elements = ('BETTING', 'AWARDS', 'POSTS', 'PLAYERS', 'GAME')
-
- if 'BETTING' in elements:
- self.BETTING = Betting(doc.getElementsByTagName('BETTING')[0])
- if 'AWARDS' in elements:
- self.AWARDS = Awards (doc.getElementsByTagName('AWARDS')[0])
- if 'POSTS' in elements:
- self.POSTS = Posts (doc.getElementsByTagName('POSTS')[0])
- if 'GAME' in elements:
- self.GAME = Game (doc.getElementsByTagName('GAME')[0])
- if 'PLAYERS' in elements:
- self.PLAYERS = {}
- p_n = doc.getElementsByTagName('PLAYERS')[0]
- for p in p_n.getElementsByTagName('PLAYER'):
- a_player = Player(p)
- self.PLAYERS[a_player.name] = a_player
-
-class Player:
- def __init__(self, node):
- self.name = node.getAttribute('NAME')
- self.seat = node.getAttribute('SEAT')
- self.stack = node.getAttribute('STACK')
- self.showed_hand = node.getAttribute('SHOWED_HAND')
- self.cards = node.getAttribute('CARDS')
- self.allin = node.getAttribute('ALLIN')
- self.sitting_out = node.getAttribute('SITTING_OUT')
- self.hand = node.getAttribute('HAND')
- self.start_cards = node.getAttribute('START_CARDS')
-
- if self.allin == '' or \
- self.allin == '0' or \
- self.allin.upper() == 'FALSE': self.allin = False
- else: self.allin = True
-
- if self.sitting_out == '' or \
- self.sitting_out == '0' or \
- self.sitting_out.upper() == 'FALSE': self.sitting_out = False
- else: self.sitting_out = True
-
- def __str__(self):
- temp = "%s\n seat = %s\n stack = %s\n cards = %s\n" % \
- (self.name, self.seat, self.stack, self.cards)
- temp = temp + " showed_hand = %s\n allin = %s\n" % \
- (self.showed_hand, self.allin)
- temp = temp + " hand = %s\n start_cards = %s\n" % \
- (self.hand, self.start_cards)
- return temp
-
-class Awards:
- def __init__(self, node):
- self.awards = [] # just an array of award objects
- for a in node.getElementsByTagName('AWARD'):
- self.awards.append(Award(a))
-
- def __str__(self):
- temp = ""
- for a in self.awards:
- temp = temp + "%s\n" % (a)
- return temp
-
-class Award:
- def __init__(self, node):
- self.player = node.getAttribute('PLAYER')
- self.amount = node.getAttribute('AMOUNT')
- self.pot = node.getAttribute('POT')
-
- def __str__(self):
- return self.player + " won " + self.amount + " from " + self.pot
-
-class Game:
- def __init__(self, node):
- print node
- self.tags = {}
- for tag in ( ('GAME_NAME', 'game_name'), ('MAX', 'max'), ('HIGHLOW', 'high_low'),
- ('STRUCTURE', 'structure'), ('MIXED', 'mixed') ):
- L = node.getElementsByTagName(tag[0])
- if (not L): continue
- print L
- for node2 in L:
- title = ""
- for node3 in node2.childNodes:
- if (node3.nodeType == Node.TEXT_NODE):
- title +=node3.data
- self.tags[tag[1]] = title
-
- def __str__(self):
- return "%s %s %s, (%s max), %s" % (self.tags['structure'],
- self.tags['game_name'],
- self.tags['game_name'],
- self.tags['max'],
- self.tags['game_name'])
-
-class Posts:
- def __init__(self, node):
- self.posts = [] # just an array of post objects
- for p in node.getElementsByTagName('POST'):
- self.posts.append(Post(p))
-
- def __str__(self):
- temp = ""
- for p in self.posts:
- temp = temp + "%s\n" % (p)
- return temp
-
-class Post:
- def __init__(self, node):
- self.player = node.getAttribute('PLAYER')
- self.amount = node.getAttribute('AMOUNT')
- self.posted = node.getAttribute('POSTED')
- self.live = node.getAttribute('LIVE')
-
- def __str__(self):
- return ("%s posted %s %s %s") % (self.player, self.amount, self.posted, self.live)
-
-class Betting:
- def __init__(self, node):
- self.rounds = [] # a Betting object is just an array of rounds
- for r in node.getElementsByTagName('ROUND'):
- self.rounds.append(Round(r))
-
- def __str__(self):
- temp = ""
- for r in self.rounds:
- temp = temp + "%s\n" % (r)
- return temp
-
-class Round:
- def __init__(self, node):
- self.name = node.getAttribute('ROUND_NAME')
- self.action = []
- for a in node.getElementsByTagName('ACTION'):
- self.action.append(Action(a))
-
- def __str__(self):
- temp = self.name + "\n"
- for a in self.action:
- temp = temp + " %s\n" % (a)
- return temp
-
-class Action:
- def __init__(self, node):
- self.player = node.getAttribute('PLAYER')
- self.action = node.getAttribute('ACT')
- self.amount = node.getAttribute('AMOUNT')
- self.allin = node.getAttribute('ALLIN')
-
- def __str__(self):
- return self.player + " " + self.action + " " + self.amount + " " + self.allin
-
-if __name__== "__main__":
- file = open('test.xml', 'r')
- xml_string = file.read()
- file.close()
-
- print xml_string + "\n\n\n"
- h = HandHistory(xml_string, ('ALL'))
- print h.GAME
- print h.POSTS
- print h.BETTING
- print h.AWARDS
-
- for p in h.PLAYERS.keys():
- print h.PLAYERS[p]
\ No newline at end of file
diff --git a/Hud.py b/Hud.py
deleted file mode 100755
index debfaa67..00000000
--- a/Hud.py
+++ /dev/null
@@ -1,449 +0,0 @@
-#!/usr/bin/env python
-"""Hud.py
-
-Create and manage the hud overlays.
-"""
-# Copyright 2008, Ray E. Barker
-
-#
-# 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
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# 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 General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-########################################################################
-# Standard Library modules
-import os
-
-# pyGTK modules
-import pygtk
-import gtk
-import pango
-import gobject
-
-# win32 modules -- only imported on windows systems
-if os.name == 'nt':
- import win32gui
- import win32con
-
-# FreePokerTools modules
-import Tables # needed for testing only
-import Configuration
-import Stats
-import Mucked
-import Database
-import HUD_main
-
-class Hud:
-
- def __init__(self, table, max, poker_game, config, db_name):
- self.table = table
- self.config = config
- self.poker_game = poker_game
- self.max = max
- self.db_name = db_name
- self.deleted = False
-
- self.stat_windows = {}
- self.popup_windows = {}
- self.font = pango.FontDescription("Sans 8")
-
-# Set up a main window for this this instance of the HUD
- self.main_window = gtk.Window()
-# self.window.set_decorated(0)
- self.main_window.set_gravity(gtk.gdk.GRAVITY_STATIC)
- self.main_window.set_keep_above(1)
- self.main_window.set_title(table.name)
- self.main_window.connect("destroy", self.kill_hud)
-
- self.ebox = gtk.EventBox()
- self.label = gtk.Label("Close this window to\nkill the HUD for\n %s" % (table.name))
- self.main_window.add(self.ebox)
- self.ebox.add(self.label)
- self.main_window.move(self.table.x, self.table.y)
-
-# A popup window for the main window
- self.menu = gtk.Menu()
- self.item1 = gtk.MenuItem('Kill this HUD')
- self.menu.append(self.item1)
- self.item1.connect("activate", self.kill_hud)
- self.item1.show()
- self.item2 = gtk.MenuItem('Save Layout')
- self.menu.append(self.item2)
- self.item2.connect("activate", self.save_layout)
- self.item2.show()
- self.ebox.connect_object("button-press-event", self.on_button_press, self.menu)
-
- self.main_window.show_all()
-# set_keep_above(1) for windows
- if os.name == 'nt': self.topify_window(self.main_window)
-
- def on_button_press(self, widget, event):
- if event.button == 3:
- widget.popup(None, None, None, event.button, event.time)
- return True
- return False
-
- def kill_hud(self, args):
- for k in self.stat_windows.keys():
- self.stat_windows[k].window.destroy()
- self.main_window.destroy()
- self.deleted = True
-
- def save_layout(self, *args):
- new_layout = []
- for sw in self.stat_windows:
- loc = self.stat_windows[sw].window.get_position()
- new_loc = (loc[0] - self.table.x, loc[1] - self.table.y)
- new_layout.append(new_loc)
- print new_layout
- self.config.edit_layout(self.table.site, self.table.max, locations = new_layout)
- self.config.save()
-
- def create(self, hand, config):
-# update this hud, to the stats and players as of "hand"
-# hand is the hand id of the most recent hand played at this table
-#
-# this method also manages the creating and destruction of stat
-# windows via calls to the Stat_Window class
- for i in range(1, self.max + 1):
- (x, y) = config.supported_sites[self.table.site].layout[self.max].location[i]
- self.stat_windows[i] = Stat_Window(game = config.supported_games[self.poker_game],
- parent = self,
- table = self.table,
- x = x,
- y = y,
- seat = i,
- player_id = 'fake',
- font = self.font)
-
- self.stats = []
- for i in range(0, config.supported_games[self.poker_game].rows + 1):
- row_list = [''] * config.supported_games[self.poker_game].cols
- self.stats.append(row_list)
- for stat in config.supported_games[self.poker_game].stats.keys():
- 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].stat_name
-
-# self.mucked_window = gtk.Window()
-# self.m = Mucked.Mucked(self.mucked_window, self.db_connection)
-# self.mucked_window.show_all()
-
- def update(self, hand, db, config):
- self.hand = hand # this is the last hand, so it is available later
- stat_dict = db.get_stats_from_hand(hand)
- for s in stat_dict.keys():
- self.stat_windows[stat_dict[s]['seat']].player_id = stat_dict[s]['player_id']
- for r in range(0, config.supported_games[self.poker_game].rows):
- for c in range(0, config.supported_games[self.poker_game].cols):
- number = Stats.do_stat(stat_dict, player = stat_dict[s]['player_id'], stat = self.stats[r][c])
- self.stat_windows[stat_dict[s]['seat']].label[r][c].set_text(number[1])
- tip = stat_dict[s]['screen_name'] + "\n" + number[5] + "\n" + \
- number[3] + ", " + number[4]
- Stats.do_tip(self.stat_windows[stat_dict[s]['seat']].e_box[r][c], tip)
-# self.m.update(hand)
-
- def topify_window(self, window):
- """Set the specified gtk window to stayontop in MS Windows."""
-
- def windowEnumerationHandler(hwnd, resultList):
- '''Callback for win32gui.EnumWindows() to generate list of window handles.'''
- resultList.append((hwnd, win32gui.GetWindowText(hwnd)))
-
- unique_name = 'unique name for finding this window'
- real_name = window.get_title()
- window.set_title(unique_name)
- tl_windows = []
- win32gui.EnumWindows(windowEnumerationHandler, tl_windows)
-
- for w in tl_windows:
- if w[1] == unique_name:
- win32gui.SetWindowPos(w[0], win32con.HWND_TOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE|win32con.SWP_NOSIZE)
-# notify_id = (w[0],
-# 0,
-# win32gui.NIF_ICON | win32gui.NIF_MESSAGE | win32gui.NIF_TIP,
-# win32con.WM_USER+20,
-# 0,
-# '')
-# win32gui.Shell_NotifyIcon(win32gui.NIM_DELETE, notify_id)
-#
- window.set_title(real_name)
-
-class Stat_Window:
-
- def button_press_cb(self, widget, event, *args):
-# 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-
-# and double-clicks.
- if event.button == 1: # left button event
- if event.type == gtk.gdk.BUTTON_PRESS: # left button single click
- if self.sb_click > 0: return
- self.sb_click = gobject.timeout_add(250, self.single_click, widget)
- elif event.type == gtk.gdk._2BUTTON_PRESS: # left button double click
- if self.sb_click > 0:
- gobject.source_remove(self.sb_click)
- self.sb_click = 0
- self.double_click(widget, event, *args)
-
- if event.button == 2: # middle button event
- pass
-# print "middle button clicked"
-
- if event.button == 3: # right button event
- pass
-# print "right button clicked"
-
- def single_click(self, widget):
-# Callback from the timeout in the single-click finding part of the
-# button press call back. This needs to be modified to get all the
-# arguments from the call.
-# print "left button clicked"
- self.sb_click = 0
- Popup_window(widget, self)
- return False
-
- def double_click(self, widget, event, *args):
- self.toggle_decorated(widget)
-
- def toggle_decorated(self, widget):
- top = widget.get_toplevel()
- (x, y) = top.get_position()
-
- if top.get_decorated():
- top.set_decorated(0)
- top.move(x, y)
- else:
- top.set_decorated(1)
- top.move(x, y)
-
- def __init__(self, parent, game, table, seat, x, y, player_id, font):
- self.parent = parent # Hud object that this stat window belongs to
- self.game = game # Configuration object for the curren
- self.table = table # Table object where this is going
- self.x = x + table.x # table.x and y are the location of the table
- self.y = y + table.y # x and y are the location relative to table.x & y
- self.player_id = player_id # looks like this isn't used ;)
- self.sb_click = 0 # used to figure out button clicks
-
- self.window = gtk.Window()
- self.window.set_decorated(0)
- self.window.set_gravity(gtk.gdk.GRAVITY_STATIC)
- self.window.set_keep_above(1)
- self.window.set_title("%s" % seat)
- self.window.set_property("skip-taskbar-hint", True)
-
- self.grid = gtk.Table(rows = self.game.rows, columns = self.game.cols, homogeneous = False)
- self.window.add(self.grid)
-
- self.e_box = []
- self.frame = []
- self.label = []
- for r in range(self.game.rows):
- self.e_box.append([])
- self.label.append([])
- for c in range(self.game.cols):
- self.e_box[r].append( gtk.EventBox() )
- Stats.do_tip(self.e_box[r][c], 'farts')
- self.grid.attach(self.e_box[r][c], c, c+1, r, r+1, xpadding = 0, ypadding = 0)
- self.label[r].append( gtk.Label('xxx') )
- self.e_box[r][c].add(self.label[r][c])
- self.e_box[r][c].connect("button_press_event", self.button_press_cb)
-# font = pango.FontDescription("Sans 8")
- self.label[r][c].modify_font(font)
- self.window.realize
- self.window.move(self.x, self.y)
- self.window.show_all()
-# set_keep_above(1) for windows
- if os.name == 'nt': self.topify_window(self.window)
-
- def topify_window(self, window):
- """Set the specified gtk window to stayontop in MS Windows."""
-
- def windowEnumerationHandler(hwnd, resultList):
- '''Callback for win32gui.EnumWindows() to generate list of window handles.'''
- resultList.append((hwnd, win32gui.GetWindowText(hwnd)))
-
- unique_name = 'unique name for finding this window'
- real_name = window.get_title()
- window.set_title(unique_name)
- tl_windows = []
- win32gui.EnumWindows(windowEnumerationHandler, tl_windows)
-
- for w in tl_windows:
- if w[1] == unique_name:
- win32gui.SetWindowPos(w[0], win32con.HWND_TOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE|win32con.SWP_NOSIZE)
-# notify_id = (w[0],
-# 0,
-# win32gui.NIF_ICON | win32gui.NIF_MESSAGE | win32gui.NIF_TIP,
-# win32con.WM_USER+20,
-# 0,
-# '')
-# win32gui.Shell_NotifyIcon(win32gui.NIM_DELETE, notify_id)
-#
- window.set_title(real_name)
-
-def destroy(*args): # call back for terminating the main eventloop
- gtk.main_quit()
-
-class Popup_window:
- def __init__(self, parent, stat_window):
- self.sb_click = 0
-
-# create the popup window
- self.window = gtk.Window()
- self.window.set_decorated(0)
- self.window.set_gravity(gtk.gdk.GRAVITY_STATIC)
- self.window.set_keep_above(1)
- self.window.set_title("popup")
- self.window.set_property("skip-taskbar-hint", True)
- self.window.set_transient_for(parent.get_toplevel())
- self.window.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
-
- self.ebox = gtk.EventBox()
- self.ebox.connect("button_press_event", self.button_press_cb)
- self.lab = gtk.Label("stuff\nstuff\nstuff")
-
-# need an event box so we can respond to clicks
- self.window.add(self.ebox)
- self.ebox.add(self.lab)
- self.window.realize
-
-# figure out the row, col address of the click that activated the popup
- row = 0
- col = 0
- for r in range(0, stat_window.game.rows):
- for c in range(0, stat_window.game.cols):
- if stat_window.e_box[r][c] == parent:
- row = r
- col = c
- break
-
-# figure out what popup format we're using
- popup_format = "default"
- for stat in stat_window.game.stats.keys():
- if stat_window.game.stats[stat].row == row and stat_window.game.stats[stat].col == col:
- popup_format = stat_window.game.stats[stat].popup
- break
-
-# get the list of stats to be presented from the config
- stat_list = []
- for w in stat_window.parent.config.popup_windows.keys():
- if w == popup_format:
- stat_list = stat_window.parent.config.popup_windows[w].pu_stats
- break
-
-# get a database connection
- 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
-# 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)
- db_connection.close_connection()
-
- pu_text = ""
- for s in stat_list:
- number = Stats.do_stat(stat_dict, player = int(stat_window.player_id), stat = s)
- pu_text += number[3] + "\n"
-
- self.lab.set_text(pu_text)
- self.window.show_all()
-# set_keep_above(1) for windows
- if os.name == 'nt': self.topify_window(self.window)
-
- def button_press_cb(self, widget, event, *args):
-# 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-
-# and double-clicks. This is the same code as in the Stat_window class
- if event.button == 1: # left button event
- if event.type == gtk.gdk.BUTTON_PRESS: # left button single click
- if self.sb_click > 0: return
- self.sb_click = gobject.timeout_add(250, self.single_click, widget)
- elif event.type == gtk.gdk._2BUTTON_PRESS: # left button double click
- if self.sb_click > 0:
- gobject.source_remove(self.sb_click)
- self.sb_click = 0
- self.double_click(widget, event, *args)
-
- if event.button == 2: # middle button event
- pass
-# print "middle button clicked"
-
- if event.button == 3: # right button event
- pass
-# print "right button clicked"
-
- def single_click(self, widget):
-# Callback from the timeout in the single-click finding part of the
-# button press call back. This needs to be modified to get all the
-# arguments from the call.
- self.sb_click = 0
- self.window.destroy()
- return False
-
- def double_click(self, widget, event, *args):
- self.toggle_decorated(widget)
-
- def toggle_decorated(self, widget):
- top = widget.get_toplevel()
- (x, y) = top.get_position()
-
- if top.get_decorated():
- top.set_decorated(0)
- top.move(x, y)
- else:
- top.set_decorated(1)
- top.move(x, y)
-
- def topify_window(self, window):
- """Set the specified gtk window to stayontop in MS Windows."""
-
- def windowEnumerationHandler(hwnd, resultList):
- '''Callback for win32gui.EnumWindows() to generate list of window handles.'''
- resultList.append((hwnd, win32gui.GetWindowText(hwnd)))
-
- unique_name = 'unique name for finding this window'
- real_name = window.get_title()
- window.set_title(unique_name)
- tl_windows = []
- win32gui.EnumWindows(windowEnumerationHandler, tl_windows)
-
- for w in tl_windows:
- if w[1] == unique_name:
- win32gui.SetWindowPos(w[0], win32con.HWND_TOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE|win32con.SWP_NOSIZE)
-# notify_id = (w[0],
-# 0,
-# win32gui.NIF_ICON | win32gui.NIF_MESSAGE | win32gui.NIF_TIP,
-# win32con.WM_USER+20,
-# 0,
-# '')
-# win32gui.Shell_NotifyIcon(win32gui.NIM_DELETE, notify_id)
-#
- window.set_title(real_name)
-
-if __name__== "__main__":
- main_window = gtk.Window()
- main_window.connect("destroy", destroy)
- label = gtk.Label('Fake main window, blah blah, blah\nblah, blah')
- main_window.add(label)
- main_window.show_all()
-
- c = Configuration.Config()
- tables = Tables.discover(c)
- db = Database.Database(c, 'fpdb', 'holdem')
-
- for t in tables:
- win = Hud(t, 8, c, db)
-# t.get_details()
- win.update(8300, db, c)
-
- gtk.main()
diff --git a/Mucked.py b/Mucked.py
deleted file mode 100644
index 0af06c65..00000000
--- a/Mucked.py
+++ /dev/null
@@ -1,243 +0,0 @@
-#!/usr/bin/env python
-"""Mucked.py
-
-Mucked cards display for FreePokerTools HUD.
-"""
-# Copyright 2008, Ray E. Barker
-#
-# 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
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# 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 General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-########################################################################
-
-# to do
-# problem with hand 30586
-
-# Standard Library modules
-import sys
-import os
-import string
-import xml.dom.minidom
-from xml.dom.minidom import Node
-
-# pyGTK modules
-import pygtk
-import gtk
-import gobject
-
-# FreePokerTools modules
-import Configuration
-import Database
-import Tables
-import Hud
-import Mucked
-import HandHistory
-
-class Mucked:
- def __init__(self, parent, db_connection):
-
- self.parent = parent #this is the parent of the mucked cards widget
- self.db_connection = db_connection
-
- self.vbox = gtk.VBox()
- self.parent.add(self.vbox)
-
- self.mucked_list = MuckedList (self.vbox, db_connection)
- self.mucked_cards = MuckedCards(self.vbox, db_connection)
- self.mucked_list.mucked_cards = self.mucked_cards
-
- def update(self, new_hand_id):
- self.mucked_list.update(new_hand_id)
-
-class MuckedList:
- def __init__(self, parent, db_connection):
-
- self.parent = parent
- self.db_connection = db_connection
-
-# set up a scrolled window to hold the listbox
- self.scrolled_window = gtk.ScrolledWindow()
- self.scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_ALWAYS)
- self.parent.add(self.scrolled_window)
-
-# create a ListStore to use as the model
- self.liststore = gtk.ListStore(str, str, str)
- self.treeview = gtk.TreeView(self.liststore)
- self.tvcolumn0 = gtk.TreeViewColumn('HandID')
- self.tvcolumn1 = gtk.TreeViewColumn('Cards')
- self.tvcolumn2 = gtk.TreeViewColumn('Net')
-
-# add tvcolumn to treeview
- self.treeview.append_column(self.tvcolumn0)
- self.treeview.append_column(self.tvcolumn1)
- self.treeview.append_column(self.tvcolumn2)
-
-# create a CellRendererText to render the data
- self.cell = gtk.CellRendererText()
-
- # add the cell to the tvcolumn and allow it to expand
- self.tvcolumn0.pack_start(self.cell, True)
- self.tvcolumn1.pack_start(self.cell, True)
- self.tvcolumn2.pack_start(self.cell, True)
- self.tvcolumn0.add_attribute(self.cell, 'text', 0)
- self.tvcolumn1.add_attribute(self.cell, 'text', 1)
- self.tvcolumn2.add_attribute(self.cell, 'text', 2)
-# resize the cols if nec
- self.tvcolumn0.set_resizable(True)
- self.treeview.connect("row-activated", self.activated_event)
-
- self.scrolled_window.add_with_viewport(self.treeview)
-
- def activated_event(self, path, column, data=None):
- sel = self.treeview.get_selection()
- (model, iter) = sel.get_selected()
- self.mucked_cards.update(model.get_value(iter, 0))
-
- def update(self, new_hand_id):
-# info_row = self.db_connection.get_hand_info(new_hand_id)
- info_row = ((new_hand_id, "xxxx", 0), )
- iter = self.liststore.append(info_row[0])
- sel = self.treeview.get_selection()
- sel.select_iter(iter)
-
- vadj = self.scrolled_window.get_vadjustment()
- vadj.set_value(vadj.upper)
- self.mucked_cards.update(new_hand_id)
-
-class MuckedCards:
- def __init__(self, parent, db_connection):
-
- self.parent = parent #this is the parent of the mucked cards widget
- self.db_connection = db_connection
-
- self.card_images = self.get_card_images()
- self.seen_cards = {}
- self.grid_contents = {}
- self.eb = {}
-
- self.rows = 8
- self.cols = 7
- self.grid = gtk.Table(self.rows, self.cols + 4, homogeneous = False)
-
- for r in range(0, self.rows):
- for c in range(0, self.cols):
- self.seen_cards[(c, r)] = gtk.image_new_from_pixbuf(self.card_images[('B', 'S')])
- self.eb[(c, r)]= gtk.EventBox()
-
-# set up the contents for the cells
- for r in range(0, self.rows):
- self.grid_contents[( 0, r)] = gtk.Label("%d" % (r + 1))
- self.grid_contents[( 1, r)] = gtk.Label("player %d" % (r + 1))
- self.grid_contents[( 4, r)] = gtk.Label("-")
- self.grid_contents[( 9, r)] = gtk.Label("-")
- self.grid_contents[( 2, r)] = self.eb[( 0, r)]
- self.grid_contents[( 3, r)] = self.eb[( 1, r)]
- self.grid_contents[( 5, r)] = self.eb[( 2, r)]
- self.grid_contents[( 6, r)] = self.eb[( 3, r)]
- self.grid_contents[( 7, r)] = self.eb[( 4, r)]
- self.grid_contents[( 8, r)] = self.eb[( 5, r)]
- self.grid_contents[(10, r)] = self.eb[( 6, r)]
- for c in range(0, self.cols):
- self.eb[(c, r)].add(self.seen_cards[(c, r)])
-
-# add the cell contents to the table
- for c in range(0, self.cols + 4):
- for r in range(0, self.rows):
- self.grid.attach(self.grid_contents[(c, r)], c, c+1, r, r+1, xpadding = 1, ypadding = 1)
-
- self.parent.add(self.grid)
-
- def translate_cards(self, old_cards):
- pass
-
- def update(self, new_hand_id):
- cards = self.db_connection.get_cards(new_hand_id)
- self.clear()
-
- cards = self.translate_cards(cards)
- for c in cards.keys():
- self.grid_contents[(1, cards[c]['seat_number'] - 1)].set_text(cards[c]['screen_name'])
-
- for i in ((0, 'hole_card_1'), (1, 'hole_card_2'), (2, 'hole_card_3'), (3, 'hole_card_4'),
- (4, 'hole_card_5'), (5, 'hole_card_6'), (6, 'hole_card_7')):
- if not cards[c][i[1]] == "":
- self.seen_cards[(i[0], cards[c]['seat_number'] - 1)]. \
- set_from_pixbuf(self.card_images[self.split_cards(cards[c][i[1]])])
-
- xml_text = self.db_connection.get_xml(new_hand_id)
- hh = HandHistory.HandHistory(xml_text, ('BETTING'))
-
-# action in tool tips for 3rd street cards
- tip = "%s" % hh.BETTING.rounds[0]
- for c in (0, 1, 2):
- for r in range(0, self.rows):
- self.eb[(c, r)].set_tooltip_text(tip)
-
-# action in tools tips for later streets
- round_to_col = (0, 3, 4, 5, 6)
- for round in range(1, len(hh.BETTING.rounds)):
- tip = "%s" % hh.BETTING.rounds[round]
- for r in range(0, self.rows):
- self.eb[(round_to_col[round], r)].set_tooltip_text(tip)
-
- def split_cards(self, card):
- return (card[0], card[1].upper())
-
- def clear(self):
- for r in range(0, self.rows):
- self.grid_contents[(1, r)].set_text(" ")
- for c in range(0, 7):
- self.seen_cards[(c, r)].set_from_pixbuf(self.card_images[('B', 'S')])
- self.eb[(c, r)].set_tooltip_text('')
- def get_card_images(self):
- card_images = {}
- suits = ('S', 'H', 'D', 'C')
- ranks = ('A', 'K', 'Q', 'J', 'T', '9', '8', '7', '6', '5', '4', '3', '2', 'B')
- pb = gtk.gdk.pixbuf_new_from_file("Cards01.png")
-
- for j in range(0, 14):
- for i in range(0, 4):
- temp_pb = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, pb.get_has_alpha(), pb.get_bits_per_sample(), 30, 42)
- pb.copy_area(30*j, 42*i, 30, 42, temp_pb, 0, 0)
- card_images[(ranks[j], suits[i])] = temp_pb
- return(card_images)
-
-# cards are 30 wide x 42 high
-
-if __name__== "__main__":
-
- def destroy(*args): # call back for terminating the main eventloop
- gtk.main_quit() # used only for testing
-
- def process_new_hand(source, condition): #callback from stdin watch -- testing only
-# there is a new hand_id to be processed
-# just read it and pass it to update
- new_hand_id = sys.stdin.readline()
- new_hand_id = new_hand_id.rstrip() # remove trailing whitespace
- m.update(new_hand_id)
- return(True)
-
- config = Configuration.Config()
- db_connection = Database.Database(config, 'fpdb', '')
-
- main_window = gtk.Window()
- main_window.set_keep_above(True)
- main_window.connect("destroy", destroy)
-
- m = Mucked(main_window, db_connection)
- main_window.show_all()
-
- s_id = gobject.io_add_watch(sys.stdin, gobject.IO_IN, process_new_hand)
-
- gtk.main()
diff --git a/SQL.py b/SQL.py
deleted file mode 100644
index 072d478e..00000000
--- a/SQL.py
+++ /dev/null
@@ -1,290 +0,0 @@
-#!/usr/bin/env python
-"""SQL.py
-
-Set up all of the SQL statements for a given game and database type.
-"""
-# Copyright 2008, Ray E. Barker
-#
-# 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
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# 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 General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-########################################################################
-
-# Standard Library modules
-
-# pyGTK modules
-
-# FreePokerTools modules
-
-class Sql:
-
- def __init__(self, game = 'holdem', type = 'PT3'):
- self.query = {}
-
-############################################################################
-#
-# Support for the ptracks database, a cut down PT2 stud database.
-# You can safely ignore this unless you are me.
-#
- if game == 'razz' and type == 'ptracks':
-
- self.query['get_table_name'] = "select table_name from game where game_id = %s"
-
- self.query['get_last_hand'] = "select max(game_id) from game"
-
- self.query['get_recent_hands'] = "select game_id from game where game_id > %(last_hand)d"
-
- self.query['get_xml'] = "select xml from hand_history where game_id = %s"
-
- self.query['get_player_id'] = """
- select player_id from players
- where screen_name = %(player)s
- """
-
- self.query['get_hand_info'] = """
- SELECT
- game_id,
- CONCAT(hole_card_1, hole_card_2, hole_card_3, hole_card_4, hole_card_5, hole_card_6, hole_card_7) AS hand,
- total_won-total_bet AS net
- FROM game_players
- WHERE game_id = %s AND player_id = 3
- """
-
- self.query['get_cards'] = """
- select
- seat_number,
- screen_name,
- hole_card_1,
- hole_card_2,
- hole_card_3,
- hole_card_4,
- hole_card_5,
- hole_card_6,
- hole_card_7
- from game_players, players
- where game_id = %s and game_players.player_id = players.player_id
- order by seat_number
- """
-
- self.query['get_stats_from_hand'] = """
- SELECT player_id,
- count(*) AS n,
- sum(pre_fourth_raise_n) AS pfr,
- sum(fourth_raise_n) AS raise_n_2,
- sum(fourth_ck_raise_n) AS cr_n_2,
- sum(fifth_bet_raise_n) AS br_n_3,
- sum(fifth_bet_ck_raise_n) AS cr_n_3,
- sum(sixth_bet_raise_n) AS br_n_4,
- sum(sixth_bet_ck_raise_n) AS cr_n_4,
- sum(river_bet_raise_n) AS br_n_5,
- sum(river_bet_ck_raise_n) AS cr_n_5,
- sum(went_to_showdown_n) AS sd,
- sum(saw_fourth_n) AS saw_f,
- sum(raised_first_pf) AS first_pfr,
- sum(vol_put_money_in_pot) AS vpip,
- sum(limp_with_prev_callers) AS limp_w_callers,
-
- sum(ppossible_actions) AS poss_a_pf,
- sum(pfold) AS fold_pf,
- sum(pcheck) AS check_pf,
- sum(praise) AS raise_pf,
- sum(pcall) AS raise_pf,
- sum(limp_call_reraise_pf) AS limp_call_pf,
-
- sum(pfr_check) AS check_after_raise,
- sum(pfr_call) AS call_after_raise,
- sum(pfr_fold) AS fold_after_raise,
- sum(pfr_bet) AS bet_after_raise,
- sum(pfr_raise) AS raise_after_raise,
- sum(folded_to_river_bet) AS fold_to_r_bet,
-
- sum(fpossible_actions) AS poss_a_2,
- sum(ffold) AS fold_2,
- sum(fcheck) AS check_2,
- sum(fbet) AS bet_2,
- sum(fraise) AS raise_2,
- sum(fcall) AS raise_2,
-
- sum(fifpossible_actions) AS poss_a_3,
- sum(fiffold) AS fold_3,
- sum(fifcheck) AS check_3,
- sum(fifbet) AS bet_3,
- sum(fifraise) AS raise_3,
- sum(fifcall) AS call_3,
-
- sum(spossible_actions) AS poss_a_4,
- sum(sfold) AS fold_4,
- sum(scheck) AS check_4,
- sum(sbet) AS bet_4,
- sum(sraise) AS raise_4,
- sum(scall) AS call_4,
-
- sum(rpossible_actions) AS poss_a_5,
- sum(rfold) AS fold_5,
- sum(rcheck) AS check_5,
- sum(rbet) AS bet_5,
- sum(rraise) AS raise_5,
- sum(rcall) AS call_5,
-
- sum(cold_call_pf) AS cc_pf,
- sum(saw_fifth_n) AS saw_3,
- sum(saw_sixth_n) AS saw_4,
- sum(saw_river_n) AS saw_5
- FROM game_players
- WHERE player_id in
- (SELECT player_id FROM game_players
- WHERE game_id = %s AND NOT player_id = %s)
- GROUP BY player_id
- """
-# alternate form of WHERE for above
-# WHERE game_id = %(hand)d AND NOT player_id = %(hero)d)
-# WHERE game_id = %s AND NOT player_id = %s)
-
- self.query['get_players_from_hand'] = """
- SELECT game_players.player_id, seat_number, screen_name
- FROM game_players INNER JOIN players ON (game_players.player_id = players.player_id)
- WHERE game_id = %s
- """
-
-###############################################################################3
-# Support for the Free Poker DataBase = fpdb http://fpdb.sourceforge.net/
-#
- if type == 'fpdb':
-
- self.query['get_last_hand'] = "select max(id) from Hands"
-
- self.query['get_player_id'] = """
- select Players.id AS player_id from Players, Sites
- where Players.name = %(player)s
- and Sites.name = %(site)s
- and Players.SiteId = Sites.id
- """
-
- self.query['get_stats_from_hand'] = """
- SELECT HudCache.playerId AS player_id,
- sum(HDs) AS n,
- sum(street0VPI) AS vpip,
- sum(street0Aggr) AS pfr,
- sum(street0_3B4BChance) AS TB_opp_0,
- sum(street0_3B4BDone) AS TB_0,
- sum(street1Seen) AS saw_f,
- sum(street1Seen) AS saw_1,
- sum(street2Seen) AS saw_2,
- sum(street3Seen) AS saw_3,
- sum(street4Seen) AS saw_4,
- sum(sawShowdown) AS sd,
- sum(street1Aggr) AS aggr_1,
- sum(street2Aggr) AS aggr_2,
- sum(street3Aggr) AS aggr_3,
- sum(street4Aggr) AS aggr_4,
- sum(otherRaisedStreet1) AS was_raised_1,
- sum(otherRaisedStreet2) AS was_raised_2,
- sum(otherRaisedStreet3) AS was_raised_3,
- sum(otherRaisedStreet4) AS was_raised_4,
- sum(foldToOtherRaisedStreet1) AS f_freq_1,
- sum(foldToOtherRaisedStreet2) AS f_freq_2,
- sum(foldToOtherRaisedStreet3) AS f_freq_3,
- sum(foldToOtherRaisedStreet4) AS f_freq_4,
- sum(wonWhenSeenStreet1) AS w_w_s_1,
- sum(wonAtSD) AS wmsd,
- sum(stealAttemptChance) AS steal_opp,
- sum(stealAttempted) AS steal,
- sum(foldBbToStealChance) AS SBstolen,
- sum(foldedBbToSteal) AS BBnotDef,
- sum(foldBbToStealChance) AS BBstolen,
- sum(foldedSbToSteal) AS SBnotDef,
- sum(street1CBChance) AS CB_opp_1,
- sum(street1CBDone) AS CB_1,
- sum(street2CBChance) AS CB_opp_2,
- sum(street2CBDone) AS CB_2,
- sum(street3CBChance) AS CB_opp_3,
- sum(street3CBDone) AS CB_3,
- sum(street4CBChance) AS CB_opp_4,
- sum(street4CBDone) AS CB_4,
- sum(foldToStreet1CBChance) AS f_cb_opp_1,
- sum(foldToStreet1CBDone) AS f_cb_1,
- sum(foldToStreet2CBChance) AS f_cb_opp_2,
- sum(foldToStreet2CBDone) AS f_cb_2,
- sum(foldToStreet3CBChance) AS f_cb_opp_3,
- sum(foldToStreet3CBDone) AS f_cb_3,
- sum(foldToStreet4CBChance) AS f_cb_opp_4,
- sum(foldToStreet4CBDone) AS f_cb_4,
- sum(totalProfit) AS net,
- sum(street1CheckCallRaiseChance) AS ccr_opp_1,
- sum(street1CheckCallRaiseDone) AS ccr_1,
- sum(street2CheckCallRaiseChance) AS ccr_opp_2,
- sum(street2CheckCallRaiseDone) AS ccr_2,
- sum(street3CheckCallRaiseChance) AS ccr_opp_3,
- sum(street3CheckCallRaiseDone) AS ccr_3,
- sum(street4CheckCallRaiseChance) AS ccr_opp_4,
- sum(street4CheckCallRaiseDone) AS ccr_4
- FROM HudCache, Hands
- WHERE HudCache.PlayerId in
- (SELECT PlayerId FROM HandsPlayers
- WHERE handId = %s)
- AND Hands.id = %s
- AND Hands.gametypeId = HudCache.gametypeId
- GROUP BY HudCache.PlayerId
- """
-# AND PlayerId LIKE %s
-# HudCache.gametypeId AS gametypeId,
-# activeSeats AS n_active,
-# position AS position,
-# HudCache.tourneyTypeId AS tourneyTypeId,
-
- self.query['get_players_from_hand'] = """
- SELECT HandsPlayers.playerId, seatNo, name
- FROM HandsPlayers INNER JOIN Players ON (HandsPlayers.playerId = Players.id)
- WHERE handId = %s
- """
-# WHERE handId = %s AND Players.id LIKE %s
-
- self.query['get_table_name'] = """
- select tableName, maxSeats, category
- from Hands,Gametypes
- where Hands.id = %s
- and Gametypes.id = Hands.gametypeId
- """
-
- self.query['get_cards'] = """
- select
- seatNo AS seat_number,
- name AS screen_name,
- card1Value, card1Suit,
- card2Value, card2Suit,
- card3Value, card3Suit,
- card4Value, card4Suit,
- card5Value, card5Suit,
- card6Value, card6Suit,
- card7Value, card7Suit
- from HandsPlayers, Players
- where handID = %s and HandsPlayers.playerId = Players.id
- order by seatNo
- """
-
-# self.query['get_hand_info'] = """
-# SELECT
-# game_id,
-# CONCAT(hole_card_1, hole_card_2, hole_card_3, hole_card_4, hole_card_5, hole_card_6, hole_card_7) AS hand,
-# total_won-total_bet AS net
-# FROM game_players
-# WHERE game_id = %s AND player_id = 3
-# """
-
-if __name__== "__main__":
-# just print the default queries and exit
- s = Sql(game = 'razz', type = 'ptracks')
- for key in s.query:
- print "For query " + key + ", sql ="
- print s.query[key]
diff --git a/Stats.py b/Stats.py
deleted file mode 100644
index 3531c017..00000000
--- a/Stats.py
+++ /dev/null
@@ -1,618 +0,0 @@
-#!/usr/bin/env python
-
-"""Manage collecting and formatting of stats and tooltips.
-"""
-# Copyright 2008, Ray E. Barker
-
-#
-# 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
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# 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 General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-########################################################################
-
-# How to write a new stat:
-# 1 You can see a listing of all the raw stats (e.g., from the HudCache table)
-# by running Database.py as a stand along program. You need to combine
-# those raw stats to get stats to present to the HUD. If you need more
-# information than is in the HudCache table, then you have to write SQL.
-# 2 The raw stats seen when you run Database.py are available in the Stats.py
-# in the stat_dict dict. For example the number of vpips would be
-# stat_dict[player]['vpip']. So the % vpip is
-# float(stat_dict[player]['vpip'])/float(stat_dict[player]['n']). You can see how the
-# keys of stat_dict relate to the column names in HudCache by inspecting
-# the proper section of the SQL.py module.
-# 3 You have to write a small function for each stat you want to add. See
-# the vpip() function for example. This function has to be protected from
-# exceptions, using something like the try:/except: paragraphs in vpip.
-# 4 The name of the function has to be the same as the of the stat used
-# in the config file.
-# 5 The stat functions have a peculiar return value, which is outlined in
-# the do_stat function. This format is useful for tool tips and maybe
-# other stuff.
-# 6 For each stat you make add a line to the __main__ function to test it.
-
-# Standard Library modules
-#import sys
-
-# pyGTK modules
-import pygtk
-import gtk
-
-# FreePokerTools modules
-import Configuration
-import Database
-
-def do_tip(widget, tip):
- widget.set_tooltip_text(tip)
-
-def do_stat(stat_dict, player = 24, stat = 'vpip'):
- return eval("%(stat)s(stat_dict, %(player)d)" % {'stat': stat, 'player': player})
-# OK, for reference the tuple returned by the stat is:
-# 0 - The stat, raw, no formating, eg 0.33333333
-# 1 - formatted stat with appropriate precision and punctuation, eg 33%
-# 2 - formatted stat with appropriate precision, punctuation and a hint, eg v=33%
-# 3 - same as #2 except name of stat instead of hint, eg vpip=33%
-# 4 - the calculation that got the stat, eg 9/27
-# 5 - the name of the stat, useful for a tooltip, eg vpip
-
-###########################################
-# functions that return individual stats
-def vpip(stat_dict, player):
- """ Voluntarily put $ in the pot."""
- stat = 0.0
- try:
- stat = float(stat_dict[player]['vpip'])/float(stat_dict[player]['n'])
- return (stat,
- '%3.1f' % (100*stat) + '%',
- 'v=%3.1f' % (100*stat) + '%',
- 'vpip=%3.1f' % (100*stat) + '%',
- '(%d/%d)' % (stat_dict[player]['vpip'], stat_dict[player]['n']),
- 'vpip'
- )
- except: return (stat,
- '%3.1f' % (0) + '%',
- 'w=%3.1f' % (0) + '%',
- 'wtsd=%3.1f' % (0) + '%',
- '(%d/%d)' % (0, 0),
- 'wtsd'
- )
-
-def pfr(stat_dict, player):
- """ Preflop (3rd street) raise."""
- stat = 0.0
- try:
- stat = float(stat_dict[player]['pfr'])/float(stat_dict[player]['n'])
- return (stat,
- '%3.1f' % (100*stat) + '%',
- 'p=%3.1f' % (100*stat) + '%',
- 'pfr=%3.1f' % (100*stat) + '%',
- '(%d/%d)' % (stat_dict[player]['pfr'], stat_dict[player]['n']),
- 'pfr'
- )
- except:
- return (stat,
- '%3.1f' % (0) + '%',
- 'p=%3.1f' % (0) + '%',
- 'pfr=%3.1f' % (0) + '%',
- '(%d/%d)' % (0, 0),
- 'pfr'
- )
-
-def wtsd(stat_dict, player):
- """ Went to SD when saw flop/4th."""
- stat = 0.0
- try:
- stat = float(stat_dict[player]['sd'])/float(stat_dict[player]['saw_f'])
- return (stat,
- '%3.1f' % (100*stat) + '%',
- 'w=%3.1f' % (100*stat) + '%',
- 'wtsd=%3.1f' % (100*stat) + '%',
- '(%d/%d)' % (stat_dict[player]['sd'], stat_dict[player]['saw_f']),
- '% went to showdown'
- )
- except:
- return (stat,
- '%3.1f' % (0) + '%',
- 'w=%3.1f' % (0) + '%',
- 'wtsd=%3.1f' % (0) + '%',
- '(%d/%d)' % (0, 0),
- '% went to showdown'
- )
-
-def wmsd(stat_dict, player):
- """ Won $ at showdown."""
- stat = 0.0
- try:
- stat = float(stat_dict[player]['wmsd'])/float(stat_dict[player]['sd'])
- return (stat,
- '%3.1f' % (100*stat) + '%',
- 'w=%3.1f' % (100*stat) + '%',
- 'wmsd=%3.1f' % (100*stat) + '%',
- '(%f5.0/%d)' % (stat_dict[player]['wmsd'], stat_dict[player]['sd']),
- '% won money at showdown'
- )
- except:
- return (stat,
- '%3.1f' % (0) + '%',
- 'w=%3.1f' % (0) + '%',
- 'wmsd=%3.1f' % (0) + '%',
- '(%d/%d)' % (0, 0),
- '% won money at showdown'
- )
-
-def saw_f(stat_dict, player):
- """ Saw flop/4th."""
- try:
- num = float(stat_dict[player]['saw_f'])
- den = float(stat_dict[player]['n'])
- stat = num/den
- return (stat,
- '%3.1f' % (100*stat) + '%',
- 'sf=%3.1f' % (100*stat) + '%',
- 'saw_f=%3.1f' % (100*stat) + '%',
- '(%d/%d)' % (stat_dict[player]['saw_f'], stat_dict[player]['n']),
- 'saw_f'
- )
- except:
- stat = 0.0
- num = 0
- den = 0
- return (stat,
- '%3.1f' % (stat) + '%',
- 'sf=%3.1f' % (stat) + '%',
- 'saw_f=%3.1f' % (stat) + '%',
- '(%d/%d)' % (num, den),
- 'saw_f'
- )
-
-def n(stat_dict, player):
- """ Number of hands played."""
- try:
- return (stat_dict[player]['n'],
- '%d' % (stat_dict[player]['n']),
- 'n=%d' % (stat_dict[player]['n']),
- 'n=%d' % (stat_dict[player]['n']),
- '(%d)' % (stat_dict[player]['n']),
- 'number hands seen'
- )
- except:
- return (0,
- '%d' % (0),
- 'n=%d' % (0),
- 'n=%d' % (0),
- '(%d)' % (0),
- 'number hands seen'
- )
-
-def fold_f(stat_dict, player):
- """ Folded flop/4th."""
- stat = 0.0
- try:
- stat = float(stat_dict[player]['fold_2'])/fold(stat_dict[player]['saw_f'])
- return (stat,
- '%3.1f' % (100*stat) + '%',
- 'ff=%3.1f' % (100*stat) + '%',
- 'fold_f=%3.1f' % (100*stat) + '%',
- '(%d/%d)' % (stat_dict[player]['fold_2'], stat_dict[player]['saw_f']),
- 'folded flop/4th'
- )
- except:
- return (stat,
- '%3.1f' % (0) + '%',
- 'ff=%3.1f' % (0) + '%',
- 'fold_f=%3.1f' % (0) + '%',
- '(%d/%d)' % (0, 0),
- 'folded flop/4th'
- )
-
-def steal(stat_dict, player):
- """ Steal %."""
- stat = 0.0
- try:
- stat = float(stat_dict[player]['steal'])/float(stat_dict[player]['steal_opp'])
- return (stat,
- '%3.1f' % (100*stat) + '%',
- 'st=%3.1f' % (100*stat) + '%',
- 'steal=%3.1f' % (100*stat) + '%',
- '(%d/%d)' % (stat_dict[player]['steal'], stat_dict[player]['steal_opp']),
- '% steal attempted'
- )
- except:
- return (stat,
- '%3.1f' % (0) + '%',
- 'st=%3.1f' % (0) + '%',
- 'steal=%3.1f' % (0) + '%',
- '(%d/%d)' % (0, 0),
- '% steal attempted'
- )
-
-def f_SB_steal(stat_dict, player):
- """ Folded SB to steal."""
- stat = 0.0
- try:
- stat = float(stat_dict[player]['SBnotDef'])/float(stat_dict[player]['SBstolen'])
- return (stat,
- '%3.1f' % (100*stat) + '%',
- 'fSB=%3.1f' % (100*stat) + '%',
- 'fSB_s=%3.1f' % (100*stat) + '%',
- '(%d/%d)' % (stat_dict[player]['SBnotDef'], stat_dict[player]['SBstolen']),
- '% folded SB to steal'
- )
- except:
- return (stat,
- '%3.1f' % (0) + '%',
- 'fSB=%3.1f' % (0) + '%',
- 'fSB_s=%3.1f' % (0) + '%',
- '(%d/%d)' % (0, 0),
- '% folded SB to steal'
- )
-
-def f_BB_steal(stat_dict, player):
- """ Folded BB to steal."""
- stat = 0.0
- try:
- stat = float(stat_dict[player]['BBnotDef'])/float(stat_dict[player]['BBstolen'])
- return (stat,
- '%3.1f' % (100*stat) + '%',
- 'fBB=%3.1f' % (100*stat) + '%',
- 'fBB_s=%3.1f' % (100*stat) + '%',
- '(%d/%d)' % (stat_dict[player]['BBnotDef'], stat_dict[player]['BBstolen']),
- '% folded BB to steal'
- )
- except:
- return (stat,
- '%3.1f' % (0) + '%',
- 'fBB=%3.1f' % (0) + '%',
- 'fBB_s=%3.1f' % (0) + '%',
- '(%d/%d)' % (0, 0),
- '% folded BB to steal'
- )
-
-def three_B_0(stat_dict, player):
- """ Three bet preflop/3rd."""
- stat = 0.0
- try:
- stat = float(stat_dict[player]['TB_0'])/float(stat_dict[player]['TB_opp_0'])
- return (stat,
- '%3.1f' % (100*stat) + '%',
- '3B=%3.1f' % (100*stat) + '%',
- '3B_pf=%3.1f' % (100*stat) + '%',
- '(%d/%d)' % (stat_dict[player]['TB_0'], stat_dict[player]['TB_opp_0']),
- '% 3/4 Bet preflop/3rd'
- )
- except:
- return (stat,
- '%3.1f' % (0) + '%',
- '3B=%3.1f' % (0) + '%',
- '3B_pf=%3.1f' % (0) + '%',
- '(%d/%d)' % (0, 0),
- '% 3/4 Bet preflop/3rd'
- )
-
-def WMsF(stat_dict, player):
- """ Won $ when saw flop/4th."""
- stat = 0.0
- try:
- stat = float(stat_dict[player]['w_w_s_1'])/float(stat_dict[player]['saw_1'])
- return (stat,
- '%3.1f' % (100*stat) + '%',
- 'wf=%3.1f' % (100*stat) + '%',
- 'w_w_f=%3.1f' % (100*stat) + '%',
- '(%d/%d)' % (stat_dict[player]['w_w_s_1'], stat_dict[player]['saw_f']),
- '% won$/saw flop/4th'
- )
- except:
- return (stat,
- '%3.1f' % (0) + '%',
- 'wf=%3.1f' % (0) + '%',
- 'w_w_f=%3.1f' % (0) + '%',
- '(%d/%d)' % (0, 0),
- '% won$/saw flop/4th'
- )
-
-def a_freq_1(stat_dict, player):
- """ Flop/4th aggression frequency."""
- stat = 0.0
- try:
- stat = float(stat_dict[player]['aggr_1'])/float(stat_dict[player]['saw_f'])
- return (stat,
- '%3.1f' % (100*stat) + '%',
- 'a1=%3.1f' % (100*stat) + '%',
- 'a_fq_1=%3.1f' % (100*stat) + '%',
- '(%d/%d)' % (stat_dict[player]['aggr_1'], stat_dict[player]['saw_f']),
- 'Aggression Freq flop/4th'
- )
- except:
- return (stat,
- '%3.1f' % (0) + '%',
- 'a1=%3.1f' % (0) + '%',
- 'a_fq_1=%3.1f' % (0) + '%',
- '(%d/%d)' % (0, 0),
- 'Aggression Freq flop/4th'
- )
-
-def a_freq_2(stat_dict, player):
- """ Turn/5th aggression frequency."""
- stat = 0.0
- try:
- stat = float(stat_dict[player]['aggr_2'])/float(stat_dict[player]['saw_2'])
- return (stat,
- '%3.1f' % (100*stat) + '%',
- 'a2=%3.1f' % (100*stat) + '%',
- 'a_fq_2=%3.1f' % (100*stat) + '%',
- '(%d/%d)' % (stat_dict[player]['aggr_2'], stat_dict[player]['saw_2']),
- 'Aggression Freq turn/5th'
- )
- except:
- return (stat,
- '%3.1f' % (0) + '%',
- 'a2=%3.1f' % (0) + '%',
- 'a_fq_2=%3.1f' % (0) + '%',
- '(%d/%d)' % (0, 0),
- 'Aggression Freq turn/5th'
- )
-
-def a_freq_3(stat_dict, player):
- """ River/6th aggression frequency."""
- stat = 0.0
- try:
- stat = float(stat_dict[player]['aggr_3'])/float(stat_dict[player]['saw_3'])
- return (stat,
- '%3.1f' % (100*stat) + '%',
- 'a3=%3.1f' % (100*stat) + '%',
- 'a_fq_3=%3.1f' % (100*stat) + '%',
- '(%d/%d)' % (stat_dict[player]['aggr_1'], stat_dict[player]['saw_1']),
- 'Aggression Freq river/6th'
- )
- except:
- return (stat,
- '%3.1f' % (0) + '%',
- 'a3=%3.1f' % (0) + '%',
- 'a_fq_3=%3.1f' % (0) + '%',
- '(%d/%d)' % (0, 0),
- 'Aggression Freq river/6th'
- )
-
-def a_freq_4(stat_dict, player):
- """ 7th street aggression frequency."""
- stat = 0.0
- try:
- stat = float(stat_dict[player]['aggr_4'])/float(stat_dict[player]['saw_4'])
- return (stat,
- '%3.1f' % (100*stat) + '%',
- 'a4=%3.1f' % (100*stat) + '%',
- 'a_fq_4=%3.1f' % (100*stat) + '%',
- '(%d/%d)' % (stat_dict[player]['aggr_4'], stat_dict[player]['saw_4']),
- 'Aggression Freq 7th'
- )
- except:
- return (stat,
- '%3.1f' % (0) + '%',
- 'a4=%3.1f' % (0) + '%',
- 'a_fq_4=%3.1f' % (0) + '%',
- '(%d/%d)' % (0, 0),
- 'Aggression Freq flop/4th'
- )
-
-def cb_1(stat_dict, player):
- """ Flop continuation bet."""
- stat = 0.0
- try:
- stat = float(stat_dict[player]['CB_1'])/float(stat_dict[player]['CB_opp_1'])
- return (stat,
- '%3.1f' % (100*stat) + '%',
- 'cb1=%3.1f' % (100*stat) + '%',
- 'cb_1=%3.1f' % (100*stat) + '%',
- '(%d/%d)' % (stat_dict[player]['CB_1'], stat_dict[player]['CB_opp_1']),
- '% continuation bet flop/4th'
- )
- except:
- return (stat,
- '%3.1f' % (0) + '%',
- 'cb1=%3.1f' % (0) + '%',
- 'cb_1=%3.1f' % (0) + '%',
- '(%d/%d)' % (0, 0),
- '% continuation bet flop/4th'
- )
-
-def cb_2(stat_dict, player):
- """ Turn continuation bet."""
- stat = 0.0
- try:
- stat = float(stat_dict[player]['CB_2'])/float(stat_dict[player]['CB_opp_2'])
- return (stat,
- '%3.1f' % (100*stat) + '%',
- 'cb2=%3.1f' % (100*stat) + '%',
- 'cb_2=%3.1f' % (100*stat) + '%',
- '(%d/%d)' % (stat_dict[player]['CB_2'], stat_dict[player]['CB_opp_2']),
- '% continuation bet turn/5th'
- )
- except:
- return (stat,
- '%3.1f' % (0) + '%',
- 'cb2=%3.1f' % (0) + '%',
- 'cb_2=%3.1f' % (0) + '%',
- '(%d/%d)' % (0, 0),
- '% continuation bet turn/5th'
- )
-
-def cb_3(stat_dict, player):
- """ River continuation bet."""
- stat = 0.0
- try:
- stat = float(stat_dict[player]['CB_3'])/float(stat_dict[player]['CB_opp_3'])
- return (stat,
- '%3.1f' % (100*stat) + '%',
- 'cb3=%3.1f' % (100*stat) + '%',
- 'cb_3=%3.1f' % (100*stat) + '%',
- '(%d/%d)' % (stat_dict[player]['CB_3'], stat_dict[player]['CB_opp_3']),
- '% continuation bet river/6th'
- )
- except:
- return (stat,
- '%3.1f' % (0) + '%',
- 'cb3=%3.1f' % (0) + '%',
- 'cb_3=%3.1f' % (0) + '%',
- '(%d/%d)' % (0, 0),
- '% continuation bet river/6th'
- )
-
-def cb_4(stat_dict, player):
- """ 7th street continuation bet."""
- stat = 0.0
- try:
- stat = float(stat_dict[player]['CB_4'])/float(stat_dict[player]['CB_opp_4'])
- return (stat,
- '%3.1f' % (100*stat) + '%',
- 'cb4=%3.1f' % (100*stat) + '%',
- 'cb_4=%3.1f' % (100*stat) + '%',
- '(%d/%d)' % (stat_dict[player]['CB_4'], stat_dict[player]['CB_opp_4']),
- '% continuation bet 7th'
- )
- except:
- return (stat,
- '%3.1f' % (0) + '%',
- 'cb4=%3.1f' % (0) + '%',
- 'cb_4=%3.1f' % (0) + '%',
- '(%d/%d)' % (0, 0),
- '% continuation bet 7th'
- )
-
-def ffreq_1(stat_dict, player):
- """ Flop/4th fold frequency."""
- stat = 0.0
- try:
- stat = float(stat_dict[player]['f_freq_1'])/float(stat_dict[player]['was_raised_1'])
- return (stat,
- '%3.1f' % (100*stat) + '%',
- 'ff1=%3.1f' % (100*stat) + '%',
- 'ff_1=%3.1f' % (100*stat) + '%',
- '(%d/%d)' % (stat_dict[player]['f_freq_1'], stat_dict[player]['was_raised_1']),
- '% fold frequency flop/4th'
- )
- except:
- return (stat,
- '%3.1f' % (0) + '%',
- 'ff1=%3.1f' % (0) + '%',
- 'ff_1=%3.1f' % (0) + '%',
- '(%d/%d)' % (0, 0),
- '% fold frequency flop/4th'
- )
-
-def ffreq_2(stat_dict, player):
- """ Turn/5th fold frequency."""
- stat = 0.0
- try:
- stat = float(stat_dict[player]['f_freq_2'])/float(stat_dict[player]['was_raised_2'])
- return (stat,
- '%3.1f' % (100*stat) + '%',
- 'ff2=%3.1f' % (100*stat) + '%',
- 'ff_2=%3.1f' % (100*stat) + '%',
- '(%d/%d)' % (stat_dict[player]['f_freq_2'], stat_dict[player]['was_raised_2']),
- '% fold frequency turn/5th'
- )
- except:
- return (stat,
- '%3.1f' % (0) + '%',
- 'ff2=%3.1f' % (0) + '%',
- 'ff_2=%3.1f' % (0) + '%',
- '(%d/%d)' % (0, 0),
- '% fold frequency turn/5th'
- )
-
-def ffreq_3(stat_dict, player):
- """ River/6th fold frequency."""
- stat = 0.0
- try:
- stat = float(stat_dict[player]['f_freq_3'])/float(stat_dict[player]['was_raised_3'])
- return (stat,
- '%3.1f' % (100*stat) + '%',
- 'ff3=%3.1f' % (100*stat) + '%',
- 'ff_3=%3.1f' % (100*stat) + '%',
- '(%d/%d)' % (stat_dict[player]['f_freq_3'], stat_dict[player]['was_raised_3']),
- '% fold frequency river/6th'
- )
- except:
- return (stat,
- '%3.1f' % (0) + '%',
- 'ff3=%3.1f' % (0) + '%',
- 'ff_3=%3.1f' % (0) + '%',
- '(%d/%d)' % (0, 0),
- '% fold frequency river/6th'
- )
-
-def ffreq_4(stat_dict, player):
- """ 7th fold frequency."""
- stat = 0.0
- try:
- stat = float(stat_dict[player]['f_freq_4'])/float(stat_dict[player]['was_raised_4'])
- return (stat,
- '%3.1f' % (100*stat) + '%',
- 'ff4=%3.1f' % (100*stat) + '%',
- 'ff_4=%3.1f' % (100*stat) + '%',
- '(%d/%d)' % (stat_dict[player]['f_freq_4'], stat_dict[player]['was_raised_4']),
- '% fold frequency 7th'
- )
- except:
- return (stat,
- '%3.1f' % (0) + '%',
- 'ff4=%3.1f' % (0) + '%',
- 'ff_4=%3.1f' % (0) + '%',
- '(%d/%d)' % (0, 0),
- '% fold frequency 7th'
- )
-
-if __name__== "__main__":
- c = Configuration.Config()
- db_connection = Database.Database(c, 'fpdb', 'holdem')
- h = db_connection.get_last_hand()
- stat_dict = db_connection.get_stats_from_hand(h)
-
- for player in stat_dict.keys():
- print "player = ", player, do_stat(stat_dict, player = player, stat = 'vpip')
- print "player = ", player, do_stat(stat_dict, player = player, stat = 'pfr')
- print "player = ", player, do_stat(stat_dict, player = player, stat = 'wtsd')
- print "player = ", player, do_stat(stat_dict, player = player, stat = 'saw_f')
- print "player = ", player, do_stat(stat_dict, player = player, stat = 'n')
- print "player = ", player, do_stat(stat_dict, player = player, stat = 'fold_f')
- print "player = ", player, do_stat(stat_dict, player = player, stat = 'wmsd')
- print "player = ", player, do_stat(stat_dict, player = player, stat = 'steal')
- print "player = ", player, do_stat(stat_dict, player = player, stat = 'f_SB_steal')
- print "player = ", player, do_stat(stat_dict, player = player, stat = 'f_BB_steal')
- print "player = ", player, do_stat(stat_dict, player = player, stat = 'three_B_0')
- print "player = ", player, do_stat(stat_dict, player = player, stat = 'WMsF')
- print "player = ", player, do_stat(stat_dict, player = player, stat = 'a_freq_1')
- print "player = ", player, do_stat(stat_dict, player = player, stat = 'a_freq_2')
- print "player = ", player, do_stat(stat_dict, player = player, stat = 'a_freq_3')
- print "player = ", player, do_stat(stat_dict, player = player, stat = 'a_freq_4')
- print "player = ", player, do_stat(stat_dict, player = player, stat = 'cb_1')
- print "player = ", player, do_stat(stat_dict, player = player, stat = 'cb_2')
- print "player = ", player, do_stat(stat_dict, player = player, stat = 'cb_3')
- print "player = ", player, do_stat(stat_dict, player = player, stat = 'cb_4')
- print "player = ", player, do_stat(stat_dict, player = player, stat = 'ffreq_1')
- print "player = ", player, do_stat(stat_dict, player = player, stat = 'ffreq_2')
- print "player = ", player, do_stat(stat_dict, player = player, stat = 'ffreq_3')
- print "player = ", player, do_stat(stat_dict, player = player, stat = 'ffreq_4')
-
- print "\n\nLegal stats:"
- for attr in dir():
- if attr.startswith('__'): continue
- if attr in ("Configuration", "Database", "GInitiallyUnowned", "gtk", "pygtk",
- "player", "c", "db_connection", "do_stat", "do_tip", "stat_dict",
- "h"): continue
- print attr, eval("%s.__doc__" % (attr))
-# print " " % (attr)
-
- db_connection.close
-
diff --git a/Tables.py b/Tables.py
deleted file mode 100644
index cb6209c8..00000000
--- a/Tables.py
+++ /dev/null
@@ -1,231 +0,0 @@
-#!/usr/bin/env python
-"""Discover_Tables.py
-
-Inspects the currently open windows and finds those of interest to us--that is
-poker table windows from supported sites. Returns a list
-of Table_Window objects representing the windows found.
-"""
-# Copyright 2008, Ray E. Barker
-
-#
-# 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
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# 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 General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-########################################################################
-
-# Standard Library modules
-import os
-import sys
-import re
-
-# Win32 modules
-
-if os.name == 'nt':
- import win32gui
-
-# FreePokerTools modules
-import Configuration
-
-class Table_Window:
- def __str__(self):
-# __str__ method for testing
- temp = 'TableWindow object\n'
- temp = temp + " name = %s\n site = %s\n number = %s\n title = %s\n" % (self.name, self.site, self.number, self.title)
-# temp = temp + " game = %s\n structure = %s\n max = %s\n" % (self.game, self.structure, self.max)
- temp = temp + " width = %d\n height = %d\n x = %d\n y = %d\n" % (self.width, self.height, self.x, self.y)
- if getattr(self, 'tournament', 0):
- temp = temp + " tournament = %d\n table = %d" % (self.tournament, self.table)
- return temp
-
- def get_details(table):
- table.game = 'razz'
- table.max = 8
- table.struture = 'limit'
- table.tournament = 0
-
-def discover(c):
- if os.name == 'posix':
- tables = discover_posix(c)
- return tables
- elif os.name == 'nt':
- tables = discover_nt(c)
- return tables
- elif ox.name == 'mac':
- tables = discover_mac(c)
- return tables
- else: tables = {}
-
- return(tables)
-
-def discover_posix(c):
- """ Poker client table window finder for posix/Linux = XWindows."""
- tables = {}
- for listing in os.popen('xwininfo -root -tree').readlines():
-# xwininfo -root -tree -id 0xnnnnn gets the info on a single window
- if re.search('Lobby', listing): continue
- if re.search('Instant Hand History', listing): continue
- if not re.search('Logged In as ', listing, re.IGNORECASE): continue
- if re.search('\"Full Tilt Poker\"', listing): continue # FTP Lobby
- for s in c.supported_sites.keys():
- if re.search(c.supported_sites[s].table_finder, listing):
- mo = re.match('\s+([\dxabcdef]+) (.+):.+ (\d+)x(\d+)\+\d+\+\d+ \+(\d+)\+(\d+)', listing)
- if mo.group(2) == '(has no name)': continue
- if re.match('[\(\)\d\s]+', mo.group(2)): continue # this is a popup
- tw = Table_Window()
- tw.site = c.supported_sites[s].site_name
- tw.number = mo.group(1)
- tw.title = mo.group(2)
- tw.width = int( mo.group(3) )
- tw.height = int( mo.group(4) )
- tw.x = int (mo.group(5) )
- tw.y = int (mo.group(6) )
- tw.title = re.sub('\"', '', tw.title)
-
-# use this eval thingie to call the title bar decoder specified in the config file
- eval("%s(tw)" % c.supported_sites[s].decoder)
- tables[tw.name] = tw
- return tables
-#
-# The discover_xx functions query the system and report on the poker clients
-# currently displayed on the screen. The discover_posix should give you
-# some idea how to support other systems.
-#
-# discover_xx() returns a dict of TableWindow objects--one TableWindow
-# object for each poker client table on the screen.
-#
-# Each TableWindow object must have the following attributes correctly populated:
-# tw.site = the site name, e.g. PokerStars, FullTilt. This must match the site
-# name specified in the config file.
-# tw.number = This is the system id number for the client table window in the
-# format that the system presents it.
-# tw.title = The full title from the window title bar.
-# tw.width, tw.height = The width and height of the window in pixels. This is
-# the internal width and height, not including the title bar and
-# window borders.
-# tw.x, tw.y = The x, y (horizontal, vertical) location of the window relative
-# to the top left of the display screen. This also does not include the
-# title bar and window borders. To put it another way, this is the
-# screen location of (0, 0) in the working window.
-
-def win_enum_handler(hwnd, titles):
- titles[hwnd] = win32gui.GetWindowText(hwnd)
-
-def child_enum_handler(hwnd, children):
- print hwnd, win32.GetWindowRect(hwnd)
-
-def discover_nt(c):
- """ Poker client table window finder for Windows."""
-#
-# I cannot figure out how to get the inside dimensions of the poker table
-# windows. So I just assume all borders are 3 thick and all title bars
-# are 29 high. No doubt this will be off when used with certain themes.
-#
- b_width = 3
- tb_height = 29
- titles = {}
- tables = {}
- win32gui.EnumWindows(win_enum_handler, titles)
- for hwnd in titles.keys():
- if re.search('Logged In as', titles[hwnd], re.IGNORECASE) and not re.search('Lobby', titles[hwnd]):
- if re.search('Full Tilt Poker', titles[hwnd]):
- continue
- tw = Table_Window()
- tw.number = hwnd
- (x, y, width, height) = win32gui.GetWindowRect(hwnd)
- tw.title = titles[hwnd]
- tw.width = int( width ) - 2*b_width
- tw.height = int( height ) - b_width - tb_height
- tw.x = int( x ) + b_width
- tw.y = int( y ) + tb_height
- if re.search('Logged In as', titles[hwnd]):
- tw.site = "PokerStars"
- elif re.search('Logged In As', titles[hwnd]):
- tw.site = "Full Tilt"
- else:
- tw.site = "Unknown"
- sys.stderr.write("Found unknown table = %s" % tw.title)
- if not tw.site == "Unknown":
- eval("%s(tw)" % c.supported_sites[tw.site].decoder)
- else:
- tw.name = "Unknown"
- tables[tw.name] = tw
- return tables
-
-def discover_mac(c):
- """ Poker client table window finder for Macintosh."""
- tables = {}
- return tables
-
-def pokerstars_decode_table(tw):
-# extract the table name OR the tournament number and table name from the title
-# other info in title is redundant with data in the database
- title_bits = re.split(' - ', tw.title)
- name = title_bits[0]
- mo = re.search('Tournament (\d+) Table (\d+)', name)
- if mo:
- tw.tournament = int( mo.group(1) )
- tw.table = int( mo.group(2) )
- tw.name = name
- else:
- tw.tournament = None
- for pattern in [' no all-in', ' fast', ',', ' 50BB min']:
- name = re.sub(pattern, '', name)
- name = re.sub('\s+$', '', name)
- tw.name = name
-
- mo = re.search('(Razz|Stud H/L|Stud|Omaha H/L|Omaha|Hold\'em|5-Card Draw|Triple Draw 2-7 Lowball)', tw.title)
-
- tw.game = mo.group(1).lower()
- tw.game = re.sub('\'', '', tw.game)
- tw.game = re.sub('h/l', 'hi/lo', tw.game)
-
- mo = re.search('(No Limit|Pot Limit)', tw.title)
- if mo:
- tw.structure = mo.group(1).lower()
- else:
- tw.structure = 'limit'
-
- tw.max = None
- if tw.game in ('razz', 'stud', 'stud hi/lo'):
- tw.max = 8
- elif tw.game in ('5-card draw', 'triple draw 2-7 lowball'):
- tw.max = 6
- elif tw.game == 'holdem':
- pass
- elif tw.game in ('omaha', 'omaha hi/lo'):
- pass
-
-def fulltilt_decode_table(tw):
-# extract the table name OR the tournament number and table name from the title
-# other info in title is redundant with data in the database
- title_bits = re.split(' - ', tw.title)
- name = title_bits[0]
- tw.tournament = None
- for pattern in [r' \(6 max\)', r' \(heads up\)', r' \(deep\)',
- r' \(deep hu\)', r' \(deep 6\)', r' \(2\)',
- r' \(edu\)', r' \(edu, 6 max\)', r' \(6\)' ]:
- name = re.sub(pattern, '', name)
-# (tw.name, trash) = name.split(r' (', 1)
- tw.name = name.rstrip()
-
-if __name__=="__main__":
- c = Configuration.Config()
- tables = discover(c)
-
- for t in tables.keys():
- print "t = ", t
- print tables[t]
-
- print "press enter to continue"
- sys.stdin.readline()