52 lines
1.8 KiB
Python
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
|