From 5c64cb68bf8a82936e192ecb0b3ba99cf123bd57 Mon Sep 17 00:00:00 2001 From: RogueException Date: Mon, 15 Feb 2016 15:08:59 -0400 Subject: [PATCH] Cleaned up a bit of the modules/services add/get format --- src/Discord.Net.Audio/AudioClient.cs | 2 +- src/Discord.Net.Audio/AudioExtensions.cs | 12 +++---- src/Discord.Net.Commands/CommandExtensions.cs | 4 +-- .../Levels/PermissionLevelChecker.cs | 2 +- .../Levels/PermissionLevelExtensions.cs | 2 +- .../Permissions/Userlist/BlacklistChecker.cs | 2 +- .../Userlist/BlacklistExtensions.cs | 12 +++---- .../Permissions/Userlist/WhitelistChecker.cs | 2 +- .../Userlist/WhitelistExtensions.cs | 12 +++---- src/Discord.Net.Modules/ModuleExtensions.cs | 18 +++++------ src/Discord.Net.Modules/ModuleManager.cs | 13 +++++++- src/Discord.Net.Modules/ModuleService.cs | 31 ++++++++++--------- src/Discord.Net.Modules/project.json | 2 +- src/Discord.Net.Net45/Discord.Net.csproj | 10 +++--- src/Discord.Net/DiscordClient.cs | 19 ++++++++++-- .../{Extensions.cs => InternalExtensions.cs} | 16 ---------- ...ServiceManager.cs => ServiceCollection.cs} | 4 +-- 17 files changed, 85 insertions(+), 78 deletions(-) rename src/Discord.Net/{Extensions.cs => InternalExtensions.cs} (93%) rename src/Discord.Net/{ServiceManager.cs => ServiceCollection.cs} (91%) diff --git a/src/Discord.Net.Audio/AudioClient.cs b/src/Discord.Net.Audio/AudioClient.cs index 46474f6a4..436c7e8c8 100644 --- a/src/Discord.Net.Audio/AudioClient.cs +++ b/src/Discord.Net.Audio/AudioClient.cs @@ -71,7 +71,7 @@ namespace Discord.Audio { Id = id; _config = client.Config; - Service = client.Services.Get(); + Service = client.GetService(); Config = Service.Config; Serializer = client.Serializer; _gatewayState = (int)ConnectionState.Disconnected; diff --git a/src/Discord.Net.Audio/AudioExtensions.cs b/src/Discord.Net.Audio/AudioExtensions.cs index 50f508ff5..198542d8f 100644 --- a/src/Discord.Net.Audio/AudioExtensions.cs +++ b/src/Discord.Net.Audio/AudioExtensions.cs @@ -7,20 +7,20 @@ namespace Discord.Audio { public static DiscordClient UsingAudio(this DiscordClient client, AudioServiceConfig config = null) { - client.Services.Add(new AudioService(config)); + client.AddService(new AudioService(config)); return client; } public static DiscordClient UsingAudio(this DiscordClient client, Action configFunc = null) { var builder = new AudioServiceConfigBuilder(); configFunc(builder); - client.Services.Add(new AudioService(builder)); + client.AddService(new AudioService(builder)); return client; } - public static Task JoinAudio(this Channel channel) => channel.Client.Services.Get().Join(channel); - public static Task LeaveAudio(this Channel channel) => channel.Client.Services.Get().Leave(channel); - public static Task LeaveAudio(this Server server) => server.Client.Services.Get().Leave(server); - public static IAudioClient GetAudioClient(Server server) => server.Client.Services.Get().GetClient(server); + public static Task JoinAudio(this Channel channel) => channel.Client.GetService().Join(channel); + public static Task LeaveAudio(this Channel channel) => channel.Client.GetService().Leave(channel); + public static Task LeaveAudio(this Server server) => server.Client.GetService().Leave(server); + public static IAudioClient GetAudioClient(Server server) => server.Client.GetService().GetClient(server); } } diff --git a/src/Discord.Net.Commands/CommandExtensions.cs b/src/Discord.Net.Commands/CommandExtensions.cs index 557f5ac5a..c57cf099f 100644 --- a/src/Discord.Net.Commands/CommandExtensions.cs +++ b/src/Discord.Net.Commands/CommandExtensions.cs @@ -6,14 +6,14 @@ namespace Discord.Commands { public static DiscordClient UsingCommands(this DiscordClient client, CommandServiceConfig config = null) { - client.Services.Add(new CommandService(config)); + client.AddService(new CommandService(config)); return client; } public static DiscordClient UsingCommands(this DiscordClient client, Action configFunc = null) { var builder = new CommandServiceConfigBuilder(); configFunc(builder); - client.Services.Add(new CommandService(builder)); + client.AddService(new CommandService(builder)); return client; } } diff --git a/src/Discord.Net.Commands/Permissions/Levels/PermissionLevelChecker.cs b/src/Discord.Net.Commands/Permissions/Levels/PermissionLevelChecker.cs index 0ebe5c890..0092c4edf 100644 --- a/src/Discord.Net.Commands/Permissions/Levels/PermissionLevelChecker.cs +++ b/src/Discord.Net.Commands/Permissions/Levels/PermissionLevelChecker.cs @@ -10,7 +10,7 @@ internal PermissionLevelChecker(DiscordClient client, int minPermissions) { - _service = client.Services.Get(true); + _service = client.GetService(true); _minPermissions = minPermissions; } diff --git a/src/Discord.Net.Commands/Permissions/Levels/PermissionLevelExtensions.cs b/src/Discord.Net.Commands/Permissions/Levels/PermissionLevelExtensions.cs index 79cae8857..10f153215 100644 --- a/src/Discord.Net.Commands/Permissions/Levels/PermissionLevelExtensions.cs +++ b/src/Discord.Net.Commands/Permissions/Levels/PermissionLevelExtensions.cs @@ -6,7 +6,7 @@ namespace Discord.Commands.Permissions.Levels { public static DiscordClient UsingPermissionLevels(this DiscordClient client, Func permissionResolver) { - client.Services.Add(new PermissionLevelService(permissionResolver)); + client.AddService(new PermissionLevelService(permissionResolver)); return client; } diff --git a/src/Discord.Net.Commands/Permissions/Userlist/BlacklistChecker.cs b/src/Discord.Net.Commands/Permissions/Userlist/BlacklistChecker.cs index 0c0b5500b..23c48cba9 100644 --- a/src/Discord.Net.Commands/Permissions/Userlist/BlacklistChecker.cs +++ b/src/Discord.Net.Commands/Permissions/Userlist/BlacklistChecker.cs @@ -6,7 +6,7 @@ internal BlacklistChecker(DiscordClient client) { - _service = client.Services.Get(true); + _service = client.GetService(true); } public bool CanRun(Command command, User user, Channel channel, out string error) diff --git a/src/Discord.Net.Commands/Permissions/Userlist/BlacklistExtensions.cs b/src/Discord.Net.Commands/Permissions/Userlist/BlacklistExtensions.cs index 21de4076d..1ff51ee58 100644 --- a/src/Discord.Net.Commands/Permissions/Userlist/BlacklistExtensions.cs +++ b/src/Discord.Net.Commands/Permissions/Userlist/BlacklistExtensions.cs @@ -6,7 +6,7 @@ namespace Discord.Commands.Permissions.Userlist { public static DiscordClient UsingGlobalBlacklist(this DiscordClient client, params ulong[] initialUserIds) { - client.Services.Add(new BlacklistService(initialUserIds)); + client.AddService(new BlacklistService(initialUserIds)); return client; } @@ -27,22 +27,22 @@ namespace Discord.Commands.Permissions.Userlist } public static IEnumerable GetBlacklistedUserIds(this DiscordClient client) - => client.Services.Get().UserIds; + => client.GetService().UserIds; public static void BlacklistUser(this DiscordClient client, User user) { - client.Services.Get().Add(user.Id); + client.GetService().Add(user.Id); } public static void BlacklistUser(this DiscordClient client, ulong userId) { - client.Services.Get().Add(userId); + client.GetService().Add(userId); } public static void UnBlacklistUser(this DiscordClient client, User user) { - client.Services.Get().Remove(user.Id); + client.GetService().Remove(user.Id); } public static void UnBlacklistUser(this DiscordClient client, ulong userId) { - client.Services.Get().Remove(userId); + client.GetService().Remove(userId); } } } diff --git a/src/Discord.Net.Commands/Permissions/Userlist/WhitelistChecker.cs b/src/Discord.Net.Commands/Permissions/Userlist/WhitelistChecker.cs index 783455e3a..fa441644f 100644 --- a/src/Discord.Net.Commands/Permissions/Userlist/WhitelistChecker.cs +++ b/src/Discord.Net.Commands/Permissions/Userlist/WhitelistChecker.cs @@ -6,7 +6,7 @@ internal WhitelistChecker(DiscordClient client) { - _service = client.Services.Get(true); + _service = client.GetService(true); } public bool CanRun(Command command, User user, Channel channel, out string error) diff --git a/src/Discord.Net.Commands/Permissions/Userlist/WhitelistExtensions.cs b/src/Discord.Net.Commands/Permissions/Userlist/WhitelistExtensions.cs index eaa136075..391668298 100644 --- a/src/Discord.Net.Commands/Permissions/Userlist/WhitelistExtensions.cs +++ b/src/Discord.Net.Commands/Permissions/Userlist/WhitelistExtensions.cs @@ -6,7 +6,7 @@ namespace Discord.Commands.Permissions.Userlist { public static DiscordClient UsingGlobalWhitelist(this DiscordClient client, params ulong[] initialUserIds) { - client.Services.Add(new WhitelistService(initialUserIds)); + client.AddService(new WhitelistService(initialUserIds)); return client; } @@ -27,22 +27,22 @@ namespace Discord.Commands.Permissions.Userlist } public static IEnumerable GetWhitelistedUserIds(this DiscordClient client) - => client.Services.Get().UserIds; + => client.GetService().UserIds; public static void WhitelistUser(this DiscordClient client, User user) { - client.Services.Get().Add(user.Id); + client.GetService().Add(user.Id); } public static void WhitelistUser(this DiscordClient client, ulong userId) { - client.Services.Get().Add(userId); + client.GetService().Add(userId); } public static void UnWhitelistUser(this DiscordClient client, User user) { - client.Services.Get().Remove(user.Id); + client.GetService().Remove(user.Id); } public static void RemoveFromWhitelist(this DiscordClient client, ulong userId) { - client.Services.Get().Remove(userId); + client.GetService().Remove(userId); } } } diff --git a/src/Discord.Net.Modules/ModuleExtensions.cs b/src/Discord.Net.Modules/ModuleExtensions.cs index 070ac9084..7d51ac547 100644 --- a/src/Discord.Net.Modules/ModuleExtensions.cs +++ b/src/Discord.Net.Modules/ModuleExtensions.cs @@ -4,24 +4,22 @@ { public static DiscordClient UsingModules(this DiscordClient client) { - client.Services.Add(new ModuleService()); + client.AddService(new ModuleService()); return client; } - public static DiscordClient AddModule(this DiscordClient client, T instance, string name = null, ModuleFilter filter = ModuleFilter.None) + public static void AddModule(this DiscordClient client, T instance, string name = null, ModuleFilter filter = ModuleFilter.None) where T : class, IModule { - client.Modules().Add(instance, name ?? nameof(T), filter); - return client; + client.GetService().Add(instance, name ?? nameof(T), filter); } - public static DiscordClient AddModule(this DiscordClient client, string name = null, ModuleFilter filter = ModuleFilter.None) + public static void AddModule(this DiscordClient client, string name = null, ModuleFilter filter = ModuleFilter.None) where T : class, IModule, new() { - client.Modules().Add(new T(), name ?? nameof(T), filter); - return client; + client.GetService().Add(new T(), name ?? nameof(T), filter); } - - public static ModuleService Modules(this DiscordClient client, bool required = true) - => client.Services.Get(required); + public static ModuleManager GetModule(this DiscordClient client) + where T : class, IModule + => client.GetService().Get(); } } diff --git a/src/Discord.Net.Modules/ModuleManager.cs b/src/Discord.Net.Modules/ModuleManager.cs index c2a8d400f..b00dc244f 100644 --- a/src/Discord.Net.Modules/ModuleManager.cs +++ b/src/Discord.Net.Modules/ModuleManager.cs @@ -7,6 +7,17 @@ using System.Linq; namespace Discord.Modules { + public class ModuleManager : ModuleManager + where T : class, IModule + { + public new T Instance => base.Instance as T; + + internal ModuleManager(DiscordClient client, T instance, string name, ModuleFilter filterType) + : base(client, instance, name, filterType) + { + } + } + public class ModuleManager { public event EventHandler ServerEnabled = delegate { }; @@ -115,7 +126,7 @@ namespace Discord.Modules public void CreateCommands(string prefix, Action config) { - var commandService = Client.Services.Get(); + var commandService = Client.GetService(); commandService.CreateGroup(prefix, x => { x.Category(Name); diff --git a/src/Discord.Net.Modules/ModuleService.cs b/src/Discord.Net.Modules/ModuleService.cs index 29297f8d4..0eadd0694 100644 --- a/src/Discord.Net.Modules/ModuleService.cs +++ b/src/Discord.Net.Modules/ModuleService.cs @@ -8,11 +8,11 @@ namespace Discord.Modules public DiscordClient Client { get; private set; } public IEnumerable Modules => _modules.Values; - private readonly Dictionary _modules; + private readonly Dictionary _modules; public ModuleService() { - _modules = new Dictionary(); + _modules = new Dictionary(); } void IService.Install(DiscordClient client) @@ -20,29 +20,30 @@ namespace Discord.Modules Client = client; } - public T Add(T module, string name, ModuleFilter type) + public T Add(T module, string name, ModuleFilter filterType) where T : class, IModule { if (module == null) throw new ArgumentNullException(nameof(module)); if (name == null) throw new ArgumentNullException(nameof(name)); if (Client == null) throw new InvalidOperationException("Service needs to be added to a DiscordClient before modules can be installed."); - if (_modules.ContainsKey(module)) + + Type type = typeof(T); + if (_modules.ContainsKey(type)) throw new InvalidOperationException("This module has already been added."); - var manager = new ModuleManager(Client, module, name, type); - _modules.Add(module, manager); + var manager = new ModuleManager(Client, module, name, filterType); + _modules.Add(type, manager); module.Install(manager); return module; } - - public ModuleManager GetManager(IModule module) - { - if (module == null) throw new ArgumentNullException(nameof(module)); - - ModuleManager result = null; - _modules.TryGetValue(module, out result); - return result; - } + public ModuleManager Get() + where T : class, IModule + { + ModuleManager manager; + if (_modules.TryGetValue(typeof(T), out manager)) + return manager as ModuleManager; + return null; + } } } diff --git a/src/Discord.Net.Modules/project.json b/src/Discord.Net.Modules/project.json index f9834fcf1..884339080 100644 --- a/src/Discord.Net.Modules/project.json +++ b/src/Discord.Net.Modules/project.json @@ -17,7 +17,7 @@ "dependencies": { "Discord.Net": "0.9.0-rc3-3", - "Discord.Net.Commands": "0.9.0-rc3" + "Discord.Net.Commands": "0.9.0-rc3-1" }, "frameworks": { "net45": { }, diff --git a/src/Discord.Net.Net45/Discord.Net.csproj b/src/Discord.Net.Net45/Discord.Net.csproj index aec38d9d5..d8023d6bd 100644 --- a/src/Discord.Net.Net45/Discord.Net.csproj +++ b/src/Discord.Net.Net45/Discord.Net.csproj @@ -481,15 +481,15 @@ Events\UserUpdatedEventArgs.cs - - Extensions.cs - Format.cs IMentionable.cs + + InternalExtensions.cs + IService.cs @@ -592,8 +592,8 @@ Net\WebSockets\WS4NetEngine.cs - - ServiceManager.cs + + ServiceCollection.cs TaskManager.cs diff --git a/src/Discord.Net/DiscordClient.cs b/src/Discord.Net/DiscordClient.cs index 01098cab0..871838b38 100644 --- a/src/Discord.Net/DiscordClient.cs +++ b/src/Discord.Net/DiscordClient.cs @@ -27,6 +27,7 @@ namespace Discord private readonly ManualResetEvent _disconnectedEvent; private readonly ManualResetEventSlim _connectedEvent; private readonly TaskManager _taskManager; + private readonly ServiceCollection _services; private readonly ConcurrentDictionary _servers; private readonly ConcurrentDictionary _channels; private readonly ConcurrentDictionary _privateChannels; //Key = RecipientId @@ -44,8 +45,6 @@ namespace Discord public RestClient StatusAPI { get; } /// Gets the internal WebSocket for the Gateway event stream. public GatewaySocket GatewaySocket { get; } - /// Gets the service manager used for adding extensions to this client. - public ServiceManager Services { get; } /// Gets the queue used for outgoing messages, if enabled. public MessageQueue MessageQueue { get; } /// Gets the JSON serializer used by this client. @@ -66,6 +65,8 @@ namespace Discord /// Gets the game the current user is displayed as playing. public string CurrentGame { get; private set; } + /// Gets a collection of all extensions added to this DiscordClient. + public IEnumerable Services => _services; /// Gets a collection of all servers this client is a member of. public IEnumerable Servers => _servers.Select(x => x.Value); /// Gets a collection of all private channels this client is a member of. @@ -152,7 +153,7 @@ namespace Discord MessageQueue = new MessageQueue(ClientAPI, Log.CreateLogger("MessageQueue")); //Extensibility - Services = new ServiceManager(this); + _services = new ServiceCollection(this); } /// Connects to the Discord server with the provided email and password. @@ -1010,6 +1011,18 @@ namespace Discord } #endregion + #region Services + public T AddService(T instance) + where T : class, IService + => _services.Add(instance); + public T AddService() + where T : class, IService, new() + => _services.Add(new T()); + public T GetService(bool isRequired = true) + where T : class, IService + => _services.Get(isRequired); + #endregion + #region Async Wrapper /// Blocking call that will execute the provided async method and wait until the client has been manually stopped. This is mainly intended for use in console applications. public void ExecuteAndWait(Func asyncAction) diff --git a/src/Discord.Net/Extensions.cs b/src/Discord.Net/InternalExtensions.cs similarity index 93% rename from src/Discord.Net/Extensions.cs rename to src/Discord.Net/InternalExtensions.cs index ee4d26e9a..be9d90b3f 100644 --- a/src/Discord.Net/Extensions.cs +++ b/src/Discord.Net/InternalExtensions.cs @@ -8,22 +8,6 @@ using System.Runtime.CompilerServices; namespace Discord { - public static class DiscordClientExtensions - { - public static DiscordClient AddService(this DiscordClient client, T instance) - where T : class, IService - { - client.Services.Add(instance); - return client; - } - public static DiscordClient AddService(this DiscordClient client) - where T : class, IService, new() - { - client.Services.Add(new T()); - return client; - } - } - internal static class InternalExtensions { internal static readonly IFormatProvider _format = CultureInfo.InvariantCulture; diff --git a/src/Discord.Net/ServiceManager.cs b/src/Discord.Net/ServiceCollection.cs similarity index 91% rename from src/Discord.Net/ServiceManager.cs rename to src/Discord.Net/ServiceCollection.cs index 8bb7a678a..104f91dd4 100644 --- a/src/Discord.Net/ServiceManager.cs +++ b/src/Discord.Net/ServiceCollection.cs @@ -4,13 +4,13 @@ using System.Collections.Generic; namespace Discord { - public class ServiceManager : IEnumerable + internal class ServiceCollection : IEnumerable { private readonly Dictionary _services; internal DiscordClient Client { get; } - internal ServiceManager(DiscordClient client) + internal ServiceCollection(DiscordClient client) { Client = client; _services = new Dictionary();