Microsoft Bot Framework IDialogContext.Call() 在使用 Slack 时不工作

Microsoft Bot Framework IDialogContext.Call() not working when using Slack

我使用 IDialogContext.Call() 在我的机器人中调用了一个简单的子对话。当用户键入 "new project" 时,将调用以下代码:

...
context.Call(new NewProjectDialog(), NewProjectConfirmed);
...

NewProjectDialog() 只是询问项目名称,然后在返回 NewProjectConfirmed() 之前保存它

[Serializable]
public class NewProjectDialog : IDialog<Project>
{
    public async Task StartAsync(IDialogContext context)
    {
        await context.PostAsync("What is the name of the project?");
        context.Wait(this.MessageReceivedAsync);
    }

    public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        var message = await result;
        Project p = new Project();        
        //Saving project here...

        await context.PostAsync($"OK. Your project '{message.Text}' was created.");
        context.Done(p);
    }
}

当从模拟器、Skype 或 Webchat 调用机器人时,一切都按预期工作。用户通过键入 "new project" 请求新项目,bot 请求名称,它等待,一旦用户输入项目名称,bot 就会确认新项目的创建。

但是当我从 Slack 调用相同的方法时,当用户通过键入 "new project" 请求新项目时,文本 "new project" 被传递到 NewProjectDialog。它询问项目名称,但没有等待它进一步传递 "new project" 并将其保存为项目名称。

不太确定我错过了什么。 iDialogContext.Wait() 与 Slack 的工作方式不同,或者 Call() 函数似乎 post 向子对话框发送的消息应该像 Forward() 一样。

感谢一些 Howdy developers 我发现了这个问题。

当机器人已经被授权给团队,然后其他人进来再次授权机器人时,就会发生这种情况。发生这种情况时,似乎有两个机器人 运行 然后使用相同的 RTM 连接 post 两次连接到频道。

我不知道我是如何在同一个 Slack 客户端中获得 2 个机器人的。但是一旦我删除并重新安装我的机器人,它就会按预期开始工作。

同样的问题导致了其他症状: