private static SkillResponse GetResponseCinemaSelection(GetOverviewInput input, IReadOnlyList <Cinema> kinos) { string outputText; if (input.IsZipCode()) { var plzSplitted = string.Join(" ", Regex.Matches(input.SelectedCity, @"\d{1}")); outputText = $"<speak><p>Folgende Kinos wurden in der Nähe von {plzSplitted} gefunden:</p><p>"; } else { outputText = $"<speak><p>Folgende Kinos wurden in der Nähe von {input.SelectedCity} gefunden:</p><p>"; } for (var i = 0; i < kinos.Count; i++) { outputText += $"{i + 1}:. {kinos[i].Name}. "; } outputText += $"</p><p>Bitte suchen Sie sich ein Kino aus, indem Sie eine Zahl zwischen 1 und {kinos.Count} wählen.</p></speak>"; var json = JsonConvert.SerializeObject(kinos); return(ResponseBuilder.DialogElicitSlot( new SsmlOutputSpeech { Ssml = outputText }, Slots.CinemaSelection, new Session { Attributes = new Dictionary <string, object> { { Constants.Session.Cinemas, json } } })); }
private GetOverviewInput PrepareInput(IntentRequest request) { var city = request.Intent.GetSlot(Slots.City); var date = request.Intent.GetSlot(Slots.Vorstellungdatum); var dayTime = request.Intent.GetSlot(Slots.Vorstellungzeit); if (city == null) { var response = new GetOverviewInput { PendingResponse = ResponseBuilder.Tell("Es wurde keine Stadt gewählt.") }; return(response); } if (date == null) { var response = new GetOverviewInput { PendingResponse = ResponseBuilder.Tell("Es wurde kein Datum gewählt.") }; return(response); } if (!DateTime.TryParse(date, out var vorstellungsdatum)) { var response = new GetOverviewInput { PendingResponse = ResponseBuilder.Tell($"Das Datum {date} hat ein ungültiges Format.") }; return(response); } if (!string.IsNullOrEmpty(dayTime)) { if (!dayTime.Equals("AF", StringComparison.OrdinalIgnoreCase) && !dayTime.Equals("EV", StringComparison.OrdinalIgnoreCase)) { var response = new GetOverviewInput { PendingResponse = ResponseBuilder.Tell($"Die angegebene Zeit {date} ist ungültig.") }; return(response); } } var input = new GetOverviewInput { SelectedDate = vorstellungsdatum, SelectedDayTime = dayTime, SelectedCity = city }; return(input); }
private SkillResponse GetResponseCinemaSaveToPreference(GetOverviewInput input, Session oldSession) { string outputText; if (input.IsZipCode()) { var plzSplitted = string.Join(" ", Regex.Matches(input.SelectedCity, @"\d{1}")); outputText = $"<speak><p>Sie haben {input?.SelectedCinema?.Name} gewählt.</p><p>Wollen Sie dieses Kino für {plzSplitted} zukünftig immer nutzen?</p></speak>"; } else { outputText = $"<speak><p>Sie haben {input.SelectedCinema?.Name} gewählt.</p><p>Wollen Sie dieses Kino für die Stadt {input.SelectedCity} zukünftig immer nutzen?</p></speak>"; } return(ResponseBuilder.DialogElicitSlot( new SsmlOutputSpeech { Ssml = outputText }, Slots.SaveCinemaToPreferences, new Session { Attributes = oldSession.Attributes })); }
private async Task <GetOverviewInput> SelectCinema(SkillRequest skillRequest, GetOverviewInput input, KinoheldUser user) { var request = (IntentRequest)skillRequest.Request; var cinemaPreferenceForCity = user?.CityCinemaAssignments.FirstOrDefault(p => p.City == input.SelectedCity); if (cinemaPreferenceForCity != null) { m_logger.LogDebug("Taking cinema from the preferences"); input.SelectedCinema = JsonHelper.Deserialize <Cinema>(cinemaPreferenceForCity.Cinema); return(input); } var cinemaSelection = request.Intent.GetSlot(Slots.CinemaSelection); if (string.IsNullOrEmpty(cinemaSelection) || !int.TryParse(cinemaSelection, out var cinemaSelectionInt)) { m_logger.LogDebug("Getting cinemas near the selected city to choose from"); var kinos = await m_kinoheldService.GetCinemas(input.SelectedCity).ConfigureAwait(false); if (!kinos.Any()) { input.PendingResponse = ResponseBuilder.Tell(string.Format(m_messages.ErrorNoCinemaInCity, input.SelectedCity)); return(input); } if (kinos.Count == 1) { input.SelectedCinema = kinos.First(); return(input); } input.PendingResponse = GetResponseCinemaSelection(input, kinos); return(input); } if (!skillRequest.Session.Attributes.ContainsKey(Constants.Session.Cinemas)) { input.PendingResponse = ResponseBuilder.Tell(string.Format(m_messages.ErrorMissingSessionCinemaObject, Constants.Session.Cinemas)); } m_logger.LogDebug("Getting cinemas from session data"); var jsonCinemas = JArray.Parse(skillRequest.Session.Attributes[Constants.Session.Cinemas].ToString()); var cinemas = jsonCinemas.ToObject <IEnumerable <Cinema> >().ToList(); if (cinemas.Count < cinemaSelectionInt) { input.PendingResponse = GetResponseCinemaSelection(input, cinemas); return(input); } m_logger.LogDebug("Taking the chosen cinema from the list"); input.SelectedCinema = cinemas[cinemaSelectionInt - 1]; var savePreference = request.Intent.GetSlot(Slots.SaveCinemaToPreferences); if (string.IsNullOrEmpty(savePreference)) { m_logger.LogDebug("Asking user if he wishes to save the cinema selection for upcoming requests"); input.PendingResponse = GetResponseCinemaSaveToPreference(input, skillRequest.Session); return(input); } if (savePreference.Equals("Ja", StringComparison.OrdinalIgnoreCase)) { m_logger.LogDebug("Saving cinema selection for future requests"); var cinemaData = JsonHelper.Serialize(input.SelectedCinema); await m_dbAccess.SaveCityCinemaPreferenceAsync(skillRequest.Session.User.UserId, input.SelectedCity, cinemaData).ConfigureAwait(false); } return(input); }