public async Task <DialogTurnResult> AfterUpdateStartTime(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var state = await Accessor.GetAsync(sc.Context); var events = new List <EventModel>(); var calendarAPI = GraphClientHelper.GetCalendarService(state.APIToken, state.EventSource, ServiceManager.GetGoogleClient()); var calendarService = ServiceManager.InitCalendarService(calendarAPI, state.EventSource); if (state.OriginalStartDate != null || state.OriginalStartTime != null) { events = await GetEventsByTime(state.OriginalStartDate, state.OriginalStartTime, state.OriginalEndDate, state.OriginalEndTime, state.GetUserTimeZone(), calendarService); state.OriginalStartDate = null; state.OriginalStartTime = null; state.OriginalEndDate = null; state.OriginalStartTime = null; } else if (state.Title != null) { events = await calendarService.GetEventsByTitle(state.Title); state.Title = null; } else { DateTime?startTime = null; sc.Context.Activity.Properties.TryGetValue("OriginText", out var content); var userInput = content != null?content.ToString() : sc.Context.Activity.Text; try { IList <DateTimeResolution> dateTimeResolutions = sc.Result as List <DateTimeResolution>; if (dateTimeResolutions.Count > 0) { startTime = DateTime.Parse(dateTimeResolutions.First().Value); var dateTimeConvertType = dateTimeResolutions.First().Timex; bool isRelativeTime = IsRelativeTime(sc.Context.Activity.Text, dateTimeResolutions.First().Value, dateTimeResolutions.First().Timex); startTime = isRelativeTime ? TimeZoneInfo.ConvertTime(startTime.Value, TimeZoneInfo.Local, state.GetUserTimeZone()) : startTime; } } catch { } if (startTime != null) { startTime = TimeConverter.ConvertLuisLocalToUtc(startTime.Value, state.GetUserTimeZone()); events = await calendarService.GetEventsByStartTime(startTime.Value); } else { state.Title = userInput; events = await calendarService.GetEventsByTitle(userInput); } } state.Events = events; if (events.Count <= 0) { return(await sc.BeginDialogAsync(Actions.UpdateStartTime, new UpdateDateTimeDialogOptions(UpdateDateTimeDialogOptions.UpdateReason.NoEvent))); } else if (events.Count > 1) { var options = new PromptOptions() { Choices = new List <Choice>(), }; for (var i = 0; i < events.Count; i++) { var item = events[i]; var choice = new Choice() { Value = string.Empty, Synonyms = new List <string> { (i + 1).ToString(), item.Title }, }; options.Choices.Add(choice); } var replyToConversation = sc.Context.Activity.CreateReply(UpdateEventResponses.MultipleEventsStartAtSameTime); replyToConversation.AttachmentLayout = AttachmentLayoutTypes.Carousel; replyToConversation.Attachments = new List <Microsoft.Bot.Schema.Attachment>(); var cardsData = new List <CalendarCardData>(); foreach (var item in events) { var meetingCard = item.ToAdaptiveCardData(state.GetUserTimeZone()); var replyTemp = sc.Context.Activity.CreateAdaptiveCardReply(CalendarMainResponses.GreetingMessage, item.OnlineMeetingUrl == null ? "Dialogs/Shared/Resources/Cards/CalendarCardNoJoinButton.json" : "Dialogs/Shared/Resources/Cards/CalendarCard.json", meetingCard); replyToConversation.Attachments.Add(replyTemp.Attachments[0]); } options.Prompt = replyToConversation; return(await sc.PromptAsync(Actions.EventChoice, options)); } else { return(await sc.EndDialogAsync(true)); } } catch { await HandleDialogExceptions(sc); throw; } }
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)) { return(await sc.EndDialogAsync(true)); } var calendarAPI = GraphClientHelper.GetCalendarService(state.APIToken, state.EventSource, ServiceManager.GetGoogleClient()); var calendarService = ServiceManager.InitCalendarService(calendarAPI, state.EventSource); var searchDate = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, state.GetUserTimeZone()); if (state.StartDate != null) { searchDate = state.StartDate.Value; } var results = await GetEventsByTime(searchDate, state.StartTime, state.EndDate, state.EndTime, state.GetUserTimeZone(), calendarService); var searchedEvents = new List <EventModel>(); bool searchTodayMeeting = state.StartDate != null && state.StartTime == null && state.EndDate == null && state.EndTime == null && EventModel.IsSameDate(state.StartDate.Value, 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)); 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); if (searchedEvents[searchedEvents.Count - 1].IsAllDay == true) { responseParams.Add("EventTime", TimeConverter.ConvertUtcToUserTime(searchedEvents[searchedEvents.Count - 1].StartTime, state.GetUserTimeZone()).ToString("MMMM dd all day")); } else { responseParams.Add("EventTime", TimeConverter.ConvertUtcToUserTime(searchedEvents[searchedEvents.Count - 1].StartTime, state.GetUserTimeZone()).ToString("h:mm tt")); } 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 { await HandleDialogExceptions(sc); throw; } }