在机器人框架中覆盖 Context.PostAsync

Override Context.PostAsync in the bot framework

我注意到使用 Bot Framework 和 Telegram 频道时,像 :) 这样的笑脸不会转换为表情符号。

不过,其实很简单,我们只需要将:)改成:smile:,一个好看的emoji就出现了。

最佳解决方案是覆盖 context.PostAsync() 函数,执行那种字符串替换,然后继续。

我们可以覆盖这个方法,而不重新编译所有框架吗?

谢谢:)

我假设您要查看的是更改机器人发送给用户的消息。

当然,基本选项是将检查频道的逻辑添加到您的机器人对话框中,仅此而已。但是,我怀疑您想在其他对话框中重新利用该逻辑,这也可能意味着某个地方的静态方法允许您执行以下操作:

context.PostAsync(Utils.TransformMessage(message));

现在,如果您真的想采用最简洁的方法,我认为应该实现您自己的 IMessageActivityMapper 并将其注册到 Autofac 容器中,这样 MapToChannelData_BotToUser 实现最终会调用它(参见 here)。

有一些 IMessageActivityMapper here and here 的实现你可以看看;虽然界面非常简单,但整个想法是您收到 IMessageActivity,更新任何现有属性(在您的情况下,它将是文本 属性)和更新后的 return IMessageActivity 以便可以发布给用户。

准备好实施后,您可以在 Autofac 中注册它,在 Global.asax.cs.

中执行以下操作
protected void Application_Start(object sender, EventArgs e)
{
    {
        // http://docs.autofac.org/en/latest/integration/webapi.html#quick-start
        var builder = new ContainerBuilder();

        // Register your mapper 
        builder
        .RegisterType<MyActivityMapper>()
        .AsImplementedInterfaces()
        .SingleInstance();

        // Get your HttpConfiguration.
        var config = GlobalConfiguration.Configuration;

        // Register your Web API controllers.
        builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

        // Set the dependency resolver to be Autofac.
        var container = builder.Build();
        config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
    }
}