diff --git a/skills/src/csharp/experimental/eventskill/Content/EventCard.1.0.json b/skills/src/csharp/experimental/eventskill/Content/EventCard.1.0.json new file mode 100644 index 0000000000..74e5cd74d3 --- /dev/null +++ b/skills/src/csharp/experimental/eventskill/Content/EventCard.1.0.json @@ -0,0 +1,77 @@ +{ + "type": "AdaptiveCard", + "id": "EventCard", + "body": [ + { + "type": "Container", + "items": [ + { + "type": "ColumnSet", + "columns": [ + { + "type": "Column", + "verticalContentAlignment": "Center", + "items": [ + { + "type": "TextBlock", + "id": "title", + "size": "Large", + "weight": "Bolder", + "color": "Dark", + "text": "Local Event" + } + ], + "width": "stretch" + } + ] + } + ] + }, + { + "type": "Image", + "url": "{ImageUrl}" + }, + { + "type": "TextBlock", + "text": "**{Title}**", + "size": "Medium", + "weight": "Bolder" + }, + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "{StartDate}", + "spacing": "Small" + }, + { + "type": "TextBlock", + "text": "{Location}", + "spacing": "Small" + }, + { + "type": "TextBlock", + "text": "{Price}", + "spacing": "Small" + } + ] + }, + { + "type": "TextBlock", + "text": "Powered by **Eventbrite**", + "horizontalAlignment": "Right", + "size": "Small" + } + ], + "actions": [ + { + "type": "Action.OpenUrl", + "title": "Get Tickets", + "url": "{Url}" + } + ], + "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", + "version": "1.0", + "speak": "{Speak}" +} \ No newline at end of file diff --git a/skills/src/csharp/experimental/eventskill/Dialogs/EventDialogBase.cs b/skills/src/csharp/experimental/eventskill/Dialogs/EventDialogBase.cs index d753227d7d..fe4da46bcc 100644 --- a/skills/src/csharp/experimental/eventskill/Dialogs/EventDialogBase.cs +++ b/skills/src/csharp/experimental/eventskill/Dialogs/EventDialogBase.cs @@ -12,10 +12,12 @@ using Luis; using Microsoft.Bot.Builder; using Microsoft.Bot.Builder.Dialogs; +using Microsoft.Bot.Builder.Dialogs.Choices; using Microsoft.Bot.Builder.Skills; using Microsoft.Bot.Builder.Solutions.Authentication; using Microsoft.Bot.Builder.Solutions.Responses; using Microsoft.Bot.Builder.Solutions.Util; +using Microsoft.Bot.Connector; using Microsoft.Bot.Schema; namespace EventSkill.Dialogs @@ -175,5 +177,16 @@ protected async Task HandleDialogExceptions(WaterfallStepContext sc, Exception e var state = await StateAccessor.GetAsync(sc.Context); state.Clear(); } + + // Get card that renders for adaptive card 1.0 + protected string GetCardName(ITurnContext context, string name) + { + if (Channel.GetChannelId(context) == Channels.Msteams) + { + name += ".1.0"; + } + + return name; + } } } \ No newline at end of file diff --git a/skills/src/csharp/experimental/eventskill/Dialogs/FindEventsDialog.cs b/skills/src/csharp/experimental/eventskill/Dialogs/FindEventsDialog.cs index 3f0c8a4ed8..e1980d6a62 100644 --- a/skills/src/csharp/experimental/eventskill/Dialogs/FindEventsDialog.cs +++ b/skills/src/csharp/experimental/eventskill/Dialogs/FindEventsDialog.cs @@ -95,7 +95,7 @@ private async Task FindEvents(WaterfallStepContext sc, Cancell Url = item.Url }; - cards.Add(new Card("EventCard", eventCardData)); + cards.Add(new Card(GetCardName(sc.Context, "EventCard"), eventCardData)); } await sc.Context.SendActivityAsync(ResponseManager.GetCardResponse(FindEventsResponses.FoundEvents, cards, null)); diff --git a/skills/src/csharp/experimental/eventskill/Dialogs/MainDialog.cs b/skills/src/csharp/experimental/eventskill/Dialogs/MainDialog.cs index 7c715969ab..de027ccfa1 100644 --- a/skills/src/csharp/experimental/eventskill/Dialogs/MainDialog.cs +++ b/skills/src/csharp/experimental/eventskill/Dialogs/MainDialog.cs @@ -237,7 +237,7 @@ private async Task OnLogout(DialogContext dc) private async Task PopulateStateFromSemanticAction(ITurnContext context) { - // Example of populating local state with data passed through semanticAction out of Activity + // Populating local state with data passed through semanticAction out of Activity var activity = context.Activity; var semanticAction = activity.SemanticAction; if (semanticAction != null && semanticAction.Entities.ContainsKey("location")) diff --git a/skills/src/csharp/experimental/eventskill/EventSkill.csproj b/skills/src/csharp/experimental/eventskill/EventSkill.csproj index 1c26cd793d..ce6adedd1e 100644 --- a/skills/src/csharp/experimental/eventskill/EventSkill.csproj +++ b/skills/src/csharp/experimental/eventskill/EventSkill.csproj @@ -7,6 +7,7 @@ + @@ -24,6 +25,7 @@ + diff --git a/skills/src/csharp/experimental/eventskill/Models/EventSkillState.cs b/skills/src/csharp/experimental/eventskill/Models/EventSkillState.cs index 69e903fce3..987e2e7df4 100644 --- a/skills/src/csharp/experimental/eventskill/Models/EventSkillState.cs +++ b/skills/src/csharp/experimental/eventskill/Models/EventSkillState.cs @@ -11,7 +11,7 @@ public class EventSkillState public EventLuis LuisResult { get; set; } - public string CurrentCoordinates { get; internal set; } + public string CurrentCoordinates { get; set; } public void Clear() { diff --git a/skills/src/csharp/experimental/hospitalityskill/Content/FoodItemCard.1.0.json b/skills/src/csharp/experimental/hospitalityskill/Content/FoodItemCard.1.0.json new file mode 100644 index 0000000000..12b016f352 --- /dev/null +++ b/skills/src/csharp/experimental/hospitalityskill/Content/FoodItemCard.1.0.json @@ -0,0 +1,51 @@ +{ + "type": "AdaptiveCard", + "id": "FoodItemCard", + "body": [ + { + "type": "ColumnSet", + "columns": [ + { + "type": "Column", + "items": [ + { + "type": "TextBlock", + "text": "{Quantity}", + "horizontalAlignment": "Center" + } + ], + "width": "auto" + }, + { + "type": "Column", + "items": [ + { + "type": "TextBlock", + "text": "{Name}" + }, + { + "type": "TextBlock", + "text": "{SpecialRequest}", + "spacing": "None" + } + ], + "width": "stretch" + }, + { + "type": "Column", + "items": [ + { + "type": "TextBlock", + "text": "${Price}", + "horizontalAlignment": "Right" + } + ], + "width": "auto" + } + ] + } + ], + "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", + "version": "1.0", + "speak": "{Speak}" +} \ No newline at end of file diff --git a/skills/src/csharp/experimental/hospitalityskill/Content/FoodItemCard.json b/skills/src/csharp/experimental/hospitalityskill/Content/FoodItemCard.json index 78478056d7..4f65ffebfd 100644 --- a/skills/src/csharp/experimental/hospitalityskill/Content/FoodItemCard.json +++ b/skills/src/csharp/experimental/hospitalityskill/Content/FoodItemCard.json @@ -14,7 +14,7 @@ "horizontalAlignment": "Center" } ], - "width": "40px" + "width": 10 }, { "type": "Column", @@ -30,7 +30,7 @@ "spacing": "None" } ], - "width": "stretch" + "width": 70 }, { "type": "Column", @@ -41,7 +41,7 @@ "horizontalAlignment": "Right" } ], - "width": "auto" + "width": 20 } ] } diff --git a/skills/src/csharp/experimental/hospitalityskill/Content/FoodOrderCard.1.0.json b/skills/src/csharp/experimental/hospitalityskill/Content/FoodOrderCard.1.0.json new file mode 100644 index 0000000000..4f46f2d6f6 --- /dev/null +++ b/skills/src/csharp/experimental/hospitalityskill/Content/FoodOrderCard.1.0.json @@ -0,0 +1,71 @@ +{ + "type": "AdaptiveCard", + "version": "1.0", + "id": "FoodOrderCard", + "body": [ + { + "type": "Container", + "items": [ + { + "type": "ColumnSet", + "columns": [ + { + "type": "Column", + "verticalContentAlignment": "Center", + "items": [ + { + "type": "TextBlock", + "id": "title", + "size": "Large", + "weight": "Bolder", + "color": "Dark", + "text": "Current Order" + } + ], + "width": "stretch" + } + ] + } + ] + }, + { + "type": "Container", + "id": "items", + "items": [] + }, + { + "type": "Container", + "items": [ + { + "type": "ColumnSet", + "columns": [ + { + "type": "Column", + "items": [ + { + "type": "TextBlock", + "text": "Bill Total", + "horizontalAlignment": "Right" + } + ], + "width": "stretch" + }, + { + "type": "Column", + "items": [ + { + "type": "TextBlock", + "weight": "Bolder", + "text": "${BillTotal}", + "horizontalAlignment": "Right" + } + ], + "width": "auto" + } + ] + } + ] + } + ], + "$schema": "http://adaptivecards.io/schemas/adaptive-card.json" +} \ No newline at end of file diff --git a/skills/src/csharp/experimental/hospitalityskill/Content/FoodOrderCard.json b/skills/src/csharp/experimental/hospitalityskill/Content/FoodOrderCard.json index 1ea3b7f4ab..259b64b5f2 100644 --- a/skills/src/csharp/experimental/hospitalityskill/Content/FoodOrderCard.json +++ b/skills/src/csharp/experimental/hospitalityskill/Content/FoodOrderCard.json @@ -60,7 +60,7 @@ "horizontalAlignment": "Center" } ], - "width": "40px" + "width": 10 }, { "type": "Column", @@ -71,7 +71,7 @@ "text": "Item" } ], - "width": "stretch" + "width": 70 }, { "type": "Column", @@ -83,7 +83,7 @@ "horizontalAlignment": "Right" } ], - "width": "auto" + "width": 20 } ] } diff --git a/skills/src/csharp/experimental/hospitalityskill/Content/MenuCard.1.0.json b/skills/src/csharp/experimental/hospitalityskill/Content/MenuCard.1.0.json new file mode 100644 index 0000000000..5c682a695c --- /dev/null +++ b/skills/src/csharp/experimental/hospitalityskill/Content/MenuCard.1.0.json @@ -0,0 +1,45 @@ +{ + "type": "AdaptiveCard", + "id": "MenuCard", + "body": [ + { + "type": "Container", + "items": [ + { + "type": "ColumnSet", + "columns": [ + { + "type": "Column", + "verticalContentAlignment": "Center", + "items": [ + { + "type": "TextBlock", + "id": "title", + "size": "Large", + "weight": "Bolder", + "color": "Dark", + "text": "{Type} Menu" + } + ], + "width": "stretch" + } + ] + }, + { + "type": "TextBlock", + "text": "{TimeAvailable}", + "weight": "Bolder", + "color": "Dark" + } + ] + }, + { + "type": "Container", + "id": "items", + "items": [] + } + ], + "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", + "version": "1.0", + "speak": "{Speak}" +} \ No newline at end of file diff --git a/skills/src/csharp/experimental/hospitalityskill/Content/MenuItemCard.1.0.json b/skills/src/csharp/experimental/hospitalityskill/Content/MenuItemCard.1.0.json new file mode 100644 index 0000000000..a12cbcda50 --- /dev/null +++ b/skills/src/csharp/experimental/hospitalityskill/Content/MenuItemCard.1.0.json @@ -0,0 +1,36 @@ +{ + "type": "AdaptiveCard", + "id": "MenuItemCard", + "body": [ + { + "type": "Container", + "items": [ + { + "type": "ColumnSet", + "columns": [ + { + "type": "Column", + "width": "auto", + "items": [ + { + "type": "TextBlock", + "text": "{Name} {Price}", + "weight": "Bolder" + } + ] + } + ] + }, + { + "type": "TextBlock", + "text": "{Description}", + "wrap": true, + "horizontalAlignment": "Left", + "spacing": "None" + } + ] + } + ], + "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", + "version": "1.0" +} \ No newline at end of file diff --git a/skills/src/csharp/experimental/hospitalityskill/Content/RequestItemCard.1.0.json b/skills/src/csharp/experimental/hospitalityskill/Content/RequestItemCard.1.0.json new file mode 100644 index 0000000000..23ebb063d1 --- /dev/null +++ b/skills/src/csharp/experimental/hospitalityskill/Content/RequestItemCard.1.0.json @@ -0,0 +1,38 @@ +{ + "type": "AdaptiveCard", + "version": "1.0", + "id": "RequestItemCard", + "body": [ + { + "type": "Container", + "items": [ + { + "type": "ColumnSet", + "columns": [ + { + "type": "Column", + "verticalContentAlignment": "Center", + "items": [ + { + "type": "TextBlock", + "id": "title", + "size": "Large", + "weight": "Bolder", + "color": "Dark", + "text": "Your Item Requests" + } + ], + "width": "stretch" + } + ] + } + ] + }, + { + "type": "Container", + "id": "items", + "items": [] + } + ], + "$schema": "http://adaptivecards.io/schemas/adaptive-card.json" +} \ No newline at end of file diff --git a/skills/src/csharp/experimental/hospitalityskill/Content/RequestItemCard.json b/skills/src/csharp/experimental/hospitalityskill/Content/RequestItemCard.json index bf394ae35e..8980af0f1e 100644 --- a/skills/src/csharp/experimental/hospitalityskill/Content/RequestItemCard.json +++ b/skills/src/csharp/experimental/hospitalityskill/Content/RequestItemCard.json @@ -60,7 +60,7 @@ "horizontalAlignment": "Center" } ], - "width": "40px" + "width": 10 }, { "type": "Column", @@ -71,7 +71,7 @@ "text": "Item" } ], - "width": "stretch" + "width": 90 } ] } diff --git a/skills/src/csharp/experimental/hospitalityskill/Content/ReservationDetails.1.0.json b/skills/src/csharp/experimental/hospitalityskill/Content/ReservationDetails.1.0.json new file mode 100644 index 0000000000..406759ec80 --- /dev/null +++ b/skills/src/csharp/experimental/hospitalityskill/Content/ReservationDetails.1.0.json @@ -0,0 +1,46 @@ +{ + "type": "AdaptiveCard", + "id": "ReservationDetails", + "body": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "id": "title", + "size": "Large", + "weight": "Bolder", + "color": "Dark", + "text": "{Title}" + } + ], + "width": "stretch" + }, + { + "type": "Container", + "id": "items", + "items": [ + { + "type": "FactSet", + "facts": [ + { + "title": "Check-in Date", + "value": "{CheckInDate}" + }, + { + "title": "Check-out Date", + "value": "{CheckOutDate}" + }, + { + "title": "Check-out Time", + "value": "{CheckOutTime}" + } + ] + } + ] + } + ], + "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", + "version": "1.0", + "speak": "{Speak}" +} \ No newline at end of file diff --git a/skills/src/csharp/experimental/hospitalityskill/Content/RoomItemCard.1.0.json b/skills/src/csharp/experimental/hospitalityskill/Content/RoomItemCard.1.0.json new file mode 100644 index 0000000000..c3720d8b64 --- /dev/null +++ b/skills/src/csharp/experimental/hospitalityskill/Content/RoomItemCard.1.0.json @@ -0,0 +1,34 @@ +{ + "type": "AdaptiveCard", + "version": "1.0", + "id": "RoomItemCard", + "body": [ + { + "type": "ColumnSet", + "columns": [ + { + "type": "Column", + "items": [ + { + "type": "TextBlock", + "text": "{Quantity}", + "horizontalAlignment": "Center" + } + ], + "width": "auto" + }, + { + "type": "Column", + "items": [ + { + "type": "TextBlock", + "text": "{Item}" + } + ], + "width": "stretch" + } + ] + } + ], + "$schema": "http://adaptivecards.io/schemas/adaptive-card.json" +} \ No newline at end of file diff --git a/skills/src/csharp/experimental/hospitalityskill/Content/RoomItemCard.json b/skills/src/csharp/experimental/hospitalityskill/Content/RoomItemCard.json index 729f33e310..dc4883acaa 100644 --- a/skills/src/csharp/experimental/hospitalityskill/Content/RoomItemCard.json +++ b/skills/src/csharp/experimental/hospitalityskill/Content/RoomItemCard.json @@ -15,7 +15,7 @@ "horizontalAlignment": "Center" } ], - "width": "40px" + "width": 10 }, { "type": "Column", @@ -25,7 +25,7 @@ "text": "{Item}" } ], - "width": "stretch" + "width": 90 } ] } diff --git a/skills/src/csharp/experimental/hospitalityskill/Data/AvailableItems.json b/skills/src/csharp/experimental/hospitalityskill/Data/AvailableItems.json index 4e40df6f7c..f66478d641 100644 --- a/skills/src/csharp/experimental/hospitalityskill/Data/AvailableItems.json +++ b/skills/src/csharp/experimental/hospitalityskill/Data/AvailableItems.json @@ -13,7 +13,7 @@ }, { "item": "Conditioner", - "names": [ "conditioner", "conditioners", "conditioner bottle", "conditioner bottles", "bottle of conditioner", "bottles of conditioner" ] + "names": [ "conditioner", "conditioners", "conditioner bottle", "conditioner bottles", "bottle of conditioner", "bottles of conditioner", "hair conditioner", "hair conditioners" ] }, { "item": "Body Wash", @@ -62,5 +62,17 @@ { "item": "Tissue Box", "names": [ "tissue box", "tissue boxes", "tissues", "tissue", "box of tissue", "box of tissues" ] + }, + { + "item": "Workout Clothes", + "names": [ "workout clothes", "work out clothes", "work out clothing", "workout clothing", "gym clothes", "exercise clothes" ] + }, + { + "item": "Running Shoes", + "names": [ "running shoes", "exercise shoes", "workout shoes", "workout shoes", "tennis shoes" ] + }, + { + "item": "Umbrella", + "names": [ "umbrella", "umbrellas" ] } ] diff --git a/skills/src/csharp/experimental/hospitalityskill/Data/RoomServiceMenu.json b/skills/src/csharp/experimental/hospitalityskill/Data/RoomServiceMenu.json index d233871fc5..13a6f41bac 100644 --- a/skills/src/csharp/experimental/hospitalityskill/Data/RoomServiceMenu.json +++ b/skills/src/csharp/experimental/hospitalityskill/Data/RoomServiceMenu.json @@ -101,7 +101,7 @@ "name": "French Fries", "allNames": [ "french fries", "french fry" ], "glutenFree": true, - "vegetarian": true, + "vegetarian": true, "price": 6 }, { @@ -130,6 +130,21 @@ "vegetarian": true, "price": 7, "description": "Two scoops of vanilla ice cream" + }, + { + "name": "Coffee", + "allNames": [ "coffee", "cup of coffee", "coffees" ], + "glutenFree": true, + "vegetarian": true, + "price": 3, + "description": "Latte, mocha, cappuccino, espresso, and macchiato available." + }, + { + "name": "Water Bottle", + "allNames": [ "water bottle", "water bottles", "bottles of water", "bottle of water", "water", "waters" ], + "glutenFree": true, + "vegetarian": true, + "price": 3 } ] } diff --git a/skills/src/csharp/experimental/hospitalityskill/Deployment/Resources/LU/en/Hospitality.lu b/skills/src/csharp/experimental/hospitalityskill/Deployment/Resources/LU/en/Hospitality.lu index b5b30018d7..529cc208c4 100644 --- a/skills/src/csharp/experimental/hospitalityskill/Deployment/Resources/LU/en/Hospitality.lu +++ b/skills/src/csharp/experimental/hospitalityskill/Deployment/Resources/LU/en/Hospitality.lu @@ -1,4 +1,4 @@ -> ! Automatically generated by [LUDown CLI](https://github.com/Microsoft/botbuilder-tools/tree/master/Ludown), Thu Aug 15 2019 15:40:54 GMT-0700 (Pacific Daylight Time) +> ! Automatically generated by [LUDown CLI](https://github.com/Microsoft/botbuilder-tools/tree/master/Ludown), Mon Aug 26 2019 12:38:00 GMT-0700 (Pacific Daylight Time) > ! Source LUIS JSON file: stdin @@ -192,6 +192,8 @@ - can i see a lunch menu - can i see a room service menu - can you bring me {FoodRequest=3 {Food=chocolate chip cookies}} +- can you please send me some food? +- can you send me somethink to drink? - do you have room service - i also want {FoodRequest=2 {Food=parfaits}} - i need {FoodRequest=1 more {Food=brownie}} @@ -202,6 +204,8 @@ - i need a {Food=scrambled egg burrito} - i need a {FoodRequest={Food=turkey sandwich} {SpecialRequest=with extra mayo}} now - i need more {Food=orange juice} +- i need some food +- i need somthing to drink - i want {FoodRequest=2 {Food=cookies}}, a {FoodRequest={Food=cobb salad} {SpecialRequest=without chicken}} and {FoodRequest=3 {Food=salmons}} - i want {FoodRequest=2 things of {Food=sorbet}} and an {Food=earl grey tea} - i want a {FoodRequest={SpecialRequest=vegetarian} {Food=cobb salad}} @@ -211,6 +215,7 @@ - i want to order an {Food=egg white omelet} - i want to order from the all day menu - i want to order room service +- i'm hungry - order {FoodRequest=2 {Food=muffins}} and {FoodRequest=3 {Food=butter croissants}} - show me a dinner menu - what are the room service options for this hotel @@ -238,11 +243,11 @@ $PREBUILT:number > # Phrase list definitions $Items:phraseList interchangeable -- shampoo,conditioner,towel,hand towel,bath towel,pillow,pillows,pillow case,blanket,blankets,tissues,tissue box,lotion,moisturizer,body lotion,sheets,down pillow,feather pillow,bar of soap,dish soap,laundry detergent,soap,toothpaste,deodorant,towels,toothbrush,toilet paper,body wash,sunscreen,cushion,lip balm,perfume,toothbrushes,mouthwash,shaving cream,detergent,hand sanitizer,shower gel,hand soap,hand lotion,hand cream,liquid soap,bar soap,paper towels,baby wipes,purell,hair conditioner,laundry soap,fabric softener,facial tissue,kleenex,trash bags,hair dryer,detergent powder,cleaning supplies,garbage bags,toiletries,cutlery,cleaning products,bedding,duvet,comforter,comforters,bedspread,pillowcase,duvets,pillowcases,bedspreads,linens,bedsheets,bedlinen,bedclothes,bed sheets,bedsheet,bedcovers,washcloths,bathmats,bathmat,bed sheet,handtowel,washclothes,toiletpaper,facecloths,handtowels,soap/shampoo,papertowels,babywipes,loofas,kleenexes,washrag,dishsoap,waterbottles,papertowel,qtips,chap stick,q tips,q tip,ziplocs,qtip,band aids,zip loc,ziploc,cottonballs,swabs,cotton tipped,bandaids,ziplock,bandaid,band aid,bandages,zip lock,guaze,swab,neosporin,wipes,gauze,bandage,antiseptic,trashbag,ointment,tweezers,scissors,thermometer,nail clippers,safety pins,mirror,comb,nail file,brush,sewing kit,q-tips,razor,dental floss,hairspray,shower cap,slippers,hairbrush,hair brush,combs,bobby pins,brushes,razors,hairbrushes,deoderant,shampoo/conditioner,shaver,chapstick,antiperspirant,anti perspirant,deodarant,bodywash,facewash,face wash,face cream,eye cream,cup,mug,fork,knife,spoon,bowl,cups,spoons,plate,pot,glass,plates,bowls,pan,mugs,pots,dish +- shampoo,conditioner,towel,hand towel,bath towel,pillow,pillows,pillow case,blanket,blankets,tissues,tissue box,lotion,moisturizer,body lotion,sheets,down pillow,feather pillow,bar of soap,dish soap,laundry detergent,soap,toothpaste,deodorant,towels,toothbrush,toilet paper,body wash,sunscreen,cushion,lip balm,perfume,toothbrushes,mouthwash,shaving cream,detergent,hand sanitizer,shower gel,hand soap,hand lotion,hand cream,liquid soap,bar soap,paper towels,baby wipes,purell,hair conditioner,laundry soap,fabric softener,facial tissue,kleenex,trash bags,hair dryer,detergent powder,cleaning supplies,garbage bags,toiletries,cutlery,cleaning products,bedding,duvet,comforter,comforters,bedspread,pillowcase,duvets,pillowcases,bedspreads,linens,bedsheets,bedlinen,bedclothes,bed sheets,bedsheet,bedcovers,washcloths,bathmats,bathmat,bed sheet,handtowel,washclothes,toiletpaper,facecloths,handtowels,soap/shampoo,papertowels,babywipes,loofas,kleenexes,washrag,dishsoap,waterbottles,papertowel,qtips,chap stick,q tips,q tip,ziplocs,qtip,band aids,zip loc,ziploc,cottonballs,swabs,cotton tipped,bandaids,ziplock,bandaid,band aid,bandages,zip lock,guaze,swab,neosporin,wipes,gauze,bandage,antiseptic,trashbag,ointment,tweezers,scissors,thermometer,nail clippers,safety pins,mirror,comb,nail file,brush,sewing kit,q-tips,razor,dental floss,hairspray,shower cap,slippers,hairbrush,hair brush,combs,bobby pins,brushes,razors,hairbrushes,deoderant,shampoo/conditioner,shaver,chapstick,antiperspirant,anti perspirant,deodarant,bodywash,facewash,face wash,face cream,eye cream,mug,fork,knife,spoon,bowl,spoons,plate,pot,glass,plates,bowls,pan,mugs,pots,dish,workout clothes,work out clothes,running shoes,umbrella $Requests:phraseList interchangeable - vegetarian,gluten free,gluten friendly,without cheese on top,no tomatoes,with extra bacon,no meat,with extra ketchup,without meat,with extra ice,without nuts,with no lettuce or tomato,with the dressing on the side,on an english muffin,on gluten free bread,without jalapenos,with no mushrooms,without bacon,with milk,with sugar and milk,no dairy,dairy free,with extra cheese,without lettuce,without tomato,without chicken,with extra fruit,without fruit $Foods:phraseList interchangeable -- scrambled egg burrito,toasted bagel sandwich,butter croissant,yogurt parfait,cobb salad,chicken quesadilla,french fries,red pepper hummus,chocolate chip cookies,turkey sandwich,signature burger,garlic brushed salmon filet,smoked mac and cheese,lemon berry burst cake,ice cream,parfait,cookie,croissant,quesadilla,hummus,salmon +- scrambled egg burrito,toasted bagel sandwich,butter croissant,yogurt parfait,cobb salad,chicken quesadilla,french fries,red pepper hummus,chocolate chip cookies,turkey sandwich,signature burger,garlic brushed salmon filet,smoked mac and cheese,lemon berry burst cake,ice cream,parfait,cookie,croissant,quesadilla,hummus,salmon,coffee,cup of coffee > # List entities diff --git a/skills/src/csharp/experimental/hospitalityskill/Dialogs/ExtendStayDialog.cs b/skills/src/csharp/experimental/hospitalityskill/Dialogs/ExtendStayDialog.cs index 801f58971c..7a6e174c2e 100644 --- a/skills/src/csharp/experimental/hospitalityskill/Dialogs/ExtendStayDialog.cs +++ b/skills/src/csharp/experimental/hospitalityskill/Dialogs/ExtendStayDialog.cs @@ -262,7 +262,7 @@ private async Task EndDialog(WaterfallStepContext sc, Cancella cardData.Title = string.Format(HospitalityStrings.UpdateReservation); // check out date moved confirmation - var reply = ResponseManager.GetCardResponse(ExtendStayResponses.ExtendStaySuccess, new Card("ReservationDetails", cardData), tokens); + var reply = ResponseManager.GetCardResponse(ExtendStayResponses.ExtendStaySuccess, new Card(GetCardName(sc.Context, "ReservationDetails"), cardData), tokens); await sc.Context.SendActivityAsync(reply); } diff --git a/skills/src/csharp/experimental/hospitalityskill/Dialogs/GetReservationDialog.cs b/skills/src/csharp/experimental/hospitalityskill/Dialogs/GetReservationDialog.cs index 9b330e29c3..0746f7e8a0 100644 --- a/skills/src/csharp/experimental/hospitalityskill/Dialogs/GetReservationDialog.cs +++ b/skills/src/csharp/experimental/hospitalityskill/Dialogs/GetReservationDialog.cs @@ -42,7 +42,7 @@ private async Task ShowReservation(WaterfallStepContext sc, Ca cardData.Title = string.Format(HospitalityStrings.ReservationDetails); // send card with reservation details - var reply = ResponseManager.GetCardResponse(GetReservationResponses.ShowReservationDetails, new Card("ReservationDetails", cardData), null); + var reply = ResponseManager.GetCardResponse(GetReservationResponses.ShowReservationDetails, new Card(GetCardName(sc.Context, "ReservationDetails"), cardData), null); await sc.Context.SendActivityAsync(reply); return await sc.EndDialogAsync(); } diff --git a/skills/src/csharp/experimental/hospitalityskill/Dialogs/HospitalityDialogBase.cs b/skills/src/csharp/experimental/hospitalityskill/Dialogs/HospitalityDialogBase.cs index 1cfd928272..1be2e38023 100644 --- a/skills/src/csharp/experimental/hospitalityskill/Dialogs/HospitalityDialogBase.cs +++ b/skills/src/csharp/experimental/hospitalityskill/Dialogs/HospitalityDialogBase.cs @@ -12,10 +12,12 @@ using Luis; using Microsoft.Bot.Builder; using Microsoft.Bot.Builder.Dialogs; +using Microsoft.Bot.Builder.Dialogs.Choices; using Microsoft.Bot.Builder.Skills; using Microsoft.Bot.Builder.Solutions.Authentication; using Microsoft.Bot.Builder.Solutions.Responses; using Microsoft.Bot.Builder.Solutions.Util; +using Microsoft.Bot.Connector; using Microsoft.Bot.Schema; namespace HospitalitySkill.Dialogs @@ -193,5 +195,16 @@ protected async Task HasCheckedOut(WaterfallStepContext sc, Ca return await sc.NextAsync(); } + + // Get card that renders for adaptive card 1.0 + protected string GetCardName(ITurnContext context, string name) + { + if (Channel.GetChannelId(context) == Channels.Msteams) + { + name += ".1.0"; + } + + return name; + } } } \ No newline at end of file diff --git a/skills/src/csharp/experimental/hospitalityskill/Dialogs/LateCheckOutDialog.cs b/skills/src/csharp/experimental/hospitalityskill/Dialogs/LateCheckOutDialog.cs index 5fe80561a3..4bab980005 100644 --- a/skills/src/csharp/experimental/hospitalityskill/Dialogs/LateCheckOutDialog.cs +++ b/skills/src/csharp/experimental/hospitalityskill/Dialogs/LateCheckOutDialog.cs @@ -48,7 +48,7 @@ private async Task LateCheckOutPrompt(WaterfallStepContext sc, var cardData = userState.UserReservation; cardData.Title = string.Format(HospitalityStrings.ReservationDetails); - var reply = ResponseManager.GetCardResponse(LateCheckOutResponses.HasLateCheckOut, new Card("ReservationDetails", cardData), null); + var reply = ResponseManager.GetCardResponse(LateCheckOutResponses.HasLateCheckOut, new Card(GetCardName(sc.Context, "ReservationDetails"), cardData), null); await sc.Context.SendActivityAsync(reply); return await sc.EndDialogAsync(); @@ -112,7 +112,7 @@ private async Task EndDialog(WaterfallStepContext sc, Cancella cardData.Title = string.Format(HospitalityStrings.UpdateReservation); // check out time moved confirmation - var reply = ResponseManager.GetCardResponse(LateCheckOutResponses.MoveCheckOutSuccess, new Card("ReservationDetails", cardData), tokens); + var reply = ResponseManager.GetCardResponse(LateCheckOutResponses.MoveCheckOutSuccess, new Card(GetCardName(sc.Context, "ReservationDetails"), cardData), tokens); await sc.Context.SendActivityAsync(reply); } diff --git a/skills/src/csharp/experimental/hospitalityskill/Dialogs/RequestItemDialog.cs b/skills/src/csharp/experimental/hospitalityskill/Dialogs/RequestItemDialog.cs index 1c8e008e4d..a6d7904175 100644 --- a/skills/src/csharp/experimental/hospitalityskill/Dialogs/RequestItemDialog.cs +++ b/skills/src/csharp/experimental/hospitalityskill/Dialogs/RequestItemDialog.cs @@ -181,13 +181,13 @@ private async Task EndDialog(WaterfallStepContext sc, Cancella Quantity = itemRequest.number == null ? 1 : (int)itemRequest.number[0] }; - roomItems.Add(new Card("RoomItemCard", roomItem)); + roomItems.Add(new Card(GetCardName(sc.Context, "RoomItemCard"), roomItem)); } await _hotelService.RequestItems(convState.ItemList); // if at least one item was available send this card reply - await sc.Context.SendActivityAsync(ResponseManager.GetCardResponse(null, new Card("RequestItemCard"), null, "items", roomItems)); + await sc.Context.SendActivityAsync(ResponseManager.GetCardResponse(null, new Card(GetCardName(sc.Context, "RequestItemCard")), null, "items", roomItems)); await sc.Context.SendActivityAsync(ResponseManager.GetResponse(RequestItemResponses.ItemsRequested)); } diff --git a/skills/src/csharp/experimental/hospitalityskill/Dialogs/RoomServiceDialog.cs b/skills/src/csharp/experimental/hospitalityskill/Dialogs/RoomServiceDialog.cs index 208db3e036..3fe086aa40 100644 --- a/skills/src/csharp/experimental/hospitalityskill/Dialogs/RoomServiceDialog.cs +++ b/skills/src/csharp/experimental/hospitalityskill/Dialogs/RoomServiceDialog.cs @@ -8,7 +8,10 @@ using HospitalitySkill.Services; using Microsoft.Bot.Builder; using Microsoft.Bot.Builder.Dialogs; +using Microsoft.Bot.Builder.Dialogs.Choices; using Microsoft.Bot.Builder.Solutions.Responses; +using Microsoft.Bot.Connector; +using Microsoft.Bot.Schema; using static Luis.HospitalityLuis._Entities; namespace HospitalitySkill.Dialogs @@ -57,9 +60,29 @@ private async Task MenuPrompt(WaterfallStepContext sc, Cancell // didn't order, prompt if 1 menu type not identified if (convState.FoodList.Count == 0 && string.IsNullOrWhiteSpace(menu?[0][0]) && menu?.Length != 1) { + var prompt = ResponseManager.GetResponse(RoomServiceResponses.MenuPrompt).Text; + + + var actions = new List() + { + new CardAction(type: ActionTypes.ImBack, title: "Breakfast", value: "Breakfast menu"), + new CardAction(type: ActionTypes.ImBack, title: "Lunch", value: "Lunch menu"), + new CardAction(type: ActionTypes.ImBack, title: "Dinner", value: "Dinner menu"), + new CardAction(type: ActionTypes.ImBack, title: "24 Hour", value: "24 hour menu") + }; + + var activity = MessageFactory.SuggestedActions(actions, prompt); + + // create hero card instead when channel does not support suggested actions + if (!Channel.SupportsSuggestedActions(sc.Context.Activity.ChannelId)) + { + var hero = new HeroCard(buttons: actions); + activity = MessageFactory.Attachment(hero.ToAttachment(), prompt); + } + return await sc.PromptAsync(DialogIds.MenuPrompt, new PromptOptions() { - Prompt = ResponseManager.GetResponse(RoomServiceResponses.MenuPrompt), + Prompt = (Activity)activity, RetryPrompt = ResponseManager.GetResponse(RoomServiceResponses.ChooseOneMenu) }); } @@ -93,11 +116,19 @@ private async Task ShowMenuCard(WaterfallStepContext sc, Cance List menuItems = new List(); foreach (var item in menu.Items) { - menuItems.Add(new Card("MenuItemCard", item)); + var cardName = GetCardName(sc.Context, "MenuItemCard"); + + // workaround for webchat not supporting hidden items on cards + if (Channel.GetChannelId(sc.Context) == Channels.Webchat) + { + cardName += ".1.0"; + } + + menuItems.Add(new Card(cardName, item)); } // show menu card - await sc.Context.SendActivityAsync(ResponseManager.GetCardResponse(null, new Card("MenuCard", menu), null, "items", menuItems)); + await sc.Context.SendActivityAsync(ResponseManager.GetCardResponse(null, new Card(GetCardName(sc.Context, "MenuCard"), menu), null, "items", menuItems)); // prompt for order return await sc.PromptAsync(DialogIds.FoodOrderPrompt, new PromptOptions() @@ -153,10 +184,17 @@ private async Task ValidateAddItems(PromptValidatorContext promptC private async Task ConfirmOrderPrompt(WaterfallStepContext sc, CancellationToken cancellationToken) { - return await sc.PromptAsync(DialogIds.ConfirmOrder, new PromptOptions() + var convState = await StateAccessor.GetAsync(sc.Context, () => new HospitalitySkillState()); + + if (convState.FoodList.Count > 0) { - Prompt = ResponseManager.GetResponse(RoomServiceResponses.ConfirmOrder) - }); + return await sc.PromptAsync(DialogIds.ConfirmOrder, new PromptOptions() + { + Prompt = ResponseManager.GetResponse(RoomServiceResponses.ConfirmOrder) + }); + } + + return await sc.NextAsync(false); } private async Task EndDialog(WaterfallStepContext sc, CancellationToken cancellationToken) @@ -205,7 +243,7 @@ private async Task ShowFoodOrder(ITurnContext turnContext) SpecialRequest = foodRequest.SpecialRequest == null ? null : foodRequest.SpecialRequest[0] }; - foodItems.Add(new Card("FoodItemCard", foodItemData)); + foodItems.Add(new Card(GetCardName(turnContext, "FoodItemCard"), foodItemData)); // add up bill totalFoodOrder.BillTotal += foodItemData.Price * foodItemData.Quantity; @@ -219,7 +257,7 @@ private async Task ShowFoodOrder(ITurnContext turnContext) if (convState.FoodList.Count > 0) { - await turnContext.SendActivityAsync(ResponseManager.GetCardResponse(null, new Card("FoodOrderCard", totalFoodOrder), null, "items", foodItems)); + await turnContext.SendActivityAsync(ResponseManager.GetCardResponse(null, new Card(GetCardName(turnContext, "FoodOrderCard"), totalFoodOrder), null, "items", foodItems)); } } diff --git a/skills/src/csharp/experimental/hospitalityskill/HospitalitySkill.csproj b/skills/src/csharp/experimental/hospitalityskill/HospitalitySkill.csproj index e539f5fcda..d373575704 100644 --- a/skills/src/csharp/experimental/hospitalityskill/HospitalitySkill.csproj +++ b/skills/src/csharp/experimental/hospitalityskill/HospitalitySkill.csproj @@ -7,12 +7,19 @@ + + + + + + + @@ -37,12 +44,19 @@ + + + + + + + diff --git a/skills/src/csharp/experimental/musicskill/MusicSkill.csproj b/skills/src/csharp/experimental/musicskill/MusicSkill.csproj index b38adaf310..b2b92ccdb5 100644 --- a/skills/src/csharp/experimental/musicskill/MusicSkill.csproj +++ b/skills/src/csharp/experimental/musicskill/MusicSkill.csproj @@ -87,11 +87,6 @@ True deploy.ps1 - - True - True - deploy_cognitive_models.ps1 - True True @@ -107,11 +102,6 @@ True MainResponses.tt - - True - True - ResponseIdCollection.t4 - True True diff --git a/skills/src/csharp/experimental/newsskill/Dialogs/MainDialog.cs b/skills/src/csharp/experimental/newsskill/Dialogs/MainDialog.cs index 546f6159ca..08aebbd664 100644 --- a/skills/src/csharp/experimental/newsskill/Dialogs/MainDialog.cs +++ b/skills/src/csharp/experimental/newsskill/Dialogs/MainDialog.cs @@ -58,6 +58,9 @@ public MainDialog( { var state = await _stateAccessor.GetAsync(dc.Context, () => new NewsSkillState()); + // Populate state from SemanticAction as required + await PopulateStateFromSemanticAction(dc.Context); + // If dispatch result is general luis model _services.CognitiveModelSets["en"].LuisServices.TryGetValue("News", out var luisService); @@ -90,7 +93,7 @@ public MainDialog( turnResult = await dc.BeginDialogAsync(nameof(FavoriteTopicsDialog)); break; } - + case NewsLuis.Intent.FindArticles: { // send greeting response @@ -187,5 +190,19 @@ private async Task OnHelp(DialogContext dc) await _responder.ReplyWith(dc.Context, MainResponses.Help); return InterruptionAction.MessageSentToUser; } + + private async Task PopulateStateFromSemanticAction(ITurnContext context) + { + // Populating local state with data passed through semanticAction out of Activity + var activity = context.Activity; + var semanticAction = activity.SemanticAction; + if (semanticAction != null && semanticAction.Entities.ContainsKey("location")) + { + var location = semanticAction.Entities["location"]; + var locationObj = location.Properties["location"].ToString(); + var state = await _stateAccessor.GetAsync(context, () => new NewsSkillState()); + state.CurrentCoordinates = locationObj; + } + } } } \ No newline at end of file diff --git a/skills/src/csharp/experimental/newsskill/Dialogs/NewsDialogBase.cs b/skills/src/csharp/experimental/newsskill/Dialogs/NewsDialogBase.cs index c9b51fbb84..60b7534127 100644 --- a/skills/src/csharp/experimental/newsskill/Dialogs/NewsDialogBase.cs +++ b/skills/src/csharp/experimental/newsskill/Dialogs/NewsDialogBase.cs @@ -71,12 +71,18 @@ public async Task HandleDialogExceptions(WaterfallStepContext sc, Exc protected async Task GetMarket(WaterfallStepContext sc, CancellationToken cancellationToken) { var userState = await UserAccessor.GetAsync(sc.Context, () => new NewsSkillUserState()); + var convState = await ConvAccessor.GetAsync(sc.Context, () => new NewsSkillState()); // Check if there's already a location if (!string.IsNullOrWhiteSpace(userState.Market)) { return await sc.NextAsync(userState.Market); } + else if (!string.IsNullOrWhiteSpace(convState.CurrentCoordinates)) + { + // make maps service query with location coordinates instead of user input + return await sc.NextAsync(convState.CurrentCoordinates); + } // Prompt user for location return await sc.PromptAsync(nameof(TextPrompt), new PromptOptions() diff --git a/skills/src/csharp/experimental/newsskill/Models/NewsSkillState.cs b/skills/src/csharp/experimental/newsskill/Models/NewsSkillState.cs index 88657e0532..6c7fede1da 100644 --- a/skills/src/csharp/experimental/newsskill/Models/NewsSkillState.cs +++ b/skills/src/csharp/experimental/newsskill/Models/NewsSkillState.cs @@ -7,5 +7,7 @@ public NewsSkillState() } public Luis.NewsLuis LuisResult { get; set; } + + public string CurrentCoordinates { get; set; } } } diff --git a/skills/src/csharp/experimental/newsskill/manifestTemplate.json b/skills/src/csharp/experimental/newsskill/manifestTemplate.json index b4a86fb88f..693fc2af24 100644 --- a/skills/src/csharp/experimental/newsskill/manifestTemplate.json +++ b/skills/src/csharp/experimental/newsskill/manifestTemplate.json @@ -9,7 +9,14 @@ "id": "newsSkill_findArticles", "definition": { "description": "Find News articles.", - "slots": [], + "slots": [ + { + "name": "location", + "types": [ + "string" + ] + } + ], "triggers": { "utteranceSources": [ { @@ -26,7 +33,14 @@ "id": "newsSkill_trendingArticles", "definition": { "description": "Show articles currently trending on social media.", - "slots": [], + "slots": [ + { + "name": "location", + "types": [ + "string" + ] + } + ], "triggers": { "utteranceSources": [ { @@ -43,7 +57,14 @@ "id": "newsSkill_setFavoriteTopics", "definition": { "description": "Set the user's favorite news topic.", - "slots": [], + "slots": [ + { + "name": "location", + "types": [ + "string" + ] + } + ], "triggers": { "utteranceSources": [ { @@ -60,7 +81,14 @@ "id": "newsSkill_showFavoriteTopics", "definition": { "description": "Show news articles of the user's currently set favorite topic.", - "slots": [], + "slots": [ + { + "name": "location", + "types": [ + "string" + ] + } + ], "triggers": { "utteranceSources": [ { diff --git a/skills/src/csharp/experimental/weatherskill/Dialogs/MainDialog.cs b/skills/src/csharp/experimental/weatherskill/Dialogs/MainDialog.cs index a30966863d..ab67c44701 100644 --- a/skills/src/csharp/experimental/weatherskill/Dialogs/MainDialog.cs +++ b/skills/src/csharp/experimental/weatherskill/Dialogs/MainDialog.cs @@ -260,18 +260,15 @@ private async Task OnLogout(DialogContext dc) private async Task PopulateStateFromSkillContext(ITurnContext context) { - // If we have a SkillContext object populated from the SkillMiddleware we can retrieve requests slot (parameter) data - // and make available in local state as appropriate. - var skillContext = await _contextAccessor.GetAsync(context, () => new SkillContext()); - if (skillContext != null) + // Populating local state with data passed through semanticAction out of Activity + var activity = context.Activity; + var semanticAction = activity.SemanticAction; + if (semanticAction != null && semanticAction.Entities.ContainsKey("location")) { - // Example of populating local state with data passed through Skill Context - // if (skillContext.ContainsKey("Location")) - // { - // // Add to your local state - // var state = await _stateAccessor.GetAsync(context, () => new SkillState()); - // state.Location = skillContext["Location"]; - // } + var location = semanticAction.Entities["location"]; + var locationObj = location.Properties["location"].ToString(); + var state = await _stateAccessor.GetAsync(context, () => new SkillState()); + state.Geography = locationObj; } } diff --git a/skills/src/csharp/experimental/weatherskill/WeatherSkill.csproj b/skills/src/csharp/experimental/weatherskill/WeatherSkill.csproj index f5ec0d9c50..e4b6153b70 100644 --- a/skills/src/csharp/experimental/weatherskill/WeatherSkill.csproj +++ b/skills/src/csharp/experimental/weatherskill/WeatherSkill.csproj @@ -3,6 +3,7 @@ netcoreapp2.2 NU1701 + bf895f98-5182-4f36-a89d-d52cdde1a45c diff --git a/skills/src/csharp/experimental/weatherskill/manifestTemplate.json b/skills/src/csharp/experimental/weatherskill/manifestTemplate.json index 5ef406e0ca..b5fc87cc07 100644 --- a/skills/src/csharp/experimental/weatherskill/manifestTemplate.json +++ b/skills/src/csharp/experimental/weatherskill/manifestTemplate.json @@ -9,7 +9,14 @@ "id": "WeatherSkill_getForecast", "definition": { "description": "Showing the weather forecast.", - "slots": [], + "slots": [ + { + "name": "location", + "types": [ + "string" + ] + } + ], "triggers": { "utteranceSources": [ { diff --git a/solutions/HospitalitySample/Content/NewUserGreeting.1.0.json b/solutions/HospitalitySample/Content/NewUserGreeting.1.0.json new file mode 100644 index 0000000000..a05e613192 --- /dev/null +++ b/solutions/HospitalitySample/Content/NewUserGreeting.1.0.json @@ -0,0 +1,45 @@ +{ + "type": "AdaptiveCard", + "id": "NewUserGreeting", + "backgroundImage": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAACeCAYAAACvg+F+AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAAhdEVYdENyZWF0aW9uIFRpbWUAMjAxOTowMzoxMyAxOTo0Mjo0OBCBEeIAAAG8SURBVHhe7dJBDQAgEMCwA/+egQcmlrSfGdg6z0DE/oUEw5JiWFIMS4phSTEsKYYlxbCkGJYUw5JiWFIMS4phSTEsKYYlxbCkGJYUw5JiWFIMS4phSTEsKYYlxbCkGJYUw5JiWFIMS4phSTEsKYYlxbCkGJYUw5JiWFIMS4phSTEsKYYlxbCkGJYUw5JiWFIMS4phSTEsKYYlxbCkGJYUw5JiWFIMS4phSTEsKYYlxbCkGJYUw5JiWFIMS4phSTEsKYYlxbCkGJYUw5JiWFIMS4phSTEsKYYlxbCkGJYUw5JiWFIMS4phSTEsKYYlxbCkGJYUw5JiWFIMS4phSTEsKYYlxbCkGJYUw5JiWFIMS4phSTEsKYYlxbCkGJYUw5JiWFIMS4phSTEsKYYlxbCkGJYUw5JiWFIMS4phSTEsKYYlxbCkGJYUw5JiWFIMS4phSTEsKYYlxbCkGJYUw5JiWFIMS4phSTEsKYYlxbCkGJYUw5JiWFIMS4phSTEsKYYlxbCkGJYUw5JiWFIMS4phSTEsKYYlxbCkGJYUw5JiWFIMS4phSTEsKYYlxbCkGJYUw5JiWFIMS4phCZm52U4FOCAVGHQAAAAASUVORK5CYII=", + "body": [ + { + "type": "Container", + "items": [ + { + "type": "Image", + "url": "data:image/png;base64,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", + "size": "Stretch" + } + ] + }, + { + "type": "Container", + "spacing": "None", + "backgroundImage": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb8AAAIpCAYAAAAyxDaxAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAAhdEVYdENyZWF0aW9uIFRpbWUAMjAxOTowMzoxMyAxOTo0Mjo0OBCBEeIAAAg5SURBVHhe7dUxAcAgEMDAp6pxiSS64CJ3SyRkzT53ACDkewWADPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwByzA+AHPMDIMf8AMgxPwBiZn6z1waYNbhEmwAAAABJRU5ErkJggg==", + "items": [ + { + "type": "TextBlock", + "id": "title", + "spacing": "Medium", + "size": "Large", + "weight": "Bolder", + "color": "Light", + "text": "Hi, I'm **your** Hospitality Assistant", + "wrap": true + }, + { + "type": "TextBlock", + "id": "body", + "size": "Medium", + "color": "Light", + "text": "Now that I'm up and running, explore the links here to learn what I can do.", + "wrap": true + } + ] + } + ], + "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", + "version": "1.0", + "speak": "Hi, I'm **your** Hospitality Assistant. Now that I'm up and running, explore the links here to learn what I can do." +} \ No newline at end of file diff --git a/solutions/HospitalitySample/Content/NewUserGreeting.json b/solutions/HospitalitySample/Content/NewUserGreeting.json index 12c41afb01..8165dee179 100644 --- a/solutions/HospitalitySample/Content/NewUserGreeting.json +++ b/solutions/HospitalitySample/Content/NewUserGreeting.json @@ -42,23 +42,21 @@ "actions": [ { "type": "Action.Submit", - "title": "Get started", - "data": { - "action": "startOnboarding" - } + "title": "Send location", + "data": "\/event:{\"Name\": \"VA.Location\", \"Value\": \"47.639620,-122.130610\"}" }, { - "type": "Action.OpenUrl", - "title": "Documentation", - "url": "https://aka.ms/virtualassistantdocs" + "type": "Action.Submit", + "title": "Room service", + "data": "I want to order room service" }, { - "type": "Action.OpenUrl", - "title": "Skills", - "url": "https://aka.ms/botframeworkskills" + "type": "Action.Submit", + "title": "Today's weather", + "data": "What's the weather today?" } ], "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", "version": "1.0", - "speak": "Hi, I'm **your** Virtual Assistant. Now that I'm up and running, explore the links here to learn what I can do." + "speak": "Hi, I'm **your** Hospitality Assistant. Now that I'm up and running, explore the links here to learn what I can do." } \ No newline at end of file diff --git a/solutions/HospitalitySample/Deployment/Resources/QnA/en/hotel_FAQ.lu b/solutions/HospitalitySample/Deployment/Resources/QnA/en/hotel_FAQ.lu index d1f279f78d..895690ed33 100644 --- a/solutions/HospitalitySample/Deployment/Resources/QnA/en/hotel_FAQ.lu +++ b/solutions/HospitalitySample/Deployment/Resources/QnA/en/hotel_FAQ.lu @@ -1,4 +1,4 @@ -> ! Automatically generated by [LUDown CLI](https://github.com/Microsoft/botbuilder-tools/tree/master/Ludown), Tue Aug 06 2019 10:01:24 GMT-0700 (Pacific Daylight Time) +> ! Automatically generated by [LUDown CLI](https://github.com/Microsoft/botbuilder-tools/tree/master/Ludown), Mon Aug 26 2019 12:20:29 GMT-0700 (Pacific Daylight Time) > ! Source LUIS JSON file: Not Specified @@ -14,6 +14,7 @@ - Where is the fitness center? - When is the fitness center open - What hours is the gym open +- Where is the gymnasium? ```markdown Our fitness center is located on the 2nd floor, and is open 24 hours, 7 days a week.  @@ -73,27 +74,22 @@ We provide the following services and amenities: There are printers, copiers, and fax machines available in the 24-hour business center on the 1st floor. ``` -> Source: Editorial -## ? Where is breakfast served?  -- Where is the breakfast restaurant? - -```markdown -Breakfast is served in our restaurant on the 1st floor. -``` - > Source: Editorial ## ? What time is breakfast?  - When does the breakfast restaurant open? - When does breakfast close? ```markdown -Complimentary breakfast is served from 6:30am to 9:00am Monday through Friday, and from 7:00am to 9:30am on Saturday and Sunday. +Complimentary breakfast is served in our restaurant from 6:30am to 9:00am Monday through Friday, and from 7:00am to 9:30am on Saturday and Sunday. ``` > Source: Editorial ## ? Is there a pool? - Where is the pool? - When is the pool open? +- does this hotel have a pool +- I want to swim +- Please tell me where is the swimming pool ```markdown We have a seasonal outdoor pool on the 1st floor that is open Monday-Sunday from 7:00am to 11:00pm. diff --git a/solutions/HospitalitySample/HospitalitySample.csproj b/solutions/HospitalitySample/HospitalitySample.csproj index a685a4482e..95b5525322 100644 --- a/solutions/HospitalitySample/HospitalitySample.csproj +++ b/solutions/HospitalitySample/HospitalitySample.csproj @@ -78,6 +78,9 @@ + + Always + Always diff --git a/solutions/HospitalitySample/Responses/Main/MainResponses.cs b/solutions/HospitalitySample/Responses/Main/MainResponses.cs index ca8acbfd32..207d62e8ea 100644 --- a/solutions/HospitalitySample/Responses/Main/MainResponses.cs +++ b/solutions/HospitalitySample/Responses/Main/MainResponses.cs @@ -5,6 +5,7 @@ using System.IO; using AdaptiveCards; using Microsoft.Bot.Builder; +using Microsoft.Bot.Builder.Dialogs.Choices; using Microsoft.Bot.Builder.TemplateManager; using Microsoft.Bot.Schema; @@ -63,19 +64,25 @@ public static IMessageActivity BuildNewUserGreetingCard(ITurnContext turnContext { var introCard = File.ReadAllText(MainStrings.INTRO_PATH); var card = AdaptiveCard.FromJson(introCard).Card; + + // work around for adaptive card actions not working in Teams + if (!Channel.SupportsSuggestedActions(turnContext.Activity.ChannelId)) + { + introCard += File.ReadAllText(MainStrings.INTRO_PATH_TEAMS); + card = AdaptiveCard.FromJson(introCard).Card; + } + var attachment = new Attachment(AdaptiveCard.ContentType, content: card); var response = MessageFactory.Attachment(attachment, ssml: card.Speak, inputHint: InputHints.AcceptingInput); - - response.SuggestedActions = new SuggestedActions + if (Channel.SupportsSuggestedActions(turnContext.Activity.ChannelId)) { - Actions = new List() - { - new CardAction(type: ActionTypes.ImBack, title: MainStrings.HELP_BTN_TEXT_1, value: MainStrings.HELP_BTN_VALUE_1), - new CardAction(type: ActionTypes.ImBack, title: MainStrings.HELP_BTN_TEXT_2, value: MainStrings.HELP_BTN_VALUE_2), - new CardAction(type: ActionTypes.OpenUrl, title: MainStrings.HELP_BTN_TEXT_3, value: MainStrings.HELP_BTN_VALUE_3), - }, - }; + response.SuggestedActions = new SuggestedActions { Actions = GetCardActions() }; + } + else + { + response.Attachments.Add(new HeroCard(buttons: GetCardActions()).ToAttachment()); + } return response; } @@ -90,12 +97,7 @@ public static IMessageActivity BuildReturningUserGreetingCard(ITurnContext turnC response.SuggestedActions = new SuggestedActions { - Actions = new List() - { - new CardAction(type: ActionTypes.ImBack, title: MainStrings.HELP_BTN_TEXT_1, value: MainStrings.HELP_BTN_VALUE_1), - new CardAction(type: ActionTypes.ImBack, title: MainStrings.HELP_BTN_TEXT_2, value: MainStrings.HELP_BTN_VALUE_2), - new CardAction(type: ActionTypes.OpenUrl, title: MainStrings.HELP_BTN_TEXT_3, value: MainStrings.HELP_BTN_VALUE_3), - }, + Actions = GetCardActions() }; return response; @@ -107,21 +109,30 @@ public static IMessageActivity BuildHelpCard(ITurnContext turnContext, dynamic d { Title = MainStrings.HELP_TITLE, Text = MainStrings.HELP_TEXT, - }.ToAttachment(); + }; - var response = MessageFactory.Attachment(attachment, ssml: MainStrings.HELP_TEXT, inputHint: InputHints.AcceptingInput); + var response = MessageFactory.Attachment(attachment.ToAttachment(), ssml: MainStrings.HELP_TEXT, inputHint: InputHints.AcceptingInput); - response.SuggestedActions = new SuggestedActions + if (Channel.SupportsSuggestedActions(turnContext.Activity.ChannelId)) + { + response.SuggestedActions = new SuggestedActions { Actions = GetCardActions() }; + } + else { - Actions = new List() + response.Attachments.Add(new HeroCard(buttons: GetCardActions()).ToAttachment()); + } + + return response; + } + + private static List GetCardActions() + { + return new List() { new CardAction(type: ActionTypes.ImBack, title: MainStrings.HELP_BTN_TEXT_1, value: MainStrings.HELP_BTN_VALUE_1), new CardAction(type: ActionTypes.ImBack, title: MainStrings.HELP_BTN_TEXT_2, value: MainStrings.HELP_BTN_VALUE_2), - new CardAction(type: ActionTypes.OpenUrl, title: MainStrings.HELP_BTN_TEXT_3, value: MainStrings.HELP_BTN_VALUE_3), - }, - }; - - return response; + new CardAction(type: ActionTypes.ImBack, title: MainStrings.HELP_BTN_TEXT_3, value: MainStrings.HELP_BTN_VALUE_3), + }; } public class ResponseIds diff --git a/solutions/HospitalitySample/Responses/Main/MainStrings.Designer.cs b/solutions/HospitalitySample/Responses/Main/MainStrings.Designer.cs index 11329d5715..fd8611fc22 100644 --- a/solutions/HospitalitySample/Responses/Main/MainStrings.Designer.cs +++ b/solutions/HospitalitySample/Responses/Main/MainStrings.Designer.cs @@ -8,11 +8,10 @@ // //------------------------------------------------------------------------------ -namespace HospitalitySample.Responses.Main -{ +namespace HospitalitySample.Responses.Main { using System; - - + + /// /// A strongly-typed resource class, for looking up localized strings, etc. /// @@ -23,235 +22,202 @@ namespace HospitalitySample.Responses.Main [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - public class MainStrings - { - + public class MainStrings { + private static global::System.Resources.ResourceManager resourceMan; - + private static global::System.Globalization.CultureInfo resourceCulture; - + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal MainStrings() - { + internal MainStrings() { } - + /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - public static global::System.Resources.ResourceManager ResourceManager - { - get - { - if (object.ReferenceEquals(resourceMan, null)) - { + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HospitalitySample.Responses.Main.MainStrings", typeof(MainStrings).Assembly); resourceMan = temp; } return resourceMan; } } - + /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - public static global::System.Globalization.CultureInfo Culture - { - get - { + public static global::System.Globalization.CultureInfo Culture { + get { return resourceCulture; } - set - { + set { resourceCulture = value; } } - + /// /// Looks up a localized string similar to Ok, let's start over.. /// - public static string CANCELLED - { - get - { + public static string CANCELLED { + get { return ResourceManager.GetString("CANCELLED", resourceCulture); } } - + /// /// Looks up a localized string similar to What else can I help you with?. /// - public static string COMPLETED - { - get - { + public static string COMPLETED { + get { return ResourceManager.GetString("COMPLETED", resourceCulture); } } - + /// /// Looks up a localized string similar to I'm sorry, I'm not able to help with that.. /// - public static string CONFUSED - { - get - { + public static string CONFUSED { + get { return ResourceManager.GetString("CONFUSED", resourceCulture); } } - + /// /// Looks up a localized string similar to Sorry, it looks like something went wrong.. /// - public static string ERROR - { - get - { + public static string ERROR { + get { return ResourceManager.GetString("ERROR", resourceCulture); } } - + /// /// Looks up a localized string similar to Hi there!. /// - public static string GREETING - { - get - { + public static string GREETING { + get { return ResourceManager.GetString("GREETING", resourceCulture); } } - + /// /// Looks up a localized string similar to Hey, {0}!. /// - public static string GREETING_WITH_NAME - { - get - { + public static string GREETING_WITH_NAME { + get { return ResourceManager.GetString("GREETING_WITH_NAME", resourceCulture); } } - + /// - /// Looks up a localized string similar to Test LUIS. + /// Looks up a localized string similar to Extend Your Stay. /// - public static string HELP_BTN_TEXT_1 - { - get - { + public static string HELP_BTN_TEXT_1 { + get { return ResourceManager.GetString("HELP_BTN_TEXT_1", resourceCulture); } } - + /// - /// Looks up a localized string similar to Test QnA Maker. + /// Looks up a localized string similar to Find Local Events. /// - public static string HELP_BTN_TEXT_2 - { - get - { + public static string HELP_BTN_TEXT_2 { + get { return ResourceManager.GetString("HELP_BTN_TEXT_2", resourceCulture); } } - + /// - /// Looks up a localized string similar to Learn more. + /// Looks up a localized string similar to Recent News. /// - public static string HELP_BTN_TEXT_3 - { - get - { + public static string HELP_BTN_TEXT_3 { + get { return ResourceManager.GetString("HELP_BTN_TEXT_3", resourceCulture); } } - + /// - /// Looks up a localized string similar to Talk to a human. + /// Looks up a localized string similar to Can I extend my stay?. /// - public static string HELP_BTN_VALUE_1 - { - get - { + public static string HELP_BTN_VALUE_1 { + get { return ResourceManager.GetString("HELP_BTN_VALUE_1", resourceCulture); } } - + /// - /// Looks up a localized string similar to What is a Virtual Assistant?. + /// Looks up a localized string similar to Find me something to do nearby. /// - public static string HELP_BTN_VALUE_2 - { - get - { + public static string HELP_BTN_VALUE_2 { + get { return ResourceManager.GetString("HELP_BTN_VALUE_2", resourceCulture); } } - + /// - /// Looks up a localized string similar to https://docs.microsoft.com/en-us/azure/bot-service/?view=azure-bot-service-4.0. + /// Looks up a localized string similar to What's the news?. /// - public static string HELP_BTN_VALUE_3 - { - get - { + public static string HELP_BTN_VALUE_3 { + get { return ResourceManager.GetString("HELP_BTN_VALUE_3", resourceCulture); } } - + /// - /// Looks up a localized string similar to This card can be used to display information to help your user interact with your bot. The buttons below can be used for sample queries or links to external sites.. + /// Looks up a localized string similar to Try asking about the weather or ordering room service! Or try using the buttons below.. /// - public static string HELP_TEXT - { - get - { + public static string HELP_TEXT { + get { return ResourceManager.GetString("HELP_TEXT", resourceCulture); } } - + /// - /// Looks up a localized string similar to HELP. + /// Looks up a localized string similar to Help. /// - public static string HELP_TITLE - { - get - { + public static string HELP_TITLE { + get { return ResourceManager.GetString("HELP_TITLE", resourceCulture); } } - + /// /// Looks up a localized string similar to ./Content/NewUserGreeting.json. /// - public static string INTRO_PATH - { - get - { + public static string INTRO_PATH { + get { return ResourceManager.GetString("INTRO_PATH", resourceCulture); } } - + + /// + /// Looks up a localized string similar to ./Content/NewUserGreeting.1.0.json. + /// + public static string INTRO_PATH_TEAMS { + get { + return ResourceManager.GetString("INTRO_PATH_TEAMS", resourceCulture); + } + } + /// /// Looks up a localized string similar to ./Content/ReturningUserGreeting.json. /// - public static string INTRO_RETURNING - { - get - { + public static string INTRO_RETURNING { + get { return ResourceManager.GetString("INTRO_RETURNING", resourceCulture); } } - + /// /// Looks up a localized string similar to Ok, you're signed out.. /// - public static string LOGOUT - { - get - { + public static string LOGOUT { + get { return ResourceManager.GetString("LOGOUT", resourceCulture); } } diff --git a/solutions/HospitalitySample/Responses/Main/MainStrings.resx b/solutions/HospitalitySample/Responses/Main/MainStrings.resx index c177d896c5..5bfdadcd82 100644 --- a/solutions/HospitalitySample/Responses/Main/MainStrings.resx +++ b/solutions/HospitalitySample/Responses/Main/MainStrings.resx @@ -136,32 +136,35 @@ Hey, {0}! - Test LUIS + Extend Your Stay - Test QnA Maker + Find Local Events - Learn more + Recent News - Talk to a human + Can I extend my stay? - What is a Virtual Assistant? + Find me something to do nearby - https://docs.microsoft.com/en-us/azure/bot-service/?view=azure-bot-service-4.0 + What's the news? - This card can be used to display information to help your user interact with your bot. The buttons below can be used for sample queries or links to external sites. + Try asking about the weather or ordering room service! Or try using the buttons below. - HELP + Help ./Content/NewUserGreeting.json + + ./Content/NewUserGreeting.1.0.json + ./Content/ReturningUserGreeting.json diff --git a/solutions/HospitalitySample/Services/DispatchLuis.cs b/solutions/HospitalitySample/Services/DispatchLuis.cs index 12f69a647b..332f77af39 100644 --- a/solutions/HospitalitySample/Services/DispatchLuis.cs +++ b/solutions/HospitalitySample/Services/DispatchLuis.cs @@ -1,5 +1,6 @@ // // Code generated by LUISGen +// Tool github: https://github.com/microsoft/botbuilder-tools // Changes may cause incorrect behavior and will be lost if the code is // regenerated. // @@ -20,9 +21,11 @@ public enum Intent { q_hotel_FAQ, restaurantBookingSkill, pointOfInterestSkill, - hospitalitySkill, - WeatherSkill, + eventSkill, newsSkill, + WeatherSkill, + BingSearchSkill, + hospitalitySkill, None }; public Dictionary Intents; @@ -32,18 +35,24 @@ public class _Entities // Simple entities public string[] KEYWORD; public string[] ADDRESS; - public string[] Item; public string[] topic; public string[] site; + public string[] Item; + + // Pattern.any + public string[] CelebrityNamePatten; + public string[] MovieTitlePatten; // Instance public class _Instance { public InstanceData[] KEYWORD; public InstanceData[] ADDRESS; - public InstanceData[] Item; public InstanceData[] topic; public InstanceData[] site; + public InstanceData[] Item; + public InstanceData[] CelebrityNamePatten; + public InstanceData[] MovieTitlePatten; } [JsonProperty("$instance")] public _Instance _instance; diff --git a/solutions/HospitalitySample/skills.json b/solutions/HospitalitySample/skills.json index ea80988b04..04e7f2b916 100644 --- a/solutions/HospitalitySample/skills.json +++ b/solutions/HospitalitySample/skills.json @@ -365,6 +365,101 @@ } } ] + }, + { + "id": "eventSkill", + "msaAppId": "", + "name": "Event Skill", + "endpoint": "", + "description": "The Event experimental skill uses the Eventbrite API to retrieve local event information.", + "authenticationConnections": [], + "actions": [ + { + "id": "EventSkill_getEvents", + "definition": { + "description": "Finds events happening in the area today.", + "slots": [ + { + "name": "location", + "types": [ + "string" + ] + } + ], + "triggers": { + "utteranceSources": [ + { + "locale": "en", + "source": [ + "Event#GetEvents" + ] + } + ] + } + } + } + ] + }, + { + "id": "BingSearchSkill", + "msaAppId": "", + "name": "BingSearchSkill", + "endpoint": "", + "description": "", + "authenticationConnections": [], + "actions": [ + { + "id": "BingSearchSkill_GetCelebrityInfo", + "definition": { + "description": "Get celebrity info.", + "slots": [], + "triggers": { + "utteranceSources": [ + { + "locale": "en", + "source": [ + "BingSearchSkill#GetCelebrityInfo" + ] + } + ] + } + } + }, + { + "id": "BingSearchSkill_SearchMovieInfo", + "definition": { + "description": "Search movie info.", + "slots": [], + "triggers": { + "utteranceSources": [ + { + "locale": "en", + "source": [ + "BingSearchSkill#SearchMovieInfo" + ] + } + ] + } + } + }, + { + "id": "BingSearchSkill_QueryQna", + "definition": { + "description": "Query Qna.", + "slots": [], + "triggers": { + "utteranceSources": [ + { + "locale": "en", + "source": [ + "BingSearchSkill#QueryQna" + ] + } + ] + } + } + } + ] } ] } \ No newline at end of file