/// <summary> /// Look up the six hour forecast using Accuweather. /// </summary> private async Task <DialogTurnResult> GetWeatherResponse(WaterfallStepContext stepContext, CancellationToken cancellationToken) { var state = await _stateAccessor.GetAsync(stepContext.Context); var service = new AccuweatherService(Settings); if (!string.IsNullOrEmpty(state.Geography)) { state.GeographyLocation = await service.GetLocationByQueryAsync(state.Geography); } else if (!double.IsNaN(state.Latitude)) { 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); var twelveHourForecast = await service.GetTwelveHourForecastAsync(state.GeographyLocation.Key); var hourlyForecasts = new List <HourDetails>(); bool useFile = Channel.GetChannelId(stepContext.Context) == Channels.Msteams; for (int i = 0; i < 6; i++) { hourlyForecasts.Add(new HourDetails() { Hour = twelveHourForecast[i].DateTime.ToString("hh tt", CultureInfo.InvariantCulture), Icon = GetWeatherIcon(twelveHourForecast[i].WeatherIcon, useFile), Temperature = Convert.ToInt32(twelveHourForecast[i].Temperature.Value) }); } var forecastModel = new SixHourForecastCard() { Speak = oneDayForecast.DailyForecasts[0].Day.ShortPhrase, Location = state.GeographyLocation.LocalizedName, DayIcon = GetWeatherIcon(oneDayForecast.DailyForecasts[0].Day.Icon, useFile), Date = $"{oneDayForecast.DailyForecasts[0].Date.DayOfWeek} {CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(oneDayForecast.DailyForecasts[0].Date.Month)} {oneDayForecast.DailyForecasts[0].Date.Day}", MinimumTemperature = Convert.ToInt32(oneDayForecast.DailyForecasts[0].Temperature.Minimum.Value), MaximumTemperature = Convert.ToInt32(oneDayForecast.DailyForecasts[0].Temperature.Maximum.Value), ShortPhrase = oneDayForecast.DailyForecasts[0].Day.ShortPhrase, WindDescription = $"Winds {oneDayForecast.DailyForecasts[0].Day.Wind.Speed.Value} {oneDayForecast.DailyForecasts[0].Day.Wind.Speed.Unit} {oneDayForecast.DailyForecasts[0].Day.Wind.Direction.Localized}", Hour1 = twelveHourForecast[0].DateTime.ToString("h tt", CultureInfo.InvariantCulture), Icon1 = GetWeatherIcon(twelveHourForecast[0].WeatherIcon, useFile), Temperature1 = Convert.ToInt32(twelveHourForecast[0].Temperature.Value), Hour2 = twelveHourForecast[1].DateTime.ToString("h tt", CultureInfo.InvariantCulture), Icon2 = GetWeatherIcon(twelveHourForecast[1].WeatherIcon, useFile), Temperature2 = Convert.ToInt32(twelveHourForecast[1].Temperature.Value), Hour3 = twelveHourForecast[2].DateTime.ToString("h tt", CultureInfo.InvariantCulture), Icon3 = GetWeatherIcon(twelveHourForecast[2].WeatherIcon, useFile), Temperature3 = Convert.ToInt32(twelveHourForecast[2].Temperature.Value), Hour4 = twelveHourForecast[3].DateTime.ToString("h tt", CultureInfo.InvariantCulture), Icon4 = GetWeatherIcon(twelveHourForecast[3].WeatherIcon, useFile), Temperature4 = Convert.ToInt32(twelveHourForecast[3].Temperature.Value), Hour5 = twelveHourForecast[4].DateTime.ToString("h tt", CultureInfo.InvariantCulture), Icon5 = GetWeatherIcon(twelveHourForecast[4].WeatherIcon, useFile), Temperature5 = Convert.ToInt32(twelveHourForecast[4].Temperature.Value), Hour6 = twelveHourForecast[5].DateTime.ToString("h tt", CultureInfo.InvariantCulture), Icon6 = GetWeatherIcon(twelveHourForecast[5].WeatherIcon, useFile), Temperature6 = Convert.ToInt32(twelveHourForecast[5].Temperature.Value) }; var templateId = SharedResponses.SixHourForecast; var card = new Card(GetDivergedCardName(stepContext.Context, "SixHourForecast"), forecastModel); var response = ResponseManager.GetCardResponse(templateId, card, tokens: null); await stepContext.Context.SendActivityAsync(response); return(await stepContext.NextAsync()); }
/// <summary> /// Look up the six hour forecast using Accuweather. /// </summary> private async Task <DialogTurnResult> GetWeatherResponseAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) { var state = await StateAccessor.GetAsync(stepContext.Context, cancellationToken : cancellationToken); var service = ServiceManager.InitService(Settings); if (!string.IsNullOrEmpty(state.Geography)) { (state.Latitude, state.Longitude) = await service.GetCoordinatesByQueryAsync(state.Geography); } // The applicable query is specified as a comma separated string composed by latitude followed by longitude. // e.g. "47.641268,-122.125679". var qureyString = string.Format("{0},{1}", state.Latitude.ToString(), state.Longitude.ToString()); string location = string.Empty; if (!double.IsNaN(state.Latitude) && !double.IsNaN(state.Longitude)) { location = await service.GetLocationByQueryAsync(qureyString); } else { throw new Exception("Must have Geography or Latitude & Longitude!"); } var oneDayForecast = await service.GetOneDayForecastAsync(qureyString); var twelveHourForecast = await service.GetTwelveHourForecastAsync(qureyString); bool useFile = Channel.GetChannelId(stepContext.Context) == Channels.Msteams; var forecastModel = new SixHourForecastCard() { Speak = oneDayForecast.Forecasts[0].Day.ShortPhrase, Location = location, DayIcon = GetWeatherIcon(oneDayForecast.Forecasts[0].Day.IconCode, useFile), Date = $"{DateTime.Parse(oneDayForecast.Forecasts[0].Date).DayOfWeek} {CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(DateTime.Parse(oneDayForecast.Forecasts[0].Date).Month)} {DateTime.Parse(oneDayForecast.Forecasts[0].Date).Day}", MinimumTemperature = Convert.ToInt32(oneDayForecast.Forecasts[0].Temperature.Minimum.Value), MaximumTemperature = Convert.ToInt32(oneDayForecast.Forecasts[0].Temperature.Maximum.Value), ShortPhrase = oneDayForecast.Forecasts[0].Day.ShortPhrase, WindDescription = $"Winds {oneDayForecast.Forecasts[0].Day.Wind.Speed.Value} {oneDayForecast.Forecasts[0].Day.Wind.Speed.Unit} {oneDayForecast.Forecasts[0].Day.Wind.Direction.LocalizedDescription}", Hour1 = DateTime.Parse(twelveHourForecast.Forecasts[0].Date).ToString("h tt", CultureInfo.InvariantCulture), Icon1 = GetWeatherIcon(twelveHourForecast.Forecasts[0].IconCode, useFile), Temperature1 = Convert.ToInt32(twelveHourForecast.Forecasts[0].Temperature.Value), Hour2 = DateTime.Parse(twelveHourForecast.Forecasts[1].Date).ToString("h tt", CultureInfo.InvariantCulture), Icon2 = GetWeatherIcon(twelveHourForecast.Forecasts[1].IconCode, useFile), Temperature2 = Convert.ToInt32(twelveHourForecast.Forecasts[1].Temperature.Value), Hour3 = DateTime.Parse(twelveHourForecast.Forecasts[2].Date).ToString("h tt", CultureInfo.InvariantCulture), Icon3 = GetWeatherIcon(twelveHourForecast.Forecasts[2].IconCode, useFile), Temperature3 = Convert.ToInt32(twelveHourForecast.Forecasts[2].Temperature.Value), Hour4 = DateTime.Parse(twelveHourForecast.Forecasts[3].Date).ToString("h tt", CultureInfo.InvariantCulture), Icon4 = GetWeatherIcon(twelveHourForecast.Forecasts[3].IconCode, useFile), Temperature4 = Convert.ToInt32(twelveHourForecast.Forecasts[3].Temperature.Value), Hour5 = DateTime.Parse(twelveHourForecast.Forecasts[4].Date).ToString("h tt", CultureInfo.InvariantCulture), Icon5 = GetWeatherIcon(twelveHourForecast.Forecasts[4].IconCode, useFile), Temperature5 = Convert.ToInt32(twelveHourForecast.Forecasts[4].Temperature.Value), Hour6 = DateTime.Parse(twelveHourForecast.Forecasts[5].Date).ToString("h tt", CultureInfo.InvariantCulture), Icon6 = GetWeatherIcon(twelveHourForecast.Forecasts[5].IconCode, useFile), Temperature6 = Convert.ToInt32(twelveHourForecast.Forecasts[5].Temperature.Value) }; if (state.IsAction) { var summary = forecastModel.Speak; var actionResult = new ActionResult() { Summary = summary, ActionSuccess = true }; return(await stepContext.EndDialogAsync(actionResult, cancellationToken : cancellationToken)); } var templateId = SharedResponses.SixHourForecast; var card = new Card(GetDivergedCardName(stepContext.Context, "SixHourForecast"), forecastModel); var response = TemplateManager.GenerateActivity(templateId, card, tokens: null); await stepContext.Context.SendActivityAsync(response, cancellationToken); return(await stepContext.NextAsync(cancellationToken : cancellationToken)); }