private async Task ShowRecommendations(IDialogContext context, IAwaitable <object> result) { await Interactions.SendMessage(context, "Tenho tantos produtos que sei que poderiam ser do seu interesse. Espere só um momento, vou analisar o nosso catálogo.", 0, 4000); List <Product> products = new List <Product>(); List <Filter> popular = RecommendationsLogic.GetPopularFilters(StateHelper.GetFiltersCount(context)); while (true) { FilterDefinition <Product> joinedFilters = FilterLogic.GetJoinedFilter(popular); //fetch +1 product to see if pagination is needed products = ProductController.getProductsFilter( joinedFilters, Constants.N_ITEMS_CARROUSSEL + 1, this.lastFetchId); //filters didn't retrieved any products at the first try if (products.Count == 0 && lastFetchId == null) { popular.RemoveAt(popular.Count - 1); } else { break; } } List <string> currentWishlist = StateHelper.GetWishlistItems(context); foreach (string str in currentWishlist) { ObjectId obj = new ObjectId(str); List <Product> l = Logic.RecommendationsLogic.GetSimilarProducts(obj); products.InsertRange(0, l); } if (products.Count > Constants.N_ITEMS_CARROUSSEL) { lastFetchId = products[products.Count - 2].Id; } var reply = context.MakeMessage(); reply.AttachmentLayout = AttachmentLayoutTypes.Carousel; List <Attachment> cards = new List <Attachment>(); for (int i = 0; i < products.Count && i < Constants.N_ITEMS_CARROUSSEL; i++) { cards.Add(ProductCard.GetProductCard(products[i], ProductCard.CardType.RECOMMENDATION).ToAttachment()); } await Interactions.SendMessage(context, "Estas são as minhas recomendações:", 0, 2000); reply.Attachments = cards; await context.PostAsync(reply); //Check if pagination is needed if (products.Count <= Constants.N_ITEMS_CARROUSSEL) { context.Done(new CODE(DIALOG_CODE.DONE)); } else { await Interactions.SendMessage(context, "Ainda tenho mais recomendações para si. Se for do seu interesse não hesite, carregue no botão abaixo.", 2000, 2000); reply = context.MakeMessage(); reply.Attachments.Add( getCardButtonsAttachment(new List <ButtonType> { ButtonType.PAGINATION }, DialogType.RECOMMENDATION)); await context.PostAsync(reply); context.Wait(this.InputHandler); } }