From e87118e9aecff599010b3b0395064d5e5a73d6ef Mon Sep 17 00:00:00 2001 From: Worros Date: Wed, 11 Mar 2009 00:14:23 +0900 Subject: [PATCH 1/2] Make PLO work on Everleaf again --- pyfpdb/Database.py | 25 ++++++++++++---- pyfpdb/EverleafToFpdb.py | 1 + pyfpdb/GuiGraphViewer.py | 2 ++ pyfpdb/HandHistoryConverter.py | 2 +- pyfpdb/Mucked.py | 52 +++++++++++++++++++++++----------- pyfpdb/SQL.py | 11 +++++++ 6 files changed, 70 insertions(+), 23 deletions(-) diff --git a/pyfpdb/Database.py b/pyfpdb/Database.py index ae4f738d..66294cdc 100755 --- a/pyfpdb/Database.py +++ b/pyfpdb/Database.py @@ -129,18 +129,31 @@ class Database: cards[s_dict['seat_number']] = (self.convert_cards(s_dict)) return cards + def get_common_cards(self, hand): + """Get and return the community cards for the specified hand.""" + cards = {} + c = self.connection.cursor() + c.execute(self.sql.query['get_common_cards'], hand) + colnames = [desc[0] for desc in c.description] + for row in c.fetchall(): + s_dict = {} + for name, val in zip(colnames, row): + s_dict[name] = val + cards['common'] = (self.convert_cards(s_dict)) + return cards + def convert_cards(self, d): ranks = ('', '', '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A') cards = "" for i in xrange(1, 8): - cv = "card%dValue" % i - if d[cv] == None: + key = 'card' + str(i) + 'Value' + if not d.has_key(key): continue + if d[key] == None: break - elif d[cv] == 0: - cards = "%sxx" % cards + elif d[key] == 0: + cards += "xx" else: - cs = "card%dSuit" % i - cards = "%s%s%s" % (cards, ranks[d[cv]], cs) + cards += ranks[d['card' + str(i) + 'Value']] + d['card' +str(i) + 'Suit'] return cards def get_action_from_hand(self, hand_no): diff --git a/pyfpdb/EverleafToFpdb.py b/pyfpdb/EverleafToFpdb.py index c125c376..1e6ee335 100755 --- a/pyfpdb/EverleafToFpdb.py +++ b/pyfpdb/EverleafToFpdb.py @@ -40,6 +40,7 @@ in_path (default '-' = sys.stdin) out_path (default '-' = sys.stdout) follow : whether to tail -f the input""" HandHistoryConverter.__init__(self, in_path, out_path, sitename="Everleaf", follow=follow) + print "DEBUG: __init__" logging.info("Initialising Everleaf converter class") self.filetype = "text" self.codepage = "cp1252" diff --git a/pyfpdb/GuiGraphViewer.py b/pyfpdb/GuiGraphViewer.py index 09bb50b9..0cc0b3f6 100644 --- a/pyfpdb/GuiGraphViewer.py +++ b/pyfpdb/GuiGraphViewer.py @@ -111,6 +111,7 @@ class GuiGraphViewer (threading.Thread): self.graphBox.add(self.canvas) self.canvas.show() + self.exportButton.set_sensitive(True) #end of def showClicked def getRingProfitGraph(self, names, sites): @@ -368,6 +369,7 @@ class GuiGraphViewer (threading.Thread): self.fig = None self.exportButton=gtk.Button("Export to File") self.exportButton.connect("clicked", self.exportGraph, "show clicked") + self.exportButton.set_sensitive(False) self.exportButton.show() self.leftPanelBox.add(playerFrame) diff --git a/pyfpdb/HandHistoryConverter.py b/pyfpdb/HandHistoryConverter.py index 11d607d4..2a31a145 100644 --- a/pyfpdb/HandHistoryConverter.py +++ b/pyfpdb/HandHistoryConverter.py @@ -148,7 +148,7 @@ class HandHistoryConverter(threading.Thread): return hand = None - if gametype['game'] in ("hold", "omaha"): + if gametype['game'] in ("hold", "omahahi"): hand = Hand.HoldemOmahaHand(self, self.sitename, gametype, handtext) elif gametype['game'] in ("razz","stud","stud8"): hand = Hand.StudHand(self, self.sitename, gametype, handtext) diff --git a/pyfpdb/Mucked.py b/pyfpdb/Mucked.py index 1598776c..8f00880b 100755 --- a/pyfpdb/Mucked.py +++ b/pyfpdb/Mucked.py @@ -320,22 +320,22 @@ class Flop_Mucked(Aux_Window): adj = self.hud.adj_seats(0, self.config) loc = self.config.get_aux_locations(self.params['name'], int(self.hud.max)) -# make a scratch pixbuf 7 cards wide for creating our images - self.scratch = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, 8, - 7* int(self.params['card_wd']), int(self.params['card_ht'])) - -# create the stat windows - self.m_windows = {} # windows to put the card images + self.m_windows = {} # windows to put the card images in self.eb = {} # event boxes so we can interact with the mucked cards - self.seen_cards = {} # pixbufs to stash the cards in + self.seen_cards = {} # image objects to stash the cards in - for i in range(1, self.hud.max + 1): - (x, y) = loc[adj[i]] + for i in (range(1, self.hud.max + 1) + ['common']): + if i == 'common': + (x, y) = self.params['layout'][self.hud.max].common + else: + (x, y) = loc[adj[i]] self.m_windows[i] = gtk.Window() - self.m_windows[i].set_decorated(0) + self.m_windows[i].set_decorated(False) self.m_windows[i].set_property("skip-taskbar-hint", True) self.m_windows[i].set_transient_for(self.hud.main_window) + self.m_windows[i].set_focus_on_map(False) self.eb[i] = gtk.EventBox() + self.eb[i].connect("button_press_event", self.button_press_cb) self.m_windows[i].add(self.eb[i]) self.seen_cards[i] = gtk.image_new_from_pixbuf(self.card_images[('B', 'H')]) self.eb[i].add(self.seen_cards[i]) @@ -345,12 +345,17 @@ class Flop_Mucked(Aux_Window): self.m_windows[i].hide() def update_data(self, new_hand_id, db_connection): - pass + cards = db_connection.get_common_cards(new_hand_id) + self.hud.cards['common'] = cards['common'] def update_gui(self, new_hand_id): """Prepare and show the mucked cards.""" + pos = {} + for i, w in self.m_windows.iteritems(): + pos[i] = w.get_position() # I hate this. I don't know why I have to save position and then move back + self.hide_mucked_cards() + displayed_cards = False for (i, cards) in self.hud.cards.iteritems(): - pos = self.m_windows[i].get_position() # need this to reposition later if self.has_cards(cards): # scratch is a working pixbuf, used to assemble the image scratch = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, 8, @@ -364,16 +369,19 @@ class Flop_Mucked(Aux_Window): scratch, x, 0) x = x + int(self.params['card_wd']) self.seen_cards[i].set_from_pixbuf(scratch) - self.m_windows[i].move(pos[0], pos[1]) # I don't know why I need this - self.m_windows[i].show_all() - gobject.timeout_add(int(1000*float(self.params['timeout'])), self.hide_mucked_cards) +# self.m_windows[i].show_all() + self.m_windows[i].move(pos[i][0], pos[i][1]) # here is where I move back + self.m_windows[i].present() + displayed_cards = True + + if displayed_cards and float(self.params['timeout']) > 0: + gobject.timeout_add(int(1000*float(self.params['timeout'])), self.hide_mucked_cards) def destroy(self): """Destroy all of the mucked windows.""" for w in self.m_windows.values(): w.destroy() - def hide_mucked_cards(self): """Hide the mucked card windows.""" # this is the callback from the timeout @@ -381,6 +389,18 @@ class Flop_Mucked(Aux_Window): w.hide() return False # this tells the system to NOT run this timeout again + def button_press_cb(self, widget, event, *args): + """Handle button clicks in the event boxes.""" + if event.button == 3: # right button event + pass + + elif event.button == 2: # middle button event + self.hide_mucked_cards() + + elif event.button == 1: # left button event + window = widget.get_parent() + window.begin_move_drag(event.button, int(event.x_root), int(event.y_root), event.time) + if __name__== "__main__": def destroy(*args): # call back for terminating the main eventloop diff --git a/pyfpdb/SQL.py b/pyfpdb/SQL.py index 162e68f0..2c67cb0a 100644 --- a/pyfpdb/SQL.py +++ b/pyfpdb/SQL.py @@ -361,6 +361,17 @@ class Sql: order by seatNo """ + self.query['get_common_cards'] = """ + select + card1Value, card1Suit, + card2Value, card2Suit, + card3Value, card3Suit, + card4Value, card4Suit, + card5Value, card5Suit + from BoardCards + where handId = %s + """ + self.query['get_action_from_hand'] = """ SELECT street, Players.name, HandsActions.action, HandsActions.amount, actionno FROM Players, HandsActions, HandsPlayers From 88cadd36ad562a9813996d8a28b2bafe045de66e Mon Sep 17 00:00:00 2001 From: Worros Date: Wed, 11 Mar 2009 00:57:13 +0900 Subject: [PATCH 2/2] Fix Everleaf to start parsing 7 Card Stud games Still missing readAntes --- pyfpdb/EverleafToFpdb.py | 15 ++++++++------- pyfpdb/Hand.py | 6 +++--- pyfpdb/HandHistoryConverter.py | 5 +++-- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/pyfpdb/EverleafToFpdb.py b/pyfpdb/EverleafToFpdb.py index 1e6ee335..20cfe16d 100755 --- a/pyfpdb/EverleafToFpdb.py +++ b/pyfpdb/EverleafToFpdb.py @@ -27,7 +27,7 @@ class Everleaf(HandHistoryConverter): # Static regexes re_SplitHands = re.compile(r"\n\n+") - re_GameInfo = re.compile(u"^(Blinds )?(?P\$| €|)(?P[.0-9]+)/(?:\$| €)?(?P[.0-9]+) (?PNL|PL|) (?P(Hold\'em|Omaha|7 Card Stud))", re.MULTILINE) + re_GameInfo = re.compile(u"^(Blinds )?(?P\$| €|)(?P[.0-9]+)/(?:\$| €)?(?P[.0-9]+) (?PNL|PL|) ?(?P(Hold\'em|Omaha|7 Card Stud))", re.MULTILINE) re_HandInfo = re.compile(u".*#(?P[0-9]+)\n.*\n(Blinds )?(?:\$| €|)(?P[.0-9]+)/(?:\$| €|)(?P[.0-9]+) (?P.*) - (?P\d\d\d\d/\d\d/\d\d - \d\d:\d\d:\d\d)\nTable (?P[- a-zA-Z]+)") re_Button = re.compile(r"^Seat (?P