Files
OneTrip/one_trip_api/ws/consumers.py
2022-11-30 02:52:56 -07:00

52 lines
1.9 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
class ChatConsumer(AsyncJsonWebsocketConsumer):
async def connect(self):
token_homegroup = await self.get_homegroup_by_token(self.scope["headers"])
if token_homegroup is None:
await self.disconnect(1)
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):
await self.channel_layer.group_discard(self.room_group_name, self.channel_name)
async def broadcast_update(self, event):
print(event)
await self.send_json(content={"type": "recommend_update", "hash": event["hash"]})
@database_sync_to_async
def get_homegroup_by_token(self, headers):
headers = self.scope["headers"]
for pair in headers:
if pair[0].decode("UTF-8") == "authorization":
tokenType, tokenString = pair[1].decode("UTF-8").split()
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