Я хочу отправить пользователю адаптивную карту с некоторыми параметрами через бота MS Teams. После того, как я узнаю, какой вариант выбрал пользователь, я хочу получить конкретный ответ.
Мои проблемы до сих пор:
Это то, что я пробовал до сих пор.
Адаптивная карта json
{
"type": "AdaptiveCard",
"version": "1.0",
"body": [
{
"type": "ColumnSet",
"columns": [
{
"type": "Column",
"width": "stretch",
"items": [
{
"type": "ActionSet",
"actions": [
{
"id": "action 1",
"type": "Action.Submit",
"title": "Action.Submit"
}
]
}
]
}
]
},
{
"type": "ColumnSet",
"columns": [
{
"type": "Column",
"width": "stretch",
"items": [
{
"type": "ActionSet",
"actions": [
{
"id": "action 2",
"type": "Action.Submit",
"title": "Submit action 2"
}
]
}
]
}
]
},
{
"type": "ColumnSet",
"columns": [
{
"type": "Column",
"width": "stretch",
"items": [
{
"type": "ActionSet",
"actions": [
{
"id": "action 3",
"type": "Action.Submit",
"title": "Submit action3"
}
]
}
]
}
]
}
],
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json"
}
Сообщение отправить
public async Task<string> SendAdaptiveCardToAccountEmailAsync(AdaptiveCardRequest adaptiveCard)
{
var teamsConversations = await GetTeamsConversationsByEmail(adaptiveCard.AccountEmail);
var cardJson = File.ReadAllText(Path.Combine(".", "Resources", $"{adaptiveCard.Type}.json"));
var card = AdaptiveCard.FromJson(cardJson).Card;
var columnOne = (card.Body[0] as AdaptiveColumnSet).Columns[0].Items[0] as AdaptiveActionSet;
columnOne.Actions[0].Title = adaptiveCard.Options[0];
columnOne.Actions[0].Id = "Option 1";
var columnTwo = (card.Body[1] as AdaptiveColumnSet).Columns[0].Items[0] as AdaptiveActionSet;
columnTwo.Actions[0].Title = adaptiveCard.Options[1];
columnTwo.Actions[0].Id = "Option 2";
var columnThree = (card.Body[2] as AdaptiveColumnSet).Columns[0].Items[0] as AdaptiveActionSet;
columnThree.Actions[0].Title = adaptiveCard.Options[2];
columnThree.Actions[0].Id = "Option 3";
var attachment = new Attachment()
{
Content = card,
ContentType = "application/vnd.microsoft.card.adaptive"
};
var connector = new ConnectorClient(new Uri(teamsConversations.ServiceUrl),
_microsoftAppId,
_microsoftAppPassword);
AppCredentials.TrustServiceUrl(teamsConversations.ServiceUrl);
var activity = Activity.CreateMessageActivity();
activity.From = new ChannelAccount(_teamsBotId, _teamsBotName);
activity.Recipient =
new ChannelAccount(
teamsConversations.AccountId,
teamsConversations.AccountName);
activity.Conversation = new ConversationAccount(false,
"personal",
teamsConversations.ConversationId)
{
Id =
teamsConversations.ConversationId
};
activity.Attachments.Add(attachment);
connector.Conversations.SendToConversationAsync(activity as Activity).Wait();
return "ok";
}
Выбор пользователя
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext,
CancellationToken cancellationToken)
{
turnContext.Activity.RemoveRecipientMention();
var text = turnContext.Activity.Text.Trim().ToLower();
var replyText = $"You choose: {text}";
await turnContext.SendActivityAsync(MessageFactory.Text(replyText, replyText), cancellationToken);
}
Используя watch
в визуальной студии, я пытался найти action 1
или Option 1
и т. д. в turnContext.Activity
, но безуспешно.
Есть примеры, советы, решения?
Спасибо
@coder_b спасибо, но не совсем о моих проблемах: github.com/microsoft/BotBuilder-Samples/blob/main/samples/…
Я полностью уверен, как вы тестируете действия? learn.microsoft.com/en-us/azure/bot-service/…
@coder_b, спасибо, попробую и с эмулятором
Вы можете разыграть свои Адаптивные Карточные Действия как AdaptiveSubmitAction
, у которого есть свойство Data
. Это свойство имеет тип Object, поэтому вы можете прикрепить к нему все, что захотите, например, пользовательский класс (например, MyActionObject
, со свойством типа ActionType
или что-то еще. Вот пример:
public class MyActionObject {
public string ActionType {get; set; }
}
затем установите данные AdaptiveAction в соответствии с этим, например: `((AdaptiveSubmitAction)columnThree.Actions).Data = new MyActionObject() { ActionType = 'Action3' };
Позже, когда ваш бот получит действие от пользователя, вы можете найти это значение, например:
dynamic value = turnContext.Activity.Value as dynamic;
var data = value?.data?.data;
if (data?.ActionType == "Action3") // do something
Привет, я пробовал это, и это работает, спасибо. Но когда я отправляю свою адаптивную карту, могу ли я получить идентификатор корреляции, чтобы знать, что Action3
связан с адаптивной картой, которую я только что отправил? Или как мне соотнести Action3
с сообщением, которое я только что отправил? Допустим, я отправляю сообщение с адаптивной картой, могу ли я получить Id
, чтобы сохранить его в своей базе данных, а также получить идентификатор в своем контексте контекста, а также установить действие в базе данных?
рад, что это работает. Что касается идентификатора корреляции, вы можете добавить в свой MyActionObject все, что захотите. Прямо сейчас у него есть только ActionType, но вы также можете добавить, например, строковое свойство CorrelationId, которое также будет возвращено.
ОФК. :) дох. Спасибо
все типы примеров вы можете найти здесь, github.com/Microsoft/BotBuilder-Samples/tree/main/samples/…