У меня есть три диалоговых окна, которые работают, как описано ниже
У меня есть диалоговое окно «Получение», но когда оно вызывается, оно сначала переходит в диалоговое окно «Включение», чтобы проверить, включил ли он пользователя, должен ли пользователь включить его.запустите процесс регистрации, а затем вызовите диалог 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