초기커밋

This commit is contained in:
2025-05-01 07:20:41 +09:00
commit 98bb2e3c5c
2747 changed files with 646947 additions and 0 deletions

View File

@@ -0,0 +1,45 @@
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
namespace GameServer;
public class BlockUserAction : EntityActionBase
{
public BlockUserAction(EntityBase owner)
: base(owner)
{
}
public override async Task<Result> onInit()
{
await Task.CompletedTask;
var result = new Result();
return result;
}
public override void onClear()
{
return;
}
}

View File

@@ -0,0 +1,272 @@
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;
}
}

View File

@@ -0,0 +1,38 @@
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 UserBlockAction : EntityActionBase
{
private ConcurrentDictionary<string, BlockUser> m_block_users = new();
public UserBlockAction(EntityBase owner)
: base(owner)
{
}
public override async Task<Result> onInit()
{
await Task.CompletedTask;
var result = new Result();
return result;
}
public override void onClear()
{
return;
}
}

View File

@@ -0,0 +1,45 @@
using ServerCommon;
using ServerCore; using ServerBase;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GameServer;
public class BlockUser : EntityBase
{
public BlockUser(EntityBase parent)
: base(EntityType.BlockUser, parent)
{
addEntityAttributes();
}
public override async Task<Result> onInit()
{
addEntityAttributes();
return await base.onInit();
}
private void addEntityAttributes()
{
addEntityAttribute(new BlockUserAttribute(this));
}
public override string toBasicString()
{
var root_parent = getRootParent();
NullReferenceCheckHelper.throwIfNull(root_parent, () => $"getRootParent() is null !!! - {toBasicString()}");
return $"{this.getTypeName()} - {root_parent.toBasicString()}";
}
public override string toSummaryString()
{
var root_parent = getRootParent();
NullReferenceCheckHelper.throwIfNull(root_parent, () => $"getRootParent() is null !!! - {toBasicString()}");
return $"{this.getTypeName()} - {root_parent.toSummaryString()}";
}
}

View File

@@ -0,0 +1,147 @@
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
namespace GameServer;
public class DBQBlockUser : QueryExecutorBase
{
private string m_my_combination_key_for_pk = string.Empty;
private string m_my_combination_key_for_sk = string.Empty;
BlockUser? m_block_user_nullable = null;
private string m_pk = string.Empty;
private string m_sk = string.Empty;
public DBQBlockUser(string myGuid, string blockGuid)
: base(typeof(DBQBlockUser).Name)
{
m_my_combination_key_for_pk = myGuid;
m_my_combination_key_for_sk = blockGuid;
}
//===================================================================================================
// DB 쿼리 직전에 준비해야 할 로직들을 작성한다.
//===================================================================================================
public override async Task<Result> onPrepareQuery()
{
var result = new Result();
var server_logic = GameServerApp.getServerLogic();
var db_client = server_logic.getDynamoDbClient();
var owner = getOwner();
NullReferenceCheckHelper.throwIfNull(owner, () => "owner is null !!!");
m_block_user_nullable = new BlockUser(owner);
var user_guid = m_my_combination_key_for_pk;
var block_user_guid = m_my_combination_key_for_sk;
(result, var make_primary_key) = await DynamoDBDocBaseHelper.makePrimaryKey<BlockUserDoc>(user_guid, block_user_guid);
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(make_primary_key, () => $"make_primary_key is null !!! : PK:{user_guid}, SK:{block_user_guid} - {owner.toBasicString()}");
var attribute = m_block_user_nullable.getEntityAttribute<BlockUserAttribute>();
NullReferenceCheckHelper.throwIfNull(attribute, () => "attribute is null !!!");
attribute.BlockGuid = m_my_combination_key_for_sk;
attribute.IsNew = 1;
attribute.CreateTime = DateTimeHelper.Current;
m_pk = make_primary_key.PK;
m_sk = make_primary_key.SK;
return result;
}
//===================================================================================================
// onPrepareQuery()를 성공할 경우 호출된다.
//===================================================================================================
public override async Task<Result> onQuery()
{
NullReferenceCheckHelper.throwIfNull(m_block_user_nullable, () => "m_block_user_nullable is null !!!");
var result = new Result();
var query_batch = getQueryBatch();
NullReferenceCheckHelper.throwIfNull(query_batch, () => "query_batch is null !!!");
var db_connector = query_batch.getDynamoDbConnector();
var block_user_attribute = m_block_user_nullable.getEntityAttribute<BlockUserAttribute>();
NullReferenceCheckHelper.throwIfNull(block_user_attribute, () => "block_user_attribute is null !!!");
//block_user_attribute.newEntityAttribute();
var block_user_doc = new BlockUserDoc(m_my_combination_key_for_pk, block_user_attribute.BlockGuid);
block_user_doc.setQueryType(QueryType.Insert);
var block_user_attib = block_user_doc.getAttrib<BlockUserAttrib>();
NullReferenceCheckHelper.throwIfNull(block_user_attib, () => "block_user_attib is null !!!");
block_user_attib.BlockGuid = block_user_attribute.BlockGuid;
block_user_attib.IsNew = block_user_attribute.IsNew;
(result, Amazon.DynamoDBv2.DocumentModel.Document? block_document) = await block_user_doc.onCopyToDocument(); ;
if (result.isFail())
{
var err_msg = $"Failed to onCopyToDocument() !!!, m_pk:{m_pk}, m_sk:{m_sk}, {result.toBasicString()} - {toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
var table = db_connector.getTableByName(block_user_doc.TableName);
var query_context = block_document.createDocumentQueryContext(table.TableName, block_user_doc.getQueryType());
(result, _) = await table.simpleTransactWriteWithDocument(new List<DynamoDbDocumentQueryContext>() { query_context }, 2, query_batch.getTransId());
if (result.isFail())
{
var err_msg = $"Failed to simpleTransactWriteWithDocument !!!, m_pk:{m_pk}, m_sk:{m_sk}, {result.toBasicString()} - {toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
return result;
}
//===================================================================================================
// DB 쿼리를 성공하고, doFnCommit()가 QueryResultType.NotCalledQueryFunc를 반환할 경우 호출된다.
//===================================================================================================
public override Task onQueryResponseCommit()
{
NullReferenceCheckHelper.throwIfNull(m_block_user_nullable, () => "m_block_user_nullable is null !!!");
//여기서 메모리 업데이트
var owner = getOwner();
NullReferenceCheckHelper.throwIfNull(owner, () => "owner is null !!!");
var block_user_agent_action = owner.getEntityAction<BlockUserAgentAction>();
NullReferenceCheckHelper.throwIfNull(block_user_agent_action, () => "block_user_agent_action is null !!!");
var block_users = block_user_agent_action.getBlockUsers();
block_users.AddOrUpdate(m_my_combination_key_for_sk, m_block_user_nullable, (key, oldValue) => m_block_user_nullable);
return Task.CompletedTask;
}
//===================================================================================================
// DB 쿼리를 실패하고, doFnRollback()가 QueryResultType.NotCalledQueryFunc를 반환할 경우 호출된다.
//===================================================================================================
public override Task onQueryResponseRollback(Result errorResult)
{
return Task.CompletedTask;
}
private new Player? getOwner() => getQueryBatch()?.getLogActor() as Player;
}

View File

@@ -0,0 +1,113 @@
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
namespace GameServer;
public class DBQBlockUsersReadAll : QueryExecutorBase
{
//prefix 문자열 뒤에 붙는 문자열을 의미
private string m_combination_key_for_pk = string.Empty;
private string m_pk = string.Empty;
private readonly List<BlockUserDoc> m_to_read_blocks_docs = new();
public DBQBlockUsersReadAll(string combinationKeyForPK /*onwer_guid*/)
: base(typeof(DBQBlockUsersReadAll).Name)
{
m_combination_key_for_pk = combinationKeyForPK;
}
//===================================================================================================
// DB 쿼리 직전에 준비해야 할 로직들을 작성한다.
//===================================================================================================
public override Task<Result> onPrepareQuery()
{
var result = new Result();
var owner = getOwner();
NullReferenceCheckHelper.throwIfNull(owner, () => "owner is null !!!");
var doc = new BlockUserDoc();
doc.setCombinationKeyForPK(m_combination_key_for_pk);
var error_code = doc.onApplyPKSK();
if (error_code.isFail())
{
var err_msg = $"Failed to onApplyPKSK() !!! : {error_code.toBasicString()} - {owner.toBasicString()}";
result.setFail(error_code, err_msg);
Log.getLogger().error(result.toBasicString());
return Task.FromResult(result);
}
m_pk = doc.getPK();
return Task.FromResult(result);
}
//===================================================================================================
// onPrepareQuery()를 성공할 경우 호출된다.
//===================================================================================================
public override async Task<Result> onQuery()
{
var result = new Result();
var err_msg = string.Empty;
var owner = getOwner();
NullReferenceCheckHelper.throwIfNull(owner, () => "owner is null !!!");
var query_batch = getQueryBatch();
NullReferenceCheckHelper.throwIfNull(query_batch, () => "query_batch is null !!!");
var db_connector = query_batch.getDynamoDbConnector();
var query_config = db_connector.makeQueryConfigForReadByPKOnly(m_pk);
(result, var read_docs) = await db_connector.simpleQueryDocTypesWithQueryOperationConfig<BlockUserDoc>(query_config, eventTid: query_batch.getTransId());
if (result.isFail())
{
return await Task.FromResult(result);
}
m_to_read_blocks_docs.AddRange(read_docs);
var user_block_action = owner.getEntityAction<BlockUserAgentAction>();
NullReferenceCheckHelper.throwIfNull(user_block_action, () => "user_block_action is null !!!");
foreach (var read_doc in read_docs)
{
var set_result = await user_block_action.setBlockUsersFromDoc(read_doc);
if (set_result.isFail())
{
Log.getLogger().error(result.toBasicString());
continue;
}
}
return result;
}
//===================================================================================================
// DB 쿼리를 성공하고, doFnCommit()가 QueryResultType.NotCalledQueryFunc를 반환할 경우 호출된다.
//===================================================================================================
public override Task onQueryResponseCommit()
{
return Task.CompletedTask;
}
//===================================================================================================
// DB 쿼리를 실패하고, doFnRollback()가 QueryResultType.NotCalledQueryFunc를 반환할 경우 호출된다.
//===================================================================================================
public override Task onQueryResponseRollback(Result errorResult)
{
return Task.CompletedTask;
}
private new Player? getOwner() => getQueryBatch()?.getLogActor() as Player;
}

View File

@@ -0,0 +1,140 @@
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
namespace GameServer;
public class DBQCancelBlockUser : QueryExecutorBase
{
private string m_my_combination_key_for_pk = string.Empty;
private string m_my_combination_key_for_sk = string.Empty;
private string m_pk = string.Empty;
private string m_sk = string.Empty;
BlockUser? m_block_user_nullable = null;
public DBQCancelBlockUser(string myGuid, string blockGuid)
: base(typeof(DBQCancelBlockUser).Name)
{
m_my_combination_key_for_pk = myGuid;
m_my_combination_key_for_sk = blockGuid;
}
//===================================================================================================
// DB 쿼리 직전에 준비해야 할 로직들을 작성한다.
//===================================================================================================
public override async Task<Result> onPrepareQuery()
{
var result = new Result();
var server_logic = GameServerApp.getServerLogic();
var db_client = server_logic.getDynamoDbClient();
var owner = getOwner();
NullReferenceCheckHelper.throwIfNull(owner, () => "owner is null !!!");
m_block_user_nullable = new BlockUser(owner);
var user_guid = m_my_combination_key_for_pk;
var block_user_guid = m_my_combination_key_for_sk;
(result, var make_primary_key) = await DynamoDBDocBaseHelper.makePrimaryKey<BlockUserDoc>(user_guid, block_user_guid);
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(make_primary_key, () => $"make_primary_key is null !!! : PK:{user_guid}, SK:{block_user_guid} - {owner.toBasicString()}");
var block_user_attribute = m_block_user_nullable.getEntityAttribute<BlockUserAttribute>();
NullReferenceCheckHelper.throwIfNull(block_user_attribute, () => "block_user_attribute is null !!!");
block_user_attribute.UserGuid = user_guid;
block_user_attribute.BlockGuid = block_user_guid;
m_pk = make_primary_key.PK;
m_sk = make_primary_key.SK;
return result;
}
//===================================================================================================
// onPrepareQuery()를 성공할 경우 호출된다.
//===================================================================================================
public override async Task<Result> onQuery()
{
NullReferenceCheckHelper.throwIfNull(m_block_user_nullable, () => "m_block_user_nullable is null !!!");
var result = new Result();
var query_batch = getQueryBatch();
NullReferenceCheckHelper.throwIfNull(query_batch, () => "query_batch is null !!!");
var db_connector = query_batch.getDynamoDbConnector();
var block_user_attribute = m_block_user_nullable.getEntityAttribute<BlockUserAttribute>();
NullReferenceCheckHelper.throwIfNull(block_user_attribute, () => "block_user_attribute is null !!!");
var block_user_doc = new BlockUserDoc(m_my_combination_key_for_pk, block_user_attribute.BlockGuid);
block_user_doc.setQueryType(QueryType.Delete);
(result, Amazon.DynamoDBv2.DocumentModel.Document? block_document) = await block_user_doc.onCopyToDocument(); ;
if (result.isFail())
{
var err_msg = $"Failed to onCopyToDocument() !!!, m_pk:{m_pk}, m_sk:{m_sk}, {result.toBasicString()} - {toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
var table = db_connector.getTableByDoc<BlockUserDoc>();
var query_context = block_document.createDocumentQueryContext(table.TableName, block_user_doc.getQueryType());
(result, _) = await table.simpleTransactWriteWithDocument(new List<DynamoDbDocumentQueryContext>() { query_context }, 2, query_batch.getTransId());
if (result.isFail())
{
var err_msg = $"Failed to simpleTransactWriteWithDocument !!!, m_pk:{m_pk}, m_sk:{m_sk}, {result.toBasicString()} - {toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
return result;
}
//===================================================================================================
// DB 쿼리를 성공하고, doFnCommit()가 QueryResultType.NotCalledQueryFunc를 반환할 경우 호출된다.
//===================================================================================================
public override Task onQueryResponseCommit()
{
//여기서 메모리 업데이트
var owner = getOwner();
NullReferenceCheckHelper.throwIfNull(owner, () => "owner is null !!!");
var block_user_agent_action = owner.getEntityAction<BlockUserAgentAction>();
NullReferenceCheckHelper.throwIfNull(block_user_agent_action, () => "block_user_agent_action is null !!!");
var block_users = block_user_agent_action.getBlockUsers();
block_users.TryRemove(m_my_combination_key_for_sk, out var _);
return Task.CompletedTask;
}
//===================================================================================================
// DB 쿼리를 실패하고, doFnRollback()가 QueryResultType.NotCalledQueryFunc를 반환할 경우 호출된다.
//===================================================================================================
public override Task onQueryResponseRollback(Result errorResult)
{
return Task.CompletedTask;
}
private new Player? getOwner() => getQueryBatch()?.getLogActor() as Player;
}

View File

@@ -0,0 +1,62 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Google.Protobuf.WellKnownTypes;
using ServerCore; using ServerBase;
using ServerCommon;
namespace GameServer;
public static class UserBlockNotifyHelper
{
public static async Task send_GS2C_NTF_BLOCK_USERS(this Player player)
{
var server_logic = GameServerApp.getServerLogic();
var ntf_packet = new ClientToGame();
ntf_packet.Message = new();
ntf_packet.Message.BlockListNoti = new();
var block_agent_action = player.getEntityAction<BlockUserAgentAction>();
var block_users = block_agent_action.getBlockUsers();
foreach (var block_user in block_users.Values)
{
BlockInfo info = new();
var block_user_attribute = block_user.getEntityAttribute<BlockUserAttribute>();
NullReferenceCheckHelper.throwIfNull(block_user_attribute, () => $"block_user_attribute is null !!! - {player.toBasicString()}");
info.Guid = block_user_attribute.BlockGuid;
info.CreateTime = Timestamp.FromDateTime(block_user_attribute.CreateTime);
info.IsNew = block_user_attribute.IsNew;
(var result, var nickname_attrib) = await NicknameDoc.findNicknameFromGuid(block_user_attribute.BlockGuid);
if (result.isFail())
{
Log.getLogger().error($"{block_user_attribute.BlockGuid} user not exitst Nickname");
info.NickName = string.Empty;
}
else
{
NullReferenceCheckHelper.throwIfNull(nickname_attrib, () => $"nickname_attrib is null !!! - {player.toBasicString()}");
info.NickName = nickname_attrib.Nickname;
}
ntf_packet.Message.BlockListNoti.BlockList.Add(info);
}
server_logic.onSendPacket(player, ntf_packet);
}
}

View File

@@ -0,0 +1,36 @@
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
namespace GameServer;
public class UserBlockBusinessLog : ILogInvokerEx
{
UserBlockLogInfo m_info;
public UserBlockBusinessLog(string blockerGuid, string blockedGuid, LogSubCategoryType type)
: base(LogDomainType.UserBlock)
{
m_info = new UserBlockLogInfo(this, blockerGuid, blockedGuid, type);
}
public override bool hasLog()
{
return true;
}
protected override void fillup(ref BusinessLog.LogBody body)
{
body.append(m_info);
}
}

View File

@@ -0,0 +1,152 @@
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
namespace GameServer.PacketHandler;
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.BlockUserReq), typeof(BlockUserPacketHandler), typeof(GameLoginListener))]
public class BlockUserPacketHandler : PacketRecvHandler
{
public override async Task<Result> onProcessPacket(ISession session, IMessage recvMessage)
{
var owner = session as Player;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var recv_msg = recvMessage as ClientToGame;
NullReferenceCheckHelper.throwIfNull(recv_msg, () => $"recv_msg is null !!!");
var request = recv_msg.Request.BlockUserReq;
var block_nickname = request.TargetNickName;
var my_guid = owner.getUserGuid();
(var result, var nickname_attrib) = await NicknameHelper.findNickname(block_nickname);
if (result.isFail())
{
result.ErrorCode = ServerErrorCode.NotExistCharacter;
send_GS2C_ACK_BLOCK_USER(owner, result);
return result;
}
NullReferenceCheckHelper.throwIfNull(nickname_attrib, () => $"server_logic is null !!!");
var block_user_guid = nickname_attrib.UserGuid;
var user_block_agent_action = owner.getEntityAction<BlockUserAgentAction>();
NullReferenceCheckHelper.throwIfNull(user_block_agent_action, () => $"user_block_agent_action is null !!!");
var server_logic = GameServerApp.getServerLogic();
result = user_block_agent_action.blockUserConditionCheck(block_user_guid);
if (result.isFail())
{
send_GS2C_ACK_BLOCK_USER(owner, result);
return result;
}
var friend_agent_action = owner.getEntityAction<FriendAgentAction>();
//친구인경우 나중을 위해 우선 check만 해놓는다.
var is_friend = friend_agent_action.isFriend(block_user_guid);
var friend_request_cache = new FriendReqCacheRequest(owner, my_guid, block_user_guid, server_logic.getRedisConnector());
var send_friend_action = owner.getEntityAction<SendFriendRequestAction>();
//요청 보낸 정보가 있는경우
var sended_reqs = await friend_request_cache.getSendedFriendRequests();
(var is_sended, var _) = send_friend_action.isSendedRequest(sended_reqs, block_user_guid);
//이미 요청 받았다
var received_reqs = await friend_request_cache.getReceivedFriendRequests();
(var is_received, var _) = send_friend_action.isReceivedRequest(received_reqs, block_user_guid);
result = await owner.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "BlockUser", delegateBlockUser);
if (result.isFail())
{
send_GS2C_ACK_BLOCK_USER(owner, result);
return result;
}
send_GS2C_ACK_BLOCK_USER(owner, result, block_user_guid, block_nickname);
if (is_friend)
{
await DeleteFriendPacketHandler.send_GS2CS_NTF_DELETE_FRIEND(owner, my_guid, block_user_guid);
await QuestManager.It.QuestCheck(owner, new QuestFriend(EQuestEventTargetType.FRIEND, EQuestEventNameType.DELETED));
}
return result;
async Task<Result> delegateBlockUser() => await blockUser(owner, my_guid, block_user_guid, is_friend, is_sended, is_received, friend_request_cache);
}
private async Task<Result> blockUser(Player owner, string userGuid, string blockUserGuid, bool isFriend, bool isSended, bool isReceived, FriendReqCacheRequest cache)
{
var user_block_agent_action = owner.getEntityAction<BlockUserAgentAction>();
var server_logic = GameServerApp.getServerLogic();
var result = user_block_agent_action.blockUser(userGuid, blockUserGuid, isFriend);
var batch = new QueryBatchEx<QueryRunnerWithDocument>(owner, LogActionType.UserBlock, server_logic.getDynamoDbClient());
{
batch.addQuery(new DBQBlockUser(userGuid, blockUserGuid));
if(isFriend) batch.addQuery(new DBQDeleteFriend(userGuid, blockUserGuid));
}
var log_invoker = new UserBlockBusinessLog(userGuid, blockUserGuid, LogSubCategoryType.None);
batch.appendBusinessLog(log_invoker);
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (isSended)
{
await cache.deleteCache(userGuid, blockUserGuid);
}
if (isReceived)
{
await cache.deleteCache(blockUserGuid, userGuid);
}
return result;
}
private static bool send_GS2C_ACK_BLOCK_USER(Player owner, Result result)
{
var ack_packet = new ClientToGame();
ack_packet.Response = new ClientToGameRes();
ack_packet.Response.ErrorCode = result.ErrorCode;
ack_packet.Response.BlockUserRes = new();
if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) return false;
return true;
}
private static bool send_GS2C_ACK_BLOCK_USER(Player owner, Result result, string blockGuid, string nickname)
{
var ack_packet = new ClientToGame();
ack_packet.Response = new ClientToGameRes();
ack_packet.Response.ErrorCode = result.ErrorCode;
ack_packet.Response.BlockUserRes = new();
ack_packet.Response.BlockUserRes.Guid = blockGuid;
ack_packet.Response.BlockUserRes.NickName = nickname;
if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) return false;
return true;
}
}

View File

@@ -0,0 +1,108 @@
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
namespace GameServer.PacketHandler;
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.CancelBlockReq), typeof(CancelBlockPacketHandler), typeof(GameLoginListener))]
public class CancelBlockPacketHandler : PacketRecvHandler
{
public override async Task<Result> onProcessPacket(ISession session, IMessage recvMessage)
{
var owner = session as Player;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var recv_msg = recvMessage as ClientToGame;
NullReferenceCheckHelper.throwIfNull(recv_msg, () => $"recv_msg is null !!!");
var request = recv_msg.Request.CancelBlockReq;
var block_user_guid = request.Guid;
var user_block_action = owner.getEntityAction<BlockUserAgentAction>();
var server_logic = GameServerApp.getServerLogic();
var user_guid = owner.getUserGuid();
var result = await owner.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "CancelBlockUser", delegateCancelBlockUser);
if (result.isFail())
{
send_GS2C_ACK_CANCEL_BLOCK_USER(owner, result);
return result;
}
await send_GS2C_ACK_CANCEL_BLOCK_USER(owner, result, block_user_guid);
return result;
async Task<Result> delegateCancelBlockUser() => await cancelBlockUser(owner, user_guid, block_user_guid);
}
private async Task<Result> cancelBlockUser(Player owner, string userGuid, string blockUserGuid)
{
var user_block_action = owner.getEntityAction<BlockUserAgentAction>();
var server_logic = GameServerApp.getServerLogic();
var result = user_block_action.cancelBlockUser(blockUserGuid);
if (result.isFail())
{
Log.getLogger().error($"cancelBlockUser error userGuid : {userGuid}");
return result;
}
var batch = new QueryBatchEx<QueryRunnerWithDocument>(owner, LogActionType.UserBlockCancel, server_logic.getDynamoDbClient());
{
batch.addQuery(new DBQCancelBlockUser(userGuid, blockUserGuid));
//batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
}
var log_invoker = new UserBlockBusinessLog(userGuid, blockUserGuid, LogSubCategoryType.None);
batch.appendBusinessLog(log_invoker);
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail()) return result;
user_block_action.removeBlockUser(blockUserGuid);
return result;
}
private static async Task<bool> send_GS2C_ACK_CANCEL_BLOCK_USER(Player owner, Result result, string blockGuid)
{
var ack_packet = new ClientToGame();
ack_packet.Response = new ClientToGameRes();
ack_packet.Response.ErrorCode = result.ErrorCode;
ack_packet.Response.CancelBlockRes = new();
ack_packet.Response.CancelBlockRes.Guid = blockGuid;
(result, var nickname_attrib) = await NicknameDoc.findNicknameFromGuid(blockGuid);
NullReferenceCheckHelper.throwIfNull(nickname_attrib, () => $"nickname_attrib is null !!!");
if (result.isFail()) ack_packet.Response.CancelBlockRes.NickName = string.Empty;
else ack_packet.Response.CancelBlockRes.NickName = nickname_attrib.Nickname;
if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) return false;
return true;
}
private static bool send_GS2C_ACK_CANCEL_BLOCK_USER(Player owner, Result result)
{
var ack_packet = new ClientToGame();
ack_packet.Response = new ClientToGameRes();
ack_packet.Response.ErrorCode = result.ErrorCode;
ack_packet.Response.CancelBlockRes = new();
if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) return false;
return true;
}
}

View File

@@ -0,0 +1,62 @@
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
namespace GameServer.PacketHandler;
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.GetBlockListReq), typeof(GetBlockUsersPacketHandler), typeof(GameLoginListener))]
public class GetBlockUsersPacketHandler : PacketRecvHandler
{
public override async Task<Result> onProcessPacket(ISession session, IMessage recvMessage)
{
var owner = session as Player;
NullReferenceCheckHelper.throwIfNull(owner, () => "player is null !!!");
var my_guid = owner.getUserGuid();
var recv_msg = recvMessage as ClientToGame;
ArgumentNullReferenceCheckHelper.throwIfNull(recv_msg, () => $"recvMessage is null !!! - player:{owner.toBasicString()}");
var request = recv_msg.Request.GetBlockListReq;
var user_block_action = owner.getEntityAction<BlockUserAgentAction>();
var result = await user_block_action.loadBlockUsers();
var block_users = await user_block_action.getBlockUsersInfoProtoBuf();
send_GS2C_ACK_GET_BLOCK_USERS(owner, block_users, result);
return result;
}
public static Result send_GS2C_ACK_GET_BLOCK_USERS(Player owner, List<BlockInfo> blockInfos, Result result)
{
var ack_packet = new ClientToGame();
ack_packet.Response = new ClientToGameRes();
ack_packet.Response.ErrorCode = result.ErrorCode;
ack_packet.Response.GetBlockListRes = new ();
ack_packet.Response.GetBlockListRes.BlockList.AddRange(blockInfos);
if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet))
{
string err_msg = $"send_GS2C_ACK_GET_BLOCK_USERS Fail !!! : owner:{owner.toBasicString()}";
result.setFail(ServerErrorCode.ProudNetException, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
return result;
}
}