8 def __init__(self, name, kind):
14 def is_upgrade_for(self, other):
15 return self.kind==other.kind and self.droplevel>other.droplevel
18 def __init__(self, name, kind):
19 super(Armor, self).__init__(name, kind)
23 self.energy_shield = 0
25 def is_upgrade_for(self, other):
26 if (self.armor!=0)!=(other.armor!=0):
28 if (self.evasion!=0)!=(other.evasion!=0):
30 if (self.energy_shield!=0)!=(other.energy_shield!=0):
33 return super(Armor, self).is_upgrade_for(other)
36 def __init__(self, name, kind):
37 super(Weapon, self).__init__(name, kind)
42 class ItemDataParser(html.parser.HTMLParser):
44 super(ItemDataParser, self).__init__()
46 self.in_items_table = False
49 self.ignore_row = False
51 self.current_item = None
52 self.in_heading = False
54 self.current_heading = None
56 def handle_starttag(self, tag, attrs):
59 if n=="class" and v=="itemDataTable":
60 self.in_items_table = True
62 self.ignore_row = False
64 if n=="class" and v.endswith("_mod"):
65 self.ignore_row = True
67 self.current_item = None
72 self.in_heading = True
74 def handle_endtag(self, tag):
76 self.in_items_table = False
81 for it in self.items.values():
82 if not it.upgrade and self.current_item.is_upgrade_for(it):
83 it.upgrade = self.current_item
86 self.in_heading = False
88 def handle_data(self, data):
91 self.current_heading = data
92 self.headings.append(self.current_heading)
93 elif self.in_items_table and self.in_cell and data and not self.ignore_row:
95 self.current_item = self.create_item(data, self.current_heading)
96 self.items[data] = self.current_item
98 self.current_item.droplevel = int(data)
100 self.handle_value(self.column, data)
102 def create_item(self, name, kind):
105 def handle_value(self, column, data):
108 class ArmorDataParser(ItemDataParser):
109 def create_item(self, name, kind):
110 return Armor(name, kind)
112 def handle_value(self, column, data):
114 self.current_item.armor = int(data)
116 self.current_item.evasion = int(data)
118 self.current_item.energy_shield = int(data)
120 class WeaponDataParser(ItemDataParser):
121 def create_item(self, name, kind):
122 return Weapon(name, kind)
124 def handle_value(self, column, data):
126 self.current_item.speed = float(data)
128 self.current_item.dps = float(data)
130 def write_best_category(out, prefix, items, steps):
131 best = ["best", "second"]
133 out.write('category "{}.{}_at_level"\n'.format(prefix, best[steps-1]))
134 out.write("{\n\tor\n\t{\n")
137 for k in range(steps):
138 upgrade = upgrade.upgrade
141 out.write("\t\tand\n\t\t{\n")
143 out.write('\t\t\tbase_type "{}";\n'.format(it.name))
144 out.write("\t\t\titem_level {} {};\n".format(it.droplevel, upgrade.droplevel-1))
146 out.write('\t\t\tbase_type "{}";\n'.format(it.name))
147 out.write("\t\t\tmin_item_level {};\n".format(it.droplevel))
148 out.write("\t\t};\n")
149 out.write("\t};\n};\n")
152 r = requests.get("https://www.pathofexile.com/item-data/armour")
153 p = ArmorDataParser()
154 p.feed(codecs.decode(r.content, r.encoding))
156 types = {"robe": lambda i: (not i.armor and not i.evasion and i.energy_shield),
157 "cloth": lambda i: (not i.armor and i.evasion and i.energy_shield),
158 "leather": lambda i: (not i.armor and i.evasion and not i.energy_shield),
159 "scale": lambda i: (i.armor and i.evasion and not i.energy_shield),
160 "plate": lambda i: (i.armor and not i.evasion and not i.energy_shield),
161 "chain": lambda i: (i.armor and not i.evasion and i.energy_shield)}
163 out = open("armor.txt", "w")
165 for t, f in types.items():
166 items = [i for i in p.items.values() if f(i)]
168 for i in range(1, 3):
169 write_best_category(out, "armor.{}".format(t), items, i)
170 """out.write('category "armor.{}.{}_at_level"\n'.format(t, best[i-1]))
171 out.write("{\n\tor\n\t{\n")
176 n = p.upgrades.get(n, "")
178 next_level = p.items[n].droplevel
180 out.write("\t\tand\n\t\t{\n")
181 out.write('\t\t\tbase_type "{}";\n'.format(it.name))
182 out.write("\t\t\tmax_item_level {};\n".format(next_level-1))
183 out.write("\t\t};\n")
185 out.write('\t\tbase_type "{}";\n'.format(it.name))
186 out.write("\t};\n};\n")"""
188 out.write('category "armor.{}"\n'.format(t))
189 out.write("{\n\tor\n\t{\n")
191 out.write('\t\tbase_type "{}";\n'.format(it.name))
192 out.write("\t};\n};\n")
194 out.write('category "armor"\n{\n\tor\n\t{\n')
196 out.write('\t\tclass "{}";\n'.format(h))
197 out.write("\t};\n};\n")
199 r = requests.get("https://www.pathofexile.com/item-data/weapon")
200 p = WeaponDataParser()
201 p.feed(codecs.decode(r.content, r.encoding))
203 out = open("weapons.txt", "w")
206 items = [i for i in p.items.values() if i.kind==h]
208 for i in range(1, 3):
209 write_best_category(out, "weapon.{}".format(h.lower().replace(' ', '_')), items, i)
211 out.write('category "weapon"\n{\n\tor\n\t{\n')
213 out.write('\t\tclass "{}";\n'.format(h))
214 out.write("\t};\n};\n")
216 if __name__=="__main__":