Проблема в том, что при нажатии кнопки в телеграмме на контроллер бота не поступает никаких действий. Или я не поймаю их правильно. + После нажатия на кнопку «бот» отображается сообщение «извините, проблема с кодом моего бота».
Стандартный контроллер класса для получения действий в 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
Спасибо!