Как обработать нажатие на адаптивную платформу бота v4? - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть адаптивная карта, которая будет отображаться в диалоговом окне водопада.Я хочу знать, возможно ли зафиксировать действие нажатия на адаптивной карте. Я не хочу добавлять кнопку для обработки нажатия.Я использую версию фреймворка ботов v4.

Диалог касания запускается дважды

enter image description here

Моя адаптивная карта:

var Card1 = {
                    "type": "AdaptiveCard",
                    "selectAction": {
                        "type": "Action.Submit",
                        "id": "tap",
                        "title": "tap",
                        "data": "data": { tap: 'tap' }
                    },
                    "backgroundImage": "https://download-ssl.msgamestudios.com/content/mgs/ce/production/SolitaireWin10/dev/adapative_card_assets/v1/card_background.png",
                    "body": [
                        {
                            "type": "ColumnSet",
                            "columns": [
                                {
                                    "type": "Column",
                                    "items": [
                                        {
                                            "type": "Image",
                                            "url": "https://download-ssl.msgamestudios.com/content/mgs/ce/production/SolitaireWin10/dev/adapative_card_assets/v1/tile_spider.png",
                                            "size": "Stretch"
                                        }
                                    ],
                                    "width": 1
                                },
                                {
                                    "type": "Column",
                                    "items": [
                                        {
                                            "type": "TextBlock",
                                            "horizontalAlignment": "Center",
                                            "weight": "Bolder",
                                            "color": "Light",
                                            "text": "Click here to play another game of Spider in Microsoft Solitaire Collection!",
                                            "wrap": true
                                        }
                                    ],
                                    "width": 1
                                }
                            ]
                        }
                    ],
                    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
                    "version": "0.5"
                };

Вот так я обновил код

Код

       // Add prompts that will be used by the main dialogs.
        this.dialogs.add(new TextPrompt(TAP_PROMPT, () => true));

        // Create a dialog that asks the user for their name.
        this.dialogs.add(new WaterfallDialog(PUBLICTRANS, [
            this.promptForTap.bind(this),
            this.captureTap.bind(this)
        ]));
  async promptForTap(step) {
        var Card1 = {
            "type": "AdaptiveCard",
            "selectAction": {
                "type": "Action.Submit",
                "id": "tap",
                "title": "tap",
                "data": "data": { tap: 'tap' }
            },
            "backgroundImage": "https://download-ssl.msgamestudios.com/content/mgs/ce/production/SolitaireWin10/dev/adapative_card_assets/v1/card_background.png",
            "body": [
                {
                    "type": "ColumnSet",
                    "columns": [
                        {
                            "type": "Column",
                            "items": [
                                {
                                    "type": "Image",
                                    "url": "https://download-ssl.msgamestudios.com/content/mgs/ce/production/SolitaireWin10/dev/adapative_card_assets/v1/tile_spider.png",
                                    "size": "Stretch"
                                }
                            ],
                            "width": 1
                        },
                        {
                            "type": "Column",
                            "items": [
                                {
                                    "type": "TextBlock",
                                    "horizontalAlignment": "Center",
                                    "weight": "Bolder",
                                    "color": "Light",
                                    "text": "Click here to play another game of Spider in Microsoft Solitaire Collection!",
                                    "wrap": true
                                }
                            ],
                            "width": 1
                        }
                    ]
                }
            ],
            "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
            "version": "1.0"
        };
        const reply = {
            attachments: [CardFactory.adaptiveCard(Card1)]
        };
        return await step.prompt(TAP_PROMPT, { prompt: reply });
    }

    async captureTap(step) {
        // Edited from original answer
        await step.context.sendActivity(`You selected `);
        // Send Back Channel Event
        await step.context.sendActivity({ type: 'event', name: 'tapEvent' });
        return await step.endDialog();
    }

вывод карты активирован дважды enter image description here

1 Ответ

0 голосов
/ 06 апреля 2019

Вы можете отправить событие обратного канала в WebChat от бота, когда пользователь нажимает на карту AdaptiveCard, чтобы вызвать событие на веб-странице.

Простая AdaptiveCard с выбором действия

Сначала создайте AdaptiveCard с selectAction. Обратите внимание, что вы можете добавить selectAction ко всей карте или к другим компонентам на карте, например к изображению или столбцу. Когда пользователь нажимает на часть карты с selectAction, он отправляет боту бот, содержащий атрибут данных, из действия, которое мы можем использовать, чтобы определить, какое действие было инициировано на стороне бота.

Обязательно установите атрибут title, поле data и значение type, которое должно быть Action.Submit.

{
  "type": "AdaptiveCard",
  "selectAction": {
      "type": "Action.Submit",
      "id": "tap",
      "title": "tap",
      "data": { "tap": "Play again"}
  },
    "body": [
      {
        "type": "TextBlock",
        "horizontalAlignment": "Center",
        "size": "Medium",
        "weight": "Bolder",
        "text": "Click Me!"
    },
    {
        "type": "Image",
        "url": "https://usercontent2.hubstatic.com/13896379.jpg"
    }],
  "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
  "version": "1.0"
}

Bot Code - Node Js

1020 * Constructor *

const TAP_PROMPT = 'tap_prompt';
constructor(conversationState, userState) {

    ...

    // Add prompts that will be used by the main dialogs.
    this.dialogs.add(new TextPrompt(TAP_PROMPT, () => true));

    // Create a dialog that asks the user for their name.
    this.dialogs.add(new WaterfallDialog(WHO_ARE_YOU, [
        this.promptForTap.bind(this),
        this.captureTap.bind(this)
    ]));
}

Подсказка AdaptiveCard

На одном из шагов вашего Водопада вы можете создать объект ответа, у которого есть AdaptiveCard в качестве вложения. Затем вы можете передать этот ответ на приглашение. Я бы порекомендовал использовать TextPrompt для этого шага.

// This step in the dialog sends the user an adaptive card with a selectAction
async promptForTap(step) {
    const reply = {
        attachments: [CardFactory.adaptiveCard(Card)]
    }
    return await step.prompt(TAP_PROMPT, { prompt: reply });
}

Выбор захвата AdaptiveCard

На следующем шаге Водопада вы можете получить атрибут данных, отправленный с AdaptiveCard, открыв step.value. Здесь отправьте активность боту с типом и свойством name. Эти два атрибута будут использоваться для фильтрации входящих действий в веб-чате и запуска соответствующего события.

// This step captures the tap and sends a back channel event to WebChat
async captureTap(step) {

    // Edited from original answer
    await step.context.sendActivity(`You selected ${step.context.activity.value.tap}`);

    // Send Back Channel Event
    await step.context.sendActivity({type: 'event', name: 'tapEvent'});

    return await step.endDialog();
}

Промежуточное программное обеспечение WebChat

В WebChat мы собираемся создать собственное промежуточное ПО для проверки входящих действий. Когда мы сталкиваемся с действием, которое имеет имя и тип, который мы узнаем, запустите ваше событие на веб-странице В приведенном ниже примере я только предупредил об использовании, которое они нажали на AdaptiveCard.

const store = window.WebChat.createStore(
    {},
    ({ dispatch }) => next => action => {
        if (action.type === 'DIRECT_LINE/INCOMING_ACTIVITY') {
          const { name, type } = action.payload.activity;

          if (type === 'event' && name === 'tapEvent') {
            alert("You tapped on the AdaptiveCard.");
          }
        }
        return next(action);
    }
);

window.WebChat.renderWebChat({
    directLine: window.WebChat.createDirectLine({ token }),
    store,
}, document.getElementById('webchat'));

Для получения более подробной информации о событиях в обратном канале и создании собственного промежуточного программного обеспечения в WebChat, проверьте этот образец в репо WebChat.

Надеюсь, это поможет!

...