This commit is contained in:
team3
2026-09-29 00:54:58 +02:00
parent f7c9017946
commit f80b8c5826
20 changed files with 997 additions and 77 deletions

View File

@@ -13,6 +13,7 @@ from fastapi.staticfiles import StaticFiles
from . import (
backup,
punkte,
db,
events,
features,
@@ -364,8 +365,9 @@ def mitglied(sid):
return ich
# Der letzte Dreh, damit eine Seite mitten in der Animation nachziehen kann
letzter_dreh = {"ergebnis": None, "start": 0.0}
# Der letzte Dreh, damit eine Seite mitten in der Animation nachziehen
# kann — samt Anwesenheit der Runde, die beim Eintragen am Abend landet
letzter_dreh = {"ergebnis": None, "start": 0.0, "teilnehmer": []}
@app.get("/api/events")
@@ -394,6 +396,7 @@ def drehen():
letzter_dreh["ergebnis"] = ergebnis
letzter_dreh["start"] = time.monotonic()
letzter_dreh["teilnehmer"] = suggestions.teilnehmer()
events.senden("spin", ergebnis)
return {"started": True, **ergebnis}
@@ -418,6 +421,7 @@ def liste_vorschlaege(response: Response, filmabend_sid: str | None = Cookie(Non
sid = sitzung(response, filmabend_sid)
eintraege = suggestions.alle()
ich = users.besitzer(sid)
dabei = suggestions.dabei_alle()
return {
"items": [
{k: v for k, v in e.items() if k not in ("session_id", "user_id")}
@@ -428,9 +432,22 @@ def liste_vorschlaege(response: Response, filmabend_sid: str | None = Cookie(Non
(e["id"] for e in eintraege if users.gehoert_mir(e, sid, ich)),
None,
),
# Wer ohne Vorschlag dabei ist
"dabei": [d["name"] or "Anonym" for d in dabei],
"dabei_mine": any(users.gehoert_mir(d, sid, ich) for d in dabei),
}
@app.post("/api/dabei")
def dabei(response: Response, filmabend_sid: str | None = Cookie(None)):
"""Dabei ohne Vorschlag — an oder wieder aus."""
sid = sitzung(response, filmabend_sid)
mitglied(sid)
steht = suggestions.dabei_umschalten(sid)
events.senden("suggestions")
return {"dabei": steht}
@app.post("/api/suggestions")
async def vorschlagen(
response: Response,
@@ -595,8 +612,10 @@ def vergessen(
@app.get("/api/users")
def runde(response: Response, filmabend_sid: str | None = Cookie(None)):
sid = sitzung(response, filmabend_sid)
staende = punkte.alle()
leer = punkte.stand(0)
return {
"items": users.alle(),
"items": [{**u, **staende.get(u["id"], leer)} for u in users.alle()],
"mine": users.aktuell(sid),
"host": users.ist_host(sid),
}
@@ -739,17 +758,45 @@ def name_waehlen(
@app.get("/api/watched")
def liste_gesehen(response: Response, filmabend_sid: str | None = Cookie(None)):
sid = sitzung(response, filmabend_sid)
return watched.alle(sid)
return watched.alle(sid, users.ist_host(sid))
@app.post("/api/watched")
async def als_gesehen(movie_id: int = Body(..., embed=True)):
"""Der Host trägt ein, was am Abend lief."""
"""Der Host trägt ein, was am Abend lief. Ist es der gezogene Film,
hängt die Runde vom Rad als Anwesenheit am Abend."""
eintrag = watched.markieren(await film_holen(movie_id))
gezogen = letzter_dreh["ergebnis"]
if gezogen and gezogen["gewinner"]["movie_id"] == movie_id and letzter_dreh["teilnehmer"]:
watched.dabei_setzen(eintrag["id"], letzter_dreh["teilnehmer"])
events.senden("watched")
return eintrag
@app.post("/api/watched/{watched_id}/dabei")
def dabei_aendern(watched_id: int, user_ids: list[int] = Body(..., embed=True)):
"""Der Host berichtigt, wer dabei war — etwa wer spät kam."""
watched.dabei_setzen(watched_id, user_ids)
events.senden("watched")
return {"dabei": user_ids}
@app.post("/api/watched/hearts")
def herz_setzen(
response: Response,
note_id: int = Body(..., embed=True),
filmabend_sid: str | None = Cookie(None),
):
"""Ein Klick setzt das Herz, der nächste nimmt es zurück."""
sid = sitzung(response, filmabend_sid)
mitglied(sid)
steht = watched.herz(sid, note_id)
if steht is None:
raise HTTPException(status_code=404, detail="Kommentar nicht gefunden")
events.senden("watched")
return {"hearted": steht}
@app.delete("/api/watched/{watched_id}")
def gesehen_entfernen(watched_id: int):
entfernt = watched.entfernen(watched_id)