@@ -90,6 +90,7 @@ async def receive_json(self, content, **kwargs):
9090 EventType .TYPING ,
9191 EventType .READ_MESSAGE ,
9292 EventType .DELETE_MESSAGE ,
93+ EventType .EDIT_MESSAGE ,
9394 ]:
9495 room_name = f"{ EventGroupType .CHATS_RELATED } _{ event .content .get ('chat_id' )} "
9596 try :
@@ -112,6 +113,8 @@ async def __process_chat_related_event(self, event, room_name):
112113 await self .__process_read_message_event (event , room_name )
113114 elif event .type == EventType .DELETE_MESSAGE :
114115 await self .__process_delete_message_event (event , room_name )
116+ elif event .type == EventType .EDIT_MESSAGE :
117+ await self .__process_edit_message_event (event , room_name )
115118
116119 async def __process_new_message_event (self , event , room_name ):
117120 if event .content ["chat_type" ] == ChatType .DIRECT :
@@ -149,9 +152,11 @@ async def __process_new_direct_message_event(self, event: Event):
149152 "content" : {
150153 "message_id" : msg .id ,
151154 "chat_id" : msg .chat_id ,
155+ "chat_type" : ChatType .PROJECT ,
152156 "author_id" : msg .author .pk ,
153157 "text" : msg .text ,
154158 "created_at" : msg .created_at .timestamp (),
159+ "is_edited" : msg .is_edited ,
155160 },
156161 }
157162 # send message to user's channel
@@ -193,6 +198,7 @@ async def __process_new_project_message_event(self, event: Event, room_name: str
193198 "author_id" : msg .author .pk ,
194199 "text" : msg .text ,
195200 "created_at" : msg .created_at .timestamp (),
201+ "is_edited" : msg .is_edited ,
196202 },
197203 },
198204 )
@@ -280,6 +286,12 @@ async def __process_delete_message_event(self, event: Event, room_name: str):
280286 elif event .content ["chat_type" ] == ChatType .PROJECT :
281287 await self .__process_delete_project_message_event (event , room_name )
282288
289+ async def __process_edit_message_event (self , event , room_name ):
290+ if event .content ["chat_type" ] == ChatType .DIRECT :
291+ await self .__process_edit_direct_message_event (event )
292+ elif event .content ["chat_type" ] == ChatType .PROJECT :
293+ await self .__process_edit_project_message_event (event , room_name )
294+
283295 async def __process_delete_direct_message_event (self , event ):
284296 message_id = event .content ["message_id" ]
285297
@@ -349,6 +361,9 @@ async def set_online(self, event: Event):
349361 async def set_offline (self , event : Event ):
350362 await self .send (json .dumps (event ))
351363
364+ async def edit_message (self , event : Event ):
365+ await self .send (json .dumps (event ))
366+
352367 async def __process_general_event (self , event : Event , room_name : str ):
353368 cache_key = get_user_online_cache_key (self .user )
354369 if event .type == EventType .SET_ONLINE :
@@ -371,6 +386,72 @@ async def __process_general_event(self, event: Event, room_name: str):
371386 else :
372387 raise ValueError ("Unknown event type" )
373388
389+ async def __process_edit_direct_message_event (self , event ):
390+ chat_id , other_user = await get_chat_and_user_ids_from_content (
391+ event .content , self .user
392+ )
393+ # if chat_id == 17_7, then chat_id will be == 7_17
394+ chat_id = DirectChat .get_chat_id_from_users (self .user , other_user )
395+
396+ # check if chat exists ( this raises exception if not )
397+ await sync_to_async (DirectChat .objects .get )(pk = chat_id )
398+
399+ msg = await sync_to_async (DirectChatMessage .objects .get )(
400+ pk = event .content ["message_id" ]
401+ )
402+ msg .text = event .content ["message" ]
403+ msg .is_edited = True
404+ await sync_to_async (msg .save )()
405+ content = {
406+ "type" : EventType .EDIT_MESSAGE ,
407+ "content" : {
408+ "message_id" : msg .id ,
409+ "chat_id" : msg .chat_id ,
410+ "author_id" : msg .author_id ,
411+ "text" : msg .text ,
412+ "created_at" : msg .created_at .timestamp (),
413+ "is_edited" : msg .is_edited ,
414+ },
415+ }
416+ # send message to user's channel
417+ other_user_channel = cache .get (get_user_channel_cache_key (other_user ), None )
418+ await self .channel_layer .send (self .channel_name , content )
419+
420+ if other_user_channel is None :
421+ return
422+
423+ await self .channel_layer .send (other_user_channel , content )
424+
425+ async def __process_edit_project_message_event (self , event , room_name ):
426+ chat_id = event .content ["chat_id" ]
427+ chat = await sync_to_async (ProjectChat .objects .get )(pk = chat_id )
428+
429+ # check that user is in this chat
430+ users = await sync_to_async (chat .get_users )()
431+ if self .user not in users :
432+ raise UserNotInChatException (
433+ f"User { self .user .id } is not in project chat { chat_id } "
434+ )
435+
436+ message = await sync_to_async (ProjectChatMessage .objects .get )(
437+ pk = event .content ["message_id" ]
438+ )
439+ message .text = event .content ["text" ]
440+ message .is_edited = True
441+ await sync_to_async (message .save )()
442+ content = {
443+ "message_id" : message .id ,
444+ "chat_id" : message .chat_id ,
445+ "author_id" : message .author .pk ,
446+ "text" : message .text ,
447+ "created_at" : message .created_at .timestamp (),
448+ "is_edited" : message .is_edited ,
449+ }
450+ await self .channel_layer .group_send (
451+ room_name ,
452+ {"type" : EventType .EDIT_MESSAGE , "content" : content },
453+ )
454+
374455
375456class NotificationConsumer (AsyncJsonWebsocketConsumer ):
376457 # TODO: implement this
0 commit comments