对话框堆栈未重置

时间:2018-10-22 08:50:06

标签: botframework direct-line-botframework

我有一个可评分的对话框,该对话框将检查传入的消息是否等于“ resetconversation”。设置为true时,对话框将使用PostAsync方法重置对话框堆栈。

点击postasync方法后,对话框堆栈将按预期方式重置,但是当我再次发送消息时,该对话框会重新出现,并且对话就像从未重置一样进行。

[note]:我注意到,当PromptDialog.Choice()需要输入时,会发生此问题。

下面是可评分注册和可评分对话框类。 谢谢!

注册我的评分对话框

Conversation.UpdateContainer(
            builder =>
            {
                builder.RegisterModule(new AzureModule(Assembly.GetExecutingAssembly()));


                string conn = ConfigurationManager.ConnectionStrings["BotDataContextConnectionString"].ConnectionString;

                var store = new SqlBotDataStore(conn);

                builder.Register(c => store)
                    .Keyed<IBotDataStore<BotData>>(AzureModule.Key_DataStore)
                    .AsSelf()
                    .SingleInstance();

                //Scorable to check if dialog stack reset has been requested
                builder.RegisterType<HandleResetRequestScorable>()
                .AsSelf()
                .As<IScorable<IActivity, double>>();


});

评分对话框:

    [Serializable]
    public class HandleResetRequestScorable : ScorableBase<IActivity, bool, double>
    {

        private readonly IBotToUser _botToUser;

        private readonly IDialogStack _dialogStack;

        private bool _isMessageType { get; set; }


        public HandleResetRequestScorable(IBotToUser botToUser, IDialogStack dialogTask)
        {
            SetField.NotNull(out _botToUser, nameof(_botToUser), botToUser);

            //SetField.NotNull(out _dialogStack, nameof(_dialogStack), dialogTask);

        }


        protected override async Task<bool> PrepareAsync(IActivity activity, CancellationToken token)
        {
            string message = string.Empty;

            if (activity.Type == ActivityTypes.Event)
            {
                _isMessageType = false;
                message = activity.AsEventActivity().Name.ToLower();
            }
            else
            {
                _isMessageType = true;
                message = activity.AsMessageActivity().Text.ToLower();
            }



            if (message == "resetconversation")
                return true;


            return false;
        }


        protected override bool HasScore(IActivity item, bool state)
        {
            return state;
        }


        protected override double GetScore(IActivity item, bool state)
        {
            return state ? 1.0 : 0;
        }


        protected override async Task PostAsync(IActivity activity, bool state, CancellationToken token)
        {
            try
            {

                var message = activity as IMessageActivity;
                string[] data = message.Value.ToString().Split('|');
                using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, activity as Activity))
                {
                    //get the conversation related data
                    var botData = scope.Resolve<IBotData>();
                    await botData.LoadAsync(default(CancellationToken));

                    //get the dialog stack
                    var convoStack = scope.Resolve<IDialogStack>();
                    convoStack.Reset();


                    if (_isMessageType)
                    {
                        await _botToUser.PostAsync("Conversation reset complete.");
                        await _botToUser.PostAsync("Hi");
                    }

                    await botData.FlushAsync(default(CancellationToken));
                }
            }
            catch
            {
                throw;
            }


        }

        protected override Task DoneAsync(IActivity item, bool state, CancellationToken token)
        {
            //throw new NotImplementedException();
            return Task.CompletedTask;
        }

    }
}

0 个答案:

没有答案