sessions, or something

This commit is contained in:
2025-08-09 16:28:49 +02:00
parent 4c70a3f72d
commit 21d5f56a39
30 changed files with 683 additions and 38 deletions
View File
+5
View File
@@ -0,0 +1,5 @@
from django.apps import AppConfig
class VotingConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'voting'
+71
View File
@@ -0,0 +1,71 @@
import json
from asgiref.sync import async_to_sync
from channels.generic.websocket import WebsocketConsumer
from django.contrib.auth.models import User
from muzak.auth import get_user_from_token
from channels.db import database_sync_to_async
class SessionConsumer(WebsocketConsumer):
def connect(self):
self.session_id = self.scope["url_route"]["kwargs"]["session_id"]
self.session_name = f"session_{self.session_id}"
# print("---")
# print(self.scope)
# Join room group
async_to_sync(self.channel_layer.group_add)(
self.session_name, self.channel_name
)
self.accept()
def disconnect(self, close_code):
# Leave room group
async_to_sync(self.channel_layer.group_discard)(
self.session_name, self.channel_name
)
# Receive message from WebSocket
def receive(self, text_data):
user = self.scope["user"]
text_data_json = json.loads(text_data)
action = text_data_json["action"]
# Niet lachen, middleware is moeilijk oké?
username = text_data_json.get("username")
token = text_data_json.get("token")
if token:
user = get_user_from_token(token, log=True)
print(user)
elif username:
pass
#user = User.objects.get(username=username)
if action == "message":
message = text_data_json["message"]
# Send message to room group
async_to_sync(self.channel_layer.group_send)(
self.session_name, {"type": "chat.message", "message": str(user) + ": " + message}
)
if action == "login":
print("LOGIN", str(user))
async_to_sync(self.channel_layer.group_send)(
self.session_name, {"type": "announce", "user": str(user)}
)
def announce(self, event):
user = event["user"]
self.send(text_data=json.dumps({"joined": user}))
# Receive message from room group
def chat_message(self, event):
message = event["message"]
print(self.scope["user"])
# Send message to WebSocket
self.send(text_data=json.dumps({"message": message}))
+7
View File
@@ -0,0 +1,7 @@
from django.urls import re_path
from . import consumers
websocket_urlpatterns = [
re_path(r"voting/session/(?P<session_id>[\w\-]+)/$", consumers.SessionConsumer.as_asgi()),
]
@@ -0,0 +1,25 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>Sessions</title>
</head>
<body>
<input id="room-name-input" type="text" size="100" /><br />
<input id="room-name-submit" type="button" value="Enter" />
<script>
document.querySelector("#room-name-input").focus();
document.querySelector("#room-name-input").onkeyup = function (e) {
if (e.key === "Enter") {
// enter, return
document.querySelector("#room-name-submit").click();
}
};
document.querySelector("#room-name-submit").onclick = function (e) {
var roomName = document.querySelector("#room-name-input").value;
window.location.pathname =
"/voting/session/" + roomName + "/test";
};
</script>
</body>
</html>
@@ -0,0 +1,63 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>Votign Session</title>
</head>
<body>
<textarea id="chat-log" cols="100" rows="20"></textarea><br />
<input id="chat-message-input" type="text" size="100" /><br />
<input id="chat-message-submit" type="button" value="Send" />
{{ room_name|json_script:"room-name" }}
<script>
const roomName = JSON.parse(
document.getElementById("room-name").textContent,
);
const host =
"ws://" +
window.location.host +
"/voting/session/" +
roomName +
"/";
const chatSocket = new WebSocket(host);
console.log(host);
chatSocket.onmessage = function (e) {
const data = JSON.parse(e.data);
document.querySelector("#chat-log").value +=
data.message + "\n";
};
chatSocket.onclose = function (e) {
console.error("Chat socket closed unexpectedly");
};
document.querySelector("#chat-message-input").focus();
document.querySelector("#chat-message-input").onkeyup = function (
e,
) {
if (e.key === "Enter") {
// enter, return
document.querySelector("#chat-message-submit").click();
}
};
document.querySelector("#chat-message-submit").onclick = function (
e,
) {
const messageInputDom = document.querySelector(
"#chat-message-input",
);
const message = messageInputDom.value;
chatSocket.send(
JSON.stringify({
action: "message",
message: message,
}),
);
messageInputDom.value = "";
};
</script>
</body>
</html>
+9
View File
@@ -0,0 +1,9 @@
from django.urls import path
from . import views
urlpatterns = [
path("", views.index, name="index"),
path("session/<str:session_id>/test", views.session, name="session"),
path("session/", views.SessionListView.as_view(), name="api-session-list"),
]
+24
View File
@@ -0,0 +1,24 @@
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from playlist.models import Session, Profile, Track, Vote
from playlist.serializers import TrackSerializer, SessionSerializer
from drf_spectacular.utils import extend_schema
def index(request):
return render(request, 'voting/index.html')
def session(request, session_id):
return render(request, 'voting/session.html', {'room_name': session_id})
@extend_schema(
responses={200: SessionSerializer(many=True)},
description="Retrieve a list of all available sessions."
)
class SessionListView(APIView):
def get(self, request):
if request.user.is_superuser:
sessions = Session.objects.all()
else:
sessions = Session.objects.filter(voting_open=True)
return Response(SessionSerializer(sessions, many=True).data)