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);
                }
            }
        }
        public async Task <bool> TryRemoveCharacterFromConstructedTeam(int teamId, string characterId)
        {
            using (await _constructedTeamLock.WaitAsync($"{teamId}^{characterId}"))
            {
                if (await TryRemoveCharacterFromConstructedTeamDb(teamId, characterId))
                {
                    var changeMessage = new ConstructedTeamMemberChangeMessage(teamId, characterId, ConstructedTeamMemberChangeType.Remove);
                    _messageService.BroadcastConstructedTeamMemberChangeMessage(changeMessage);

                    return(true);
                }
                else
                {
                    return(false);
                }
            }
        }
        public async Task <bool> TryClearMemberAlias(int teamId, string characterId, string oldAlias)
        {
            if (string.IsNullOrWhiteSpace(oldAlias))
            {
                return(false);
            }

            using (await _constructedTeamLock.WaitAsync($"{teamId}^{characterId}"))
            {
                if (await TryUpdateMemberAliasInDb(teamId, characterId, null))
                {
                    var changeMessage = new ConstructedTeamMemberChangeMessage(teamId, characterId, ConstructedTeamMemberChangeType.UpdateAlias, oldAlias, null);
                    _messageService.BroadcastConstructedTeamMemberChangeMessage(changeMessage);

                    return(true);
                }
                else
                {
                    return(false);
                }
            }
        }
        public void BroadcastConstructedTeamMemberChangeMessage(ConstructedTeamMemberChangeMessage message)
        {
            OnRaiseConstructedTeamMemberChangeEvent(new ScrimMessageEventArgs <ConstructedTeamMemberChangeMessage>(message));

            TrySaveToLogFile(message.Info);
        }