Bot Framework Context.Wait не ждет ввода - PullRequest
0 голосов
/ 24 октября 2018

У меня есть три диалоговых окна, которые работают, как описано ниже

У меня есть диалоговое окно «Получение», но когда оно вызывается, оно сначала переходит в диалоговое окно «Включение», чтобы проверить, включил ли он пользователя, должен ли пользователь включить его.запустите процесс регистрации, а затем вызовите диалог OTP для завершения перевода.Но когда он попадает в диалог OTP, он не ждет, пока пользователь введет сгенерированный токен.

Ниже приведен код

Диалог OnBoarding

    private async Task AccountNumberEnteredAsync(IDialogContext context, IAwaitable<object> result)
    {
        try
        {
            if (await result is IMessageActivity resp)
            {
                var userID = context.Activity.From.Id;
                var channelID = context.Activity.ChannelId;

                var customerEnquiry = DialogFactory.Create<ICustomerEnquiry>();
                string phoneNum = await customerEnquiry.GetCustomerPhoneNumberAsync(resp.Text);

                context.PrivateConversationData.SetValue(StringConstants.TEMP_ACCOUNT_NUMBER, resp.Text);
                context.PrivateConversationData.SetValue(StringConstants.PHONE_NUMBER, phoneNum);
                context.Call(DialogFactory.Create<OTPDialog>(), ResumeAfterOTPAsync);
            }
        }
        catch (Exception ex)
        {
            Telemetry.TrackException(ex);
            await context.PostAsync(L("FORM_ERROR"));
            context.Done(false);
        }
    }

Диалог OTP

    private async Task InitiateOTP(IDialogContext context)
    {
        try
        {
            if (!context.UserData.TryGetValue(StringConstants.USER_OTP_KEY, out this.secret))
            {
                var username = context.UserData.GetValueOrDefault<string>(StringConstants.ACCESS_MOBILE_USERNAME);
                context.Fail(new AppException(L("OTPGENERATIONERROR", new object[] { username })));
            }
            else
            {
                context.PrivateConversationData.TryGetValue(StringConstants.PHONE_NUMBER, out string phoneNum);
                var otp = await TwoFactorAuth.GetOTPAsync(this.secret);
                await SendTokenSMSAsync(otp, new List<string>() { phoneNum });
                await context.PostAsync(L("OTP_SENT_MESSAGE") + " " + otp);
                context.Wait(this.OTPEnteredAsync);
            }
        }
        catch (TooManyAttemptsException ex)
        {
            Telemetry.TrackException(ex);
            await context.PostAsync(L("HERO_CARD_TRIALS_EXCEEDED"));
            context.Done(false);
        }
        catch (InvalidOperationException ex)
        {
            Telemetry.TrackException(ex);
            await context.PostAsync(L("FORM_ERROR"));
            context.Done(false);
        }
        finally
        {
            Telemetry.TrackTrace(nameof(StartAsync));
        }
    }

Возобновляется после ввода OTP (но пользователь не ожидает ввода OTP)

     private async Task OTPEnteredAsync(IDialogContext context, IAwaitable<object> result)
    {
        try
        {
            var response = await result as Activity;
            var yesy = await result;

            if (response != null && !string.IsNullOrEmpty(response.Text) && response.Text.Equals(RESEND, StringComparison.InvariantCultureIgnoreCase))
            {
                context.PrivateConversationData.TryGetValue(StringConstants.PHONE_NUMBER, out string phoneNum);
                var otp = await TwoFactorAuth.GetOTPAsync(this.secret);
                await SendTokenSMSAsync(otp, new List<string>() { phoneNum });
                await context.PostAsync(L("OTP_SENT_MESSAGE"));
                context.Wait(OTPEnteredAsync);
            }
            else
            {
                if (response != null &&  !response.Text.IsNullOrEmpty())
                {
                    var isValidated = await TwoFactorAuth.ValidateOTPAsync(this.secret, response.Text);

                    if (!isValidated && authTrialCount++ < int.Parse(await SettingManager.GetSettingValueAsync(BotEngineConsts.SettingNames.AuthTrialLimit)))
                    {
                        await context.PostAsync(L("OTP_INVALID"));
                        context.Wait(OTPEnteredAsync);
                    }
                    else
                    {
                        context.Done(isValidated);
                    } 
                }
                else
                {
                    context.Wait(OTPEnteredAsync);
                }
            }
        }
        catch (Exception ex)
        {

            throw;
        }

        context.Wait(OTPEnteredAsync);
    }

Как заставить пользователя ждать, пока пользователь введет OTPпродолжается.Использую Autofac для DI

...