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 46474f6a..436c7e8c 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 50f508ff..198542d8 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 557f5ac5..c57cf099 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 0ebe5c89..0092c4ed 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 79cae885..10f15321 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 0c0b5500..23c48cba 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 21de4076..1ff51ee5 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 783455e3..fa441644 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 eaa13607..39166829 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 070ac908..7d51ac54 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 c2a8d400..b00dc244 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 29297f8d..0eadd069 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 f9834fcf..88433908 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 aec38d9d..d8023d6b 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 01098cab..871838b3 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 ee4d26e9..be9d90b3 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 8bb7a678..104f91dd 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();