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 } } }); }
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 } }); }
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); }
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 } } })); }
//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)); }
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)); }
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 } } })); }
/// <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, }); }
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 } }); }
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); } }
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 } } })); }
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 } } })); }
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 } } }); }