IActivityLogger не регистрирует PromptDialog.Choice текст - PullRequest
0 голосов
/ 12 июня 2018

Я использую IActivityLogger для записи разговора между ботом и пользователем.Здесь регистратор регистрирует все сообщения, кроме того, что PromptDialog генерирует текст .Choice ()

Я тестировал другие методы PromptDialog, такие как

PromptDialog.Confirm()
PromptDialog .Text()

Это работает, я имел в виду текстиз этих методов регистрируются, только текст PromptDialog.Choice не попадает в IActivityLogger.

Logger.cs

public class Logger : IActivityLogger
    {
        public async Task LogAsync(IActivity activity)
        {
            Debug.WriteLine(activity.AsMessageActivity()?.Text);
        }
    }

RootDialog.cs

public async Task StartAsync(IDialogContext context)
        {
            string[] choices = new string[]{ "choice 1" , "choice 2"};
            PromptDialog.Choice(context, resumeAfterPrompt, choices, "please choose an option.");
        }

        private async Task resumeAfterPrompt(IDialogContext context, IAwaitable<object> result)
        {
            await context.PostAsync((await result).ToString());
            context.Done<object>(null);
        }

Каждыйдругие сообщения отправляются через класс Logger, кроме PromptDialog.Choice () из RootDialog.

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

Я очень кратко проверил это, но оно должно работать.Если внутри вашей реализации IActivityLogger вы углубитесь дальше, чем просто activity.text.Некоторые действия могут понадобиться, и вы можете сделать это, просто используя некоторые операторы if.Я думаю, что есть больше случаев, в которых вам нужно будет углубиться в действие не только в свойстве Activity.text, чем в этом случае.Поэтому использование аналогичной стратегии для регистрации информации, которую вы хотите регистрировать для других уникальных типов контента, должно работать для вас.

Примерно так, например:

public class Logger : IActivityLogger
{
    public async Task LogAsync(IActivity activity)
    {
        IMessageActivity a = activity.AsMessageActivity();

        //loop through for cases there are multiple attachments
        for (int i = 0; i < a.Attachments.Count; i++)
        {
            //in the case of herocard
            if (a.Attachments[i].ContentType == "application/vnd.microsoft.card.hero")
            {
                //log something, i randomly picked a property
                Debug.WriteLine(a.Attachments[i].Name);
            }
            //another case
            if (a.Attachments[i].ContentType.Contains("image"))
            {
                //Maybe save the image somewhere
            }
        }
        Debug.WriteLine(activity.AsMessageActivity()?.Text);
    }
}
0 голосов
/ 13 июня 2018

текст PromptDialog.Choice не попадает в IActivityLogger

Я создаю образец и пытаюсь воспроизвести проблему. Я обнаружил, что он может попасть в регистратор, когда я выбрал параметр изPromptDialog.Choice список опций.

RootDialog:

[Serializable]
public class RootDialog : IDialog<object>
{
    public Task StartAsync(IDialogContext context)
    {
        context.Wait(MessageReceivedAsync);

        return Task.CompletedTask;
    }

    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
    {

        string[] choices = new string[] { "choice 1", "choice 2" };
        PromptDialog.Choice(context, resumeAfterPrompt, choices, "please choose an option.");
    }

    private async Task resumeAfterPrompt(IDialogContext context, IAwaitable<string> result)
    {
        string choice = await result;

        await context.PostAsync($"You sent {choice}");
        //context.Done<object>(null);
    }
}

Регистратор:

public class DebugActivityLogger : IActivityLogger
{
    public async Task LogAsync(IActivity activity)
    {
        Debug.WriteLine(activity.AsMessageActivity()?.Text);
    }
}

Результат теста эмулятора:

enter image description here

VS Окно вывода:

enter image description here

Кроме того, если вы установите контрольную точку внутри своего Logger для отладки и отслеживания активности, вы обнаружите, что activity.AsMessageActivity()?.Text будет "", когда он будет отображать HeroCard, чтобы предложить пользователю один из набора вариантов.

enter image description here

Таким образом, в окно вывода VS будет записана пустая строка.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...