Ответ не приходит от нажатия кнопки в боте Telegram в Microsoft Bot Framework - PullRequest
0 голосов

Проблема в том, что при нажатии кнопки в телеграмме на контроллер бота не поступает никаких действий. Или я не поймаю их правильно. + После нажатия на кнопку «бот» отображается сообщение «извините, проблема с кодом моего бота».

Стандартный контроллер класса для получения действий в Microsoft Bot Framework.

    [BotAuthentication]
public class MessagesController : ApiController
{
    [ResponseType(typeof(void))]
    public virtual async Task<HttpResponseMessage> Post([FromBody] Activity activity)
    {
        if (activity != null && activity.GetActivityType() == ActivityTypes.Message)
        {
            await Conversation.SendAsync(activity, () => new finder_worker());
        }
        else
        {
            HandleSystemMessage(activity);
        }
        return new HttpResponseMessage(System.Net.HttpStatusCode.Accepted);
    }

    private Activity HandleSystemMessage(Activity message)
    {
        if (message.Type == ActivityTypes.DeleteUserData)
        {
            // Implement user deletion here
            // If we handle user deletion, return a real message
        }
        else if (message.Type == ActivityTypes.ConversationUpdate)
        {
            // Handle conversation state changes, like members being added and removed
            // Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info
            // Not available in all channels
        }
        else if (message.Type == ActivityTypes.ContactRelationUpdate)
        {
            // Handle add/remove from contact lists
            // Activity.From + Activity.Action represent what happened
        }
        else if (message.Type == ActivityTypes.Typing)
        {
            // Handle knowing tha the user is typing
        }
        else if (message.Type == ActivityTypes.Ping)
        {
            //message.p
        }
        return null;
    }
}

Это класс, который я написал как обработчик активности. Он использует HeroCard для создания кнопок.

    [Serializable]
public class finder_worker : IDialog<object>
{
    private const string mark = "sad";
    private const string st_message = "start";
    private const string empty_message = "";

    public async Task StartAsync(IDialogContext context)
    {
        //тут их отлавливает
        context.Wait(MessageReceivedAsync);

    }

    public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument)
    {
        try
        {
            var message = await argument;
            var message_to_send = context.MakeMessage();
            workers.json_worker m = new workers.json_worker(message.ChannelData.ToString());
            await context.PostAsync($"сообщение: {m.message_text}");

            switch (m.message_text)
            {
                case st_message:
                    await context.PostAsync($"инициация знакомства");
                    break;
                case empty_message:
                    await context.PostAsync($"пустое сообщение");
                    break;
                case mark:
                    message_to_send.Attachments.Add(create_button());
                    await context.PostAsync(message_to_send);
                    await context.PostAsync($"тестовое сообщение");
                    //create_button();
                    break;
                default:
                    await context.PostAsync($"прочее сообщение");
                    break;
            }
            context.Wait(MessageReceivedAsync);
        }
        catch(SqlException e)
        {
            await context.PostAsync($"упс... что то не получилось записать на сервер{e.ToString()}");
        }
    }

    public Attachment create_button()
    {

        var card = new HeroCard("Some Text");
        card.Buttons = new List<CardAction>()
        {
            new CardAction()
            {
                Title = "button1",
                Type=ActionTypes.MessageBack,
                Value="button1"
            },
            new CardAction()
            {
                Title = "button2",
                Type=ActionTypes.MessageBack,
                Value="button2"
            }
        };

        Attachment cardAttachment = card.ToAttachment();
        return cardAttachment;
    }
}

В качестве теста отправляю бота sad и жду запуска кнопок. Эта часть идет хорошо. Но после нажатия бот не получает никаких сообщений или других действий. Я ожидаю получить сообщение или другое действие, которое можно обработать с помощью инструментов Microsoft Bot Framework.

Пробовал:

  • укажите тип CardAction как: MessageBack, PostBack, ImBack
  • отправить кнопки через activity.CreateReply

Спасибо!

1 Ответ

0 голосов
/ 08 мая 2018

ActionTypes.MessageBack не является допустимым типом действия карты для телеграммы (это для команд MS). Пожалуйста, попробуйте PostBack или ImBack

public Attachment create_button()
    {

        var card = new HeroCard("Some Text");
        card.Buttons = new List<CardAction>()
        {
            new CardAction()
            {
                Title = "button1",
                Type=ActionTypes.ImBack,
                Value="button1"
            },
            new CardAction()
            {
                Title = "button2",
                Type=ActionTypes.PostBack,
                Value="button2"
            }
        };

        Attachment cardAttachment = card.ToAttachment();
        return cardAttachment;
    }
...