微软团队Bot自适应卡轮播删除卡

时间:2019-12-19 07:50:42

标签: node.js typescript botframework microsoft-teams adaptive-cards

我正在将Microsoft team bot与nodejs一起使用。我正在渲染自适应卡的轮播,并对每个卡进行操作。我的要求是删除单击了操作的单个卡。可能吗?

当前代码如下所示。我尝试了deleteActive,但是删除了整个轮播

const {
    TurnContext,
    TeamsActivityHandler,
    CardFactory,
    AttachmentLayoutTypes,
    ActionTypes
} = require('botbuilder');

class TeamsConversationBot extends TeamsActivityHandler {
    constructor() {
        super();
        this.onMessage(async (context:any, next:any) => {
            TurnContext.removeRecipientMention(context.activity);
            console.log("context activigty at the begin is:" + JSON.stringify(context.activity))
            let msg = context.activity.text
            let action = context.activity.value

            if(msg.startsWith('lead')){
                msg = 'lead'
            }

            if(action !== undefined){
                console.log("user did some action on a card")
                msg = action.action
            }

            switch (msg) {
                case 'lead':
                        await this.lead(context)
                        break;
                case 'qualify_lead':
                        await this.qualifyLead(context)
                        break;
            }
            await next();
        });
    }


    /**
     * 
     * @param context this method does a lead qualification
     */
    async qualifyLead(context:any){
        console.log("in qualifyLead:" + JSON.stringify(context.activity))
        //await context.deleteActivity(context.activity.replyToId)

        const leadId = context.activity.value.objectId
        console.log("Lead to qualify is:" + leadId)


        await context.sendActivity('Lead is qualified')
    }


/**
    * Search contact by name
    * @param context
    * @param keyword 
*/ 
async lead(context:any){
    console.log("Start of lead with context:" + JSON.stringify(context))
    const cardArr = []
    let items = [
        {"Name": 'x', "LeadId": "1"},
        {"Name": 'a', "LeadId": "2"},
        {"Name": 'b', "LeadId": "3"},
        {"Name": 'c', "LeadId": "4"},
        {"Name": 'd', "LeadId": "5"}
    ]

     for(const item of items){
        const header =  {
            "type": "TextBlock",
            "size": "Medium",
            "weight": "Bolder",
            "text": item.Name
        }



    const actions = [
        {
            "type": "Action.Submit",
            "title": "Qualify",
            "data": { "action" : "qualify_lead", "objectId" : item.LeadId }
        }
       ]


   const acard = CardFactory.adaptiveCard(
    {
        "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
        "type": "AdaptiveCard",
        "version": "1.0",
        "body": [
            header,
            ''
            ],
           "actions": actions
         }
     )

    cardArr.push(acard)
    console.log("payload is::::" + JSON.stringify(acard))
        }

    const reply = {
        "attachments" : cardArr,
        "attachmentLayout" : AttachmentLayoutTypes.Carousel
    }

    await context.sendActivity(reply);
}

}

module.exports.TeamsConversationBot = TeamsConversationBot;

1 个答案:

答案 0 :(得分:1)

this other answer一样,答案将与this one相似。我可以看到您正在尝试使用TypeScript,但是您的代码与JavaScript的差异很小,所以我只用JavaScript编写答案。

  

首先,您需要一种为[旋转木马]保存状态的方法,以便您可以更新[旋转木马]的活动。

abcd
  

您需要一种一致的方式来生成[轮播],您可以在最初发送[轮播]和更新[轮播]时使用。

int main(int argc, char *argv[])
{
int status = 0; 
char *input;
input = getLine();
int input_length = strlen(input);

if((input_length/2)%2 == 1 && input_length > 2)
{
    usage("input must have even length");
}

if (input_length == 1)
{
    fprintf(stdout, "%s", input);
}else
{
    struct parts p1; 
    split(input, &p1);

    int pipeEndsFirstChild1[2];
    int pipeEndsFirstChild2[2];

    .
    .
    .
    pid_t pid1 = fork();
    redirectPipes(pid1, pipeEndsFirstChild1, pipeEndsFirstChild2);

    int pipeEndsSecondChild1[2];
    int pipeEndsSecondChild2[2];

    .
    .
    .
    pid_t pid2 = fork();
    redirectPipes(pid2, pipeEndsSecondChild1, pipeEndsSecondChild2);


    // write to 1st and 2nd child input
    write(pipeEndsFirstChild2[1], p1.first_half,  strlen(p1.first_half));
    write(pipeEndsSecondChild2[1], p1.second_half,  strlen(p1.second_half));

    .
    .
    .

    // open output fd of 1st child
    FILE *filePointer1 = fdopen(pipeEndsFirstChild1[0], "r");

    // put output into readBufFirstChild
    fgets(readBufFirstChild,sizeof(readBufFirstChild),filePointer1);

     // open output fd of 2nd child
    FILE *filePointer2 = fdopen(pipeEndsSecondChild1[0], "r");

    // open output fd of 2st child
    fgets(readBufSecondChild,sizeof(readBufSecondChild),filePointer2);

    //concat results
   char *result = malloc(strlen(readBufFirstChild) + 
   strlen(readBufSecondChild) + 1);
   strcpy(result, readBufFirstChild);
   strcat(result, readBufSecondChild);

    fprintf(stderr, "result ->\n%s\n", result);

    if(wait(&status) == -1){
        exit(EXIT_FAILURE);
    }

    exit(EXIT_SUCCESS);
 }
}

这类似于您的代码,但有一些重要的区别。首先,我要过滤项目数组,以减少项目的数量,这就是最终从轮播中删除卡片的方式。其次,我在每个动作的数据中都包含一个“批处理ID”,这就是您的机器人在接收到动作的有效负载后如何知道要更新哪个动作。另外,这与您的问题无关,但是我经常在希望多次使用该字符串的所有地方使用字符串常量而不是字符串文字,这是我的做法,以避免与错字相关的错误等。

  

使用此功能,您可以像这样最初发送[轮播]

this.carouselState = this.conversationState.createProperty('carouselState');
  

您可以更新[轮播]以响应卡的[qualify]提交操作

createCarousel(batchId, leads)
{
    const cardArr = [];

    let items = [
        { "Name": 'x', "LeadId": 1 },
        { "Name": 'a', "LeadId": 2 },
        { "Name": 'b', "LeadId": 3 },
        { "Name": 'c', "LeadId": 4 },
        { "Name": 'd', "LeadId": 5 }
    ];

    items = items.filter(item => leads.includes(item.LeadId));

    for (const item of items) {
        const header = {
            "type": "TextBlock",
            "size": "Medium",
            "weight": "Bolder",
            "text": item.Name
        };

        const actions = [
            {
                "type": "Action.Submit",
                "title": "Qualify",
                "data": { [KEYACTION]: ACTIONQUALIFYLEAD, [KEYOBJECTID]: item.LeadId, [KEYBATCHID]: batchId }
            }
        ];

        const acard = CardFactory.adaptiveCard(
            {
                "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
                "type": "AdaptiveCard",
                "version": "1.0",
                "body": [
                    header
                ],
                "actions": actions
            }
        );

        cardArr.push(acard);
    }

    return {
        "type": "message",
        "attachments": cardArr,
        "attachmentLayout": AttachmentLayoutTypes.Carousel
    };
}
相关问题