diff options
Diffstat (limited to 'src/framework')
| -rw-r--r-- | src/framework/standard/args.rs | 149 | ||||
| -rw-r--r-- | src/framework/standard/command.rs | 23 | ||||
| -rw-r--r-- | src/framework/standard/configuration.rs | 24 | ||||
| -rw-r--r-- | src/framework/standard/create_command.rs | 21 | ||||
| -rw-r--r-- | src/framework/standard/create_group.rs | 8 | ||||
| -rw-r--r-- | src/framework/standard/help_commands.rs | 31 | ||||
| -rw-r--r-- | src/framework/standard/mod.rs | 43 |
7 files changed, 146 insertions, 153 deletions
diff --git a/src/framework/standard/args.rs b/src/framework/standard/args.rs index 7fb82e4..fab27a5 100644 --- a/src/framework/standard/args.rs +++ b/src/framework/standard/args.rs @@ -64,7 +64,12 @@ pub struct Args { } impl Args { - pub fn new(message: &str, delimiter: &str) -> Self { + pub fn new(message: &str, possible_delimiters: Vec<String>) -> Self { + let delimiter = possible_delimiters + .iter() + .find(|&d| message.contains(d)) + .map_or(possible_delimiters[0].as_str(), |s| s.as_str()); + let split = if message.trim().is_empty() { Vec::new() } else { @@ -78,14 +83,14 @@ impl Args { } /// Removes the first element, parses it to a specific type if necessary, returns. - /// + /// /// # Examples - /// + /// /// ```rust /// use serenity::framework::standard::Args; - /// - /// let mut args = Args::new("42 69", " "); - /// + /// + /// let mut args = Args::new("42 69", vec![" ".to_owned()]); + /// /// assert_eq!(args.single::<i32>().unwrap(), 42); /// assert_eq!(args, ["69"]); /// ``` @@ -107,18 +112,18 @@ impl Args { /// /// [`single`]: #method.single /// [`FromStrZc`]: trait.FromStrZc.html - pub fn single_zc<'a, T: FromStrZc<'a> + 'a>(&'a mut self) -> Result<T, T::Err> + pub fn single_zc<'a, T: FromStrZc<'a> + 'a>(&'a mut self) -> Result<T, T::Err> where T::Err: StdError { - + // This is a hack as to mitigate some nasty lifetime errors. // // (Culprit `Vec::remove`s return type) fn get_and_remove(b: &mut Vec<String>) -> Option<&str> { struct GetThenRemove<'a>(&'a mut Vec<String>); - + impl<'a> Drop for GetThenRemove<'a> { fn drop(&mut self) { - if !self.0.is_empty() { + if !self.0.is_empty() { self.0.remove(0); } } @@ -134,16 +139,16 @@ impl Args { /// Like [`single`], but doesn't remove the element. /// /// # Examples - /// + /// /// ```rust /// use serenity::framework::standard::Args; - /// - /// let args = Args::new("42 69", " "); - /// + /// + /// let args = Args::new("42 69", vec![" ".to_owned()]); + /// /// assert_eq!(args.single_n::<i32>().unwrap(), 42); /// assert_eq!(args, ["42", "69"]); /// ``` - /// + /// /// [`single`]: #method.single pub fn single_n<T: FromStr>(&self) -> Result<T, T::Err> where T::Err: StdError { @@ -158,14 +163,14 @@ impl Args { } /// Skips if there's a first element, but also returns it. - /// + /// /// # Examples - /// + /// /// ```rust /// use serenity::framework::standard::Args; - /// - /// let mut args = Args::new("42 69", " "); - /// + /// + /// let mut args = Args::new("42 69", vec![" ".to_owned()]); + /// /// assert_eq!(args.skip().unwrap(), "42"); /// assert_eq!(args, ["69"]); /// ``` @@ -176,13 +181,13 @@ impl Args { /// # Examples /// ```rust /// use serenity::framework::standard::Args; - /// - /// let mut args = Args::new("42 69 88 99", " "); - /// + /// + /// let mut args = Args::new("42 69 88 99", vec![" ".to_owned()]); + /// /// assert_eq!(*args.skip_for(3).unwrap(), ["42".to_string(), "69".to_string(), "88".to_string()]); /// assert_eq!(args, ["99"]); /// ``` - /// + /// /// [`skip`]: #method.skip pub fn skip_for(&mut self, i: u32) -> Option<Vec<String>> { let mut vec = Vec::with_capacity(i as usize); @@ -195,18 +200,18 @@ impl Args { } /// Like [`single`], but takes quotes into account. - /// + /// /// # Examples - /// + /// /// ```rust /// use serenity::framework::standard::Args; - /// - /// let mut args = Args::new(r#""42"#, " "); - /// + /// + /// let mut args = Args::new(r#""42"#, vec![" ".to_owned()]); + /// /// assert_eq!(args.single_quoted::<i32>().unwrap(), 42); /// assert!(args.is_empty()); /// ``` - /// + /// /// [`single`]: #method.single pub fn single_quoted<T: FromStr>(&mut self) -> Result<T, T::Err> where T::Err: StdError { @@ -241,30 +246,30 @@ impl Args { } /// Empty outs the internal vector while parsing (if necessary) and returning them - /// + /// /// # Examples - /// + /// /// ```rust /// use serenity::framework::standard::Args; - /// - /// let mut args = Args::new("42 69", " "); - /// + /// + /// let mut args = Args::new("42 69", vec![" ".to_owned()]); + /// /// assert_eq!(*args.list::<i32>().unwrap(), [42, 69]); - /// ``` + /// ``` pub fn list<T: FromStr>(mut self) -> Result<Vec<T>, T::Err> where T::Err: StdError { Iter::<T>::new(&mut self).collect() } /// Provides an iterator of items: (`T: FromStr`) `Result<T, T::Err>`. - /// + /// /// # Examples - /// + /// /// ```rust /// use serenity::framework::standard::Args; - /// - /// let mut args = Args::new("3 4", " "); - /// + /// + /// let mut args = Args::new("3 4", vec![" ".to_owned()]); + /// /// assert_eq!(*args.iter::<i32>().map(|num| num.unwrap().pow(2)).collect::<Vec<_>>(), [9, 16]); /// assert!(args.is_empty()); /// ``` @@ -273,27 +278,27 @@ impl Args { } /// This method is just `internal_vector.join(delimiter)` - /// + /// /// # Examples - /// + /// /// ```rust /// use serenity::framework::standard::Args; - /// - /// let mut args = Args::new("42 69", " "); - /// + /// + /// let mut args = Args::new("42 69", vec![" ".to_owned()]); + /// /// assert_eq!(args.full(), "42 69"); /// ``` pub fn full(&self) -> String { self.delimiter_split.join(&self.delimiter) } /// Returns the first argument that can be converted and removes it from the list. - /// + /// /// # Examples - /// + /// /// ```rust /// use serenity::framework::standard::Args; - /// - /// let mut args = Args::new("c47 69", " "); - /// + /// + /// let mut args = Args::new("c47 69", vec![" ".to_owned()]); + /// /// assert_eq!(args.find::<i32>().unwrap(), 69); /// assert_eq!(args, ["c47"]); /// ``` @@ -322,14 +327,14 @@ impl Args { } /// Returns the first argument that can be converted and does not remove it from the list. - /// + /// /// # Examples - /// + /// /// ```rust /// use serenity::framework::standard::Args; - /// - /// let args = Args::new("c47 69", " "); - /// + /// + /// let args = Args::new("c47 69", vec![" ".to_owned()]); + /// /// assert_eq!(args.find_n::<i32>().unwrap(), 69); /// assert_eq!(args, ["c47", "69"]); /// ``` @@ -348,29 +353,29 @@ impl Args { } /// A version of `FromStr` that allows for "zero-copy" parsing. -/// +/// /// # Examples -/// +/// /// ```rust,ignore /// use serenity::framework::standard::{Args, FromStrZc}; /// use std::fmt; -/// +/// /// struct NameDiscrim<'a>(&'a str, Option<&'a str>); -/// +/// /// #[derive(Debug)] /// struct Error(&'static str); -/// +/// /// impl std::error::Error for Error { /// fn description(&self) -> &str { self.0 } /// } -/// +/// /// impl fmt::Display for Error { /// fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{}", self.0) } /// } -/// +/// /// impl<'a> FromStrZc<'a> for NameDiscrim<'a> { /// type Err = Error; -/// +/// /// fn from_str(s: &'a str) -> Result<NameDiscrim<'a>, Error> { /// let mut it = s.split("#"); /// let name = it.next().ok_or(Error("name must be specified"))?; @@ -378,16 +383,16 @@ impl Args { /// Ok(NameDiscrim(name, discrim)) /// } /// } -/// -/// let mut args = Args::new("abc#1234", " "); +/// +/// let mut args = Args::new("abc#1234", vec![" ".to_owned()]); /// let NameDiscrim(name, discrim) = args.single_zc::<NameDiscrim>().unwrap(); -/// +/// /// assert_eq!(name, "abc"); /// assert_eq!(discrim, Some("1234")); -/// ``` +/// ``` pub trait FromStrZc<'a>: Sized { type Err; - + fn from_str(s: &'a str) -> ::std::result::Result<Self, Self::Err>; } @@ -408,14 +413,14 @@ impl ::std::ops::Deref for Args { impl<'a> PartialEq<[&'a str]> for Args { fn eq(&self, other: &[&str]) -> bool { let mut b = true; - + for (s, o) in self.delimiter_split.iter().zip(other.iter()) { if s != o { b = false; break; } } - + b } } @@ -427,7 +432,7 @@ macro_rules! impl_slices { self.delimiter_split.is_empty() } } - + $( impl<'a> PartialEq<[&'a str; $num]> for Args { fn eq(&self, other: &[&str; $num]) -> bool { diff --git a/src/framework/standard/command.rs b/src/framework/standard/command.rs index b53ed90..be7ec2a 100644 --- a/src/framework/standard/command.rs +++ b/src/framework/standard/command.rs @@ -9,12 +9,9 @@ pub type Check = Fn(&mut Context, &Message, &mut Args, &Arc<Command>) -> bool + Send + Sync + 'static; -pub type Exec = Fn(&mut Context, &Message, Args) -> Result<(), Error> + Send + Sync + 'static; -pub type Help = Fn(&mut Context, &Message, HashMap<String, Arc<CommandGroup>>, Args) - -> Result<(), Error> - + Send - + Sync - + 'static; +pub type Exec = fn(&mut Context, &Message, Args) -> Result<(), Error>; +pub type Help = fn(&mut Context, &Message, HashMap<String, Arc<CommandGroup>>, Args) + -> Result<(), Error>; pub type BeforeHook = Fn(&mut Context, &Message, &str) -> bool + Send + Sync + 'static; pub type AfterHook = Fn(&mut Context, &Message, &str, Result<(), Error>) + Send + Sync + 'static; pub(crate) type InternalCommand = Arc<Command>; @@ -40,8 +37,8 @@ impl<D: fmt::Display> From<D> for Error { /// your commands. pub enum CommandType { StringResponse(String), - Basic(Box<Exec>), - WithCommands(Box<Help>), + Basic(Exec), + WithCommands(Help), } pub struct CommandGroup { @@ -88,14 +85,14 @@ pub struct Command { pub guild_only: bool, /// Whether command can only be used by owners or not. pub owners_only: bool, - pub(crate) aliases: Vec<String>, + /// Other names that can be used to call this command instead. + pub aliases: Vec<String>, } impl Command { - pub fn new<F>(f: F) -> Self - where F: Fn(&mut Context, &Message, Args) -> Result<(), Error> + Send + Sync + 'static { + pub fn new(f: fn(&mut Context, &Message, Args) -> Result<(), Error>) -> Self { Command { - exec: CommandType::Basic(Box::new(f)), + exec: CommandType::Basic(f), ..Command::default() } } @@ -106,7 +103,7 @@ impl Default for Command { Command { aliases: Vec::new(), checks: Vec::default(), - exec: CommandType::Basic(Box::new(|_, _, _| Ok(()))), + exec: CommandType::Basic(|_, _, _| Ok(())), desc: None, usage: None, example: None, diff --git a/src/framework/standard/configuration.rs b/src/framework/standard/configuration.rs index c731d31..6cb5767 100644 --- a/src/framework/standard/configuration.rs +++ b/src/framework/standard/configuration.rs @@ -20,11 +20,13 @@ use model::{GuildId, Message, UserId}; /// struct Handler; /// /// impl EventHandler for Handler {} +/// /// use serenity::Client; /// use std::env; /// use serenity::framework::StandardFramework; /// -/// let mut client = Client::new(&env::var("DISCORD_TOKEN").unwrap(), Handler); +/// let token = env::var("DISCORD_BOT_TOKEN").unwrap(); +/// let mut client = Client::new(&token, Handler).unwrap(); /// /// client.with_framework(StandardFramework::new() /// .configure(|c| c.on_mention(true).prefix("~"))); @@ -98,7 +100,7 @@ impl Configuration { /// # struct Handler; /// # /// # impl EventHandler for Handler {} - /// # let mut client = Client::new("token", Handler); + /// # let mut client = Client::new("token", Handler).unwrap(); /// use serenity::model::GuildId; /// use serenity::framework::StandardFramework; /// @@ -123,7 +125,7 @@ impl Configuration { /// # struct Handler; /// # /// # impl EventHandler for Handler {} - /// # let mut client = Client::new("token", Handler); + /// # let mut client = Client::new("token", Handler).unwrap(); /// use serenity::model::UserId; /// use serenity::framework::StandardFramework; /// @@ -161,7 +163,7 @@ impl Configuration { /// # struct Handler; /// # /// # impl EventHandler for Handler {} - /// # let mut client = Client::new("token", Handler); + /// # let mut client = Client::new("token", Handler).unwrap(); /// use serenity::framework::StandardFramework; /// /// let disabled = vec!["ping"].into_iter().map(|x| x.to_string()).collect(); @@ -191,7 +193,7 @@ impl Configuration { /// # struct Handler; /// # /// # impl EventHandler for Handler {} - /// # let mut client = Client::new("token", Handler); + /// # let mut client = Client::new("token", Handler).unwrap(); /// use serenity::framework::StandardFramework; /// /// client.with_framework(StandardFramework::new() @@ -276,7 +278,7 @@ impl Configuration { /// # struct Handler; /// # /// # impl EventHandler for Handler {} - /// # let mut client = Client::new("token", Handler); + /// # let mut client = Client::new("token", Handler).unwrap(); /// use serenity::model::UserId; /// use serenity::framework::StandardFramework; /// @@ -291,7 +293,7 @@ impl Configuration { /// # struct Handler; /// # /// # impl EventHandler for Handler {} - /// # let mut client = Client::new("token", Handler); + /// # let mut client = Client::new("token", Handler).unwrap(); /// use serenity::model::UserId; /// use std::collections::HashSet; /// use serenity::framework::StandardFramework; @@ -320,7 +322,7 @@ impl Configuration { /// # struct Handler; /// # /// # impl EventHandler for Handler {} - /// # let mut client = Client::new("token", Handler); + /// # let mut client = Client::new("token", Handler).unwrap(); /// # /// use serenity::framework::StandardFramework; /// @@ -345,7 +347,7 @@ impl Configuration { /// # struct Handler; /// # /// # impl EventHandler for Handler {} - /// # let mut client = Client::new("token", Handler); + /// # let mut client = Client::new("token", Handler).unwrap(); /// # /// use serenity::framework::StandardFramework; /// @@ -369,7 +371,7 @@ impl Configuration { /// # struct Handler; /// # /// # impl EventHandler for Handler {} - /// # let mut client = Client::new("token", Handler); + /// # let mut client = Client::new("token", Handler).unwrap(); /// # /// use serenity::framework::StandardFramework; /// @@ -394,7 +396,7 @@ impl Configuration { /// # struct Handler; /// # /// # impl EventHandler for Handler {} - /// # let mut client = Client::new("token", Handler); + /// # let mut client = Client::new("token", Handler).unwrap(); /// # /// use serenity::framework::StandardFramework; /// diff --git a/src/framework/standard/create_command.rs b/src/framework/standard/create_command.rs index 9df9c82..c1558ce 100644 --- a/src/framework/standard/create_command.rs +++ b/src/framework/standard/create_command.rs @@ -47,7 +47,8 @@ impl CreateCommand { /// use std::env; /// use std::sync::Arc; /// - /// let mut client = Client::new(&env::var("DISCORD_TOKEN").unwrap(), Handler); + /// let token = env::var("DISCORD_TOKEN").unwrap(); + /// let mut client = Client::new(&token, Handler).unwrap(); /// /// client.with_framework(StandardFramework::new() /// .configure(|c| c.prefix("~")) @@ -106,9 +107,8 @@ impl CreateCommand { /// See [`exec_str`] if you _only_ need to return a string on command use. /// /// [`exec_str`]: #method.exec_str - pub fn exec<F>(mut self, func: F) -> Self - where F: Fn(&mut Context, &Message, Args) -> Result<(), CommandError> + Send + Sync + 'static { - self.0.exec = CommandType::Basic(Box::new(func)); + pub fn exec(mut self, func: fn(&mut Context, &Message, Args) -> Result<(), CommandError>) -> Self { + self.0.exec = CommandType::Basic(func); self } @@ -117,14 +117,11 @@ impl CreateCommand { /// the internal HashMap of commands, used specifically for creating a help /// command. /// - /// You can return `Err(Custom(string))` if there's an error. - pub fn exec_help<F>(mut self, f: F) -> Self - where F: Fn(&mut Context, &Message, HashMap<String, Arc<CommandGroup>>, Args) - -> Result<(), CommandError> - + Send - + Sync - + 'static { - self.0.exec = CommandType::WithCommands(Box::new(f)); + /// You can return `Err(From::from(string))` if there's an error. + pub fn exec_help(mut self, f: + fn(&mut Context, &Message, HashMap<String, Arc<CommandGroup>>, Args) + -> Result<(), CommandError>) -> Self { + self.0.exec = CommandType::WithCommands(f); self } diff --git a/src/framework/standard/create_group.rs b/src/framework/standard/create_group.rs index 911d2ea..39fbcc6 100644 --- a/src/framework/standard/create_group.rs +++ b/src/framework/standard/create_group.rs @@ -70,14 +70,14 @@ impl CreateGroup { } /// Adds a command to group with simplified API. - /// You can return Err(string) if there's an error. - pub fn on<F>(mut self, command_name: &str, f: F) -> Self - where F: Fn(&mut Context, &Message, Args) -> Result<(), CommandError> + Send + Sync + 'static { + /// You can return Err(From::from(string)) if there's an error. + pub fn on(mut self, name: &str, + f: fn(&mut Context, &Message, Args) -> Result<(), CommandError>) -> Self { let cmd = Arc::new(Command::new(f)); self.0 .commands - .insert(command_name.to_string(), CommandOrAlias::Command(cmd)); + .insert(name.to_string(), CommandOrAlias::Command(cmd)); self } diff --git a/src/framework/standard/help_commands.rs b/src/framework/standard/help_commands.rs index 6b85239..8cbcb21 100644 --- a/src/framework/standard/help_commands.rs +++ b/src/framework/standard/help_commands.rs @@ -55,7 +55,7 @@ fn remove_aliases(cmds: &HashMap<String, CommandOrAlias>) -> HashMap<&String, &I /// and given the required permissions. pub fn has_all_requirements(cmd: &Command, msg: &Message) -> bool { if let Some(guild) = msg.guild() { - let guild = guild.read().unwrap(); + let guild = guild.read(); if let Some(member) = guild.members.get(&msg.author.id) { @@ -69,7 +69,7 @@ pub fn has_all_requirements(cmd: &Command, msg: &Message) -> bool { } } } - false + !cmd.guild_only } /// Posts an embed showing each individual command group and its commands. @@ -83,7 +83,7 @@ pub fn has_all_requirements(cmd: &Command, msg: &Message) -> bool { /// # struct Handler; /// # /// # impl EventHandler for Handler {} -/// # let mut client = Client::new("token", Handler); +/// # let mut client = Client::new("token", Handler).unwrap(); /// # /// use serenity::framework::standard::{StandardFramework, help_commands}; /// @@ -155,26 +155,25 @@ pub fn with_embeds(_: &mut Context, } if let Some(ref usage) = command.usage { - embed = embed.field(|f| { - f.name("Usage") - .value(&format!("`{} {}`", command_name, usage)) - }); + let value = format!("`{} {}`", command_name, usage); + + embed = embed.field("Usage", value, true); } if let Some(ref example) = command.example { - embed = embed.field(|f| { - f.name("Sample usage") - .value(&format!("`{} {}`", command_name, example)) - }); + let value = format!("`{} {}`", command_name, example); + + embed = embed.field("Sample usage", value, true); } if group_name != "Ungrouped" { - embed = embed.field(|f| f.name("Group").value(&group_name)); + embed = embed.field("Group", group_name, true); } if !command.aliases.is_empty() { let aliases = command.aliases.join(", "); - embed = embed.field(|f| f.name("Aliases").value(&aliases)); + + embed = embed.field("Aliases", aliases, true); } let available = if command.dm_only { @@ -185,7 +184,7 @@ pub fn with_embeds(_: &mut Context, "In DM and guilds" }; - embed = embed.field(|f| f.name("Available").value(available)); + embed = embed.field("Available", available, true); embed }) @@ -235,7 +234,7 @@ pub fn with_embeds(_: &mut Context, } if has_commands { - e = e.field(|f| f.name(group_name).value(&desc)); + e = e.field(&group_name[..], &desc[..], true); } } e @@ -256,7 +255,7 @@ pub fn with_embeds(_: &mut Context, /// # struct Handler; /// # /// # impl EventHandler for Handler {} -/// # let mut client = Client::new("token", Handler); +/// # let mut client = Client::new("token", Handler).unwrap(); /// # /// use serenity::framework::standard::{StandardFramework, help_commands}; /// diff --git a/src/framework/standard/mod.rs b/src/framework/standard/mod.rs index a806817..fdab3a8 100644 --- a/src/framework/standard/mod.rs +++ b/src/framework/standard/mod.rs @@ -218,7 +218,8 @@ impl StandardFramework { /// use serenity::framework::StandardFramework; /// use std::env; /// - /// let mut client = Client::new(&env::var("DISCORD_TOKEN").unwrap(), Handler); + /// let token = env::var("DISCORD_TOKEN").unwrap(); + /// let mut client = Client::new(&token, Handler).unwrap(); /// client.with_framework(StandardFramework::new() /// .configure(|c| c /// .depth(3) @@ -251,7 +252,7 @@ impl StandardFramework { /// # struct Handler; /// # /// # impl EventHandler for Handler {} - /// # let mut client = Client::new("token", Handler); + /// # let mut client = Client::new("token", Handler).unwrap(); /// # /// use serenity::framework::StandardFramework; /// @@ -287,7 +288,7 @@ impl StandardFramework { /// # struct Handler; /// # /// # impl EventHandler for Handler {} - /// # let mut client = Client::new("token", Handler); + /// # let mut client = Client::new("token", Handler).unwrap(); /// # /// use serenity::framework::StandardFramework; /// @@ -396,7 +397,7 @@ impl StandardFramework { /// # struct Handler; /// # /// # impl EventHandler for Handler {} - /// # let mut client = Client::new("token", Handler); + /// # let mut client = Client::new("token", Handler).unwrap(); /// # /// use serenity::framework::StandardFramework; /// @@ -425,7 +426,7 @@ impl StandardFramework { #[cfg(feature = "cache")] fn is_blocked_guild(&self, message: &Message) -> bool { - if let Some(Channel::Guild(channel)) = CACHE.read().unwrap().channel(message.channel_id) { + if let Some(Channel::Guild(channel)) = CACHE.read().channel(message.channel_id) { let guild_id = channel.with(|g| g.guild_id); if self.configuration.blocked_guilds.contains(&guild_id) { return true; @@ -536,7 +537,7 @@ impl StandardFramework { } else { if !command.allowed_roles.is_empty() { if let Some(guild) = message.guild() { - let guild = guild.read().unwrap(); + let guild = guild.read(); if let Some(member) = guild.members.get(&message.author.id) { if let Ok(permissions) = member.permissions() { @@ -592,7 +593,7 @@ impl StandardFramework { /// # struct Handler; /// # /// # impl EventHandler for Handler {} - /// # let mut client = Client::new("token", Handler); + /// # let mut client = Client::new("token", Handler).unwrap(); /// # /// use serenity::framework::StandardFramework; /// @@ -603,20 +604,18 @@ impl StandardFramework { /// }); /// # } /// ``` - pub fn on<F, S>(mut self, command_name: S, f: F) -> Self - where F: Fn(&mut Context, &Message, Args) -> Result<(), CommandError> + Send + Sync + 'static, - S: Into<String> { + pub fn on(mut self, name: &str, + f: fn(&mut Context, &Message, Args) + -> Result<(), CommandError>) -> Self { { let ungrouped = self.groups .entry("Ungrouped".to_string()) .or_insert_with(|| Arc::new(CommandGroup::default())); if let Some(ref mut group) = Arc::get_mut(ungrouped) { - let name = command_name.into(); - group .commands - .insert(name, CommandOrAlias::Command(Arc::new(Command::new(f)))); + .insert(name.to_string(), CommandOrAlias::Command(Arc::new(Command::new(f)))); } } @@ -686,7 +685,7 @@ impl StandardFramework { /// # struct Handler; /// # /// # impl EventHandler for Handler {} - /// # let mut client = Client::new("token", Handler); + /// # let mut client = Client::new("token", Handler).unwrap(); /// # /// use serenity::framework::StandardFramework; /// @@ -719,7 +718,7 @@ impl StandardFramework { /// # struct Handler; /// # /// # impl EventHandler for Handler {} - /// # let mut client = Client::new("token", Handler); + /// # let mut client = Client::new("token", Handler).unwrap(); /// use serenity::framework::standard::DispatchError::{NotEnoughArguments, /// TooManyArguments}; /// use serenity::framework::StandardFramework; @@ -760,7 +759,7 @@ impl StandardFramework { /// # struct Handler; /// # /// # impl EventHandler for Handler {} - /// # let mut client = Client::new("token", Handler); + /// # let mut client = Client::new("token", Handler).unwrap(); /// # /// use serenity::framework::StandardFramework; /// @@ -778,7 +777,7 @@ impl StandardFramework { /// # struct Handler; /// # /// # impl EventHandler for Handler {} - /// # let mut client = Client::new("token", Handler); + /// # let mut client = Client::new("token", Handler).unwrap(); /// # /// use serenity::framework::StandardFramework; /// @@ -816,7 +815,7 @@ impl StandardFramework { /// # struct Handler; /// # /// # impl EventHandler for Handler {} - /// # let mut client = Client::new("token", Handler); + /// # let mut client = Client::new("token", Handler).unwrap(); /// # /// use serenity::framework::StandardFramework; /// @@ -910,13 +909,7 @@ impl Framework for StandardFramework { let mut content = message.content[position..].trim(); content = content[command_length..].trim(); - let delimiter = self.configuration - .delimiters - .iter() - .find(|&d| content.contains(d)) - .map_or(" ", |s| s.as_str()); - - Args::new(content, delimiter) + Args::new(&content, self.configuration.delimiters.clone()) }; if let Some(error) = self.should_fail( |