Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ private async Task<DialogTurnResult> CallSkillActionStepAsync(WaterfallStepConte
skillDialogArgs.Activity.Properties = stepContext.Context.Activity.Properties;

// Comment or uncomment this line if you need to enable or disabled buffered replies.
skillDialogArgs.Activity.DeliveryMode = DeliveryModes.BufferedReplies;
skillDialogArgs.Activity.DeliveryMode = DeliveryModes.ExpectReplies;

// Save active skill in state
await _activeSkillProperty.SetAsync(stepContext.Context, selectedSkill, cancellationToken);
Expand Down
6 changes: 3 additions & 3 deletions libraries/Microsoft.Bot.Builder.Dialogs/SkillDialog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ private async Task<Activity> SendToSkillAsync(ITurnContext context, Activity act
var skillInfo = DialogOptions.Skill;
await DialogOptions.ConversationState.SaveChangesAsync(context, true, cancellationToken).ConfigureAwait(false);

var response = await DialogOptions.SkillClient.PostActivityAsync<Activity[]>(DialogOptions.BotId, skillInfo.AppId, skillInfo.SkillEndpoint, DialogOptions.SkillHostEndpoint, skillConversationId, activity, cancellationToken).ConfigureAwait(false);
var response = await DialogOptions.SkillClient.PostActivityAsync<ExpectedReplies>(DialogOptions.BotId, skillInfo.AppId, skillInfo.SkillEndpoint, DialogOptions.SkillHostEndpoint, skillConversationId, activity, cancellationToken).ConfigureAwait(false);

// Inspect the skill response status
if (!(response.Status >= 200 && response.Status <= 299))
Expand All @@ -177,10 +177,10 @@ private async Task<Activity> SendToSkillAsync(ITurnContext context, Activity act
}

Activity eocActivity = null;
if (activity.DeliveryMode == DeliveryModes.BufferedReplies && response.Body.Any())
if (activity.DeliveryMode == DeliveryModes.ExpectReplies && response.Body.Activities != null && response.Body.Activities.Any())
{
// Process replies in the response.Body.
foreach (var fromSkillActivity in response.Body)
foreach (var fromSkillActivity in response.Body.Activities)
{
if (fromSkillActivity.Type == ActivityTypes.EndOfConversation)
{
Expand Down
4 changes: 2 additions & 2 deletions libraries/Microsoft.Bot.Builder/BotFrameworkAdapter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -456,9 +456,9 @@ public override async Task<InvokeResponse> ProcessActivityAsync(ClaimsIdentity c

return (InvokeResponse)activityInvokeResponse.Value;
}
else if (context.Activity.DeliveryMode == DeliveryModes.BufferedReplies)
else if (context.Activity.DeliveryMode == DeliveryModes.ExpectReplies)
{
return new InvokeResponse { Status = (int)HttpStatusCode.OK, Body = context.BufferedReplies };
return new InvokeResponse { Status = (int)HttpStatusCode.OK, Body = new ExpectedReplies(context.BufferedReplyActivities) };
}

// For all non-invoke scenarios, the HTTP layers above don't have to mess
Expand Down
8 changes: 4 additions & 4 deletions libraries/Microsoft.Bot.Builder/TurnContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -70,10 +70,10 @@ public bool Responded
}

/// <summary>
/// Gets a list of activities to send when `context.Activity.DeliveryMode == 'bufferedReplies'`.
/// Gets a list of activities to send when `context.Activity.DeliveryMode == 'expectReplies'.
/// </summary>
/// <value>A list of activities.</value></placeholder>
public List<Activity> BufferedReplies { get; } = new List<Activity>();
public List<Activity> BufferedReplyActivities { get; } = new List<Activity>();

/// <summary>
/// Adds a response handler for send activity operations.
Expand Down Expand Up @@ -267,15 +267,15 @@ Task<ResourceResponse[]> SendActivitiesThroughCallbackPipeline(int nextCallbackI

async Task<ResourceResponse[]> SendActivitiesThroughAdapter()
{
if (Activity.DeliveryMode == DeliveryModes.BufferedReplies)
if (Activity.DeliveryMode == DeliveryModes.ExpectReplies)
{
var responses = new ResourceResponse[bufferedActivities.Count];
var sentNonTraceActivity = false;

for (var index = 0; index < responses.Length; index++)
{
var activity = bufferedActivities[index];
BufferedReplies.Add(activity);
BufferedReplyActivities.Add(activity);
responses[index] = new ResourceResponse();

sentNonTraceActivity |= activity.Type != ActivityTypes.Trace;
Expand Down
2 changes: 1 addition & 1 deletion libraries/Microsoft.Bot.Schema/DeliveryModes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,6 @@ public static class DeliveryModes
{
public const string Normal = "normal";
public const string Notification = "notification";
public const string BufferedReplies = "bufferedReplies";
public const string ExpectReplies = "expectReplies";
}
}
53 changes: 53 additions & 0 deletions libraries/Microsoft.Bot.Schema/ExpectedReplies.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
// <auto-generated>
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for
// license information.
//
// Code generated by Microsoft (R) AutoRest Code Generator.
// Changes may cause incorrect behavior and will be lost if the code is
// regenerated.
// </auto-generated>

namespace Microsoft.Bot.Schema
{
using Newtonsoft.Json;
using System.Collections.Generic;

/// <summary>
/// Replies in response to <see cref="DeliveryModes.ExpectReplies"/>
/// </summary>
public partial class ExpectedReplies
{
/// <summary>
/// Initializes a new instance of the ExpectedReplies class.
/// </summary>
public ExpectedReplies()
{
CustomInit();
}

/// <summary>
/// Initializes a new instance of the ExpectedReplies class.
/// </summary>
/// <param name="activities">A collection of Activities that conforms
/// to the ExpectedReplies schema.</param>
public ExpectedReplies(IList<Activity> activities = default(IList<Activity>))
{
Activities = activities;
CustomInit();
}

/// <summary>
/// An initialization method that performs custom operations like setting defaults
/// </summary>
partial void CustomInit();

/// <summary>
/// Gets or sets a collection of Activities that conforms to the
/// ExpectedReplies schema.
/// </summary>
[JsonProperty(PropertyName = "activities")]
public IList<Activity> Activities { get; set; }

}
}
8 changes: 4 additions & 4 deletions tests/Microsoft.Bot.Builder.Dialogs.Tests/SkillDialogTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -160,15 +160,15 @@ private static Mock<BotFrameworkClient> CreateMockSkillClient(Action<string, str
if (captureAction != null)
{
mockSkillClient
.Setup(x => x.PostActivityAsync<Activity[]>(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<Uri>(), It.IsAny<Uri>(), It.IsAny<string>(), It.IsAny<Activity>(), It.IsAny<CancellationToken>()))
.Returns(Task.FromResult(new InvokeResponse<Activity[]> { Status = returnStatus }))
.Setup(x => x.PostActivityAsync<ExpectedReplies>(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<Uri>(), It.IsAny<Uri>(), It.IsAny<string>(), It.IsAny<Activity>(), It.IsAny<CancellationToken>()))
.Returns(Task.FromResult(new InvokeResponse<ExpectedReplies> { Status = returnStatus }))
.Callback(captureAction);
}
else
{
mockSkillClient
.Setup(x => x.PostActivityAsync<Activity[]>(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<Uri>(), It.IsAny<Uri>(), It.IsAny<string>(), It.IsAny<Activity>(), It.IsAny<CancellationToken>()))
.Returns(Task.FromResult(new InvokeResponse<Activity[]> { Status = returnStatus }));
.Setup(x => x.PostActivityAsync<ExpectedReplies>(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<Uri>(), It.IsAny<Uri>(), It.IsAny<string>(), It.IsAny<Activity>(), It.IsAny<CancellationToken>()))
.Returns(Task.FromResult(new InvokeResponse<ExpectedReplies> { Status = returnStatus }));
}

return mockSkillClient;
Expand Down
6 changes: 3 additions & 3 deletions tests/Microsoft.Bot.Builder.Tests/BotFrameworkAdapterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -358,7 +358,7 @@ public async Task ContinueConversationAsyncWithAudience()
}

[TestMethod]
public async Task DeliveryModeBufferedReplies()
public async Task DeliveryModeExpectReplies()
{
var mockCredentialProvider = new Mock<ICredentialProvider>();
var mockHttpMessageHandler = new Mock<HttpMessageHandler>();
Expand All @@ -381,14 +381,14 @@ public async Task DeliveryModeBufferedReplies()
Type = ActivityTypes.Message,
ChannelId = Channels.Emulator,
ServiceUrl = "http://tempuri.org/whatever",
DeliveryMode = DeliveryModes.BufferedReplies,
DeliveryMode = DeliveryModes.ExpectReplies,
Text = "hello world"
};

var invokeResponse = await adapter.ProcessActivityAsync(string.Empty, inboundActivity, callback, CancellationToken.None);

Assert.AreEqual((int)HttpStatusCode.OK, invokeResponse.Status);
var activities = (List<Activity>)invokeResponse.Body;
var activities = ((ExpectedReplies)invokeResponse.Body).Activities;
Assert.AreEqual(3, activities.Count);
Assert.AreEqual("activity 1", activities[0].Text);
Assert.AreEqual("activity 2", activities[1].Text);
Expand Down
17 changes: 9 additions & 8 deletions tests/Skills/Parent/ParentBot.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,8 @@ protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivi
// incoming activity needs to be cloned for buffered replies
var cloneActivity = MessageFactory.Text(turnContext.Activity.Text);
cloneActivity.ApplyConversationReference(turnContext.Activity.GetConversationReference(), true);
cloneActivity.DeliveryMode = DeliveryModes.BufferedReplies;
var response1 = await _client.PostActivityAsync<Activity[]>(
cloneActivity.DeliveryMode = DeliveryModes.ExpectReplies;
var response1 = await _client.PostActivityAsync<ExpectedReplies>(
_fromBotId,
_toBotId,
new Uri("http://localhost:2303/api/messages"),
Expand All @@ -86,11 +86,12 @@ protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivi
cloneActivity,
cancellationToken);

if (response1.Status == (int)HttpStatusCode.OK)
if (response1.Status == (int)HttpStatusCode.OK && response1.Body?.Activities != null)
{
if (!(await InterceptOAuthCards(response1.Body, turnContext, cancellationToken)))
var activities = response1.Body.Activities.ToArray();
if (!(await InterceptOAuthCards(activities, turnContext, cancellationToken)))
{
await turnContext.SendActivitiesAsync(response1.Body, cancellationToken);
await turnContext.SendActivitiesAsync(activities, cancellationToken);
}
}
}
Expand All @@ -102,9 +103,9 @@ protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivi

var activity = MessageFactory.Text("parent to child");
activity.ApplyConversationReference(turnContext.Activity.GetConversationReference(), true);
activity.DeliveryMode = DeliveryModes.BufferedReplies;
activity.DeliveryMode = DeliveryModes.ExpectReplies;

var response = await _client.PostActivityAsync<Activity[]>(
var response = await _client.PostActivityAsync<ExpectedReplies>(
_fromBotId,
_toBotId,
new Uri("http://localhost:2303/api/messages"),
Expand All @@ -115,7 +116,7 @@ protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivi

if (response.Status == (int)HttpStatusCode.OK)
{
await turnContext.SendActivitiesAsync(response.Body, cancellationToken);
await turnContext.SendActivitiesAsync(response.Body?.Activities?.ToArray(), cancellationToken);
}

await turnContext.SendActivityAsync(MessageFactory.Text("parent: after child"), cancellationToken);
Expand Down