using System; using System.Collections.Generic; using System.Linq; using System.Numerics; using System.Text; using System.Threading.Tasks; using Google.Protobuf.WellKnownTypes; using Newtonsoft.Json; using ServerCore; using ServerBase; using ServerControlCenter; using USER_GUID = System.String; using MASTER_GUID = System.String; using MASTER_NICKNAME = System.String; using Microsoft.AspNetCore.Http; using Amazon.S3.Model; namespace ServerCommon; public static class EntityHelper { public class MasterProfile { public MASTER_GUID MasterGuid { get; set; } = string.Empty; public MASTER_NICKNAME MasterNickname { get; set; } = string.Empty; } public static (Result, MasterProfile?) getMasterProfile(EntityBase owner) where TMasterEntity : EntityBase { var result = new Result(); var err_msg = string.Empty; var master_entity = owner as TMasterEntity; if (null == master_entity) { if (true == owner.hasMasterGuid()) { master_entity = owner.onGetMasterEntity() as TMasterEntity; if (null == master_entity) { err_msg = $"Not related Master !!! : TMasterEntity:{nameof(TMasterEntity)} - {owner.toBasicString()}"; result.setFail(ServerErrorCode.MasterNotFound, err_msg); Log.getLogger().error(err_msg); return (result, null); } } else { err_msg = $"Not related Master !!! : TMasterEntity:{nameof(TMasterEntity)} - {owner.toBasicString()}"; result.setFail(ServerErrorCode.MasterNotRelated, err_msg); Log.getLogger().error(err_msg); return (result, null); } } var entity_profile = new MasterProfile(); entity_profile.MasterGuid = (master_entity as dynamic).getUserGuid(); // 나중에 가상함수로 수정 하자. - kangms entity_profile.MasterNickname = (master_entity as dynamic).getUserNickname(); // 나중에 가상함수로 수정 하자. - kangms return (result, entity_profile); } public static OwnerEntityType toOwnerEntityType(this EntityType entityType) { if (EntityType.Player == entityType) { return OwnerEntityType.User; } else if (EntityType.Character == entityType) { return OwnerEntityType.Character; } else if (EntityType.UgcNpc == entityType || EntityType.Beacon == entityType) { return OwnerEntityType.UgcNpc; } else if (EntityType.MyHome == entityType) { return OwnerEntityType.Myhome; } var err_msg = $"Invalid EntityType !!! : EntityType:{entityType}"; Log.getLogger().error(err_msg); return OwnerEntityType.None; } public static async Task<(Result, bool)> isUserLoggedIn(DynamoDbClient dynamoDbClient, USER_GUID userGuid) { var result = new Result(); // 1. UserBaseDoc 조회 (result, var user_primary_key) = await DynamoDBDocBaseHelper.makePrimaryKey(userGuid); if (result.isFail()) { return (result, false); } ArgumentNullException.ThrowIfNull(user_primary_key, $"user_primary_key is null !!! - userGuid:{userGuid}"); var query_config = dynamoDbClient.makeQueryConfigForReadByPKSK(user_primary_key.PK); (result, var user_base_doc) = await dynamoDbClient.simpleQueryDocTypeWithQueryOperationConfig(query_config); if (result.isFail()) { return (result, false); } NullReferenceCheckHelper.throwIfNull(user_base_doc, () => $"user_base_doc is null !!! : userGuid:{userGuid}"); // 2. LoggedIn 체크 var user_base_attrib = user_base_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(user_base_attrib, () => $"user_base_attrib is null !!!"); return (result, (user_base_attrib.GameLoginDateTime > user_base_attrib.GameLogoutDateTime)); } public static async Task<(Result, List?)> findUserItemsWithCondition( DynamoDbClient dynamoDbClient, USER_GUID userGuid , Func? filterCondition ) { var result = new Result(); // 1. ItemDoc 조회 (result, var user_primary_key) = await DynamoDBDocBaseHelper.makePrimaryKey(userGuid); if (result.isFail()) { return (result, null); } ArgumentNullException.ThrowIfNull(user_primary_key, $"user_primary_key is null !!! - userGuid:{userGuid}"); var query_config = dynamoDbClient.makeQueryConfigForReadByPKOnly(user_primary_key.PK); (result, var found_item_docs) = await dynamoDbClient.simpleQueryDocTypesWithQueryOperationConfig(query_config); if (result.isFail()) { return (result, null); } NullReferenceCheckHelper.throwIfNull(found_item_docs, () => $"found_item_docs is null !!! : userGuid:{userGuid}"); if (null != filterCondition) { // 2. ItemDoc 조건 체크 !!! var filtered_item_docs = new List(); foreach(var item_doc in found_item_docs) { var is_success = filterCondition.Invoke(item_doc); if (is_success.isFalse()) { continue; } filtered_item_docs.Add(item_doc); } return (result, filtered_item_docs); } return (result, found_item_docs); } }