private async Task <Character> TryAddCharacterNameToConstructedTeam(int teamId, string characterName, string customAlias)
        {
            var character = await _characterService.GetCharacterByNameAsync(characterName);

            if (character == null)
            {
                return(null);
            }

            using (await _constructedTeamLock.WaitAsync($"{teamId}^{character.Id}"))
            {
                if (await IsCharacterIdOnTeam(teamId, character.Id))
                {
                    return(null);
                }

                string playerAlias;
                if (string.IsNullOrWhiteSpace(customAlias))
                {
                    playerAlias = Player.GetTrimmedPlayerName(character.Name, character.WorldId);

                    if (string.IsNullOrWhiteSpace(playerAlias))
                    {
                        playerAlias = characterName;
                    }
                }
                else
                {
                    playerAlias = customAlias;
                }

                if (await TryAddCharacterToConstructedTeamDb(teamId, character.Id, character.FactionId, playerAlias))
                {
                    var member = new ConstructedTeamPlayerMembership
                    {
                        ConstructedTeamId = teamId,
                        CharacterId       = character.Id,
                        FactionId         = character.FactionId,
                        Alias             = playerAlias
                    };

                    var memberDetails = ConvertToMemberDetailsModel(character, member);

                    var changeMessage = new ConstructedTeamMemberChangeMessage(teamId, character, memberDetails, ConstructedTeamMemberChangeType.Add);
                    _messageService.BroadcastConstructedTeamMemberChangeMessage(changeMessage);

                    return(character);
                }
                else
                {
                    return(null);
                }
            }
        }
        private async Task <bool> TryAddCharacterToConstructedTeamDb(int teamId, string characterId, int factionId, string alias)
        {
            using var factory = _dbContextHelper.GetFactory();
            var dbContext = factory.GetDbContext();

            // Don't allow NSO characters onto teams
            if (factionId > 3 || factionId <= 0)
            {
                return(false);
            }

            var newEntity = new ConstructedTeamPlayerMembership
            {
                ConstructedTeamId = teamId,
                CharacterId       = characterId,
                FactionId         = factionId,
                Alias             = alias
            };

            try
            {
                var storeEntity = await dbContext.ConstructedTeamPlayerMemberships
                                  .Where(m => m.CharacterId == characterId && m.ConstructedTeamId == teamId)
                                  .FirstOrDefaultAsync();

                if (storeEntity != null)
                {
                    return(false);
                }

                dbContext.ConstructedTeamPlayerMemberships.Add(newEntity);

                await dbContext.SaveChangesAsync();

                return(true);
            }
            catch (Exception ex)
            {
                _logger.LogError($"Error adding character ID {characterId} to team ID {teamId} in database: {ex}");

                return(false);
            }
        }
 private ConstructedTeamMemberDetails ConvertToMemberDetailsModel(Character character, ConstructedTeamPlayerMembership membership)
 {
     return(new ConstructedTeamMemberDetails
     {
         CharacterId = membership.CharacterId,
         ConstructedTeamId = membership.ConstructedTeamId,
         FactionId = membership.FactionId,
         NameFull = character.Name,
         NameAlias = membership.Alias,
         PrestigeLevel = character.PrestigeLevel,
         WorldId = character.WorldId
     });
 }