Guest User

Untitled

a guest
May 28th, 2025
29
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.49 KB | None | 0 0
  1. import json
  2. from channels.consumer import AsyncConsumer
  3.  
  4. from channels.generic.websocket import AsyncJsonWebsocketConsumer
  5. from asgiref.sync import sync_to_async
  6. import base64
  7.  
  8.  
  9. # Channel consumer for both chat room group
  10.  
  11. class ChatConsumer(AsyncJsonWebsocketConsumer):
  12.     async def connect(self):
  13.         self.room_name = self.scope['url_route']['kwargs']['room_name']
  14.         self.room_group_name = 'chat_%s' % self.room_name
  15.        
  16.         # Join room group
  17.         await self.channel_layer.group_add(self.room_group_name, self.channel_name)
  18.        
  19.         await self.accept()
  20.        
  21.        
  22.     async def disconnect(self, close_code):
  23.  
  24.         # Leave room group
  25.         await self.channel_layer.group_discard(self.room_group_name, self.channel_name)
  26.        
  27.     # Receive message from WebSocket
  28.    
  29.     async def receive(self, text_data):
  30.         text_data_json = json.loads(text_data)
  31.         message = text_data_json['message']
  32.  
  33.         if message_type == 'edit_message':
  34.             message_id = text_data_json['message_id']
  35.             new_message = text_data_json['new_message']
  36.             await self.edit_message(message_id, new_message)
  37.            
  38.  
  39.         @sync_to_async
  40.         def edit_message(self, message_id, new_message):
  41.             # update retreived message from database
  42.             message = Message.objects.get(id=message_id)
  43.             message.content = new_message
  44.             message.save()
  45.  
  46.         # broadcast (send) to group
  47.         self.channel_layer.group_send(
  48.             self.group_name,
  49.             {
  50.                 'type': 'message_edited',
  51.                 'message_id': message_id,
  52.                 'new_message': new_message,
  53.             }
  54.         }
  55.  
  56.     async def message_edited(self, event):
  57.         message_id = event['message_id']
  58.         new_message = event['new_message']
  59.         await self.send(text_data=json.dumps({
  60.             'type': 'message_edited',
  61.             'message_id': message_id,
  62.             'new_message': new_message,
  63.         }))
  64.         print(f"Received message: {message}")
  65.         # Send message to room group
  66.         await self.channel_layer.group_send(
  67.             self.room_group_name, {'type': 'chat.message', 'message': message}
  68.         )
  69.        
  70.     # Receive message from room group
  71.    
  72.     async def chat_message(self, event):
  73.         message = event['message']
  74.         print(f"Broadcasting message: {message}")  # Debugging output
  75.         # send message to websocket
  76.         await self.send(text_data=json.dumps({'message': message}))
  77.        
  78.        
  79. # Channel Consumer that consumed events for uploading/receiving image files in the message room
  80.  
  81. class UploadImageConsumer(AsyncJsonWebsocketConsumer):
  82.     async def connect(self):
  83.         await self.accept()
  84.        
  85.  
  86.     async def disconnect(self, close_code):
  87.  
  88.         async def receive(self, bytes_data=None, text_data=None):
  89.             if bytes_data:
  90.             # Handles image file chunks (binary data)
  91.            
  92.                 with open('image.jpg', 'rb') as f:
  93.                     fcontent = f.read()
  94.                 await self.send(base64.b64encode(fcontent).decode('utf-8'))
  95.             elif text_data:
  96.                 # Handles metadata (text data)
  97.            
  98.                 await self.send(text_data=json.dumps({'message': text_data}))
  99.            
  100.            
  101.     async def send_image(self, event):
  102.         image_data = event['image_text']
  103.         await self.send(bytes_data=image_data)
  104.        
  105.        
Add Comment
Please, Sign In to add comment