Browse Source

Added non-generic Modules.Add method

pull/36/head
RogueException 9 years ago
parent
commit
03920b9d48
2 changed files with 29 additions and 13 deletions
  1. +8
    -4
      src/Discord.Net.Modules/ModuleExtensions.cs
  2. +21
    -9
      src/Discord.Net.Modules/ModuleService.cs

+ 8
- 4
src/Discord.Net.Modules/ModuleExtensions.cs View File

@@ -8,15 +8,19 @@
return client;
}

public static void AddModule<T>(this DiscordClient client, T instance, string name = null, ModuleFilter filter = ModuleFilter.None)
where T : class, IModule
public static void AddModule(this DiscordClient client, IModule instance, string name = null, ModuleFilter filter = ModuleFilter.None)
{
client.GetService<ModuleService>().Add(instance, name ?? nameof(T), filter);
client.GetService<ModuleService>().Add(instance, name, filter);
}
public static void AddModule<T>(this DiscordClient client, string name = null, ModuleFilter filter = ModuleFilter.None)
where T : class, IModule, new()
{
client.GetService<ModuleService>().Add(new T(), name ?? nameof(T), filter);
client.GetService<ModuleService>().Add<T>(name, filter);
}
public static void AddModule<T>(this DiscordClient client, T instance, string name = null, ModuleFilter filter = ModuleFilter.None)
where T : class, IModule
{
client.GetService<ModuleService>().Add(instance, name, filter);
}
public static ModuleManager<T> GetModule<T>(this DiscordClient client)
where T : class, IModule


+ 21
- 9
src/Discord.Net.Modules/ModuleService.cs View File

@@ -1,16 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

namespace Discord.Modules
{
public class ModuleService : IService
{
public DiscordClient Client { get; private set; }
public IEnumerable<ModuleManager> Modules => _modules.Values;

private static readonly MethodInfo addMethod = typeof(ModuleService).GetTypeInfo().GetDeclaredMethods(nameof(Add))
.Single(x => x.IsGenericMethodDefinition && x.GetParameters().Length == 3);

public IEnumerable<ModuleManager> Modules => _modules.Values;
private readonly Dictionary<Type, ModuleManager> _modules;

public ModuleService()
public ModuleService()
{
_modules = new Dictionary<Type, ModuleManager>();
}
@@ -20,22 +25,29 @@ namespace Discord.Modules
Client = client;
}

public T Add<T>(T module, string name, ModuleFilter filterType)
public void Add(IModule instance, string name, ModuleFilter filter)
{
Type type = instance.GetType();
addMethod.MakeGenericMethod(type).Invoke(this, new object[] { instance, name, filter });
}
public void Add<T>(string name, ModuleFilter filter)
where T : class, IModule, new()
=> Add(new T(), name, filter);
public void Add<T>(T instance, string name, ModuleFilter filter)
where T : class, IModule
{
if (module == null) throw new ArgumentNullException(nameof(module));
if (name == null) throw new ArgumentNullException(nameof(name));
if (instance == null) throw new ArgumentNullException(nameof(instance));
if (Client == null)
throw new InvalidOperationException("Service needs to be added to a DiscordClient before modules can be installed.");

Type type = typeof(T);
if (name == null) name = type.Name;
if (_modules.ContainsKey(type))
throw new InvalidOperationException("This module has already been added.");

var manager = new ModuleManager<T>(Client, module, name, filterType);
var manager = new ModuleManager<T>(Client, instance, name, filter);
_modules.Add(type, manager);
module.Install(manager);
return module;
instance.Install(manager);
}
public ModuleManager<T> Get<T>()
where T : class, IModule


Loading…
Cancel
Save