@@ -121,6 +121,7 @@ def __init__(self, controller: Any) -> None:
121
121
[
122
122
("message" , self ._handle_message_event ),
123
123
("update_message" , self ._handle_update_message_event ),
124
+ ('delete_message' , self ._handle_delete_message_event ),
124
125
("reaction" , self ._handle_reaction_event ),
125
126
("subscription" , self ._handle_subscription_event ),
126
127
("typing" , self ._handle_typing_event ),
@@ -1160,6 +1161,52 @@ def _update_topic_index(self, stream_id: int, topic_name: str) -> None:
1160
1161
# Update the index.
1161
1162
self .index ["topics" ][stream_id ] = topic_list
1162
1163
1164
+ def _handle_delete_message_event (self , event : Event ) -> None :
1165
+ """
1166
+ Handles message delete event.
1167
+ TODO: Handle bulk_message_deletion when we support that
1168
+ """
1169
+ assert event ['type' ] == 'delete_message'
1170
+
1171
+ message_id = event ['message_id' ]
1172
+ indexed_message = self .index ["messages" ].get (message_id , None )
1173
+
1174
+ # deleted_message = self.index['messages'].pop(message_id, None)
1175
+ if indexed_message :
1176
+ # Update unread_count if message was unread before being deleted
1177
+ # We need to do this before removing the message from index.
1178
+ # FIXME: Does it feel hacky to mark the message as read instead
1179
+ # of using something like unset_count?
1180
+ set_count ([message_id ], self .controller , - 1 )
1181
+
1182
+ # Remove all traces of the message from index if present and
1183
+ # update the rendered view.
1184
+ # FIXME?: Do we need to archive the message instead of completely
1185
+ # erasing from index?
1186
+ self .index ["messages" ].pop (message_id , None )
1187
+ self .index ["all_msg_ids" ].discard (message_id )
1188
+ self .index ["mentioned_msg_ids" ].discard (message_id )
1189
+ self .index ["edited_messages" ].discard (message_id )
1190
+
1191
+ if event ["message_type" ] == "private" :
1192
+ self .index ["private_msg_ids" ].discard (message_id )
1193
+ sender_id = event ["sender_id" ]
1194
+ private_msg_set = self .index ["private_msg_ids_by_user_ids" ]
1195
+ for user_id_set , msg_id in private_msg_set .items ():
1196
+ if sender_id in user_id_set :
1197
+ private_msg_set [user_id_set ].discard (msg_id )
1198
+ else :
1199
+ stream_id , topic = event ["stream_id" ], event ["topic" ]
1200
+ stream_msg_ids = self .index ["stream_msg_ids_by_stream_id" ].get (
1201
+ stream_id , None )
1202
+ if stream_msg_ids :
1203
+ stream_msg_ids .discard (message_id )
1204
+ topic_msg_ids = self .index ["topic_msg_ids" ][stream_id ].get (topic , None )
1205
+ if topic_msg_ids :
1206
+ topic_msg_ids .discard (message_id )
1207
+
1208
+ self ._update_rendered_view (message_id )
1209
+
1163
1210
def _handle_update_message_event (self , event : Event ) -> None :
1164
1211
"""
1165
1212
Handle updated (edited) messages (changed content/subject)
@@ -1327,6 +1374,11 @@ def _update_rendered_view(self, msg_id: int) -> None:
1327
1374
for msg_w in view .message_view .log :
1328
1375
msg_box = msg_w .original_widget
1329
1376
if msg_box .message ["id" ] == msg_id :
1377
+ # Remove message if deleted
1378
+ if (msg_id not in self .index ["messages" ]):
1379
+ view .message_view .log .remove (msg_w )
1380
+ self .controller .update_screen ()
1381
+ return
1330
1382
# Remove the message if it no longer belongs in the current
1331
1383
# narrow.
1332
1384
if (
0 commit comments