diff --git a/src/base.rs b/src/base.rs index fef5b11..0b2b8d0 100644 --- a/src/base.rs +++ b/src/base.rs @@ -1146,6 +1146,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)?;