diff options
| author | Uninteresting Account <[email protected]> | 2018-01-20 20:09:27 +1100 |
|---|---|---|
| committer | alex <[email protected]> | 2018-01-20 10:09:27 +0100 |
| commit | e6117760e3c020ed41d643a8b34d7bfeb62d3bfa (patch) | |
| tree | 7d8abaeaa1ea2d9a952dbe0dac9787a157a9300b /src/framework | |
| parent | Clarify what functionality was made easy with the framework changes (diff) | |
| download | serenity-e6117760e3c020ed41d643a8b34d7bfeb62d3bfa.tar.xz serenity-e6117760e3c020ed41d643a8b34d7bfeb62d3bfa.zip | |
Fix multibyte character based prefixes (#253)
Diffstat (limited to 'src/framework')
| -rw-r--r-- | src/framework/standard/command.rs | 15 | ||||
| -rw-r--r-- | src/framework/standard/mod.rs | 6 |
2 files changed, 11 insertions, 10 deletions
diff --git a/src/framework/standard/command.rs b/src/framework/standard/command.rs index 5138596..541d1b9 100644 --- a/src/framework/standard/command.rs +++ b/src/framework/standard/command.rs @@ -325,19 +325,19 @@ pub fn positions(ctx: &mut Context, msg: &Message, conf: &Configuration) -> Opti } else if let Some(ref func) = conf.dynamic_prefix { if let Some(x) = func(ctx, msg) { if msg.content.starts_with(&x) { - positions.push(x.len()); + positions.push(x.chars().count()); } } else { for n in &conf.prefixes { if msg.content.starts_with(n) { - positions.push(n.len()); + positions.push(n.chars().count()); } } } } else { for n in &conf.prefixes { if msg.content.starts_with(n) { - positions.push(n.len()); + positions.push(n.chars().count()); } } }; @@ -378,11 +378,12 @@ fn find_end_of_prefix_with_whitespace(content: &str, position: usize) -> Option< let content_len = content.len(); if position >= content_len { return None; } - let slice = unsafe { content.slice_unchecked(position, content_len) }.as_bytes(); - for i in 0..slice.len() { - match slice[i] { + let mut i = 0; + let chars = content.chars().skip(position); + for char in chars { + match char { // \t \n \r [space] - 0x09 | 0x0a | 0x0d | 0x20 => {} + '\t' | '\n' | '\r' | ' ' => i += 1, _ => return if i == 0 { None } else { Some(position + i) } } } diff --git a/src/framework/standard/mod.rs b/src/framework/standard/mod.rs index 4e43cf8..5f454a9 100644 --- a/src/framework/standard/mod.rs +++ b/src/framework/standard/mod.rs @@ -970,10 +970,10 @@ impl Framework for StandardFramework { }; let mut args = { - let mut content = message.content[position..].trim(); - content = content[command_length..].trim(); + let mut content = message.content.chars().skip(position).collect::<String>(); + content = content[command_length..].trim().to_string(); - Args::new(content, &self.configuration.delimiters) + Args::new(&content, &self.configuration.delimiters) }; let before = self.before.clone(); |