diff --git a/youmubot-core/src/community/votes.rs b/youmubot-core/src/community/votes.rs index df666c5..54964a3 100644 --- a/youmubot-core/src/community/votes.rs +++ b/youmubot-core/src/community/votes.rs @@ -95,7 +95,7 @@ pub fn vote(ctx: &mut Context, msg: &Message, mut args: Args) -> CommandResult { let reaction_to_choice: Map<_, _> = choices.iter().map(|r| (r.0, &r.1)).collect(); let mut user_reactions: Map> = Map::new(); - ctx.data.get_cloned::().handle_reactions( + ctx.data.get_cloned::().handle_reactions_timed( |reaction: &Reaction, is_add| { if reaction.message_id != panel.id { return Ok(()); diff --git a/youmubot-prelude/src/reaction_watch.rs b/youmubot-prelude/src/reaction_watch.rs index 2eb9b05..d2d0c71 100644 --- a/youmubot-prelude/src/reaction_watch.rs +++ b/youmubot-prelude/src/reaction_watch.rs @@ -50,7 +50,7 @@ impl ReactionWatcher { } /// React! to a series of reaction /// - /// The reactions stop after `duration`. + /// The reactions stop after `duration` of idle. pub fn handle_reactions( &self, mut h: impl ReactionHandler, @@ -72,4 +72,28 @@ impl ReactionWatcher { } Ok(()) } + /// React! to a series of reaction + /// + /// The handler will stop after `duration` no matter what. + pub fn handle_reactions_timed( + &self, + mut h: impl ReactionHandler, + duration: std::time::Duration, + ) -> CommandResult { + let (send, reactions) = bounded(0); + { + self.channels.lock().expect("Poisoned!").push(send); + } + let timeout = after(duration); + loop { + let r = select! { + recv(reactions) -> r => { let (r, is_added) = r.unwrap(); h.handle_reaction(&*r, is_added) }, + recv(timeout) -> _ => break, + }; + if let Err(v) = r { + dbg!(v); + } + } + Ok(()) + } }