How to create private chat room consummer with django chennals?

Viewed 155

My goal is to create a consumer which provides us with the functionality of private chat. In private chat, There should be two users who exchange messages. Write now anyone can see anybody's message this what I'm trying to fix.

consumer.py

  # chat/consumers.py
import json
from channels.generic.websocket import AsyncWebsocketConsumer

class ProjectConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        parameter =self.room_name = self.scope['url_route']['kwargs']["username"]
        print("url_parameter ",parameter)

        self.project_name = parameter

        # Join room group
        await self.channel_layer.group_add(
            self.project_name,
            self.channel_name
        )

        await self.accept()

    async def disconnect(self, close_code):
        # Leave room group
        await self.channel_layer.group_discard(
            self.project_name,
            self.channel_name
        )

    # Receive message from WebSocket
    async def receive(self, text_data):
        text_data_json = json.loads(text_data)

        sender = text_data_json['sender']
        receiver =  text_data_json['receiver']
        message = text_data_json['message']

        object = {
            'sender':sender,
            'receiver':receiver,
            'message':message,
        }

        # Send message to room group
        await self.channel_layer.group_send(
            self.project_name,
            {
                'type': 'sent', #function name as an event type
                'object': object #function parameters as an event object
            }
        )

    # Receive message from room group
    async def sent(self, event):
        sender = event['object']["sender"]
        receiver = event['object']["receiver"]
        message = event['object']["message"]
        
        # Send message to WebSocket
        await self.send(text_data=json.dumps({
            'sender':sender,
            'receiver':receiver,
            'message':message,
        }))

In advance, thank you so much if you spend time reading this and answer.

0 Answers
Related