From f117e31bdb9fef98fe0b7ba523655b701697354f Mon Sep 17 00:00:00 2001 From: Gabo Gilabert Date: Wed, 30 Sep 2020 23:34:43 -0400 Subject: [PATCH 1/3] Refactored FacebookAdapter to add a virtual metho for FB message creation that allows the devs to manipulate the FB message instanc before it gets sent to Facebook. Added FacebookAdapterWithTag adapter to FB test bot so we can add the "ACCOUNT_UPDATE" tag as defined in https://developers.facebook.com/docs/messenger-platform/send-messages/message-tags#sending --- .../FacebookAdapter.cs | 12 ++++++- .../FacebookAdapterWithTag.cs | 36 +++++++++++++++++++ .../Startup.cs | 8 +++-- 3 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 tests/Adapters/Microsoft.Bot.Builder.Adapters.Facebook.PrimaryTestBot/FacebookAdapterWithTag.cs 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..17d30527eb --- /dev/null +++ b/tests/Adapters/Microsoft.Bot.Builder.Adapters.Facebook.PrimaryTestBot/FacebookAdapterWithTag.cs @@ -0,0 +1,36 @@ +// 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.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(); From ac55f24d3adbcd13e54865bf8564b37f5ca7c29a Mon Sep 17 00:00:00 2001 From: Gabo Gilabert Date: Thu, 1 Oct 2020 12:22:27 -0400 Subject: [PATCH 2/3] Fixed errors in DialogStateManagerTests --- .../DialogStateManagerTests.cs | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) 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(); } From 3cfeda6bdd5079665a010e1c2ba46dba76ba0d6b Mon Sep 17 00:00:00 2001 From: Gabo Gilabert Date: Thu, 1 Oct 2020 14:34:43 -0400 Subject: [PATCH 3/3] Added missing MessagingType property. --- .../FacebookAdapterWithTag.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/Adapters/Microsoft.Bot.Builder.Adapters.Facebook.PrimaryTestBot/FacebookAdapterWithTag.cs b/tests/Adapters/Microsoft.Bot.Builder.Adapters.Facebook.PrimaryTestBot/FacebookAdapterWithTag.cs index 17d30527eb..da769a17c8 100644 --- a/tests/Adapters/Microsoft.Bot.Builder.Adapters.Facebook.PrimaryTestBot/FacebookAdapterWithTag.cs +++ b/tests/Adapters/Microsoft.Bot.Builder.Adapters.Facebook.PrimaryTestBot/FacebookAdapterWithTag.cs @@ -29,6 +29,7 @@ protected override FacebookMessage CreateFacebookMessageFromActivity(Activity ac // 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; }