From 82d96b43ee3dc87a22dde3a375deb1625c62eddf Mon Sep 17 00:00:00 2001 From: Eric Blade Date: Sun, 29 Aug 2010 16:44:29 -0400 Subject: [PATCH 1/5] add Everleaf HH per Steffen's request --- .../NLHE-6max-USD-0.05-0.10-29Aug2010.txt | 416 ++++++++++++++++++ 1 file changed, 416 insertions(+) create mode 100644 pyfpdb/regression-test-files/cash/Everleaf/Flop/NLHE-6max-USD-0.05-0.10-29Aug2010.txt diff --git a/pyfpdb/regression-test-files/cash/Everleaf/Flop/NLHE-6max-USD-0.05-0.10-29Aug2010.txt b/pyfpdb/regression-test-files/cash/Everleaf/Flop/NLHE-6max-USD-0.05-0.10-29Aug2010.txt new file mode 100644 index 00000000..2b2d59d6 --- /dev/null +++ b/pyfpdb/regression-test-files/cash/Everleaf/Flop/NLHE-6max-USD-0.05-0.10-29Aug2010.txt @@ -0,0 +1,416 @@ +Everleaf Gaming Game #196321235 +***** Hand history for game #196321235 ***** +Blinds $0.05/$0.10 NL Hold'em - 2010/08/29 - 20:34:15 +Table Cortland XIV +Seat 6 is the button +Total number of players: 6 +Seat 1: zlodeu123 ( $ 12.40 USD ) +Seat 2: EricBlade ( $ 5 USD ) +Seat 3: gabitzatoade ( $ 5.45 USD ) +Seat 5: N0pr3s3n7 ( $ 10.29 USD ) +Seat 6: Coolcatcool ( $ 8.30 USD ) +zlodeu123: posts small blind [$ 0.05 USD] +EricBlade: posts big blind [$ 0.10 USD] +** Dealing down cards ** +Dealt to EricBlade [ 9h, Qd ] +gabitzatoade folds +N0pr3s3n7 raises [$ 0.35 USD] +Coolcatcool folds +zlodeu123 folds +EricBlade folds +N0pr3s3n7 does not show cards +N0pr3s3n7 wins $ 0.25 USD from main pot + + + +Everleaf Gaming Game #196321319 +***** Hand history for game #196321319 ***** +Blinds $0.05/$0.10 NL Hold'em - 2010/08/29 - 20:34:38 +Table Cortland XIV +Seat 1 is the button +Total number of players: 5 +Seat 1: zlodeu123 ( $ 12.35 USD ) +Seat 2: EricBlade ( $ 4.90 USD ) +Seat 3: gabitzatoade ( $ 5.45 USD ) +Seat 5: N0pr3s3n7 ( $ 10.44 USD ) +Seat 6: Coolcatcool ( $ 8.30 USD ) +EricBlade: posts small blind [$ 0.05 USD] +gabitzatoade: posts big blind [$ 0.10 USD] +** Dealing down cards ** +Dealt to EricBlade [ Qd, 9d ] +N0pr3s3n7 folds +Coolcatcool folds +zlodeu123 folds +EricBlade raises [$ 0.25 USD] +gabitzatoade folds +EricBlade does not show cards +EricBlade wins $ 0.20 USD from main pot + + + +Everleaf Gaming Game #196321394 +***** Hand history for game #196321394 ***** +Blinds $0.05/$0.10 NL Hold'em - 2010/08/29 - 20:34:57 +Table Cortland XIV +Seat 2 is the button +Total number of players: 5 +Seat 1: zlodeu123 ( $ 12.35 USD ) +Seat 2: EricBlade ( $ 5 USD ) +Seat 3: gabitzatoade ( $ 5.35 USD ) +Seat 4: Miazza ( new player ) +Seat 5: N0pr3s3n7 ( $ 10.44 USD ) +Seat 6: Coolcatcool ( $ 8.30 USD ) +gabitzatoade: posts small blind [$ 0.05 USD] +N0pr3s3n7: posts big blind [$ 0.10 USD] +** Dealing down cards ** +Dealt to EricBlade [ 9c, Ac ] +Coolcatcool folds +zlodeu123 folds +EricBlade raises [$ 0.35 USD] +gabitzatoade calls [$ 0.30 USD] +N0pr3s3n7 folds +** Dealing Flop ** [ 4c, Kh, 6h ] +gabitzatoade checks +EricBlade: bets [$ 0.40 USD] +gabitzatoade calls [$ 0.40 USD] +** Dealing Turn ** [ Qh ] +gabitzatoade checks +Miazza has joined the table +EricBlade checks +** Dealing River ** [ Qd ] +gabitzatoade checks +EricBlade checks +EricBlade shows [ 9c, Ac ] a pair of queens +gabitzatoade shows [ 4s, 4d ] a full house, fours full of queens +gabitzatoade wins $ 1.52 USD from main pot with a full house, fours full of queens [ Qh, Qd, 4s, 4d, 4c ] + + + +Everleaf Gaming Game #196321538 +***** Hand history for game #196321538 ***** +Blinds $0.05/$0.10 NL Hold'em - 2010/08/29 - 20:35:34 +Table Cortland XIV +Seat 3 is the button +Total number of players: 6 +Seat 1: zlodeu123 ( $ 12.35 USD ) +Seat 2: EricBlade ( $ 4.25 USD ) +Seat 3: gabitzatoade ( $ 6.12 USD ) +Seat 4: Miazza ( $ 5 USD ) +Seat 5: N0pr3s3n7 ( $ 10.34 USD ) +Seat 6: Coolcatcool ( $ 8.30 USD ) +N0pr3s3n7: posts small blind [$ 0.05 USD] +Coolcatcool: posts big blind [$ 0.10 USD] +** Dealing down cards ** +Dealt to EricBlade [ Kc, Jd ] +zlodeu123 raises [$ 0.35 USD] +EricBlade calls [$ 0.35 USD] +gabitzatoade folds +N0pr3s3n7 folds +Coolcatcool folds +** Dealing Flop ** [ 9s, 3c, Jc ] +zlodeu123: bets [$ 0.60 USD] +EricBlade raises [$ 1.80 USD] +zlodeu123 folds +EricBlade does not show cards +EricBlade wins $ 1.95 USD from main pot + + + +Everleaf Gaming Game #196321707 +***** Hand history for game #196321707 ***** +Blinds $0.05/$0.10 NL Hold'em - 2010/08/29 - 20:36:15 +Table Cortland XIV +Seat 5 is the button +Total number of players: 6 +Seat 1: zlodeu123 ( $ 11.40 USD ) +Seat 2: EricBlade ( $ 5.25 USD ) +Seat 3: gabitzatoade ( $ 6.12 USD ) +Seat 4: Miazza ( $ 5 USD ) +Seat 5: N0pr3s3n7 ( $ 10.29 USD ) +Seat 6: Coolcatcool ( $ 8.20 USD ) +Coolcatcool: posts small blind [$ 0.05 USD] +zlodeu123: posts big blind [$ 0.10 USD] +Miazza sits out +** Dealing down cards ** +Dealt to EricBlade [ 6d, 3d ] +EricBlade folds +gabitzatoade calls [$ 0.10 USD] +N0pr3s3n7 raises [$ 0.30 USD] +Coolcatcool folds +zlodeu123 folds +gabitzatoade calls [$ 0.20 USD] +** Dealing Flop ** [ 8d, 4d, Td ] +gabitzatoade checks +N0pr3s3n7: bets [$ 0.50 USD] +gabitzatoade folds +N0pr3s3n7 does not show cards +N0pr3s3n7 wins $ 0.72 USD from main pot + + + +Everleaf Gaming Game #196321850 +***** Hand history for game #196321850 ***** +Blinds $0.05/$0.10 NL Hold'em - 2010/08/29 - 20:36:52 +Table Cortland XIV +Seat 6 is the button +Total number of players: 6 +Seat 1: zlodeu123 ( $ 11.30 USD ) +Seat 2: EricBlade ( $ 5.25 USD ) +Seat 3: gabitzatoade ( $ 5.82 USD ) +Seat 4: Miazza ( $ 5 USD ) +Seat 5: N0pr3s3n7 ( $ 10.71 USD ) +Seat 6: Coolcatcool ( $ 8.15 USD ) +zlodeu123: posts small blind [$ 0.05 USD] +EricBlade: posts big blind [$ 0.10 USD] +** Dealing down cards ** +Dealt to EricBlade [ Qh, Qd ] +gabitzatoade folds +N0pr3s3n7 folds +Coolcatcool folds +zlodeu123 folds +EricBlade does not show cards +EricBlade wins $ 0.10 USD from main pot + + + +Everleaf Gaming Game #196321947 +***** Hand history for game #196321947 ***** +Blinds $0.05/$0.10 NL Hold'em - 2010/08/29 - 20:37:15 +Table Cortland XIV +Seat 1 is the button +Total number of players: 6 +Seat 1: zlodeu123 ( $ 11.25 USD ) +Seat 2: EricBlade ( $ 5.30 USD ) +Seat 3: gabitzatoade ( $ 5.82 USD ) +Seat 4: Miazza ( $ 5 USD ) +Seat 5: N0pr3s3n7 ( $ 10.71 USD ) +Seat 6: Coolcatcool ( $ 8.15 USD ) +EricBlade: posts small blind [$ 0.05 USD] +gabitzatoade: posts big blind [$ 0.10 USD] +** Dealing down cards ** +Dealt to EricBlade [ Ts, Ks ] +N0pr3s3n7 folds +Coolcatcool folds +zlodeu123 folds +EricBlade raises [$ 0.25 USD] +gabitzatoade folds +EricBlade does not show cards +EricBlade wins $ 0.20 USD from main pot + + + +Everleaf Gaming Game #196322013 +***** Hand history for game #196322013 ***** +Blinds $0.05/$0.10 NL Hold'em - 2010/08/29 - 20:37:32 +Table Cortland XIV +Seat 2 is the button +Total number of players: 6 +Seat 1: zlodeu123 ( $ 11.25 USD ) +Seat 2: EricBlade ( $ 5.40 USD ) +Seat 3: gabitzatoade ( $ 5.72 USD ) +Seat 4: Miazza ( $ 5 USD ) +Seat 5: N0pr3s3n7 ( $ 10.71 USD ) +Seat 6: Coolcatcool ( $ 8.15 USD ) +gabitzatoade: posts small blind [$ 0.05 USD] +Miazza: posts big blind [$ 0.10 USD] +** Dealing down cards ** +Dealt to EricBlade [ 2c, 4s ] +N0pr3s3n7 folds +Coolcatcool folds +zlodeu123 raises [$ 0.35 USD] +EricBlade folds +gabitzatoade calls [$ 0.30 USD] +Miazza folds +** Dealing Flop ** [ Ad, 6d, 6s ] +gabitzatoade checks +zlodeu123: bets [$ 0.60 USD] +gabitzatoade calls [$ 0.60 USD] +** Dealing Turn ** [ Jc ] +gabitzatoade checks +zlodeu123 checks +** Dealing River ** [ Th ] +gabitzatoade checks +zlodeu123 checks +zlodeu123 shows [ Ah, 8d ] two pairs, aces and sixes +gabitzatoade shows [ Ac, 9c ] two pairs, aces and sixes +gabitzatoade wins $ 0.95 USD from main pot with two pairs, aces and sixes [ Ac, Ad, Jc, 6d, 6s ] +zlodeu123 wins $ 0.95 USD from main pot with two pairs, aces and sixes [ Ah, Ad, Jc, 6d, 6s ] + + + +Everleaf Gaming Game #196322188 +***** Hand history for game #196322188 ***** +Blinds $0.05/$0.10 NL Hold'em - 2010/08/29 - 20:38:16 +Table Cortland XIV +Seat 3 is the button +Total number of players: 6 +Seat 1: zlodeu123 ( $ 11.25 USD ) +Seat 2: EricBlade ( $ 5.40 USD ) +Seat 3: gabitzatoade ( $ 5.72 USD ) +Seat 4: Miazza ( $ 4.90 USD ) +Seat 5: N0pr3s3n7 ( $ 10.71 USD ) +Seat 6: Coolcatcool ( $ 8.15 USD ) +Miazza: posts small blind [$ 0.05 USD] +N0pr3s3n7: posts big blind [$ 0.10 USD] +** Dealing down cards ** +Dealt to EricBlade [ 7d, Kd ] +Coolcatcool folds +zlodeu123 folds +EricBlade raises [$ 0.35 USD] +gabitzatoade folds +Miazza folds +N0pr3s3n7 folds +EricBlade does not show cards +EricBlade wins $ 0.25 USD from main pot + + + +Everleaf Gaming Game #196322268 +***** Hand history for game #196322268 ***** +Blinds $0.05/$0.10 NL Hold'em - 2010/08/29 - 20:38:34 +Table Cortland XIV +Seat 4 is the button +Total number of players: 6 +Seat 1: zlodeu123 ( $ 11.25 USD ) +Seat 2: EricBlade ( $ 5.55 USD ) +Seat 3: gabitzatoade ( $ 5.72 USD ) +Seat 4: Miazza ( $ 4.85 USD ) +Seat 5: N0pr3s3n7 ( $ 10.61 USD ) +Seat 6: Coolcatcool ( $ 8.15 USD ) +N0pr3s3n7: posts small blind [$ 0.05 USD] +Coolcatcool: posts big blind [$ 0.10 USD] +** Dealing down cards ** +Dealt to EricBlade [ 6d, Kc ] +zlodeu123 folds +EricBlade folds +gabitzatoade folds +Miazza raises [$ 0.35 USD] +N0pr3s3n7 folds +Coolcatcool raises [$ 0.50 USD] +Miazza folds +Coolcatcool does not show cards +Coolcatcool wins $ 0.75 USD from main pot + + + +Everleaf Gaming Game #196322353 +***** Hand history for game #196322353 ***** +Blinds $0.05/$0.10 NL Hold'em - 2010/08/29 - 20:38:57 +Table Cortland XIV +Seat 5 is the button +Total number of players: 6 +Seat 1: zlodeu123 ( $ 11.25 USD ) +Seat 2: EricBlade ( $ 5.55 USD ) +Seat 3: gabitzatoade ( $ 5.72 USD ) +Seat 4: Miazza ( $ 4.50 USD ) +Seat 5: N0pr3s3n7 ( $ 10.56 USD ) +Seat 6: Coolcatcool ( $ 8.55 USD ) +Coolcatcool: posts small blind [$ 0.05 USD] +zlodeu123: posts big blind [$ 0.10 USD] +** Dealing down cards ** +Dealt to EricBlade [ 3h, 9s ] +EricBlade folds +gabitzatoade folds +Miazza folds +N0pr3s3n7 folds +Coolcatcool folds +zlodeu123 does not show cards +zlodeu123 wins $ 0.10 USD from main pot + + + +Everleaf Gaming Game #196322422 +***** Hand history for game #196322422 ***** +Blinds $0.05/$0.10 NL Hold'em - 2010/08/29 - 20:39:15 +Table Cortland XIV +Seat 6 is the button +Total number of players: 6 +Seat 1: zlodeu123 ( $ 11.30 USD ) +Seat 2: EricBlade ( $ 5.55 USD ) +Seat 3: gabitzatoade ( $ 5.72 USD ) +Seat 4: Miazza ( $ 4.50 USD ) +Seat 5: N0pr3s3n7 ( $ 10.56 USD ) +Seat 6: Coolcatcool ( $ 8.50 USD ) +zlodeu123: posts small blind [$ 0.05 USD] +EricBlade: posts big blind [$ 0.10 USD] +** Dealing down cards ** +Dealt to EricBlade [ Kd, 4h ] +gabitzatoade folds +Miazza folds +N0pr3s3n7 folds +Coolcatcool folds +zlodeu123 folds +EricBlade does not show cards +EricBlade wins $ 0.10 USD from main pot + + + +Everleaf Gaming Game #196322487 +***** Hand history for game #196322487 ***** +Blinds $0.05/$0.10 NL Hold'em - 2010/08/29 - 20:39:32 +Table Cortland XIV +Seat 1 is the button +Total number of players: 6 +Seat 1: zlodeu123 ( $ 11.25 USD ) +Seat 2: EricBlade ( $ 5.60 USD ) +Seat 3: gabitzatoade ( $ 5.72 USD ) +Seat 4: Miazza ( $ 4.50 USD ) +Seat 5: N0pr3s3n7 ( $ 10.56 USD ) +Seat 6: Coolcatcool ( $ 8.50 USD ) +EricBlade: posts small blind [$ 0.05 USD] +gabitzatoade: posts big blind [$ 0.10 USD] +** Dealing down cards ** +Dealt to EricBlade [ 9h, Th ] +Miazza folds +N0pr3s3n7 folds +Coolcatcool folds +zlodeu123 folds +EricBlade raises [$ 0.25 USD] +gabitzatoade calls [$ 0.20 USD] +** Dealing Flop ** [ 3d, 5d, 6c ] +EricBlade checks +gabitzatoade: bets [$ 0.40 USD] +EricBlade folds +gabitzatoade does not show cards +gabitzatoade wins $ 0.57 USD from main pot + + + +Everleaf Gaming Game #196322581 +***** Hand history for game #196322581 ***** +Blinds $0.05/$0.10 NL Hold'em - 2010/08/29 - 20:39:58 +Table Cortland XIV +Seat 2 is the button +Total number of players: 5 +Seat 1: zlodeu123 ( $ 11.25 USD ) +Seat 2: EricBlade ( $ 5.30 USD ) +Seat 3: gabitzatoade ( $ 5.99 USD ) +Seat 4: Miazza ( $ 4.50 USD ) +Seat 5: N0pr3s3n7 ( $ 10.56 USD ) +Seat 6: SAVCOMP ( new player ) +gabitzatoade: posts small blind [$ 0.05 USD] +Miazza: posts big blind [$ 0.10 USD] +** Dealing down cards ** +Dealt to EricBlade [ As, 4d ] +N0pr3s3n7 folds +zlodeu123 raises [$ 0.35 USD] +EricBlade folds +gabitzatoade calls [$ 0.30 USD] +SAVCOMP has joined the table +Miazza folds +** Dealing Flop ** [ 3h, 7h, Tc ] +gabitzatoade checks +zlodeu123 checks +** Dealing Turn ** [ Ks ] +gabitzatoade: bets [$ 0.30 USD] +zlodeu123 raises [$ 0.80 USD] +gabitzatoade calls [$ 0.50 USD] +** Dealing River ** [ Ts ] +gabitzatoade: bets [$ 2 USD] +zlodeu123 calls [$ 2 USD] +gabitzatoade shows [ 8s, 7s ] two pairs, tens and sevens +zlodeu123 shows [ Kd, Ad ] two pairs, kings and tens +zlodeu123 wins $ 6.08 USD from main pot with two pairs, kings and tens [ Ad, Kd, Ks, Tc, Ts ] + + + From 65642e37df572d8c78085b4a54d4ed27c99a2f1c Mon Sep 17 00:00:00 2001 From: Eric Blade Date: Sun, 29 Aug 2010 22:56:00 -0400 Subject: [PATCH 2/5] cherry picking around a patch that didn't work for me --- pyfpdb/Stats.py | 211 ++++++++++++++++++++++++------------------------ 1 file changed, 105 insertions(+), 106 deletions(-) mode change 100755 => 100644 pyfpdb/Stats.py diff --git a/pyfpdb/Stats.py b/pyfpdb/Stats.py old mode 100755 new mode 100644 index ffb1e47e..7c6a11f9 --- a/pyfpdb/Stats.py +++ b/pyfpdb/Stats.py @@ -154,10 +154,10 @@ def vpip(stat_dict, player): _('Voluntarily Put In Pot Pre-Flop%') ) except: return (stat, - '%3.1f' % (0) + '%', - 'v=%3.1f' % (0) + '%', - 'vpip=%3.1f' % (0) + '%', - '(%d/%d)' % (0, 0), + 'NA', + 'v=NA', + 'vpip=NA', + '(0/0)', _('Voluntarily Put In Pot Pre-Flop%') ) @@ -175,10 +175,10 @@ def pfr(stat_dict, player): ) except: return (stat, - '%3.1f' % (0) + '%', - 'p=%3.1f' % (0) + '%', - 'pfr=%3.1f' % (0) + '%', - '(%d/%d)' % (0, 0), + 'NA', + 'p=NA', + 'pfr=NA', + '(0/0)', _('Pre-Flop Raise %') ) @@ -196,10 +196,10 @@ def wtsd(stat_dict, player): ) except: return (stat, - '%3.1f' % (0) + '%', - 'w=%3.1f' % (0) + '%', - 'wtsd=%3.1f' % (0) + '%', - '(%d/%d)' % (0, 0), + 'NA', + 'w=NA', + 'wtsd=NA', + '(0/0)', _('% went to showdown') ) @@ -217,10 +217,10 @@ def wmsd(stat_dict, player): ) except: return (stat, - '%3.1f' % (0) + '%', - 'w=%3.1f' % (0) + '%', - 'wmsd=%3.1f' % (0) + '%', - '(%d/%d)' % (0, 0), + 'NA', + 'w=NA', + 'wmsd=NA', + '(0/0)', _('% won money at showdown') ) @@ -239,10 +239,10 @@ def profit100(stat_dict, player): except: print _("exception calcing p/100: 100 * %d / %d") % (stat_dict[player]['net'], stat_dict[player]['n']) return (stat, - '%.0f' % (0.0), - 'p=%.0f' % (0.0), - 'p/100=%.0f' % (0.0), - '(%d/%d)' % (0, 0), + 'NA', + 'p=NA', + 'p/100=NA', + '(0/0)', _('profit/100hands') ) @@ -261,10 +261,10 @@ def bbper100(stat_dict, player): except: log.info("exception calcing bb/100: "+str(stat_dict[player])) return (stat, - '%.0f' % (0), - 'bb100=%.0f' % (0), - 'bb100=%.0f' % (0), - '(%f)' % (0), + 'NA', + 'bb100=NA', + 'bb100=NA', + '(--)', _('big blinds/100 hands') ) @@ -283,10 +283,10 @@ def BBper100(stat_dict, player): except: log.info(_("exception calcing BB/100: ")+str(stat_dict[player])) return (stat, - '%.0f' % (0.0), - 'BB100=%.0f' % (0.0), - 'BB100=%.0f' % (0.0), - '(%f)' % (0.0), + 'NA', + 'BB100=NA', + 'BB100=NA', + '(--)', _('Big Bets/100 hands') ) @@ -305,13 +305,11 @@ def saw_f(stat_dict, player): ) 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), + 'NA', + 'sf=NA', + 'saw_f=NA', + '(0/0)', _('Flop Seen %') ) @@ -338,6 +336,7 @@ def n(stat_dict, player): _('number hands seen') ) except: + # Number of hands shouldn't ever be "NA"; zeroes are better here return (0, '%d' % (0), 'n=%d' % (0), @@ -360,10 +359,10 @@ def fold_f(stat_dict, player): ) except: return (stat, - '%3.1f' % (0) + '%', - 'ff=%3.1f' % (0) + '%', - 'fold_f=%3.1f' % (0) + '%', - '(%d/%d)' % (0, 0), + 'NA', + 'ff=NA', + 'fold_f=NA', + '(0/0)', _('folded flop/4th') ) @@ -455,10 +454,10 @@ def three_B(stat_dict, player): _('% 3/4 Bet preflop/3rd')) except: return (stat, - '%3.1f' % (0) + '%', - '3B=%3.1f' % (0) + '%', - '3B_pf=%3.1f' % (0) + '%', - '(%d/%d)' % (0, 0), + 'NA', + '3B=NA', + '3B_pf=NA', + '(0/0)', _('% 3/4 Bet preflop/3rd')) def WMsF(stat_dict, player): @@ -474,10 +473,10 @@ def WMsF(stat_dict, player): _('% won$/saw flop/4th')) except: return (stat, - '%3.1f' % (0) + '%', - 'wf=%3.1f' % (0) + '%', - 'w_w_f=%3.1f' % (0) + '%', - '(%d/%d)' % (0, 0), + 'NA', + 'wf=NA', + 'w_w_f=NA', + '(0/0)', _('% won$/saw flop/4th')) def a_freq1(stat_dict, player): @@ -493,10 +492,10 @@ def a_freq1(stat_dict, player): _('Aggression Freq flop/4th')) except: return (stat, - '%3.1f' % (0) + '%', - 'a1=%3.1f' % (0) + '%', - 'a_fq_1=%3.1f' % (0) + '%', - '(%d/%d)' % (0, 0), + 'NA', + 'a1=NA', + 'a_fq_1=NA', + '(0/0)', _('Aggression Freq flop/4th')) def a_freq2(stat_dict, player): @@ -512,10 +511,10 @@ def a_freq2(stat_dict, player): _('Aggression Freq turn/5th')) except: return (stat, - '%3.1f' % (0) + '%', - 'a2=%3.1f' % (0) + '%', - 'a_fq_2=%3.1f' % (0) + '%', - '(%d/%d)' % (0, 0), + 'NA', + 'a2=NA', + 'a_fq_2=NA', + '(0/0)', _('Aggression Freq turn/5th')) def a_freq3(stat_dict, player): @@ -531,10 +530,10 @@ def a_freq3(stat_dict, player): _('Aggression Freq river/6th')) except: return (stat, - '%3.1f' % (0) + '%', - 'a3=%3.1f' % (0) + '%', - 'a_fq_3=%3.1f' % (0) + '%', - '(%d/%d)' % (0, 0), + 'NA', + 'a3=NA', + 'a_fq_3=NA', + '(0/0)', _('Aggression Freq river/6th')) def a_freq4(stat_dict, player): @@ -550,10 +549,10 @@ def a_freq4(stat_dict, player): _('Aggression Freq 7th')) except: return (stat, - '%3.1f' % (0) + '%', - 'a4=%3.1f' % (0) + '%', - 'a_fq_4=%3.1f' % (0) + '%', - '(%d/%d)' % (0, 0), + 'NA', + 'a4=NA', + 'a_fq_4=NA', + '(0/0)', _('Aggression Freq 7th')) def a_freq_123(stat_dict, player): @@ -576,10 +575,10 @@ def a_freq_123(stat_dict, player): _('Post-Flop Aggression Freq')) except: return (stat, - '%2.0f' % (0) + '%', - 'a3=%2.0f' % (0) + '%', - 'a_fq_3=%2.0f' % (0) + '%', - '(%d/%d)' % (0, 0), + 'NA', + 'a3=NA', + 'a_fq_3=NA', + '(0/0)', _('Post-Flop Aggression Freq')) def agg_freq(stat_dict, player): @@ -604,10 +603,10 @@ def agg_freq(stat_dict, player): _('Aggression Freq')) except: return (stat, - '%2.1f' % (0) + '%', - 'af=%3.1f' % (0) + '%', - 'agg_f=%3.1f' % (0) + '%', - '(%d/%d)' % (0, 0), + 'NA', + 'af=NA', + 'agg_f=NA', + '(0/0)', _('Aggression Freq')) def agg_fact(stat_dict, player): @@ -630,10 +629,10 @@ def agg_fact(stat_dict, player): _('Aggression Factor')) except: return (stat, - '%2.2f' % (0) , - 'afa=%2.2f' % (0) , - 'agg_fa=%2.2f' % (0), - '(%d/%d)' % (0, 0), + 'NA', + 'afa=NA', + 'agg_fa=NA', + '(0/0)', _('Aggression Factor')) def cbet(stat_dict, player): @@ -654,10 +653,10 @@ def cbet(stat_dict, player): _('% continuation bet ')) except: return (stat, - '%3.1f' % (0) + '%', - 'cbet=%3.1f' % (0) + '%', - 'cbet=%3.1f' % (0) + '%', - '(%d/%d)' % (0, 0), + 'NA', + 'cbet=NA', + 'cbet=NA', + '(0/0)', _('% continuation bet ')) def cb1(stat_dict, player): @@ -673,10 +672,10 @@ def cb1(stat_dict, player): _('% continuation bet flop/4th')) except: return (stat, - '%3.1f' % (0) + '%', - 'cb1=%3.1f' % (0) + '%', - 'cb_1=%3.1f' % (0) + '%', - '(%d/%d)' % (0, 0), + 'NA', + 'cb1=NA', + 'cb_1=NA', + '(0/0)', _('% continuation bet flop/4th')) def cb2(stat_dict, player): @@ -692,10 +691,10 @@ def cb2(stat_dict, player): _('% continuation bet turn/5th')) except: return (stat, - '%3.1f' % (0) + '%', - 'cb2=%3.1f' % (0) + '%', - 'cb_2=%3.1f' % (0) + '%', - '(%d/%d)' % (0, 0), + 'NA', + 'cb2=NA', + 'cb_2=NA', + '(0/0)', _('% continuation bet turn/5th')) def cb3(stat_dict, player): @@ -711,10 +710,10 @@ def cb3(stat_dict, player): _('% continuation bet river/6th')) except: return (stat, - '%3.1f' % (0) + '%', - 'cb3=%3.1f' % (0) + '%', - 'cb_3=%3.1f' % (0) + '%', - '(%d/%d)' % (0, 0), + 'NA', + 'cb3=NA', + 'cb_3=NA', + '(0/0)', _('% continuation bet river/6th')) def cb4(stat_dict, player): @@ -730,10 +729,10 @@ def cb4(stat_dict, player): _('% continuation bet 7th')) except: return (stat, - '%3.1f' % (0) + '%', - 'cb4=%3.1f' % (0) + '%', - 'cb_4=%3.1f' % (0) + '%', - '(%d/%d)' % (0, 0), + 'NA', + 'cb4=NA', + 'cb_4=NA', + '(0/0)', _('% continuation bet 7th')) def ffreq1(stat_dict, player): @@ -768,10 +767,10 @@ def ffreq2(stat_dict, player): _('% fold frequency turn/5th')) except: return (stat, - '%3.1f' % (0) + '%', - 'ff2=%3.1f' % (0) + '%', - 'ff_2=%3.1f' % (0) + '%', - '(%d/%d)' % (0, 0), + 'NA', + 'ff2=NA', + 'ff_2=NA', + '(0/0)', _('% fold frequency turn/5th')) def ffreq3(stat_dict, player): @@ -787,10 +786,10 @@ def ffreq3(stat_dict, player): _('% fold frequency river/6th')) except: return (stat, - '%3.1f' % (0) + '%', - 'ff3=%3.1f' % (0) + '%', - 'ff_3=%3.1f' % (0) + '%', - '(%d/%d)' % (0, 0), + 'NA', + 'ff3=NA', + 'ff_3=NA', + '(0/0)', _('% fold frequency river/6th')) def ffreq4(stat_dict, player): @@ -806,10 +805,10 @@ def ffreq4(stat_dict, player): _('% fold frequency 7th')) except: return (stat, - '%3.1f' % (0) + '%', - 'ff4=%3.1f' % (0) + '%', - 'ff_4=%3.1f' % (0) + '%', - '(%d/%d)' % (0, 0), + 'NA', + 'ff4=NA', + 'ff_4=NA', + '(0/0)', _('% fold frequency 7th')) if __name__== "__main__": From 54279cafefb1848b23807a419830ceb0cf76881e Mon Sep 17 00:00:00 2001 From: Eric Blade Date: Sun, 29 Aug 2010 23:05:05 -0400 Subject: [PATCH 3/5] Revert "Remove trailing percent symbols from HUD values" This reverts commit b4a08af2b1ec56be83280ad12d4359c645b3d0b3. Conflicts: pyfpdb/Stats.py --- pyfpdb/Stats.py | 262 +++++++++++++++++++++++++----------------------- 1 file changed, 136 insertions(+), 126 deletions(-) diff --git a/pyfpdb/Stats.py b/pyfpdb/Stats.py index 285a45ea..7c6a11f9 100644 --- a/pyfpdb/Stats.py +++ b/pyfpdb/Stats.py @@ -78,6 +78,7 @@ log = logging.getLogger("db") re_Places = re.compile("_[0-9]$") +re_Percent = re.compile("%$") # String manipulation import codecs @@ -87,26 +88,35 @@ def do_tip(widget, tip): _tip = Charset.to_utf8(tip) widget.set_tooltip_text(_tip) - def do_stat(stat_dict, player = 24, stat = 'vpip'): match = re_Places.search(stat) - result = eval("%(stat)s(stat_dict, %(player)d)" % {'stat': stat, 'player': player}) - - # If decimal places have been defined, override result[1] - # NOTE: decimal place override ALWAYS assumes the raw result is a - # fraction (x/100); manual decimal places really only make sense for - # percentage values. Also, profit/100 hands (bb/BB) already default - # to three decimal places anyhow, so they are unlikely override - # candidates. - if match: + if match is None: + result = eval("%(stat)s(stat_dict, %(player)d)" % {'stat': stat, 'player': player}) + else: base = stat[0:-2] places = int(stat[-1:]) - result[1] = '%.*f' % (places, 100.0*result[0]) + result = (0.0, '0.0', 'notset=0', 'notset=0', '0', 'not set') + try: + result = eval("%(stat)s(stat_dict, %(player)d)" % {'stat': base, 'player': player}) + except: + pass # + log.info(_("exception getting stat %s for player %s %s") % (base, str(player), str(sys.exc_info()))) + log.debug(_("Stats.do_stat result = %s") % str(result) ) + + match = re_Percent.search(result[1]) + try: + if match is None: + result = (result[0], "%.*f" % (places, result[0]), result[2], result[3], result[4], result[5]) + else: + result = (result[0], "%.*f%%" % (places, 100*result[0]), result[2], result[3], result[4], result[5]) + except: + log.info(_("error: %s") % str(sys.exc_info())) + raise return result # 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, eg. 33; shown in HUD +# 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 @@ -137,10 +147,10 @@ def vpip(stat_dict, player): try: stat = float(stat_dict[player]['vpip'])/float(stat_dict[player]['n']) return (stat, - '%3.1f' % (100.0*stat), - 'v=%3.1f%%' % (100.0*stat), - 'vpip=%3.1f%%' % (100.0*stat), - '(%d/%d)' % (stat_dict[player]['vpip'], stat_dict[player]['n']), + '%3.1f' % (100*stat) + '%', + 'v=%3.1f' % (100*stat) + '%', + 'vpip=%3.1f' % (100*stat) + '%', + '(%d/%d)' % (stat_dict[player]['vpip'], stat_dict[player]['n']), _('Voluntarily Put In Pot Pre-Flop%') ) except: return (stat, @@ -157,9 +167,9 @@ def pfr(stat_dict, player): try: stat = float(stat_dict[player]['pfr'])/float(stat_dict[player]['n']) return (stat, - '%3.1f' % (100.0*stat), - 'p=%3.1f%%' % (100.0*stat), - 'pfr=%3.1f%%' % (100.0*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']), _('Pre-Flop Raise %') ) @@ -178,10 +188,10 @@ def wtsd(stat_dict, player): try: stat = float(stat_dict[player]['sd'])/float(stat_dict[player]['saw_f']) return (stat, - '%3.1f' % (100.0*stat), - 'w=%3.1f%%' % (100.0*stat), - 'wtsd=%3.1f%%' % (100.0*stat), - '(%d/%d)' % (stat_dict[player]['sd'], stat_dict[player]['saw_f']), + '%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: @@ -199,9 +209,9 @@ def wmsd(stat_dict, player): try: stat = float(stat_dict[player]['wmsd'])/float(stat_dict[player]['sd']) return (stat, - '%3.1f' % (100.0*stat), - 'w=%3.1f%%' % (100.0*stat), - 'wmsd=%3.1f%%' % (100.0*stat), + '%3.1f' % (100*stat) + '%', + 'w=%3.1f' % (100*stat) + '%', + 'wmsd=%3.1f' % (100*stat) + '%', '(%5.1f/%d)' % (float(stat_dict[player]['wmsd']), stat_dict[player]['sd']), _('% won money at showdown') ) @@ -220,9 +230,9 @@ def profit100(stat_dict, player): try: stat = float(stat_dict[player]['net'])/float(stat_dict[player]['n']) return (stat, - '%.0f' % (100.0*stat), - 'p=%.0f' % (100.0*stat), - 'p/100=%.0f' % (100.0*stat), + '%.0f' % (100.0*stat), + 'p=%.0f' % (100.0*stat), + 'p/100=%.0f' % (100.0*stat), '%d/%d' % (stat_dict[player]['net'], stat_dict[player]['n']), _('profit/100hands') ) @@ -242,10 +252,10 @@ def bbper100(stat_dict, player): try: stat = 100.0 * float(stat_dict[player]['net']) / float(stat_dict[player]['bigblind']) return (stat, - '%5.3f' % (stat), - 'bb100=%5.3f' % (stat), - 'bb100=%5.3f' % (stat), - '(%d,%d)' % (100*stat_dict[player]['net'],stat_dict[player]['bigblind']), + '%5.3f' % (stat), + 'bb100=%5.3f' % (stat), + 'bb100=%5.3f' % (stat), + '(%d,%d)' % (100*stat_dict[player]['net'],stat_dict[player]['bigblind']), _('big blinds/100 hands') ) except: @@ -264,10 +274,10 @@ def BBper100(stat_dict, player): try: stat = 50 * float(stat_dict[player]['net']) / float(stat_dict[player]['bigblind']) return (stat, - '%5.3f' % (stat), - 'BB100=%5.3f' % (stat), - 'BB100=%5.3f' % (stat), - '(%d,%d)' % (100*stat_dict[player]['net'],2*stat_dict[player]['bigblind']), + '%5.3f' % (stat), + 'BB100=%5.3f' % (stat), + 'BB100=%5.3f' % (stat), + '(%d,%d)' % (100*stat_dict[player]['net'],2*stat_dict[player]['bigblind']), _('Big Bets/100 hands') ) except: @@ -287,10 +297,10 @@ def saw_f(stat_dict, player): den = float(stat_dict[player]['n']) stat = num/den return (stat, - '%3.1f' % (100.0*stat), - 'sf=%3.1f%%' % (100.0*stat), - 'saw_f=%3.1f%%' % (100.0*stat), - '(%d/%d)' % (stat_dict[player]['saw_f'], stat_dict[player]['n']), + '%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']), _('Flop Seen %') ) except: @@ -341,10 +351,10 @@ def fold_f(stat_dict, player): try: stat = float(stat_dict[player]['fold_2'])/float(stat_dict[player]['saw_f']) return (stat, - '%3.1f' % (100.0*stat), - 'ff=%3.1f%%' % (100.0*stat), - 'fold_f=%3.1f%%' % (100.0*stat), - '(%d/%d)' % (stat_dict[player]['fold_2'], stat_dict[player]['saw_f']), + '%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: @@ -362,10 +372,10 @@ def steal(stat_dict, player): try: stat = float(stat_dict[player]['steal'])/float(stat_dict[player]['steal_opp']) return (stat, - '%3.1f' % (100.0*stat), - 'st=%3.1f%%' % (100.0*stat), - 'steal=%3.1f%%' % (100.0*stat), - '(%d/%d)' % (stat_dict[player]['steal'], stat_dict[player]['steal_opp']), + '%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: @@ -377,10 +387,10 @@ def f_SB_steal(stat_dict, player): try: stat = float(stat_dict[player]['sbnotdef'])/float(stat_dict[player]['sbstolen']) return (stat, - '%3.1f' % (100.0*stat), - 'fSB=%3.1f%%' % (100.0*stat), - 'fSB_s=%3.1f%%' % (100.0*stat), - '(%d/%d)' % (stat_dict[player]['sbnotdef'], stat_dict[player]['sbstolen']), + '%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, @@ -396,10 +406,10 @@ def f_BB_steal(stat_dict, player): try: stat = float(stat_dict[player]['bbnotdef'])/float(stat_dict[player]['bbstolen']) return (stat, - '%3.1f' % (100.0*stat), - 'fBB=%3.1f%%' % (100.0*stat), - 'fBB_s=%3.1f%%' % (100.0*stat), - '(%d/%d)' % (stat_dict[player]['bbnotdef'], stat_dict[player]['bbstolen']), + '%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, @@ -418,10 +428,10 @@ def f_steal(stat_dict, player): stat = float(folded_blind)/float(blind_stolen) return (stat, - '%3.1f' % (100.0*stat), - 'fB=%3.1f%%' % (100.0*stat), - 'fB_s=%3.1f%%' % (100.0*stat), - '(%d/%d)' % (folded_blind, blind_stolen), + '%3.1f' % (100*stat) + '%', + 'fB=%3.1f' % (100*stat) + '%', + 'fB_s=%3.1f' % (100*stat) + '%', + '(%d/%d)' % (folded_blind, blind_stolen), _('% folded blind to steal')) except: return (stat, @@ -437,10 +447,10 @@ def three_B(stat_dict, player): try: stat = float(stat_dict[player]['tb_0'])/float(stat_dict[player]['tb_opp_0']) return (stat, - '%3.1f' % (100.0*stat), - '3B=%3.1f%%' % (100.0*stat), - '3B_pf=%3.1f%%' % (100.0*stat), - '(%d/%d)' % (stat_dict[player]['tb_0'], stat_dict[player]['tb_opp_0']), + '%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, @@ -456,10 +466,10 @@ def WMsF(stat_dict, player): try: stat = float(stat_dict[player]['w_w_s_1'])/float(stat_dict[player]['saw_1']) return (stat, - '%3.1f' % (100.0*stat), - 'wf=%3.1f%%' % (100.0*stat), - 'w_w_f=%3.1f%%' % (100.0*stat), - '(%d/%d)' % (stat_dict[player]['w_w_s_1'], stat_dict[player]['saw_f']), + '%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, @@ -475,9 +485,9 @@ def a_freq1(stat_dict, player): try: stat = float(stat_dict[player]['aggr_1'])/float(stat_dict[player]['saw_f']) return (stat, - '%3.1f' % (100.0*stat), - 'a1=%3.1f%%' % (100.0*stat), - 'a_fq_1=%3.1f%%' % (100.0*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: @@ -494,10 +504,10 @@ def a_freq2(stat_dict, player): try: stat = float(stat_dict[player]['aggr_2'])/float(stat_dict[player]['saw_2']) return (stat, - '%3.1f' % (100.0*stat), - 'a2=%3.1f%%' % (100.0*stat), - 'a_fq_2=%3.1f%%' % (100.0*stat), - '(%d/%d)' % (stat_dict[player]['aggr_2'], stat_dict[player]['saw_2']), + '%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, @@ -513,9 +523,9 @@ def a_freq3(stat_dict, player): try: stat = float(stat_dict[player]['aggr_3'])/float(stat_dict[player]['saw_3']) return (stat, - '%3.1f' % (100.0*stat), - 'a3=%3.1f%%' % (100.0*stat), - 'a_fq_3=%3.1f%%' % (100.0*stat), + '%3.1f' % (100*stat) + '%', + 'a3=%3.1f' % (100*stat) + '%', + 'a_fq_3=%3.1f' % (100*stat) + '%', '(%d/%d)' % (stat_dict[player]['aggr_3'], stat_dict[player]['saw_3']), _('Aggression Freq river/6th')) except: @@ -532,10 +542,10 @@ def a_freq4(stat_dict, player): try: stat = float(stat_dict[player]['aggr_4'])/float(stat_dict[player]['saw_4']) return (stat, - '%3.1f' % (100.0*stat), - 'a4=%3.1f%%' % (100.0*stat), - 'a_fq_4=%3.1f%%' % (100.0*stat), - '(%d/%d)' % (stat_dict[player]['aggr_4'], stat_dict[player]['saw_4']), + '%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, @@ -552,9 +562,9 @@ def a_freq_123(stat_dict, player): stat = float( stat_dict[player]['aggr_1'] + stat_dict[player]['aggr_2'] + stat_dict[player]['aggr_3'] ) / float( stat_dict[player]['saw_1'] + stat_dict[player]['saw_2'] + stat_dict[player]['saw_3']); return (stat, - '%3.1f' % (100.0*stat), - 'afq=%3.1f%%' % (100.0*stat), - 'postf_aggfq=%3.1f%%' % (100.0*stat), + '%3.1f' % (100*stat) + '%', + 'afq=%3.1f' % (100*stat) + '%', + 'postf_aggfq=%3.1f' % (100*stat) + '%', '(%d/%d)' % ( stat_dict[player]['aggr_1'] + stat_dict[player]['aggr_2'] + stat_dict[player]['aggr_3'] @@ -586,10 +596,10 @@ def agg_freq(stat_dict, player): stat = float (bet_raise) / float(post_call + post_fold + bet_raise) return (stat, - '%3.1f' % (100.0*stat), - 'afr=%3.1f%%' % (100.0*stat), - 'agg_fr=%3.1f%%' % (100.0*stat), - '(%d/%d)' % (bet_raise, (post_call + post_fold + bet_raise)), + '%3.1f' % (100*stat) + '%', + 'afr=%3.1f' % (100*stat) + '%', + 'agg_fr=%3.1f' % (100*stat) + '%', + '(%d/%d)' % (bet_raise, (post_call + post_fold + bet_raise)), _('Aggression Freq')) except: return (stat, @@ -636,10 +646,10 @@ def cbet(stat_dict, player): oppt = stat_dict[player]['cb_opp_1']+stat_dict[player]['cb_opp_2']+stat_dict[player]['cb_opp_3']+stat_dict[player]['cb_opp_4'] stat = float(cbets)/float(oppt) return (stat, - '%3.1f' % (100.0*stat), - 'cbet=%3.1f%%' % (100.0*stat), - 'cbet=%3.1f%%' % (100.0*stat), - '(%d/%d)' % (cbets, oppt), + '%3.1f' % (100*stat) + '%', + 'cbet=%3.1f' % (100*stat) + '%', + 'cbet=%3.1f' % (100*stat) + '%', + '(%d/%d)' % (cbets, oppt), _('% continuation bet ')) except: return (stat, @@ -655,10 +665,10 @@ def cb1(stat_dict, player): try: stat = float(stat_dict[player]['cb_1'])/float(stat_dict[player]['cb_opp_1']) return (stat, - '%3.1f' % (100.0*stat), - 'cb1=%3.1f%%' % (100.0*stat), - 'cb_1=%3.1f%%' % (100.0*stat), - '(%d/%d)' % (stat_dict[player]['cb_1'], stat_dict[player]['cb_opp_1']), + '%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, @@ -674,10 +684,10 @@ def cb2(stat_dict, player): try: stat = float(stat_dict[player]['cb_2'])/float(stat_dict[player]['cb_opp_2']) return (stat, - '%3.1f' % (100.0*stat), - 'cb2=%3.1f%%' % (100.0*stat), - 'cb_2=%3.1f%%' % (100.0*stat), - '(%d/%d)' % (stat_dict[player]['cb_2'], stat_dict[player]['cb_opp_2']), + '%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, @@ -693,10 +703,10 @@ def cb3(stat_dict, player): try: stat = float(stat_dict[player]['cb_3'])/float(stat_dict[player]['cb_opp_3']) return (stat, - '%3.1f' % (100.0*stat), - 'cb3=%3.1f%%' % (100.0*stat), - 'cb_3=%3.1f%%' % (100.0*stat), - '(%d/%d)' % (stat_dict[player]['cb_3'], stat_dict[player]['cb_opp_3']), + '%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, @@ -712,9 +722,9 @@ def cb4(stat_dict, player): try: stat = float(stat_dict[player]['cb_4'])/float(stat_dict[player]['cb_opp_4']) return (stat, - '%3.1f' % (100.0*stat), - 'cb4=%3.1f%%' % (100.0*stat), - 'cb_4=%3.1f%%' % (100.0*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: @@ -731,10 +741,10 @@ def ffreq1(stat_dict, player): try: stat = float(stat_dict[player]['f_freq_1'])/float(stat_dict[player]['was_raised_1']) return (stat, - '%3.1f' % (100.0*stat), - 'ff1=%3.1f%%' % (100.0*stat), - 'ff_1=%3.1f%%' % (100.0*stat), - '(%d/%d)' % (stat_dict[player]['f_freq_1'], stat_dict[player]['was_raised_1']), + '%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, @@ -750,10 +760,10 @@ def ffreq2(stat_dict, player): try: stat = float(stat_dict[player]['f_freq_2'])/float(stat_dict[player]['was_raised_2']) return (stat, - '%3.1f' % (100.0*stat), - 'ff2=%3.1f%%' % (100.0*stat), - 'ff_2=%3.1f%%' % (100.0*stat), - '(%d/%d)' % (stat_dict[player]['f_freq_2'], stat_dict[player]['was_raised_2']), + '%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, @@ -769,10 +779,10 @@ def ffreq3(stat_dict, player): try: stat = float(stat_dict[player]['f_freq_3'])/float(stat_dict[player]['was_raised_3']) return (stat, - '%3.1f' % (100.0*stat), - 'ff3=%3.1f%%' % (100.0*stat), - 'ff_3=%3.1f%%' % (100.0*stat), - '(%d/%d)' % (stat_dict[player]['f_freq_3'], stat_dict[player]['was_raised_3']), + '%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, @@ -788,10 +798,10 @@ def ffreq4(stat_dict, player): try: stat = float(stat_dict[player]['f_freq_4'])/float(stat_dict[player]['was_raised_4']) return (stat, - '%3.1f' % (100.0*stat), - 'ff4=%3.1f%%' % (100.0*stat), - 'ff_4=%3.1f%%' % (100.0*stat), - '(%d/%d)' % (stat_dict[player]['f_freq_4'], stat_dict[player]['was_raised_4']), + '%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, @@ -805,7 +815,7 @@ if __name__== "__main__": statlist = dir() misslist = [ "Configuration", "Database", "Charset", "codecs", "encoder" , "do_stat", "do_tip", "GInitiallyUnowned", "gtk", "pygtk" - , "re", "re_Places" + , "re", "re_Percent", "re_Places" ] statlist = [ x for x in statlist if x not in dir(sys) ] statlist = [ x for x in statlist if x not in dir(codecs) ] From e38edced85a18e431d977fb26be333c2a9759e96 Mon Sep 17 00:00:00 2001 From: Eric Blade Date: Mon, 30 Aug 2010 15:54:26 -0400 Subject: [PATCH 4/5] Add FTP Summary for a complete tournament, freeroll satellite, with multiple winners. --- ...roll-Satellite-MultipleWinners-20100830.txt | Bin 0 -> 270068 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 pyfpdb/regression-test-files/tour/FTP/Summary/Freeroll-Satellite-MultipleWinners-20100830.txt diff --git a/pyfpdb/regression-test-files/tour/FTP/Summary/Freeroll-Satellite-MultipleWinners-20100830.txt b/pyfpdb/regression-test-files/tour/FTP/Summary/Freeroll-Satellite-MultipleWinners-20100830.txt new file mode 100644 index 0000000000000000000000000000000000000000..6ba648fd33daea7d95dd789eed9b1b775d0240ff GIT binary patch literal 270068 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%0D}TY&*GeFQ-(@t~$rll?F5+f8>u7`~Lmt#Ezi; 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 Date: Tue, 31 Aug 2010 04:56:28 -0400 Subject: [PATCH 5/5] some code and comment cleanups and clarifications, mo betta fasta. --- pyfpdb/Hud.py | 58 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 19 deletions(-) diff --git a/pyfpdb/Hud.py b/pyfpdb/Hud.py index 8454f433..49dc91cc 100644 --- a/pyfpdb/Hud.py +++ b/pyfpdb/Hud.py @@ -43,8 +43,8 @@ if os.name == 'nt': import win32api import locale -lang=locale.getdefaultlocale()[0][0:2] -if lang=="en": +lang = locale.getdefaultlocale()[0][0:2] +if lang == "en": def _(string): return string else: import gettext @@ -78,7 +78,8 @@ class Hud: # cannot touch the gui if parent is None: # running from cli .. self.parent = self - self.parent = parent + else: + self.parent = parent self.table = table self.config = config self.poker_game = poker_game @@ -95,6 +96,7 @@ class Hud: self.popup_windows = {} self.aux_windows = [] + # configure default font and colors from the configuration (font, font_size) = config.get_default_font(self.table.site) self.colors = config.get_default_colors(self.table.site) self.hud_ui = config.get_hud_ui_parameters() @@ -107,6 +109,7 @@ class Hud: # do we need to add some sort of condition here for dealing with a request for a font that doesn't exist? game_params = config.get_game_parameters(self.poker_game) + # if there are AUX windows configured, set them up (Ray knows how this works, if anyone needs info) if not game_params['aux'] == [""]: for aux in game_params['aux']: aux_params = config.get_aux_parameters(aux) @@ -118,14 +121,16 @@ class Hud: self.creation_attrs = None def create_mw(self): - # Set up a main window for this this instance of the HUD win = gtk.Window() + win.set_skip_taskbar_hint(True) # invisible to taskbar win.set_gravity(gtk.gdk.GRAVITY_STATIC) - win.set_title("%s FPDBHUD" % (self.table.name)) - win.set_skip_taskbar_hint(True) - win.set_decorated(False) - win.set_opacity(self.colors["hudopacity"]) + win.set_title("%s FPDBHUD" % (self.table.name)) # give it a title that we can easily filter out in the window list when Table search code is looking + win.set_decorated(False) # kill titlebars + win.set_opacity(self.colors["hudopacity"]) # set it to configured hud opacity + win.set_focus(None) + win.set_focus_on_map(False) + win.set_accept_focus(False) eventbox = gtk.EventBox() label = gtk.Label(self.hud_ui['label']) @@ -133,6 +138,7 @@ class Hud: win.add(eventbox) eventbox.add(label) + # set it to the desired color of the HUD for this site label.modify_bg(gtk.STATE_NORMAL, self.backgroundcolor) label.modify_fg(gtk.STATE_NORMAL, self.foregroundcolor) @@ -140,9 +146,11 @@ class Hud: eventbox.modify_fg(gtk.STATE_NORMAL, self.foregroundcolor) self.main_window = win + # move it to the table window's X/Y position (0,0 on the table window usually) self.main_window.move(self.table.x, self.table.y) # A popup menu for the main window +# This menu code has become extremely long - is there a better way to do this? menu = gtk.Menu() killitem = gtk.MenuItem(_('Kill This HUD')) @@ -457,6 +465,13 @@ class Hud: log.debug("setting self.hud_params[%s] = %s" % (param, style)) def update_table_position(self): + # get table's X/Y position on the desktop, and relocate all of our child windows to accomodate + # In Windows, we can verify the existence of a Window, with win32gui.IsWindow(). In Linux, there doesn't seem to be a + # way to verify the existence of a Window, without trying to access it, which if it doesn't exist anymore, results in a + # big giant X trap and crash. + # People tell me this is a bad idea, because theoretically, IsWindow() could return true now, but not be true when we actually + # use it, but accessing a dead window doesn't result in a complete windowing system shutdown in Windows, whereas it does + # in X. - Eric if os.name == 'nt': if not win32gui.IsWindow(self.table.number): self.parent.kill_hud(self, self.table.name) @@ -465,8 +480,8 @@ class Hud: return False # anyone know how to do this in unix, or better yet, trap the X11 error that is triggered when executing the get_origin() for a closed window? if self.table.gdkhandle is not None: - (x, y) = self.table.gdkhandle.get_origin() - if self.table.x != x or self.table.y != y: + (x, y) = self.table.gdkhandle.get_origin() # In Windows, this call returns (0,0) if it's an invalid window. In X, the X server is immediately killed. + if self.table.x != x or self.table.y != y: # If the current position does not equal the stored position, save the new position, and then move all the sub windows. self.table.x = x self.table.y = y self.main_window.move(x + self.site_params['xshift'], y + self.site_params['yshift']) @@ -487,10 +502,10 @@ class Hud: return True def on_button_press(self, widget, event): - if event.button == 1: + if event.button == 1: # if primary button, start movement self.main_window.begin_move_drag(event.button, int(event.x_root), int(event.y_root), event.time) return True - if event.button == 3: + if event.button == 3: # if secondary button, popup our main popup window widget.popup(None, None, None, event.button, event.time) return True return False @@ -543,7 +558,7 @@ class Hud: self.config.save() def adj_seats(self, hand, config): - + # determine how to adjust seating arrangements, if a "preferred seat" is set in the hud layout configuration # Need range here, not xrange -> need the actual list adj = range(0, self.max + 1) # default seat adjustments = no adjustment # does the user have a fav_seat? @@ -621,7 +636,7 @@ class Hud: [config.supported_games[self.poker_game].stats[stat].col] = \ config.supported_games[self.poker_game].stats[stat].stat_name - if os.name == "nt": + if os.name == "nt": # we call update_table_position() regularly in Windows to see if we're moving around. See comments on that function for why this isn't done in X. gobject.timeout_add(500, self.update_table_position) def update(self, hand, config): @@ -656,8 +671,8 @@ class Hud: if this_stat.hudcolor != "": window.label[r][c].modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse(this_stat.hudcolor)) else: - window.label[r][c].modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self.colors['hudfgcolor'])) - + window.label[r][c].modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self.colors['hudfgcolor'])) + if this_stat.stat_loth != "": if number[0] < (float(this_stat.stat_loth)/100): window.label[r][c].modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse(this_stat.stat_locolor)) @@ -668,9 +683,12 @@ class Hud: window.label[r][c].set_text(statstring) if statstring != "xxx": # is there a way to tell if this particular stat window is visible already, or no? - window.window.show_all() + unhidewindow = True tip = "%s\n%s\n%s, %s" % (statd['screen_name'], number[5], number[3], number[4]) Stats.do_tip(window.e_box[r][c], tip) + if unhidewindow: #and not window.window.visible: # there is no "visible" attribute in gtk.Window, although the docs seem to indicate there should be + window.window.show_all() + unhidewindow = False def topify_window(self, window): window.set_focus_on_map(False) @@ -686,7 +704,7 @@ class Stat_Window: # 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. - self.window.show_all() + self.window.show() #_all() if event.button == 3: # right button event newpopup = Popup_window(self.window, self) @@ -745,11 +763,13 @@ class Stat_Window: self.window = gtk.Window() self.window.set_decorated(0) + self.window.set_property("skip-taskbar-hint", True) self.window.set_gravity(gtk.gdk.GRAVITY_STATIC) self.window.set_title("%s" % seat) - self.window.set_property("skip-taskbar-hint", True) + self.window.set_focus(None) # set gtk default focus widget for this window to None self.window.set_focus_on_map(False) + self.window.set_accept_focus(False) grid = gtk.Table(rows = game.rows, columns = game.cols, homogeneous = False) self.grid = grid