diff --git a/docs/install-in-gentoo.txt b/docs/install-in-gentoo.txt deleted file mode 100644 index 12e20067..00000000 --- a/docs/install-in-gentoo.txt +++ /dev/null @@ -1,67 +0,0 @@ -Last checked: 3 Aug 2008, git99 - -These instructions are for Gentoo GNU/Linux, but if you adapt the steps -installing and starting stuff it should work on any other OS as well. - -1. Install everything. Check if anything is already installed and if it is remove it from the command. - -For mysql: -emerge mysql mysql-python pygtk -av -/etc/init.d/mysql start -rc-update add mysql default - -For postgresql: -emerge postgresql pygresql pygtk -/etc/init.d/postgresql start -rc-update add postgresql default - - -2. Manual configuration steps - -emerge --config mysql -The --config step will ask you for the mysql root user - set this securely, we will create a seperate account for fpdb - -3. Create a mysql user and a database -Now open a shell (aka command prompt aka DOS window): -Click Start, then Run. In the opening window type "cmd" (without the inverted commas) and then click OK. A windows with a black background should open. - -Type (replacing yourPassword with the root password for MySQL you specified during installation): -mysql --user=root --password=yourPassword - -It should say something like this: -Welcome to the MySQL monitor. Commands end with ; or \g. -Your MySQL connection id is 4 -Server version: 5.0.60-log Gentoo Linux mysql-5.0.60-r1 - -Type 'help;' or '\h' for help. Type '\c' to clear the buffer. - -mysql> - - -Now create the actual database. The default name is fpdb, I recommend you keep it. Type this: -CREATE DATABASE fpdb; - -Next you need to create a user. I recommend you use the default fpdb. Type this (replacing newPassword with the password you want the fpdb user to have - this can, but for security shouldn't, be the same as the root mysql password): -GRANT ALL PRIVILEGES ON fpdb.* TO 'fpdb'@'localhost' IDENTIFIED BY 'newPassword' WITH GRANT OPTION; - -Copy the .conf file from this directory to ~/.fpdb/profiles/default.conf and edit it according to what you configured just now, in particular you will definitely have to put in the password you configured. I know this is insecure, will fix it before stable release. - - -4. Guided installation steps -Run the GUI as described in readme-user and click the menu database -> recreate tables - -That's it! Now see readme-user.txt for usage instructions. - - -License -======= -Trademarks of third parties have been used under Fair Use or similar laws. - -Copyright 2008 Steffen Jobbagy-Felso -Permission is granted to copy, distribute and/or modify this -document under the terms of the GNU Free Documentation License, -Version 1.2 as published by the Free Software Foundation; with -no Invariant Sections, no Front-Cover Texts, and with no Back-Cover -Texts. A copy of the license can be found in fdl-1.2.txt - -The program itself is licensed under AGPLv3, see agpl-3.0.txt diff --git a/docs/install-in-ubuntu.txt b/docs/install-in-ubuntu.txt new file mode 100644 index 00000000..b3843eca --- /dev/null +++ b/docs/install-in-ubuntu.txt @@ -0,0 +1,46 @@ +Last checked: 1 Sep, p74 + +These instructions are for any Ubuntu Linux, but except for the name of the package management software it should be identical on other Linux distributions. + +Using the package manager (I think it's called synaptics) install the dependencies: mysql, python, mysql-python, pygtk +I don't use ubuntu but I'd imagine it will at some point prompt you for a MySQL root password enter one and when it's done installing everything open a shell/terminal and type this: +mysql --user=root --password=YourMysqlRootPassword +It should say something like this: + +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 4 +Server version: 5.0.60-log Ubuntu Linux mysql-5.0.60-r1 + +Type 'help;' or '\h' for help. Type '\c' to clear the buffer. + +mysql> + +Now type this: +CREATE DATABASE fpdb; + +Next you need to create a user. Type this (replacing newPassword with the password you want the fpdb user to have - this can, but for security shouldn't, be the same as the root mysql password): +GRANT ALL PRIVILEGES ON fpdb.* TO 'fpdb'@'localhost' IDENTIFIED BY 'newPassword' WITH GRANT OPTION; + +Then download one of the alpha2 archives from the sourceforge page at https://sourceforge.net/projects/fpdb/ and unpack it into a folder of your choice. + +Next create a directory called .fpdb (the . at the beginning is important) in your home directory, e.g. /home/steffen/.fpdb +Then copy the default.conf file from the docs directory of the archive into this new folder. +Finally edit default.conf with any texteditor and enter the fpdb password you entered above (in the GRANT ALL... command). + +This should be it, try double clicking pyfpdb/fpdb.py or open it from a shell with python /path/to/fpdb/pyfpdb/fpdb.py + +Now see readme-user.txt for usage instructions. + + +License +======= +Trademarks of third parties have been used under Fair Use or similar laws. + +Copyright 2008 Steffen Jobbagy-Felso +Permission is granted to copy, distribute and/or modify this +document under the terms of the GNU Free Documentation License, +Version 1.2 as published by the Free Software Foundation; with +no Invariant Sections, no Front-Cover Texts, and with no Back-Cover +Texts. A copy of the license can be found in fdl-1.2.txt + +The program itself is licensed under AGPLv3, see agpl-3.0.txt diff --git a/docs/known-bugs-and-planned-features.txt b/docs/known-bugs-and-planned-features.txt index ac6e15c0..3e7ad0cc 100644 --- a/docs/known-bugs-and-planned-features.txt +++ b/docs/known-bugs-and-planned-features.txt @@ -2,13 +2,16 @@ todolist (db=database, imp=importer, tv=tableviewer) Everything is subject to change and the order does not indicate priority. Patches for any of these or other features are very welcome, see readme-overview.txt for contacts. Please also see db-todo.txt -alpha3 (release 1Sep?) +alpha3 (release 1-2Sep?) ====== (fixed by ray) auto import only runs on one file per start find correct sf logo link show database version error in GUI and use fpdb_db class const for it, add it to title -update install-in-gentoo.txt and install-in-ubuntu.txt +update install-in-gentoo on website +update ebuild and ubuntu guide for HUD_config.xml +implement stud HudCache +implement storeHudCache for stud base anonymiser script to generate testdata without making a dozen find&replace all... remember to replace hand no with running no specify NOT NULL on almost all table columns @@ -18,23 +21,29 @@ make windows use correct language version of Appdata, e.g. Anwendungdaten. http: ftp: read maxSeats make sure totalProfit shows actual profit rather than winnings. update abbreviations.txt -(steffen) finish bringing back tourney export settings[hud-defaultInterval] to conf fill check-/call-raise cache fields -table with data for graphs for SD/F, W$wSF, W$@SD printhand each and the 2/3 relevant printplayerflags respectively on ps-lhe-ring-successful-steal-by-cutoff.txt and ps-lhe-ring-call-3B-preflop-cb-no2b.txt -before beta -=========== -ebuild: USE gtk, set permissions in it, copy docs to correct place, use games eclass or whatever to get games group notice, git-ebuild, get it into sunrise -make hud display W$SD etc as fraction. -add dedicated update page -update status or make a support matrix table for website +alpha4 (release 8Sep?) +====== +Everything that didn't make it into alpha3 +Import draw (maybe without HudCache for a start) +table with data for graphs for SD/F, W$wSF, W$@SD separate db table design version and last bugfix in importer change tabledesign VALIGN finish updating filelist finish todos in git instructions +debian/ubuntu package + +before beta +=========== +finish bringing back tourney +ebuild: USE gtk, set permissions in it, copy docs to correct place, use games eclass or whatever to get games group notice, git-ebuild, get it into sunrise +make hud display W$SD etc as fraction. +add dedicated update page +update status or make a support matrix table for website fix up bg colours in tv move version into seperate file for fpdb gui and db SD/F, W$wsF, W$@SD too low as reported by daedal in 2+2 forum on 12/13aug @@ -58,7 +67,6 @@ implement error file in importer catch index error, type error, file not found error use different colours according to classification. -add stud, razz back to imp/tv but with less seperate codepathes move prepare-git.sh and create-release.sh to utils offer not storing db password change definition of bet to exclude bring in @@ -68,7 +76,6 @@ fix GUI's load profile HUD config wizard file permission script, use games group -change stud street storage from 3-7 to 0-4 throughout (possibly best way is to just shrink the holding array in fpdb_simple.createArrays make bulk importer display a grand total in the GUI change save_to_db into one method and probably move into parse_logic Any comment or print with "todo" in it in the sourcecode except what is marked todo in the menu diff --git a/pyfpdb/fpdb_import.py b/pyfpdb/fpdb_import.py index 9522abc6..f53f6ed1 100755 --- a/pyfpdb/fpdb_import.py +++ b/pyfpdb/fpdb_import.py @@ -100,8 +100,6 @@ def import_file_dict(options, settings, callHud=True): hand=fpdb_simple.filterCrap(site, hand, isTourney) try: - if (category=="razz" or category=="studhi" or category=="studhilo"): - raise fpdb_simple.FpdbError ("stud/razz currently out of order") handsId=fpdb_parse_logic.mainParser(db, cursor, site, category, hand) db.commit() diff --git a/pyfpdb/fpdb_parse_logic.py b/pyfpdb/fpdb_parse_logic.py index f439d1c5..a33f040a 100644 --- a/pyfpdb/fpdb_parse_logic.py +++ b/pyfpdb/fpdb_parse_logic.py @@ -22,7 +22,10 @@ import fpdb_save_to_db #parses a holdem hand def mainParser(db, cursor, site, category, hand): - #print "hand:",hand + if (category=="holdem" or category=="omahahi" or category=="omahahilo"): + base="hold" + else: + base="stud" #part 0: create the empty arrays lineTypes=[] #char, valid values: header, name, cards, action, win, rake, ignore lineStreets=[] #char, valid values: (predeal, preflop, flop, turn, river) @@ -53,7 +56,7 @@ def mainParser(db, cursor, site, category, hand): #part 2: classify lines by type (e.g. cards, action, win, sectionchange) and street fpdb_simple.classifyLines(hand, category, lineTypes, lineStreets) - + #part 3: read basic player info #3a read player names, startcashes for i in range (len(hand)): #todo: use maxseats+1 here. @@ -68,11 +71,8 @@ def mainParser(db, cursor, site, category, hand): fpdb_simple.createArrays(category, len(names), cardValues, cardSuits, antes, winnings, rakes, actionTypes, actionAmounts, actionNos, actionTypeByNo) #3b read positions - if (category=="holdem" or category=="omahahi" or category=="omahahilo"): + if base=="hold": positions = fpdb_simple.parsePositions (hand, names) - base="hold" - else: - base="stud" #part 4: take appropriate action for each line based on linetype for i in range(len(hand)): @@ -104,7 +104,7 @@ def mainParser(db, cursor, site, category, hand): #part 5: final preparations, then call fpdb_save_to_db.saveHoldem with # the arrays as they are - that file will fill them. fpdb_simple.convertCardValues(cardValues) - if (category=="holdem" or category=="omahahi" or category=="omahahilo"): + if base=="hold": fpdb_simple.convertCardValuesBoard(boardValues) fpdb_simple.convertBlindBet(actionTypes, actionAmounts) fpdb_simple.checkPositions(positions) @@ -116,7 +116,12 @@ def mainParser(db, cursor, site, category, hand): totalWinnings=0 for i in range(len(winnings)): totalWinnings+=winnings[i] - hudImportData=fpdb_simple.generateHudCacheData(playerIDs, category, actionTypes, actionTypeByNo, winnings, totalWinnings, positions) + + if base=="hold": + hudImportData=fpdb_simple.generateHudCacheData(playerIDs, category, actionTypes, actionTypeByNo, winnings, totalWinnings, positions) + else: + print "todo: stud HudCache" + hudImportData=None if isTourney: ranks=[] @@ -124,24 +129,24 @@ def mainParser(db, cursor, site, category, hand): ranks.append(0) payin_amounts=fpdb_simple.calcPayin(len(names), buyin, fee) - if (category=="holdem" or category=="omahahi" or category=="omahahilo"): - result = fpdb_save_to_db.tourney_holdem_omaha(cursor, category, siteTourneyNo, buyin, fee, knockout, entries, prizepool, tourneyStartTime, payin_amounts, ranks, tourneyTypeId, siteID, + if base=="hold": + result = fpdb_save_to_db.tourney_holdem_omaha(cursor, base, category, siteTourneyNo, buyin, fee, knockout, entries, prizepool, tourneyStartTime, payin_amounts, ranks, tourneyTypeId, siteID, siteHandNo, gametypeID, handStartTime, names, playerIDs, startCashes, positions, cardValues, cardSuits, boardValues, boardSuits, winnings, rakes, actionTypes, actionAmounts, actionNos, hudImportData, maxSeats, tableName, seatNos) - elif (category=="razz" or category=="studhi" or category=="studhilo"): - raise fpdb_simple.FpdbError ("stud/razz are currently broken") - result = fpdb_save_to_db.tourney_stud(cursor, category, siteTourneyNo, buyin, fee, + elif base=="stud": + result = fpdb_save_to_db.tourney_stud(cursor, base, category, siteTourneyNo, buyin, fee, knockout, entries, prizepool, tourneyStartTime, payin_amounts, ranks, siteHandNo, siteID, gametypeID, handStartTime, names, playerIDs, startCashes, antes, cardValues, cardSuits, winnings, rakes, - actionTypes, actionAmounts, hudImportData) + actionTypes, actionAmounts, actionNos, hudImportData, maxSeats, tableName, seatNos) + else: + raise fpdb_simple.FpdbError ("unrecognised category") else: - if (category=="holdem" or category=="omahahi" or category=="omahahilo"): - result = fpdb_save_to_db.ring_holdem_omaha(cursor, category, siteHandNo, gametypeID, handStartTime, names, playerIDs, startCashes, positions, cardValues, cardSuits, boardValues, boardSuits, winnings, rakes, actionTypes, actionAmounts, actionNos, hudImportData, maxSeats, tableName, seatNos) - elif (category=="razz" or category=="studhi" or category=="studhilo"): - raise fpdb_simple.FpdbError ("stud/razz are currently broken") - result = fpdb_save_to_db.ring_stud(cursor, category, siteHandNo, gametypeID, + if base=="hold": + result = fpdb_save_to_db.ring_holdem_omaha(cursor, base, category, siteHandNo, gametypeID, handStartTime, names, playerIDs, startCashes, positions, cardValues, cardSuits, boardValues, boardSuits, winnings, rakes, actionTypes, actionAmounts, actionNos, hudImportData, maxSeats, tableName, seatNos) + elif base=="stud": + result = fpdb_save_to_db.ring_stud(cursor, base, category, siteHandNo, gametypeID, handStartTime, names, playerIDs, startCashes, antes, cardValues, - cardSuits, winnings, rakes, actionTypes, actionAmounts, hudImportData) + cardSuits, winnings, rakes, actionTypes, actionAmounts, actionNos, hudImportData, maxSeats, tableName, seatNos) else: raise fpdb_simple.FpdbError ("unrecognised category") db.commit() diff --git a/pyfpdb/fpdb_save_to_db.py b/pyfpdb/fpdb_save_to_db.py index a3ec95a5..dccbcba7 100644 --- a/pyfpdb/fpdb_save_to_db.py +++ b/pyfpdb/fpdb_save_to_db.py @@ -21,25 +21,23 @@ import fpdb_simple #stores a stud/razz hand into the database -def ring_stud(cursor, category, site_hand_no, gametype_id, hand_start_time, - names, player_ids, start_cashes, antes, card_values, card_suits, - winnings, rakes, action_types, action_amounts, hudImportData): - fpdb_simple.fillCardArrays(len(names), 7, card_values, card_suits) +def ring_stud(cursor, base, category, site_hand_no, gametype_id, hand_start_time, names, player_ids, start_cashes, antes, card_values, card_suits, winnings, rakes, action_types, action_amounts, actionNos, hudImportData, maxSeats, tableName, seatNos): + fpdb_simple.fillCardArrays(len(names), base, category, card_values, card_suits) - hands_id=fpdb_simple.storeHands(cursor, site_hand_no, gametype_id, hand_start_time, names) + hands_id=fpdb_simple.storeHands(cursor, site_hand_no, gametype_id, hand_start_time, names, tableName, maxSeats) hands_players_ids=fpdb_simple.store_hands_players_stud(cursor, hands_id, player_ids, start_cashes, antes, card_values, card_suits, winnings, rakes) - fpdb_simple.storeHudData(cursor, category, player_ids, hudImportData) + fpdb_simple.storeHudCache(cursor, category, gametype_id, player_ids, hudImportData) - fpdb_simple.storeActions(cursor, hands_players_ids, action_types, action_amounts) + fpdb_simple.storeActions(cursor, hands_players_ids, action_types, action_amounts, actionNos) return hands_id #end def ring_stud -def ring_holdem_omaha(cursor, category, site_hand_no, gametype_id, hand_start_time, names, player_ids, start_cashes, positions, card_values, card_suits, board_values, board_suits, winnings, rakes, action_types, action_amounts, actionNos, hudImportData, maxSeats, tableName, seatNos): +def ring_holdem_omaha(cursor, base, category, site_hand_no, gametype_id, hand_start_time, names, player_ids, start_cashes, positions, card_values, card_suits, board_values, board_suits, winnings, rakes, action_types, action_amounts, actionNos, hudImportData, maxSeats, tableName, seatNos): """stores a holdem/omaha hand into the database""" - fpdb_simple.fillCardArrays(len(names), category, card_values, card_suits) + fpdb_simple.fillCardArrays(len(names), base, category, card_values, card_suits) fpdb_simple.fill_board_cards(board_values, board_suits) hands_id=fpdb_simple.storeHands(cursor, site_hand_no, gametype_id, hand_start_time, names, tableName, maxSeats) @@ -54,10 +52,10 @@ def ring_holdem_omaha(cursor, category, site_hand_no, gametype_id, hand_start_ti return hands_id #end def ring_holdem_omaha -def tourney_holdem_omaha(cursor, category, siteTourneyNo, buyin, fee, knockout, entries, prizepool, tourney_start, payin_amounts, ranks, tourneyTypeId, siteId, #end of tourney specific params +def tourney_holdem_omaha(cursor, base, category, siteTourneyNo, buyin, fee, knockout, entries, prizepool, tourney_start, payin_amounts, ranks, tourneyTypeId, siteId, #end of tourney specific params site_hand_no, gametype_id, hand_start_time, names, player_ids, start_cashes, positions, card_values, card_suits, board_values, board_suits, winnings, rakes, action_types, action_amounts, actionNos, hudImportData, maxSeats, tableName, seatNos): """stores a tourney holdem/omaha hand into the database""" - fpdb_simple.fillCardArrays(len(names), category, card_values, card_suits) + fpdb_simple.fillCardArrays(len(names), base, category, card_values, card_suits) fpdb_simple.fill_board_cards(board_values, board_suits) tourney_id=fpdb_simple.store_tourneys(cursor, tourneyTypeId, siteTourneyNo, entries, prizepool, tourney_start) @@ -75,13 +73,13 @@ def tourney_holdem_omaha(cursor, category, siteTourneyNo, buyin, fee, knockout, return hands_id #end def tourney_holdem_omaha -def tourney_stud(cursor, category, site_tourney_no, buyin, fee, knockout, entries, prizepool, +def tourney_stud(cursor, base, category, site_tourney_no, buyin, fee, knockout, entries, prizepool, tourney_start, payin_amounts, ranks, #end of tourney specific params site_hand_no, site_id, gametype_id, hand_start_time, names, player_ids, start_cashes, antes, card_values, card_suits, winnings, rakes, action_types, action_amounts, hudImportData): #stores a tourney stud/razz hand into the database - fpdb_simple.fillCardArrays(len(names), 7, card_values, card_suits) + fpdb_simple.fillCardArrays(len(names), base, category, card_values, card_suits) tourney_id=fpdb_simple.store_tourneys(cursor, site_id, site_tourney_no, buyin, fee, knockout, entries, prizepool, tourney_start) diff --git a/pyfpdb/fpdb_simple.py b/pyfpdb/fpdb_simple.py index b420bd26..55210b82 100644 --- a/pyfpdb/fpdb_simple.py +++ b/pyfpdb/fpdb_simple.py @@ -97,19 +97,19 @@ def classifyLines(hand, category, lineTypes, lineStreets): currentStreet="river" elif (hand[i].startswith("*** 3")): lineTypes.append("ignore") - currentStreet=3 + currentStreet=0 elif (hand[i].startswith("*** 4")): lineTypes.append("ignore") - currentStreet=4 + currentStreet=1 elif (hand[i].startswith("*** 5")): lineTypes.append("ignore") - currentStreet=5 + currentStreet=2 elif (hand[i].startswith("*** 6")): lineTypes.append("ignore") - currentStreet=6 + currentStreet=3 elif (hand[i].startswith("*** 7") or hand[i]=="*** RIVER ***"): lineTypes.append("ignore") - currentStreet=7 + currentStreet=4 elif (hand[i].find(" shows [")!=-1): lineTypes.append("cards") elif (hand[i].startswith("Table '")): @@ -119,10 +119,8 @@ def classifyLines(hand, category, lineTypes, lineStreets): lineStreets.append(currentStreet) #end def classifyLines -#calculates the actual bet amounts in the given amount array and changes it accordingly. def convert3B4B(site, category, limit_type, actionTypes, actionAmounts): - #print "convert3B4B: actionTypes:", actionTypes - #print "convert3B4B: actionAmounts pre_Convert",actionAmounts + """calculates the actual bet amounts in the given amount array and changes it accordingly.""" for i in range (len(actionTypes)): for j in range (len(actionTypes[i])): bets=[] @@ -253,14 +251,16 @@ def fill_board_cards(board_values, board_suits): board_suits.append("x") #end def fill_board_cards -def fillCardArrays(player_count, category, card_values, card_suits): +def fillCardArrays(player_count, base, category, card_values, card_suits): """fills up the two card arrays""" if (category=="holdem"): cardCount=2 elif (category=="omahahi" or category=="omahahilo"): cardCount=4 + elif base=="stud": + cardCount=7 else: - raise fpdb_simple.FpdbError ("invalid category: category") + raise fpdb_simple.FpdbError ("invalid category:", category) for i in range (player_count): while (len(card_values[i])=1: generateFoldToCB(1, player_ids, didStreet1CB, street1CBDone, foldToStreet1CBChance, foldToStreet1CBDone, actionTypeByNo) @@ -1786,8 +1779,8 @@ def generateHudCacheData(player_ids, category, action_types, actionTypeByNo, win def generateFoldToCB(street, playerIDs, didStreetCB, streetCBDone, foldToStreetCBChance, foldToStreetCBDone, actionTypeByNo): """fills the passed foldToStreetCB* arrays appropriately depending on the given street""" - print "beginning of generateFoldToCB, street:", street, "len(actionTypeByNo):", len(actionTypeByNo) - print "len(actionTypeByNo[street]):",len(actionTypeByNo[street]) + #print "beginning of generateFoldToCB, street:", street, "len(actionTypeByNo):", len(actionTypeByNo) + #print "len(actionTypeByNo[street]):",len(actionTypeByNo[street]) firstCBReaction=0 for action in range(len(actionTypeByNo[street])): if actionTypeByNo[street][action][1]=="bet": @@ -1946,7 +1939,7 @@ def storeHudCache(cursor, category, gametypeId, playerIds, hudImportData): row[51], row[52], row[53], row[54], row[55], row[56], row[57], row[58], row[59], row[60], row[1], row[2], row[3], row[4], row[5])) else: - raise FpdbError("todo") + print "todo: implement storeHudCache for stud base" #end def storeHudCache def store_tourneys(cursor, tourneyTypeId, siteTourneyNo, entries, prizepool, startTime):