private async Task <DialogTurnResult> LateCheckOutPromptAsync(WaterfallStepContext sc, CancellationToken cancellationToken) { var userState = await UserStateAccessor.GetAsync(sc.Context, () => new HospitalityUserSkillState(HotelService), cancellationToken); // already requested late check out if (userState.LateCheckOut) { var cardData = userState.UserReservation; cardData.Title = TemplateManager.GetString(HospitalityStrings.ReservationDetails); var reply = TemplateManager.GenerateActivity(LateCheckOutResponses.HasLateCheckOut, new Card(GetCardName(sc.Context, "ReservationDetails"), cardData), null); await sc.Context.SendActivityAsync(reply, cancellationToken); return(await sc.EndDialogAsync(cancellationToken : cancellationToken)); } // TODO checking availability // simulate with time delay await sc.Context.SendActivityAsync(TemplateManager.GenerateActivity(LateCheckOutResponses.CheckAvailability), cancellationToken); await Task.Delay(1600); var lateTime = await HotelService.GetLateCheckOutAsync(); var convState = await StateAccessor.GetAsync(sc.Context, () => new HospitalitySkillState(), cancellationToken); var entities = convState?.LuisResult?.Entities; if (entities != null && entities.datetime != null && (entities.datetime[0].Type == "time" || entities.datetime[0].Type == "timerange")) { // ISO 8601 https://docs.microsoft.com/en-us/azure/cognitive-services/luis/luis-reference-prebuilt-datetimev2?tabs=1-1%2C2-1%2C3-1%2C4-1%2C5-1%2C6-1 var timexProperty = new TimexProperty(); TimexParsing.ParseString(entities.datetime[0].Expressions[0], timexProperty); var preferedTime = new TimeSpan(timexProperty.Hour ?? 0, timexProperty.Minute ?? 0, timexProperty.Second ?? 0) + new TimeSpan((int)(timexProperty.Hours ?? 0), (int)(timexProperty.Minutes ?? 0), (int)(timexProperty.Seconds ?? 0)); if (preferedTime < lateTime) { lateTime = preferedTime; } } convState.UpdatedReservation = new ReservationData { CheckOutTimeData = lateTime }; var tokens = new Dictionary <string, object> { { "Time", convState.UpdatedReservation.CheckOutTime }, }; return(await sc.PromptAsync(DialogIds.LateCheckOutPrompt, new PromptOptions() { Prompt = TemplateManager.GenerateActivity(LateCheckOutResponses.MoveCheckOutPrompt, tokens), RetryPrompt = TemplateManager.GenerateActivity(LateCheckOutResponses.RetryMoveCheckOut), }, cancellationToken)); }
private async Task <DialogTurnResult> LateCheckOutPrompt(WaterfallStepContext sc, CancellationToken cancellationToken) { var userState = await UserStateAccessor.GetAsync(sc.Context, () => new HospitalityUserSkillState(HotelService)); // already requested late check out if (userState.LateCheckOut) { var cardData = userState.UserReservation; cardData.Title = string.Format(HospitalityStrings.ReservationDetails); var reply = ResponseManager.GetCardResponse(LateCheckOutResponses.HasLateCheckOut, new Card(GetCardName(sc.Context, "ReservationDetails"), cardData), null); await sc.Context.SendActivityAsync(reply); return(await sc.EndDialogAsync()); } // TODO checking availability // simulate with time delay await sc.Context.SendActivityAsync(ResponseManager.GetResponse(LateCheckOutResponses.CheckAvailability)); await Task.Delay(1600); var lateTime = await HotelService.GetLateCheckOutAsync(); var convState = await StateAccessor.GetAsync(sc.Context, () => new HospitalitySkillState()); var entities = convState.LuisResult.Entities; if (entities.datetime != null && (entities.datetime[0].Type == "time" || entities.datetime[0].Type == "timerange")) { var timexProperty = new TimexProperty(); TimexParsing.ParseString(entities.datetime[0].Expressions[0], timexProperty); var preferedTime = new TimeSpan(timexProperty.Hour ?? 0, timexProperty.Minute ?? 0, timexProperty.Second ?? 0) + new TimeSpan((int)(timexProperty.Hours ?? 0), (int)(timexProperty.Minutes ?? 0), (int)(timexProperty.Seconds ?? 0)); if (preferedTime < lateTime) { lateTime = preferedTime; } } convState.UpdatedReservation = new ReservationData { CheckOutTimeData = lateTime }; var tokens = new StringDictionary { { "Time", convState.UpdatedReservation.CheckOutTime }, }; return(await sc.PromptAsync(DialogIds.LateCheckOutPrompt, new PromptOptions() { Prompt = ResponseManager.GetResponse(LateCheckOutResponses.MoveCheckOutPrompt, tokens), RetryPrompt = ResponseManager.GetResponse(LateCheckOutResponses.RetryMoveCheckOut), })); }