【问题标题】:BotFramework - Repeat last message using c#BotFramework - 使用 c# 重复最后一条消息
【发布时间】:2017-07-28 12:59:18
【问题描述】:

我正在使用 C# 构建一个使用 Microsoft Bot Framework 的机器人。我正在使用对话框控制我的流程,并使用快速回复作为按钮,当发送新消息时它们会消失。

我还创建了一个全局命令来帮助用户。当用户键入“帮助”时,机器人会提供一些关于它可以做什么的信息。

问题是,如果用户请求帮助,快速回复将消失,用户可能不知道如何继续对话。我想知道在发送帮助后是否有任何方法可以重复上次发送的消息(帮助不是对话框,Scorable 发送消息)。

谢谢

【问题讨论】:

  • 请提供相关代码帮助我们找到手头的问题。
  • @Abbas 我的代码中没有一个特定部分不起作用,我想知道如何做一些新的事情。我实现了一个全局处理程序,就像演示的 here

标签: c# botframework


【解决方案1】:

没有什么能阻止您记录用户发送的消息。如果您构建自己的 UI,您可以用一种常见的方式来完成,例如,按下向上箭头可以让用户循环执行他们的命令。

activity.Text 有 text 命令,只需将其添加到您自己的列表中,使用机器人状态或任何您想要的机制,因为您需要存储机制。

还有其他方法,不要忘记维护每个对话框的状态,因此一旦您再次调用它,它将从中断处继续。

【讨论】:

    【解决方案2】:

    我结束了@Andrei Dragotoniu 的想法,但我想提供一些实现细节。

    短篇小说

    将最后(或更多,如果您愿意)发送的消息保存在某个存储中(您可以使用对话 ID 来识别它)。需要时重新发送。

    说来话长

    要保存最后一条消息,我发现最简单的方法是创建一个 IBotToUser 实现并将其添加到 IBotToUser 链中。

    public class StoreLastActivity : IBotToUser
    {
        private readonly IBotToUser inner;
    
        public StoreLastActivity(IBotToUser inner)
        {
            SetField.NotNull(out this.inner, nameof(inner), inner);
        }
    
        public IMessageActivity MakeMessage()
        {
            return this.inner.MakeMessage();
        }
    
        public async Task PostAsync(IMessageActivity message, CancellationToken cancellationToken = default(CancellationToken))
        {
            // Save the message here!!!
    
            await this.inner.PostAsync(message, cancellationToken);
        }
    }
    

    Global.asax.cs 或某些模块类中注册该类和新链。更新对话容器。

    Conversation.UpdateContainer(builder =>
    {
        // Registers the class the saves the last send message for each conversation.
        builder
            .RegisterKeyedType<StoreLastActivity, IBotToUser>()
            .InstancePerLifetimeScope();
    
        // Adds the class on the IBotToUser chain.
        builder
            .RegisterAdapterChain<IBotToUser>
            (
                typeof(AlwaysSendDirect_BotToUser),
                typeof(AutoInputHint_BotToUser),
                typeof(MapToChannelData_BotToUser),
                typeof(StoreLastActivity),
                typeof(LogBotToUser)
            )
            .InstancePerLifetimeScope();
    }
    

    这意味着发送给用户的每条消息都会经过StoreLastActivity.PostAsync,因此您可以将其保存在任何地方并使用message.Conversation.Id 作为id。我保存了整个IMessageActivity,因为它并不总是只有文本,它可能包含卡片、按钮等......

    现在只需检索IMessageActivity 并在需要时发送。

    如果有人有更简单的解决方案,我想听听。

    谢谢。

    【讨论】:

      猜你喜欢
      • 2019-04-22
      • 1970-01-01
      • 1970-01-01
      • 2016-11-11
      • 2011-07-03
      • 2018-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多