diff --git a/skills/csharp/experimental/weatherskill/Dialogs/ForecastDialog.cs b/skills/csharp/experimental/weatherskill/Dialogs/ForecastDialog.cs index 38a13f0203..47638be594 100644 --- a/skills/csharp/experimental/weatherskill/Dialogs/ForecastDialog.cs +++ b/skills/csharp/experimental/weatherskill/Dialogs/ForecastDialog.cs @@ -12,7 +12,6 @@ using Microsoft.Bot.Builder.Solutions.Responses; using Microsoft.Bot.Connector; using WeatherSkill.Models; -using WeatherSkill.Responses.Sample; using WeatherSkill.Responses.Shared; using WeatherSkill.Services; @@ -67,7 +66,7 @@ private async Task RouteToGeographyPromptOrForecastResponse(Wa var state = await _stateAccessor.GetAsync(stepContext.Context); var geography = state.Geography; - if (string.IsNullOrEmpty(geography)) + if (string.IsNullOrEmpty(geography) && state.Latitude == double.NaN) { return await stepContext.NextAsync(); } @@ -118,7 +117,19 @@ private async Task GetWeatherResponse(WaterfallStepContext ste var state = await _stateAccessor.GetAsync(stepContext.Context); var service = new AccuweatherService(Settings); - state.GeographyLocation = await service.GetLocationByQueryAsync(state.Geography); + + if (!string.IsNullOrEmpty(state.Geography)) + { + state.GeographyLocation = await service.GetLocationByQueryAsync(state.Geography); + } + else if (state.Latitude != double.NaN) + { + state.GeographyLocation = await service.GetLocationByGeoAsync(state.Latitude, state.Longitude); + } + else + { + throw new Exception("Must have Geography or Latitude & Longitude!"); + } var oneDayForecast = await service.GetOneDayForecastAsync(state.GeographyLocation.Key); @@ -193,14 +204,14 @@ private string GetWeatherIcon(int iconValue, bool useFile) // partly sunny case 3: // return sun icon - return useFile ? GetImageUri("sunicon.png") : "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCI+PHRpdGxlPndlYXRoZXJpY29uczwvdGl0bGU+PHBhdGggZD0iTTE4LjU3LDIxLjVIMTUuMlYyMC4zOGgzLjM3Wm0xLjA4LTMuNzQtMi4zOC0yLjM5Ljc5LS44TDIwLjQ1LDE3Wm0wLDYuMzYuOC44TDE4LjA2LDI3LjNsLS43OS0uNzlabTQtNy4xMmEzLjc4LDMuNzgsMCwwLDEsMS41NC4zMSwzLjkxLDMuOTEsMCwwLDEsMi4wOSwyLjA5LDQsNCwwLDAsMSwwLDMuMDcsMy43MiwzLjcyLDAsMCwxLS44NCwxLjI1LDQuMTMsNC4xMywwLDAsMS0xLjI1Ljg1LDQsNCwwLDAsMS0zLjA3LDAsNCw0LDAsMCwxLTEuMjUtLjg1LDMuODMsMy44MywwLDAsMS0xLjE1LTIuNzhBNCw0LDAsMCwxLDIwLDE5LjRhNC4xMyw0LjEzLDAsMCwxLC44NS0xLjI1LDMuODIsMy44MiwwLDAsMSwxLjI1LS44NEEzLjc3LDMuNzcsMCwwLDEsMjMuNjMsMTdabTAsNi43NWEyLjY2LDIuNjYsMCwwLDAsMS4wOS0uMjIsMy4wOCwzLjA4LDAsMCwwLC45LS42LDMsMywwLDAsMCwuNi0uOSwyLjcsMi43LDAsMCwwLC4yMy0xLjA5LDIuNjYsMi42NiwwLDAsMC0uMjMtMS4wOSwyLjg1LDIuODUsMCwwLDAtMS41LTEuNSwyLjY2LDIuNjYsMCwwLDAtMS4wOS0uMjMsMi43LDIuNywwLDAsMC0xLjA5LjIzLDIuODUsMi44NSwwLDAsMC0xLjUsMS41LDIuNjYsMi42NiwwLDAsMC0uMjIsMS4wOUEyLjY5LDIuNjksMCwwLDAsMjEsMjJhMywzLDAsMCwwLC42LjksMy4wOCwzLjA4LDAsMCwwLC45LjZBMi42OSwyLjY5LDAsMCwwLDIzLjYzLDIzLjc1Wm0uNTctNy44N0gyMy4wN1YxMi41SDI0LjJaTTIzLjA3LDI2SDI0LjJ2My4zOEgyMy4wN1ptNC41NS04LjI0LS44LS44LDIuMzktMi4zOS43OS44Wm0wLDYuMzZMMzAsMjYuNTFsLS43OS43OS0yLjM5LTIuMzhabTQuNDUtMy43NFYyMS41SDI4LjdWMjAuMzhaIi8+PC9zdmc+"; + return useFile ? GetImageUri("sun.png") : "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCI+PHRpdGxlPndlYXRoZXJpY29uczwvdGl0bGU+PHBhdGggZD0iTTE4LjU3LDIxLjVIMTUuMlYyMC4zOGgzLjM3Wm0xLjA4LTMuNzQtMi4zOC0yLjM5Ljc5LS44TDIwLjQ1LDE3Wm0wLDYuMzYuOC44TDE4LjA2LDI3LjNsLS43OS0uNzlabTQtNy4xMmEzLjc4LDMuNzgsMCwwLDEsMS41NC4zMSwzLjkxLDMuOTEsMCwwLDEsMi4wOSwyLjA5LDQsNCwwLDAsMSwwLDMuMDcsMy43MiwzLjcyLDAsMCwxLS44NCwxLjI1LDQuMTMsNC4xMywwLDAsMS0xLjI1Ljg1LDQsNCwwLDAsMS0zLjA3LDAsNCw0LDAsMCwxLTEuMjUtLjg1LDMuODMsMy44MywwLDAsMS0xLjE1LTIuNzhBNCw0LDAsMCwxLDIwLDE5LjRhNC4xMyw0LjEzLDAsMCwxLC44NS0xLjI1LDMuODIsMy44MiwwLDAsMSwxLjI1LS44NEEzLjc3LDMuNzcsMCwwLDEsMjMuNjMsMTdabTAsNi43NWEyLjY2LDIuNjYsMCwwLDAsMS4wOS0uMjIsMy4wOCwzLjA4LDAsMCwwLC45LS42LDMsMywwLDAsMCwuNi0uOSwyLjcsMi43LDAsMCwwLC4yMy0xLjA5LDIuNjYsMi42NiwwLDAsMC0uMjMtMS4wOSwyLjg1LDIuODUsMCwwLDAtMS41LTEuNSwyLjY2LDIuNjYsMCwwLDAtMS4wOS0uMjMsMi43LDIuNywwLDAsMC0xLjA5LjIzLDIuODUsMi44NSwwLDAsMC0xLjUsMS41LDIuNjYsMi42NiwwLDAsMC0uMjIsMS4wOUEyLjY5LDIuNjksMCwwLDAsMjEsMjJhMywzLDAsMCwwLC42LjksMy4wOCwzLjA4LDAsMCwwLC45LjZBMi42OSwyLjY5LDAsMCwwLDIzLjYzLDIzLjc1Wm0uNTctNy44N0gyMy4wN1YxMi41SDI0LjJaTTIzLjA3LDI2SDI0LjJ2My4zOEgyMy4wN1ptNC41NS04LjI0LS44LS44LDIuMzktMi4zOS43OS44Wm0wLDYuMzZMMzAsMjYuNTFsLS43OS43OS0yLjM5LTIuMzhabTQuNDUtMy43NFYyMS41SDI4LjdWMjAuMzhaIi8+PC9zdmc+"; // intermittent clouds case 4: // hazy sunshine case 5: // cloud icon - return useFile ? GetImageUri("cloudicon.png") : "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCI+PHRpdGxlPndlYXRoZXJpY29uczwvdGl0bGU+PHBhdGggZD0iTTI5Ljc5LDIyLjM4YTMuMzIsMy4zMiwwLDAsMSwxLjMzLjI2LDMuMzMsMy4zMywwLDAsMSwxLjgxLDEuNzgsMy4yOSwzLjI5LDAsMCwxLC4yNywxLjMzLDMuMTcsMy4xNywwLDAsMS0uMjcsMS4zMSwzLjMsMy4zLDAsMCwxLS43MiwxLjA4LDMuNDYsMy40NiwwLDAsMS0xLjA4LjcyLDMuMjMsMy4yMywwLDAsMS0xLjMxLjI2SDE5LjdhNC4zNiw0LjM2LDAsMCwxLTEuNzYtLjM1LDQuNSw0LjUsMCwwLDEtMS40My0xLDQuMzksNC4zOSwwLDAsMS0xLTEuNDMsNC41OCw0LjU4LDAsMCwxLDAtMy41MSw0LjM5LDQuMzksMCwwLDEsMS0xLjQzLDQuNSw0LjUsMCwwLDEsMS40My0xLDQuMzYsNC4zNiwwLDAsMSwxLjc2LS4zNiw0LjQ1LDQuNDUsMCwwLDEsLjgxLjA4LDUuNTQsNS41NCwwLDAsMSwuODItMSw0Ljc1LDQuNzUsMCwwLDEsMS0uNzNBNS4yOSw1LjI5LDAsMCwxLDIzLjQ5LDE4YTUuMzgsNS4zOCwwLDAsMSwxLjI3LS4xNSw1LDUsMCwwLDEsMy4zNywxLjI4LDUsNSwwLDAsMSwxLjExLDEuNDNBNS4xOSw1LjE5LDAsMCwxLDI5Ljc5LDIyLjM4Wm0wLDUuNjJhMi4yLDIuMiwwLDAsMCwuODgtLjE4LDIsMiwwLDAsMCwuNzEtLjQ4LDIuMTQsMi4xNCwwLDAsMCwuNDktLjcyLDIuMzEsMi4zMSwwLDAsMCwwLTEuNzQsMi4xNCwyLjE0LDAsMCwwLS40OS0uNzIsMiwyLDAsMCwwLS43MS0uNDgsMi4yLDIuMiwwLDAsMC0uODgtLjE4SDI4Ljd2LS41NmE0LDQsMCwwLDAtLjMxLTEuNTQsNC4xMyw0LjEzLDAsMCwwLS44NS0xLjI1LDMuNzIsMy43MiwwLDAsMC0xLjI1LS44NEEzLjc3LDMuNzcsMCwwLDAsMjQuNzYsMTlhMy45NCwzLjk0LDAsMCwwLTEuMTkuMTgsNC4yOSw0LjI5LDAsMCwwLTEuMDUuNTIsNC4wNyw0LjA3LDAsMCwwLS44NS44MSw0LjEzLDQuMTMsMCwwLDAtLjU5LDEsMy4xMywzLjEzLDAsMCwwLTEuMzgtLjMxLDMuNDEsMy40MSwwLDAsMC0xLjMyLjI2LDMuNTcsMy41NywwLDAsMC0xLjA3LjczLDMuNDksMy40OSwwLDAsMC0uNzMsMS4wOCwzLjM1LDMuMzUsMCwwLDAtLjI2LDEuMywzLjI5LDMuMjksMCwwLDAsMSwyLjM5LDMuNTcsMy41NywwLDAsMCwxLjA3LjczQTMuNDEsMy40MSwwLDAsMCwxOS43LDI4WiIvPjwvc3ZnPg=="; + return useFile ? GetImageUri("cloud.png") : "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCI+PHRpdGxlPndlYXRoZXJpY29uczwvdGl0bGU+PHBhdGggZD0iTTI5Ljc5LDIyLjM4YTMuMzIsMy4zMiwwLDAsMSwxLjMzLjI2LDMuMzMsMy4zMywwLDAsMSwxLjgxLDEuNzgsMy4yOSwzLjI5LDAsMCwxLC4yNywxLjMzLDMuMTcsMy4xNywwLDAsMS0uMjcsMS4zMSwzLjMsMy4zLDAsMCwxLS43MiwxLjA4LDMuNDYsMy40NiwwLDAsMS0xLjA4LjcyLDMuMjMsMy4yMywwLDAsMS0xLjMxLjI2SDE5LjdhNC4zNiw0LjM2LDAsMCwxLTEuNzYtLjM1LDQuNSw0LjUsMCwwLDEtMS40My0xLDQuMzksNC4zOSwwLDAsMS0xLTEuNDMsNC41OCw0LjU4LDAsMCwxLDAtMy41MSw0LjM5LDQuMzksMCwwLDEsMS0xLjQzLDQuNSw0LjUsMCwwLDEsMS40My0xLDQuMzYsNC4zNiwwLDAsMSwxLjc2LS4zNiw0LjQ1LDQuNDUsMCwwLDEsLjgxLjA4LDUuNTQsNS41NCwwLDAsMSwuODItMSw0Ljc1LDQuNzUsMCwwLDEsMS0uNzNBNS4yOSw1LjI5LDAsMCwxLDIzLjQ5LDE4YTUuMzgsNS4zOCwwLDAsMSwxLjI3LS4xNSw1LDUsMCwwLDEsMy4zNywxLjI4LDUsNSwwLDAsMSwxLjExLDEuNDNBNS4xOSw1LjE5LDAsMCwxLDI5Ljc5LDIyLjM4Wm0wLDUuNjJhMi4yLDIuMiwwLDAsMCwuODgtLjE4LDIsMiwwLDAsMCwuNzEtLjQ4LDIuMTQsMi4xNCwwLDAsMCwuNDktLjcyLDIuMzEsMi4zMSwwLDAsMCwwLTEuNzQsMi4xNCwyLjE0LDAsMCwwLS40OS0uNzIsMiwyLDAsMCwwLS43MS0uNDgsMi4yLDIuMiwwLDAsMC0uODgtLjE4SDI4Ljd2LS41NmE0LDQsMCwwLDAtLjMxLTEuNTQsNC4xMyw0LjEzLDAsMCwwLS44NS0xLjI1LDMuNzIsMy43MiwwLDAsMC0xLjI1LS44NEEzLjc3LDMuNzcsMCwwLDAsMjQuNzYsMTlhMy45NCwzLjk0LDAsMCwwLTEuMTkuMTgsNC4yOSw0LjI5LDAsMCwwLTEuMDUuNTIsNC4wNyw0LjA3LDAsMCwwLS44NS44MSw0LjEzLDQuMTMsMCwwLDAtLjU5LDEsMy4xMywzLjEzLDAsMCwwLTEuMzgtLjMxLDMuNDEsMy40MSwwLDAsMC0xLjMyLjI2LDMuNTcsMy41NywwLDAsMC0xLjA3LjczLDMuNDksMy40OSwwLDAsMC0uNzMsMS4wOCwzLjM1LDMuMzUsMCwwLDAtLjI2LDEuMywzLjI5LDMuMjksMCwwLDAsMSwyLjM5LDMuNTcsMy41NywwLDAsMCwxLjA3LjczQTMuNDEsMy40MSwwLDAsMCwxOS43LDI4WiIvPjwvc3ZnPg=="; // mostly cloudy case 6: @@ -273,7 +284,7 @@ private string GetWeatherIcon(int iconValue, bool useFile) // windy case 32: // wind icon - return useFile ? GetImageUri("win.png") : "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCI+PHRpdGxlPndlYXRoZXJpY29uczwvdGl0bGU+PHBhdGggZD0iTTI4LjcsMTguMTJhMy40LDMuNCwwLDAsMS0xLDIuMzksMy40OSwzLjQ5LDAsMCwxLTEuMDguNzMsMy40LDMuNCwwLDAsMS0xLjMxLjI2SDE1LjJWMjAuMzhIMjUuMzJhMi4yLDIuMiwwLDAsMCwuODgtLjE4QTIuMjksMi4yOSwwLDAsMCwyNy40LDE5YTIuMzQsMi4zNCwwLDAsMCwwLTEuNzUsMi4yOSwyLjI5LDAsMCwwLTEuMi0xLjIsMi4xOSwyLjE5LDAsMCwwLS44OC0uMTcsMi4xMSwyLjExLDAsMCwwLS44Ny4xNywyLjM5LDIuMzksMCwwLDAtLjcyLjQ4LDIuMzMsMi4zMywwLDAsMC0uNDguNzIsMi4xMiwyLjEyLDAsMCwwLS4xOC44N0gyMmEzLjE4LDMuMTgsMCwwLDEsLjI2LTEuMywzLjQ5LDMuNDksMCwwLDEsLjczLTEuMDgsMy4yOSwzLjI5LDAsMCwxLDIuMzgtMSwzLjQsMy40LDAsMCwxLDEuMzEuMjYsMy40OSwzLjQ5LDAsMCwxLDEuMDguNzMsMy4zLDMuMywwLDAsMSwuNzIsMS4wOEEzLjE5LDMuMTksMCwwLDEsMjguNywxOC4xMlpNMzEsMjAuMzhhMi4xMSwyLjExLDAsMCwxLC44Ny4xNywyLjIxLDIuMjEsMCwwLDEsMS4yLDEuMiwyLjIyLDIuMjIsMCwwLDEsMCwxLjc1LDIuMjEsMi4yMSwwLDAsMS0xLjIsMS4yLDIuMTIsMi4xMiwwLDAsMS0uODcuMThIMjkuNTJhMi4xMywyLjEzLDAsMCwxLC4zLDEuMTIsMi4zOCwyLjM4LDAsMCwxLS4xNy44OCwyLjIsMi4yLDAsMCwxLS40OS43MSwyLDIsMCwwLDEtLjcxLjQ4LDIuMiwyLjIsMCwwLDEtLjg4LjE4LDIuMTIsMi4xMiwwLDAsMS0uODctLjE4LDIuMDcsMi4wNywwLDAsMS0uNzItLjQ4LDIuMTcsMi4xNywwLDAsMS0uNDgtLjcxLDIuMiwyLjIsMCwwLDEtLjE4LS44OGgxLjEzYTEuMjcsMS4yNywwLDAsMCwuMDguNDQsMS4wOSwxLjA5LDAsMCwwLDEsLjY4QTEsMSwwLDAsMCwyOCwyN2ExLjExLDEuMTEsMCwwLDAsLjM2LS4yNSwxLjIxLDEuMjEsMCwwLDAsLjI0LS4zNSwxLjEyLDEuMTIsMCwwLDAsMC0uODgsMS4yMSwxLjIxLDAsMCwwLS4yNC0uMzVBMS4xMSwxLjExLDAsMCwwLDI4LDI1YTEsMSwwLDAsMC0uNDQtLjA4SDE1LjJWMjMuNzVIMzFhMS4xMiwxLjEyLDAsMCwwLC40NC0uMDksMS4yMSwxLjIxLDAsMCwwLC4zNS0uMjQsMS4xMywxLjEzLDAsMCwwLC4yNC0uMzYsMSwxLDAsMCwwLC4wOS0uNDQsMSwxLDAsMCwwLS4wOS0uNDMsMS4xMywxLjEzLDAsMCwwLS4yNC0uMzYsMS4yMSwxLjIxLDAsMCwwLS4zNS0uMjRBMS4xMiwxLjEyLDAsMCwwLDMxLDIxLjVhMSwxLDAsMCwwLS40NC4wOSwxLjEsMS4xLDAsMCwwLS42LjYsMSwxLDAsMCwwLS4wOS40M0gyOC43YTIuMTEsMi4xMSwwLDAsMSwuMTctLjg3LDIuMjksMi4yOSwwLDAsMSwxLjItMS4yQTIuMTYsMi4xNiwwLDAsMSwzMSwyMC4zOFoiLz48L3N2Zz4="; + return useFile ? GetImageUri("wind.png") : "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCI+PHRpdGxlPndlYXRoZXJpY29uczwvdGl0bGU+PHBhdGggZD0iTTI4LjcsMTguMTJhMy40LDMuNCwwLDAsMS0xLDIuMzksMy40OSwzLjQ5LDAsMCwxLTEuMDguNzMsMy40LDMuNCwwLDAsMS0xLjMxLjI2SDE1LjJWMjAuMzhIMjUuMzJhMi4yLDIuMiwwLDAsMCwuODgtLjE4QTIuMjksMi4yOSwwLDAsMCwyNy40LDE5YTIuMzQsMi4zNCwwLDAsMCwwLTEuNzUsMi4yOSwyLjI5LDAsMCwwLTEuMi0xLjIsMi4xOSwyLjE5LDAsMCwwLS44OC0uMTcsMi4xMSwyLjExLDAsMCwwLS44Ny4xNywyLjM5LDIuMzksMCwwLDAtLjcyLjQ4LDIuMzMsMi4zMywwLDAsMC0uNDguNzIsMi4xMiwyLjEyLDAsMCwwLS4xOC44N0gyMmEzLjE4LDMuMTgsMCwwLDEsLjI2LTEuMywzLjQ5LDMuNDksMCwwLDEsLjczLTEuMDgsMy4yOSwzLjI5LDAsMCwxLDIuMzgtMSwzLjQsMy40LDAsMCwxLDEuMzEuMjYsMy40OSwzLjQ5LDAsMCwxLDEuMDguNzMsMy4zLDMuMywwLDAsMSwuNzIsMS4wOEEzLjE5LDMuMTksMCwwLDEsMjguNywxOC4xMlpNMzEsMjAuMzhhMi4xMSwyLjExLDAsMCwxLC44Ny4xNywyLjIxLDIuMjEsMCwwLDEsMS4yLDEuMiwyLjIyLDIuMjIsMCwwLDEsMCwxLjc1LDIuMjEsMi4yMSwwLDAsMS0xLjIsMS4yLDIuMTIsMi4xMiwwLDAsMS0uODcuMThIMjkuNTJhMi4xMywyLjEzLDAsMCwxLC4zLDEuMTIsMi4zOCwyLjM4LDAsMCwxLS4xNy44OCwyLjIsMi4yLDAsMCwxLS40OS43MSwyLDIsMCwwLDEtLjcxLjQ4LDIuMiwyLjIsMCwwLDEtLjg4LjE4LDIuMTIsMi4xMiwwLDAsMS0uODctLjE4LDIuMDcsMi4wNywwLDAsMS0uNzItLjQ4LDIuMTcsMi4xNywwLDAsMS0uNDgtLjcxLDIuMiwyLjIsMCwwLDEtLjE4LS44OGgxLjEzYTEuMjcsMS4yNywwLDAsMCwuMDguNDQsMS4wOSwxLjA5LDAsMCwwLDEsLjY4QTEsMSwwLDAsMCwyOCwyN2ExLjExLDEuMTEsMCwwLDAsLjM2LS4yNSwxLjIxLDEuMjEsMCwwLDAsLjI0LS4zNSwxLjEyLDEuMTIsMCwwLDAsMC0uODgsMS4yMSwxLjIxLDAsMCwwLS4yNC0uMzVBMS4xMSwxLjExLDAsMCwwLDI4LDI1YTEsMSwwLDAsMC0uNDQtLjA4SDE1LjJWMjMuNzVIMzFhMS4xMiwxLjEyLDAsMCwwLC40NC0uMDksMS4yMSwxLjIxLDAsMCwwLC4zNS0uMjQsMS4xMywxLjEzLDAsMCwwLC4yNC0uMzYsMSwxLDAsMCwwLC4wOS0uNDQsMSwxLDAsMCwwLS4wOS0uNDMsMS4xMywxLjEzLDAsMCwwLS4yNC0uMzYsMS4yMSwxLjIxLDAsMCwwLS4zNS0uMjRBMS4xMiwxLjEyLDAsMCwwLDMxLDIxLjVhMSwxLDAsMCwwLS40NC4wOSwxLjEsMS4xLDAsMCwwLS42LjYsMSwxLDAsMCwwLS4wOS40M0gyOC43YTIuMTEsMi4xMSwwLDAsMSwuMTctLjg3LDIuMjksMi4yOSwwLDAsMSwxLjItMS4yQTIuMTYsMi4xNiwwLDAsMSwzMSwyMC4zOFoiLz48L3N2Zz4="; // clear case 33: diff --git a/skills/csharp/experimental/weatherskill/Dialogs/MainDialog.cs b/skills/csharp/experimental/weatherskill/Dialogs/MainDialog.cs index 744acf909e..b2ed4a0a4d 100644 --- a/skills/csharp/experimental/weatherskill/Dialogs/MainDialog.cs +++ b/skills/csharp/experimental/weatherskill/Dialogs/MainDialog.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Globalization; +using System.Spatial; using System.Threading; using System.Threading.Tasks; using Luis; @@ -38,7 +39,6 @@ public MainDialog( ResponseManager responseManager, UserState userState, ConversationState conversationState, - SampleDialog sampleDialog, IBotTelemetryClient telemetryClient, IHttpContextAccessor httpContext) : base(nameof(MainDialog), telemetryClient) @@ -53,7 +53,6 @@ public MainDialog( _contextAccessor = userState.CreateProperty(nameof(SkillContext)); // Register dialogs - AddDialog(sampleDialog); AddDialog(new ForecastDialog(_settings, _services, _responseManager, conversationState, TelemetryClient, httpContext)); } @@ -153,6 +152,28 @@ public MainDialog( await dc.Context.SendActivityAsync(response); } + break; + } + case Events.Location: + { + // Test trigger with + // /event:{ "Name": "Location", "Value": "34.05222222222222,-118.2427777777777" } + var value = dc.Context.Activity.Value.ToString(); + + if (!string.IsNullOrEmpty(value)) + { + var coords = value.Split(','); + if (coords.Length == 2) + { + if (double.TryParse(coords[0], out var lat) && double.TryParse(coords[1], out var lng)) + { + var state = await _stateAccessor.GetAsync(dc.Context, () => new SkillState()); + state.Latitude = lat; + state.Longitude = lng; + } + } + } + break; } } @@ -259,8 +280,20 @@ private async Task PopulateStateFromSkillContext(ITurnContext context) { var location = semanticAction.Entities["location"]; var locationObj = location.Properties["location"].ToString(); - var state = await _stateAccessor.GetAsync(context, () => new SkillState()); - state.Geography = locationObj; + + var coords = locationObj.Split(','); + if (coords.Length == 2 && double.TryParse(coords[0], out var lat) && double.TryParse(coords[1], out var lng)) + { + var state = await _stateAccessor.GetAsync(context, () => new SkillState()); + state.Latitude = lat; + state.Longitude = lng; + } + else + { + // In case name has ',' + var state = await _stateAccessor.GetAsync(context, () => new SkillState()); + state.Geography = locationObj; + } } } @@ -268,6 +301,7 @@ private class Events { public const string TokenResponseEvent = "tokens/response"; public const string SkillBeginEvent = "skillBegin"; + public const string Location = "Location"; } } } \ No newline at end of file diff --git a/skills/csharp/experimental/weatherskill/Dialogs/SampleDialog.cs b/skills/csharp/experimental/weatherskill/Dialogs/SampleDialog.cs deleted file mode 100644 index 8e214f2944..0000000000 --- a/skills/csharp/experimental/weatherskill/Dialogs/SampleDialog.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System.Collections.Specialized; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Builder.Solutions.Responses; -using WeatherSkill.Models; -using WeatherSkill.Responses.Sample; -using WeatherSkill.Services; - -namespace WeatherSkill.Dialogs -{ - public class SampleDialog : SkillDialogBase - { - public SampleDialog( - BotSettings settings, - BotServices services, - ResponseManager responseManager, - ConversationState conversationState, - IBotTelemetryClient telemetryClient) - : base(nameof(SampleDialog), settings, services, responseManager, conversationState, telemetryClient) - { - var sample = new WaterfallStep[] - { - // NOTE: Uncomment these lines to include authentication steps to this dialog - // GetAuthToken, - // AfterGetAuthToken, - PromptForName, - GreetUser, - End, - }; - - AddDialog(new WaterfallDialog(nameof(SampleDialog), sample)); - AddDialog(new TextPrompt(DialogIds.NamePrompt)); - - InitialDialogId = nameof(SampleDialog); - } - - private async Task PromptForName(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - // NOTE: Uncomment the following lines to access LUIS result for this turn. - // var state = await ConversationStateAccessor.GetAsync(stepContext.Context); - // var intent = state.LuisResult.TopIntent().intent; - // var entities = state.LuisResult.Entities; - var prompt = ResponseManager.GetResponse(SampleResponses.NamePrompt); - return await stepContext.PromptAsync(DialogIds.NamePrompt, new PromptOptions { Prompt = prompt }); - } - - private async Task GreetUser(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var tokens = new StringDictionary - { - { "Name", stepContext.Result.ToString() }, - }; - - var response = ResponseManager.GetResponse(SampleResponses.HaveNameMessage, tokens); - await stepContext.Context.SendActivityAsync(response); - - return await stepContext.NextAsync(); - } - - private Task End(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - return stepContext.EndDialogAsync(); - } - - private class DialogIds - { - public const string NamePrompt = "namePrompt"; - } - } -} diff --git a/skills/csharp/experimental/weatherskill/Dialogs/SkillDialogBase.cs b/skills/csharp/experimental/weatherskill/Dialogs/SkillDialogBase.cs index a9e4fecf8c..7f441c6e32 100644 --- a/skills/csharp/experimental/weatherskill/Dialogs/SkillDialogBase.cs +++ b/skills/csharp/experimental/weatherskill/Dialogs/SkillDialogBase.cs @@ -207,6 +207,7 @@ protected string GetDivergedCardName(ITurnContext turnContext, string card) return card; } } + private class DialogIds { public const string SkillModeAuth = "SkillAuth"; diff --git a/skills/csharp/experimental/weatherskill/Models/SkillState.cs b/skills/csharp/experimental/weatherskill/Models/SkillState.cs index 9a8e31e997..f3e727f332 100644 --- a/skills/csharp/experimental/weatherskill/Models/SkillState.cs +++ b/skills/csharp/experimental/weatherskill/Models/SkillState.cs @@ -13,11 +13,17 @@ public class SkillState public string Geography { get; set; } + public double Latitude { get; set; } = double.NaN; + + public double Longitude { get; set; } = double.NaN; + public Location GeographyLocation { get; set; } public void Clear() { Geography = string.Empty; + Latitude = double.NaN; + Longitude = double.NaN; GeographyLocation = null; } } diff --git a/skills/csharp/experimental/weatherskill/Responses/Sample/SampleResponses.cs b/skills/csharp/experimental/weatherskill/Responses/Sample/SampleResponses.cs deleted file mode 100644 index c42212b2fe..0000000000 --- a/skills/csharp/experimental/weatherskill/Responses/Sample/SampleResponses.cs +++ /dev/null @@ -1,18 +0,0 @@ -// https://docs.microsoft.com/en-us/visualstudio/modeling/t4-include-directive?view=vs-2017 -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using Microsoft.Bot.Builder.Solutions.Responses; - -namespace WeatherSkill.Responses.Sample -{ - /// - /// Contains bot responses. - /// - public class SampleResponses : IResponseIdCollection - { - // Generated accessors - public const string NamePrompt = "NamePrompt"; - public const string HaveNameMessage = "HaveNameMessage"; - } -} \ No newline at end of file diff --git a/skills/csharp/experimental/weatherskill/Responses/Sample/SampleResponses.de.json b/skills/csharp/experimental/weatherskill/Responses/Sample/SampleResponses.de.json deleted file mode 100644 index 57d51b2b5a..0000000000 Binary files a/skills/csharp/experimental/weatherskill/Responses/Sample/SampleResponses.de.json and /dev/null differ diff --git a/skills/csharp/experimental/weatherskill/Responses/Sample/SampleResponses.es.json b/skills/csharp/experimental/weatherskill/Responses/Sample/SampleResponses.es.json deleted file mode 100644 index 7c21c6ee3a..0000000000 Binary files a/skills/csharp/experimental/weatherskill/Responses/Sample/SampleResponses.es.json and /dev/null differ diff --git a/skills/csharp/experimental/weatherskill/Responses/Sample/SampleResponses.fr.json b/skills/csharp/experimental/weatherskill/Responses/Sample/SampleResponses.fr.json deleted file mode 100644 index 9ed3547f87..0000000000 Binary files a/skills/csharp/experimental/weatherskill/Responses/Sample/SampleResponses.fr.json and /dev/null differ diff --git a/skills/csharp/experimental/weatherskill/Responses/Sample/SampleResponses.it.json b/skills/csharp/experimental/weatherskill/Responses/Sample/SampleResponses.it.json deleted file mode 100644 index 9624de03f7..0000000000 Binary files a/skills/csharp/experimental/weatherskill/Responses/Sample/SampleResponses.it.json and /dev/null differ diff --git a/skills/csharp/experimental/weatherskill/Responses/Sample/SampleResponses.json b/skills/csharp/experimental/weatherskill/Responses/Sample/SampleResponses.json deleted file mode 100644 index 61eef3ec30..0000000000 --- a/skills/csharp/experimental/weatherskill/Responses/Sample/SampleResponses.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "NamePrompt": { - "replies": [ - { - "text": "What is your name?", - "speak": "What is your name?" - } - ], - "inputHint": "expectingInput" - }, - "HaveNameMessage": { - "replies": [ - { - "text": "Hi, {Name}!", - "speak": "Hi, {Name}!" - }, - { - "text": "Nice to meet you, {Name}!", - "speak": "Nice to meet you, {Name}!" - } - ], - "inputHint": "acceptingInput" - } -} diff --git a/skills/csharp/experimental/weatherskill/Responses/Sample/SampleResponses.tt b/skills/csharp/experimental/weatherskill/Responses/Sample/SampleResponses.tt deleted file mode 100644 index f204f0981b..0000000000 --- a/skills/csharp/experimental/weatherskill/Responses/Sample/SampleResponses.tt +++ /dev/null @@ -1,3 +0,0 @@ -<#@ template debug="false" hostspecific="true" language="C#" #> -<#@ output extension=".cs" #> -<#@ include file="..\Shared\ResponseIdCollection.t4"#> \ No newline at end of file diff --git a/skills/csharp/experimental/weatherskill/Responses/Sample/SampleResponses.zh.json b/skills/csharp/experimental/weatherskill/Responses/Sample/SampleResponses.zh.json deleted file mode 100644 index dffd603f9e..0000000000 --- a/skills/csharp/experimental/weatherskill/Responses/Sample/SampleResponses.zh.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "NamePrompt": { - "replies": [ - { - "text": "你叫什么名字?", - "speak": "你叫什么名字?" - } - ], - "inputHint": "expectingInput" - }, - "HaveNameMessage": { - "replies": [ - { - "text": "嗨, {Name}!", - "speak": "嗨, {Name}!" - }, - { - "text": "很高兴见到你, {Name}!", - "speak": "很高兴见到你, {Name}!" - } - ], - "inputHint": "acceptingInput" - } -} \ No newline at end of file diff --git a/skills/csharp/experimental/weatherskill/Services/AccuweatherService.cs b/skills/csharp/experimental/weatherskill/Services/AccuweatherService.cs index 8883a0cc9f..e785d4db61 100644 --- a/skills/csharp/experimental/weatherskill/Services/AccuweatherService.cs +++ b/skills/csharp/experimental/weatherskill/Services/AccuweatherService.cs @@ -13,6 +13,7 @@ public sealed class AccuweatherService { private static HttpClient _httpClient; private string _searchLocationUrl = $"http://dataservice.accuweather.com/locations/v1/search?q={{0}}&apikey={{1}}"; + private string _searchLocationByGeoUrl = $"http://dataservice.accuweather.com/locations/v1/cities/geoposition/search?q={{0}},{{1}}&apikey={{2}}"; private string _oneDayForecastUrl = $"http://dataservice.accuweather.com/forecasts/v1/daily/1day/{{0}}?apikey={{1}}&details=true"; private string _fiveDayForecastUrl = $"http://dataservice.accuweather.com/forecasts/v1/daily/5day/{{0}}?apikey={{1}}&details=true"; private string _tenDayForecastUrl = $"http://dataservice.accuweather.com/forecasts/v1/daily/10day/{{0}}?apikey={{1}}&details=true"; @@ -27,7 +28,12 @@ public AccuweatherService(BotSettings settings) public async Task GetLocationByQueryAsync(string query) { - return await GetLocationResponseAsync(string.Format(CultureInfo.InvariantCulture, _searchLocationUrl, query, _apiKey)); + return (await GetLocationsResponseAsync(string.Format(CultureInfo.InvariantCulture, _searchLocationUrl, query, _apiKey)))[0]; + } + + public async Task GetLocationByGeoAsync(double latitude, double longitude) + { + return await GetLocationResponseAsync(string.Format(CultureInfo.InvariantCulture, _searchLocationByGeoUrl, latitude, longitude, _apiKey)); } public async Task GetOneDayForecastAsync(string query) @@ -55,13 +61,22 @@ private void GetApiKey(BotSettings settings) _apiKey = settings.WeatherApiKey ?? throw new Exception("Could not get the required AccuWeather API key. Please make sure your settings are correctly configured."); } - private async Task GetLocationResponseAsync(string url) + private async Task GetLocationsResponseAsync(string url) { var response = await _httpClient.GetStringAsync(url); var apiResponse = JsonConvert.DeserializeObject(response); - return apiResponse[0]; + return apiResponse; + } + + private async Task GetLocationResponseAsync(string url) + { + var response = await _httpClient.GetStringAsync(url); + + var apiResponse = JsonConvert.DeserializeObject(response); + + return apiResponse; } private async Task GetDailyForecastResponseAsync(string url) diff --git a/skills/csharp/experimental/weatherskill/Startup.cs b/skills/csharp/experimental/weatherskill/Startup.cs index bbb8643ee3..f2f14930b3 100644 --- a/skills/csharp/experimental/weatherskill/Startup.cs +++ b/skills/csharp/experimental/weatherskill/Startup.cs @@ -26,7 +26,6 @@ using WeatherSkill.Bots; using WeatherSkill.Dialogs; using WeatherSkill.Responses.Main; -using WeatherSkill.Responses.Sample; using WeatherSkill.Responses.Shared; using WeatherSkill.Services; @@ -95,11 +94,9 @@ public void ConfigureServices(IServiceCollection services) services.AddSingleton(sp => new ResponseManager( settings.CognitiveModels.Select(l => l.Key).ToArray(), new MainResponses(), - new SharedResponses(), - new SampleResponses())); + new SharedResponses())); // Register dialogs - services.AddTransient(); services.AddTransient(); // Configure adapters diff --git a/skills/csharp/experimental/weatherskill/WeatherSkill.csproj b/skills/csharp/experimental/weatherskill/WeatherSkill.csproj index b510e15d16..d8c7617a4b 100644 --- a/skills/csharp/experimental/weatherskill/WeatherSkill.csproj +++ b/skills/csharp/experimental/weatherskill/WeatherSkill.csproj @@ -15,12 +15,6 @@ - - - - - - @@ -38,12 +32,6 @@ - - - - - - @@ -92,10 +80,6 @@ TextTemplatingFileGenerator MainResponses.cs - - TextTemplatingFileGenerator - SampleResponses.cs - TextTemplatingFileGenerator SharedResponses.cs @@ -117,11 +101,6 @@ True MainResponses.tt - - True - True - SampleResponses.tt - True True diff --git a/skills/csharp/experimental/weatherskill/manifestTemplate.json b/skills/csharp/experimental/weatherskill/manifestTemplate.json index b5fc87cc07..ad47d0ab76 100644 --- a/skills/csharp/experimental/weatherskill/manifestTemplate.json +++ b/skills/csharp/experimental/weatherskill/manifestTemplate.json @@ -22,7 +22,7 @@ { "locale": "en", "source": [ - "WeatherSkill#GetForecast" + "WeatherSkill#CheckWeatherValue" ] } ] diff --git a/skills/csharp/pointofinterestskill/manifestTemplate.json b/skills/csharp/pointofinterestskill/manifestTemplate.json index 5972cfe009..26e31dbcb1 100644 --- a/skills/csharp/pointofinterestskill/manifestTemplate.json +++ b/skills/csharp/pointofinterestskill/manifestTemplate.json @@ -20,29 +20,7 @@ { "locale": "en", "source": [ - "PointOfInterest#NAVIGATION_ROUTE_FROM_X_TO_Y" - ] - } - ] - } - } - }, - { - "id": "poiskill_cancelRoute", - "definition": { - "description": "Cancel an active route.", - "slots": [ - { - "name": "location", - "types": [ "string" ] - } - ], - "triggers": { - "utteranceSources": [ - { - "locale": "en", - "source": [ - "PointOfInterest#NAVIGATION_CANCEL_ROUTE" + "PointOfInterest#GetDirections" ] } ] @@ -64,7 +42,7 @@ { "locale": "en", "source": [ - "PointOfInterest#NAVIGATION_FIND_POINTOFINTEREST" + "PointOfInterest#FindPointOfInterest" ] } ] @@ -86,7 +64,7 @@ { "locale": "en", "source": [ - "PointOfInterest#NAVIGATION_FIND_PARKING" + "PointOfInterest#FindParking" ] } ]