private IEnumerable <CharacterReadModel> GetCharacters(int userId)
        {
            User user = _userService.GetUser(Convert.ToInt32(userId));
            IEnumerable <CharacterReadModel> models = _mapper.Map <IEnumerable <CharacterReadModel> >(user.Characters);

            if (user.SelectedCharacter != null)
            {
                CharacterReadModel selectedChar = models.FirstOrDefault(x => x.Id == user.SelectedCharacter.Id);
                selectedChar.IsActive = true;
            }

            return(models);
        }
    //TODO be explicit- dispatch actions like DIALOGUE_INITIATED, dialogue_advanced and have the gae reducer translate these into
    //more specific ui changes such as "message set" and "character se". gets confusing otherwsie.
    public void InitiateStory(string characterName)
    {
        string         playerId = GameState.Instance.PlayerState.id;
        ServerResponse response = CharacterController.InitiateStory(characterName, playerId);

        if (!response.error)
        {
            Debug.Log($"Success: Initiating dialogue");
            CharacterReadModel character = (CharacterReadModel)ModelRepository.Get(response.modelName, response.aggregateIdentifier);
            GameReducer.Reduce(ActionTypes.MESSAGE_SET, character.currentText);
            GameReducer.Reduce(ActionTypes.CHARACTER_SET, character);
        }
        else
        {
            Debug.Log("Failed");
        }
    }
    public void AdvanceStory(string userInput)
    {
        string         characterName = GameState.Instance.CharacterState.currentCharacterName;
        string         playerId      = GameState.Instance.PlayerState.id;
        ServerResponse response      = CharacterController.AdvanceStory(characterName, playerId, userInput);

        if (!response.error)
        {
            Debug.Log($"Success: Advanced dialogue");
            CharacterReadModel character = (CharacterReadModel)ModelRepository.Get(response.modelName, response.aggregateIdentifier);
            GameReducer.Reduce(ActionTypes.MESSAGE_SET, character.currentText);
            if (character.currentStorylineCompleted == true)
            {
                GameReducer.Reduce(ActionTypes.CURRENT_STORYLINE_COMPLETED, "");
            }
        }
        else
        {
            Debug.Log("Failed");
        }
    }
    public override void Reduce(Event evt, ModelTable table)
    {
        Type type = evt.GetType();

        if (type == typeof(CharacterCreated))
        {
            CharacterCreated characterCreated = (CharacterCreated)evt;
            table.InsertModel(characterCreated.name, new CharacterReadModel(characterCreated.name, characterCreated.greeting));
            return;
        }
        if (type == typeof(StoryInitiated))
        {
            StoryInitiated     dialogueInitiated = (StoryInitiated)evt;
            CharacterReadModel character         = (CharacterReadModel)table.GetModel(dialogueInitiated.characterName);
            character.currentText = dialogueInitiated.initialNode.text;
            character.currentStorylineCompleted = false;
            table.UpdateModel(dialogueInitiated.characterName, character);              //not necessary, since we are mutating the reference,
            //but like to be explicit and will soon move to immutable structs for readmodels.
            return;
        }
        if (type == typeof(StoryAdvanced))
        {
            StoryAdvanced      dialogueAdvanced = (StoryAdvanced)evt;
            CharacterReadModel character        = (CharacterReadModel)table.GetModel(dialogueAdvanced.characterName);
            character.currentText = dialogueAdvanced.newNode.text;
            table.UpdateModel(dialogueAdvanced.characterName, character);
            return;
        }
        if (type == typeof(StoryCompleted))
        {
            StoryCompleted     storylineCompleted = (StoryCompleted)evt;
            CharacterReadModel character          = (CharacterReadModel)table.GetModel(storylineCompleted.characterName);
            character.currentText = character.goodbye;
            character.currentStorylineCompleted = true;
            table.UpdateModel(storylineCompleted.characterName, character);
        }
    }