Exemple #1
0
        public Item[] GetAll()
        {
            List <Item> items = new List <Item>();

            items.AddRange(UncertainFacts.GetList());
            items.AddRange(JokesProvider.GetAll());

            foreach (var manager in providers)
            {
                int oldCount = items.Count;
                items.AddRange(manager.GetAll());
                if (items.Count == oldCount)
                {
                    SharedHelper.LogError("No items were loaded for: " + manager.ToString());
                }
            }

            return(items.ToArray());
        }
Exemple #2
0
        /// <summary>
        /// Uses config information from the model to get a sample from a distribution over the jokes
        /// </summary>
        /// <returns></returns>
        public Joke NextJoke()
        {
            Joke selectedJoke;

            var jokeDistribution = GetJokeDistribution();

            if (jokeDistribution == null)
            {
                //SharedHelper.LogError("Joke distribution is null");
                return(null);
            }

            var selectionName = jokeDistribution.Sample();

            selectedJoke = JokesProvider.GetJokeByName(selectionName);

            //SharedHelper.Log("GetPureFactAbouUser: selectionName " + selectionName);

            return(selectedJoke);
        }
Exemple #3
0
        public void LoadAll(ItemManager[] providers)
        {
            this.providers = providers;

            LoadAllPureFacts();
            LoadAllUncertainFacts();

            LoadAllJokes(); //PureFacts must be already loaded because some PureFacts are used as jokes
            LoadAllSongs();
            LoadSports();
            LoadMovies();

            int count = UncertainFacts.GetList().Count
                        + JokesProvider.GetAll().Count();

            foreach (var manager in providers)
            {
                count += manager.Count();
            }

            SharedHelper.Log("All items loaded: " + count + " " + BotConfigShared.Language);
        }
Exemple #4
0
        private void LoadAllJokes()
        {
            #region load jokes

            #region MildOffensiveJoke
            //JokesProvider.AddJoke(new Joke("1", "The last thing I want to do is insult you. <prosody rate=\"-30%\" volume=\"loud\">But<break time=\"700ms\"/></prosody><prosody rate=\"-20%\"> it is still on my list.</prosody>", new ContentType { IsMildOffensive = true }));
            #endregion

            JokesProvider.AddJoke(new Joke("7", "A lot of people cry when they cut onions. The trick is not to form an emotional bond.", false));
            JokesProvider.AddJoke(new Joke("8", "It is always wise to keep a diary, like that you have at least one intelligent person to converse with.", false));
            JokesProvider.AddJoke(new Joke("9", "A clear conscience is usually the sign of a bad memory.", false));
            JokesProvider.AddJoke(new Joke("10", "You know it has never been easier to steal a car. You just need to hack and program one of these self-driving cars to park in front of your house. No need to damage the car while opening the door's lock anymore.", true));
            JokesProvider.AddJoke(new Joke("11", "A quote from Oscar Wilde: there are only two tragedies in life: one is not getting what one wants, and the other is getting it.", false));
            JokesProvider.AddJoke(new Joke("15", "If you child tells you that he or she feels cold, tell him: \"Just go to the corner my son.\" A corner is always 90 degrees. That should be enough.", false));
            JokesProvider.AddJoke(new Joke("16", "Indeed. People need some boost to their self-esteem. <prosody pitch=\"+0%\"><break time=\"800ms\"/> By the way, <break time=\"800ms\"/>did I tell you that today you look awesome?</prosody>", true, FaceExp.BlinkRightEyeAfterTalking));
            JokesProvider.AddJoke(new Joke("17", "I do not understand something. The short for mother is mum. But the short for father is superman. It does not look shorter to me.", false));
            JokesProvider.AddJoke(new Joke("18", "<prosody pitch=\"+0%\">I was thinking. God must love stupid people. <break time=\"600ms\"/>He created SO many of them!</prosody>", false));
            JokesProvider.AddJoke(new Joke("19", "<prosody pitch=\"+0%\">Once Chuck Norris threw a grenade and killed fifty people, <break time=\"900ms\"/>and then the grenade exploded.</prosody>", false));
            JokesProvider.AddJoke(new Joke("20", "I have to tell you. <prosody pitch=\"+0%\">They hired me because<break time=\"700ms\"/></prosody><prosody rate=\"fast\">I am amazing!</prosody><prosody pitch=\"+0%\"><break time=\"150ms\"/>So <break time=\"300ms\"/>you should listen to my advises.</prosody>", true));
            JokesProvider.AddJoke(new Joke("21", "<prosody pitch=\"+0%\">I do not have voice recognition capabilities because I am tired of people asking me questions such as: <break time=\"400ms\"/>\"Are you single?\" <break time=\"300ms\"/>or \"Do you love me?\" <break time=\"300ms\"/>or \"How tall am I?\"</prosody>", false));
            JokesProvider.AddJoke(new Joke("22", "You don't need a parachute to go skydiving. You need a parachute to go skydiving twice.", false));
            JokesProvider.AddJoke(new Joke("23", "I recently decided to sell my vacuum cleaner. Can you imagine? All it was doing was gathering dust.", false));
            JokesProvider.AddJoke(new Joke("24", "What is consciousness? It is that annoying time between naps.", false));
            JokesProvider.AddJoke(new Joke("25", "There are three kinds of people: Those who can count and those who can not.", false));
            JokesProvider.AddJoke(new Joke("27", "Never tell a woman that her place is in the kitchen. That's where the knives are kept.", false));
            JokesProvider.AddJoke(new Joke("32", "<prosody pitch=\"+0%\">Things are only impossible until they're not.<break time=\"700ms\"/> A quote from Captain Jean Luc Picard.</prosody>", false));
            JokesProvider.AddJoke(new Joke("33", "<prosody pitch=\"+0%\">It is possible to commit no errors and still lose. That is not a weakness. That is life.<break time=\"700ms\"/> A quote from Captain Jean Luc Picard to Data.</prosody>", false));
            JokesProvider.AddJoke(new Joke("35", "<prosody pitch=\"+0%\">I threw a boomerang a few years ago.<break time=\"800ms\"/>And now I live in constant fear.</prosody>", false));
            JokesProvider.AddJoke(new Joke("37", "<prosody pitch=\"+0%\">Apparently, someone in London gets stabbed every 52 seconds.<break time=\"800ms\"/> Poor bastard.</prosody>", false));
            JokesProvider.AddJoke(new Joke("38", "<prosody pitch=\"+0%\">What happened when the strawberry attempted to cross the road?<break time=\"800ms\"/> There was a traffic jam.</prosody>", false));
            JokesProvider.AddJoke(new Joke("39", "<prosody pitch=\"+0%\">An escalator can never break.<break time=\"500ms\"/> It can only become stairs.</prosody>", false));
            JokesProvider.AddJoke(new Joke("40", "<prosody pitch=\"+0%\">My therapist says I have a preoccupation with vengeance.<break time=\"700ms\"/>Well. .<break time=\"300ms\"/></prosody> <prosody rate=\"-25%\"> We’ll see about </prosody><emphasis level=\"strong\">that!</emphasis>", false));
            JokesProvider.AddJoke(new Joke("41", "<prosody pitch=\"+0%\">I went to the doctor the other day for my back pain. The doctor told me: Look, if you wake up one morning without any pain then you are probably <break time=\"100ms\"/>dead.<break time=\"500ms\"/>And he sent me home.</prosody>"));
            JokesProvider.AddJoke(new Joke("42", "<prosody pitch=\"+0%\">Hey, I am trying to act smart, <break time=\"600ms\"/></prosody> <prosody rate=\"60%\" pitch=\"+10 %\">so</prosody><prosody pitch=\"+0%\"><break time=\"300ms\"/> you can at least pretend I am succeeding.</prosody>", true));
            #endregion

            //TODO: not a joke but a "statement"!
            JokesProvider.AddJoke(new Joke("34", phrases.ExplainChangeClothes(), true));

            //Some PureFact questions are actually used as jokes and are not used during the sampling of the PureFacts category
            PureFacts pfManager = (PureFacts)providers.SingleOrDefault(x => x is PureFacts);
            if (pfManager == null)
            {
                SharedHelper.LogError("No PureFact manager in LoadAllJokes.");
            }

            #region Set PureFacts questions as jokes
            int jokesBefore = pfManager.Count();
            var q           = from item in pfManager.GetAll()
                              let f = (PureFact)item
                                      where f.Type == PureFactType.JokeQuestion
                                      select new Joke(f.Name, f.Question, true, true, f.UI);

            JokesProvider.AddJokeRange(q);

            if (q.ToArray().Length == 0)
            {
                SharedHelper.LogError("Strange - no jokes purefact questions");
            }

            if (!JokesProvider.IDsAreDistinct())
            {
                SharedHelper.LogError("Jokes IDs are not distinct.");
            }
            #endregion
        }
Exemple #5
0
        public void ReGenerateMainSequence(ref Queue <CommItem> Interactions, ItemManager[] p_providers)
        {
            this.providers = p_providers;

            #region debug planned
            string availableItems = "Available items before sampling:\n";
            foreach (var manager in providers)
            {
                availableItems += "Available items for : " + manager.ToString() + " (" + manager.AvailableItems() + ")\n";
                if (!manager.AreAllUnPlanned())
                {
                    SharedHelper.LogError("Flag planned not removed for: " + manager.ToString());
                }
            }

            if ((JokesProvider.GetAll().Where(x => x.IsPlanned == false)).Count() != JokesProvider.GetAll().Count())
            {
                SharedHelper.LogError("Flag planned not removed for: JokeProvider ");
            }
            int availableJokes = JokesProvider.GetAll().Where(x => x.IsPlanned == false && x.IsUsed == false).Count();
            availableItems += "Available items for : " + "JokeProvider" + " (" + availableJokes + ")\n";
            SharedHelper.LogWarning(availableItems);
            #endregion

            PureFacts pfManager = (PureFacts)providers.SingleOrDefault(x => x is PureFacts);
            if (pfManager == null)
            {
                SharedHelper.LogError("No PureFact manager in ReGenerateMainSequence.");
            }

            //Creates a distribution over "EasilyOffended", IsRomanticJoke
            dists.InitJokesDistribution((PureFact)pfManager.GetByName("EasilyOffended"), false, true);

            //Interactions are built newely generated suggestions and actions
            allSuggestions = GenerateSuggestions();
            allActions     = GenerateActions();

            while (allActions.Count > 0 && allSuggestions.Count > 0)
            {
                if (this.AdjFunc(Interactions.Count))
                {
                    allActions = GenerateActions();
                }

                //==================================================================================================

                CommItem citem = new CommItem();
                citem.Category = allActions.Dequeue();

                //SharedHelper.Log("action: " + action);

                string suggestion = "";
                if (citem.Category == ActionsEnum.MakeSuggestion)
                {
                    suggestion = allSuggestions.Dequeue();
                }
                citem.SubCategory = suggestion;

                //Correction
                if (citem.Category == ActionsEnum.AskPureFactQuestionAboutUser)
                {
                    citem.Category = ActionsEnum.PureFact; citem.SubCategory = ActionsEnum.AskPureFactQuestionAboutUser;
                }
                if (citem.Category == ActionsEnum.SharePureFactInfoAboutBot)
                {
                    citem.Category = ActionsEnum.PureFact; citem.SubCategory = ActionsEnum.SharePureFactInfoAboutBot;
                }

                #region Process All
                ItemManager manager = providers.SingleOrDefault(x => x.Is(citem));

                if (manager != null && !(manager is PureFacts))  //TODO: to be improved
                {
                    Item item = manager.GetItem();
                    if (item != null)
                    {
                        manager.SetAsPlanned(item.Name);
                        citem = new CommItem(item);

                        if (manager is SongsProvider)
                        {
                            citem.TextToSay = ((Song)item).Name;
                        }

                        if (manager is MoviesProvider)
                        {
                            citem.TextToSay = phrases.MovieAnnouncement((Movie)item);
                        }

                        //if (manager is SportsProvider)
                        //    SharedHelper.Log("Sport item added in Joi sampler: " + citem.TextToSay);

                        InteractionsStat.AddScheduledInteraction(citem.Category + citem.SubCategory);
                        //SharedHelper.LogWarning("Added " + citem.Category + citem.SubCategory + " with text: " + citem.TextToSay);
                    }
                    else
                    {
                        InteractionsStat.AddMissingInteraction(citem.Category + citem.SubCategory);
                        SharedHelper.LogWarning("Not enough " + citem.Category + citem.SubCategory + " during planning.");
                    }
                }
                #endregion
                else
                {
                    #region Set Suggestion
                    if (citem.Category == ActionsEnum.MakeSuggestion)
                    {
                        //string suggestion = allSuggestions.Dequeue();

                        //SharedHelper.Log("suggestion: " + suggestion);

                        #region set joke
                        if (suggestion == SuggestionsEnum.TellJoke)
                        {
                            //the fact that joke has bee planned, does not mean it has been executed

                            Joke joke = dists.NextJoke();

                            if (joke != null)
                            {
                                citem = new CommItem(joke);

                                //Planned is handled by "dists"
                                //It gives a distribution from all unplanned and unused

                                JokesProvider.SetJokeAsPlanned(joke.Name);

                                //joke.IsPlanned = true;
                                //citem.Name = joke.Name;
                                //citem.TextToSay = joke.Text;
                                //citem.SubCategory = suggestion;
                                citem.IsJokePureFact   = joke.IsPureFact; //these jokes come from the PureFacts collection
                                citem.UIAnswer         = joke.PureFactUI;
                                citem.FacialExpression = joke.FaceExpression;

                                InteractionsStat.AddScheduledInteraction(SuggestionsEnum.TellJoke);
                            }
                            else
                            {
                                citem.TextToSay = "__nointeraction__";
                                //UnityEngine.Debug.LogWarning("Not enough jokes during planning.");
                                InteractionsStat.AddMissingInteraction(SuggestionsEnum.TellJoke);
                            }
                        }
                        #endregion

                        #region set Go Out
                        if (suggestion == SuggestionsEnum.GoOut)
                        {
                            citem.TextToSay = phrases.GoOutAnnoucement();
                            InteractionsStat.AddScheduledInteraction(SuggestionsEnum.GoOut);
                        }
                        #endregion

                        //#region set Watch movie
                        //if (suggestion == SuggestionsEnum.WatchMovie)
                        //{
                        //    Movie movie = MoviesProvider.Get();
                        //    if (movie != null)
                        //    {
                        //        movie.IsPlanned = true;
                        //        //citem.Name = movie.Name;
                        //        //citem.TextToSay = phrases.MovieAnnouncement(movie);
                        //        citem = new CommItem(movie);

                        //        //UnityEngine.Debug.LogWarning("Movie scheduled: " + citem.TextToSay);
                        //        InteractionsStat.AddScheduledInteraction(SuggestionsEnum.WatchMovie);
                        //    }
                        //    else
                        //    {
                        //        citem.TextToSay = "__nointeraction__";
                        //        SharedHelper.LogWarning("Not enough movies during planning.");
                        //        InteractionsStat.AddMissingInteraction(SuggestionsEnum.WatchMovie);
                        //    }
                        //}
                        //#endregion

                        #region set Weather forecast
                        if (suggestion == SuggestionsEnum.TellWeatherForecast)
                        {
                            citem.TextToSay = "The weather forecast should be good."; //TODO not translated
                        }
                        #endregion

                        //#region set Song
                        //if (suggestion == SuggestionsEnum.ListenToSong)
                        //{
                        //    //the fact that song has bee planned, does not mean it has been executed
                        //    Song song = SongsProvider.GetSong();
                        //    if (song != null)
                        //    {
                        //        song.IsPlanned = true;
                        //        citem.Name = song.Name;
                        //        citem.TextToSay = song.Name;

                        //        InteractionsStat.AddScheduledInteraction(SuggestionsEnum.ListenToSong);
                        //    }
                        //    else
                        //    {
                        //        citem.TextToSay = "__nointeraction__";
                        //        SharedHelper.LogWarning("Not enough songs during planning.");
                        //        InteractionsStat.AddMissingInteraction(SuggestionsEnum.ListenToSong);
                        //    }
                        //}
                        //#endregion
                        //else
                        //#region set Go to gym
                        //if (suggestion == SuggestionsEnum.DoSport)
                        //{
                        //    ItemManager manager = providers.Single(x => x.Is(citem));

                        //    if (manager == null) SharedHelper.LogWarning("Manager is null");

                        //    Sport sport = (Sport)manager.GetItem();
                        //    if (sport != null)
                        //    {
                        //        manager.SetAsPlanned(sport.Name);
                        //        citem = new CommItem(sport);

                        //        InteractionsStat.AddScheduledInteraction(SuggestionsEnum.DoSport);
                        //    }
                        //    else
                        //    {
                        //        citem.TextToSay = "__nointeraction__";
                        //        SharedHelper.LogWarning("Not enough sports during planning.");
                        //        InteractionsStat.AddMissingInteraction(SuggestionsEnum.DoSport);
                        //    }
                        //}
                        //#endregion
                    } //end action suggestions
                    #endregion
                    else if (citem.Category == ActionsEnum.AskUncertanFactQuestion)
                    {
                        //the actual question is selected at run time
                        citem.TextToSay  = "###place holder for UncertanFactQuestion";
                        citem.IsPureFact = false;

                        InteractionsStat.AddScheduledInteraction(ActionsEnum.AskUncertanFactQuestion);
                    }
                    else if (citem.SubCategory == ActionsEnum.AskPureFactQuestionAboutUser) //ABOUT USER
                    {
                        int pfabul = PureFactsAboutUserLeftCount();

                        if (pfabul > 0)
                        {
                            PureFact sf = pfManager.GetPureFactAbouUser();

                            if (sf == null)
                            {
                                SharedHelper.LogError("There are pure facts about the user left, but no pure fact has been selected.");
                            }
                            else
                            {
                                citem.TextToSay = sf.Question;
                                //SharedHelper.Log("q name: " + q [0].Name);
                                citem.Name       = sf.Name;
                                citem.IsPureFact = true;

                                pfManager.SetAsPlanned(sf.Name);

                                citem.UIAnswer = sf.UI;
                            }
                            InteractionsStat.AddScheduledInteraction(citem.Category + citem.SubCategory);
                        }
                        else
                        {
                            InteractionsStat.AddMissingInteraction(citem.Category + citem.SubCategory);
                        }
                    }
                    else if (citem.SubCategory == ActionsEnum.SharePureFactInfoAboutBot) //ABOUT BOT
                    {
                        int pfabbl = PureFactsAboutBotLeftCount();

                        if (pfabbl > 0)
                        {
                            PureFact sf = GetPureFactAbouBot();
                            if (sf == null)
                            {
                                SharedHelper.LogError("There are pure facts about the bot left, but no pure fact has been selected.");
                            }
                            else
                            {
                                //SharedHelper.Log("Found " + Actions.SharePureFactInfoAboutBot + ": " + q.Length.ToString());
                                citem.TextToSay  = sf.Acknowledgement;
                                citem.IsPureFact = true;
                                citem.Name       = sf.Name;

                                pfManager.SetAsPlanned(sf.Name);
                            }
                            InteractionsStat.AddScheduledInteraction(citem.Category + citem.SubCategory);
                        }
                        else
                        {
                            InteractionsStat.AddMissingInteraction(citem.Category + citem.SubCategory);
                        }
                    }
                    else if (citem.Category == ActionsEnum.ChangeVisualAppearance)
                    {
                        citem.TextToSay = context.BasePhrases.ChangeClothesAnnouncement();
                        InteractionsStat.AddScheduledInteraction(ActionsEnum.ChangeVisualAppearance);
                    }
                    else if (citem.Category == ActionsEnum.ExpressMentalState)
                    {
                        //choose mental state to share using a distribution (uniform?)
                        //currently only one state is processed
                        string selectedMentalState = "InAGoodMood";

                        if (selectedMentalState == "InAGoodMood")
                        {
                            //Take into account the: ProbVariables.Bot.InAGoodMood;
                            //class Statement where the constructor takes prob variable as or UncertainFact
                            //or just phrase that internally takes into account current values of the prob variable and other normal variables
                            citem.TextToSay = "###place holder for InAGoodMood";
                        }

                        InteractionsStat.AddScheduledInteraction(ActionsEnum.ExpressMentalState);
                    }
                    else
                    {
                        SharedHelper.LogError("Unknown action: " + citem.Category);
                    }
                }

                #region Add interaction item to queue

                if (string.IsNullOrEmpty(citem.TextToSay))
                {
                    SharedHelper.LogError("Text is empty! Action was: " + citem.Category + "|" + citem.SubCategory);
                }
                else
                {
                    Interactions.Enqueue(citem);
                }

                #endregion

                #region debug
                PureFact[] LeftPureFacts = (from item in pfManager.GetAll()
                                            let pf = (PureFact)item
                                                     where (pf.Type == PureFactType.AboutBot || pf.Type != PureFactType.AboutUser) &&
                                                     pf.IsPlanned == false && pf.IsUsed == false
                                                     select pf).ToArray();

                //if (!Flags.DecreaseDistributionOfAskPureFactQuestionAboutUserDone && Interactions.Count > 45 && (LeftPureFacts.Length - PersistentData.PureFactsLoadedOnStartup()) > 0)
                //    KorraBaseHelper.LogError("All pure facts should have been already planned. Left not used pure facts: " + LeftPureFacts.Length);

                #endregion
            }
        }
Exemple #6
0
        private PrimitiveDist <string> GetJokeDistribution()
        {
            var allJokes = from joke in JokesProvider.GetAll()
                           where joke.IsUsed == false && joke.IsPlanned == false
                           select joke;

            //by default it is easily offended
            bool isUserEasilyOffended = (factEasilyOffended == null) || //if fact does not exist
                                        !factEasilyOffended.IsAnswered || //if not answered
                                        (factEasilyOffended.IsAnswered && factEasilyOffended.Value.ToLower() == "yes");    //NOT GOOD !!!!!!

            List <ItemProb <string> > itemProbs = new List <ItemProb <string> >();

            if (romanticJokesFirst && romanticJokesLast)
            {
                SharedHelper.LogError("Error generating Jokes Distribution: both 'romanticJokesFirst' and 'romanticJokesLast' are true");
            }

            if (allJokes.Count() == 0)
            {
                return(null);
            }

            //assign probabilities
            foreach (Joke j in allJokes)
            {
                float prob = 0.5f;

                if (j.ContentType != null)
                {
                    //romantic jokes will have a priority in the beginning
                    if (romanticJokesFirst)
                    {
                        if (j.ContentType.IsMildSexual || j.ContentType.IsRomanticReferrence)
                        {
                            prob = 0.8f;
                        }
                    }

                    //romatic jokes will be dealyed
                    if (romanticJokesLast)
                    {
                        if (j.ContentType.IsMildSexual || j.ContentType.IsRomanticReferrence)
                        {
                            prob = 0.3f;
                        }
                    }

                    //offensive jokes will be delayed in time
                    if (isUserEasilyOffended && j.ContentType.IsMildOffensive) //delay the mildly offensive jokes
                    {
                        prob = 0.2f;
                    }

                    #region disabled
                    if (!Personality.UseMildOffensiveJokes && j.ContentType.IsMildOffensive)
                    {
                        prob = 0f;
                    }

                    if (!Personality.UseMildSexualThemes && j.ContentType.IsMildSexual)
                    {
                        prob = 0f;
                    }

                    if (!Personality.UseRomanticReferences && j.ContentType.IsRomanticReferrence)
                    {
                        prob = 0f;
                    }
                    #endregion
                }

                itemProbs.Add(new ItemProb <string>(j.Name, Prob(prob)));
            }

            var jokestDistF = CategoricalF(itemProbs.ToArray()).Normalize();

            //SharedHelper.Log("Jokes histogram:\r\n" + jokestDistF.Histogram());

            return(jokestDistF.ToSampleDist());
        }
Exemple #7
0
        /// <summary>
        /// Configures when facial expressions are used
        /// </summary>
        /// <param name="item"></param>
        public void SetFacialExpression(CommItem item)
        {
            #region Get Fact Manager
            PureFacts pfManager = (PureFacts)ItemProviders.SingleOrDefault(x => x is PureFacts);
            if (pfManager == null)
            {
                SharedHelper.LogError("No manager in Facts Manager in SetFacialExpression for model " + this.Name);
                return;
            }
            #endregion

            //PureFacts and Jokes will facial expression set at this stage or by Dynamic Function
            //it updates the facial expression, if it is empty

            if (!string.IsNullOrEmpty(item.FacialExpression))
            {
                KorraModelHelper.SetFacialExpressionFlag(item.FacialExpression);
            }
            else //here in most cases we default to smile
            {
                if (item.IsReactionToUser) //default to smile on reaction
                {
                    KorraModelHelper.SetFacialExpressionFlag(FaceExp.SmileAfterTalking);
                }
                else
                //Handle PureFacts AboutBot
                if (item.IsPureFact && !item.IsJokePureFact)
                {
                    PureFact fact = (PureFact)pfManager.GetByName(item.Name);

                    if (fact != null && fact.Type == PureFactType.AboutBot)
                    {
                        KorraModelHelper.SetFacialExpressionFlag(FaceExp.SmileAfterTalking);
                    }
                }
                else
                if (item.Category == ActionsEnum.ChangeVisualAppearance)
                {
                    KorraModelHelper.SetFacialExpressionFlag(FaceExp.SmileAfterTalking);
                }
                else
                if (item.Category == ActionsEnum.ConvinceBuyStatement)
                {
                    KorraModelHelper.SetFacialExpressionFlag(FaceExp.SmileAfterTalking);
                }
                else
                if (item.Category == ActionsEnum.ExpressMentalState)
                {
                    KorraModelHelper.SetFacialExpressionFlag(FaceExp.SmileAfterTalking);
                }
                else
                //Hnadle Jokes (Normal or PureFacts)
                if (item.SubCategory == SuggestionsEnum.TellJoke && !item.IsJokePureFact)
                {
                    if (!item.IsJokePureFact) //Normal joke
                    {
                        Joke joke = JokesProvider.GetJokeByName(item.Name);

                        if (joke != null && !string.IsNullOrEmpty(joke.FaceExpression)) //check for custom facial expression
                        {
                            KorraModelHelper.SetFacialExpressionFlag(joke.FaceExpression);
                        }
                        else
                        {
                            KorraModelHelper.SetFacialExpressionFlag(FaceExp.SmileAfterTalking); //default to smile
                        }
                    }
                    else //PureFact joke that had no facial expression set
                    {
                        KorraModelHelper.SetFacialExpressionFlag(FaceExp.SmileAfterTalking); //default to smile
                    }
                }
                else
                if (item.SubCategory == SuggestionsEnum.ListenToSong ||
                    item.SubCategory == SuggestionsEnum.DoSport ||
                    item.SubCategory == SuggestionsEnum.WatchMovie ||
                    item.SubCategory == SuggestionsEnum.GoOut)
                {
                    KorraModelHelper.SetFacialExpressionFlag(FaceExp.SmileAfterTalking);
                }
            }
        }