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__) @app.route("/") def index(): return render_template("index.html") @app.route("/search", methods=["POST"]) def search(): data = request.get_json() games = api.search(srcomapi.datatypes.Game, data)[:10] response = {"games": [g.name for g in games]} return jsonify(response), 200 @app.route("/categories", methods=["POST"]) def categories(): data = request.get_json() game = api.search(srcomapi.datatypes.Game, data)[0] raw_cats = game.categories cats = {"categories": []} for cat in raw_cats: if cat.type == "per-game": cats["categories"].append(cat.name) return jsonify(cats) @app.route("/graph", methods=["POST"]) def graph(): data = request.get_json() game = api.search(srcomapi.datatypes.Game, {"name": data["name"]})[0] for cat in game.categories: if data["category"] == cat.name and cat.type == "per-game": category = cat release_date = datetime.datetime.strptime(game.release_date, "%Y-%m-%d") data = srcomapi.datatypes.Leaderboard( api, data=api.get(f"leaderboards/{game.id}/category/{category.id}?embed=variables"), ) raw_runs = data.runs runs = {"Time": [], "Days since release": [], "Annotation": []} for run in raw_runs: r = run["run"] time = r.times["primary_t"] if r.date is not None: date = datetime.datetime.strptime(r.date, "%Y-%m-%d") time_since_release = date - release_date runs["Time"].append(time / 60) runs["Days since release"].append(time_since_release.days) # 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' f"date: {r.date}" ) runs["Annotation"].append(annotation) graph = plotly.graph_objs.Figure() trace = plotly.graph_objs.Scatter( x=runs["Days since release"], y=runs["Time"], mode="markers", hoverinfo="text", hovertext=runs["Annotation"], ) graph.add_trace(trace) graph.update_layout( title=f"{game.name} ({category.name}): Run time since release", xaxis_title="Days since release", yaxis_title="Time (Minutes)", ) graph_json = graph.to_json() # graph_json = json.dumps([trace], cls=plotly.utils.PlotlyJSONEncoder) return app.response_class( response=graph_json, status=200, mimetype="application/json" ) def main(): global app serve(app, host="0.0.0.0", port=8059)