초기커밋
This commit is contained in:
45
GameServer/Contents/UserBlock/Action/BlockUserAction.cs
Normal file
45
GameServer/Contents/UserBlock/Action/BlockUserAction.cs
Normal 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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
272
GameServer/Contents/UserBlock/Action/BlockUserAgentAction.cs
Normal file
272
GameServer/Contents/UserBlock/Action/BlockUserAgentAction.cs
Normal 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;
|
||||
|
||||
}
|
||||
}
|
||||
38
GameServer/Contents/UserBlock/Action/UserBlockAction.cs
Normal file
38
GameServer/Contents/UserBlock/Action/UserBlockAction.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
45
GameServer/Contents/UserBlock/BlockUser.cs
Normal file
45
GameServer/Contents/UserBlock/BlockUser.cs
Normal 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()}";
|
||||
}
|
||||
}
|
||||
|
||||
147
GameServer/Contents/UserBlock/DbQuery/DBQBlockUser.cs
Normal file
147
GameServer/Contents/UserBlock/DbQuery/DBQBlockUser.cs
Normal 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;
|
||||
}
|
||||
113
GameServer/Contents/UserBlock/DbQuery/DBQBlockUsersReadAll.cs
Normal file
113
GameServer/Contents/UserBlock/DbQuery/DBQBlockUsersReadAll.cs
Normal 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;
|
||||
}
|
||||
140
GameServer/Contents/UserBlock/DbQuery/DBQCancelBlockUser.cs
Normal file
140
GameServer/Contents/UserBlock/DbQuery/DBQCancelBlockUser.cs
Normal 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;
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
36
GameServer/Contents/UserBlock/Log/UserBlockBusinessLog.cs
Normal file
36
GameServer/Contents/UserBlock/Log/UserBlockBusinessLog.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user