using System; using System.Collections.Generic; using System.Linq; using System.Numerics; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; using ServerCore; using ServerBase; using SESSION_ID = System.Int32; using WORLD_ID = System.UInt32; using META_ID = System.UInt32; using ENTITY_GUID = System.String; using ACCOUNT_ID = System.String; using OWNER_GUID = System.String; using USER_GUID = System.String; using CHARACTER_GUID = System.String; using ITEM_GUID = System.String; using PARTY_GUID = System.String; using System.Runtime.InteropServices; using Amazon.S3.Model; namespace ServerCommon { public class UserAttribute : EntityAttributeBase, ICopyEntityAttributeFromDoc, ICopyEntityAttributeFromCache, IMergeWithEntityAttribute { [JsonProperty] public USER_GUID UserGuid { get; set; } = string.Empty; [JsonProperty] public ACCOUNT_ID AccountId { get; set; } = string.Empty; [JsonProperty] public string EOA { get; set; } = string.Empty; [JsonProperty] public CHARACTER_GUID SelectedCharacterGuid { get; set; } = string.Empty; [JsonProperty] public bool IsIntroCompleted { get; set; } = false; public PlayerStateType PlayerState { get; set; } public string OccupiedAnchorGuid { get; set; } = string.Empty; public DateTime GameLoginDateTime = DateTime.MinValue; public DateTime GameLogoutDateTime = DateTime.MinValue; public UserAttribute(EntityBase owner) : base(owner) { } public bool applyUserGuidToRefAttributes( AccountBaseDoc accountBaseDoc, AccountAttribute accountAttribute , UserBaseDoc userBaseDoc ) { var owner = getOwner(); NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); ArgumentNullReferenceCheckHelper.throwIfNull(accountBaseDoc, () => $"accountBaseDoc is null !!! - {owner.toBasicString()}"); ArgumentNullReferenceCheckHelper.throwIfNull(accountAttribute, () => $"accountAttribute is null !!! - {owner.toBasicString()}"); ArgumentNullReferenceCheckHelper.throwIfNull(userBaseDoc, () => $"userBaseDoc is null !!! - - {owner.toBasicString()}"); accountAttribute.UserGuid = UserGuid; var account_doc_attrib = accountBaseDoc.getAttrib(); NullReferenceCheckHelper.throwIfNull(account_doc_attrib, () => $"account_doc_attrib is null !!! - - {owner.toBasicString()}"); account_doc_attrib.UserGuid = UserGuid; var user_doc_attrib = userBaseDoc.getAttrib(); NullReferenceCheckHelper.throwIfNull(user_doc_attrib, () => $"user_doc_attrib is null !!! - - {owner.toBasicString()}"); user_doc_attrib.UserGuid = UserGuid; return true; } public override void onClear() { UserGuid = string.Empty; AccountId = string.Empty; EOA = string.Empty; UserGuid = string.Empty; IsIntroCompleted = false; PlayerState = PlayerStateType.None; OccupiedAnchorGuid = string.Empty; GameLoginDateTime = DateTime.MinValue; GameLogoutDateTime = DateTime.MinValue; getAttributeState().reset(); } public override EntityAttributeBase onCloned() { var owner = getOwner(); NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var cloned = new UserAttribute(owner); cloned.UserGuid = UserGuid; cloned.AccountId = AccountId; cloned.EOA = EOA; cloned.SelectedCharacterGuid = SelectedCharacterGuid; cloned.IsIntroCompleted = IsIntroCompleted; cloned.PlayerState = PlayerState; cloned.OccupiedAnchorGuid = OccupiedAnchorGuid; cloned.GameLoginDateTime = DateTime.MinValue; cloned.GameLogoutDateTime = DateTime.MinValue; return cloned; } public override IEntityAttributeTransactor onNewEntityAttributeTransactor() { return new UserAttributeTransactor(getOwner()); } public Result onMerge(EntityAttributeBase otherEntityAttribute) { var owner = getOwner(); NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var result = new Result(); var err_msg = string.Empty; if (null == otherEntityAttribute) { err_msg = $"Invalid Param !!!, otherEntityAttribute is null - {owner.toBasicString()}"; result.setFail(ServerErrorCode.FunctionParamNull, err_msg); Log.getLogger().error(result.toBasicString()); return result; } //===================================================================================== // OtherAttribute => Attribute //===================================================================================== var user_attribute = otherEntityAttribute as UserAttribute; if (null == user_attribute) { err_msg = $"Failed to cast UserAttribute !!!, user_attribute is null - {owner.toBasicString()}"; result.setFail(ServerErrorCode.ClassTypeCastIsNull, err_msg); Log.getLogger().error(result.toBasicString()); return result; } UserGuid = user_attribute.UserGuid; AccountId = user_attribute.AccountId; EOA = user_attribute.EOA; SelectedCharacterGuid = user_attribute.SelectedCharacterGuid; IsIntroCompleted = user_attribute.IsIntroCompleted; PlayerState = user_attribute.PlayerState; OccupiedAnchorGuid = user_attribute.OccupiedAnchorGuid; GameLoginDateTime = user_attribute.GameLoginDateTime; GameLogoutDateTime = user_attribute.GameLogoutDateTime; //===================================================================================== // Attribute Try Pending Doc => Origin Doc //===================================================================================== var try_pending_doc = user_attribute.getTryPendingDocBase() as UserBaseDoc; if (null != try_pending_doc) { user_attribute.resetTryPendingDocBase(); syncOriginDocBaseWithNewDoc(try_pending_doc); } var origin_doc_base = getOriginDocBase(); if (null == origin_doc_base) { // DB 에 저장되어 있지 않는 경우 OriginDoc은 null 이다 !!! return result; } var user_base_attrib = origin_doc_base.getAttrib(); NullReferenceCheckHelper.throwIfNull(user_base_attrib, () => $"user_base_attrib is null !!! - {owner.toBasicString()}"); user_base_attrib.UserGuid = UserGuid; user_base_attrib.AccountId = AccountId; user_base_attrib.EOA = EOA; user_base_attrib.SelectedCharacterGuid = SelectedCharacterGuid; user_base_attrib.IsIntroCompleted = IsIntroCompleted; user_base_attrib.GameLoginDateTime = GameLoginDateTime; user_base_attrib.GameLogoutDateTime = GameLogoutDateTime; return result; } public override UserBaseDoc onCreateDocBase() { return new UserBaseDoc(UserGuid); } public override async Task<(Result, DynamoDbDocBase?)> toDocBase(bool isForQuery = true) { var owner = getOwner(); NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var result = new Result(); //===================================================================================== // Attribute => try pending Doc //===================================================================================== var try_pending_doc = getTryPendingDocBase() as UserBaseDoc; if (null == try_pending_doc) { var to_copy_doc = onCreateDocBase(); var origin_doc = getOriginDocBase(); if (null != origin_doc) { to_copy_doc.copyTimestampsFromOriginDocBase(origin_doc); } try_pending_doc = to_copy_doc; setTryPendingDocBase(try_pending_doc); } var to_copy_doc_attrib = try_pending_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(to_copy_doc_attrib, () => $"to_copy_doc_attrib is null !!! - {toBasicString()}"); to_copy_doc_attrib.UserGuid = UserGuid; to_copy_doc_attrib.AccountId = AccountId; to_copy_doc_attrib.EOA = EOA; to_copy_doc_attrib.SelectedCharacterGuid = SelectedCharacterGuid; to_copy_doc_attrib.IsIntroCompleted = IsIntroCompleted; to_copy_doc_attrib.GameLoginDateTime = GameLoginDateTime; to_copy_doc_attrib.GameLogoutDateTime = GameLogoutDateTime; if (false == isForQuery) { return (result, try_pending_doc); } //===================================================================================== // Doc QueryType 반영 //===================================================================================== (result, var to_query_doc) = await applyDoc4Query(try_pending_doc); if (result.isFail()) { return (result, null); } return (result, to_query_doc); } public bool copyEntityAttributeFromCache(CacheBase? cacheBase) { var owner = getOwner(); NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var err_msg = string.Empty; var login_cache = cacheBase as LoginCache; if(null == login_cache) { err_msg = $"Failed to copyEntityAttributeFromCache() !!!, login_cache is null :{nameof(LoginCache)} - {owner.toBasicString()}"; Log.getLogger().error(err_msg); return false; } //===================================================================================== // Cache => Attribute //===================================================================================== PlayerState = login_cache.State; return true; } public bool copyEntityAttributeFromDoc(DynamoDbDocBase customDoc) { var owner = getOwner(); NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var err_msg = string.Empty; bool is_success = false; var account_base_doc = customDoc as AccountBaseDoc; if (null != account_base_doc) { is_success = copyEntityAttributeFromAccountBaseDoc(account_base_doc); } var user_base_doc = customDoc as UserBaseDoc; if(null != user_base_doc) { is_success = copyEntityAttributeFromUserBaseDoc(user_base_doc); } if (false == is_success) { err_msg = $"Failed to copyEntityAttributeFromDoc() !!!, no successful data copies !!! :{toBasicString()} - {owner.toBasicString()}"; Log.getLogger().error(err_msg); return false; } return true; } public bool copyEntityAttributeFromAccountBaseDoc(AccountBaseDoc? accountBaseDoc) { var owner = getOwner(); NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var err_msg = string.Empty; var to_cast_string = typeof(AccountBaseDoc).Name; if (null == accountBaseDoc) { err_msg = $"Failed to copyEntityAttributeFromAccountBaseDoc() !!!, accountBaseDoc is null :{to_cast_string} - {owner.toBasicString()}"; Log.getLogger().warn(err_msg); return false; } //===================================================================================== // Doc => Attribute //===================================================================================== var account_base_attrib = accountBaseDoc.getAttrib(); NullReferenceCheckHelper.throwIfNull(account_base_attrib, () => $"account_base_attrib is null !!! - {owner.toBasicString()}"); UserGuid = account_base_attrib.UserGuid; AccountId = account_base_attrib.AccountId; return true; } public bool copyEntityAttributeFromUserBaseDoc(UserBaseDoc? userBaseDoc) { var owner = getOwner(); NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var err_msg = string.Empty; var to_cast_string = typeof(UserBaseDoc).Name; if (null == userBaseDoc) { err_msg = $"Failed to copyEntityAttributeFromUserBaseDoc() !!!, userBaseDoc is null :{to_cast_string} - {owner.toBasicString()}"; Log.getLogger().warn(err_msg); return false; } //===================================================================================== // New Doc => Origin Doc //===================================================================================== syncOriginDocBaseWithNewDoc(userBaseDoc); //===================================================================================== // Doc => Attribute //===================================================================================== var user_base_attrib = userBaseDoc.getAttrib(); NullReferenceCheckHelper.throwIfNull(user_base_attrib, () => $"account_base_attrib is null !!! - {owner.toBasicString()}"); UserGuid = user_base_attrib.UserGuid; AccountId = user_base_attrib.AccountId; EOA = user_base_attrib.EOA; SelectedCharacterGuid = user_base_attrib.SelectedCharacterGuid; IsIntroCompleted = user_base_attrib.IsIntroCompleted; return true; } public override string toBasicString() { return $"{GetType()}, UserGuid:{UserGuid}, SelectedCharacterGuid:{SelectedCharacterGuid}, AccountId:{AccountId}"; } } public class UserAttributeTransactor : EntityAttributeTransactorBase, ICopyEntityAttributeTransactorFromEntityAttribute { public UserAttributeTransactor(EntityBase owner) : base(owner) { } public bool copyEntityAttributeTransactorFromEntityAttribute(EntityAttributeBase? entityAttributeBase) { var err_msg = string.Empty; var to_cast_string = typeof(UserAttribute).Name; var copy_from_user_attribute = entityAttributeBase as UserAttribute; if (null == copy_from_user_attribute) { err_msg = $"Failed to copyEntityAttributeTransactorFromEntityAttribute() !!!, copy_from_user_attribute is null :{to_cast_string}"; Log.getLogger().error(err_msg); return false; } var copy_to_user_attribute = getClonedEntityAttribute() as UserAttribute; if (null == copy_to_user_attribute) { err_msg = $"Failed to copyEntityAttributeTransactorFromEntityAttribute() !!!, copy_to_user_attribute is null :{to_cast_string}"; Log.getLogger().error(err_msg); return false; } copy_to_user_attribute.SelectedCharacterGuid = copy_from_user_attribute.SelectedCharacterGuid; copy_to_user_attribute.IsIntroCompleted = copy_from_user_attribute.IsIntroCompleted; copy_to_user_attribute.EOA = copy_from_user_attribute.EOA; copy_to_user_attribute.PlayerState = copy_from_user_attribute.PlayerState; copy_to_user_attribute.OccupiedAnchorGuid = copy_from_user_attribute.OccupiedAnchorGuid; return true; } } }