private Action <IActivity> ShowEmailList(int expectCount = 3, int page = 0) { return(activity => { var messageActivity = activity.AsMessageActivity(); var prompt = EmailSharedResponses.ShowEmailPrompt; if (expectCount == 1) { prompt = EmailSharedResponses.ShowOneEmailPrompt; } var totalEmails = ((MockServiceManager)this.ServiceManager).MailService.MyMessages; var showEmails = new List <Message>(); for (int i = ConfigData.GetInstance().MaxDisplaySize *page; i < totalEmails.Count; i++) { showEmails.Add(totalEmails[i]); } var replies = this.ParseReplies(prompt.Replies, new StringDictionary() { { "TotalCount", totalEmails.Count.ToString() }, { "EmailListDetails", SpeakHelper.ToSpeechEmailListString(showEmails, TimeZoneInfo.Local, ConfigData.GetInstance().MaxReadSize) }, }); CollectionAssert.Contains(replies, messageActivity.Text); Assert.AreEqual(messageActivity.Attachments.Count, expectCount); }); }
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)); } }
protected async Task <DialogTurnResult> ConfirmBeforeSending(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var state = await EmailStateAccessor.GetAsync(sc.Context); if (sc.Result != null) { if (string.IsNullOrEmpty(state.Content)) { sc.Context.Activity.Properties.TryGetValue("OriginText", out var content); state.Content = content != null?content.ToString() : sc.Context.Activity.Text; } } string nameListString; // this means reply confirm if (state.Recipients.FirstOrDefault() == null) { await GetPreviewSubject(sc, Actions.Reply); nameListString = await GetPreviewNameListString(sc, Actions.Reply); } else if (state.Subject == null) { // this mean forward confirm await GetPreviewSubject(sc, Actions.Forward); nameListString = await GetPreviewNameListString(sc, Actions.Forward); } else { nameListString = await GetPreviewNameListString(sc, Actions.Send); } var emailCard = new EmailCardData { Subject = string.Format(CommonStrings.SubjectFormat, state.Subject), NameList = string.Format(CommonStrings.ToFormat, nameListString), EmailContent = string.Format(CommonStrings.ContentFormat, state.Content), }; var speech = SpeakHelper.ToSpeechEmailSendDetailString(emailCard.Subject, emailCard.NameList, emailCard.EmailContent); var stringToken = new StringDictionary { { "EmailDetails", speech }, }; var replyMessage = sc.Context.Activity.CreateAdaptiveCardReply(EmailSharedResponses.ConfirmSend, "Dialogs/Shared/Resources/Cards/EmailWithOutButtonCard.json", emailCard, ResponseBuilder, stringToken); return(await sc.PromptAsync(Actions.TakeFurtherAction, new PromptOptions { Prompt = replyMessage, RetryPrompt = sc.Context.Activity.CreateReply(EmailSharedResponses.ConfirmSendFailed, ResponseBuilder), })); } catch (Exception ex) { throw await HandleDialogExceptions(sc, ex); } }
private async Task <DialogTurnResult> ShowNextMeeting(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var state = await Accessor.GetAsync(sc.Context); // if only one next meeting, show the meeting detail card, otherwise show a meeting list card if (state.ShowMeetingInfo.ShowingMeetings.Count == 1) { var speakParams = new { EventName = state.ShowMeetingInfo.ShowingMeetings[0].Title, PeopleCount = state.ShowMeetingInfo.ShowingMeetings[0].Attendees.Count.ToString(), EventTime = SpeakHelper.ToSpeechMeetingDateTime( TimeConverter.ConvertUtcToUserTime(state.ShowMeetingInfo.ShowingMeetings[0].StartTime, state.GetUserTimeZone()), state.ShowMeetingInfo.ShowingMeetings[0].IsAllDay == true), Location = state.ShowMeetingInfo.ShowingMeetings[0].Location ?? string.Empty }; if (string.IsNullOrEmpty(state.ShowMeetingInfo.ShowingMeetings[0].Location)) { var activity = TemplateEngine.GenerateActivityForLocale(SummaryResponses.ShowNextMeetingNoLocationMessage, speakParams); await sc.Context.SendActivityAsync(activity); } else { var activity = TemplateEngine.GenerateActivityForLocale(SummaryResponses.ShowNextMeetingMessage, speakParams); await sc.Context.SendActivityAsync(activity); } } else { var activity = TemplateEngine.GenerateActivityForLocale(SummaryResponses.ShowMultipleNextMeetingMessage); await sc.Context.SendActivityAsync(activity); } state.ShowMeetingInfo.ShowingCardTitle = CalendarCommonStrings.UpcommingMeeting; var reply = await GetGeneralMeetingListResponseAsync(sc, state, true); await sc.Context.SendActivityAsync(reply); state.Clear(); return(await sc.EndDialogAsync()); } 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> 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)); } }
// 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)); } }
private Action <IActivity> ShowEmailList(int expectCount = 3, int page = 0) { return(activity => { var messageActivity = activity.AsMessageActivity(); var prompt = EmailSharedResponses.ShowEmailPrompt; if (page == 0) { if (expectCount == 1) { prompt = EmailSharedResponses.ShowOneEmailPrompt; } } else { if (expectCount == 1) { prompt = EmailSharedResponses.ShowOneEmailPromptOtherPage; } else { prompt = EmailSharedResponses.ShowEmailPromptOtherPage; } } var totalEmails = ((MockServiceManager)this.ServiceManager).MailService.MyMessages; var showEmails = new List <Message>(); if (page < 0) { var pagingInfo = this.ParseReplies(EmailSharedResponses.FirstPageAlready, new StringDictionary())[0]; Assert.IsTrue(messageActivity.Text.StartsWith(pagingInfo)); } else if (page * ConfigData.GetInstance().MaxDisplaySize > totalEmails.Count) { var pagingInfo = this.ParseReplies(EmailSharedResponses.LastPageAlready, new StringDictionary())[0]; Assert.IsTrue(messageActivity.Text.StartsWith(pagingInfo)); } else { for (int i = ConfigData.GetInstance().MaxDisplaySize *page; i < totalEmails.Count; i++) { showEmails.Add(totalEmails[i]); } var replies = this.ParseReplies(prompt, new StringDictionary() { { "TotalCount", totalEmails.Count.ToString() }, { "EmailListDetails", SpeakHelper.ToSpeechEmailListString(showEmails, TimeZoneInfo.Local, ConfigData.GetInstance().MaxReadSize) }, }); CollectionAssert.Contains(replies, messageActivity.Text); } }); }
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)); } }
private Action <IActivity> AssertSelectOneOfTheMessage(int selection) { return(activity => { var messageActivity = activity.AsMessageActivity(); var totalEmails = ((MockServiceManager)this.ServiceManager).MailService.MyMessages; var replies = this.ParseReplies(ShowEmailResponses.ReadOutMessage.Replies, new StringDictionary() { { "EmailDetails", SpeakHelper.ToSpeechEmailDetailString(totalEmails[selection - 1], TimeZoneInfo.Local) }, }); CollectionAssert.Contains(replies, messageActivity.Text); Assert.AreEqual(messageActivity.Attachments.Count, 1); }); }
private Action <IActivity> ShowEmailFromSomeoneList() { return(activity => { var messageActivity = activity.AsMessageActivity(); var showedItems = ((MockServiceManager)this.ServiceManager).MailService.MyMessages; var replies = this.ParseReplies(EmailSharedResponses.ShowEmailPrompt.Replies, new StringDictionary() { { "TotalCount", "1" }, { "EmailListDetails", SpeakHelper.ToSpeechEmailListString(showedItems, TimeZoneInfo.Local, ConfigData.GetInstance().MaxReadSize) }, }); Assert.AreEqual(messageActivity.Attachments.Count, 1); }); }
public void ProcessRequest(HttpContext context) { context.Response.ContentType = "audio/wav"; string text = context.Request.Form["text"]; if (string.IsNullOrEmpty(text)) { text = context.Request.QueryString["text"]; } if (!string.IsNullOrEmpty(text)) { SpeakHelper.Speak(text, @"LinZhiling", context.Response.OutputStream); } context.Response.Flush(); }
protected async Task ShowMailList(WaterfallStepContext sc, List <Message> messages) { var state = await EmailStateAccessor.GetAsync(sc.Context); var cardsData = new List <EmailCardData>(); foreach (var message in messages) { var nameListString = DisplayHelper.ToDisplayRecipientsString_Summay(message.ToRecipients); var emailCard = new EmailCardData { Subject = message.Subject, Sender = message.Sender.EmailAddress.Name, NameList = string.Format(CommonStrings.ToFormat, nameListString), EmailContent = message.BodyPreview, EmailLink = message.WebLink, ReceivedDateTime = message.ReceivedDateTime == null ? CommonStrings.NotAvailable : message.ReceivedDateTime.Value.UtcDateTime.ToRelativeString(state.GetUserTimeZone()), Speak = SpeakHelper.ToSpeechEmailDetailString(message), }; cardsData.Add(emailCard); } var searchType = CommonStrings.Relevant; if (state.IsUnreadOnly) { searchType = string.Format(CommonStrings.RelevantFormat, CommonStrings.Unread); } else if (state.IsImportant) { searchType = string.Format(CommonStrings.RelevantFormat, CommonStrings.Important); } var stringToken = new StringDictionary { { "SearchType", searchType }, { "EmailListDetails", SpeakHelper.ToSpeechEmailListString(messages) }, }; var reply = sc.Context.Activity.CreateAdaptiveCardGroupReply(EmailSharedResponses.ShowEmailPrompt, "Dialogs/Shared/Resources/Cards/EmailCard.json", AttachmentLayoutTypes.Carousel, cardsData, ResponseBuilder, stringToken); await sc.Context.SendActivityAsync(reply); }
public async Task <DialogTurnResult> PromptToDelete(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var state = await EmailStateAccessor.GetAsync(sc.Context); var skillOptions = (EmailSkillDialogOptions)sc.Options; var focusedMessage = state.Message?.FirstOrDefault(); if (focusedMessage != null) { var nameListString = DisplayHelper.ToDisplayRecipientsString_Summay(focusedMessage.ToRecipients); var emailCard = new EmailCardData { Subject = string.Format(EmailCommonStrings.SubjectFormat, focusedMessage.Subject), NameList = string.Format(EmailCommonStrings.ToFormat, nameListString), EmailContent = string.Format(EmailCommonStrings.ContentFormat, focusedMessage.BodyPreview), }; var speech = SpeakHelper.ToSpeechEmailSendDetailString(focusedMessage.Subject, nameListString, focusedMessage.BodyPreview); var tokens = new StringDictionary { { "EmailDetails", speech }, }; var prompt = ResponseManager.GetCardResponse( DeleteEmailResponses.DeleteConfirm, new Card("EmailWithOutButtonCard", emailCard), tokens); 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)); } }
private Action <IActivity> ShowEmailList() { return(activity => { var messageActivity = activity.AsMessageActivity(); // Get showed mails: var showedItems = ServiceManager.MailService.MyMessages; var replies = this.ParseReplies(EmailSharedResponses.ShowEmailPrompt, new StringDictionary() { { "TotalCount", showedItems.Count.ToString() }, { "EmailListDetails", SpeakHelper.ToSpeechEmailListString(showedItems, TimeZoneInfo.Local, ConfigData.GetInstance().MaxReadSize) }, }); CollectionAssert.Contains(replies, messageActivity.Text); Assert.AreNotEqual(messageActivity.Attachments.Count, 0); }); }
// 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)); } }
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)); } }
private async Task <PromptOptions> GenerateOptionsForEmail(WaterfallStepContext sc, CustomizedPerson confirmedPerson, ITurnContext context, bool isSinglePage = true) { var state = await Accessor.GetAsync(context); var pageIndex = state.ShowAttendeesIndex; var pageSize = 3; var skip = pageSize * pageIndex; var emailList = confirmedPerson.Emails.ToList(); // Go back to the last page when reaching the end. if (skip >= emailList.Count && pageIndex > 0) { state.ShowAttendeesIndex--; pageIndex = state.ShowAttendeesIndex; skip = pageSize * pageIndex; await sc.Context.SendActivityAsync(ResponseManager.GetResponse(FindContactResponses.AlreadyLastPage)); } var options = new PromptOptions { Choices = new List <Choice>(), Prompt = ResponseManager.GetResponse(FindContactResponses.ConfirmMultiplContactEmailSinglePage, new StringDictionary() { { "UserName", confirmedPerson.DisplayName } }) }; if (!isSinglePage) { options.Prompt = ResponseManager.GetResponse(FindContactResponses.ConfirmMultiplContactEmailMultiPage, new StringDictionary() { { "UserName", confirmedPerson.DisplayName } }); } for (var i = 0; i < emailList.Count; i++) { var user = confirmedPerson; var mailAddress = emailList[i].Address ?? user.UserPrincipalName; var choice = new Choice() { Value = $"{user.DisplayName}: {mailAddress}", Synonyms = new List <string> { (options.Choices.Count + 1).ToString(), user.DisplayName, user.DisplayName.ToLower(), mailAddress }, }; var userName = user.UserPrincipalName?.Split("@").FirstOrDefault() ?? user.UserPrincipalName; if (!string.IsNullOrEmpty(userName)) { choice.Synonyms.Add(userName); choice.Synonyms.Add(userName.ToLower()); } if (skip <= 0) { if (options.Choices.Count >= pageSize) { options.Prompt.Speak = SpeakHelper.ToSpeechSelectionDetailString(options, Common.ConfigData.GetInstance().MaxDisplaySize); options.Prompt.Text += "\r\n" + GetSelectPromptEmailString(options, true); options.RetryPrompt = ResponseManager.GetResponse(CalendarSharedResponses.DidntUnderstandMessage); return(options); } options.Choices.Add(choice); } else { skip--; } } options.Prompt.Speak = SpeakHelper.ToSpeechSelectionDetailString(options, Common.ConfigData.GetInstance().MaxDisplaySize); options.Prompt.Text += "\r\n" + GetSelectPromptEmailString(options, true); options.RetryPrompt = ResponseManager.GetResponse(CalendarSharedResponses.DidntUnderstandMessage); return(options); }
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)); } }
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> ReadEmail(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var state = await EmailStateAccessor.GetAsync(sc.Context); sc.Context.Activity.Properties.TryGetValue("OriginText", out var content); var userInput = content != null?content.ToString() : sc.Context.Activity.Text; var luisResult = state.LuisResult; var topIntent = luisResult?.TopIntent().intent; var generalLuisResult = state.GeneralLuisResult; var generalTopIntent = generalLuisResult?.TopIntent().intent; if (topIntent == null) { return(await sc.EndDialogAsync(true)); } var message = state.Message.FirstOrDefault(); var promptRecognizerResult = ConfirmRecognizerHelper.ConfirmYesOrNo(userInput, sc.Context.Activity.Locale); if (promptRecognizerResult.Succeeded && promptRecognizerResult.Value == false) { await sc.Context.SendActivityAsync( sc.Context.Activity.CreateReply(EmailSharedResponses.CancellingMessage)); return(await sc.EndDialogAsync(true)); } else if (topIntent == Email.Intent.ReadAloud && message == null) { return(await sc.PromptAsync(Actions.Prompt, new PromptOptions { Prompt = sc.Context.Activity.CreateReply(ShowEmailResponses.ReadOutPrompt), })); } else if (topIntent == Email.Intent.SelectItem || (topIntent == Email.Intent.ReadAloud && message != null)) { var nameListString = DisplayHelper.ToDisplayRecipientsString_Summay(message.ToRecipients); var emailCard = new EmailCardData { Subject = message.Subject, Sender = message.Sender.EmailAddress.Name, NameList = string.Format(CommonStrings.ToFormat, nameListString), EmailContent = message.BodyPreview, EmailLink = message.WebLink, ReceivedDateTime = message?.ReceivedDateTime == null ? CommonStrings.NotAvailable : message.ReceivedDateTime.Value.UtcDateTime.ToRelativeString(state.GetUserTimeZone()), Speak = SpeakHelper.ToSpeechEmailDetailString(message), }; // Todo: workaround here to read out email details. Ignore body for now as we need a summary and filter. var emailDetails = SpeakHelper.ToSpeechEmailDetailString(message); var replyMessage = sc.Context.Activity.CreateAdaptiveCardReply(ShowEmailResponses.ReadOutMessage, "Dialogs/Shared/Resources/Cards/EmailDetailCard.json", emailCard, null, new StringDictionary() { { "EmailDetails", emailDetails } }); await sc.Context.SendActivityAsync(replyMessage); return(await sc.PromptAsync(Actions.Prompt, new PromptOptions { Prompt = sc.Context.Activity.CreateReply(ShowEmailResponses.ReadOutMorePrompt) })); } else { return(await sc.NextAsync()); } } catch (Exception ex) { throw await HandleDialogExceptions(sc, ex); } }
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> 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)); } }
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)); } }
public async Task <DialogTurnResult> ShowNextEvent(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var state = await Accessor.GetAsync(sc.Context); var 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(ResponseManager.GetResponse(SummaryResponses.ShowNoMeetingMessage)); } else { if (nextEventList.Count == 1) { // if user asked for specific details if (askParameter.NeedDetail) { var tokens = 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].ToSpeechDurationString() }, { "EventLocation", nextEventList[0].Location }, }; await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.BeforeShowEventDetails, tokens)); if (askParameter.NeedTime) { await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ReadTime, tokens)); } if (askParameter.NeedDuration) { await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ReadDuration, tokens)); } if (askParameter.NeedLocation) { // for some event there might be no localtion. if (string.IsNullOrEmpty(tokens["EventLocation"])) { await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ReadNoLocation)); } else { await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ReadLocation, tokens)); } } } var speakParams = new StringDictionary() { { "EventName", nextEventList[0].Title }, { "PeopleCount", nextEventList[0].Attendees.Count.ToString() }, }; speakParams.Add("EventTime", SpeakHelper.ToSpeechMeetingDateTime(TimeConverter.ConvertUtcToUserTime(nextEventList[0].StartTime, state.GetUserTimeZone()), nextEventList[0].IsAllDay == true)); if (string.IsNullOrEmpty(nextEventList[0].Location)) { await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ShowNextMeetingNoLocationMessage, speakParams)); } else { speakParams.Add("Location", nextEventList[0].Location); await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ShowNextMeetingMessage, speakParams)); } } else { await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ShowMultipleNextMeetingMessage)); } var reply = await GetGeneralMeetingListResponseAsync(sc, CalendarCommonStrings.UpcommingMeeting, nextEventList, null, null); await sc.Context.SendActivityAsync(reply); } 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)); } }
private async Task <PromptOptions> GenerateOptionsForName(WaterfallStepContext sc, List <Person> unionList, ITurnContext context, bool isSinglePage = true) { var state = await EmailStateAccessor.GetAsync(context); var pageIndex = state.ShowRecipientIndex; var pageSize = ConfigData.GetInstance().MaxDisplaySize; var skip = pageSize * pageIndex; var currentRecipientName = state.NameList[state.ConfirmRecipientIndex]; // Go back to the last page when reaching the end. if (skip >= unionList.Count && pageIndex > 0) { state.ShowRecipientIndex--; state.ReadRecipientIndex = 0; pageIndex = state.ShowRecipientIndex; skip = pageSize * pageIndex; await sc.Context.SendActivityAsync(ResponseManager.GetResponse(FindContactResponses.AlreadyLastPage)); } var options = new PromptOptions { Choices = new List <Choice>(), Prompt = ResponseManager.GetResponse(FindContactResponses.ConfirmMultipleContactNameSinglePage, new StringDictionary() { { "UserName", currentRecipientName } }) }; if (!isSinglePage) { options.Prompt = ResponseManager.GetResponse(FindContactResponses.ConfirmMultipleContactNameMultiPage, new StringDictionary() { { "UserName", currentRecipientName } }); } for (var i = 0; i < unionList.Count; i++) { var user = unionList[i]; var choice = new Choice() { Value = $"**{user.DisplayName}**", Synonyms = new List <string> { (options.Choices.Count + 1).ToString(), user.DisplayName, user.DisplayName.ToLower() }, }; var userName = user.UserPrincipalName?.Split("@").FirstOrDefault() ?? user.UserPrincipalName; if (!string.IsNullOrEmpty(userName)) { choice.Synonyms.Add(userName); choice.Synonyms.Add(userName.ToLower()); } if (skip <= 0) { if (options.Choices.Count >= pageSize) { options.Prompt.Speak = SpeakHelper.ToSpeechSelectionDetailString(options, ConfigData.GetInstance().MaxReadSize); options.Prompt.Text += "\r\n" + GetSelectPromptString(options, true); options.RetryPrompt = ResponseManager.GetResponse(EmailSharedResponses.NoChoiceOptionsRetry); return(options); } options.Choices.Add(choice); } else { skip--; } } options.Prompt.Speak = SpeakHelper.ToSpeechSelectionDetailString(options, ConfigData.GetInstance().MaxReadSize); options.Prompt.Text += "\r\n" + GetSelectPromptString(options, true); options.RetryPrompt = ResponseManager.GetResponse(EmailSharedResponses.NoChoiceOptionsRetry); return(options); }
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> 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)); } }
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)); } }