-
Notifications
You must be signed in to change notification settings - Fork 493
Description
Overview
We currently allow Bot developers to receive feedback from Teams users using Feedback Loops. When a user clicks "Submit" the feedback, message/submitAction
invoke is fired. We need a new invoke handler for message/submitAction
invoke.
We are introducing Bot developers to create Custom feedback loops. These custom feedback loops allow Bot developers to show either an Adaptive Card (AC) task module or a website task module. If a bot sent a message with custom feedback loop enabled to the Teams client, the Teams client will fire new invoke, message/fetchTask
to determine whether the custom feedback loop should show an AC task module or a website task module. We need another invoke handler for message/fetchTask
invoke.
Example Screenshots
Default Feedback
Custom Feedback (AC)
Custom Feedback (Website)
Return Values
How I am currently handling these two invokes inside onInvokeActivity
message/submitAction
{
status: 200,
body: {}
}
message/fetchTask
Adaptive Card
const taskModuleReturn = {
task: {
type: 'continue',
value: {
card: [Object], // Should contain valid Adaptive Card Payload
height: 200,
width: 400,
title: 'Test Task Module Title with AC'
}
}
};
return {
status: 200,
body: taskModuleReturn
};
Website URL
const taskModuleReturn = {
task: {
type: 'continue',
value: {
url: "https://bing.com", // Should contain valid URL with the valid domain listed under App Manifest
}
}
};
return {
status: 200,
body: taskModuleReturn
};
Sample Bot Code
Send messages with feedback loop
this.onMessage(async (context, next) => {
console.log("Running with Message Activity.");
const removedMentionText = TurnContext.removeRecipientMention(context.activity);
const txt = removedMentionText.toLowerCase().replace(/\n|\r/g, "").trim();
await context.sendActivity(`Echo: ${txt}`);
await context.sendActivity({
type: ActivityTypes.Message,
text: "Old message with feedbackLoopEnabled = true",
channelData: {
feedbackLoopEnabled: true // use default feedback form
},
});
await context.sendActivity({
type: ActivityTypes.Message,
text: "Old message with feedbackLoopEnabled = false",
channelData: {
feedbackLoopEnabled: false // use default feedback form
},
});
await context.sendActivity({
type: ActivityTypes.Message,
text: "new message with feedbackLoop = default",
channelData: {
feedbackLoop: {
type: "default"
}
},
});
await context.sendActivity({
type: ActivityTypes.Message,
text: "new message with feedbackLoop = custom",
channelData: {
feedbackLoop: {
type: "custom"
}
},
});
// By calling next() you ensure that the next BotHandler is run.
await next();
});