public async Task Calculate_Script_Scorable_As_Action_Interrupt_Stack()
        {
            var echo = Chain.PostToChain().Select(msg => $"echo: {msg.Text}").PostToUser().Loop();

            var scorable = Actions
                           .Bind((string expression, IBotData data, IDialogTask stack, IMessageActivity activity, CancellationToken token) =>
            {
                var dialog    = new CalculatorDialog();
                activity.Text = expression;
                return(stack.InterruptAsync(dialog, activity, token));
            })
                           .When(new Regex(@".*calculate\s*(?<expression>.*)"))
                           .Normalize();

            echo = echo.WithScorable(scorable);

            using (var container = Build(Options.ResolveDialogFromContainer))
                using (var scope = container.BeginLifetimeScope(
                           builder => builder.RegisterInstance(echo).As <IDialog <object> >()))
                {
                    await AssertScriptAsync(scope,
                                            "hello",
                                            "echo: hello",
                                            "calculate 2 + 3",
                                            "5",
                                            "world",
                                            "echo: world",
                                            "2 + 3",
                                            "echo: 2 + 3",
                                            "calculate 4 / 2",
                                            "2"
                                            );
                }
        }
示例#2
0
        public async Task Calculate_Script_Scorable_As_Action_Reset_Stack()
        {
            var echo = Chain.PostToChain().Select(msg => $"echo: {msg.Text}").PostToUser().Loop();

            var scorable = Actions
                           .Bind(async(string expression, IDialogStack stack, IMessageActivity activity, CancellationToken token) =>
            {
                var dialog    = new CalculatorDialog();
                activity.Text = expression;
                stack.Reset();
                await stack.Forward(dialog.Loop(), null, activity, token);
            })
                           .When(new Regex(@".*calculate\s*(?<expression>.*)"))
                           .Normalize();

            echo = echo.WithScorable(scorable);

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

                await AssertScriptAsync(container,
                                        "hello",
                                        "echo: hello",
                                        "calculate 2 + 3",
                                        "5",
                                        "2 + 2",
                                        "4"
                                        );
            }
        }
        protected override async Task PostAsync(IActivity item, string state, CancellationToken token)
        {
            var dialog = new CalculatorDialog();

            // let's strip off the prefix in favor of the actual arithmetic expression
            var message = (IMessageActivity)item;

            message.Text = state;

            await this.stack.Forward(dialog.Void(this.stack), null, message, token);
        }