-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.py
231 lines (194 loc) · 6.57 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
from flask import (
Flask,
render_template,
request,
redirect,
url_for,
session,
Response,
)
import os
import json
import random
import uuid
import time
app = Flask(__name__)
app.secret_key = os.urandom(24)
answers = {}
show_answers = False
lock_answers = False
current_turn = -1
player_turn = None
@app.route("/", methods=["GET", "POST"])
def index():
# Generate a unique client_id if not already present in session
session.setdefault("client_id", str(uuid.uuid4()))
client_id = session["client_id"]
if client_id not in answers:
answers[client_id] = {
"name": None,
"answer": None,
"score": 0,
"active": True,
"turn": 0,
}
if request.method == "POST":
global lock_answers
if lock_answers:
return redirect(url_for("index"))
name = request.form.get("name") # Get the name from the form
answer = request.form.get("answer")
if answer:
answers[client_id]["answer"] = answer
if name:
answers[client_id]["name"] = name
answers[client_id]["turn"] = (
max(i["turn"] for i in answers.values() if i["name"]) + 1
)
return redirect(url_for("index"))
return render_template(
"index.html",
current_answer=answers[client_id]["answer"],
current_name=answers[client_id]["name"],
)
@app.route("/game")
def game():
players_ = [i for i in answers.values() if i["name"]]
ordered_players = sorted(players_, key=lambda p: (-p["active"], -p["score"]))
answers_ = [i for i in answers.values() if i["answer"] and i["name"]]
ordered_answers = sorted(answers_, key=lambda a: (-a["active"], a["answer"]))
return render_template(
"manage.html",
answers=ordered_answers,
players=ordered_players,
total_players=len(players_),
total_answers=len(answers_),
show_answers=show_answers,
lock_answers=lock_answers,
player_turn=player_turn,
)
@app.route("/edit_players", methods=["GET", "POST"])
def edit_players():
players = [player for player in answers.values() if player["name"]]
if request.method == "POST":
for player in players:
new_name = request.form.get(f"new_{player['name']}")
new_turn = request.form.get(f"new_turn_{player['name']}")
player["name"] = new_name
player["turn"] = int(new_turn)
return redirect(url_for("edit_players"))
return render_template("edit_players.html", players=players)
@app.route("/delete_player", methods=["POST"])
def delete_player():
player_name = request.args.get("player_name")
for player in answers.values():
if player["name"] == player_name:
player["name"] = None
player["answer"] = None
# Redirect to the page where the form is located, or to any other appropriate page
return redirect(url_for("edit_players"))
@app.route("/clear")
def clear():
for player in answers.values():
player["active"] = True
player["answer"] = None
global lock_answers
lock_answers = False
global show_answers
show_answers = False
return redirect(url_for("game"))
@app.route("/toggle_lock")
def toggle_lock():
global lock_answers
lock_answers = not lock_answers
global show_answers
show_answers = lock_answers
return redirect(url_for("game"))
@app.route("/next")
def next():
global current_turn
player_order = sorted(
[i for i in answers.values() if i["name"]], key=lambda p: p["turn"]
)
if not any([i["active"] for i in player_order]):
return redirect(url_for("game"))
current_turn += 1
if current_turn >= len(player_order):
current_turn = 0
while not player_order[current_turn]["active"]:
current_turn += 1
if current_turn >= len(player_order):
current_turn = 0
global player_turn
player_turn = player_order[current_turn]["name"]
return redirect(url_for("game"))
@app.route("/increase_score", methods=["POST"])
def increase_score():
player_name = request.args.get("player_name")
for player in answers.values():
if player["name"] == player_name:
player["score"] += 1
break
return redirect(url_for("game"))
@app.route("/decrease_score", methods=["POST"])
def decrease_score():
player_name = request.args.get("player_name")
for player in answers.values():
if player["name"] == player_name:
player["score"] -= 1
break
return redirect(url_for("game"))
@app.route("/toggle_active", methods=["POST"])
def toggle_active():
player_name = request.args.get("player_name")
for player in answers.values():
if player["name"] == player_name:
player["active"] = not player["active"]
point = not player["active"]
if point:
for player in answers.values():
if player["name"] == player_turn:
player["score"] += 1
return redirect(url_for("game"))
@app.route("/toggle_answer", methods=["POST"])
def toggle_answer():
answer_name = request.args.get("answer_name")
for answer in answers.values():
if answer["answer"] == answer_name:
answer["active"] = not answer["active"]
point = not answer["active"]
if point:
for player in answers.values():
if player["name"] == player_turn:
player["score"] += 1
return redirect(url_for("game"))
@app.route("/total_answers_stream")
def total_answers_stream():
def stream():
while True:
players = [i for i in answers.values() if i["name"]]
total_answers = len(
[i for i in answers.values() if i["answer"] and i["name"]]
)
data = {
"total_players": len(players),
"total_answers": total_answers,
# "all_players": players,
}
yield f"data: {json.dumps(data)}\n\n"
time.sleep(1)
return Response(stream(), mimetype="text/event-stream")
@app.route("/session_answers_stream")
def session_answers_stream():
session.setdefault("client_id", str(uuid.uuid4()))
client_id = session["client_id"]
def stream():
if client_id not in answers:
return
while True:
data = answers[client_id]["answer"]
yield f"data: {data}\n\n"
time.sleep(1)
return Response(stream(), mimetype="text/event-stream")
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=False)