rubygoldberg-tracker/watcher/app.py

88 lines
2.7 KiB
Python
Raw Normal View History

import socket
from time import time
2019-09-20 14:15:20 +02:00
import socketio
from flask import Flask, render_template, request
2019-09-20 14:47:55 +02:00
sio = socketio.Server()
2019-09-20 14:15:20 +02:00
app = Flask(__name__)
app.wsgi_app = socketio.WSGIApp(sio, app.wsgi_app)
2019-09-20 14:15:20 +02:00
# We request users to send the run number to prevent accidentially getting old requests from a previous run
# This maybe will give to much errors from people forgetting to change their number
# Remove it?
# TODO
# Save and read from a file to persist over reboots
# Save progress through time during 1 run
# Save result of different runs
db = {"current_run": None, "run_start_timer": None, "run_data": {}}
2019-09-20 14:47:55 +02:00
2019-09-20 14:15:20 +02:00
@app.route("/")
def index():
2019-09-20 14:47:55 +02:00
return render_template('index.html')
2019-09-20 14:15:20 +02:00
@app.route("/start_run/<run_index>")
def start_run(run_index):
db["current_run"] = run_index
starttime = time()
if run_index in db["run_data"]:
return "This run is already ran, take another number."
2019-09-20 14:47:55 +02:00
db["run_data"][run_index] = {"starttime": starttime, "data": {}}
2019-09-20 14:15:20 +02:00
# TODO send start request to the first person in the chain. Probably a zeus part already written as example
sio.emit('start_run', run_index)
2019-09-20 14:15:20 +02:00
return f'Run {run_index} started at {starttime}'
2019-09-20 14:47:55 +02:00
2019-09-27 17:43:33 +02:00
@app.route("/link/start/<run>/<link_index>")
def link_start(run, link_index):
request_data = live_request(run, link_index)
sio.emit('live_request', request_data)
2019-09-20 14:15:20 +02:00
if db["current_run"] != run:
return "Wrong run number, check that you update your run", 404
2019-09-20 14:15:20 +02:00
else:
run_data = db["run_data"][run]["data"]
2019-09-27 17:43:33 +02:00
if link_index in run_data:
return "you already started in this run. Ignoring this request."
else:
2019-09-27 17:43:33 +02:00
run_data[link_index] = {"id": link_index, "start": time()}
sio.emit('link_start', run_data[link_index])
return "Success."
2019-09-20 14:15:20 +02:00
@app.route("/link/handoff/<run>/<index>")
def link_handoff(run, index):
2019-09-20 14:15:20 +02:00
if db["current_run"] != run:
return "Wrong run number, check that you updated you run", 404
2019-09-20 14:15:20 +02:00
else:
link_data = db["run_data"][run]["data"][index]
if "handoff" in link_data:
return "you already handed off control during this run. Ignoring this request"
else:
link_data["handoff"] = time()
sio.emit('link_handoff', link_data)
return "Success."
2019-09-20 14:15:20 +02:00
2019-09-20 14:47:55 +02:00
@sio.event
def connect(sid, data):
if db["current_run"]:
current_run = db["run_data"][db["current_run"]]
sio.emit('sync_current_run', current_run, room=sid)
def live_request(run, index):
ip = request.remote_addr
request_data = {}
2019-09-27 17:43:33 +02:00
request_data["hostname"] = socket.gethostbyaddr(ip)[0]
request_data["time"] = time()
return request_data
2019-09-20 14:47:55 +02:00
if __name__ == '__main__':
app.run(host="0.0.0.0", debug=True)