/// <summary> /// Handles the given socket component interaction /// </summary> /// <param name="component">The interaction that occurred</param> /// <returns>A task representing the completion of the interaction</returns> public async Task HandleComponentAsync(SocketMessageComponent component) { if (component.User.IsBot || component.User.Id == _client.CurrentUser.Id) { await component.DeferAsync(ephemeral : true); return; } var id = component.Data.CustomId; if (!_handlers.GetHandler(id, out var method, out var type)) { _logger.LogWarning($"Cannot find loaded button for `{id}`"); await component.DeferAsync(ephemeral : true); return; } if (method == null || type == null) { _logger.LogWarning($"Method or type is null for `{id}`"); await component.DeferAsync(ephemeral : true); return; } var service = _provider.GetService(type); if (service == null) { _logger.LogWarning($"Cannot find service for type `{type.Name}`"); await component.DeferAsync(ephemeral : true); return; } ((ComponentHandler)service).SetContext(component, _client); var res = method.Invoke(service, Array.Empty <object>()); if (res == null) { return; } if (method.ReturnType == typeof(Task) || method.ReturnType == typeof(Task <>)) { await(Task) res; } }