From e694766bb6c93d5f6a75ad9871cfdefbd0309a17 Mon Sep 17 00:00:00 2001 From: Uninteresting Account Date: Sun, 29 Oct 2017 18:27:38 +1000 Subject: Fix #206 (#207) --- src/framework/standard/command.rs | 37 +++++++++++++++++++++++++++---------- src/framework/standard/mod.rs | 2 +- 2 files changed, 28 insertions(+), 11 deletions(-) (limited to 'src/framework') diff --git a/src/framework/standard/command.rs b/src/framework/standard/command.rs index 6330810..b53ed90 100644 --- a/src/framework/standard/command.rs +++ b/src/framework/standard/command.rs @@ -131,6 +131,7 @@ pub fn positions(ctx: &mut Context, msg: &Message, conf: &Configuration) -> Opti if let Some(mention_end) = find_mention_end(&msg.content, conf) { positions.push(mention_end); + return Some(positions); } else if let Some(ref func) = conf.dynamic_prefix { if let Some(x) = func(ctx, msg) { if msg.content.starts_with(&x) { @@ -155,22 +156,18 @@ pub fn positions(ctx: &mut Context, msg: &Message, conf: &Configuration) -> Opti return None; } - if conf.allow_whitespace { - let pos = *unsafe { positions.get_unchecked(0) }; + let pos = *unsafe { positions.get_unchecked(0) }; - positions.insert(0, pos + 1); + if conf.allow_whitespace { + positions.insert(0, find_end_of_prefix_with_whitespace(&msg.content, pos).unwrap_or(pos)); + } else if find_end_of_prefix_with_whitespace(&msg.content, pos).is_some() { + return None; } Some(positions) } else if conf.on_mention.is_some() { find_mention_end(&msg.content, conf).map(|mention_end| { - let mut positions = vec![mention_end]; - - if conf.allow_whitespace { - positions.insert(0, mention_end + 1); - } - - positions + vec![mention_end] // This can simply be returned without trying to find the end whitespaces as trim will remove it later }) } else { None @@ -185,3 +182,23 @@ fn find_mention_end(content: &str, conf: &Configuration) -> Option { .map(|m| m.len()) }) } + +// Finds the end of the first continuous block of whitespace after the prefix +fn find_end_of_prefix_with_whitespace(content: &str, position: usize) -> Option { + let mut ws_split = content.split_whitespace(); + if let Some(cmd) = ws_split.nth(1) { + if let Some(index_of_cmd) = content.find(cmd) { + if index_of_cmd > position && index_of_cmd <= content.len() { + let slice = unsafe { content.slice_unchecked(position, index_of_cmd) }.as_bytes(); + for byte in slice.iter() { + // 0x20 is ASCII for space + if *byte != 0x20u8 { + return None; + } + } + return Some(index_of_cmd); + } + } + } + None +} diff --git a/src/framework/standard/mod.rs b/src/framework/standard/mod.rs index 1a7a5ee..f4c98e8 100644 --- a/src/framework/standard/mod.rs +++ b/src/framework/standard/mod.rs @@ -860,7 +860,7 @@ impl Framework for StandardFramework { 'outer: for position in positions { let mut built = String::new(); let round = message.content.chars().skip(position).collect::(); - let round = round.trim().split_whitespace().collect::>(); + let round = round.trim().split_whitespace().collect::>(); // Call to `trim` causes the related bug under the main bug #206 - where the whitespace settings are ignored. The fix is implemented as an additional check inside command::positions for i in 0..self.configuration.depth { if i != 0 { -- cgit v1.2.3 From dcac27168915b4f22745950ec0ef0c0af696774e Mon Sep 17 00:00:00 2001 From: Zeyla Hellyer Date: Mon, 30 Oct 2017 10:17:15 -0700 Subject: Rename `Guild::permissions_for`->`permissions_in` Rename `Guild::permissions_for` to `Guild::permissions_in`, deprecating `Guild::permissions_for` which is only an inline method to `permissions_in`. --- src/framework/standard/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/framework') diff --git a/src/framework/standard/mod.rs b/src/framework/standard/mod.rs index f4c98e8..9ad68da 100644 --- a/src/framework/standard/mod.rs +++ b/src/framework/standard/mod.rs @@ -972,7 +972,7 @@ pub fn has_correct_permissions(command: &Command, message: &Message) -> bool { if !command.required_permissions.is_empty() { if let Some(guild) = message.guild() { let perms = guild - .with(|g| g.permissions_for(message.channel_id, message.author.id)); + .with(|g| g.permissions_in(message.channel_id, message.author.id)); return perms.contains(command.required_permissions); } -- cgit v1.2.3 From bb205d28ea28fd8ac005ce66c90aa6cf2ca85e45 Mon Sep 17 00:00:00 2001 From: Zeyla Hellyer Date: Mon, 30 Oct 2017 10:17:34 -0700 Subject: Fix extraneous whitespace --- src/framework/standard/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/framework') diff --git a/src/framework/standard/mod.rs b/src/framework/standard/mod.rs index 9ad68da..a806817 100644 --- a/src/framework/standard/mod.rs +++ b/src/framework/standard/mod.rs @@ -143,7 +143,7 @@ use std::fmt; impl fmt::Debug for DispatchError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { use self::DispatchError::*; - + match *self { CheckFailed(..) => write!(f, "DispatchError::CheckFailed"), CommandDisabled(ref s) => f.debug_tuple("DispatchError::CommandDisabled").field(&s).finish(), -- cgit v1.2.3 From e219a6a9d6a890b008fc390a909ae504a0c1a329 Mon Sep 17 00:00:00 2001 From: Zeyla Hellyer Date: Wed, 1 Nov 2017 07:48:24 -0700 Subject: Use consistent token names in examples The names of environment variable tokens in the examples differed, so this makes them all use the same name. --- src/framework/mod.rs | 2 +- src/framework/standard/configuration.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src/framework') diff --git a/src/framework/mod.rs b/src/framework/mod.rs index a5f458d..85ae6f4 100644 --- a/src/framework/mod.rs +++ b/src/framework/mod.rs @@ -36,7 +36,7 @@ //! use serenity::model::Message; //! use std::env; //! -//! let mut client = Client::new(&env::var("DISCORD_BOT_TOKEN").unwrap()); +//! let mut client = Client::new(&env::var("DISCORD_TOKEN").unwrap()); //! //! client.with_framework(|f| f //! .configure(|c| c.prefix("~")) diff --git a/src/framework/standard/configuration.rs b/src/framework/standard/configuration.rs index 8cc25fa..c731d31 100644 --- a/src/framework/standard/configuration.rs +++ b/src/framework/standard/configuration.rs @@ -24,7 +24,7 @@ use model::{GuildId, Message, UserId}; /// use std::env; /// use serenity::framework::StandardFramework; /// -/// let mut client = Client::new(&env::var("DISCORD_BOT_TOKEN").unwrap(), Handler); +/// let mut client = Client::new(&env::var("DISCORD_TOKEN").unwrap(), Handler); /// /// client.with_framework(StandardFramework::new() /// .configure(|c| c.on_mention(true).prefix("~"))); -- cgit v1.2.3