public async Task <DialogTurnResult> PromptToDelete(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var state = await EmailStateAccessor.GetAsync(sc.Context); var skillOptions = (EmailSkillDialogOptions)sc.Options; var message = state.Message?.FirstOrDefault(); if (message != null) { var nameListString = DisplayHelper.ToDisplayRecipientsString_Summay(message.ToRecipients); var senderIcon = await GetUserPhotoUrlAsync(sc.Context, message.Sender.EmailAddress); var emailCard = new EmailCardData { Subject = message.Subject, EmailContent = message.BodyPreview, Sender = message.Sender.EmailAddress.Name, 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 ProcessRecipientPhotoUrl(sc.Context, emailCard, message.ToRecipients); var speech = SpeakHelper.ToSpeechEmailSendDetailString(message.Subject, nameListString, message.BodyPreview); var tokens = new StringDictionary { { "EmailDetails", speech }, }; var recipientCard = message.ToRecipients.Count() > 5 ? GetDivergedCardName(sc.Context, "DetailCard_RecipientMoreThanFive") : GetDivergedCardName(sc.Context, "DetailCard_RecipientLessThanFive"); var prompt = ResponseManager.GetCardResponse( DeleteEmailResponses.DeleteConfirm, new Card("EmailDetailCard", emailCard), tokens, "items", new List <Card>().Append(new Card(recipientCard, emailCard))); var retry = ResponseManager.GetResponse(EmailSharedResponses.ConfirmSendFailed); return(await sc.PromptAsync(Actions.TakeFurtherAction, new PromptOptions { Prompt = prompt, RetryPrompt = retry })); } skillOptions.SubFlowMode = true; return(await sc.BeginDialogAsync(Actions.UpdateSelectMessage, skillOptions)); } catch (Exception ex) { await HandleDialogExceptions(sc, ex); return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs)); } }
public async Task <DialogTurnResult> PromptToDeleteAsync(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var state = await EmailStateAccessor.GetAsync(sc.Context, cancellationToken : cancellationToken); var skillOptions = (EmailSkillDialogOptions)sc.Options; var message = state.Message?.FirstOrDefault(); if (message != null) { var nameListString = DisplayHelper.ToDisplayRecipientsString_Summay(message.ToRecipients); var senderIcon = await GetUserPhotoUrlAsync(sc.Context, message.Sender.EmailAddress, cancellationToken); var emailCard = new EmailCardData { Subject = message.Subject, EmailContent = message.BodyPreview, Sender = message.Sender.EmailAddress.Name, 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 speech = SpeakHelper.ToSpeechEmailSendDetailString(message.Subject, nameListString, message.BodyPreview); var prompt = TemplateManager.GenerateActivityForLocale( DeleteEmailResponses.DeleteConfirm, new { emailInfo = speech, emailDetails = emailCard }); var retry = TemplateManager.GenerateActivityForLocale(EmailSharedResponses.ConfirmSendFailed); return(await sc.PromptAsync(Actions.TakeFurtherAction, new PromptOptions { Prompt = prompt as Activity, RetryPrompt = retry as Activity })); } skillOptions.SubFlowMode = true; return(await sc.BeginDialogAsync(Actions.UpdateSelectMessage, skillOptions, cancellationToken)); } catch (Exception ex) { await HandleDialogExceptionsAsync(sc, ex, cancellationToken); 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)); } }
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> 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 == Email.Intent.SelectItem || (topIntent == Email.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()), }; // Todo: workaround here to read out email details. Ignore body for now as we need a summary and filter. var emailDetails = SpeakHelper.ToSpeechEmailDetailString(message, state.GetUserTimeZone()); 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.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)); } }