session updates. mostly

This commit is contained in:
2025-08-14 15:38:48 +02:00
parent e0a03f00bf
commit 368628c070
4 changed files with 83 additions and 57 deletions
+1 -1
View File
@@ -10,7 +10,7 @@ class Session(models.Model):
@property @property
def is_open(self): def is_open(self):
return datetime.now() < self.opens return (datetime.now() < self.opens) and self.voting_open
opens = models.DateTimeField(null=True, default=None) opens = models.DateTimeField(null=True, default=None)
session_id = models.UUIDField(default=uuid.uuid4, editable=False) session_id = models.UUIDField(default=uuid.uuid4, editable=False)
+1 -1
View File
@@ -5,7 +5,7 @@ from .session import Session
class Vote(models.Model): class Vote(models.Model):
class Meta: class Meta:
unique_together = ["user", "track"] unique_together = ["user", "track", "session"]
track = models.ForeignKey('Track', on_delete=models.CASCADE) track = models.ForeignKey('Track', on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE) user = models.ForeignKey(User, on_delete=models.CASCADE)
points = models.IntegerField(validators=[MinValueValidator(1), MaxValueValidator(5)]) points = models.IntegerField(validators=[MinValueValidator(1), MaxValueValidator(5)])
+62 -50
View File
@@ -5,67 +5,79 @@ from channels.generic.websocket import WebsocketConsumer
from django.contrib.auth.models import User from django.contrib.auth.models import User
from muzak.auth import get_user_from_token from muzak.auth import get_user_from_token
from channels.db import database_sync_to_async from channels.db import database_sync_to_async
from playlist.models import Session, Track, Vote
class SessionConsumer(WebsocketConsumer): class SessionConsumer(WebsocketConsumer):
def connect(self): def connect(self):
self.session_id = self.scope["url_route"]["kwargs"]["session_id"] self.session_id = self.scope["url_route"]["kwargs"]["session_id"]
self.session_name = f"session_{self.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)(
async_to_sync(self.channel_layer.group_add)( self.session_name, self.channel_name
self.session_name, self.channel_name )
) self.accept()
self.accept() def disconnect(self, close_code):
# Leave room group
async_to_sync(self.channel_layer.group_discard)(
self.session_name, self.channel_name
)
def disconnect(self, close_code): # Receive message from WebSocket
# Leave room group def receive(self, text_data):
async_to_sync(self.channel_layer.group_discard)( user = self.scope["user"] # Waarschijnlijk altijd AnonymousUser
self.session_name, self.channel_name
)
# Receive message from WebSocket text_data_json = json.loads(text_data)
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é? # Niet lachen, middleware is moeilijk oké?
username = text_data_json.get("username") token = text_data_json.get("token")
token = text_data_json.get("token") if token:
if token: user = get_user_from_token(token, log=True)
user = get_user_from_token(token, log=True) print(user)
print(user)
elif username:
pass
#user = User.objects.get(username=username)
if action == "message": action = text_data_json.get("action", None)
message = text_data_json["message"] #:w
# Send message to room group # sessionId = text_data_json.get("sessionId", None)
async_to_sync(self.channel_layer.group_send)( #session = Session.objects.get(id=sessionId)
self.session_name, {"type": "chat.message", "message": str(user) + ": " + message} if action == "message":
) message = text_data_json["message"]
if action == "login": # Send message to room group
print("LOGIN", str(user)) async_to_sync(self.channel_layer.group_send)(
async_to_sync(self.channel_layer.group_send)( self.session_name, {"type": "chat.message", "message": str(user) + ": " + message}
self.session_name, {"type": "announce", "user": str(user)} )
) if action == "login":
print("LOGIN", str(user))
def announce(self, event): async_to_sync(self.channel_layer.group_send)(
user = event["user"] self.session_name, {"type": "announce", "user": str(user)}
self.send(text_data=json.dumps({"joined": user})) )
# if action == "vote":
# points = text_data_json.get("points", None)
# track = session.current_track;
# try:
# vote = Vote.objects.get(user=user, track=track, session=session)
# vote.points = points
# vote.save()
# except Vote.DoesNotExist:
# vote = Vote.objects.create(user=user, track=track, points=points, session=session)
# vote.save()
if action == "pause":
pass
if action == "next":
pass
# Receive message from room group def announce(self, event):
def chat_message(self, event): user = event["user"]
message = event["message"] self.send(text_data=json.dumps({"joined": user}))
print(self.scope["user"])
# Send message to WebSocket # Receive message from room group
self.send(text_data=json.dumps({"message": message})) def chat_message(self, event):
message = event["message"]
print(self.scope["user"])
# Send message to WebSocket
self.send(text_data=json.dumps({"message": message}))
+19 -5
View File
@@ -32,17 +32,30 @@ export default function Lobby() {
} }
useEffect(() => { useEffect(() => {
if (sessionId) { console.log("session: ", sessionId);
const socket = new WebSocket( let socket;
if (sessionId && !sessionSocket) {
socket = new WebSocket(
`${process.env.NEXT_PUBLIC_WS_HOST}/voting/session/${sessionId}/`, `${process.env.NEXT_PUBLIC_WS_HOST}/voting/session/${sessionId}/`,
); );
socket.onmessage = onMessage; socket.onmessage = onMessage;
setSessionSocket(socket); if (!sessionSocket) {
setSessionSocket(socket);
console.log("session made: ", sessionId);
} else {
socket.close();
}
} }
return () => {
if (socket) {
socket.close();
}
};
}, [sessionId]); }, [sessionId]);
function addUser(userName: string) { function addUser(userName: string) {
if (userList.find((user) => user.name === userName)) { console.log(userList);
if (userList.find((user) => user.name == userName)) {
return; return;
} }
const newUser = { const newUser = {
@@ -51,7 +64,8 @@ export default function Lobby() {
avatar: `https://i.pravatar.cc/150?img=${userList.length + 1}`, avatar: `https://i.pravatar.cc/150?img=${userList.length + 1}`,
host: userList.length === 0, host: userList.length === 0,
}; };
setUserList((prevUserList) => [...prevUserList, newUser]); const newUserList = [...userList, newUser];
setUserList(newUserList);
} }
return ( return (