ОШИБКА: активность привела к нескольким действиям в Skype при обновлении активности в ActivityPrompt - PullRequest
0 голосов
/ 11 июля 2020

Я работаю над чат-ботом Bot framework на канале msteams. В диалоговых окнах водопада, как требование для адаптивных карточек, мне нужно сохранить его значения (в INPUT.text) в msteams после нажатия кнопки отправки. Но msteams не сохраняет значения. В качестве обходного пути я попытался добавить адаптивную карточку в ActivityPrompt, и когда пользователь нажимает кнопку отправки, проверка активности подсказки гарантирует, что новые значения отправляются как действие обновления в старой карточке.

Код ниже объясняет, как я использовал ActivityPrompt в шаг водопада.

  async W2_showCard(step) {  //in the waterfall step
        const card = CardFactory.adaptiveCard(Json_adaptivecard);
        return await step.prompt('formPrompt', { prompt: MessageFactory.attachment(card) });
    }
.addDialog(new ActivityPrompt('formPrompt', async prompt => { // validation involved in activityprompt

            const recognizedValue = prompt.recognized.value;
            console.log(prompt.recognized.value)
            if (recognizedValue.type =='message') {
                if (recognizedValue.value) {
                   
                    const replyToId = recognizedValue.replyToId;

                    var oldCard = prompt.options.prompt.attachments[0];
                    console.log(oldCard)
                    var validated = true;
                    
                    for(let i=0;i<oldCard.content.body[0].columns[0].items.length;++i){// replace values
                      
                         if(oldCard.content.body[0].columns[0].items[i].type=="Input.Text"){
                              // preserve the user input
                            const newValue = 
                             recognizedValue.value[oldCard.content.body[0].columns[0].items[i].id];
                            oldCard.content.body[0].columns[0].items[i].placeholder = newValue;
                            
                          
                         }
                     }
                    
                    // update the card
                    const activity = prompt.context.activity;
                    
                    activity.attachments = [oldCard];// issue due to attachment Multiple skyp act error.
                    activity.id = replyToId;
                   
                    await prompt.context.updateActivity(activity); // issue is here

                    if (validated) {
                        // this is to make input available in next waterfall step
                        prompt.recognized.value = recognizedValue.value;
                        return true;
                    } else {
                        await prompt.context.sendActivity(`Please check the form. Some values are missing`);
                    }
                } else {
                    await prompt.context.sendActivity(`Please fill out form and press *"submit"* button or type *"cancel"* to stop.`);
                }

            }
            return false;

        }))

Моя проблема в том, что при обновлении выдается ОШИБКА: Действие привело к нескольким действиям в Skype. При анализе мне удалось определить ошибку в activity.attachment = [oldcard].

Есть ли способ добавить вложение к текстовой активности без этой ошибки? Или почему prompt.context.activity - это текстовое действие, а не вложение, очевидно, я отправляю вложение в Activityprompt на этапе водопада

Любая помощь будет очень признательна.

1 Ответ

1 голос
/ 13 июля 2020

Вы в основном поняли, но никогда не должны использовать входящую активность в качестве исходящей. prompt.context будет контекстом хода, поэтому prompt.context.activity будет входящим действием пользователя-бота, а не действием, которое ваш бот отправил в подсказке. Вместо того, чтобы пытаться обновить действие приглашения входящим действием, вы должны изменить действие приглашения напрямую. Кажется, вы уже выяснили, как получить доступ к этой активности в другой части вашего кода с помощью prompt.options.prompt, поэтому непонятно, почему вы не делаете это последовательно.

Я также хочу отметить, что вы вы можете захотеть установить значения текстовых полей вместо их заполнителей, но заполнители вполне подойдут, если это ваше намерение.

Возможно, вас заинтересует предстоящий пакет, называемый библиотекой карт. Вы можете выразить свою поддержку здесь, чтобы выпустить его раньше: https://github.com/BotBuilderCommunity/botbuilder-community-dotnet/issues/137

...