TurnContext Respond 如何使用 Waterfalldialogs 工作?

2023-12-23

我的 TaskOnTurn 方法有问题。当我启动机器人时,它会发送欢迎消息并启动一个新的对话框,因为

if(!turnContext.Responded)

现在,当我在对话框中时,它会再次跳到最后一个 if 语句,并且当我已经在一个对话框中时,会启动一个新对话框。 !turnContext.Responded 如何工作? 然后我尝试启动对话框 if (turnContext.Activity.MembersAdded != null) 在等待SendWecomeMessage 下。那行不通。然后,它发送 1 条欢迎消息,然后启动 2 个对话。这也让我很困惑。

public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (turnContext == null)
            {
                throw new ArgumentNullException(nameof(turnContext));
            }

            var activity = turnContext.Activity;
            var dc = await _dialogs.CreateContextAsync(turnContext, cancellationToken);
            if (turnContext.Activity.Type == ActivityTypes.Message)
            {
                await dc.ContinueDialogAsync(cancellationToken);
            }
            else if (turnContext.Activity.Type == ActivityTypes.ConversationUpdate)
            {
                if (turnContext.Activity.MembersAdded != null)
                {
                    await SendWelcomeMessageAsync(turnContext, cancellationToken);
                }
            }
            else
            {
                await turnContext.SendActivityAsync($"{turnContext.Activity.Type} event detected", cancellationToken: cancellationToken);
            }

            if (!turnContext.Responded)
            {
                await dc.BeginDialogAsync(ReservationDialog, cancellationToken);
            }
        }

TurnContext.Responded https://learn.microsoft.com/en-us/dotnet/api/microsoft.bot.builder.turncontext.responded?view=botbuilder-dotnet-stable#Microsoft_Bot_Builder_TurnContext_Responded指示当前回合是否至少发送了一个响应。OnTurnAsync在每个瀑布步骤之间触发,所以如果ReservationDialog有提示,一旦用户回答提示,OnTurnAsync被解雇,并且由于机器人尚未在该 StepContext 内做出响应,TurnContext.Responded is false。这就是为什么你会在另一个对话框中间看到一个对话框。

您可以选择很多不同的路线OnTurnAsync。我绝对推荐 检查一些样品 https://github.com/Microsoft/BotBuilder-Samples/tree/master/samples/csharp_dotnetcore看看他们是如何做事的——他们中的大多数都得到了很好的评论。

public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
{
    var activity = turnContext.Activity;

    var dc = await Dialogs.CreateContextAsync(turnContext);

    // Execute on incoming messages
    if (activity.Type == ActivityTypes.Message)
    {
        if (string.IsNullOrWhiteSpace(activity.Text) && activity.Value != null)
        {
            activity.Text = JsonConvert.SerializeObject(activity.Value);
        }
    }

    var dialogResult = await dc.ContinueDialogAsync();

    // Execute based on different situations within a Dialog. See BasicBot for examples:
    // https://github.com/Microsoft/BotBuilder-Samples/blob/master/samples/csharp_dotnetcore/13.basic-bot/BasicBot.cs#L112
    if (!dc.Context.Responded)
    {
        switch (dialogResult.Status)
        {
            case DialogTurnStatus.Empty:
            case DialogTurnStatus.Waiting:
                break;
            case DialogTurnStatus.Complete:
                await dc.EndDialogAsync();
                break;
            default:
                await dc.CancelAllDialogsAsync();
                break;

        }
    }

    // Here's where we show welcome messages
    if (activity.Type == ActivityTypes.ConversationUpdate)
    {
        if (activity.MembersAdded != null)
        {
            foreach (var member in activity.MembersAdded)
            {
                // This makes sure the new user isn't the bot. It's a little different from some of the samples
                // because code has changed in the SDK and emulator
                if (member.Name != "Bot" && member.Name != null)
                {
                    await SendWelcomeMessageAsync(turnContext, cancellationToken);
                    await dc.BeginDialogAsync(ReservationDialog, cancellationToken);
                }
            }
        }
    }

    // Be sure you're saving ConversationState at the end since DialogContext derives from it
    await _conversationState.SaveChangesAsync(turnContext);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TurnContext Respond 如何使用 Waterfalldialogs 工作? 的相关文章

  • asp:repeater 折叠表行 - 已更新

    我想知道是否有人对我的问题有创造性的解决方案 我有一个从我的数据库填充的转发器 如下所示
  • 使用遗留代码(使用reinterpret_cast)真的是一种很好的技术吗?

    下面的代码来自一篇关于C 面试问题的帖子here https www toptal com c plus plus interview questions 我从来不知道这种技术 尽管它声称是一种很好的技术 我的问题是 什么情况下需要使用它
  • -ffast-math 可以安全地用于典型项目吗?

    在回答我建议的问题时 ffast math 有评论指出这是危险的 我个人的感觉是 在科学计算之外 是可以的 我还假设严肃的金融应用程序使用定点而不是浮点 当然 如果你想在你的项目中使用它 最终的答案是在你的项目上测试它 看看它有多大影响 但
  • C++ STL 映射,std::pair 作为键

    这就是我通过地图定义的方式 std map
  • 如何获取枚举数作为常量?

    From 枚举中定义的项目总数 https stackoverflow com questions 856154 total number of items defined in an enum 我发现我可以使用以下方法获取枚举数 Enum
  • MVVM:来自 FileOpenPicker 的图像绑定源

    我将 OnActivated 添加到 app xaml cs 中 它可以正常工作 protected async override void OnActivated IActivatedEventArgs args var continua
  • 处理器关联组 C#

    我使用的是 72 核的 Windows Server 2016 我看到有两组处理器 我的 net 应用程序将使用一个或其他组 我需要能够强制我的应用程序使用我选择的组 我看到下面的代码示例 但我无法使其工作 我可能传递了错误的变量 我希望应
  • 为类型列表创建别名并将其作为模板参数传递

    我正在使用可变参数模板来实现访问者模式 template
  • 使用 C 的另一个结构内的灵活长度结构数组

    你好 我正在尝试使用 C 来实现一个简单的结构 2 个盒子 每个盒子包含不同数量的颗粒 main 中传递的粒子的确切数量 我写了以下代码 typedef struct Particle float x float y float vx fl
  • 如何在 ASP.NET MVC 中处理会话数据

    假设我想存储一个名为language id在会议中 我想我也许可以做如下的事情 public class CountryController Controller WebMethod EnableSession true AcceptVer
  • 如何在单例类和未命名类之间进行选择?

    我会使用这样的单例 Singleton single Singleton instance single gt do it 我会使用这样的未命名类 single do it 我觉得单例模式除了具有可读的错误消息之外 与未命名的类相比没有任何
  • 为什么 xcode IDE 认为 `friend` 是保留字

    我一直在开发一个个人项目 并在我创建的新类中包含以下代码 property readonly getter isFriend BOOL friend 它似乎没有任何问题 当我构建它时 它可以编译得很好 但是当我们在xcode IDE看起来像
  • 我应该使用字节还是int?

    我记得曾在某处读到 即使您只需要字节 使用 Int32 更好 就性能而言 它 据说 仅适用于您不关心存储的情况 这是有效的吗 例如 我需要一个保存一周中某一天的变量 我是吗 int dayOfWeek or byte dayOfWeek E
  • 在 C++ 中,为什么 const 也可以工作时编译器选择非常量函数? [复制]

    这个问题在这里已经有答案了 例如 假设我有一堂课 class Foo public std string Name m maybe modified true return m name const std string Name cons
  • 大小为 k 的非连续子序列的最大值的最小值

    在开始之前 我希望这个问题不是重复的 我发现了几个类似的问题 但它们似乎都没有描述完全相同的问题 但如果它是重复的 我会很高兴看到一个解决方案 即使它与我的算法不同 我一直在尝试回答这个问题 https stackoverflow com
  • 对象变空似乎是 Hangfire 中的反序列化问题

    Hangfire 似乎无法反序列化我的原始版本Scheduler对象及其所有状态 我正在调用其 Execute 方法BackgroundJob Enqueue 如下所示 Scheduler new FileInFileOut FileIn
  • C 中的 2 个字符要短

    我有2个字符 Char 128和查尔2 如何将这些字符转为 Short640 in C 我试过了 unsigned short getShort unsigned char array int offset short returnVal
  • 使用属性和性能

    我正在优化我的代码 我注意到使用属性 甚至自动属性 对执行时间有深远的影响 请参阅下面的示例 Test public void GetterVsField PropertyTest propertyTest new PropertyTest
  • C 中的等效 plpgsql 触发器

    我有一个 PostgreSQL 9 0 服务器 并且在某些表上使用继承 因此我必须通过如下触发器模拟外键 CREATE OR REPLACE FUNCTION othertable before update trigger RETURNS
  • 将“C# 友好类型”名称转换为实际类型:“int” => typeof(int)

    我想得到一个System Type给定一个string指定 原始 类型C 友好名称 基本上与 C 编译器读取 C 源代码时的方式相同 我觉得描述我所追求的最好方式是单元测试的形式 我希望存在一种通用技术 可以使以下所有断言通过 而不是尝试对

随机推荐

  • 在python3.6上导入yarl或discord.py时出现问题

    由于列出的错误 我最近更新了discord py在这篇文章中 https stackoverflow com questions 63027848 discord py glitch or random error typeerror ne
  • 如何对齐引导表单中的元素

    请 看看我的代码 http www bootply com VcVDblSFK7 http www bootply com VcVDblSFK7 我希望将键符号和输入控件的范围放在同一行中 后 面是错误消息的范围 但我已经做了太多的编辑 并
  • 在c/c++中通过内存中的地址调用函数

    已知函数的原型及其在内存中的地址 是否可以从另一个进程或除了原型和内存地址之外一无所知的一段代码中调用该函数 如果可能的话 如何在代码中处理返回的类型 在现代操作系统上 每个进程有自己的地址空间并且地址仅在进程内有效 如果您想在其他进程中执
  • PowerManager.PARTIAL_WAKE_LOCK android

    我很困惑是否要获取这个唤醒锁 例如 我有这种类型的代码 是从onReceive of a BroadcastReceiever CONNECTIVITY CHANGE BOOT COMPLETED 等 异步地即我正在启动一个IntentSe
  • 如何读取 .lbl 文件

    我想读我的 lbl文件并将其数据存储到数据库列中 因此 每当用户想要修改它时 他们可以创建一个新的 lbl来自数据库的文件 我已经转换了我的 lbl使用下面所示的代码片段将数据转换为二进制 byte fileBytes File ReadA
  • 使用mock模拟嵌套属性

    我有一个返回对象的函数调用 r Foo x y where r具有丰富的嵌套属性集 例如 我可以访问r prop a prop b prop c 我想嘲笑Foo 这样特定的叶子属性r被修改 即使得r prop a prop b prop c
  • 使用 libxml2 进行递归 XPath 查询的最有效方法是什么?

    我为 libxml2 编写了一个 C 包装函数 它使我可以轻松地对 XML 文档进行查询 bool XPathQuery const std string doc const std string query XPathResults re
  • 阻止导航控制器影响其他视图控制器

    我有一个应用程序 它使用带有三个视图控制器的导航控制器来进行分步用户设置 因此 第一个视图将是步骤 1 第二个视图将是步骤 2 等等 所有这些都将嵌入到导航控制器中 以便用户能够来回移动 但是 一旦完成此设置并且用户按下 完成 按钮 应用程
  • Android 数据库被其他线程锁定

    我正在处理 android sqLite 数据库 其中我无法将记录插入数据库 在代码中 我在启动应用程序时仅打开数据库一次 并且设置了对我的应用程序类变量的引用 以便我可以从代码的任何部分访问数据库 并且效果很好 问题是 我可以访问数据库
  • 从文件名中提取日期

    我遇到一种情况 我需要从文件名中提取日期 其一般模式是 filename YYYYMMDD fileExtension e g xxx 20100326 xls or x2v 20100326 csv 下面的程序完成了这项工作 Number
  • 获取复选框的多个值

    我如何使用此代码在 codeigniter 中获取多个复选框值
  • 为什么 Python 列表上的 `for` 比 Numpy 数组上的 `for` 更快?

    因此 在没有讲一个很长的故事的情况下 我正在编写一些代码 从二进制文件中读取一些数据 然后使用 for 循环遍历每个点 所以我完成了代码 但它运行得慢得离谱 我从大约 128 个数据通道循环了大约 60 000 个点 这需要一分钟或更长时间
  • 无法使用 SAX 读取某些属性

    我正在尝试使用 SAX 解析该文档
  • Scala 变量字符串插值而不是文字

    首先道歉 作为 Scala 的初学者 我找不到更好的措辞来回答这个问题 我有一个属性文件 需要在其中定义一些参数化命令 或 sql 查询 以下是一个示例 section abc stage StageA query Select count
  • 创建图标字体的工具[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想创建一个在网络应用程序中使用的图标字体 fontAwesome Iconic fontomas 是
  • 类 API 中的 getDeclaredConstructors 和 getConstructors 有什么区别?

    我注意到在 Java Reflection API 中有两种不同的调用构造函数的方法 getDeclaredConstructors getConstructors方法 尽管 Java 文档略有不同 getDeclaredConstruct
  • 如何从 xml 获取节点而不知道其在 flex 中的级别?

    我的问题是 如何获得我想要插入的节点 I e
  • 如何关闭InputStream和OutputStream?

    我使用以下代码来关闭与服务器的连接的 InputStream 和 OutputStream try if mInputStream null mInputStream close mInputStream null if mOutputSt
  • 用线条替换 QTextEdit 边界框

    这个问题是对边界框 https stackoverflow com questions 46911925 getting the bounding box of qtextedit selection例子 我试图了解如何绘制简单的形状 我只
  • TurnContext Respond 如何使用 Waterfalldialogs 工作?

    我的 TaskOnTurn 方法有问题 当我启动机器人时 它会发送欢迎消息并启动一个新的对话框 因为 if turnContext Responded 现在 当我在对话框中时 它会再次跳到最后一个 if 语句 并且当我已经在一个对话框中时