Чат-бот не отправляет сообщение обратно в Microsoft Teams

Что касается лазурного чат-бота, я хочу, чтобы он задавал мне простой вопрос после своего ответа, чтобы я мог, например, дать обратную связь в ответ. Я использую класс HeroCard.

диалоговое окно

private async Task ShowWeatherResult(IDialogContext context, LuisResult result)
{
    bool found = false;
    foreach (var entity in result.Entities)
    {
        if (entity.Type.Equals(Entity_Location))
        {
            WeatherAPI weather = new WeatherAPI(entity.Entity);
            found = true;
            await context.PostAsync(weather.ForecastReport());
            await Task.Delay(500);

            // ask for happiness
            Attachment attachment = new Attachment()
            {
                ContentType = HeroCard.ContentType,
                Content = CardsBuilder.CreateHappinessCard()
            };
            var reply = context.MakeMessage();
            reply.Attachments.Add(attachment);
            await context.PostAsync(reply, CancellationToken.None);

            context.Wait(MessageReceivedAsync);
        }
    }
    if (!found)
    {
        await context.PostAsync($"I don't speak human fluently, try another question asking for a specific city!");
        context.Wait(MessageReceived);
    }
}


public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
{
    var message = await result;

    if (message.Text != null)
    {
        //
        var happiness = new HappinessAPI();

        // Got an Action Submit
        string value = message.Text;
        //string submitType = value.Type.ToString();
        switch (value)
        {
            case "ShowGif":
                await context.PostAsync(happiness.ShowGif(context), CancellationToken.None);
                await Task.Delay(500);
                break;
            case "HappinessSearch":
                await context.PostAsync(happiness.GetJoke(context), CancellationToken.None);
                await Task.Delay(500);
                break;
            default:
                break;
        }
    }

    context.Wait(MessageReceived);
}

HerdoCard

    internal static HeroCard CreateHappinessCard()
    {
        HeroCard card = new HeroCard()
        {
            Title = "Hi!",
            Text = "Are you happy?",
            Buttons = new List<CardAction>()
            {
                new CardAction()
                {
                    Title = "Yes",
                    Text = "Yes",
                    DisplayText = "Yes",
                    Type = ActionTypes.PostBack,
                    Value = "ShowGif"
                },
                new CardAction()
                {
                    Title = "Meh...",
                    Text ="No",
                    DisplayText = "Meh...",
                    Type = ActionTypes.PostBack,
                    Value = "HappinessSearch"
                }
            }

        };

        return card;
    }

счастьяапи

public class HappinessAPI
{
    internal IMessageActivity ShowGif(IDialogContext context)
    {
        Attachment attachment = new Attachment()
        {
            ContentType = HeroCard.ContentType,
            Content = new HeroCard()
            {
                Images = new List<CardImage>()
                {
                    new CardImage("https://upload.wikimedia.org/wikipedia/commons/thumb/8/85/Smiley.svg/220px-Smiley.svg.png")
                }
            }
        };
        var reply = context.MakeMessage();
        reply.Attachments.Add(attachment);

        return reply;
    }

    internal IMessageActivity GetJoke(IDialogContext context)
    {
        var request = WebRequest.Create("http://api.icndb.com/jokes/random");
        request.ContentType = "application/json; charset=utf-8";
        string text;
        var response = (HttpWebResponse)request.GetResponse();

        using (var sr = new StreamReader(response.GetResponseStream()))
        {
            text = sr.ReadToEnd();
        }
        var reply = context.MakeMessage();
        reply.Text = (string)(JObject.Parse(text))["value"]["joke"];

        return reply;
    }
}

Дело в том, что он работает во время тестирования с использованием WebChat в AzurePortal, но ответа на его вопросы нет в командах Microsoft.

Пример: Works in Webchat:

Я: погода во Франкфурте

Бот: "Холодно .... да ладно"

Бот: Ты счастлив?

Я: нажмите "да / нет"

Бот: отправляет шутку или смайлик  введите описание изображения здесь

Doesn't work in Microsoft Teams

Все в порядке, пока я не нажму «да / нет», а затем просто нужно что-то сделать (появляется «печатает ...», но после этого ничего не происходит.  введите описание изображения здесь

ИЗМЕНИТЬ

При использовании чат-бота в Microsoft Teams, когда я нажимаю героярту, я вижу, что в чате записывается сообщение, хотя этого не должно быть, потому что для него установлено значение ActionTypes.Postback

ИЗМЕНИТЬ 2

HeroCard теперь выглядит так:

    internal static HeroCard CreateHappinessCard()
    {
        HeroCard card = new HeroCard()
        {
            Title = "Hi!",
            Text = "Are you happy?",
            Buttons = new List<CardAction>()
            {
                new CardAction()
                {
                    Title = "Yes",
                    Text = "ShowGif",
                    //DisplayText = null,
                    Type = ActionTypes.MessageBack,
                    Value= "{\"action\": \"ShowGif\" }"
                },
                new CardAction()
                {
                    Title = "Meh...",
                    Text ="HappinessSearch",
                    //DisplayText = null,
                    Type = ActionTypes.MessageBack,
                    Value = "{\"action\": \"HappinessSearch\" }"
                }
            }

        };

        return card;
    }
}

Но все равно не работает. Сообщение боту не отправляется. Если я использую тип imBack, он работает, но в чате появляется сообщение, что мне не нужно и messageBack должно работать.

ИЗМЕНИТЬ 3 после предоставленного кода

диалоговое окно

    private async Task ShowLuisResult(IDialogContext context, LuisResult result)
    {
        await context.PostAsync($"You have reached {result.Intents[0].Intent}. You said: {result.Query}");

        context.Call(new HeroCardDialog(), MessageReceivedAsync);
    }

    public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
    {
        var message = await result;

        if (message != null)
        {
            //

        }

        //context.Wait(MessageReceived);
        context.Done<object>(null);
    }

HeroCardDialog

public class HeroCardDialog : IDialog<object>
{
    public async Task StartAsync(IDialogContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException(nameof(context));
        }

        //Set the Last Dialog in Conversation Data
        context.UserData.SetValue("HeroCardId", "HerdoCard Dialog");

        var message = context.MakeMessage();
        var attachment = GetHeroCard();

        message.Attachments.Add(attachment);

        await context.PostAsync((message));

        context.Done<object>(null);
    }

    private static Attachment GetHeroCard()
    {
        var heroCard = new HeroCard()
        {
            Title = "Hi!",
            Text = "Are you happy?",
            Buttons = new List<CardAction>()
                {
                    new CardAction()
                    {
                        Title = "Yes",
                        Text = "ShowGif",
                        DisplayText = null,
                        Type = ActionTypes.MessageBack,
                        Value= "{\"msgback\" : \"ShowGif\"}"
                    },
                    new CardAction()
                    {
                        Title = "Meh...",
                        Text ="HappinessSearch",
                        DisplayText = null,
                        Type = ActionTypes.MessageBack,
                        Value= "{\"msgback\" : \"HappinessSearch\"}"
                    }
                }

        };

        return heroCard.ToAttachment();
    }
}

person blfuentes    schedule 17.01.2018    source источник


Ответы (1)


PostBack не поддерживается Microsoft Teams. Проверьте список поддерживаемых действий кнопок в Microsoft Teams.

Мы рекомендуем вам использовать messageBack, так как вы можете создать полностью настраиваемое действие.

person Wajeed-MSFT    schedule 17.01.2018
comment
Я изменил свой код на Type = ActionTypes.MessageBack,, но он все равно не работает. Теперь ничего не происходит. Чат-бот вообще не реагирует на мои клики. Метод MessageReceivedAsync не вызывается. Не могли бы вы предоставить образец? - person blfuentes; 17.01.2018
comment
Я не могу найти ничего явно неправильного в вашем коде, просмотрев его некоторое время, но вот пример, который работает: github.com/OfficeDev/microsoft-teams-sample-complete-csharp / - person Bill Bliss - MSFT; 18.01.2018
comment
@ BillBliss-MSFT Спасибо за ответ и ссылку. Я проверяю код, но все еще не знаю, как уловить ответ в диалоговом окне. Я обновил свой вопрос новым кодом. - person blfuentes; 18.01.2018