How can I access Bot Framework ConversationData outside of a dialog like in messages controller?

前端 未结 2 532
小鲜肉
小鲜肉 2020-12-17 03:11

In a dialog within my bot, I store a flag value in the ConversationData like so:

context.ConversationData.SetValue(\"SomeFlag\", true);

Lat

相关标签:
2条回答
  • 2020-12-17 03:47

    Initialize BotState object with StateClient as below. Try the below code

       public static T GetStateData<T>(Activity activity, string key)
        {
            BotState botState = new BotState(activity.GetStateClient());
            BotData botData = botState.GetConversationData(activity.ChannelId, activity.Conversation.Id);
            return botData.GetProperty<T>(key);
        }
    
    0 讨论(0)
  • 2020-12-17 03:58

    The following should work for what you need:

    if (activity.Type == ActivityTypes.Message)
    {
    
        var message = activity as IMessageActivity;
        using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message))
        {
            var botDataStore = scope.Resolve<IBotDataStore<BotData>>();
            var key = Address.FromActivity(message);
    
            ConversationReference r = new ConversationReference();
            var userData = await botDataStore.LoadAsync(key, BotStoreType.BotUserData, CancellationToken.None);
    
            //you can get/set UserData, ConversationData, or PrivateConversationData like below
            //set state data
            userData.SetProperty("key 1", "value1");
            userData.SetProperty("key 2", "value2");
            //get state data
            userData.GetProperty<string>("key 1");
            userData.GetProperty<string>("key 2");
    
            await botDataStore.SaveAsync(key, BotStoreType.BotUserData, userData, CancellationToken.None);
            await botDataStore.FlushAsync(key, CancellationToken.None);
        }
        await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());
    }
    
    0 讨论(0)
提交回复
热议问题