示例#1
0
        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 }
                }
            }));
        }
示例#2
0
        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);
        }
示例#3
0
        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
            }));
        }
示例#4
0
        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);
        }