public async Task <DialogTurnResult> ReadEvent(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var state = await Accessor.GetAsync(sc.Context); var luisResult = state.LuisResult; var topIntent = luisResult?.TopIntent().intent; if (topIntent == null) { return(await sc.EndDialogAsync(true)); } var eventItem = state.ReadOutEvents.FirstOrDefault(); sc.Context.Activity.Properties.TryGetValue("OriginText", out var content); var userInput = content != null?content.ToString() : sc.Context.Activity.Text; var generalLuisResult = state.GeneralLuisResult; var generalTopIntent = generalLuisResult?.TopIntent().intent; var promptRecognizerResult = ConfirmRecognizerHelper.ConfirmYesOrNo(userInput, sc.Context.Activity.Locale); if (promptRecognizerResult.Succeeded && promptRecognizerResult.Value == false) { return(await sc.EndDialogAsync(true)); } else if ((promptRecognizerResult.Succeeded && promptRecognizerResult.Value == true) || (topIntent == Luis.Calendar.Intent.ReadAloud && eventItem == null)) { if (state.SummaryEvents.Count == 1) { eventItem = state.SummaryEvents[0]; } else { return(await sc.PromptAsync(Actions.Prompt, new PromptOptions { Prompt = sc.Context.Activity.CreateReply(SummaryResponses.ReadOutPrompt), })); } } if (eventItem != null && topIntent != Luis.Calendar.Intent.ChangeCalendarEntry && topIntent != Luis.Calendar.Intent.DeleteCalendarEntry) { var speakString = SpeakHelper.ToSpeechMeetingDetail(eventItem.Title, TimeConverter.ConvertUtcToUserTime(eventItem.StartTime, state.GetUserTimeZone()), eventItem.IsAllDay == true); var replyMessage = sc.Context.Activity.CreateAdaptiveCardReply(SummaryResponses.ReadOutMessage, eventItem.OnlineMeetingUrl == null ? "Dialogs/Shared/Resources/Cards/CalendarCardNoJoinButton.json" : "Dialogs/Shared/Resources/Cards/CalendarCard.json", eventItem.ToAdaptiveCardData(state.GetUserTimeZone()), null, new StringDictionary() { { "MeetingDetails", speakString } }); await sc.Context.SendActivityAsync(replyMessage); return(await sc.PromptAsync(Actions.Prompt, new PromptOptions { Prompt = sc.Context.Activity.CreateReply(SummaryResponses.ReadOutMorePrompt) })); } else { 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)); } }
public async Task <DialogTurnResult> ReadEvent(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var state = await Accessor.GetAsync(sc.Context); var luisResult = state.LuisResult; var topIntent = luisResult?.TopIntent().intent; var generalLuisResult = state.GeneralLuisResult; var generalTopIntent = generalLuisResult?.TopIntent().intent; if (topIntent == null) { state.Clear(); return(await sc.CancelAllDialogsAsync()); } if (generalTopIntent == General.Intent.Next || generalTopIntent == General.Intent.Previous) { return(await sc.ReplaceDialogAsync(Actions.ShowEventsSummary)); } var eventItem = state.ReadOutEvents.FirstOrDefault(); sc.Context.Activity.Properties.TryGetValue("OriginText", out var content); var userInput = content != null?content.ToString() : sc.Context.Activity.Text; var promptRecognizerResult = ConfirmRecognizerHelper.ConfirmYesOrNo(userInput, sc.Context.Activity.Locale); if (promptRecognizerResult.Succeeded && promptRecognizerResult.Value == false) { state.Clear(); return(await sc.CancelAllDialogsAsync()); } else if ((promptRecognizerResult.Succeeded && promptRecognizerResult.Value == true) || state.SummaryEvents.Count == 1) { eventItem = state.SummaryEvents[0]; } else if (topIntent == Luis.Calendar.Intent.ReadAloud && eventItem == null) { if (state.SummaryEvents.Count == 1) { eventItem = state.SummaryEvents[0]; } else { return(await sc.PromptAsync(Actions.Prompt, new PromptOptions { Prompt = sc.Context.Activity.CreateReply(SummaryResponses.ReadOutPrompt), })); } } if (eventItem != null && topIntent != Luis.Calendar.Intent.ChangeCalendarEntry && topIntent != Luis.Calendar.Intent.DeleteCalendarEntry) { var replyMessage = sc.Context.Activity.CreateAdaptiveCardReply( SummaryResponses.ReadOutMessage, eventItem.OnlineMeetingUrl == null ? "Dialogs/Shared/Resources/Cards/CalendarCardNoJoinButton.json" : "Dialogs/Shared/Resources/Cards/CalendarCard.json", eventItem.ToAdaptiveCardData(state.GetUserTimeZone(), showContent: true), null, new StringDictionary() { { "Date", eventItem.StartTime.ToString(CommonStrings.DisplayDateFormat_CurrentYear) }, { "Time", SpeakHelper.ToSpeechMeetingTime(TimeConverter.ConvertUtcToUserTime(eventItem.StartTime, state.GetUserTimeZone()), eventItem.IsAllDay == true) }, { "Participants", DisplayHelper.ToDisplayParticipantsStringSummary(eventItem.Attendees) }, { "Subject", eventItem.Title } }); await sc.Context.SendActivityAsync(replyMessage); if (eventItem.IsOrganizer) { return(await sc.PromptAsync(Actions.Prompt, new PromptOptions { Prompt = sc.Context.Activity.CreateReply(SummaryResponses.AskForOrgnizerAction, ResponseBuilder, new StringDictionary() { { "DateTime", state.StartDateString ?? CalendarCommonStrings.Today } }) })); } else if (eventItem.IsAccepted) { return(await sc.PromptAsync(Actions.Prompt, new PromptOptions { Prompt = sc.Context.Activity.CreateReply(SummaryResponses.AskForAction, ResponseBuilder, new StringDictionary() { { "DateTime", state.StartDateString ?? CalendarCommonStrings.Today } }) })); } else { return(await sc.PromptAsync(Actions.Prompt, new PromptOptions { Prompt = sc.Context.Activity.CreateReply(SummaryResponses.AskForChangeStatus, ResponseBuilder, new StringDictionary() { { "DateTime", state.StartDateString ?? CalendarCommonStrings.Today } }) })); } } else { 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 == EmailLU.Intent.None || topIntent == EmailLU.Intent.SearchMessages || topIntent == EmailLU.Intent.SelectItem || (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)); } }
private async Task <DialogTurnResult> AfterSelectEvent(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var state = await Accessor.GetAsync(sc.Context); var luisResult = state.LuisResult; var topIntent = luisResult?.TopIntent().intent; var generalLuisResult = state.GeneralLuisResult; var generalTopIntent = generalLuisResult?.TopIntent().intent; if (topIntent == null) { state.Clear(); return(await sc.CancelAllDialogsAsync()); } if (generalTopIntent == General.Intent.ShowNext && state.SummaryEvents != null) { if ((state.ShowEventIndex + 1) * state.PageSize < state.SummaryEvents.Count) { state.ShowEventIndex++; } else { await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.CalendarNoMoreEvent)); } return(await sc.ReplaceDialogAsync(Actions.ConnectToMeeting, sc.Options)); } else if (generalTopIntent == General.Intent.ShowPrevious && state.SummaryEvents != null) { if (state.ShowEventIndex > 0) { state.ShowEventIndex--; } else { await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.CalendarNoPreviousEvent)); } return(await sc.ReplaceDialogAsync(Actions.ConnectToMeeting, sc.Options)); } sc.Context.Activity.Properties.TryGetValue("OriginText", out var content); var userInput = content != null?content.ToString() : sc.Context.Activity.Text; var promptRecognizerResult = ConfirmRecognizerHelper.ConfirmYesOrNo(userInput, sc.Context.Activity.Locale); if (promptRecognizerResult.Succeeded && promptRecognizerResult.Value == false) { state.Clear(); return(await sc.CancelAllDialogsAsync()); } else if (promptRecognizerResult.Succeeded && promptRecognizerResult.Value == true) { var currentList = GetCurrentPageMeetings(state.SummaryEvents, state); state.ConfirmedMeeting.Add(currentList.First()); return(await sc.ReplaceDialogAsync(Actions.ConfirmNumber, sc.Options)); } else if (state.SummaryEvents.Count == 1) { state.Clear(); return(await sc.CancelAllDialogsAsync()); } if (state.SummaryEvents.Count > 1) { var filteredMeetingList = new List <EventModel>(); var showMeetingReason = ShowMeetingReason.FirstShowOverview; string filterKeyWord = null; // filter meetings with number if (luisResult.Entities.ordinal != null) { var value = luisResult.Entities.ordinal[0]; var num = int.Parse(value.ToString()); var currentList = GetCurrentPageMeetings(state.SummaryEvents, state); if (num > 0 && num <= currentList.Count) { filteredMeetingList.Add(currentList[num - 1]); } } if (filteredMeetingList.Count <= 0 && luisResult.Entities.number != null && (luisResult.Entities.ordinal == null || luisResult.Entities.ordinal.Length == 0)) { var value = luisResult.Entities.number[0]; var num = int.Parse(value.ToString()); var currentList = GetCurrentPageMeetings(state.SummaryEvents, state); if (num > 0 && num <= currentList.Count) { filteredMeetingList.Add(currentList[num - 1]); } } // filter meetings with start time var timeResult = RecognizeDateTime(userInput, sc.Context.Activity.Locale ?? English, false); if (filteredMeetingList.Count <= 0 && timeResult != null) { foreach (var result in timeResult) { var dateTimeConvertTypeString = result.Timex; var dateTimeConvertType = new TimexProperty(dateTimeConvertTypeString); if (result.Value != null || (dateTimeConvertType.Types.Contains(Constants.TimexTypes.Time) || dateTimeConvertType.Types.Contains(Constants.TimexTypes.DateTime))) { var dateTime = DateTime.Parse(result.Value); if (dateTime != null) { var utcStartTime = TimeZoneInfo.ConvertTimeToUtc(dateTime, state.GetUserTimeZone()); foreach (var meeting in GetCurrentPageMeetings(state.SummaryEvents, state)) { if (meeting.StartTime.TimeOfDay == utcStartTime.TimeOfDay) { showMeetingReason = ShowMeetingReason.ShowFilteredByTimeMeetings; filterKeyWord = string.Format("H:mm", dateTime); filteredMeetingList.Add(meeting); } } } } } } // filter meetings with subject if (filteredMeetingList.Count <= 0) { var subject = userInput; if (luisResult.Entities.Subject != null) { subject = GetSubjectFromEntity(luisResult.Entities); } foreach (var meeting in GetCurrentPageMeetings(state.SummaryEvents, state)) { if (meeting.Title.ToLower().Contains(subject.ToLower())) { showMeetingReason = ShowMeetingReason.ShowFilteredByTitleMeetings; filterKeyWord = subject; filteredMeetingList.Add(meeting); } } } // filter meetings with contact name if (filteredMeetingList.Count <= 0) { var contactNameList = new List <string>() { userInput }; if (luisResult.Entities.personName != null) { contactNameList = GetAttendeesFromEntity(luisResult.Entities, userInput); } foreach (var meeting in GetCurrentPageMeetings(state.SummaryEvents, state)) { var containsAllContacts = true; foreach (var contactName in contactNameList) { if (!meeting.ContainsAttendee(contactName)) { containsAllContacts = false; break; } } if (containsAllContacts) { showMeetingReason = ShowMeetingReason.ShowFilteredByParticipantNameMeetings; filterKeyWord = string.Join(", ", contactNameList); filteredMeetingList.Add(meeting); } } } if (filteredMeetingList.Count == 1) { state.ReadOutEvents = filteredMeetingList; return(await sc.BeginDialogAsync(Actions.ConfirmNumber, sc.Options)); } else if (filteredMeetingList.Count > 1) { state.SummaryEvents = filteredMeetingList; state.FilterMeetingKeyWord = filterKeyWord; return(await sc.ReplaceDialogAsync(Actions.ConnectToMeeting, new ShowMeetingsDialogOptions(showMeetingReason, sc.Options))); } } if (state.ConfirmedMeeting != null && state.ConfirmedMeeting.Count > 0) { return(await sc.ReplaceDialogAsync(Actions.ConfirmNumber, sc.Options)); } else { state.Clear(); return(await sc.CancelAllDialogsAsync()); } } catch (Exception ex) { await HandleDialogExceptions(sc, ex); return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs)); } }
public async Task <DialogTurnResult> AfterReadOutEvent(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var state = await Accessor.GetAsync(sc.Context); var luisResult = state.LuisResult; var topIntent = luisResult?.TopIntent().intent; if (state.ReadOutEvents.Count > 0) { sc.Context.Activity.Properties.TryGetValue("OriginText", out var content); var userInput = content != null?content.ToString() : sc.Context.Activity.Text; var promptRecognizerResult = ConfirmRecognizerHelper.ConfirmYesOrNo(userInput, sc.Context.Activity.Locale); if (promptRecognizerResult.Succeeded && promptRecognizerResult.Value == false) { state.Clear(); return(await sc.CancelAllDialogsAsync()); } else if (promptRecognizerResult.Succeeded && promptRecognizerResult.Value == true) { state.ReadOutEvents = null; state.SummaryEvents = null; return(await sc.ReplaceDialogAsync(Actions.ShowEventsSummary, new ShowMeetingsDialogOptions(ShowMeetingReason.ShowOverviewAgain, sc.Options))); } var readoutEvent = state.ReadOutEvents[0]; state.ReadOutEvents = null; state.SummaryEvents = null; if (readoutEvent.IsOrganizer) { if (topIntent == CalendarLuis.Intent.ChangeCalendarEntry) { state.Events.Add(readoutEvent); state.IsActionFromSummary = true; return(await sc.BeginDialogAsync(nameof(UpdateEventDialog), sc.Options)); } if (topIntent == CalendarLuis.Intent.DeleteCalendarEntry) { state.Events.Add(readoutEvent); state.IsActionFromSummary = true; return(await sc.BeginDialogAsync(nameof(ChangeEventStatusDialog), sc.Options)); } state.Clear(); return(await sc.CancelAllDialogsAsync()); } else if (readoutEvent.IsAccepted) { if (topIntent == CalendarLuis.Intent.DeleteCalendarEntry) { state.Events.Add(readoutEvent); state.IsActionFromSummary = true; return(await sc.BeginDialogAsync(nameof(ChangeEventStatusDialog), sc.Options)); } state.Clear(); return(await sc.CancelAllDialogsAsync()); } else { if (topIntent == CalendarLuis.Intent.DeleteCalendarEntry || topIntent == CalendarLuis.Intent.AcceptEventEntry) { state.Events.Add(readoutEvent); state.IsActionFromSummary = true; return(await sc.BeginDialogAsync(nameof(ChangeEventStatusDialog), sc.Options)); } state.Clear(); return(await sc.CancelAllDialogsAsync()); } } state.Clear(); return(await sc.CancelAllDialogsAsync()); } 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(); 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 ((promptRecognizerResult.Succeeded && promptRecognizerResult.Value == true) || (topIntent == Email.Intent.ReadAloud && !IsReadMoreIntent(generalTopIntent, sc.Context.Activity.Text))) { if (message == null && state.MessageList.Count > 1) { return(await sc.PromptAsync(Actions.Prompt, new PromptOptions { Prompt = sc.Context.Activity.CreateReply(ShowEmailResponses.ReadOutPrompt), })); } } 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(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 (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)); } }
public async Task <DialogTurnResult> ConfirmBeforeCreate(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { bool?isLocationSkipByDefault = false; isLocationSkipByDefault = Settings.DefaultValue?.CreateMeeting?.First(item => item.Name == "EventLocation")?.IsSkipByDefault; var state = await Accessor.GetAsync(sc.Context, cancellationToken : cancellationToken); if (state.Location == null && sc.Result != null && (!(state.CreateHasDetail && isLocationSkipByDefault.GetValueOrDefault()) || state.RecreateState == RecreateEventState.Location)) { sc.Context.Activity.Properties.TryGetValue("OriginText", out var content); var luisResult = state.LuisResult; var userInput = content != null?content.ToString() : sc.Context.Activity.Text; var topIntent = luisResult?.TopIntent().intent.ToString(); var promptRecognizerResult = ConfirmRecognizerHelper.ConfirmYesOrNo(userInput, sc.Context.Activity.Locale); // Enable the user to skip providing the location if they say something matching the Cancel intent, say something matching the ConfirmNo recognizer or something matching the NoLocation intent if (CreateEventWhiteList.IsSkip(userInput)) { state.Location = string.Empty; } else { state.Location = userInput; } } else if (state.CreateHasDetail && isLocationSkipByDefault.GetValueOrDefault()) { state.Location = CalendarCommonStrings.DefaultLocation; } var source = state.EventSource; var newEvent = new EventModel(source) { Title = state.Title, Content = state.Content, Attendees = state.Attendees, StartTime = state.StartDateTime.Value, EndTime = state.EndDateTime.Value, TimeZone = TimeZoneInfo.Utc, Location = state.Location, ContentPreview = state.Content }; var attendeeConfirmTextString = string.Empty; if (state.Attendees.Count > 0) { var attendeeConfirmResponse = ResponseManager.GetResponse(CreateEventResponses.ConfirmCreateAttendees, new StringDictionary() { { "Attendees", DisplayHelper.ToDisplayParticipantsStringSummary(state.Attendees, 5) } }); attendeeConfirmTextString = attendeeConfirmResponse.Text; } var subjectConfirmString = string.Empty; if (!string.IsNullOrEmpty(state.Title)) { var subjectConfirmResponse = ResponseManager.GetResponse(CreateEventResponses.ConfirmCreateSubject, new StringDictionary() { { "Subject", string.IsNullOrEmpty(state.Title) ? CalendarCommonStrings.Empty : state.Title } }); subjectConfirmString = subjectConfirmResponse.Text; } var locationConfirmString = string.Empty; if (!string.IsNullOrEmpty(state.Location)) { var subjectConfirmResponse = ResponseManager.GetResponse(CreateEventResponses.ConfirmCreateLocation, new StringDictionary() { { "Location", string.IsNullOrEmpty(state.Location) ? CalendarCommonStrings.Empty : state.Location }, }); locationConfirmString = subjectConfirmResponse.Text; } var contentConfirmString = string.Empty; if (!string.IsNullOrEmpty(state.Content)) { var contentConfirmResponse = ResponseManager.GetResponse(CreateEventResponses.ConfirmCreateContent, new StringDictionary() { { "Content", string.IsNullOrEmpty(state.Content) ? CalendarCommonStrings.Empty : state.Content }, }); contentConfirmString = contentConfirmResponse.Text; } var startDateTimeInUserTimeZone = TimeConverter.ConvertUtcToUserTime(state.StartDateTime.Value, state.GetUserTimeZone()); var endDateTimeInUserTimeZone = TimeConverter.ConvertUtcToUserTime(state.EndDateTime.Value, state.GetUserTimeZone()); var tokens = new StringDictionary { { "AttendeesConfirm", attendeeConfirmTextString }, { "Date", startDateTimeInUserTimeZone.ToSpeechDateString(false) }, { "Time", startDateTimeInUserTimeZone.ToSpeechTimeString(false) }, { "EndTime", endDateTimeInUserTimeZone.ToSpeechTimeString(false) }, { "SubjectConfirm", subjectConfirmString }, { "LocationConfirm", locationConfirmString }, { "ContentConfirm", contentConfirmString }, }; var prompt = await GetDetailMeetingResponseAsync(sc, newEvent, CreateEventResponses.ConfirmCreate, tokens); await sc.Context.SendActivityAsync(prompt); if (state.Attendees.Count > 5) { return(await sc.BeginDialogAsync(Actions.ShowRestParticipants)); } else { return(await sc.NextAsync()); } } catch (Exception ex) { await HandleDialogExceptions(sc, ex); return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs)); } }
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 = $"To: {message?.ToRecipients.FirstOrDefault()?.EmailAddress.Name}"; if (message?.ToRecipients.Count() > 1) { nameListString += $" + {message.ToRecipients.Count() - 1} more"; } var emailCard = new EmailCardData { Subject = message?.Subject, Sender = message?.Sender.EmailAddress.Name, NameList = nameListString, EmailContent = message?.BodyPreview, EmailLink = message?.WebLink, ReceivedDateTime = message?.ReceivedDateTime == null ? "Not available" : message.ReceivedDateTime.Value.UtcDateTime.ToRelativeString(state.GetUserTimeZone()), Speak = message?.Subject + " From " + message?.Sender.EmailAddress.Name + " " + message?.BodyPreview, }; // Todo: workaround here to read out email details. Ignore body for now as we need a summary and filter. var emailDetails = message?.Subject + " From " + message?.Sender.EmailAddress.Name; 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); } }
private async Task <DialogTurnResult> HandleNextAction(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var state = await Accessor.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; generalTopIntent = MergeShowIntent(generalTopIntent, topIntent, luisResult); if (topIntent == null) { state.Clear(); return(await sc.CancelAllDialogsAsync()); } var promptRecognizerResult = ConfirmRecognizerHelper.ConfirmYesOrNo(userInput, sc.Context.Activity.Locale); if (promptRecognizerResult.Succeeded && promptRecognizerResult.Value == true) { // answer yes state.ShowMeetingInfor.FocusedEvents.Add(state.ShowMeetingInfor.ShowingMeetings.First()); return(await sc.BeginDialogAsync(Actions.Read)); } else if (promptRecognizerResult.Succeeded && promptRecognizerResult.Value == false) { // answer no state.Clear(); return(await sc.EndDialogAsync()); } if ((generalTopIntent == General.Intent.ShowNext || topIntent == CalendarLuis.Intent.ShowNextCalendar) && state.ShowMeetingInfor.ShowingMeetings != null) { if ((state.ShowMeetingInfor.ShowEventIndex + 1) * state.PageSize < state.ShowMeetingInfor.ShowingMeetings.Count) { state.ShowMeetingInfor.ShowEventIndex++; } else { await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.CalendarNoMoreEvent)); } var options = sc.Options as ShowMeetingsDialogOptions; options.Reason = ShowMeetingReason.ShowOverviewAfterPageTurning; return(await sc.ReplaceDialogAsync(Actions.ShowEvents, options)); } else if ((generalTopIntent == General.Intent.ShowPrevious || topIntent == CalendarLuis.Intent.ShowPreviousCalendar) && state.ShowMeetingInfor.ShowingMeetings != null) { if (state.ShowMeetingInfor.ShowEventIndex > 0) { state.ShowMeetingInfor.ShowEventIndex--; } else { await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.CalendarNoPreviousEvent)); } var options = sc.Options as ShowMeetingsDialogOptions; options.Reason = ShowMeetingReason.ShowOverviewAfterPageTurning; return(await sc.ReplaceDialogAsync(Actions.ShowEvents, options)); } else { if (state.ShowMeetingInfor.ShowingMeetings.Count == 1) { state.ShowMeetingInfor.FocusedEvents.Add(state.ShowMeetingInfor.ShowingMeetings[0]); } else { var filteredMeetingList = GetFilteredEvents(state, userInput, sc.Context.Activity.Locale ?? English, out var showingCardTitle); if (filteredMeetingList.Count == 1) { state.ShowMeetingInfor.FocusedEvents = filteredMeetingList; } else if (filteredMeetingList.Count > 1) { state.ShowMeetingInfor.Clear(); state.ShowMeetingInfor.ShowingCardTitle = showingCardTitle; state.ShowMeetingInfor.ShowingMeetings = filteredMeetingList; return(await sc.ReplaceDialogAsync(Actions.ShowFilteredEvents, sc.Options)); } } if (state.ShowMeetingInfor.FocusedEvents.Count == 1) { if (topIntent == CalendarLuis.Intent.DeleteCalendarEntry || topIntent == CalendarLuis.Intent.AcceptEventEntry) { return(await sc.BeginDialogAsync(Actions.ChangeEventStatus)); } else if (topIntent == CalendarLuis.Intent.ChangeCalendarEntry) { return(await sc.BeginDialogAsync(Actions.UpdateEvent)); } else { return(await sc.BeginDialogAsync(Actions.Read)); } } return(await sc.ReplaceDialogAsync(Actions.RetryUnknown, sc.Options)); } } 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)); } }