%load_ext autoreload
%autoreload 2
import requests
MAIN_ENDPOINT = f"https://poe.ninja/api/data/0/getbuildoverview"
PARAMS = {"overview": "archnemesis", "type": "exp", "language": "en"}
def try_get_builds(url, params):
r = requests.get(url=url, params=params)
try:
return r.json()
except:
return {}
data = try_get_builds(MAIN_ENDPOINT, PARAMS)
def get_user_ascendancy(user_idx: int, api_data: dict):
asc_idx = api_data["classes"][user_idx]
return api_data["classNames"][asc_idx]
def summarize_player(idx, data):
classes = data['classes']
names = data['names']
name = names[idx]
person_class = classes[idx]
class_name = get_user_ascendancy(idx, data)
return (name, person_class, class_name)
def get_skill_enjoyers(skills, data):
enjoyers = []
for skill_id, skill_map in data['activeSkillUse'].items():
if int(skill_id) in skills:
enjoyers = [data['names'][x] for x in skill_map]
return enjoyers
solya_si = 9391 # case study randomly chosen necro. they are using (phantasmal) cremation as their main skill
print(summarize_player(solya_si, data))
cremation = 115 # conductivity in allSkills vs cremation in activeSkills, 69 in skill details
phant_cremation = 412 # divergent multistrike in allSkills vs phantasmal_cremation in activeSkills
crema_enjoyers = get_skill_enjoyers([cremation, phant_cremation], data)
print(crema_enjoyers[:10]) # a lot of duplicated names and mostly aurabot/aurastacker names e.g. mostly Ascendants, notably Solya_Si is NOT in here
('시불세끼정한아시불하면서세끼쳐묵하는정한아란뜻', 9, 'Necromancer') ['Rotkojyra']
aurastack_cafu = 345 # case 2, they are 2nd in the list of people using active skill 115, note that this person is ACTUALLY using spark
spark = 9 # 9 is spark in activeSkills but phant flame wall in allSkills
anom_spark = 10 # 10 is anom spark in activeSkills but cwdt in allSkills
print(summarize_player(aurastack_cafu, data))
spark_enjoyers = get_skill_enjoyers([spark, anom_spark], data)
print(data['names'][aurastack_cafu] in spark_enjoyers) # hmmmmmm thats weird they arent in the list?
('AuraStack_Cafu', 0, 'Ascendant') False
maximus_mazorkis = 1 # this person is interesting because they seemingly show up EVERYWHERE multiple times, while not having an active skill (aurabot)
print(summarize_player(maximus_mazorkis, data))
print(data['names'][maximus_mazorkis] in spark_enjoyers) # hmmmmmm
print(data['names'][maximus_mazorkis] in crema_enjoyers) # HMMMMMMMMMMMMMMMMM, interesting... this suggests that activeSkillUse is not doing what we think
('MaximusMazorkis', 0, 'Ascendant') True False
# i suspect skillDetails is the actual skill data despite how things are labeled in the json
def get_player_details(idx, data):
for i, skill in enumerate(data['skillDetails']):
for person, l in skill['dps'].items():
if (p:=int(person)) == idx:
return (summarize_player(p, data), f"skill={skill['name']}", f"dps={l[0]}")
print(get_player_details(solya_si, data))
print(get_player_details(aurastack_cafu, data))
print(get_player_details(maximus_mazorkis, data)) # finally
(('시불세끼정한아시불하면서세끼쳐묵하는정한아란뜻', 9, 'Necromancer'), 'skill=Volatile Dead', 'dps=656469') (('AuraStack_Cafu', 0, 'Ascendant'), 'skill=Spark', 'dps=24688130') None
print(summarize_player(588, data))
print(summarize_player(588+345, data))
print(summarize_player(588+345+7377, data))
('그냥달려나갑니다', 0, 'Ascendant') ('촉수언냐보빨러', 0, 'Ascendant') ('Kamilea', 9, 'Necromancer')
def find_characters_by_skill(skill_idx: int, data: dict):
pointer = data['activeSkillUse'][str(skill_idx)][0]
for i in data['activeSkillUse'][str(skill_idx)][1:]:
yield pointer
pointer += i
def get_first_n_by_skill(n: int, skill_idx: int, data: dict):
return [x for x, _ in zip(find_characters_by_skill(skill_idx, data), range(n))]
for c in get_first_n_by_skill(10, cremation, data):
print(f"Player: {data['names'][c]}[idx = {c}, asc = {get_user_ascendancy(c, data)}] playing {data['activeSkills'][cremation]['name']}")
Player: 그냥달려나갑니다[idx = 588, asc = Ascendant] playing Cremation Player: 촉수언냐보빨러[idx = 933, asc = Ascendant] playing Cremation Player: Kamilea[idx = 8310, asc = Necromancer] playing Cremation Player: A_Eversummer[idx = 8314, asc = Necromancer] playing Cremation Player: Tilex_Archnemesis[idx = 8315, asc = Necromancer] playing Cremation Player: Быстродевка[idx = 8317, asc = Necromancer] playing Cremation Player: ArchOrrn[idx = 8329, asc = Necromancer] playing Cremation Player: Arc_rcA[idx = 8330, asc = Necromancer] playing Cremation Player: Soulwrest_eon[idx = 8332, asc = Necromancer] playing Cremation Player: Aumoa[idx = 8338, asc = Necromancer] playing Cremation