8

C# Bot Builder を使用してボットに取り組んでいます。

これで、連鎖ダイアログを処理する方法の例がかなりあることがわかりました。FacebookAuthDialog や ChainedEchoDialog と同様です。

私がしたいこと: ユーザーは認証ダイアログを通過する必要があり、それが完了したら、すぐにユーザーを「UserDialog」に入れ、認証が必要なすべての機能を使用できるようにしたいと考えています。

ここに私のコードがあります:

public static readonly IDialog<string> dialog = Chain
        .PostToChain()
        .Switch(
            new Case<Message, IDialog<string>>((msg) =>
            {
                var userInfo = new StorageClient().GetUser(msg.From.Id);

                if (userInfo != null && userInfo.Activated)
                    return false;
                else
                    return true;
            }, (ctx, msg) =>
            {
                return Chain.ContinueWith(new AuthenticationDialog(),
                            async (context, res) =>
                            {
                                var result = await res;
                                return Chain.Return($"You successfully activated your account.");
                            });
            }),
            new Case<Message, IDialog<string>>((msg) =>
            {
                var userInfo = new StorageClient().GetUser(msg.From.Id);
                if (userInfo != null && userInfo.Activated)
                    return true;
                else
                    return false;
            }, (ctx, msg) =>
            {
                var service = new LuisService();
                // User wants to login, send the message to Facebook Auth Dialog
                return Chain.ContinueWith(new UserDialog(msg, service),
                    async (context, res) =>
                    {
                        return Chain.Return($"");
                    });
            }),
            new DefaultCase<Message, IDialog<string>>((ctx, msg) =>
            {
                return Chain.Return("Something went wrong.");
            })
            ).Unwrap().PostToUser();

この種の作品。このダイアログを MessageController から呼び出します

await Conversation.SendAsync(message, () => ManagingDialog.dialog);

しかし、これは正しくありません。また、ダイアログが終了するたびに、このダイアログを 2 回呼び出す必要があります。これは、ユーザーが何かを入力してもダイアログが開始されるだけなので、何も起こらないためです。

AuthenticationDialog ケースの実行後に別の ContinueWith を配置しようとしましたが、機能しませんでした。

おそらくいくつかのコードスニペットで助けていただければ幸いです。私は完全に無知です。

ご挨拶

4

1 に答える 1

3

BotBuilder の例を次に示します。

 public async Task SampleChain_Quiz()
    {
        var quiz = Chain
            .PostToChain()
            .Select(_ => "how many questions?")
            .PostToUser()
            .WaitToBot()
            .Select(m => int.Parse(m.Text))
            .Select(count => Enumerable.Range(0, count).Select(index => Chain.Return($"question {index + 1}?").PostToUser().WaitToBot().Select(m => m.Text)))
            .Fold((l, r) => l + "," + r)
            .Select(answers => "your answers were: " + answers)
            .PostToUser();

        using (var container = Build(Options.ResolveDialogFromContainer))
        {
            var builder = new ContainerBuilder();
            builder
                .RegisterInstance(quiz)
                .As<IDialog<object>>();
            builder.Update(container);

            await AssertScriptAsync(container,
                "hello",
                "how many questions?",
                "3",
                "question 1?",
                "A",
                "question 2?",
                "B",
                "question 3?",
                "C",
                "your answers were: A,B,C"
                );
        }
    }

BotBuilder の github サイトには、このトピックに関する良い議論があります。

于 2016-06-28T18:54:27.780 に答える