public MessagingExtensionResponse GetAdaptiveCard()
        {
            var    paths       = new[] { ".", "Resources", "RestaurantCard.json" };
            string filepath    = Path.Combine(paths);
            var    previewcard = new ThumbnailCard
            {
                Title = "Adaptive Card",
                Text  = "Please select to get Adaptive card"
            };
            var adaptiveList = FetchAdaptive(filepath);
            var attachment   = new MessagingExtensionAttachment
            {
                ContentType = "application/vnd.microsoft.card.adaptive",
                Content     = adaptiveList.Content,
                Preview     = previewcard.ToAttachment()
            };

            return(new MessagingExtensionResponse
            {
                ComposeExtension = new MessagingExtensionResult
                {
                    Type = "result",
                    AttachmentLayout = "list",
                    Attachments = new List <MessagingExtensionAttachment> {
                        attachment
                    }
                }
            });
        }
示例#2
0
        public void MessagingExtensionAttachmentInitsWithNoArgs()
        {
            var msgExtAttachment = new MessagingExtensionAttachment();

            Assert.NotNull(msgExtAttachment);
            Assert.IsType <MessagingExtensionAttachment>(msgExtAttachment);
        }
        protected override async Task <MessagingExtensionResponse> OnTeamsMessagingExtensionQueryAsync(ITurnContext <IInvokeActivity> turnContext, MessagingExtensionQuery query, CancellationToken cancellationToken)
        {
            var text      = query?.Parameters?[0]?.Value as string ?? string.Empty;
            var textlower = text.ToLower();
            var packages  = await FindPackages(textlower);

            var attachments = packages.Select(package => {
                var previewCard = new ThumbnailCard
                {
                    Title = package.Name,
                    Tap   = new CardAction {
                        Type = "invoke", Value = package
                    },
                };
                var attachment = new MessagingExtensionAttachment
                {
                    ContentType = HeroCard.ContentType,
                    Content     = new HeroCard {
                        Title = package.Name
                    },
                    Preview = previewCard.ToAttachment()
                };
                return(attachment);
            }).ToList();

            return(new MessagingExtensionResponse
            {
                ComposeExtension = new MessagingExtensionResult
                {
                    Type = "result",
                    AttachmentLayout = "list",
                    Attachments = attachments
                }
            });
        }
示例#4
0
        protected override Task <MessagingExtensionResponse> OnTeamsMessagingExtensionQueryAsync(ITurnContext <IInvokeActivity> turnContext, MessagingExtensionQuery query, CancellationToken cancellationToken)
        {
            var title      = "";
            var titleParam = query.Parameters?.FirstOrDefault(p => p.Name == "cardTitle");

            if (titleParam != null)
            {
                title = titleParam.Value.ToString();
            }

            if (query == null || query.CommandId != "getRandomText")
            {
                // We only process the 'getRandomText' queries with this message extension
                throw new NotImplementedException($"Invalid CommandId: {query.CommandId}");
            }

            var attachments = new MessagingExtensionAttachment[5];

            for (int i = 0; i < 5; i++)
            {
                attachments[i] = GetAttachment(title);
            }

            var result = new MessagingExtensionResponse
            {
                ComposeExtension = new MessagingExtensionResult
                {
                    AttachmentLayout = "list",
                    Type             = "result",
                    Attachments      = attachments.ToList()
                },
            };

            return(Task.FromResult(result));
        }
        protected override async Task <MessagingExtensionResponse> OnTeamsMessagingExtensionSelectItemAsync(ITurnContext <IInvokeActivity> turnContext, JObject query, CancellationToken cancellationToken)
        {
            var searchQuery = query.ToObject <SearchQuery>();
            var bfLogo      = "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQtB3AwMUeNoq4gUBGe6Ocj8kyh3bXa9ZbV7u1fVKQoyKFHdkqU";
            var card        = new HeroCard
            {
                Title  = $"You selected a search result!",
                Text   = $"You searched for \"{searchQuery.Query}\"",
                Images = new List <CardImage>
                {
                    new CardImage {
                        Url = bfLogo
                    }
                }
            };

            var attachment = new MessagingExtensionAttachment
            {
                ContentType = HeroCard.ContentType,
                Content     = card
            };

            var messagingExtensionResponse = new MessagingExtensionResponse();

            messagingExtensionResponse.ComposeExtension = CreateMessagingExtensionResult(new List <MessagingExtensionAttachment> {
                attachment
            });
            return(messagingExtensionResponse);
        }
        public MessagingExtensionResponse GetResultGrid()
        {
            var imageFiles = Directory.EnumerateFiles("wwwroot", "*.*", SearchOption.AllDirectories)
                             .Where(s => s.EndsWith(".jpg"));

            List <MessagingExtensionAttachment> attachments = new List <MessagingExtensionAttachment>();

            foreach (string img in imageFiles)
            {
                var image         = img.Split("\\");
                var thumbnailCard = new ThumbnailCard();
                thumbnailCard.Images = new List <CardImage>()
                {
                    new CardImage(_baseUrl + "/" + image[1])
                };
                var attachment = new MessagingExtensionAttachment
                {
                    ContentType = ThumbnailCard.ContentType,
                    Content     = thumbnailCard,
                };
                attachments.Add(attachment);
            }
            return(new MessagingExtensionResponse
            {
                ComposeExtension = new MessagingExtensionResult
                {
                    Type = "result",
                    AttachmentLayout = "grid",
                    Attachments = attachments
                }
            });
        }
        protected override Task <MessagingExtensionResponse> OnTeamsMessagingExtensionSelectItemAsync(ITurnContext <IInvokeActivity> turnContext, JObject query, CancellationToken cancellationToken)
        {
            var lead = query.ToObject <CommandReadDto>();
            var card = new ThumbnailCard
            {
                Title    = $"{lead.Name}",
                Subtitle = lead.Email,
                Text     = lead.Address,
                Buttons  = new List <CardAction>
                {
                    new CardAction {
                        Type = ActionTypes.OpenUrl, Title = "Chat", Value = "https://teams.microsoft.com/l/chat/0/0?users=" + lead.Email
                    },
                },
            };
            var attachment = new MessagingExtensionAttachment
            {
                ContentType = ThumbnailCard.ContentType,
                Content     = card,
            };

            return(Task.FromResult(new MessagingExtensionResponse
            {
                ComposeExtension = new MessagingExtensionResult
                {
                    Type = "result",
                    AttachmentLayout = "list",
                    Attachments = new List <MessagingExtensionAttachment> {
                        attachment
                    }
                }
            }));
        }
        public MessagingExtensionResponse GetConnectorCard()
        {
            var path        = new[] { ".", "Resources", "connectorCard.json" };
            var filepath    = Path.Combine(path);
            var previewcard = new ThumbnailCard
            {
                Title = "O365 Connector Card",
                Text  = "Please select to get Connector card"
            };

            var connector  = FetchConnector(filepath);
            var attachment = new MessagingExtensionAttachment
            {
                ContentType = O365ConnectorCard.ContentType,
                Content     = connector.Content,
                Preview     = previewcard.ToAttachment()
            };

            return(new MessagingExtensionResponse
            {
                ComposeExtension = new MessagingExtensionResult
                {
                    Type = "result",
                    AttachmentLayout = "list",
                    Attachments = new List <MessagingExtensionAttachment> {
                        attachment
                    }
                }
            });
        }
        public Attachment FetchConnector(string filepath)
        {
            var connectorCardJson       = File.ReadAllText(filepath);
            var connectorCardAttachment = new MessagingExtensionAttachment
            {
                ContentType = O365ConnectorCard.ContentType,
                Content     = JsonConvert.DeserializeObject(connectorCardJson),
            };

            return(connectorCardAttachment);
        }
示例#10
0
        protected async override Task <MessagingExtensionResponse> OnTeamsAppBasedLinkQueryAsync(ITurnContext <IInvokeActivity> turnContext, AppBasedLinkQuery query, CancellationToken cancellationToken)
        {
            var state         = query.State; // Check the state value
            var tokenResponse = await GetTokenResponse(turnContext, state, cancellationToken);

            if (tokenResponse == null || string.IsNullOrEmpty(tokenResponse.Token))
            {
                // There is no token, so the user has not signed in yet.

                // Retrieve the OAuth Sign in Link to use in the MessagingExtensionResult Suggested Actions
                var userTokenClient = turnContext.TurnState.Get <UserTokenClient>();
                var resource        = await userTokenClient.GetSignInResourceAsync(_connectionName, turnContext.Activity as Activity, null, cancellationToken).ConfigureAwait(false);

                var signInLink = resource.SignInLink;

                return(new MessagingExtensionResponse
                {
                    ComposeExtension = new MessagingExtensionResult
                    {
                        Type = "auth",
                        SuggestedActions = new MessagingExtensionSuggestedAction
                        {
                            Actions = new List <CardAction>
                            {
                                new CardAction
                                {
                                    Type = ActionTypes.OpenUrl,
                                    Value = signInLink,
                                    Title = "Bot Service OAuth",
                                },
                            },
                        },
                    },
                });
            }

            var client  = new SimpleGraphClient(tokenResponse.Token);
            var profile = await client.GetMyProfile();

            var heroCard = new ThumbnailCard
            {
                Title  = "Thumbnail Card",
                Text   = $"Hello, {profile.DisplayName}",
                Images = new List <CardImage> {
                    new CardImage("https://raw.githubusercontent.com/microsoft/botframework-sdk/master/icon.png")
                },
            };

            var attachments = new MessagingExtensionAttachment(HeroCard.ContentType, null, heroCard);
            var result      = new MessagingExtensionResult("list", "result", new[] { attachments });

            return(new MessagingExtensionResponse(result));
        }
        protected override Task <MessagingExtensionResponse> OnTeamsMessagingExtensionSelectItemAsync(ITurnContext <IInvokeActivity> turnContext, JObject query, CancellationToken cancellationToken)
        {
            // The Preview card's Tap should have a Value property assigned, this will be returned to the bot in this event.
            var(packageId, version, description, projectUrl, iconUrl) = query.ToObject <(string, string, string, string, string)>();

            // We take every row of the results and wrap them in cards wrapped in in MessagingExtensionAttachment objects.
            // The Preview is optional, if it includes a Tap, that will trigger the OnTeamsMessagingExtensionSelectItemAsync event back on this bot.

            var card = new ThumbnailCard
            {
                Title    = $"{packageId}, {version}",
                Subtitle = description,
                Buttons  = new List <CardAction>
                {
                    new CardAction {
                        Type = ActionTypes.OpenUrl, Title = "Nuget Package", Value = $"https://www.nuget.org/packages/{packageId}"
                    },
                    new CardAction {
                        Type = ActionTypes.OpenUrl, Title = "Project", Value = projectUrl
                    },
                },
            };

            if (!string.IsNullOrEmpty(iconUrl))
            {
                card.Images = new List <CardImage>()
                {
                    new CardImage(iconUrl, "Icon")
                };
            }

            var attachment = new MessagingExtensionAttachment
            {
                ContentType = ThumbnailCard.ContentType,
                Content     = card,
            };

            return(Task.FromResult(new MessagingExtensionResponse
            {
                ComposeExtension = new MessagingExtensionResult
                {
                    Type = "result",
                    AttachmentLayout = "list",
                    Attachments = new List <MessagingExtensionAttachment> {
                        attachment
                    }
                }
            }));
        }
示例#12
0
        //protected override Task<MessagingExtensionResponse> OnTeamsAppBasedLinkQueryAsync(ITurnContext<IInvokeActivity> turnContext, AppBasedLinkQuery query, CancellationToken cancellationToken)
        //{
        //    var heroCard = new ThumbnailCard
        //    {
        //        Title = "Thumbnail Card",
        //        Text = query.Url,
        //        Images = new List<CardImage> { new CardImage("https://raw.githubusercontent.com/microsoft/botframework-sdk/master/icon.png") },
        //    };

        //    var attachments = new MessagingExtensionAttachment(HeroCard.ContentType, null, heroCard);
        //    var result = new MessagingExtensionResult("list", "result", new[] { attachments });

        //    return Task.FromResult(new MessagingExtensionResponse(result));
        //}


        protected override Task <MessagingExtensionResponse> OnTeamsAppBasedLinkQueryAsync(ITurnContext <IInvokeActivity> turnContext, AppBasedLinkQuery query, CancellationToken cancellationToken)
        {
            var heroCard = new ThumbnailCard
            {
                Title  = "Thumbnail Card",
                Text   = query.Url,
                Images = new List <CardImage> {
                    new CardImage("https://www.leaders-in-law.com/wp-content/uploads/2020/03/COVID-19.png")
                },
            };
            var attachments = new MessagingExtensionAttachment(HeroCard.ContentType, null, heroCard);
            var result      = new MessagingExtensionResult("list", "result", new[] { attachments });

            return(Task.FromResult(new MessagingExtensionResponse(result)));
        }
        protected async override Task <MessagingExtensionResponse> OnTeamsAppBasedLinkQueryAsync(ITurnContext <IInvokeActivity> turnContext, AppBasedLinkQuery query, CancellationToken cancellationToken)
        {
            var tokenResponse = await GetTokenResponse(turnContext, query.State, cancellationToken);

            if (tokenResponse == null || string.IsNullOrEmpty(tokenResponse.Token))
            {
                // There is no token, so the user has not signed in yet.
                // Retrieve the OAuth Sign in Link to use in the MessagingExtensionResult Suggested Actions
                var signInLink = await(turnContext.Adapter as IUserTokenProvider).GetOauthSignInLinkAsync(turnContext, _connectionName, cancellationToken);
                return(new MessagingExtensionResponse
                {
                    ComposeExtension = new MessagingExtensionResult
                    {
                        Type = "auth",
                        SuggestedActions = new MessagingExtensionSuggestedAction
                        {
                            Actions = new List <CardAction>
                            {
                                new CardAction
                                {
                                    Type = ActionTypes.OpenUrl,
                                    Value = signInLink,
                                    Title = "Bot Service OAuth",
                                },
                            },
                        },
                    },
                });
            }

            var client  = new SimpleGraphClient(tokenResponse.Token);
            var profile = await client.GetMyProfile();

            var imagelink = await client.GetPhotoAsync();

            var heroCard = new ThumbnailCard
            {
                Title  = "Thumbnail Card",
                Text   = $"Hello {profile.DisplayName}",
                Images = new List <CardImage> {
                    new CardImage(imagelink)
                }
            };
            var attachments = new MessagingExtensionAttachment(HeroCard.ContentType, null, heroCard);
            var result      = new MessagingExtensionResult("list", "result", new[] { attachments });

            return(new MessagingExtensionResponse(result));
        }
示例#14
0
        protected override async Task <MessagingExtensionResponse> OnTeamsAppBasedLinkQueryAsync(ITurnContext <IInvokeActivity> turnContext, AppBasedLinkQuery query, CancellationToken cancellationToken)
        {
            var heroCard = new ThumbnailCard
            {
                Title  = "Thumbnail Card",
                Text   = query.Url,
                Images = new List <CardImage> {
                    new CardImage("https://raw.githubusercontent.com/microsoft/botframework-sdk/master/icon.png")
                },
            };

            var attachments = new MessagingExtensionAttachment(HeroCard.ContentType, null, heroCard);
            var result      = new MessagingExtensionResult(AttachmentLayoutTypes.List, "result", new[] { attachments }, null, "test unfurl");

            return(new MessagingExtensionResponse(result));
        }
        protected override async Task <MessagingExtensionResponse> OnTeamsMessagingExtensionQueryAsync(ITurnContext <IInvokeActivity> turnContext, MessagingExtensionQuery query, CancellationToken cancellationToken)
        {
            var text = query?.Parameters?[0]?.Value as string ?? string.Empty;

            // Search notes that match the criteria.
            var notes = await _notesService.FindAsync(text);

            // We take every row of the results and wrap them in cards wrapped in in MessagingExtensionAttachment objects.
            var attachments = notes.Select(note =>
            {
                var previewCard = new ThumbnailCard
                {
                    Title  = note.Title,
                    Images = new List <CardImage> {
                        new CardImage(GetNoteIconUrl(note), "Icon")
                    },
                    Tap = new CardAction
                    {
                        Type  = "invoke",
                        Value = note
                    }
                };

                var attachment = new MessagingExtensionAttachment
                {
                    ContentType = HeroCard.ContentType,
                    Content     = new HeroCard {
                        Title = note.Title
                    },
                    Preview = previewCard.ToAttachment()
                              // Preview =  new Attachment(AdaptiveCard.ContentType, content: NoteCardFactory.GetAdaptiveCard("NoteTemplate.json", note))
                };

                return(attachment);
            }).ToList();

            // The list of MessagingExtensionAttachments must we wrapped in a MessagingExtensionResult wrapped in a MessagingExtensionResponse.
            return(new MessagingExtensionResponse
            {
                ComposeExtension = new MessagingExtensionResult
                {
                    Type = "result",
                    AttachmentLayout = "list",
                    Attachments = attachments
                }
            });
        }
        /// <summary>
        /// Handle when the user is searching in the messaging extension query.
        /// Apps should handle user queries and return appropriate results.
        /// </summary>
        /// <param name="turnContext">The turn context.</param>
        /// <param name="query">The messaging extension query.</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns>A Task that resolves to the list of cards that matched the query.</returns>
        protected override Task <MessagingExtensionResponse> OnTeamsMessagingExtensionQueryAsync(
            ITurnContext <IInvokeActivity> turnContext,
            MessagingExtensionQuery query,
            CancellationToken cancellationToken)
        {
            var attachment  = new HeroCard("Query not implemented", "App should handle query approperiately.");
            var attachments = new MessagingExtensionAttachment(HeroCard.ContentType, null /*url*/, attachment);
            var response    = new MessagingExtensionResponse
            {
                ComposeExtension = new MessagingExtensionResult(
                    AttachmentLayoutTypes.List,
                    "result" /*type*/,
                    new[] { attachments }),
            };

            return(Task.FromResult(response));
        }
示例#17
0
        protected override async Task <MessagingExtensionResponse> OnTeamsMessagingExtensionQueryAsync(ITurnContext <IInvokeActivity> turnContext, MessagingExtensionQuery query, CancellationToken cancellationToken)
        {
            var text = query?.Parameters?[0]?.Value as string ?? string.Empty;

            var packages = await FindPackages(text);

            // We take every row of the results and wrap them in cards wrapped in in MessagingExtensionAttachment objects.
            // The Preview is optional, if it includes a Tap, that will trigger the OnTeamsMessagingExtensionSelectItemAsync event back on this bot.
            var attachments = packages.Select(package =>
            {
                var previewCard = new ThumbnailCard {
                    Title = package.Item1, Tap = new CardAction {
                        Type = "invoke", Value = package
                    }
                };
                if (!string.IsNullOrEmpty(package.Item5))
                {
                    previewCard.Images = new List <CardImage>()
                    {
                        new CardImage(package.Item5, "Icon")
                    };
                }

                var attachment = new MessagingExtensionAttachment
                {
                    ContentType = HeroCard.ContentType,
                    Content     = new HeroCard {
                        Title = package.Item1
                    },
                    Preview = previewCard.ToAttachment()
                };

                return(attachment);
            }).ToList();

            // The list of MessagingExtensionAttachments must we wrapped in a MessagingExtensionResult wrapped in a MessagingExtensionResponse.
            return(new MessagingExtensionResponse
            {
                ComposeExtension = new MessagingExtensionResult
                {
                    Type = "result",
                    AttachmentLayout = "list",
                    Attachments = attachments
                }
            });
        }
        protected override Task <MessagingExtensionResponse> OnTeamsMessagingExtensionSelectItemAsync(ITurnContext <IInvokeActivity> turnContext, JObject query, CancellationToken cancellationToken)
        {
            // The Preview card's Tap should have a Value property assigned, this will be returned to the bot in this event.
            var article = query.ToObject <CustomSearchModel>();

            // We take every row of the results and wrap them in cards wrapped in in MessagingExtensionAttachment objects.
            // The Preview is optional, if it includes a Tap, that will trigger the OnTeamsMessagingExtensionSelectItemAsync event back on this bot.
            var card = new ThumbnailCard
            {
                Title    = $"{article.Name}, published on: {article.DatePublished}",
                Subtitle = article.Description,
                Buttons  = new List <CardAction>
                {
                    new CardAction {
                        Type = ActionTypes.OpenUrl, Title = "Go to the Article", Value = article.Url
                    }
                },
            };

            if (!string.IsNullOrEmpty(article.ThumbnailUrl))
            {
                card.Images = new List <CardImage>()
                {
                    new CardImage(article.ThumbnailUrl, "Icon")
                };
            }

            var attachment = new MessagingExtensionAttachment
            {
                ContentType = ThumbnailCard.ContentType,
                Content     = card,
            };

            return(Task.FromResult(new MessagingExtensionResponse
            {
                ComposeExtension = new MessagingExtensionResult
                {
                    Type = "result",
                    AttachmentLayout = "list",
                    Attachments = new List <MessagingExtensionAttachment> {
                        attachment
                    }
                }
            }));
        }
示例#19
0
        /// <inheritdoc/>
        public override async Task <DialogTurnResult> BeginDialogAsync(DialogContext dc, object options = null, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (options is CancellationToken)
            {
                throw new ArgumentException($"{nameof(options)} cannot be a cancellation token");
            }

            if (Disabled != null && Disabled.GetValue(dc.State))
            {
                return(await dc.EndDialogAsync(cancellationToken : cancellationToken).ConfigureAwait(false));
            }

            if (Card == null)
            {
                throw new ArgumentException($"A valid card is required for {Kind}.");
            }

            var activity = await Card.BindAsync(dc, dc.State).ConfigureAwait(false);

            if (activity?.Attachments?.Any() != true)
            {
                throw new InvalidOperationException($"Invalid activity. An attachment is required for {Kind}.");
            }

            var attachment          = activity.Attachments[0];
            var extensionAttachment = new MessagingExtensionAttachment(attachment.ContentType, null, attachment.Content);

            var response = new MessagingExtensionResponse
            {
                ComposeExtension = new MessagingExtensionResult
                {
                    Type             = MEResultResponseType.result.ToString(),
                    AttachmentLayout = MEAttachmentLayoutResponseType.list.ToString(), // TODO: enum this
                    Attachments      = new List <MessagingExtensionAttachment> {
                        extensionAttachment
                    }
                },
                CacheInfo = GetCacheInfo(dc),
            };

            var invokeResponse            = CreateInvokeResponseActivity(response);
            ResourceResponse sendResponse = await dc.Context.SendActivityAsync(invokeResponse, cancellationToken : cancellationToken).ConfigureAwait(false);

            return(await dc.EndDialogAsync(sendResponse, cancellationToken : cancellationToken).ConfigureAwait(false));
        }
        private MessagingExtensionResponse GetContentCardResponse(Resource resource)
        {
            // Prepare attachments
            var expandedCard  = this.cardFactory.GetResourceContentCard(resource);
            var collapsedCard = this.cardFactory.GetResourcePreviewCard(resource);
            var attachments   = new MessagingExtensionAttachment(expandedCard.ContentType, null /*contentUrl*/, expandedCard.Content)
            {
                Preview = collapsedCard,
            };

            // ME result.
            var result = new MessagingExtensionResult(
                AttachmentLayoutTypes.List,
                "result" /*type*/,
                new[] { attachments });

            return(new MessagingExtensionResponse(result));
        }
        protected override Task <MessagingExtensionResponse> OnTeamsMessagingExtensionSelectItemAsync(ITurnContext <IInvokeActivity> turnContext, JObject query, CancellationToken cancellationToken)
        {
            // The Preview card's Tap should have a Value property assigned, this will be returned to the bot in this event.
            var lead = query.ToObject <NameData>();


            //We take every row of the results and wrap them in cards wrapped in in MessagingExtensionAttachment objects.
            // The Preview is optional, if it includes a Tap, that will trigger the OnTeamsMessagingExtensionSelectItemAsync event back on this bot.
            var card = new ThumbnailCard
            {
                Title    = $"{lead.AssignedUser}",
                Subtitle = lead.Contact,
                Text     = Convert.ToString(lead.Converted),


                Buttons = new List <CardAction>
                {
                    //new CardAction { Type = ActionTypes.OpenUrl, Title = "Nuget Package", Value = $"https://www.nuget.org/packages/{packageId}" },
                    new CardAction {
                        Type = ActionTypes.OpenUrl, Title = "Chat", Value = lead.Website
                    },
                },
            };


            var attachment = new MessagingExtensionAttachment
            {
                ContentType = ThumbnailCard.ContentType,
                Content     = card,
            };


            return(Task.FromResult(new MessagingExtensionResponse
            {
                ComposeExtension = new MessagingExtensionResult
                {
                    Type = "result",
                    AttachmentLayout = "list",
                    Attachments = new List <MessagingExtensionAttachment> {
                        attachment
                    }
                }
            }));
        }
        protected override async Task <MessagingExtensionActionResponse> OnTeamsMessagingExtensionBotMessagePreviewSendAsync(ITurnContext <IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken)
        {
            // The data has been returned to the bot in the action structure.
            var activityPreview   = action.BotActivityPreview[0];
            var attachmentContent = activityPreview.Attachments[0].Content;
            var previewedCard     = JsonConvert.DeserializeObject <AdaptiveCard>(attachmentContent.ToString(), new JsonSerializerSettings {
                NullValueHandling = NullValueHandling.Ignore
            });

            var exampleData = AdaptiveCardHelper.CreateExampleData(previewedCard);

            // This is a send so we are done and we will create the adaptive card editor.
            var adaptiveCard = AdaptiveCardHelper.CreateAdaptiveCard(exampleData);

            var message = MessageFactory.Attachment(new Attachment {
                ContentType = AdaptiveCard.ContentType, Content = adaptiveCard
            });

            // THIS WILL WORK IF THE BOT IS INSTALLED. (GetMembers() will NOT throw if the bot is installed.)
            // (The application should fail gracefully.)
            var channelId = turnContext.Activity.TeamsGetChannelId();

            var conversationParameters = new ConversationParameters
            {
                IsGroup     = true,
                ChannelData = new TeamsChannelData {
                    Channel = new ChannelInfo(channelId)
                },
                Activity = (Activity)message,
            };

            var connectorClient = turnContext.TurnState.Get <IConnectorClient>();

            // This call does NOT send the outbound Activity is not being sent through the middleware stack.
            var conversationResourceResponse = await connectorClient.Conversations.CreateConversationAsync(conversationParameters, cancellationToken).ConfigureAwait(false);

            var attachments = new MessagingExtensionAttachment(AdaptiveCard.ContentType, null, adaptiveCard);
            var result      = new MessagingExtensionResult(AttachmentLayoutTypes.List, "result", new[] { attachments }, null);

            return(new MessagingExtensionActionResponse()
            {
                ComposeExtension = result,
            });
        }
示例#23
0
        protected override async Task <MessagingExtensionResponse> OnTeamsMessagingExtensionQueryAsync(ITurnContext <IInvokeActivity> turnContext, MessagingExtensionQuery query, CancellationToken cancellationToken)
        {
            var text = query?.Parameters?[0]?.Value as string ?? string.Empty;

            var patients = await FindPatient(text);

            var attachments = patients.Select(patient =>
            {
                var previewCard = new ThumbnailCard {
                    Title = patient.Item2, Subtitle = "Gender : " + patient.Item4, Text = "Contact Number : " + patient.Item5, Tap = new CardAction {
                        Type = "invoke", Value = patient
                    }
                };
                if (!string.IsNullOrEmpty(patient.Item6))
                {
                    previewCard.Images = new List <CardImage>()
                    {
                        new CardImage(patient.Item6, "Profile Pic")
                    };
                }

                var attachment = new MessagingExtensionAttachment
                {
                    ContentType = HeroCard.ContentType,
                    Content     = new HeroCard {
                        Title = patient.Item1
                    },
                    Preview = previewCard.ToAttachment()
                };

                return(attachment);
            }).ToList();

            return(new MessagingExtensionResponse
            {
                ComposeExtension = new MessagingExtensionResult
                {
                    Type = "result",
                    AttachmentLayout = "list",
                    Attachments = attachments
                }
            });
        }
示例#24
0
        public void MessagingExtensionAttachmentInits()
        {
            var contentType  = "text/plain";
            var contentUrl   = "https://example.com";
            var content      = "some content";
            var name         = "super-plain-attachment";
            var thumbnailUrl = "https://url-to-thumbnail.com";
            var preview      = new Attachment();

            var msgExtAttachment = new MessagingExtensionAttachment(contentType, contentUrl, content, name, thumbnailUrl, preview);

            Assert.NotNull(msgExtAttachment);
            Assert.IsType <MessagingExtensionAttachment>(msgExtAttachment);
            Assert.Equal(contentType, msgExtAttachment.ContentType);
            Assert.Equal(contentUrl, msgExtAttachment.ContentUrl);
            Assert.Equal(content, msgExtAttachment.Content);
            Assert.Equal(name, msgExtAttachment.Name);
            Assert.Equal(thumbnailUrl, msgExtAttachment.ThumbnailUrl);
            Assert.Equal(preview, msgExtAttachment.Preview);
        }
        private async Task <MessagingExtensionResponse> SearchRedditPostsAsync(string query)
        {
            try
            {
                // Execute the domain logic to get the reddit link
                IEnumerable <RedditLinkModel> redditLinks = await this.redditHttpClient.SearchLinksAsync(query);

                var attachments = redditLinks
                                  .Select(redditLink =>
                {
                    var preview = new MessagingExtensionAttachment(
                        contentType: HeroCard.ContentType,
                        contentUrl: null,
                        content: this.RenderLinkHeroCard(redditLink));
                    return(new MessagingExtensionAttachment
                    {
                        ContentType = AdaptiveCard.ContentType,
                        Content = this.RenderLinkAdaptiveCard(redditLink),
                        Preview = preview,
                    });
                })
                                  .ToList();

                return(new MessagingExtensionResponse
                {
                    ComposeExtension = new MessagingExtensionResult
                    {
                        Type = "result",
                        AttachmentLayout = AttachmentLayoutTypes.List,
                        Attachments = attachments,
                    },
                });
            }
#pragma warning disable CA1031 // This is a top-level handler and should avoid throwing exceptions.
            catch (Exception ex)
#pragma warning restore CA1031
            {
                this.logger.LogError(ex, "Failed to get reddit post");
                return(null);
            }
        }
示例#26
0
        public async static Task <MessagingExtensionActionResponse> ShowResponseCard(ITurnContext <IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken, string Data)
        {
            string card = "{\r\n    \"type\": \"AdaptiveCard\",\r\n    \"version\": \"1.0\",\r\n    \"body\": [\r\n        {\r\n            \"type\": \"Image\",\r\n            \"altText\": \"\",\r\n            \"url\": \"https://1f0bd229.ngrok.io/images/Firstresponsecolor.png\",\r\n            \"width\": \"\"\r\n        },\r\n        {\r\n            \"type\": \"ColumnSet\",\r\n            \"columns\": [\r\n                {\r\n                    \"type\": \"Column\",\r\n                    \"items\": [\r\n                        {\r\n                            \"type\": \"Image\",\r\n                            \"altText\": \"\",\r\n                            \"url\": \"https://1f0bd229.ngrok.io/images/ref1.png\"\r\n                        },\r\n                        {\r\n                            \"type\": \"TextBlock\",\r\n                            \"text\": \"1\"\r\n                        }\r\n                    ],\r\n                    \"width\": \"stretch\"\r\n                },\r\n                {\r\n                    \"type\": \"Column\",\r\n                    \"items\": [\r\n                        {\r\n                            \"type\": \"Image\",\r\n                            \"altText\": \"\",\r\n                            \"url\": \"https://1f0bd229.ngrok.io/images/ref2.png\"\r\n                        },\r\n                        {\r\n                            \"type\": \"TextBlock\",\r\n                            \"text\": \"1\"\r\n                        }\r\n                    ],\r\n                    \"width\": \"stretch\"\r\n                },\r\n                {\r\n                    \"type\": \"Column\",\r\n                    \"items\": [\r\n                        {\r\n                            \"type\": \"Image\",\r\n                            \"altText\": \"1\",\r\n                            \"url\": \"https://1f0bd229.ngrok.io/images/ref3.png\"\r\n                        },\r\n                        {\r\n                            \"type\": \"TextBlock\",\r\n                            \"text\": \"1\"\r\n                        }\r\n                    ],\r\n                    \"width\": \"stretch\"\r\n                },\r\n                {\r\n                    \"type\": \"Column\",\r\n                    \"items\": [\r\n                        {\r\n                            \"type\": \"Image\",\r\n                            \"altText\": \"\",\r\n                            \"url\": \"https://1f0bd229.ngrok.io/images/ref4.png\"\r\n                        },\r\n                        {\r\n                            \"type\": \"TextBlock\",\r\n                            \"text\": \"1\"\r\n                        }\r\n                    ],\r\n                    \"width\": \"stretch\"\r\n                },\r\n                {\r\n                    \"type\": \"Column\",\r\n                    \"items\": [\r\n                        {\r\n                            \"type\": \"Image\",\r\n                            \"altText\": \"\",\r\n                            \"url\": \"https://1f0bd229.ngrok.io/images/ref5.png\"\r\n                        },\r\n                        {\r\n                            \"type\": \"TextBlock\",\r\n                            \"text\": \"1\"\r\n                        }\r\n                    ],\r\n                    \"width\": \"stretch\"\r\n                }\r\n            ]\r\n        }\r\n    ],\r\n    \"$schema\": \"http://adaptivecards.io/schemas/adaptive-card.json\"\r\n}";

            AdaptiveCardParseResult result = AdaptiveCard.FromJson(card);
            var attachment = new MessagingExtensionAttachment
            {
                ContentType = AdaptiveCard.ContentType,
                Content     = result.Card,
            };

            return(await Task.FromResult(new MessagingExtensionActionResponse
            {
                ComposeExtension = new MessagingExtensionResult
                {
                    Type = "result",
                    AttachmentLayout = "list",
                    Attachments = new List <MessagingExtensionAttachment> {
                        attachment
                    }
                }
            }));
        }
示例#27
0
        protected override Task <MessagingExtensionResponse> OnTeamsMessagingExtensionSelectItemAsync(ITurnContext <IInvokeActivity> turnContext, JObject query, CancellationToken cancellationToken)
        {
            var(Id, PatientName, PatientAge, PatientGender, PatientContactNo, Photograph) = query.ToObject <(string, string, string, string, string, string)>();

            var card = new AdaptiveCard("1.2")
            {
                Body = new List <AdaptiveElement>()
                {
                    new AdaptiveColumnSet()
                    {
                        Columns = new List <AdaptiveColumn>()
                        {
                            new AdaptiveColumn()
                            {
                                Width = AdaptiveColumnWidth.Auto,
                                Items = new List <AdaptiveElement>()
                                {
                                    new AdaptiveImage(Photograph)
                                    {
                                        Style = AdaptiveImageStyle.Default,
                                        Size  = AdaptiveImageSize.Medium
                                    }
                                }
                            },
                            new AdaptiveColumn()
                            {
                                Width = AdaptiveColumnWidth.Stretch,
                                Items = new List <AdaptiveElement>()
                                {
                                    new AdaptiveTextBlock()
                                    {
                                        Weight = AdaptiveTextWeight.Bolder,
                                        Text   = PatientName,
                                        Wrap   = true,
                                        Size   = AdaptiveTextSize.Large
                                    },
                                }
                            },
                        }
                    },
                    new AdaptiveTextBlock()
                    {
                        Text  = "Patient Name : " + PatientName,
                        Size  = AdaptiveTextSize.ExtraLarge,
                        Color = AdaptiveTextColor.Accent
                    },
                    new AdaptiveColumnSet()
                    {
                        Columns = new List <AdaptiveColumn>()
                        {
                            new AdaptiveColumn()
                            {
                                Width = AdaptiveColumnWidth.Stretch,
                                Items = new List <AdaptiveElement>()
                                {
                                    new AdaptiveTextBlock()
                                    {
                                        Text   = "PatientAge",
                                        Weight = AdaptiveTextWeight.Bolder
                                    },
                                    new AdaptiveTextBlock()
                                    {
                                        Text   = "PatientGender",
                                        Weight = AdaptiveTextWeight.Bolder
                                    },

                                    new AdaptiveTextBlock()
                                    {
                                        Text   = "PatientContactNo.",
                                        Weight = AdaptiveTextWeight.Bolder
                                    },
                                    new AdaptiveActionSet()
                                    {
                                        Actions = new List <AdaptiveAction>()
                                        {
                                            new AdaptiveOpenUrlAction()
                                            {
                                                UrlString = $"https://teams.microsoft.com/l/entity/2ca68a73-5072-43de-b4f7-1a9319fc041b/_djb2_msteams_prefix_3169093601?context=%7B%22subEntityId%22%3A{Id}%2C%22channelId%22%3A%2219%3A1ce385e57c0646deb67d00af44b2fa32%40thread.tacv2%22%7D",
                                                Title     = "More details"
                                            }
                                        }
                                    }
                                }
                            },
                            new AdaptiveColumn()
                            {
                                Width = AdaptiveColumnWidth.Stretch,
                                Items = new List <AdaptiveElement>()
                                {
                                    new AdaptiveTextBlock()
                                    {
                                        Text = PatientAge
                                    },
                                    new AdaptiveTextBlock()
                                    {
                                        Text = PatientGender
                                    },
                                    new AdaptiveTextBlock()
                                    {
                                        Text = PatientContactNo
                                    },
                                }
                            }
                        }
                    },
                }
            };
            var attachment = new MessagingExtensionAttachment
            {
                ContentType = AdaptiveCard.ContentType,
                Content     = card,
                Preview     = new Attachment
                {
                    ContentType = ThumbnailCard.ContentType,
                    Content     = new ThumbnailCard
                    {
                        Title = PatientName,
                    },
                }
            };

            return(Task.FromResult(new MessagingExtensionResponse
            {
                ComposeExtension = new MessagingExtensionResult
                {
                    Type = "result",
                    AttachmentLayout = "list",
                    Attachments = new List <MessagingExtensionAttachment> {
                        attachment
                    }
                }
            }));
        }
示例#28
0
        protected override async Task <MessagingExtensionResponse> OnTeamsMessagingExtensionQueryAsync(ITurnContext <IInvokeActivity> turnContext, MessagingExtensionQuery action, CancellationToken cancellationToken)
        {
            var text = action?.Parameters?[0]?.Name as string ?? string.Empty;

            var attachments        = new List <MessagingExtensionAttachment>();
            var userConfigSettings = await _userConfigProperty.GetAsync(turnContext, () => string.Empty);

            if (userConfigSettings.ToUpper().Contains("EMAIL"))
            {
                // When the Bot Service Auth flow completes, the action.State will contain a magic code used for verification.
                var state         = action.State; // Check the state value
                var tokenResponse = await GetTokenResponse(turnContext, state, cancellationToken);

                if (tokenResponse == null || string.IsNullOrEmpty(tokenResponse.Token))
                {
                    // There is no token, so the user has not signed in yet.

                    // Retrieve the OAuth Sign in Link to use in the MessagingExtensionResult Suggested Actions
                    var signInLink = await GetSignInLinkAsync(turnContext, cancellationToken).ConfigureAwait(false);

                    return(new MessagingExtensionResponse
                    {
                        ComposeExtension = new MessagingExtensionResult
                        {
                            Type = "auth",
                            SuggestedActions = new MessagingExtensionSuggestedAction
                            {
                                Actions = new List <CardAction>
                                {
                                    new CardAction
                                    {
                                        Type = ActionTypes.OpenUrl,
                                        Value = signInLink,
                                        Title = "Bot Service OAuth",
                                    },
                                },
                            },
                        },
                    });
                }

                var client = new SimpleGraphClient(tokenResponse.Token);

                var messages = await client.SearchMailInboxAsync(text);

                // Here we construct a ThumbnailCard for every attachment, and provide a HeroCard which will be
                // displayed if the selects that item.
                attachments = messages.Select(msg => new MessagingExtensionAttachment
                {
                    ContentType = HeroCard.ContentType,
                    Content     = new HeroCard
                    {
                        Title    = msg.From.EmailAddress.Address,
                        Subtitle = msg.Subject,
                        Text     = msg.Body.Content,
                    },
                    Preview = new ThumbnailCard
                    {
                        Title  = msg.From.EmailAddress.Address,
                        Text   = $"{msg.Subject}<br />{msg.BodyPreview}",
                        Images = new List <CardImage>()
                        {
                            new CardImage("https://raw.githubusercontent.com/microsoft/botbuilder-samples/master/docs/media/OutlookLogo.jpg", "Outlook Logo"),
                        },
                    }.ToAttachment()
                }
                                              ).ToList();
            }
            else
            {
                var packages = await FindPackages(text);

                // We take every row of the results and wrap them in cards wrapped in in MessagingExtensionAttachment objects.
                // The Preview is optional, if it includes a Tap, that will trigger the OnTeamsMessagingExtensionSelectItemAsync event back on this bot.
                attachments = packages.Select(package =>
                {
                    var previewCard = new ThumbnailCard {
                        Title = package.Item1, Tap = new CardAction {
                            Type = "invoke", Value = package
                        }
                    };
                    if (!string.IsNullOrEmpty(package.Item5))
                    {
                        previewCard.Images = new List <CardImage>()
                        {
                            new CardImage(package.Item5, "Icon")
                        };
                    }

                    var attachment = new MessagingExtensionAttachment
                    {
                        ContentType = HeroCard.ContentType,
                        Content     = new HeroCard {
                            Title = package.Item1
                        },
                        Preview = previewCard.ToAttachment()
                    };

                    return(attachment);
                }).ToList();
            }

            // The list of MessagingExtensionAttachments must we wrapped in a MessagingExtensionResult wrapped in a MessagingExtensionResponse.
            return(new MessagingExtensionResponse
            {
                ComposeExtension = new MessagingExtensionResult
                {
                    Type = "result",
                    AttachmentLayout = "list",
                    Attachments = attachments
                }
            });
        }
        protected override async Task <MessagingExtensionResponse> OnTeamsMessagingExtensionQueryAsync(ITurnContext <IInvokeActivity> turnContext, MessagingExtensionQuery action, CancellationToken cancellationToken)
        {
            var tokenResponse = await GetTokenResponse(turnContext, action.State, cancellationToken);

            if (tokenResponse == null || string.IsNullOrEmpty(tokenResponse.Token))
            {
                // There is no token, so the user has not signed in yet.
                // Retrieve the OAuth Sign in Link to use in the MessagingExtensionResult Suggested Actions
                var signInLink = await(turnContext.Adapter as IUserTokenProvider).GetOauthSignInLinkAsync(turnContext, _connectionName, cancellationToken);
                return(new MessagingExtensionResponse
                {
                    ComposeExtension = new MessagingExtensionResult
                    {
                        Type = "auth",
                        SuggestedActions = new MessagingExtensionSuggestedAction
                        {
                            Actions = new List <CardAction>
                            {
                                new CardAction
                                {
                                    Type = ActionTypes.OpenUrl,
                                    Value = signInLink,
                                    Title = "Bot Service OAuth",
                                },
                            },
                        },
                    },
                });
            }
            var client = new SimpleGraphClient(tokenResponse.Token);
            var me     = await client.GetMyProfile();

            var imagelink = await client.GetPhotoAsync();

            var previewcard = new ThumbnailCard
            {
                Title  = me.DisplayName,
                Images = new List <CardImage> {
                    new CardImage {
                        Url = imagelink
                    }
                }
            };
            var attachment = new MessagingExtensionAttachment
            {
                ContentType = ThumbnailCard.ContentType,
                Content     = previewcard,
                Preview     = previewcard.ToAttachment()
            };

            return(new MessagingExtensionResponse
            {
                ComposeExtension = new MessagingExtensionResult
                {
                    Type = "result",
                    AttachmentLayout = "list",
                    Attachments = new List <MessagingExtensionAttachment> {
                        attachment
                    }
                }
            });
        }
        protected override async Task <MessagingExtensionResponse> OnTeamsMessagingExtensionQueryAsync(ITurnContext <IInvokeActivity> turnContext, MessagingExtensionQuery action, CancellationToken cancellationToken)
        {
            var text          = action?.Parameters?[0]?.Name as string ?? string.Empty;
            var attachments   = new List <MessagingExtensionAttachment>();
            var tokenResponse = await GetTokenResponse(turnContext, action.State, cancellationToken);

            if (tokenResponse == null || string.IsNullOrEmpty(tokenResponse.Token))
            {
                // There is no token, so the user has not signed in yet.
                // Retrieve the OAuth Sign in Link to use in the MessagingExtensionResult Suggested Actions
                var signInLink = await(turnContext.Adapter as IUserTokenProvider).GetOauthSignInLinkAsync(turnContext, _connectionName, cancellationToken);
                return(new MessagingExtensionResponse
                {
                    ComposeExtension = new MessagingExtensionResult
                    {
                        Type = "auth",
                        SuggestedActions = new MessagingExtensionSuggestedAction
                        {
                            Actions = new List <CardAction>
                            {
                                new CardAction
                                {
                                    Type = ActionTypes.OpenUrl,
                                    Value = signInLink,
                                    Title = "Bot Service OAuth",
                                },
                            },
                        },
                    },
                });
            }

            var client = new SimpleGraphClient(tokenResponse.Token);
            var me     = await client.GetMyProfile();

            // await client.GetPhotoAsync();
            var    paths       = new[] { ".", "Resources", "UserDetailsCard.json" };
            string filepath    = Path.Combine(paths);
            var    previewcard = new ThumbnailCard
            {
                Title  = me.DisplayName,
                Images = new List <CardImage> {
                    new CardImage {
                        Url = "https://devicecapabilities.blob.core.windows.net/filestorage/UserLogo.png"
                    }
                }
            };

            var attachment = new MessagingExtensionAttachment
            {
                ContentType = ThumbnailCard.ContentType,
                Content     = previewcard,
                Preview     = previewcard.ToAttachment()
            };

            return(new MessagingExtensionResponse
            {
                ComposeExtension = new MessagingExtensionResult
                {
                    Type = "result",
                    AttachmentLayout = "list",
                    Attachments = new List <MessagingExtensionAttachment> {
                        attachment
                    }
                }
            });
        }