#!/usr/bin/env python # -*- coding: utf-8 -*- """RushNotesMerge.py EXPERIMENTAL - USE WITH CARE Merge .queue file with hero's note to generate fresh .merge file normal usage $> ./pyfpdb/RushNotesMerge.py "/home/foo/.wine/drive_c/Program Files/Full Tilt Poker/heroname.xml" The generated file can then replace heroname.xml (if all is well). """ # Copyright 2010, "Gimick" of the FPDB project fpdb.sourceforge.net # #This program is free software: you can redistribute it and/or modify #it under the terms of the GNU Affero General Public License as published by #the Free Software Foundation, version 3 of the License. # #This program is distributed in the hope that it will be useful, #but WITHOUT ANY WARRANTY; without even the implied warranty of #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #GNU General Public License for more details. # #You should have received a copy of the GNU Affero General Public License #along with this program. If not, see . #In the "official" distribution you can find the license in agpl-3.0.txt. ######################################################################## #TODO gettextify # Standard Library modules import os import sys from xml.dom import minidom # # overload minidom methods to fix bug where \n is parsed as " ". # described here: http://bugs.python.org/issue7139 # def _write_data(writer, data, isAttrib=False): "Writes datachars to writer." if isAttrib: data = data.replace("\r", " ").replace("\n", " ") data = data.replace("\t", " ") writer.write(data) minidom._write_data = _write_data def writexml(self, writer, indent="", addindent="", newl=""): # indent = current indentation # addindent = indentation to add to higher levels # newl = newline string writer.write(indent+"<" + self.tagName) attrs = self._get_attributes() a_names = attrs.keys() a_names.sort() for a_name in a_names: writer.write(" %s=\"" % a_name) _write_data(writer, attrs[a_name].value, isAttrib=True) writer.write("\"") if self.childNodes: writer.write(">%s"%(newl)) for node in self.childNodes: node.writexml(writer,indent+addindent,addindent,newl) writer.write("%s%s" % (indent,self.tagName,newl)) else: writer.write("/>%s"%(newl)) # For an introduction to overriding instance methods, see # http://irrepupavel.com/documents/python/instancemethod/ instancemethod = type(minidom.Element.writexml) minidom.Element.writexml = instancemethod( writexml, None, minidom.Element) statqueue=0 statupdated=0 statadded=0 def cleannote(textin): if textin.find("~fpdb~") == -1: return textin if textin.find("~ends~") == -1: return textin if textin.find("~fpdb~") > textin.find("~ends~"): return textin return textin[0:textin.find("~fpdb~")] + textin[textin.find("~ends~")+6:] # get out now if parameter not passed try: sys.argv[1] <> "" except: print "A parameter is required, quitting now" print "normal usage is something like:" print '$> ./pyfpdb/RushNotesMerge.py "/home/foo/.wine/drive_c/Program Files/Full Tilt Poker/myhero.xml"' quit() if not os.path.isfile(sys.argv[1]): print "Hero notes file not found, quitting" print "normal usage is something like:" print '$> ./pyfpdb/RushNotesMerge.py "/home/foo/.wine/drive_c/Program Files/Full Tilt Poker/myhero.xml"' quit() if not os.path.isfile((sys.argv[1]+".queue")): print "Nothing found to merge, quitting" print "Did the HUD not get started during the last session?" print "Has the HUD been stopped and started without merging?" quit() print "***************************************************************" print "IMPORTANT: *** Before running this merge: ***" print "Closedown the FullTiltClient and wait for it to completely stop" print "If FullTiltClient was running, run the merge again once it" print "has stopped completely" print "***************************************************************" print print "read from: ", sys.argv[1] print "merge with: ", sys.argv[1]+".queue" #read queue and turn into a dict queuedict = {} xmlqueue = minidom.parse(sys.argv[1]+".queue") notelist = xmlqueue.getElementsByTagName('NOTE') for noteentry in notelist: noteplayer = noteentry.getAttribute("PlayerId") notetext = noteentry.getAttribute("Text") queuedict[noteplayer] = notetext statqueue = statqueue + 1 #read existing player note file xmlnotefile = minidom.parse(sys.argv[1]) notelist = xmlnotefile.getElementsByTagName('NOTE') # #for existing players, empty out existing fpdbtext and refill # for noteentry in notelist: noteplayer = noteentry.getAttribute("PlayerId") if noteplayer in queuedict: existingnote = noteentry.getAttribute("Text") newnote=cleannote(existingnote) newnote = newnote + queuedict[noteplayer] noteentry.setAttribute("Text",newnote) statupdated = statupdated + 1 del queuedict[noteplayer] # #create entries for new players (those remaining in the dictionary) # if len(queuedict) > 0: playerdata=xmlnotefile.lastChild #move to the PLAYERDATA node (assume last one in the list) notesnode=playerdata.childNodes[1] #Find NOTES node for newplayer in queuedict: newentry = xmlnotefile.createElement("NOTE") newentry.setAttribute("PlayerId", newplayer) newentry.setAttribute("Text", queuedict[newplayer]) notesnode.insertBefore(newentry,None) newentry = xmlnotefile.createTextNode("\n") notesnode.insertBefore(newentry,None) statadded=statadded+1 #print xmlnotefile.toprettyxml() mergednotes = open(sys.argv[1]+".merged", 'w') xmlnotefile.writexml(mergednotes) mergednotes.close() xmlnotefile.unlink print "Merged file has been written to: ", sys.argv[1]+".merged" print "" print "number in queue: ", statqueue print "existing players updated: ", statupdated print "new players added: ", statadded print "\n" print "Use a viewer to check the contents of the merge file." print "If you are happy, carry out the following steps:" print "1 Rename or delete the existing notes file (normally .xml" print "2 Rename the .merged file to become the new notes file"