From 06d66a59427328132962ffcab91e05bf5514d5a8 Mon Sep 17 00:00:00 2001 From: Joe4evr Date: Fri, 10 Aug 2018 01:12:15 +0200 Subject: [PATCH] Fix logic for quoted arguments --- .../Readers/NamedArgumentTypeReader.cs | 13 +++++++--- .../Discord.Net.Tests.csproj | 8 +++--- test/Discord.Net.Tests/Tests.TypeReaders.cs | 26 +++++++++++++++++++ 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/Discord.Net.Commands/Readers/NamedArgumentTypeReader.cs b/src/Discord.Net.Commands/Readers/NamedArgumentTypeReader.cs index 9b29c9e29..9b7eef5a7 100644 --- a/src/Discord.Net.Commands/Readers/NamedArgumentTypeReader.cs +++ b/src/Discord.Net.Commands/Readers/NamedArgumentTypeReader.cs @@ -96,13 +96,20 @@ namespace Discord.Commands PropertyInfo GetPropAndValue(out string argv) { + bool quoted = state == ReadState.InQuotedArgument; state = (currentRead == input.Length) ? ReadState.End : ReadState.LookingForParameter; - var prop = _tProps[currentParam]; - argv = input.Substring(beginRead, currentRead - beginRead); - return prop; + if (quoted) + { + argv = input.Substring(beginRead + 1, currentRead - beginRead - 1); + currentRead++; + } + else + argv = input.Substring(beginRead, currentRead - beginRead); + + return _tProps[currentParam]; } } diff --git a/test/Discord.Net.Tests/Discord.Net.Tests.csproj b/test/Discord.Net.Tests/Discord.Net.Tests.csproj index bf1da013e..0ee6f7e59 100644 --- a/test/Discord.Net.Tests/Discord.Net.Tests.csproj +++ b/test/Discord.Net.Tests/Discord.Net.Tests.csproj @@ -1,4 +1,4 @@ - + Exe Discord @@ -24,8 +24,8 @@ - - - + + + diff --git a/test/Discord.Net.Tests/Tests.TypeReaders.cs b/test/Discord.Net.Tests/Tests.TypeReaders.cs index e8e6c20c8..f2ddf9cb3 100644 --- a/test/Discord.Net.Tests/Tests.TypeReaders.cs +++ b/test/Discord.Net.Tests/Tests.TypeReaders.cs @@ -32,6 +32,32 @@ namespace Discord Assert.Equal(expected: 42, actual: m.Foo); Assert.Equal(expected: "hello", actual: m.Bar); } + + [Fact] + public async Task TestQuotedArgumentValue() + { + var commands = new CommandService(); + var module = await commands.AddModuleAsync(null); + + Assert.NotNull(module); + Assert.NotEmpty(module.Commands); + + var cmd = module.Commands[0]; + Assert.NotNull(cmd); + Assert.NotEmpty(cmd.Parameters); + + var param = cmd.Parameters[0]; + Assert.NotNull(param); + Assert.True(param.IsRemainder); + + var result = await param.ParseAsync(null, "bar: 《hello》 foo: 42"); + Assert.True(result.IsSuccess); + + var m = result.BestMatch as ArgumentType; + Assert.NotNull(m); + Assert.Equal(expected: 42, actual: m.Foo); + Assert.Equal(expected: "hello", actual: m.Bar); + } } [NamedArgumentType]