diff --git a/libraries/Adapters/Microsoft.Bot.Builder.Adapters.Facebook/FacebookAdapter.cs b/libraries/Adapters/Microsoft.Bot.Builder.Adapters.Facebook/FacebookAdapter.cs index e4c91923f8..4b1e799fe5 100644 --- a/libraries/Adapters/Microsoft.Bot.Builder.Adapters.Facebook/FacebookAdapter.cs +++ b/libraries/Adapters/Microsoft.Bot.Builder.Adapters.Facebook/FacebookAdapter.cs @@ -92,7 +92,7 @@ public override async Task SendActivitiesAsync(ITurnContext } else { - var message = FacebookHelper.ActivityToFacebook(activity); + var message = CreateFacebookMessageFromActivity(activity); if (message.Message?.Attachment != null) { @@ -266,5 +266,15 @@ public async Task ProcessAsync(HttpRequest httpRequest, HttpResponse httpRespons } } } + + /// + /// Factory method to create the instance of the to be sent to Facebook. + /// + /// An instance to build the message. + /// A built from the activity instance. + protected virtual FacebookMessage CreateFacebookMessageFromActivity(Activity activity) + { + return FacebookHelper.ActivityToFacebook(activity); + } } } diff --git a/tests/Adapters/Microsoft.Bot.Builder.Adapters.Facebook.PrimaryTestBot/FacebookAdapterWithTag.cs b/tests/Adapters/Microsoft.Bot.Builder.Adapters.Facebook.PrimaryTestBot/FacebookAdapterWithTag.cs new file mode 100644 index 0000000000..da769a17c8 --- /dev/null +++ b/tests/Adapters/Microsoft.Bot.Builder.Adapters.Facebook.PrimaryTestBot/FacebookAdapterWithTag.cs @@ -0,0 +1,37 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Microsoft.Bot.Schema; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; + +namespace Microsoft.Bot.Builder.Adapters.Facebook.PrimaryTestBot +{ + /// + /// A specialized to append tags to messages. + /// + public class FacebookAdapterWithTag : FacebookAdapter + { + public FacebookAdapterWithTag(IConfiguration configuration, FacebookAdapterOptions options = null, ILogger logger = null) + : base(configuration, options, logger) + { + } + + public FacebookAdapterWithTag(FacebookClientWrapper facebookClient, FacebookAdapterOptions options, ILogger logger = null) + : base(facebookClient, options, logger) + { + } + + protected override FacebookMessage CreateFacebookMessageFromActivity(Activity activity) + { + // This override takes the facebook message created by the base adapter + // and sets the tag to "ACCOUNT_UPDATE" as defined in + // https://developers.facebook.com/docs/messenger-platform/send-messages/message-tags#sending + // This bypasses the 24 hrs check for responses to a bot that don't go through the messenger client. + var message = base.CreateFacebookMessageFromActivity(activity); + message.MessagingType = "MESSAGE_TAG"; + message.Tag = "ACCOUNT_UPDATE"; + return message; + } + } +} diff --git a/tests/Adapters/Microsoft.Bot.Builder.Adapters.Facebook.PrimaryTestBot/Startup.cs b/tests/Adapters/Microsoft.Bot.Builder.Adapters.Facebook.PrimaryTestBot/Startup.cs index 765ff64db1..39fa439f45 100644 --- a/tests/Adapters/Microsoft.Bot.Builder.Adapters.Facebook.PrimaryTestBot/Startup.cs +++ b/tests/Adapters/Microsoft.Bot.Builder.Adapters.Facebook.PrimaryTestBot/Startup.cs @@ -1,5 +1,9 @@ -using Microsoft.AspNetCore.Builder; +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; +using Microsoft.Bot.Builder.Adapters.Facebook.PrimaryTestBot; using Microsoft.Bot.Builder.Adapters.Facebook.PrimaryTestBot.Bots; using Microsoft.Bot.Builder.Integration.AspNet.Core; using Microsoft.Extensions.DependencyInjection; @@ -14,7 +18,7 @@ public void ConfigureServices(IServiceCollection services) services.AddControllers().AddNewtonsoftJson(); // Create the Bot Framework Facebook Adapter. - services.AddSingleton(); + services.AddSingleton(); // Create the bot as a transient. In this case the ASP Controller is expecting an IBot. services.AddTransient(); diff --git a/tests/Microsoft.Bot.Builder.Dialogs.Tests/DialogStateManagerTests.cs b/tests/Microsoft.Bot.Builder.Dialogs.Tests/DialogStateManagerTests.cs index 2f29357fe8..907222dc21 100644 --- a/tests/Microsoft.Bot.Builder.Dialogs.Tests/DialogStateManagerTests.cs +++ b/tests/Microsoft.Bot.Builder.Dialogs.Tests/DialogStateManagerTests.cs @@ -318,27 +318,27 @@ public async Task TestTryGetValueWithWrongType() await CreateDialogContext(async (dc, ct) => { dc.State.SetValue("user.name.first", "joe"); - Assert.Equal(false, dc.State.TryGetValue("user.name.first", out var val)); - Assert.Equal(true, dc.State.TryGetValue("user.name.first", out var val2)); + Assert.False(dc.State.TryGetValue("user.name.first", out var val)); + Assert.True(dc.State.TryGetValue("user.name.first", out var val2)); Assert.Equal("joe", val2); dc.State.SetValue("user.age", 19); - Assert.Equal(true, dc.State.TryGetValue("user.age", out var val3)); + Assert.True(dc.State.TryGetValue("user.age", out var val3)); Assert.Equal("19", val3); - Assert.Equal(true, dc.State.TryGetValue("user.age", out var val4)); + Assert.True(dc.State.TryGetValue("user.age", out var val4)); Assert.Equal(19, val4); dc.State.SetValue("user.salary", "10000"); - Assert.Equal(true, dc.State.TryGetValue("user.salary", out var val5)); + Assert.True(dc.State.TryGetValue("user.salary", out var val5)); Assert.Equal("10000", val5); - Assert.Equal(true, dc.State.TryGetValue("user.salary", out var val6)); + Assert.True(dc.State.TryGetValue("user.salary", out var val6)); Assert.Equal(10000, val6); dc.State.SetValue("user.foo", foo); - Assert.Equal(false, dc.State.TryGetValue("user.foo", out var val7)); - Assert.Equal(true, dc.State.TryGetValue("user.foo", out var val8)); - Assert.Equal(false, dc.State.TryGetValue>("user.foo", out var val9)); - Assert.Equal(true, dc.State.TryGetValue("user.foo", out var val10)); + Assert.False(dc.State.TryGetValue("user.foo", out var val7)); + Assert.True(dc.State.TryGetValue("user.foo", out var val8)); + Assert.False(dc.State.TryGetValue>("user.foo", out var val9)); + Assert.True(dc.State.TryGetValue("user.foo", out var val10)); }).StartTestAsync(); }