private Action <IActivity> AssertSelectOneOfTheMessage(int selection) { return(activity => { var messageActivity = activity.AsMessageActivity(); var totalEmails = ((MockServiceManager)this.ServiceManager).MailService.MyMessages; var replies = this.ParseReplies(ShowEmailResponses.ReadOutMessage.Replies, new StringDictionary() { { "EmailDetails", SpeakHelper.ToSpeechEmailDetailString(totalEmails[selection - 1], TimeZoneInfo.Local) }, }); CollectionAssert.Contains(replies, messageActivity.Text); Assert.AreEqual(messageActivity.Attachments.Count, 1); }); }
protected async Task ShowMailList(WaterfallStepContext sc, List <Message> messages) { var state = await EmailStateAccessor.GetAsync(sc.Context); var cardsData = new List <EmailCardData>(); foreach (var message in messages) { var nameListString = DisplayHelper.ToDisplayRecipientsString_Summay(message.ToRecipients); var emailCard = new EmailCardData { Subject = message.Subject, Sender = message.Sender.EmailAddress.Name, NameList = string.Format(CommonStrings.ToFormat, nameListString), EmailContent = message.BodyPreview, EmailLink = message.WebLink, ReceivedDateTime = message.ReceivedDateTime == null ? CommonStrings.NotAvailable : message.ReceivedDateTime.Value.UtcDateTime.ToRelativeString(state.GetUserTimeZone()), Speak = SpeakHelper.ToSpeechEmailDetailString(message), }; cardsData.Add(emailCard); } var searchType = CommonStrings.Relevant; if (state.IsUnreadOnly) { searchType = string.Format(CommonStrings.RelevantFormat, CommonStrings.Unread); } else if (state.IsImportant) { searchType = string.Format(CommonStrings.RelevantFormat, CommonStrings.Important); } var stringToken = new StringDictionary { { "SearchType", searchType }, { "EmailListDetails", SpeakHelper.ToSpeechEmailListString(messages) }, }; var reply = sc.Context.Activity.CreateAdaptiveCardGroupReply(EmailSharedResponses.ShowEmailPrompt, "Dialogs/Shared/Resources/Cards/EmailCard.json", AttachmentLayoutTypes.Carousel, cardsData, ResponseBuilder, stringToken); await sc.Context.SendActivityAsync(reply); }
public async Task <DialogTurnResult> ReadEmail(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var state = await EmailStateAccessor.GetAsync(sc.Context); sc.Context.Activity.Properties.TryGetValue("OriginText", out var content); var userInput = content != null?content.ToString() : sc.Context.Activity.Text; var luisResult = state.LuisResult; var topIntent = luisResult?.TopIntent().intent; var generalLuisResult = state.GeneralLuisResult; var generalTopIntent = generalLuisResult?.TopIntent().intent; if (topIntent == null) { return(await sc.EndDialogAsync(true)); } var message = state.Message.FirstOrDefault(); var promptRecognizerResult = ConfirmRecognizerHelper.ConfirmYesOrNo(userInput, sc.Context.Activity.Locale); if (promptRecognizerResult.Succeeded && promptRecognizerResult.Value == false) { await sc.Context.SendActivityAsync( sc.Context.Activity.CreateReply(EmailSharedResponses.CancellingMessage)); return(await sc.EndDialogAsync(true)); } else if (topIntent == Email.Intent.ReadAloud && message == null) { return(await sc.PromptAsync(Actions.Prompt, new PromptOptions { Prompt = sc.Context.Activity.CreateReply(ShowEmailResponses.ReadOutPrompt), })); } else if (topIntent == Email.Intent.SelectItem || (topIntent == Email.Intent.ReadAloud && message != null)) { var nameListString = DisplayHelper.ToDisplayRecipientsString_Summay(message.ToRecipients); var emailCard = new EmailCardData { Subject = message.Subject, Sender = message.Sender.EmailAddress.Name, NameList = string.Format(CommonStrings.ToFormat, nameListString), EmailContent = message.BodyPreview, EmailLink = message.WebLink, ReceivedDateTime = message?.ReceivedDateTime == null ? CommonStrings.NotAvailable : message.ReceivedDateTime.Value.UtcDateTime.ToRelativeString(state.GetUserTimeZone()), Speak = SpeakHelper.ToSpeechEmailDetailString(message), }; // Todo: workaround here to read out email details. Ignore body for now as we need a summary and filter. var emailDetails = SpeakHelper.ToSpeechEmailDetailString(message); var replyMessage = sc.Context.Activity.CreateAdaptiveCardReply(ShowEmailResponses.ReadOutMessage, "Dialogs/Shared/Resources/Cards/EmailDetailCard.json", emailCard, null, new StringDictionary() { { "EmailDetails", emailDetails } }); await sc.Context.SendActivityAsync(replyMessage); return(await sc.PromptAsync(Actions.Prompt, new PromptOptions { Prompt = sc.Context.Activity.CreateReply(ShowEmailResponses.ReadOutMorePrompt) })); } else { return(await sc.NextAsync()); } } catch (Exception ex) { throw await HandleDialogExceptions(sc, ex); } }
protected async Task <DialogTurnResult> ReadEmail(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var state = await EmailStateAccessor.GetAsync(sc.Context); var skillOptions = (EmailSkillDialogOptions)sc.Options; sc.Context.Activity.Properties.TryGetValue("OriginText", out var content); var userInput = content != null?content.ToString() : sc.Context.Activity.Text; var luisResult = state.LuisResult; var topIntent = luisResult?.TopIntent().intent; var generalLuisResult = state.GeneralLuisResult; var generalTopIntent = generalLuisResult?.TopIntent().intent; if (topIntent == null) { return(await sc.EndDialogAsync(true)); } await DigestFocusEmailAsync(sc); var message = state.Message.FirstOrDefault(); if (message == null) { state.Message.Add(state.MessageList[0]); message = state.Message.FirstOrDefault(); } var promptRecognizerResult = ConfirmRecognizerHelper.ConfirmYesOrNo(userInput, sc.Context.Activity.Locale); if ((topIntent == EmailLU.Intent.None || topIntent == EmailLU.Intent.SearchMessages || (topIntent == EmailLU.Intent.ReadAloud && !IsReadMoreIntent(generalTopIntent, sc.Context.Activity.Text)) || (promptRecognizerResult.Succeeded && promptRecognizerResult.Value == true)) && message != null) { var nameListString = DisplayHelper.ToDisplayRecipientsString_Summay(message.ToRecipients); var emailCard = new EmailCardData { Subject = message.Subject, Sender = message.Sender.EmailAddress.Name, NameList = string.Format(EmailCommonStrings.ToFormat, nameListString), EmailContent = message.BodyPreview, EmailLink = message.WebLink, ReceivedDateTime = message?.ReceivedDateTime == null ? CommonStrings.NotAvailable : message.ReceivedDateTime.Value.UtcDateTime.ToRelativeString(state.GetUserTimeZone()), Speak = SpeakHelper.ToSpeechEmailDetailOverallString(message, state.GetUserTimeZone()), }; var tokens = new StringDictionary() { { "EmailDetails", SpeakHelper.ToSpeechEmailDetailString(message, state.GetUserTimeZone()) }, { "EmailDetailsWithContent", SpeakHelper.ToSpeechEmailDetailString(message, state.GetUserTimeZone(), true) }, }; var replyMessage = ResponseManager.GetCardResponse( ShowEmailResponses.ReadOutMessage, new Card("EmailDetailCard", emailCard), tokens); // Set email as read. var service = ServiceManager.InitMailService(state.Token, state.GetUserTimeZone(), state.MailSourceType); await service.MarkMessageAsReadAsync(message.Id); await sc.Context.SendActivityAsync(replyMessage); } return(await sc.NextAsync()); } catch (SkillException ex) { await HandleDialogExceptions(sc, ex); return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs)); } catch (Exception ex) { await HandleDialogExceptions(sc, ex); return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs)); } }
protected async Task <DialogTurnResult> ReadEmailAsync(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var state = await EmailStateAccessor.GetAsync(sc.Context, cancellationToken : cancellationToken); var skillOptions = (EmailSkillDialogOptions)sc.Options; var userInput = sc.Context.Activity.Text; var luisResult = sc.Context.TurnState.Get <EmailLuis>(StateProperties.EmailLuisResult); var topIntent = luisResult?.TopIntent().intent; var generalLuisResult = sc.Context.TurnState.Get <General>(StateProperties.GeneralLuisResult); var generalTopIntent = generalLuisResult?.TopIntent().intent; if (topIntent == null) { return(await sc.EndDialogAsync(true, cancellationToken)); } await DigestFocusEmailAsync(sc, cancellationToken); var message = state.Message.FirstOrDefault(); if (message == null) { state.Message.Add(state.MessageList[0]); message = state.Message.FirstOrDefault(); } var promptRecognizerResult = ConfirmRecognizerHelper.ConfirmYesOrNo(userInput, sc.Context.Activity.Locale); if ((topIntent == EmailLuis.Intent.None || topIntent == EmailLuis.Intent.SearchMessages || (topIntent == EmailLuis.Intent.ReadAloud && !IsReadMoreIntent(generalTopIntent, sc.Context.Activity.Text)) || (promptRecognizerResult.Succeeded && promptRecognizerResult.Value == true)) && message != null) { var senderIcon = await GetUserPhotoUrlAsync(sc.Context, message.Sender.EmailAddress, cancellationToken); var emailCard = new EmailCardData { Subject = message.Subject, Sender = message.Sender.EmailAddress.Name, EmailContent = message.BodyPreview, EmailLink = message.WebLink, ReceivedDateTime = message?.ReceivedDateTime == null ? CommonStrings.NotAvailable : message.ReceivedDateTime.Value.UtcDateTime.ToDetailRelativeString(state.GetUserTimeZone()), Speak = SpeakHelper.ToSpeechEmailDetailOverallString(message, state.GetUserTimeZone()), SenderIcon = senderIcon }; emailCard = await ProcessRecipientPhotoUrlAsync(sc.Context, emailCard, message.ToRecipients, cancellationToken); var replyMessage = TemplateManager.GenerateActivityForLocale( ShowEmailResponses.ReadOutMessage, new { emailDetailsWithoutContent = SpeakHelper.ToSpeechEmailDetailString(message, state.GetUserTimeZone()), emailDetailsWithContent = SpeakHelper.ToSpeechEmailDetailString(message, state.GetUserTimeZone(), true), emailDetails = emailCard }); // Set email as read. sc.Context.TurnState.TryGetValue(StateProperties.APIToken, out var token); var service = ServiceManager.InitMailService(token as string, state.GetUserTimeZone(), state.MailSourceType); await service.MarkMessageAsReadAsync(message.Id); await sc.Context.SendActivityAsync(replyMessage, cancellationToken); } return(await sc.NextAsync(cancellationToken : cancellationToken)); } catch (SkillException ex) { await HandleDialogExceptionsAsync(sc, ex, cancellationToken); return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs)); } catch (Exception ex) { await HandleDialogExceptionsAsync(sc, ex, cancellationToken); return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs)); } }