From aba72aa64d7a50ec33610dc7a61ed14e3c635a2a Mon Sep 17 00:00:00 2001 From: Matthias Ahouansou Date: Tue, 2 Apr 2024 15:21:24 +0000 Subject: [PATCH] Prevent sending duplicate reaction events (#240) --- src/base.rs | 16 ++++++++++++++++ src/windows/room/chat.rs | 7 +++++++ 2 files changed, 23 insertions(+) diff --git a/src/base.rs b/src/base.rs index 49a1312..ef52551 100644 --- a/src/base.rs +++ b/src/base.rs @@ -1149,6 +1149,22 @@ impl RoomInfo { return top; } + + /// Checks if a given user has reacted with the given emoji on the given event + pub fn user_reactions_contains( + &mut self, + user_id: &UserId, + event_id: &EventId, + emoji: &str, + ) -> bool { + if let Some(reactions) = self.reactions.get(event_id) { + reactions + .values() + .any(|(annotation, user)| annotation == emoji && user == user_id) + } else { + false + } + } } /// Generate a [CompletionMap] for Emoji shortcodes. diff --git a/src/windows/room/chat.rs b/src/windows/room/chat.rs index 8f49672..8f42d72 100644 --- a/src/windows/room/chat.rs +++ b/src/windows/room/chat.rs @@ -372,6 +372,13 @@ impl ChatState { }, }; + if info.user_reactions_contains(&settings.profile.user_id, &event_id, &emoji) { + let msg = format!("You’ve already reacted to this message with {}", emoji); + let err = UIError::Failure(msg); + + return Err(err); + } + let reaction = Annotation::new(event_id, emoji); let msg = ReactionEventContent::new(reaction); let _ = room.send(msg).await.map_err(IambError::from)?;