from channels.generic.websocket import AsyncWebsocketConsumer from api.logics import Logics from api.models import Order import json class ChatRoomConsumer(AsyncWebsocketConsumer): async def connect(self): self.order_id = self.scope["url_route"]["kwargs"]["order_id"] self.room_group_name = f"chat_order_{self.order_id}" self.user = self.scope["user"] self.user_nick = str(self.user) # Forbit if user is not part of the order # Does not work Async # order = Order.objects.get(id=self.order_id) # # Check if user is participant on the order. # if not (Logics.is_buyer(order[0], self.user) or Logics.is_seller(order[0], self.user)): # print ("Outta this chat") # return False await self.channel_layer.group_add(self.room_group_name, self.channel_name) await self.accept() async def disconnect(self, close_code): await self.channel_layer.group_discard(self.room_group_name, self.channel_name) async def receive(self, text_data): text_data_json = json.loads(text_data) message = text_data_json["message"] nick = text_data_json["nick"] await self.channel_layer.group_send( self.room_group_name, { "type": "chatroom_message", "message": message, "nick": nick, }, ) async def chatroom_message(self, event): message = event["message"] nick = event["nick"] # Insert a white space in words longer than 22 characters. # Helps when messages overflow in a single line. words = message.split(" ") fix_message = "" for word in words: word = " ".join(word[i:i + 22] for i in range(0, len(word), 22)) fix_message = fix_message + " " + word await self.send(text_data=json.dumps({ "message": fix_message, "user_nick": nick, })) pass