Skip to content

Commit 00e4e2a

Browse files
committed
add disconnection state
1 parent 878aabe commit 00e4e2a

File tree

7 files changed

+77
-9
lines changed

7 files changed

+77
-9
lines changed

examples/jeopardy-buzzer/pages/host/[room].sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ ROOM_CODE="${REQUEST_PATH##*/}"
44
htmx_page << EOF
55
66
<div hx-sse="connect:/sse/host/${ROOM_CODE}">
7-
<div hx-trigger="sse:leave, sse:join, sse:unlock, sse:buzz, load" hx-get="/room/players/${ROOM_CODE}" class="players"></div>
7+
<div hx-trigger="sse:kick, sse:leave, sse:join, sse:unlock, sse:buzz, load" hx-get="/room/players/${ROOM_CODE}" class="players"></div>
88
<form>
99
<input type="hidden" name="room_code" value="${ROOM_CODE}" />
1010
<div class="button-container">
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
2+
PASSWORD="${COOKIES["password"]}"
3+
4+
if [[ "$REQUEST_METHOD" != "POST" ]]; then
5+
return
6+
fi
7+
8+
PLAYER_ID="${REQUEST_PATH##*/}"
9+
10+
ROOM_CODE="${FORM_DATA["room_code"]}"
11+
ROOM_PASSWORD=$(cat "data/password-$(basename ${ROOM_CODE})")
12+
ROOM_DATA="data/room-$(basename ${ROOM_CODE})"
13+
SCORE_DATA="data/scores-$(basename ${ROOM_CODE})"
14+
15+
if [[ "$ROOM_PASSWORD" != "$PASSWORD" ]]; then
16+
echo "Bad auth!"
17+
return
18+
fi
19+
20+
PUBSUB_KEY="room-${ROOM_CODE}"
21+
22+
sed -i "/^${PLAYER_ID}\tX$/d" "$ROOM_DATA"
23+
sed -i "/^${PLAYER_ID}\t[0-9]*$/d" "$SCORE_DATA"
24+
25+
26+
printf "event: kick\ndata: %s\n\n" "Buzz" \
27+
| publish "$PUBSUB_KEY" &
28+
29+
echo "$PLAYER_ID"

examples/jeopardy-buzzer/pages/player/[room].sh

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,12 @@ htmx_page << EOF
2727
.score-controls {
2828
display: none;
2929
}
30+
.player .disconnected:hover {
31+
text-decoration: inherit;
32+
cursor: inherit;
33+
}
3034
</style>
31-
<div hx-trigger="sse:score, sse:leave, sse:join, sse:buzz, sse:unlock" hx-get="/room/players/${ROOM_CODE}" class="players"></div>
35+
<div hx-trigger="sse:kick, sse:score, sse:leave, sse:join, sse:buzz, sse:unlock" hx-get="/room/players/${ROOM_CODE}" class="players"></div>
3236
<form>
3337
<input type="hidden" name="room_code" value="${ROOM_CODE}" />
3438
<div class="button-container">

examples/jeopardy-buzzer/pages/room/players/[room].sh

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,31 @@ ROOM_CODE="${REQUEST_PATH##*/}"
33

44
touch "data/room-$(basename ${ROOM_CODE})"
55
SCORE_FILE="data/scores-$(basename ${ROOM_CODE})"
6-
for username in $(cat "data/room-$(basename ${ROOM_CODE})"); do
6+
PLAYERS=$(cat "data/room-$(basename ${ROOM_CODE})")
7+
8+
while IFS= read -r player; do
9+
[[ -z "$player" ]] && break;
710
LOOPED=true
811
if [[ -f "data/buzzed-$(basename ${ROOM_CODE})" ]]; then
912
BUZZED=$(cat "data/buzzed-$(basename ${ROOM_CODE})")
1013
fi
1114

15+
read username disconnected << EOF
16+
$player
17+
EOF
18+
1219
SCORE=$(set -o pipefail; (grep -P "$username\t" "$SCORE_FILE" | cut -f2) || echo 0);
1320
BUZZED_CLASS=$([[ "$BUZZED" == "$username" ]] && echo " buzzed")
1421
RED_CLASS=$([[ "$SCORE" -lt "0" ]] && echo " red")
22+
DC_CLASS=$([[ -z "$disconnected" ]] || echo " disconnected")
23+
KICK=$([[ -z "$disconnected" ]] || echo " hx-post='/kick/${username}' hx-trigger='click' hx-swap='none'")
1524
echo """
1625
<div class='player-wrapper'>
1726
<div class='player${BUZZED_CLASS}'>
18-
<div class='username'>${username}</div>
27+
<form>
28+
<input type='hidden' value='${ROOM_CODE}' name='room_code' />
29+
<div class='username${DC_CLASS}'${KICK}>${username}</div>
30+
</form>
1931
<div id='score-for-${username}' class='score${RED_CLASS}'>${SCORE}</div>
2032
</div>
2133
<form hx-post='/score' hx-swap='none' class='score-controls'>
@@ -28,7 +40,9 @@ for username in $(cat "data/room-$(basename ${ROOM_CODE})"); do
2840
</form>
2941
</div>
3042
"""
31-
done
43+
done << EOF
44+
$PLAYERS
45+
EOF
3246

3347

3448
if [[ "$LOOPED" != "true" ]]; then

examples/jeopardy-buzzer/pages/sse/[usertype]/[room].sh

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,9 @@ pid=$!
2626
printf "event: join\ndata: %s\n\n" "${PLAYER_ID}" \
2727
| publish "$PUBSUB_KEY" && \
2828
touch "$ROOM_DATA" && \
29-
(grep -qF "$PLAYER_ID" "$ROOM_DATA" || \
30-
echo "$PLAYER_ID" >> "$ROOM_DATA" && \
29+
((grep -qP "^${PLAYER_ID}(\tX)*$" "$ROOM_DATA" && \
30+
sed -i "s/^${PLAYER_ID}\tX$/${PLAYER_ID}/" "$ROOM_DATA") || \
31+
echo -e "$PLAYER_ID" >> "$ROOM_DATA" && \
3132
sort -o "$ROOM_DATA" "$ROOM_DATA")
3233
3334
while IFS= read -r line; do
@@ -43,4 +44,5 @@ unsubscribe "$sub"
4344
[[ "$USER_TYPE" == "player" ]] && \
4445
printf "event: leave\ndata: %s\n\n" "$PLAYER_ID" |\
4546
publish "$PUBSUB_KEY" &&
46-
sed -i "/${PLAYER_ID}/d" "$ROOM_DATA"
47+
sed -i "s/^${PLAYER_ID}$/${PLAYER_ID}\tX/" "$ROOM_DATA"
48+
# sed -i "/${PLAYER_ID}/d" "$ROOM_DATA"

examples/jeopardy-buzzer/pages/stream/[room].sh

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,13 @@ htmx_page << EOF
2424
display: flex;
2525
flex-grow: 1;
2626
}
27+
.player .disconnected {
28+
color: inherit;
29+
}
30+
.player .disconnected::before {
31+
content: initial;
32+
}
2733
</style>
28-
<div hx-trigger="load, sse:score, sse:leave, sse:join, sse:buzz, sse:unlock" hx-get="/room/players/${ROOM_CODE}" class="players"></div>
34+
<div hx-trigger="load, sse:kick, sse:score, sse:leave, sse:join, sse:buzz, sse:unlock" hx-get="/room/players/${ROOM_CODE}" class="players"></div>
2935
</div>
3036
EOF

examples/jeopardy-buzzer/static/style.css

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,19 @@ button.subtract:active {
7474
border: 4px solid cyan;
7575
}
7676

77+
.player .disconnected {
78+
color: red;
79+
}
80+
.player .disconnected:hover {
81+
color: red;
82+
text-decoration: underline;
83+
cursor: pointer;
84+
}
85+
.player .disconnected::before {
86+
color: red;
87+
content: "(X) ";
88+
}
89+
7790
.player.buzzed {
7891
background-color: #50cc80;
7992
border: 4px solid lime;

0 commit comments

Comments
 (0)