speedrun/speedrun/__init__.py

99 lines
3.0 KiB
Python
Raw Permalink Normal View History

2020-06-28 15:00:44 +02:00
import srcomapi
import plotly
import json
import pandas as pd
import datetime
from flask import Flask, render_template, request, jsonify
from waitress import serve
api = srcomapi.SpeedrunCom()
api.debug = 0
app = Flask(__name__)
2020-06-28 15:15:46 +02:00
@app.route("/")
2020-06-28 15:00:44 +02:00
def index():
2020-06-28 15:15:46 +02:00
return render_template("index.html")
2020-06-28 15:00:44 +02:00
2020-06-28 15:15:46 +02:00
@app.route("/search", methods=["POST"])
2020-06-28 15:00:44 +02:00
def search():
data = request.get_json()
games = api.search(srcomapi.datatypes.Game, data)[:10]
2020-06-28 15:15:46 +02:00
response = {"games": [g.name for g in games]}
2020-06-28 15:00:44 +02:00
return jsonify(response), 200
2020-06-28 15:15:46 +02:00
@app.route("/categories", methods=["POST"])
2020-06-28 15:00:44 +02:00
def categories():
data = request.get_json()
game = api.search(srcomapi.datatypes.Game, data)[0]
raw_cats = game.categories
2020-06-28 15:15:46 +02:00
cats = {"categories": []}
2020-06-28 15:00:44 +02:00
for cat in raw_cats:
2020-06-28 15:15:46 +02:00
if cat.type == "per-game":
cats["categories"].append(cat.name)
2020-06-28 15:00:44 +02:00
return jsonify(cats)
2020-06-28 15:15:46 +02:00
@app.route("/graph", methods=["POST"])
2020-06-28 15:00:44 +02:00
def graph():
data = request.get_json()
2020-06-28 15:15:46 +02:00
game = api.search(srcomapi.datatypes.Game, {"name": data["name"]})[0]
2020-06-28 15:00:44 +02:00
for cat in game.categories:
2020-06-28 15:15:46 +02:00
if data["category"] == cat.name and cat.type == "per-game":
2020-06-28 15:00:44 +02:00
category = cat
2020-06-28 15:15:46 +02:00
release_date = datetime.datetime.strptime(game.release_date, "%Y-%m-%d")
2020-06-28 15:00:44 +02:00
data = srcomapi.datatypes.Leaderboard(
api,
2020-06-28 15:15:46 +02:00
data=api.get(f"leaderboards/{game.id}/category/{category.id}?embed=variables"),
2020-06-28 15:00:44 +02:00
)
raw_runs = data.runs
2020-06-28 15:15:46 +02:00
runs = {"Time": [], "Days since release": [], "Annotation": []}
2020-06-28 15:00:44 +02:00
for run in raw_runs:
2020-06-28 15:15:46 +02:00
r = run["run"]
time = r.times["primary_t"]
2020-06-28 15:00:44 +02:00
if r.date is not None:
2020-06-28 15:15:46 +02:00
date = datetime.datetime.strptime(r.date, "%Y-%m-%d")
2020-06-28 15:00:44 +02:00
time_since_release = date - release_date
2020-06-28 15:15:46 +02:00
runs["Time"].append(time / 60)
runs["Days since release"].append(time_since_release.days)
2020-06-28 15:00:44 +02:00
# if len(r.players) == 1:
# players = r.players[0].name
# elif len(r.players) > 1:
# players = ''
# for i, p in enumerate(r.players):
# players += p.name
# if i != len(r.players) - 1:
# players += ', '
annotation = (
# f'players: {players}\n'
2020-06-28 15:15:46 +02:00
f"date: {r.date}"
2020-06-28 15:00:44 +02:00
)
2020-06-28 15:15:46 +02:00
runs["Annotation"].append(annotation)
2020-06-28 15:00:44 +02:00
graph = plotly.graph_objs.Figure()
2020-06-28 15:15:46 +02:00
trace = plotly.graph_objs.Scatter(
x=runs["Days since release"],
y=runs["Time"],
mode="markers",
hoverinfo="text",
hovertext=runs["Annotation"],
)
2020-06-28 15:00:44 +02:00
graph.add_trace(trace)
2020-06-28 15:15:46 +02:00
graph.update_layout(
title=f"{game.name} ({category.name}): Run time since release",
xaxis_title="Days since release",
yaxis_title="Time (Minutes)",
)
2020-06-28 15:00:44 +02:00
graph_json = graph.to_json()
# graph_json = json.dumps([trace], cls=plotly.utils.PlotlyJSONEncoder)
return app.response_class(
2020-06-28 15:15:46 +02:00
response=graph_json, status=200, mimetype="application/json"
2020-06-28 15:00:44 +02:00
)
def main():
global app
2020-06-28 15:15:46 +02:00
serve(app, host="0.0.0.0", port=8059)