Beispiel #1
0
        private async Task <SkillResponse> HandleUnknownUser(IntentRequest intentRequest, AmazonDynamoDBClient dynamoDbClient, string name)
        {
            var allUsers = await dynamoDbClient.ScanAsync(new ScanRequest
            {
                TableName            = _TableName,
                ProjectionExpression = "Username"
            });

            if (allUsers != null && allUsers.Count > 0)
            {
                var l = new Levenshtein();

                var bestMatchedName = allUsers.Items
                                      .Select(x => x["Username"].S)
                                      .OrderBy(x => l.Distance(x, name))
                                      .FirstOrDefault();

                if (bestMatchedName != null)
                {
                    intentRequest.Intent.Slots.TryAdd("name", new Slot {
                        Value = bestMatchedName
                    });
                    intentRequest.Intent.Slots["name"].Value = bestMatchedName;
                    return(ResponseBuilder.DialogConfirmIntent(new PlainTextOutputSpeech
                    {
                        Text = $"I did not find {name}, do you mean {bestMatchedName}"
                    }, intentRequest.Intent));
                }
            }

            return(null);
        }
Beispiel #2
0
        private SkillResponse BetIntent(IntentRequest request)
        {
            string responseText = string.Empty;
            string sportName    = request.Intent.Slots["sport"].Value;
            string eventName    = request.Intent.Slots["eventName"].Value;
            string eventBet     = request.Intent.Slots["eventBet"].Value;
            string betResult    = request.Intent.Slots["result"].Value;

            if (string.IsNullOrEmpty(sportName)) //If sport doesn't have value, ask.
            {
                return(AskForSportSlot(request));
            }
            else //sport has value
            {
                if (string.IsNullOrEmpty(eventName)) //If eventName doesn't have value,  check correct sport and ask for eventName
                {
                    IEnumerable <Sport> sports = GetSportsAsync().Result;
                    Sport selectedSport        = GetSelectedSport(sports, sportName);
                    if (selectedSport == null) //No correct sport, ask sport again
                    {
                        responseText = $"We don't have available bets for this sport, please select one from: {string.Join(", ", sports.Select(s => s.Name).ToArray())}";
                        return(ResponseBuilder.DialogElicitSlot(new PlainTextOutputSpeech {
                            Text = responseText
                        }, "sport", request.Intent));
                    }
                    else //Correct sport, ask for event name
                    {
                        return(AskForEventNameSlot(request, selectedSport.Name));
                    }
                }
                else //EvetName has value
                {
                    if (string.IsNullOrEmpty(eventBet))
                    {
                        IEnumerable <SportEvent> events = GetSportEventsAsync(sportName).Result;
                        SportEvent selectedEvent        = GetSelectedEvent(events, eventName);
                        if (selectedEvent == null) //Check valid eventName value. If not valid, ask again
                        {
                            responseText = $"This bet is not available, please select one from: {string.Join(", ", events.Select(s => s.EventName).ToArray())}";
                            return(ResponseBuilder.DialogElicitSlot(new PlainTextOutputSpeech {
                                Text = responseText
                            }, "eventName", request.Intent));
                        }
                        else //Correct eventName, ask for eventBet
                        {
                            return(AskForEventBetSlot(request, selectedEvent.EventName, selectedEvent.Id));
                        }
                    }
                    else //EventBet has value
                    {
                        if (string.IsNullOrEmpty(betResult))
                        {
                            IEnumerable <SportEvent> events = GetSportEventsAsync(sportName).Result;
                            SportEvent           sportEvent = GetSelectedEvent(events, eventName);
                            IEnumerable <string> eventBets  = GetEventBets(sportEvent.Id).Result;
                            if (!eventBets.Any(s => string.Equals(s, eventBet, StringComparison.OrdinalIgnoreCase))) //Check valid eventBet value. If not valid, ask again
                            {
                                responseText = $"This bet is not available, please select one from: {string.Join(", ", eventBets.ToArray())}";
                                return(ResponseBuilder.DialogElicitSlot(new PlainTextOutputSpeech {
                                    Text = responseText
                                }, "eventBet", request.Intent));
                            }
                            else //Correct eventBet, ask for result
                            {
                                Intent updatedIntent = request.Intent;
                                updatedIntent.ConfirmationStatus = ConfirmationStatus.None;
                                return(AskForResultSlot(request, eventBet));
                            }
                        }
                        else
                        {
                            if (request.Intent.ConfirmationStatus == ConfirmationStatus.None)
                            {
                                responseText = $"Do you want to confirm the bet for {eventName} with result {betResult}?";
                                return(ResponseBuilder.DialogConfirmIntent(new PlainTextOutputSpeech {
                                    Text = responseText
                                }, request.Intent));
                            }
                            else if (request.Intent.ConfirmationStatus == ConfirmationStatus.Denied)
                            {
                                Intent updatedIntent = request.Intent;
                                updatedIntent.Slots["result"].Value = null;
                                updatedIntent.ConfirmationStatus    = ConfirmationStatus.None;
                                return(AskForResultSlot(request, eventBet, updatedIntent));
                            }
                            else
                            {
                                IEnumerable <SportEvent> events = GetSportEventsAsync(sportName).Result;
                                SportEvent sportEvent           = events.Single(e => e.EventName.ToUpper().Contains(eventName.ToUpper()));
                                Bet        bet = new Bet
                                {
                                    BetResult = betResult,
                                    BetType   = eventBet,
                                    EventId   = sportEvent.Id,
                                    EventName = eventName
                                };
                                DoPutHttpWebRequest("bets", bet).Wait();

                                return(ResponseBuilder.Tell("You have submitted your bet! Thank you!"));
                            }
                        }
                    }
                }
            }
        }