in libraries/Microsoft.Bot.Builder.Dialogs.Adaptive/Input/OAuthInput.cs [161:268]
public override async Task<DialogTurnResult> ContinueDialogAsync(DialogContext dc, CancellationToken cancellationToken = default(CancellationToken))
{
if (dc == null)
{
throw new ArgumentNullException(nameof(dc));
}
var interrupted = dc.State.GetValue<bool>(TurnPath.Interrupted, () => false);
var turnCount = dc.State.GetValue<int>(TURN_COUNT_PROPERTY, () => 0);
// Recognize token
var recognized = await RecognizeTokenAsync(dc, cancellationToken).ConfigureAwait(false);
// Check for timeout
var state = dc.ActiveDialog.State;
var expires = (DateTime)state[PersistedExpires];
var isMessage = dc.Context.Activity.Type == ActivityTypes.Message;
var isTimeoutActivityType = isMessage
|| IsTokenResponseEvent(dc.Context)
|| IsTeamsVerificationInvoke(dc.Context)
|| IsTokenExchangeRequestInvoke(dc.Context);
var hasTimedOut = isTimeoutActivityType && (DateTime.Compare(DateTime.UtcNow, expires) > 0);
if (hasTimedOut)
{
if (this.Property != null)
{
dc.State.SetValue(this.Property.GetValue(dc.State), null);
}
// if the token fetch request times out, complete the prompt with no result.
return await dc.EndDialogAsync(cancellationToken: cancellationToken).ConfigureAwait(false);
}
else
{
var promptState = (IDictionary<string, object>)state[PersistedState];
var promptOptions = (PromptOptions)state[PersistedOptions];
// Increment attempt count
// Convert.ToInt32 For issue https://github.com/Microsoft/botbuilder-dotnet/issues/1859
promptState[AttemptCountKey] = Convert.ToInt32(promptState[AttemptCountKey], CultureInfo.InvariantCulture) + 1;
// Validate the return value
var inputState = InputState.Invalid;
if (recognized.Succeeded)
{
inputState = InputState.Valid;
}
// Return recognized value or re-prompt
if (inputState == InputState.Valid)
{
if (this.Property != null)
{
dc.State.SetValue(this.Property.GetValue(dc.State), recognized.Value);
}
return await dc.EndDialogAsync(recognized.Value, cancellationToken).ConfigureAwait(false);
}
else if (this.MaxTurnCount == null || turnCount < this.MaxTurnCount.GetValue(dc.State))
{
if (!interrupted)
{
// increase the turnCount as last step
dc.State.SetValue(TURN_COUNT_PROPERTY, turnCount + 1);
if (isMessage)
{
var prompt = await this.OnRenderPromptAsync(dc, inputState, cancellationToken).ConfigureAwait(false);
await dc.Context.SendActivityAsync(prompt, cancellationToken).ConfigureAwait(false);
}
}
// Only send the card in response to a message.
if (isMessage)
{
await SendOAuthCardAsync(dc, promptOptions?.Prompt, cancellationToken).ConfigureAwait(false);
}
return Dialog.EndOfTurn;
}
else
{
if (this.DefaultValue != null)
{
var (value, _) = this.DefaultValue.TryGetValue(dc.State);
if (this.DefaultValueResponse != null)
{
var response = await this.DefaultValueResponse.BindAsync(dc, cancellationToken: cancellationToken).ConfigureAwait(false);
var properties = new Dictionary<string, string>()
{
{ "template", JsonConvert.SerializeObject(this.DefaultValueResponse) },
{ "result", response == null ? string.Empty : JsonConvert.SerializeObject(response, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore }) },
{ "context", TelemetryLoggerConstants.OAuthInputResultEvent }
};
TelemetryClient.TrackEvent(TelemetryLoggerConstants.GeneratorResultEvent, properties);
await dc.Context.SendActivityAsync(response, cancellationToken).ConfigureAwait(false);
}
// set output property
dc.State.SetValue(this.Property.GetValue(dc.State), value);
return await dc.EndDialogAsync(value, cancellationToken).ConfigureAwait(false);
}
}
return await dc.EndDialogAsync(cancellationToken: cancellationToken).ConfigureAwait(false);
}
}