79 lines
2.3 KiB
Python
79 lines
2.3 KiB
Python
#interfaces with onomancer
|
|
|
|
import requests, json, urllib
|
|
from requests.adapters import HTTPAdapter
|
|
from urllib3.util.retry import Retry
|
|
import database as db
|
|
|
|
|
|
onomancer_url = "https://onomancer.sibr.dev/api/"
|
|
name_stats_hook = "getOrGenerateStats?name="
|
|
collection_hook = "getCollection?token="
|
|
names_hook = "getNames"
|
|
|
|
|
|
def _retry_session(retries=3, backoff=0.3, status=(500, 501, 502, 503, 504)):
|
|
session = requests.Session()
|
|
retry = Retry(
|
|
total=retries,
|
|
read=retries,
|
|
connect=retries,
|
|
backoff_factor=backoff,
|
|
status_forcelist=status,
|
|
)
|
|
adapter = HTTPAdapter(max_retries=retry)
|
|
session.mount('https://', adapter)
|
|
return session
|
|
|
|
def get_stats(name):
|
|
player = db.get_stats(name)
|
|
if player is not None:
|
|
return player #returns json_string
|
|
|
|
#yell at onomancer if not in cache or too old
|
|
response = _retry_session().get(onomancer_url + name_stats_hook + urllib.parse.quote_plus(name))
|
|
if response.status_code == 200:
|
|
stats = json.dumps(response.json())
|
|
db.cache_stats(name, stats)
|
|
return stats
|
|
|
|
def get_scream(username):
|
|
scream = db.get_soulscream(username)
|
|
if scream is not None:
|
|
return scream
|
|
else:
|
|
scream = json.loads(get_stats(username))["soulscream"]
|
|
db.cache_soulscream(username, scream)
|
|
return scream
|
|
|
|
def get_collection(collection_url):
|
|
response = _retry_session().get(onomancer_url + collection_hook + urllib.parse.quote(collection_url))
|
|
if response.status_code == 200:
|
|
for player in response.json()['lineup'] + response.json()['rotation']:
|
|
db.cache_stats(player['name'], json.dumps(player))
|
|
|
|
return json.dumps(response.json())
|
|
|
|
|
|
def get_names(limit=20, threshold=1):
|
|
"""
|
|
Get `limit` random players that have at least `threshold` upvotes.
|
|
Returns dictionary keyed by player name of stats.
|
|
"""
|
|
response = _retry_session().get(
|
|
onomancer_url + names_hook,
|
|
params={
|
|
'limit': limit,
|
|
'threshold': threshold,
|
|
'with_stats': 1,
|
|
'random': 1,
|
|
},
|
|
)
|
|
response.raise_for_status()
|
|
res = {}
|
|
for stats in response.json():
|
|
name = stats['name']
|
|
db.cache_stats(name, json.dumps(stats))
|
|
res[name] = stats
|
|
return res
|