Browse Source

Reaction watcher with fixed duration

master
Natsu Kagami 10 months ago
parent
commit
3e42c74c78
Signed by untrusted user: natsukagami <natsukagami@gmail.com> GPG Key ID: 73376E117CD20735
2 changed files with 26 additions and 2 deletions
  1. +1
    -1
      youmubot-core/src/community/votes.rs
  2. +25
    -1
      youmubot-prelude/src/reaction_watch.rs

+ 1
- 1
youmubot-core/src/community/votes.rs View File

@@ -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<UserId, Vec<&str>> = Map::new();

ctx.data.get_cloned::<ReactionWatcher>().handle_reactions(
ctx.data.get_cloned::<ReactionWatcher>().handle_reactions_timed(
|reaction: &Reaction, is_add| {
if reaction.message_id != panel.id {
return Ok(());


+ 25
- 1
youmubot-prelude/src/reaction_watch.rs View File

@@ -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(())
}
}

Loading…
Cancel
Save