Advertisement
Guest User

Untitled

a guest
Aug 3rd, 2022
369
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.61 KB | None | 0 0
  1. models.py
  2. ```
  3. from django.db import models
  4. from django.contrib.auth import get_user_model
  5.  
  6. User = get_user_model()
  7.  
  8. class ChatParticipantsChannel(models.Model):
  9. channel = models.CharField(max_length=256)
  10. user = models.ForeignKey(User, on_delete=models.PROTECT)
  11.  
  12. def __str__(self):
  13. return str(self.channel)
  14.  
  15. class ChatRoom(models.Model):
  16. name = models.CharField(max_length=50)
  17. last_message = models.CharField(max_length=1024, null=True)
  18. last_sent_user = models.ForeignKey(User, on_delete=models.PROTECT, null=True)
  19.  
  20. def __str__(self):
  21. return self.name
  22.  
  23.  
  24. class Messages(models.Model):
  25. room = models.ForeignKey(ChatRoom, on_delete=models.PROTECT)
  26. user = models.ForeignKey(User, on_delete=models.PROTECT)
  27. content = models.CharField(max_length=1024)
  28. created_at = models.DateTimeField(auto_now_add=True)
  29.  
  30. def __str__(self):
  31. return self.content
  32.  
  33.  
  34. class ChatRoomParticipants(models.Model):
  35. user = models.ManyToManyField(User, related_name='chatroom_users')
  36. room = models.ForeignKey(ChatRoom, on_delete=models.PROTECT)
  37. ```
  38.  
  39. consumers.py
  40. ```
  41. import json
  42. from channels.db import database_sync_to_async
  43. from channels.generic.websocket import AsyncJsonWebsocketConsumer
  44. from .models import ChatRoom, Messages, ChatParticipantsChannel
  45. from channels.layers import get_channel_layer
  46. from django.contrib.auth import get_user_model
  47.  
  48. User = get_user_model()
  49.  
  50.  
  51. class ChatConsumer(AsyncJsonWebsocketConsumer):
  52.  
  53. async def connect(self):
  54. self.user_id = self.scope['url_route']['kwargs']['user_id']
  55.  
  56. await self.save_user_channel()
  57. await self.accept()
  58.  
  59. async def disconnect(self, close_code):
  60.  
  61. await self.delete_user_channel()
  62.  
  63. # await self.channel_layer.group_discard(
  64. # self.group_room_name,
  65. # self.channel_name
  66. # )
  67.  
  68. await self.disconnect(close_code)
  69.  
  70. async def receive_json(self, text_data=None, byte_data=None):
  71. message = text_data['message']
  72. to_user = text_data['to_user']
  73. to_user_channel, to_user_id = await self.get_user_channel(to_user)
  74.  
  75. channel_layer = get_channel_layer()
  76.  
  77. self.group_name = f'{self.user_id}-{to_user}'
  78. await self.channel_layer.group_add(
  79. self.group_name,
  80. str(self.channel_name)
  81. )
  82. if to_user_channel != None and to_user_id != None:
  83. await self.channel_layer.group_add(
  84. self.group_name,
  85. str(to_user_channel)
  86. )
  87.  
  88.  
  89. await channel_layer.group_send(
  90. self.group_name, {
  91. 'type': 'send.message',
  92. 'from_user': self.user_id,
  93. 'to_user': str(to_user_id),
  94. 'message': message,
  95. }
  96. )
  97.  
  98. await self.save_message(self.group_name, self.user, message)
  99.  
  100. async def send_message(self, event):
  101. from_user = event['from_user']
  102. to_user = event['to_user']
  103. message = event['message']
  104.  
  105. # print(1)
  106. print(event)
  107.  
  108. await self.send(text_data=json.dumps({
  109. 'from_user': from_user,
  110. 'to_user': to_user,
  111. 'message': message,
  112. }))
  113.  
  114. @database_sync_to_async
  115. def get_user_channel(self, to_user):
  116. try:
  117. send_user_channel = ChatParticipantsChannel.objects.filter(
  118. user=to_user).latest('id')
  119. channel_name = send_user_channel
  120. user_id = send_user_channel.user.user_uid
  121. except Exception as e:
  122. channel_name = None
  123. user_id = None
  124.  
  125. return channel_name, user_id
  126.  
  127. @database_sync_to_async
  128. def save_user_channel(self):
  129. self.user = User.objects.get(user_uid=self.user_id)
  130.  
  131. ChatParticipantsChannel.objects.create(
  132. user=self.user,
  133. channel=self.channel_name
  134. )
  135.  
  136. @database_sync_to_async
  137. def delete_user_channel(self):
  138. ChatParticipantsChannel.objects.filter(user=self.user).delete()
  139.  
  140. @database_sync_to_async
  141. def save_message(self, room, user, content):
  142. try:
  143. chatroom = ChatRoom.objects.get(name=str(room))
  144. chatroom.last_message = content
  145. chatroom.last_sent_user = self.user
  146. chatroom.save()
  147. except:
  148. chatroom = ChatRoom.objects.create(
  149. name=str(room), last_message=content, last_sent_user=self.user
  150. )
  151.  
  152. Messages.objects.create(
  153. room=chatroom, user=self.user, content=content
  154. )
  155.  
  156.  
  157. ```
  158.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement