Advertisement
Guest User

Untitled

a guest
Mar 29th, 2012
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.33 KB | None | 0 0
  1. """
  2. shadow priest best in slot shenanigans
  3. by dusknoir
  4. powered by wowhead
  5. """
  6. import urllib.request, urllib.error
  7. import xml.etree.ElementTree as etree
  8. import json
  9. import re
  10.  
  11. class ShadowPriestBestInSlot:
  12. """Shadow priest best-in-slot calculator."""
  13.  
  14. # item-related configuration
  15. level = 80
  16. amount_of_items = 15
  17. fill_sockets = True
  18.  
  19. # scale factors
  20. scale_factors = {
  21. # These scale factors were extracted from:
  22. # http://shadowpriest.com/viewtopic.php?f=62&t=22720
  23. # They were last updated on July 12 2009.
  24. "splpwr": 1,
  25. "critstrkrtng": 0.76,
  26. "hastertng": 0.65,
  27. "spi": 0.34,
  28. "int": 0.23,
  29. "color_socket": 23 if fill_sockets else 0,
  30. "meta_socket": 70 if fill_sockets else 0, # http://shadowpriest.com/viewtopic.php?f=62&t=22720
  31. }
  32.  
  33. # wowhead configuration
  34. slots = {
  35. "back": 16,
  36. "chest": 5,
  37. "feet": 8,
  38. "finger": 11,
  39. "hands": 10,
  40. "head": 1,
  41. "off-hand": 23,
  42. "legs": 7,
  43. "main-hand": 21,
  44. "neck": 2,
  45. "ranged": 15,
  46. "shoulder": 3,
  47. "two-hand": 17,
  48. "waist": 6,
  49. "wrist": 9, }
  50. side = 2 # should be 1 or 2 to avoid duplicates
  51. usable_by = 5 # priests
  52. wowhead_locale = "www" # es/de/fr/ru/en; repr "en" as "www"
  53. wowhead_url = "http://{0}.wowhead.com/?{1}"
  54.  
  55. # declarations
  56. bis_list = {}
  57.  
  58. # internal config
  59. auto_fetch = False
  60.  
  61. def __init__(self, scale_factors=scale_factors, locale=wowhead_locale):
  62. """creates an instance and localizes any supplied arguments"""
  63. if scale_factors != self.scale_factors: self.scale_factors = scale_factors
  64. if locale != self.wowhead_locale: self.wowhead_locale = locale
  65. if self.auto_fetch: self.get_bis()
  66.  
  67. self.slots = {"back": 16}
  68.  
  69. def get_bis(self):
  70. """fetches shadow bis info and returns it"""
  71. for slot, sid in self.slots.items():
  72. args = {
  73. "minrl": self.level, "maxrl": self.level,
  74. "ub": self.usable_by,
  75. "sl": sid,
  76. "si": self.side,
  77. "cr": 123, "crs": 1, "crv": 0,
  78. }
  79. for item in self._item_list(**args):
  80. self.bis_list[slot] = (
  81. item[0],
  82. item[1],
  83. #self._item_pp(self._item_stats(item['id'])
  84. self._item_pp(self._item_stats(49482)),
  85. )
  86.  
  87. def _item_stats(self, iid):
  88. """fetches a wowhead item url and returns it as a xml.dom.minidom element"""
  89. url = self.wowhead_url.format(self.wowhead_locale, "item="+str(iid)+"&xml")
  90. data = urllib.request.urlopen(url).read()
  91. idata = etree.fromstring(data)
  92. idata = "{\n" + idata[0][9].text
  93. idata = idata.replace(",", ",\n")
  94. idata = idata.replace(":", "\": ")
  95. idata = idata.replace("\n", "\n \"")
  96. idata = idata + "\n}"
  97. data = json.loads(idata)
  98. return data
  99.  
  100. def _item_pp(self, idata):
  101. """gets the pseudopower of an item; requires data from _item_info"""
  102. pp = 0
  103. for stat in self.scale_factors.keys():
  104. if stat in idata:
  105. pp += idata[stat] * self.scale_factors[stat]
  106. print(str(pp) + " (added {0} {1})".format(idata[stat], stat))
  107. if "nsockets" in idata:
  108. # determine gem values
  109. for i in range(0, idata['nsockets']):
  110. # if the gem is a meta
  111. if idata['socket'+str(i+1)] is 1:
  112. pp += self.scale_factors['meta_socket']
  113. print(str(pp) + " (added meta gem)")
  114. else:
  115. pp += self.scale_factors['color_socket']
  116. print(str(pp) + " (added color gem)")
  117. return pp
  118.  
  119. def _item_list(self, **kwargs):
  120. """grabs a list of relevant item ids in order of their spell power (for some reason)"""
  121. filters = ";".join("{0}={1}".format(k,v) for k,v in kwargs.items())
  122. url = self.wowhead_url.format(self.wowhead_locale, "items&filter="+filters)
  123. data = urllib.request.urlopen(url).read()
  124. return (
  125. (1, url),
  126. (1, url),
  127. )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement