示例#1
0
        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),
            }));
        }