#!/usr/bin/env python # coding: utf-8 # In[2]: get_ipython().run_line_magic('load_ext', 'autoreload') get_ipython().run_line_magic('autoreload', '2') import requests # In[3]: 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) # In[4]: def get_user_ascendancy(user_idx: int, api_data: dict): asc_idx = api_data["classes"][user_idx] return api_data["classNames"][asc_idx] # In[5]: 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) # In[6]: 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 # In[7]: 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 # In[8]: 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? # In[9]: 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 # In[10]: # 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]}") # In[11]: print(get_player_details(solya_si, data)) print(get_player_details(aurastack_cafu, data)) print(get_player_details(maximus_mazorkis, data)) # finally # In[15]: print(summarize_player(588, data)) print(summarize_player(588+345, data)) print(summarize_player(588+345+7377, data)) # In[47]: 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))] # In[51]: 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']}") # In[ ]: