private async Task <DialogTurnResult> ReadEvent(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { // show a meeting detail card for the focused meeting var state = await Accessor.GetAsync(sc.Context); var eventItem = state.ShowMeetingInfor.FocusedEvents.FirstOrDefault(); var tokens = 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, 1) }, { "Subject", eventItem.Title } }; var replyMessage = await GetDetailMeetingResponseAsync(sc, eventItem, SummaryResponses.ReadOutMessage, tokens); 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> ShowEventsOverview(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var state = await Accessor.GetAsync(sc.Context); var options = sc.Options as ShowMeetingsDialogOptions; // show first meeting detail in response var responseParams = new StringDictionary() { { "Condition", GetSearchConditionString(state) }, { "Count", state.ShowMeetingInfor.ShowingMeetings.Count.ToString() }, { "EventName1", state.ShowMeetingInfor.ShowingMeetings[0].Title }, { "DateTime", state.MeetingInfor.StartDateString ?? CalendarCommonStrings.TodayLower }, { "EventTime1", SpeakHelper.ToSpeechMeetingTime(TimeConverter.ConvertUtcToUserTime(state.ShowMeetingInfor.ShowingMeetings[0].StartTime, state.GetUserTimeZone()), state.ShowMeetingInfor.ShowingMeetings[0].IsAllDay == true) }, { "Participants1", DisplayHelper.ToDisplayParticipantsStringSummary(state.ShowMeetingInfor.ShowingMeetings[0].Attendees, 1) } }; string responseTemplateId; if (options.Reason == ShowMeetingReason.ShowOverviewAfterPageTurning) { responseTemplateId = SummaryResponses.ShowMeetingSummaryNotFirstPageMessage; } else { // if there are multiple meeting searched, show first and last meeting details in responses responseParams.Add("EventName2", state.ShowMeetingInfor.ShowingMeetings[state.ShowMeetingInfor.ShowingMeetings.Count - 1].Title); responseParams.Add("EventTime2", SpeakHelper.ToSpeechMeetingTime(TimeConverter.ConvertUtcToUserTime(state.ShowMeetingInfor.ShowingMeetings[state.ShowMeetingInfor.ShowingMeetings.Count - 1].StartTime, state.GetUserTimeZone()), state.ShowMeetingInfor.ShowingMeetings[state.ShowMeetingInfor.ShowingMeetings.Count - 1].IsAllDay == true)); responseParams.Add("Participants2", DisplayHelper.ToDisplayParticipantsStringSummary(state.ShowMeetingInfor.ShowingMeetings[state.ShowMeetingInfor.ShowingMeetings.Count - 1].Attendees, 1)); if (state.ShowMeetingInfor.Condition == CalendarSkillState.ShowMeetingInformation.SearchMeetingCondition.Time) { responseTemplateId = SummaryResponses.ShowMultipleMeetingSummaryMessage; } else { responseTemplateId = SummaryResponses.ShowMeetingSummaryShortMessage; } } await sc.Context.SendActivityAsync(await GetOverviewMeetingListResponseAsync(sc.Context, state, responseTemplateId, responseParams)); 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)); } }
// Get the rooms with given conditions. private async Task <DialogTurnResult> GetMeetingRoomsAsync(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var state = await Accessor.GetAsync(sc.Context, cancellationToken : cancellationToken); var meetingRooms = await searchService.GetMeetingRoomAsync(state.MeetingInfo.MeetingRoomName, state.MeetingInfo.Building, state.MeetingInfo.FloorNumber.GetValueOrDefault()); if (meetingRooms.Count == 0) { if (!string.IsNullOrEmpty(state.MeetingInfo.MeetingRoomName)) { var tokens = new { MeetingRoom = state.MeetingInfo.MeetingRoomName, state.MeetingInfo.Building, state.MeetingInfo.FloorNumber, }; var activity = TemplateManager.GenerateActivityForLocale(FindMeetingRoomResponses.MeetingRoomNotFoundByName, tokens); await sc.Context.SendActivityAsync(activity, cancellationToken); state.MeetingInfo.MeetingRoomName = null; } else { var tokens = new { state.MeetingInfo.Building, state.MeetingInfo.FloorNumber, DateTime = SpeakHelper.ToSpeechMeetingTime(TimeConverter.ConvertUtcToUserTime((DateTime)state.MeetingInfo.StartDateTime, state.GetUserTimeZone()), state.MeetingInfo.AllDay == true, DateTime.UtcNow > state.MeetingInfo.StartDateTime), }; var activity = TemplateManager.GenerateActivityForLocale(FindMeetingRoomResponses.MeetingRoomNotFoundByBuildingAndFloor, tokens); await sc.Context.SendActivityAsync(activity, cancellationToken); if (state.MeetingInfo.FloorNumber.GetValueOrDefault() == 0) { state.MeetingInfo.Building = null; } state.MeetingInfo.FloorNumber = null; } return(await sc.ReplaceDialogAsync(Actions.RecreateMeetingRoom, cancellationToken : cancellationToken)); } state.MeetingInfo.UnconfirmedMeetingRoom = meetingRooms; return(await sc.NextAsync(cancellationToken : cancellationToken)); } catch (Exception ex) { await HandleDialogExceptionsAsync(sc, ex, cancellationToken); return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs)); } }
// If the room has been rejected, it needs to be filterd. private async Task <DialogTurnResult> CheckRoomRejectedAsync(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var state = await Accessor.GetAsync(sc.Context, cancellationToken : cancellationToken); if (string.IsNullOrEmpty(state.MeetingInfo.MeetingRoomName)) { state.MeetingInfo.UnconfirmedMeetingRoom = state.MeetingInfo.UnconfirmedMeetingRoom.FindAll(x => !state.MeetingInfo.IgnoredMeetingRoom.Contains(x.DisplayName + state.MeetingInfo.StartDateTime.ToString())); } if (state.MeetingInfo.UnconfirmedMeetingRoom.Count == 0) { var tokens = new { state.MeetingInfo.Building, state.MeetingInfo.FloorNumber, DateTime = SpeakHelper.ToSpeechMeetingTime(TimeConverter.ConvertUtcToUserTime((DateTime)state.MeetingInfo.StartDateTime, state.GetUserTimeZone()), state.MeetingInfo.AllDay == true, DateTime.UtcNow > state.MeetingInfo.StartDateTime), }; var activity = TemplateManager.GenerateActivityForLocale(FindMeetingRoomResponses.CannotFindOtherMeetingRoom, tokens); await sc.Context.SendActivityAsync(activity, cancellationToken); return(await sc.ReplaceDialogAsync(Actions.RecreateMeetingRoom, cancellationToken : cancellationToken)); } else { var tokens = new { MeetingRoom = state.MeetingInfo.UnconfirmedMeetingRoom.First().DisplayName, DateTime = SpeakHelper.ToSpeechMeetingTime(TimeConverter.ConvertUtcToUserTime((DateTime)state.MeetingInfo.StartDateTime, state.GetUserTimeZone()), state.MeetingInfo.AllDay == true, DateTime.UtcNow > state.MeetingInfo.StartDateTime) }; // find an available room, continue var activity = TemplateManager.GenerateActivityForLocale(FindMeetingRoomResponses.ConfirmMeetingRoomPrompt, tokens); return(await sc.PromptAsync(Actions.TakeFurtherAction, new PromptOptions { Prompt = activity }, cancellationToken)); } } catch (Exception ex) { await HandleDialogExceptionsAsync(sc, ex, cancellationToken); return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs)); } }
private async Task <DialogTurnResult> ShowEventsSummary(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var tokenResponse = sc.Result as TokenResponse; var state = await Accessor.GetAsync(sc.Context); var options = sc.Options as ShowMeetingsDialogOptions; if (state.SummaryEvents == null) { // this will lead to error when test if (string.IsNullOrEmpty(state.APIToken)) { state.Clear(); return(await sc.EndDialogAsync(true)); } var calendarService = ServiceManager.InitCalendarService(state.APIToken, state.EventSource); state.SummaryEvents = await GetMeetingToJoin(sc); } if (state.SummaryEvents.Count == 0) { await sc.Context.SendActivityAsync(ResponseManager.GetResponse(JoinEventResponses.MeetingNotFound)); state.Clear(); return(await sc.EndDialogAsync(true)); } else if (state.SummaryEvents.Count == 1) { state.ConfirmedMeeting.Add(state.SummaryEvents.First()); return(await sc.ReplaceDialogAsync(Actions.ConfirmNumber, sc.Options)); } // Multiple events var firstEvent = GetCurrentPageMeetings(state.SummaryEvents, state).First(); var responseParams = new StringDictionary() { { "EventName1", firstEvent.Title }, { "EventTime1", SpeakHelper.ToSpeechMeetingTime(TimeConverter.ConvertUtcToUserTime(firstEvent.StartTime, state.GetUserTimeZone()), firstEvent.IsAllDay == true) }, { "Participants1", DisplayHelper.ToDisplayParticipantsStringSummary(firstEvent.Attendees) } }; await sc.Context.SendActivityAsync(ResponseManager.GetResponse(JoinEventResponses.SelectMeeting, responseParams)); await ShowMeetingList(sc, GetCurrentPageMeetings(state.SummaryEvents, state), false); return(await sc.PromptAsync(Actions.Prompt, new PromptOptions())); } 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 eventItem = state.ReadOutEvents.FirstOrDefault(); if (eventItem != null && topIntent != Luis.CalendarLuis.Intent.ChangeCalendarEntry && topIntent != Luis.CalendarLuis.Intent.DeleteCalendarEntry) { var tokens = 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, 1) }, { "Subject", eventItem.Title } }; var replyMessage = await GetDetailMeetingResponseAsync(sc, eventItem, SummaryResponses.ReadOutMessage, tokens); await sc.Context.SendActivityAsync(replyMessage); if (eventItem.IsOrganizer) { return(await sc.PromptAsync(Actions.Prompt, new PromptOptions { Prompt = ResponseManager.GetResponse(SummaryResponses.AskForOrgnizerAction, new StringDictionary() { { "DateTime", state.StartDateString ?? CalendarCommonStrings.TodayLower } }) })); } else if (eventItem.IsAccepted) { return(await sc.PromptAsync(Actions.Prompt, new PromptOptions { Prompt = ResponseManager.GetResponse(SummaryResponses.AskForAction, new StringDictionary() { { "DateTime", state.StartDateString ?? CalendarCommonStrings.TodayLower } }) })); } else { return(await sc.PromptAsync(Actions.Prompt, new PromptOptions { Prompt = ResponseManager.GetResponse(SummaryResponses.AskForChangeStatus, new StringDictionary() { { "DateTime", state.StartDateString ?? CalendarCommonStrings.TodayLower } }) })); } } 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> ShowEventsList(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var tokenResponse = sc.Result as TokenResponse; var state = await Accessor.GetAsync(sc.Context); var options = sc.Options as ShowMeetingsDialogOptions; if (state.SummaryEvents == null) { // this will lead to error when test if (string.IsNullOrEmpty(state.APIToken)) { state.Clear(); return(await sc.EndDialogAsync(true)); } var calendarService = ServiceManager.InitCalendarService(state.APIToken, state.EventSource); var searchDate = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, state.GetUserTimeZone()); if (state.StartDate.Any()) { searchDate = state.StartDate.Last(); } var results = await GetEventsByTime(new List <DateTime>() { searchDate }, state.StartTime, state.EndDate, state.EndTime, state.GetUserTimeZone(), calendarService); var searchedEvents = new List <EventModel>(); var searchTodayMeeting = SearchesTodayMeeting(state); foreach (var item in results) { if (!searchTodayMeeting || item.StartTime >= DateTime.UtcNow) { searchedEvents.Add(item); } } if (searchedEvents.Count == 0) { await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ShowNoMeetingMessage)); state.Clear(); return(await sc.EndDialogAsync(true)); } else { if (options != null && options.Reason == ShowMeetingReason.ShowOverviewAgain) { var responseParams = new StringDictionary() { { "Count", searchedEvents.Count.ToString() }, { "DateTime", state.StartDateString ?? CalendarCommonStrings.TodayLower } }; if (searchedEvents.Count == 1) { await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ShowOneMeetingSummaryAgainMessage, responseParams)); } else { await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ShowMeetingSummaryAgainMessage, responseParams)); } } else { var responseParams = new StringDictionary() { { "Count", searchedEvents.Count.ToString() }, { "EventName1", searchedEvents[0].Title }, { "DateTime", state.StartDateString ?? CalendarCommonStrings.TodayLower }, { "EventTime1", SpeakHelper.ToSpeechMeetingTime(TimeConverter.ConvertUtcToUserTime(searchedEvents[0].StartTime, state.GetUserTimeZone()), searchedEvents[0].IsAllDay == true) }, { "Participants1", DisplayHelper.ToDisplayParticipantsStringSummary(searchedEvents[0].Attendees, 1) } }; if (searchedEvents.Count == 1) { await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ShowOneMeetingSummaryMessage, responseParams)); } else { responseParams.Add("EventName2", searchedEvents[searchedEvents.Count - 1].Title); responseParams.Add("EventTime2", SpeakHelper.ToSpeechMeetingTime(TimeConverter.ConvertUtcToUserTime(searchedEvents[searchedEvents.Count - 1].StartTime, state.GetUserTimeZone()), searchedEvents[searchedEvents.Count - 1].IsAllDay == true)); responseParams.Add("Participants2", DisplayHelper.ToDisplayParticipantsStringSummary(searchedEvents[searchedEvents.Count - 1].Attendees, 1)); await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ShowMultipleMeetingSummaryMessage, responseParams)); } } } // add conflict flag for (var i = 0; i < searchedEvents.Count - 1; i++) { for (var j = i + 1; j < searchedEvents.Count; j++) { if (searchedEvents[i].StartTime <= searchedEvents[j].StartTime && searchedEvents[i].EndTime > searchedEvents[j].StartTime) { searchedEvents[i].IsConflict = true; searchedEvents[j].IsConflict = true; } else { break; } } } // count the conflict meetings var totalConflictCount = 0; foreach (var eventItem in searchedEvents) { if (eventItem.IsConflict) { totalConflictCount++; } } state.TotalConflictCount = totalConflictCount; await sc.Context.SendActivityAsync(await GetOverviewMeetingListResponseAsync( sc, GetCurrentPageMeetings(searchedEvents, state, out var firstIndex, out var lastIndex), firstIndex, lastIndex, searchedEvents.Count, totalConflictCount, null, null)); state.SummaryEvents = searchedEvents; if (state.SummaryEvents.Count == 1) { return(await sc.PromptAsync(Actions.Prompt, new PromptOptions())); } } else { var currentPageMeetings = GetCurrentPageMeetings(state.SummaryEvents, state); if (options != null && ( options.Reason == ShowMeetingReason.ShowFilteredByTitleMeetings || options.Reason == ShowMeetingReason.ShowFilteredByTimeMeetings || options.Reason == ShowMeetingReason.ShowFilteredByParticipantNameMeetings)) { string meetingListTitle = null; if (options.Reason == ShowMeetingReason.ShowFilteredByTitleMeetings) { meetingListTitle = string.Format(CalendarCommonStrings.MeetingsAbout, state.FilterMeetingKeyWord); } else if (options.Reason == ShowMeetingReason.ShowFilteredByTimeMeetings) { meetingListTitle = string.Format(CalendarCommonStrings.MeetingsAt, state.FilterMeetingKeyWord); } else if (options.Reason == ShowMeetingReason.ShowFilteredByParticipantNameMeetings) { meetingListTitle = string.Format(CalendarCommonStrings.MeetingsWith, state.FilterMeetingKeyWord); } var reply = await GetGeneralMeetingListResponseAsync( sc, meetingListTitle, state.SummaryEvents, SummaryResponses.ShowMultipleFilteredMeetings, new StringDictionary() { { "Count", state.SummaryEvents.Count.ToString() } }); await sc.Context.SendActivityAsync(reply); } else { var responseParams = new StringDictionary() { { "Count", state.SummaryEvents.Count.ToString() }, { "EventName1", currentPageMeetings[0].Title }, { "DateTime", state.StartDateString ?? CalendarCommonStrings.TodayLower }, { "EventTime1", SpeakHelper.ToSpeechMeetingTime(TimeConverter.ConvertUtcToUserTime(currentPageMeetings[0].StartTime, state.GetUserTimeZone()), currentPageMeetings[0].IsAllDay == true) }, { "Participants1", DisplayHelper.ToDisplayParticipantsStringSummary(currentPageMeetings[0].Attendees, 1) } }; var reply = await GetOverviewMeetingListResponseAsync( sc, GetCurrentPageMeetings(state.SummaryEvents, state, out var firstIndex, out var lastIndex), firstIndex, lastIndex, state.SummaryEvents.Count, state.TotalConflictCount, SummaryResponses.ShowMeetingSummaryNotFirstPageMessage, responseParams); await sc.Context.SendActivityAsync(reply); } } return(await sc.PromptAsync(Actions.Prompt, new PromptOptions { Prompt = ResponseManager.GetResponse(SummaryResponses.ReadOutMorePrompt) })); } 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> ShowEventsSummary(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var tokenResponse = sc.Result as TokenResponse; var state = await Accessor.GetAsync(sc.Context); var options = sc.Options as ShowMeetingsDialogOptions; if (state.SummaryEvents == null) { // this will lead to error when test if (string.IsNullOrEmpty(state.APIToken)) { state.Clear(); return(await sc.EndDialogAsync(true)); } var calendarService = ServiceManager.InitCalendarService(state.APIToken, state.EventSource); var searchDate = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, state.GetUserTimeZone()); if (state.StartDate.Any()) { searchDate = state.StartDate.Last(); } var results = await GetEventsByTime(new List <DateTime>() { searchDate }, state.StartTime, state.EndDate, state.EndTime, state.GetUserTimeZone(), calendarService); var searchedEvents = new List <EventModel>(); bool searchTodayMeeting = SearchesTodayMeeting(state); foreach (var item in results) { if (!searchTodayMeeting || item.StartTime >= DateTime.UtcNow) { searchedEvents.Add(item); } } if (searchedEvents.Count == 0) { await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ShowNoMeetingMessage)); state.Clear(); return(await sc.EndDialogAsync(true)); } else { if (options != null && options.Reason == ShowMeetingReason.ShowOverviewAgain) { var responseParams = new StringDictionary() { { "Count", searchedEvents.Count.ToString() }, { "DateTime", state.StartDateString ?? CalendarCommonStrings.Today } }; if (searchedEvents.Count == 1) { await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ShowOneMeetingSummaryAgainMessage, responseParams)); } else { await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ShowMeetingSummaryAgainMessage, responseParams)); } } else { var responseParams = new StringDictionary() { { "Count", searchedEvents.Count.ToString() }, { "EventName1", searchedEvents[0].Title }, { "DateTime", state.StartDateString ?? CalendarCommonStrings.Today }, { "EventTime1", SpeakHelper.ToSpeechMeetingTime(TimeConverter.ConvertUtcToUserTime(searchedEvents[0].StartTime, state.GetUserTimeZone()), searchedEvents[0].IsAllDay == true) }, { "Participants1", DisplayHelper.ToDisplayParticipantsStringSummary(searchedEvents[0].Attendees) } }; if (searchedEvents.Count == 1) { await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ShowOneMeetingSummaryMessage, responseParams)); } else { responseParams.Add("EventName2", searchedEvents[searchedEvents.Count - 1].Title); responseParams.Add("EventTime2", SpeakHelper.ToSpeechMeetingTime(TimeConverter.ConvertUtcToUserTime(searchedEvents[searchedEvents.Count - 1].StartTime, state.GetUserTimeZone()), searchedEvents[searchedEvents.Count - 1].IsAllDay == true)); responseParams.Add("Participants2", DisplayHelper.ToDisplayParticipantsStringSummary(searchedEvents[searchedEvents.Count - 1].Attendees)); await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ShowMultipleMeetingSummaryMessage, responseParams)); } } } await ShowMeetingList(sc, GetCurrentPageMeetings(searchedEvents, state), !searchTodayMeeting); state.SummaryEvents = searchedEvents; if (state.SummaryEvents.Count == 1) { return(await sc.PromptAsync(Actions.Prompt, new PromptOptions())); } } else { var currentPageMeetings = GetCurrentPageMeetings(state.SummaryEvents, state); if (options != null && options.Reason == ShowMeetingReason.ShowFilteredMeetings) { await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ShowMultipleFilteredMeetings, new StringDictionary() { { "Count", state.SummaryEvents.Count.ToString() } })); } else { var responseParams = new StringDictionary() { { "Count", state.SummaryEvents.Count.ToString() }, { "EventName1", currentPageMeetings[0].Title }, { "DateTime", state.StartDateString ?? CalendarCommonStrings.Today }, { "EventTime1", SpeakHelper.ToSpeechMeetingTime(TimeConverter.ConvertUtcToUserTime(currentPageMeetings[0].StartTime, state.GetUserTimeZone()), currentPageMeetings[0].IsAllDay == true) }, { "Participants1", DisplayHelper.ToDisplayParticipantsStringSummary(currentPageMeetings[0].Attendees) } }; await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ShowMeetingSummaryNotFirstPageMessage, responseParams)); } await ShowMeetingList(sc, GetCurrentPageMeetings(state.SummaryEvents, state), !SearchesTodayMeeting(state)); } return(await sc.PromptAsync(Actions.Prompt, new PromptOptions { Prompt = ResponseManager.GetResponse(SummaryResponses.ReadOutMorePrompt) })); } 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> ShowNextEvent(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var state = await Accessor.GetAsync(sc.Context); AskParameterModel askParameter = new AskParameterModel(state.AskParameterContent); if (string.IsNullOrEmpty(state.APIToken)) { return(await sc.EndDialogAsync(true)); } var calendarService = ServiceManager.InitCalendarService(state.APIToken, state.EventSource); var eventList = await calendarService.GetUpcomingEvents(); var nextEventList = new List <EventModel>(); foreach (var item in eventList) { if (item.IsCancelled != true && (nextEventList.Count == 0 || nextEventList[0].StartTime == item.StartTime)) { nextEventList.Add(item); } } if (nextEventList.Count == 0) { await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(SummaryResponses.ShowNoMeetingMessage)); } else { if (nextEventList.Count == 1) { // if user asked for specific details if (askParameter.NeedDetail) { var responseParams = new StringDictionary() { { "EventName", nextEventList[0].Title }, { "EventStartTime", TimeConverter.ConvertUtcToUserTime(nextEventList[0].StartTime, state.GetUserTimeZone()).ToString("h:mm tt") }, { "EventEndTime", TimeConverter.ConvertUtcToUserTime(nextEventList[0].EndTime, state.GetUserTimeZone()).ToString("h:mm tt") }, { "EventDuration", nextEventList[0].ToDurationString() }, { "EventLocation", nextEventList[0].Location }, }; await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(SummaryResponses.BeforeShowEventDetails, ResponseBuilder, responseParams)); if (askParameter.NeedTime) { await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(SummaryResponses.ReadTime, ResponseBuilder, responseParams)); } if (askParameter.NeedDuration) { await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(SummaryResponses.ReadDuration, ResponseBuilder, responseParams)); } if (askParameter.NeedLocation) { // for some event there might be no localtion. if (string.IsNullOrEmpty(responseParams["EventLocation"])) { await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(SummaryResponses.ReadNoLocation)); } else { await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(SummaryResponses.ReadLocation, ResponseBuilder, responseParams)); } } } var speakParams = new StringDictionary() { { "EventName", nextEventList[0].Title }, { "PeopleCount", nextEventList[0].Attendees.Count.ToString() }, }; speakParams.Add("EventTime", SpeakHelper.ToSpeechMeetingTime(TimeConverter.ConvertUtcToUserTime(nextEventList[0].StartTime, state.GetUserTimeZone()), nextEventList[0].IsAllDay == true)); if (string.IsNullOrEmpty(nextEventList[0].Location)) { await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(SummaryResponses.ShowNextMeetingNoLocationMessage, ResponseBuilder, speakParams)); } else { speakParams.Add("Location", nextEventList[0].Location); await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(SummaryResponses.ShowNextMeetingMessage, ResponseBuilder, speakParams)); } } else { await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(SummaryResponses.ShowMultipleNextMeetingMessage)); } await ShowMeetingList(sc, nextEventList, true); } state.Clear(); return(await sc.EndDialogAsync(true)); } 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> ShowEventsSummary(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var tokenResponse = sc.Result as TokenResponse; var state = await Accessor.GetAsync(sc.Context); if (state.SummaryEvents == null) { // this will lead to error when test if (string.IsNullOrEmpty(state.APIToken)) { state.Clear(); return(await sc.EndDialogAsync(true)); } var calendarService = ServiceManager.InitCalendarService(state.APIToken, state.EventSource); var searchDate = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, state.GetUserTimeZone()); if (state.StartDate.Any()) { searchDate = state.StartDate.Last(); } var results = await GetEventsByTime(new List <DateTime>() { searchDate }, state.StartTime, state.EndDate, state.EndTime, state.GetUserTimeZone(), calendarService); var searchedEvents = new List <EventModel>(); bool searchTodayMeeting = state.StartDate.Any() && !state.StartTime.Any() && !state.EndDate.Any() && !state.EndTime.Any() && EventModel.IsSameDate(searchDate, TimeConverter.ConvertUtcToUserTime(DateTime.UtcNow, state.GetUserTimeZone())); foreach (var item in results) { if (!searchTodayMeeting || item.StartTime >= DateTime.UtcNow) { searchedEvents.Add(item); } } if (searchedEvents.Count == 0) { await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(SummaryResponses.ShowNoMeetingMessage)); state.Clear(); return(await sc.EndDialogAsync(true)); } else { var responseParams = new StringDictionary() { { "Count", searchedEvents.Count.ToString() }, { "EventName1", searchedEvents[0].Title }, { "EventDuration", searchedEvents[0].ToDurationString() }, }; if (searchedEvents.Count == 1) { await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(SummaryResponses.ShowOneMeetingSummaryMessage, ResponseBuilder, responseParams)); } else { responseParams.Add("EventName2", searchedEvents[searchedEvents.Count - 1].Title); responseParams.Add("EventTime", SpeakHelper.ToSpeechMeetingTime(TimeConverter.ConvertUtcToUserTime(searchedEvents[searchedEvents.Count - 1].StartTime, state.GetUserTimeZone()), searchedEvents[searchedEvents.Count - 1].IsAllDay == true)); await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(SummaryResponses.ShowMultipleMeetingSummaryMessage, ResponseBuilder, responseParams)); } } await ShowMeetingList(sc, searchedEvents.GetRange(0, Math.Min(CalendarSkillState.PageSize, searchedEvents.Count)), false); state.Clear(); state.SummaryEvents = searchedEvents; } else { await ShowMeetingList(sc, state.SummaryEvents.GetRange(state.ShowEventIndex *CalendarSkillState.PageSize, Math.Min(CalendarSkillState.PageSize, state.SummaryEvents.Count - (state.ShowEventIndex *CalendarSkillState.PageSize))), false); } 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> UpdateMeetingRoomAsync(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var state = await Accessor.GetAsync(sc.Context, cancellationToken : cancellationToken); var origin = state.ShowMeetingInfo.FocusedEvents[0]; var updateEvent = new EventModel(origin.Source); string meetingRoom = state.MeetingInfo.MeetingRoom?.DisplayName; var attendees = new List <EventModel.Attendee>(); attendees.AddRange(origin.Attendees); if (state.InitialIntent == CalendarLuis.Intent.ChangeCalendarEntry) { attendees.RemoveAll(x => x.AttendeeType == AttendeeType.Resource); } if (state.InitialIntent == CalendarLuis.Intent.DeleteCalendarEntry) { meetingRoom = attendees.Find(x => x.AttendeeType == AttendeeType.Resource)?.DisplayName; if (meetingRoom == null) { throw new Exception("No meeting room found."); } attendees.RemoveAll(x => x.AttendeeType == AttendeeType.Resource); } if (state.InitialIntent == CalendarLuis.Intent.ChangeCalendarEntry || state.InitialIntent == CalendarLuis.Intent.AddCalendarEntryAttribute) { if (state.MeetingInfo.MeetingRoom == null) { throw new NullReferenceException("UpdateMeetingRoom received a null MeetingRoom."); } attendees.Add(new EventModel.Attendee { DisplayName = state.MeetingInfo.MeetingRoom.DisplayName, Address = state.MeetingInfo.MeetingRoom.EmailAddress, AttendeeType = AttendeeType.Resource }); } updateEvent.Id = origin.Id; updateEvent.Attendees = attendees; updateEvent.Location = null; if (!string.IsNullOrEmpty(state.UpdateMeetingInfo.RecurrencePattern) && !string.IsNullOrEmpty(origin.RecurringId)) { updateEvent.Id = origin.RecurringId; } sc.Context.TurnState.TryGetValue(StateProperties.APITokenKey, out var token); var calendarService = ServiceManager.InitCalendarService(token as string, state.EventSource); var newEvent = await calendarService.UpdateEventByIdAsync(updateEvent); var data = new { MeetingRoom = meetingRoom, DateTime = SpeakHelper.ToSpeechMeetingTime(TimeConverter.ConvertUtcToUserTime((DateTime)state.MeetingInfo.StartDateTime, state.GetUserTimeZone()), state.MeetingInfo.AllDay == true, DateTime.UtcNow > state.MeetingInfo.StartDateTime), Subject = newEvent.Title, }; if (state.InitialIntent == CalendarLuis.Intent.AddCalendarEntryAttribute) { var replyMessage = await GetDetailMeetingResponseAsync(sc, newEvent, FindMeetingRoomResponses.MeetingRoomAdded, data, cancellationToken); await sc.Context.SendActivityAsync(replyMessage, cancellationToken); } else if (state.InitialIntent == CalendarLuis.Intent.ChangeCalendarEntry) { var replyMessage = await GetDetailMeetingResponseAsync(sc, newEvent, FindMeetingRoomResponses.MeetingRoomChanged, data, cancellationToken); await sc.Context.SendActivityAsync(replyMessage, cancellationToken); } else { var activity = TemplateManager.GenerateActivityForLocale(FindMeetingRoomResponses.MeetingRoomCanceled, data); await sc.Context.SendActivityAsync(activity, cancellationToken); } state.Clear(); return(await sc.EndDialogAsync(true, cancellationToken)); } catch (Exception ex) { await HandleDialogExceptionsAsync(sc, ex, cancellationToken); 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 eventItem = state.ReadOutEvents.FirstOrDefault(); 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)); } }
private async Task <DialogTurnResult> ReadEvent(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { // show a meeting detail card for the focused meeting var state = await Accessor.GetAsync(sc.Context); var options = sc.Options as ShowMeetingsDialogOptions; // if isShowingMeetingDetail is true, will show the response of showing meeting detail. Otherwise will use show one summary meeting response. var isShowingMeetingDetail = true; if (!state.ShowMeetingInfor.FocusedEvents.Any()) { state.ShowMeetingInfor.FocusedEvents.Add(state.ShowMeetingInfor.ShowingMeetings.FirstOrDefault()); isShowingMeetingDetail = false; } var eventItem = state.ShowMeetingInfor.FocusedEvents.FirstOrDefault(); if (isShowingMeetingDetail) { var tokens = 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, 1) }, { "Subject", eventItem.Title } }; var replyMessage = await GetDetailMeetingResponseAsync(sc, eventItem, SummaryResponses.ReadOutMessage, tokens); await sc.Context.SendActivityAsync(replyMessage); } else { var responseParams = new StringDictionary() { { "Condition", GetSearchConditionString(state) }, { "Count", state.ShowMeetingInfor.ShowingMeetings.Count.ToString() }, { "EventName1", state.ShowMeetingInfor.ShowingMeetings[0].Title }, { "DateTime", state.MeetingInfor.StartDateString ?? CalendarCommonStrings.TodayLower }, { "EventTime1", SpeakHelper.ToSpeechMeetingTime(TimeConverter.ConvertUtcToUserTime(state.ShowMeetingInfor.ShowingMeetings[0].StartTime, state.GetUserTimeZone()), state.ShowMeetingInfor.ShowingMeetings[0].IsAllDay == true) }, { "Participants1", DisplayHelper.ToDisplayParticipantsStringSummary(state.ShowMeetingInfor.ShowingMeetings[0].Attendees, 1) } }; string responseTemplateId = null; if (state.ShowMeetingInfor.ShowingMeetings.Count == 1) { if (state.ShowMeetingInfor.Condition == CalendarSkillState.ShowMeetingInformation.SearchMeetingCondition.Time && !(options != null && options.Reason == ShowMeetingReason.ShowOverviewAgain)) { responseTemplateId = SummaryResponses.ShowOneMeetingSummaryMessage; } else { responseTemplateId = SummaryResponses.ShowOneMeetingSummaryShortMessage; } } var replyMessage = await GetDetailMeetingResponseAsync(sc, eventItem, responseTemplateId, responseParams); 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)); } }
// Check whether the candidate rooms are free. private async Task <DialogTurnResult> CheckRoomAvailableAsync(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var state = await Accessor.GetAsync(sc.Context, cancellationToken : cancellationToken); sc.Context.TurnState.TryGetValue(StateProperties.APITokenKey, out var token); var service = ServiceManager.InitCalendarService(token as string, state.EventSource); List <string> users = new List <string>(); foreach (var room in state.MeetingInfo.UnconfirmedMeetingRoom) { users.Add(room.EmailAddress); } // roomAvailablility indicates whether the room is free. List <bool> roomAvailablity = await service.CheckAvailableAsync(users, (DateTime)state.MeetingInfo.StartDateTime, state.MeetingInfo.Duration / 60); List <RoomModel> meetingRooms = new List <RoomModel>(); for (int i = 0; i < state.MeetingInfo.UnconfirmedMeetingRoom.Count(); i++) { var status = roomAvailablity[i]; if (status == true) { meetingRooms.Add(state.MeetingInfo.UnconfirmedMeetingRoom[i]); } } state.MeetingInfo.UnconfirmedMeetingRoom = meetingRooms; if (meetingRooms.Count > 0) { return(await sc.NextAsync(cancellationToken : cancellationToken)); } else if (string.IsNullOrEmpty(state.MeetingInfo.MeetingRoomName)) { var tokens = new { state.MeetingInfo.Building, state.MeetingInfo.FloorNumber, DateTime = SpeakHelper.ToSpeechMeetingTime( TimeConverter.ConvertUtcToUserTime((DateTime)state.MeetingInfo.StartDateTime, state.GetUserTimeZone()), state.MeetingInfo.AllDay == true, DateTime.UtcNow > state.MeetingInfo.StartDateTime), }; var activity = TemplateManager.GenerateActivityForLocale(FindMeetingRoomResponses.MeetingRoomNotFoundByBuildingAndFloor, tokens); await sc.Context.SendActivityAsync(activity, cancellationToken); } else { var tokens = new { MeetingRoom = state.MeetingInfo.MeetingRoomName }; var activity = TemplateManager.GenerateActivityForLocale(FindMeetingRoomResponses.MeetingRoomUnavailable, tokens); await sc.Context.SendActivityAsync(activity, cancellationToken); } return(await sc.ReplaceDialogAsync(Actions.RecreateMeetingRoom, cancellationToken : cancellationToken)); } catch (Exception ex) { await HandleDialogExceptionsAsync(sc, ex, cancellationToken); return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs)); } }
public async Task <DialogTurnResult> ShowNextEvent(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var state = await Accessor.GetAsync(sc.Context); if (string.IsNullOrEmpty(state.APIToken)) { return(await sc.EndDialogAsync(true)); } var calendarService = ServiceManager.InitCalendarService(state.APIToken, state.EventSource); var eventList = await calendarService.GetUpcomingEvents(); var nextEventList = new List <EventModel>(); foreach (var item in eventList) { if (item.IsCancelled != true && (nextEventList.Count == 0 || nextEventList[0].StartTime == item.StartTime)) { nextEventList.Add(item); } } if (nextEventList.Count == 0) { await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(NextMeetingResponses.ShowNoMeetingMessage)); } else { if (nextEventList.Count == 1) { var speakParams = new StringDictionary() { { "EventName", nextEventList[0].Title }, { "PeopleCount", nextEventList[0].Attendees.Count.ToString() }, }; speakParams.Add("EventTime", SpeakHelper.ToSpeechMeetingTime(TimeConverter.ConvertUtcToUserTime(nextEventList[0].StartTime, state.GetUserTimeZone()), nextEventList[0].IsAllDay == true)); if (string.IsNullOrEmpty(nextEventList[0].Location)) { await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(NextMeetingResponses.ShowNextMeetingNoLocationMessage, ResponseBuilder, speakParams)); } else { speakParams.Add("Location", nextEventList[0].Location); await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(NextMeetingResponses.ShowNextMeetingMessage, ResponseBuilder, speakParams)); } } else { await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(NextMeetingResponses.ShowMultipleNextMeetingMessage)); } await ShowMeetingList(sc, nextEventList, true); } state.Clear(); return(await sc.EndDialogAsync(true)); } catch { await HandleDialogExceptions(sc); throw; } }
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)); } }