#!/usr/bin/python import xml.etree.ElementTree as ET import getarmorydata, cgi, sys, datetime import fcntl # For file locking, unix-only. If you want to run this on win32, # just forget about file locking or use a cross-platform solution. def returnWithResult(r): print 'Content-type: text/xml\n\n' print ET.tostring(r) sys.exit(0) result = ET.Element('result') form = cgi.FieldStorage() realm = form.getfirst('realm') character = form.getfirst('character') region = form.getfirst('region', 'US') data = getarmorydata.getCharacterData(realm, character, region) # TODO - not getting the XML-based page dataXML = ET.XML(data) returnWithResult(dataXML) charInfoXML = dataXML.find('characterInfo') charXML = charInfoXML.find('character') if (charXML == None): result.set('errorCode', '1') result.set('errorText', 'Character %s not found on realm %s in %s region' % (character, realm, region)) returnWithResult(result) cl = charXML.get('class') if (cl != 'Mage'): result.set('errorCode', '1') result.set('errorText', 'Character %s on realm %s is of class %s, not a Mage!' % (character, realm, cl)) returnWithResult(result) charTabXML = charInfoXML.find('characterTab') frostDmg = charTabXML.find('spell/bonusDamage/frost').get('value') fireDmg = charTabXML.find('spell/bonusDamage/fire').get('value') intellect = charTabXML.find('baseStats/intellect').get('effective') spellCrit = charTabXML.find('spell/critChance').get('rating') spellHit = charTabXML.find('spell/hitRating').get('value') # Correct for arcane intellect if it's not on. buffList = charTabXML.findall('buffs/spell') foundArcaneIntellect = False for buff in buffList: if (buff.get('name') == 'Arcane Intellect'): foundArcaneIntellect = True if (not foundArcaneIntellect): # +40 intellect is the highest level of arcane intellect, so use that. intellect = str(int(intellect) + 40) talentData = getarmorydata.getCharacterTalentData(realm, character) talentXML = ET.XML(talentData).find('characterInfo/talentTab/talentTree') if (talentXML == None): result.set('errorCode', '1') result.set('errorText', 'Unable to get talents for character %s!' % character) returnWithResult(result) talent = talentXML.get('value') # Log the users, so we can have some test cases when making changes. if not (realm.lower() == 'maiev' and character.lower() == 'tsouzer'): gotten = open('gottenmages', 'a') # Lock the file to avoid blasting it fcntl.flock(gotten.fileno(), fcntl.LOCK_EX) gotten.write("%s %s %s\n" % (realm, character, datetime.datetime.now())) gotten.close() result.set('errorCode', '0') dataXML = ET.SubElement(result, 'data') dataXML.set('intellect', intellect) dataXML.set('frostDmg', frostDmg) dataXML.set('fireDmg', fireDmg) dataXML.set('spellCrit', spellCrit) dataXML.set('spellHit', spellHit) dataXML.set('talents', talent) # TODO - can't find spell haste dataXML.set('spellHaste', '0') returnWithResult(result)