Add a dedicated TimeSpan reader so it doesn't suck (#1005)
* Add a dedicated TimeSpan reader so it doesn't suck * Pass input as lower case
This commit is contained in:
@@ -65,6 +65,10 @@ namespace Discord.Commands
|
|||||||
_defaultTypeReaders[typeof(Nullable<>).MakeGenericType(type)] = NullableTypeReader.Create(type, _defaultTypeReaders[type]);
|
_defaultTypeReaders[typeof(Nullable<>).MakeGenericType(type)] = NullableTypeReader.Create(type, _defaultTypeReaders[type]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var tsreader = new TimeSpanTypeReader();
|
||||||
|
_defaultTypeReaders[typeof(TimeSpan)] = tsreader;
|
||||||
|
_defaultTypeReaders[typeof(TimeSpan?)] = NullableTypeReader.Create(typeof(TimeSpan), tsreader);
|
||||||
|
|
||||||
_defaultTypeReaders[typeof(string)] =
|
_defaultTypeReaders[typeof(string)] =
|
||||||
new PrimitiveTypeReader<string>((string x, out string y) => { y = x; return true; }, 0);
|
new PrimitiveTypeReader<string>((string x, out string y) => { y = x; return true; }, 0);
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Collections.Immutable;
|
using System.Collections.Immutable;
|
||||||
|
|
||||||
@@ -29,7 +29,7 @@ namespace Discord.Commands
|
|||||||
parserBuilder[typeof(decimal)] = (TryParseDelegate<decimal>)decimal.TryParse;
|
parserBuilder[typeof(decimal)] = (TryParseDelegate<decimal>)decimal.TryParse;
|
||||||
parserBuilder[typeof(DateTime)] = (TryParseDelegate<DateTime>)DateTime.TryParse;
|
parserBuilder[typeof(DateTime)] = (TryParseDelegate<DateTime>)DateTime.TryParse;
|
||||||
parserBuilder[typeof(DateTimeOffset)] = (TryParseDelegate<DateTimeOffset>)DateTimeOffset.TryParse;
|
parserBuilder[typeof(DateTimeOffset)] = (TryParseDelegate<DateTimeOffset>)DateTimeOffset.TryParse;
|
||||||
parserBuilder[typeof(TimeSpan)] = (TryParseDelegate<TimeSpan>)TimeSpan.TryParse;
|
//parserBuilder[typeof(TimeSpan)] = (TryParseDelegate<TimeSpan>)TimeSpan.TryParse;
|
||||||
parserBuilder[typeof(char)] = (TryParseDelegate<char>)char.TryParse;
|
parserBuilder[typeof(char)] = (TryParseDelegate<char>)char.TryParse;
|
||||||
return parserBuilder.ToImmutable();
|
return parserBuilder.ToImmutable();
|
||||||
}
|
}
|
||||||
|
|||||||
35
src/Discord.Net.Commands/Readers/TimeSpanTypeReader.cs
Normal file
35
src/Discord.Net.Commands/Readers/TimeSpanTypeReader.cs
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
using System;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Discord.Commands
|
||||||
|
{
|
||||||
|
internal class TimeSpanTypeReader : TypeReader
|
||||||
|
{
|
||||||
|
private static readonly string[] _formats = new[]
|
||||||
|
{
|
||||||
|
"%d'd'%h'h'%m'm'%s's'", //4d3h2m1s
|
||||||
|
"%d'd'%h'h'%m'm'", //4d3h2m
|
||||||
|
"%d'd'%h'h'%s's'", //4d3h 1s
|
||||||
|
"%d'd'%h'h'", //4d3h
|
||||||
|
"%d'd'%m'm'%s's'", //4d 2m1s
|
||||||
|
"%d'd'%m'm'", //4d 2m
|
||||||
|
"%d'd'%s's'", //4d 1s
|
||||||
|
"%d'd'", //4d
|
||||||
|
"%h'h'%m'm'%s's'", // 3h2m1s
|
||||||
|
"%h'h'%m'm'", // 3h2m
|
||||||
|
"%h'h'%s's'", // 3h 1s
|
||||||
|
"%h'h'", // 3h
|
||||||
|
"%m'm'%s's'", // 2m1s
|
||||||
|
"%m'm'", // 2m
|
||||||
|
"%s's'", // 1s
|
||||||
|
};
|
||||||
|
|
||||||
|
public override Task<TypeReaderResult> ReadAsync(ICommandContext context, string input, IServiceProvider services)
|
||||||
|
{
|
||||||
|
return (TimeSpan.TryParseExact(input.ToLowerInvariant(), _formats, CultureInfo.InvariantCulture, out var timeSpan))
|
||||||
|
? Task.FromResult(TypeReaderResult.FromSuccess(timeSpan))
|
||||||
|
: Task.FromResult(TypeReaderResult.FromError(CommandError.ParseFailed, "Failed to parse TimeSpan"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user