sessions, or something
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
class VotingConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'voting'
|
||||
@@ -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}))
|
||||
@@ -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>
|
||||
@@ -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"),
|
||||
]
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user