Browse Source

Made the default type readers accessible through CommandService.GetTypeReaders(Type type)

pull/617/head
Titansmasher 8 years ago
parent
commit
ff23800aaa
3 changed files with 24 additions and 25 deletions
  1. +5
    -13
      src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs
  2. +1
    -5
      src/Discord.Net.Commands/Builders/ParameterBuilder.cs
  3. +18
    -7
      src/Discord.Net.Commands/CommandService.cs

+ 5
- 13
src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs View File

@@ -193,7 +193,7 @@ namespace Discord.Commands
if (attribute is SummaryAttribute)
builder.Summary = (attribute as SummaryAttribute).Text;
else if (attribute is OverrideTypeReaderAttribute)
builder.TypeReader = GetTypeReader(service, paramType, (attribute as OverrideTypeReaderAttribute).TypeReader);
builder.TypeReader = GetCustomTypeReader(service, paramType, (attribute as OverrideTypeReaderAttribute).TypeReader);
else if (attribute is ParameterPreconditionAttribute)
builder.AddPrecondition(attribute as ParameterPreconditionAttribute);
else if (attribute is ParamArrayAttribute)
@@ -213,22 +213,14 @@ namespace Discord.Commands
builder.ParameterType = paramType;

if (builder.TypeReader == null)
{
var readers = service.GetTypeReaders(paramType);
TypeReader reader = null;

if (readers != null)
reader = readers.FirstOrDefault().Value;
else
reader = service.GetDefaultTypeReader(paramType);

builder.TypeReader = reader;
{
builder.TypeReader = service.GetTypeReaders(paramType).FirstOrDefault().Value;
}
}

private static TypeReader GetTypeReader(CommandService service, Type paramType, Type typeReaderType)
private static TypeReader GetCustomTypeReader(CommandService service, Type paramType, Type typeReaderType)
{
var readers = service.GetTypeReaders(paramType);
var readers = service.GetCustomTypeReaders(paramType);
TypeReader reader = null;
if (readers != null)
{


+ 1
- 5
src/Discord.Net.Commands/Builders/ParameterBuilder.cs View File

@@ -42,11 +42,7 @@ namespace Discord.Commands.Builders

internal void SetType(Type type)
{
var readers = Command.Module.Service.GetTypeReaders(type);
if (readers != null)
TypeReader = readers.FirstOrDefault().Value;
else
TypeReader = Command.Module.Service.GetDefaultTypeReader(type);
TypeReader = Command.Module.Service.GetTypeReaders(type).FirstOrDefault().Value;

if (TypeReader == null)
throw new InvalidOperationException($"{type} does not have a TypeReader registered for it");


+ 18
- 7
src/Discord.Net.Commands/CommandService.cs View File

@@ -18,7 +18,7 @@ namespace Discord.Commands

private readonly SemaphoreSlim _moduleLock;
private readonly ConcurrentDictionary<Type, ModuleInfo> _typedModuleDefs;
private readonly ConcurrentDictionary<Type, ConcurrentDictionary<Type, TypeReader>> _typeReaders;
private readonly ConcurrentDictionary<Type, ConcurrentDictionary<Type, TypeReader>> _customTypeReaders;
private readonly ConcurrentDictionary<Type, TypeReader> _defaultTypeReaders;
private readonly ImmutableList<Tuple<Type, Type>> _entityTypeReaders; //TODO: Candidate for C#7 Tuple
private readonly HashSet<ModuleInfo> _moduleDefs;
@@ -32,7 +32,7 @@ namespace Discord.Commands

public IEnumerable<ModuleInfo> Modules => _moduleDefs.Select(x => x);
public IEnumerable<CommandInfo> Commands => _moduleDefs.SelectMany(x => x.Commands);
public ILookup<Type, TypeReader> TypeReaders => _typeReaders.SelectMany(x => x.Value.Select(y => new {y.Key, y.Value})).ToLookup(x => x.Key, x => x.Value);
public ILookup<Type, TypeReader> TypeReaders => _customTypeReaders.SelectMany(x => x.Value.Select(y => new {y.Key, y.Value})).ToLookup(x => x.Key, x => x.Value);

public CommandService() : this(new CommandServiceConfig()) { }
public CommandService(CommandServiceConfig config)
@@ -52,7 +52,7 @@ namespace Discord.Commands
_typedModuleDefs = new ConcurrentDictionary<Type, ModuleInfo>();
_moduleDefs = new HashSet<ModuleInfo>();
_map = new CommandMap(this);
_typeReaders = new ConcurrentDictionary<Type, ConcurrentDictionary<Type, TypeReader>>();
_customTypeReaders = new ConcurrentDictionary<Type, ConcurrentDictionary<Type, TypeReader>>();

_defaultTypeReaders = new ConcurrentDictionary<Type, TypeReader>();
foreach (var type in PrimitiveParsers.SupportedTypes)
@@ -188,21 +188,32 @@ namespace Discord.Commands
//Type Readers
public void AddTypeReader<T>(TypeReader reader)
{
var readers = _typeReaders.GetOrAdd(typeof(T), x => new ConcurrentDictionary<Type, TypeReader>());
var readers = _customTypeReaders.GetOrAdd(typeof(T), x => new ConcurrentDictionary<Type, TypeReader>());
readers[reader.GetType()] = reader;
}
public void AddTypeReader(Type type, TypeReader reader)
{
var readers = _typeReaders.GetOrAdd(type, x=> new ConcurrentDictionary<Type, TypeReader>());
var readers = _customTypeReaders.GetOrAdd(type, x=> new ConcurrentDictionary<Type, TypeReader>());
readers[reader.GetType()] = reader;
}
internal IDictionary<Type, TypeReader> GetTypeReaders(Type type)
internal IDictionary<Type, TypeReader> GetCustomTypeReaders(Type type)
{
ConcurrentDictionary<Type, TypeReader> definedTypeReaders;
if (_typeReaders.TryGetValue(type, out definedTypeReaders))
if (_customTypeReaders.TryGetValue(type, out definedTypeReaders))
return definedTypeReaders;
return null;
}
public IDictionary<Type, TypeReader> GetTypeReaders(Type type)
{
var readers = GetCustomTypeReaders(type);

if (readers == null)
readers = new ConcurrentDictionary<Type, TypeReader>();

readers.Add(type, GetDefaultTypeReader(type));

return readers;
}
internal TypeReader GetDefaultTypeReader(Type type)
{
TypeReader reader;


Loading…
Cancel
Save