0

I am using django channels for the first time and can't wrap my head around something. Here is what I am trying to achieve; I want to create a new message in ChatConsumer which is all good and fine. Problem occurs when i try to pass the id of the chat that new message was created in. I don't get any errors or feedback or nothing. It just fails silently.

Here is the code base

class ChatConsumer(WebsocketConsumer):
    """
        On initial request, validate user before allowing connection to be accepted
    """
    #on intial request
    def connect(self):

        self.room_name = self.scope['url_route']['kwargs']['room_name']
        self.room_group_name = f'chat_{self.room_name}'
        
        async_to_sync(self.channel_layer.group_add)(
            self.room_group_name,
            self.channel_name
        )

        # accept connection
        self.accept()

        # send response
        self.send(text_data=json.dumps({
            'type':'connection_established',
            'message':'You are connected'
        }))
    
    def receive(self, text_data):
        # get data sent from front end
        text_data_json = json.loads(text_data)
        # message 
        message = str(text_data_json['form']['message'])
        if message.strip() == "":
            message = None
        # try to decode image or set to none if not available
        try:
            
            base64_image = text_data_json['form']['image']
            if base64_image.startswith('data:image'):
                base64_image = base64_image.split(';base64,')[1]
            img_name = random.randint(1111111111111,999999999999999)
            data = ContentFile(base64.b64decode(base64_image), name= 'image' + str(img_name) + '.jpg')
        except AttributeError:
            data = None
        # send message
        sender = self.scope['user']
        # extract chat ID
        chat_id = int(self.scope['url_route']['kwargs']['room_name'])
        try:
            _chat = Chat.objects.get(id = chat_id)
        except Chat.DoesNotExist:
            self.close()
        _requesting_user = self.scope['user']
        # make sure user is in the conversation before attempting to create message
        if _chat.user_1 == _requesting_user.id or _chat.user_2 == _requesting_user.id:
            # get host address from header dictionary
            base = self.scope['headers']
            host = ''
            for _ in base:
                if _[0] == b'origin':
                    host = _[1].decode('utf-8')
                    break
            chat_user = ChatUser.objects.get(user = sender)
            # if message is valid, create.
            if message != None or data != None:
                new_message = Message.objects.create(message = message, chat = _chat, user = chat_user, media = data)
                
                # boradcast chat id to chat list consumer of other user after creation
                
                #get receiver id
                if sender.id == _chat.user_1:
                    receiver_id = int(_chat.user_2)
                else:
                    receiver_id = int(_chat.user_1)
                receiver = f'user_{sender.id}'
                
                # send message to that user consumer... CODE DOESN'T SEND ANYTHING BUT PROGRAMS PROCECEED SUCCESSFULLY

                
                async_to_sync(self.channel_layer.group_send(
                    f"user_{receiver_id}",
                    {
                        'type':'new_message_signal',
                        'chat_id' : _chat.id
                    }
                ))
                
                _serialized_data = _serialize_message(user = _requesting_user, base = host,  message= new_message)
                # set up alert both users of new message
                _chat.user_1_has_read = False
                _chat.user_2_has_read = False
                _chat.save()
                # broadcast to group
                async_to_sync(self.channel_layer.group_send)(
                    self.room_group_name,
                    {
                        'type':'chat_message',
                        'message' : _serialized_data
                    }
                )
        
    def chat_message(self, event):
        message = event['message']
        # get user to check if message being broadcast to them was sent by them
        user = self.scope['user']
        chat_user = ChatUser.objects.get(user = user)
        if chat_user.id != message['user']:
            message['from'] = True
        else:
            message['from'] = False
        # get chat to mark all users currently in connection as read
        chat = Chat.objects.get(id =  int(message['chat']))
        if user.id == chat.user_1:
            chat.user_1_has_read = True
        if user.id == chat.user_2:
            chat.user_2_has_read = True
        chat.save()
        # send response
        self.send(json.dumps({
            'type':'new_message',
            'message' : message
        }))


Here is the ChatListConsumer instance meant to receive and handle it

class ChatListConsumer(WebsocketConsumer):
    def connect(self):
        user = self.scope['user'] # get user on start of connection
        self.room_group_name = f"user_{user.id}" # add each user to their own group while they're online

        async_to_sync(self.channel_layer.group_add)(
            self.room_group_name,
            self.channel_name
        ) # add group

        self.accept()
        print(self.room_group_name)

        self.send(text_data=json.dumps({
            'type' : 'connected',
            'message':'You have been connected'
        }))


    def receive(self, text_data):
        data =  json.loads(text_data)
        print(data)

        
    def new_message_signal(self, event): # receive signal from other consumer
        print(event)
        chat_id = event['chat_id'] # id of chat to send back to front-end
        print(f"Chat is of new chat is {chat_id}.")# nothing happens
        
            

Nothing happens. Both channels work indivdually. I can send to and from both the chat and the global sockets individually. Just when i try to pass from chat to global afterwards, it fails silently.

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.