Files
OneTrip/one_trip_api/ws/consumers.py
Alexander Laevens 7dd7abc09c Convert dart:io websocket to web_socket_channel
Now send token as query parameter instead
2022-11-30 16:02:42 -07:00

52 lines
1.8 KiB
Python

from channels.db import database_sync_to_async
from channels.generic.websocket import AsyncJsonWebsocketConsumer
from rest_framework.authtoken.models import Token
from api.models import Homegroup
from users.models import User
from urllib.parse import parse_qs
class ChatConsumer(AsyncJsonWebsocketConsumer):
async def connect(self):
query_params = parse_qs(self.scope["query_string"].decode())
query_params.setdefault("authorization", [""])
token_homegroup = await self.get_homegroup_by_token(query_params["authorization"][0])
if token_homegroup is None:
await self.accept()
await self.close(3000)
else:
self.room_name = token_homegroup.id
self.room_group_name = f"group_{self.room_name}"
await self.channel_layer.group_add(self.room_group_name, self.channel_name)
await self.accept()
async def receive_json(self, content, **kwargs):
await self.channel_layer.group_send(
self.room_group_name,
content
)
async def disconnect(self, close_code):
if (close_code != 3000):
await self.channel_layer.group_discard(self.room_group_name, self.channel_name)
async def broadcast_update(self, event):
await self.send_json(content={"type": "recommend_update", "hash": event["hash"]})
@database_sync_to_async
def get_homegroup_by_token(self, tokenString):
queryset = Token.objects.filter(key=tokenString)
if queryset.exists():
return Token.objects.get(key=tokenString).user.homegroup
else:
return None
@database_sync_to_async
def get_homegroup_by_id(self, group_id):
queryset = Homegroup.objects.filter(id=group_id)
if queryset.exists():
return queryset.get()
else:
return None