using System.Collections.Concurrent; using Google.Protobuf; using Google.Protobuf.WellKnownTypes; using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; using MetaAssets; namespace GameServer; public class BlockUserAgentAction : EntityActionBase { private ConcurrentDictionary m_block_users = new(); public BlockUserAgentAction(EntityBase owner) : base(owner) { } public override async Task onInit() { await Task.CompletedTask; var result = new Result(); return result; } public override void onClear() { return; } public (Result, BlockUserAttribute?) getBlockUsersAttribute(string blockUserGuid) { var result = new Result(); if (false == m_block_users.TryGetValue(blockUserGuid, out var block_user)) { var err_msg = $"not found blockUserGuid = {blockUserGuid}"; result.setFail(ServerErrorCode.BlockInfoEmpty, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null); } var block_user_attribute = block_user.getEntityAttribute(); return (result, block_user_attribute); } public ConcurrentDictionary getBlockUsers() { return m_block_users; } public Result cancelBlockUser(string blockUserGuid) { var result = new Result(); (result, var attribute) = getBlockUsersAttribute(blockUserGuid); NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!! - {toBasicString()}"); if (result.isFail()) { return result; } attribute.deleteEntityAttribute(); return result; } public Result blockUser(string myGuid, string blockUserGuid, bool isFriend) { var result = new Result(); var owner = getOwner(); BlockUser block_user = new BlockUser(owner); var block_user_attribute = block_user.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(block_user_attribute, () => $"block_user_attribute is null !!! - {toBasicString()}"); block_user_attribute.BlockGuid = blockUserGuid; block_user_attribute.CreateTime = DateTimeHelper.Current; block_user_attribute.IsNew = 1; block_user_attribute.UserGuid = myGuid; block_user_attribute.newEntityAttribute(); m_block_users.TryAdd(blockUserGuid, block_user); return result; } public async Task> getBlockUsersInfoProtoBuf() { return await convertBlockUsersToProtoBlockInfos(); } public bool isBlockUser(string userGuid) { return m_block_users.ContainsKey(userGuid); } private async Task> convertBlockUsersToProtoBlockInfos() { List block_infos = new(); foreach (var block_user in m_block_users) { var block_info = new BlockInfo(); (var result, var block_attibute) = getBlockUserAttribFromAttribute(block_user.Value); if (result.isFail()) { continue; } NullReferenceCheckHelper.throwIfNull(block_attibute, () => $"block_attibute is null !!! - {toBasicString()}"); block_info.Guid = block_attibute.BlockGuid; block_info.CreateTime = Timestamp.FromDateTime(block_attibute.CreateTime); (result, var nickname_attrib) = await NicknameDoc.findNicknameFromGuid(block_attibute.BlockGuid); if (nickname_attrib is null) { block_info.NickName = string.Empty; } else block_info.NickName = nickname_attrib.Nickname; block_info.IsNew = block_attibute.IsNew; block_infos.Add(block_info); } return block_infos; } private (Result, BlockUserAttribute?) getBlockUserAttribFromAttribute(BlockUser blockUser) { var attribute = blockUser.getEntityAttribute(); var result = new Result(); if (attribute is null) { var err_msg = $"Fail to get FriendAttribute"; Log.getLogger().error(err_msg); result.setFail(ServerErrorCode.EntityAttributeNotFound, err_msg); return (result, null); } return (result, attribute); } public async Task loadBlockUsers() { var owner = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var server_logic = GameServerApp.getServerLogic(); var batch = new QueryBatchEx(owner, LogActionType.None, server_logic.getDynamoDbClient()); { batch.addQuery(new DBQBlockUsersReadAll(owner.getUserGuid())); } var result = await QueryHelper.sendQueryAndBusinessLog(batch); return result; } public async Task setBlockUsersFromDoc(BlockUserDoc doc) { var result = new Result(); var owner = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!! - {toBasicString()}"); var block_user = new BlockUser(owner); var attribute = block_user.getEntityAttribute(); if (attribute is null) { var err_msg = $"Fail to get BlockUserAttribute"; result.setFail(ServerErrorCode.EntityAttributeNotFound, err_msg); return result; } var doc_attrib = doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(doc_attrib, () => $"doc_attrib is null !!! - {toBasicString()}"); attribute.BlockGuid = doc_attrib.BlockGuid; attribute.IsNew = doc_attrib.IsNew; attribute.UserGuid = owner.getUserGuid(); attribute.syncOriginDocBaseWithNewDoc(doc); (result, var nickname_attrib) = await NicknameDoc.findNicknameFromGuid(doc_attrib.BlockGuid); if (result.isFail() || nickname_attrib is null) { //닉네임 정보 없는건 로그만 남기고 닉네임은 빈값으로 넘긴다. Log.getLogger().error($"Nickname is not exist blockGuid = {doc_attrib.BlockGuid}"); attribute.Nickname = string.Empty; } else attribute.Nickname = nickname_attrib.Nickname; m_block_users.AddOrUpdate(doc_attrib.BlockGuid, block_user, (key, oldValue) => block_user); return result; } public async Task<(Result reuslt, bool isBlock)> amIBockedFromOthers(string otherUserGuid) { var owner = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var my_guid = owner.getUserGuid(); (var result, var block_user_docs) = await BlockUserDoc.findBlockUserFromGuid(otherUserGuid, my_guid); if (result.isFail()) return (result, false); foreach (var doc in block_user_docs) { var attrib = doc.getAttrib(); if (attrib is null) continue; if (attrib.BlockGuid == my_guid) { return (result, true); } } return (result, false); } public Result blockUserConditionCheck(string blockUserGuid) { var result = new Result(); string err_msg; // 1. 이미 Block 된건지 체크 if (true == m_block_users.ContainsKey(blockUserGuid)) { err_msg = $"{blockUserGuid} was already blocked , {getOwner().toBasicString()}"; result.setFail(ServerErrorCode.BlockUserAlreadyBlock, err_msg); Log.getLogger().error(result.toBasicString()); return result; } // 2. Block User List Count 체크 if (m_block_users.Count >= MetaHelper.GameConfigMeta.MaxBlockUserNum) { err_msg = $"over max block user count - current block count[{m_block_users.Count}], {getOwner().toBasicString()}"; result.setFail(ServerErrorCode.BlockUserAlreadyBlock, err_msg); Log.getLogger().error(result.toBasicString()); } return result; } public Result removeBlockUser(string blockUserGuid) { var result = new Result(); if(false == m_block_users.TryRemove(blockUserGuid, out var removed_uesr)) { var err_msg = $"m_block_users tryRemove false - blockUserGuid[{blockUserGuid}], {getOwner().toBasicString()}"; result.setFail(ServerErrorCode.BlockUserAlreadyBlock, err_msg); Log.getLogger().error(result.toBasicString()); } return result; } }