CGGItemSets/CGGItemSets.py
2018-06-03 09:26:59 +02:00

105 lines
4 KiB
Python

import json
import logging
import re
from pathlib import Path
from time import sleep
import requests
from bs4 import BeautifulSoup
LOL_CHAMPS_DIR = 'C:\\League of Legends\\Config\\Champions\\'
PATTERN_CHAMPIONGG = re.compile(r'^\s+matchupData\.championData = (.*)$', re.MULTILINE)
HEADERS = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0'}
ITEMS_TYPE = {
'Most Frequent Starters': ['firstItems', 'mostGames'],
'Highest Win % Starters': ['firstItems', 'highestWinPercent'],
'Most Frequent Core Build': ['items', 'mostGames'],
'Highest Win % Core Build': ['items', 'highestWinPercent'],
}
def getChampData(champ, position):
page = requests.get('https://champion.gg/champion/%s/%s?league=' % (champ, position), headers=HEADERS).text
return json.loads(PATTERN_CHAMPIONGG.search(page).group(1))
def getChampsWithPositionsAndPatch():
soup = BeautifulSoup(requests.get('https://champion.gg', headers=HEADERS).text, 'html.parser')
patch = soup.find('div', class_='analysis-holder').find('strong').text
champs = []
for div in soup.find_all('div', class_='champ-height'):
champ_name = div.find('span', class_='champion-name').text
pos = [link['href'].split('/')[-1] for link in div.find_all('a', href=True)[1:]]
champs.append({champ_name: pos})
return (champs, patch)
def makeItemSet(data, label):
return {
"items": [{"id": item['id'], "count": 1} for item in data['items']],
"type": "%s (%.2f%% - %d games)" % (label, data['winPercent'] * 100, data['games'])
}
def makeItemSetFromList(list, label, key, data):
return {
"items": [{"id": str(id), "count": 1} for id in list],
"type": label % '.'.join([data['skills']['skillInfo'][int(k)-1]['key'] for k in data['skills'][key]['order']])
}
def writeItemSet(id, pos, ver, dir):
logging.info('Retrieving data for %s at %s' % (id, pos))
data = getChampData(id, pos)
item_set = {
"title": "CGG %s %s - %.2f%% Winrate" % (pos, ver, data['stats']['winRate'] * 100),
"type": "custom",
"map": "any",
"mode": "any",
"priority": False,
"sortrank": 0,
"blocks": []
}
for label, path in ITEMS_TYPE.items():
if path[1] in data[path[0]]:
item_set['blocks'].append(makeItemSet(data[path[0]][path[1]], label))
item_set['blocks'].append(makeItemSetFromList([2003, 2004, 2055, 2031, 2032, 2033, 2138, 2140, 2139], "Consumables | Frequent: %s", 'mostGames', data))
item_set['blocks'].append(makeItemSetFromList([3340, 3364, 3363], "Trinkets | Wins: %s", 'highestWinPercent', data))
logging.info('Writing item set for %s at %s' % (id, pos))
with open('%sCGG_%s_%s.json' % (dir, id, pos), 'w', newline='\n') as out:
json.dump(item_set, out, indent=4)
def main():
logging.basicConfig(format='%(asctime)s:%(levelname)s:%(message)s', level=logging.INFO)
logging.info('CGG Item Sets')
ver = requests.get('https://ddragon.leagueoflegends.com/realms/euw.json', headers=HEADERS).json()['v']
data = requests.get('http://ddragon.leagueoflegends.com/cdn/%s/data/en_US/champion.json' % ver, headers=HEADERS).json()['data']
lol_champs = [data[i] for i in data]
logging.info('LoL version: %s' % ver)
logging.info('LoL numbers of champs: %d' % len(lol_champs))
(champs, patch) = getChampsWithPositionsAndPatch()
logging.info('CGG version: %s' % patch)
logging.info('CGG numbers of champs: %d' % len(champs))
for champ in champs:
for name, positions in champ.items():
c = next((x for x in lol_champs if x['name'] == name), None)
if c is not None:
path = '%s%s\\Recommended\\' % (LOL_CHAMPS_DIR, c['id'])
Path(path).mkdir(parents=True, exist_ok=True)
for pos in positions:
writeItemSet(c['id'], pos, patch, path)
sleep(.3)
else:
logging.error('%s not found in LoL champs' % name)
if __name__ == "__main__":
main()