/// <summary> /// Get all the event listeners for the given event type. /// </summary> /// <param name="services">Current service provider.</param> /// <param name="modules">Active modules for the current guild..</param> /// <returns>The event listeners.</returns> private static IEnumerable <EventHandler> GetHandlers <TEvent>( IServiceProvider services, IReadOnlyCollection <string> modules = null) where TEvent : IEvent { var checkEnabledModule = modules != null; foreach (var handler in services.GetServices <IEventListener>()) { var events = RegisteredEventListener.FromType(handler.GetType()); foreach (var eventHandler in events) { if (eventHandler.EventType != typeof(TEvent) || checkEnabledModule && eventHandler.Module != null && !modules.Contains(eventHandler.Module)) { continue; } yield return(new EventHandler(handler, eventHandler)); } } }
public static IEnumerable <IRegisteredEventListener> FromMethod(Type listenerType, MethodInfo methodType) { // Get the return type. var returnType = methodType.ReturnType; if (returnType != typeof(void) && !returnType.IsTask()) { throw new InvalidOperationException($"The method {methodType.GetFriendlyName()} does not return void or Task."); } // Register the event. var attribute = methodType.GetCustomAttribute <EventListenerAttribute>(false); Type[] eventTypes; if (attribute.Events.Length == 0) { if (methodType.GetParameters().Length == 0 || !typeof(IEvent).IsAssignableFrom(methodType.GetParameters()[0].ParameterType)) { throw new InvalidOperationException($"The first parameter of the method {methodType.GetFriendlyName()} should be the type {nameof(IEvent)}."); } eventTypes = new[] { methodType.GetParameters()[0].ParameterType }; } else { eventTypes = attribute.Events; } // Get the module. var module = attribute.Module; foreach (var eventType in eventTypes) { var listener = new RegisteredEventListener(eventType, methodType, attribute, module, listenerType); yield return(listener); } }