namespace CompatBot.EventHandlers; public class MultiEventHandlerWrapper where T: DiscordEventArgs { private readonly ICollection>> orderedHandlers; private readonly ICollection> unorderedHandlers; public MultiEventHandlerWrapper(ICollection>> orderedHandlers, ICollection> unorderedHandlers) { this.orderedHandlers = orderedHandlers; this.unorderedHandlers = unorderedHandlers; } public async Task OnEvent(DiscordClient client, T eventArgs) { try { foreach (var h in orderedHandlers) if (!await h(client, eventArgs).ConfigureAwait(false)) return; var unorderedTasks = unorderedHandlers.Select(async h => await h(client, eventArgs).ConfigureAwait(false)); await Task.WhenAll(unorderedTasks).ConfigureAwait(false); } catch (Exception e) { Config.Log.Error(e); } } public static Func CreateOrdered(ICollection>> orderedHandlers) => new MultiEventHandlerWrapper(orderedHandlers, []).OnEvent; public static Func CreateUnordered(ICollection> unorderedHandlers) => new MultiEventHandlerWrapper([], unorderedHandlers).OnEvent; }