diff --git a/youmubot-core/src/community/mod.rs b/youmubot-core/src/community/mod.rs index dd3f280..4a947f9 100644 --- a/youmubot-core/src/community/mod.rs +++ b/youmubot-core/src/community/mod.rs @@ -51,6 +51,7 @@ Note that only online/idle users in the channel are chosen from."] #[bucket = "community"] #[max_args(2)] pub async fn choose(ctx: &Context, m: &Message, mut args: Args) -> CommandResult { + let flags = Flags::collect_from(&mut args); let role = args.find::().ok(); let title = if args.is_empty() { "the chosen one".to_owned() @@ -58,6 +59,8 @@ pub async fn choose(ctx: &Context, m: &Message, mut args: Args) -> CommandResult args.single::()? }; + let online_only = !flags.contains("everyone"); + let users: Result, Error> = { let guild = m.guild(&ctx).await.unwrap(); let presences = &guild.presences; @@ -69,6 +72,9 @@ pub async fn choose(ctx: &Context, m: &Message, mut args: Args) -> CommandResult .into_iter() .filter(|v| !v.user.bot) // Filter out bots .filter(|v| { + if !online_only { + return true; + } // Filter out only online people presences .get(&v.user.id) diff --git a/youmubot-prelude/src/flags.rs b/youmubot-prelude/src/flags.rs new file mode 100644 index 0000000..1bd0418 --- /dev/null +++ b/youmubot-prelude/src/flags.rs @@ -0,0 +1,38 @@ +use serenity::prelude::Args; +use std::collections::HashSet as Set; + +/// Handle flags parsing. +pub struct Flags(Set); + +struct Flag(pub String); + +impl std::str::FromStr for Flag { + type Err = (); + + fn from_str(s: &str) -> Result { + if s.starts_with("--") { + Ok(Flag(s.trim_start_matches("--").to_owned())) + } else { + Err(()) + } + } +} + +impl Flags { + /// Parses the set of flags from a given `Args` structure. + pub fn collect_from(args: &mut Args) -> Flags { + let mut set = Set::new(); + loop { + if let Some(Flag(s)) = args.find().ok() { + set.insert(s); + } else { + break Flags(set); + } + } + } + + /// Checks whether `flag` exists in the flags set. + pub fn contains(&self, flag: impl AsRef) -> bool { + self.0.contains(flag.as_ref()) + } +} diff --git a/youmubot-prelude/src/lib.rs b/youmubot-prelude/src/lib.rs index 39469cb..6ea52a6 100644 --- a/youmubot-prelude/src/lib.rs +++ b/youmubot-prelude/src/lib.rs @@ -5,6 +5,7 @@ use std::sync::Arc; pub mod announcer; pub mod args; +pub mod flags; pub mod hook; pub mod member_cache; pub mod pagination; @@ -13,6 +14,7 @@ pub mod setup; pub use announcer::{Announcer, AnnouncerHandler}; pub use args::{Duration, UsernameArg}; +pub use flags::Flags; pub use hook::Hook; pub use member_cache::MemberCache; pub use pagination::{paginate, paginate_fn, paginate_reply, paginate_reply_fn, Paginate};