Files
caliverse_server/GameServer/Contents/UserBlock/Action/BlockUserAgentAction.cs
2025-05-01 07:20:41 +09:00

273 lines
8.7 KiB
C#

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<string, BlockUser> m_block_users = new();
public BlockUserAgentAction(EntityBase owner) : base(owner)
{
}
public override async Task<Result> 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<BlockUserAttribute>();
return (result, block_user_attribute);
}
public ConcurrentDictionary<string, BlockUser> 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<BlockUserAttribute>();
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<List<BlockInfo>> getBlockUsersInfoProtoBuf()
{
return await convertBlockUsersToProtoBlockInfos();
}
public bool isBlockUser(string userGuid)
{
return m_block_users.ContainsKey(userGuid);
}
private async Task<List<BlockInfo>> convertBlockUsersToProtoBlockInfos()
{
List<BlockInfo> 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<BlockUserAttribute>();
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<Result> loadBlockUsers()
{
var owner = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var server_logic = GameServerApp.getServerLogic();
var batch = new QueryBatchEx<QueryRunnerWithDocument>(owner, LogActionType.None, server_logic.getDynamoDbClient());
{
batch.addQuery(new DBQBlockUsersReadAll(owner.getUserGuid()));
}
var result = await QueryHelper.sendQueryAndBusinessLog(batch);
return result;
}
public async Task<Result> 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<BlockUserAttribute>();
if (attribute is null)
{
var err_msg = $"Fail to get BlockUserAttribute";
result.setFail(ServerErrorCode.EntityAttributeNotFound, err_msg);
return result;
}
var doc_attrib = doc.getAttrib<BlockUserAttrib>();
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<BlockUserAttribute>(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<BlockUserAttrib>();
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;
}
}