using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections.Concurrent; using ServerCore; using ServerBase; using ServerCommon.Cache; using USER_GUID = System.String; namespace ServerCommon; public class PartyMemberAttribute : EntityAttributeBase, ICopyEntityAttributeFromCache { private ConcurrentDictionary m_party_members = new(); public PartyMemberAttribute(EntityBase owner) : base(owner) { } public override async Task onInit() => await Task.FromResult(new Result()); public override void onClear() { m_party_members.Clear(); } public override EntityAttributeBase onCloned() { var cloned = new PartyMemberAttribute(getOwner()); foreach (var member in m_party_members) { var insert = member.Value.clone(); cloned.m_party_members.TryAdd(member.Key, insert); } return cloned; } public ConcurrentDictionary getPartyMembers() => m_party_members; public PartyMemberInfo? getPartyMember(USER_GUID user_guid) => m_party_members.GetValueOrDefault(user_guid); public int getPartyMemberCount() => m_party_members.Count; public void setPartyMember(PartyMemberInfo user) => m_party_members[user.UserGuid] = user; public bool deletePartyMember(USER_GUID delete_user_guid) => m_party_members.Remove(delete_user_guid, out _); public bool copyEntityAttributeFromCache(CacheBase? cacheBase) { var party_member_cache = cacheBase as PartyMemberCache; if(null == party_member_cache) { var err_msg = $"Failed to copyEntityAttributeFromCache() !!!, party_member_cache is null :{nameof(PartyMemberCache)}"; Log.getLogger().error(err_msg); return false; } //===================================================================================== // Cache => Attribute //===================================================================================== foreach (var member in party_member_cache.PartyMembers) { if (m_party_members.ContainsKey(member.Key)) { m_party_members[member.Key] = member.Value; continue; } m_party_members.TryAdd(member.Key, member.Value); } return true; } public bool copyEntityAttributeFromAttribute(PartyMemberAttribute from_attribute) { //===================================================================================== // Attribute => Attribute //===================================================================================== foreach (var member in from_attribute.getPartyMembers()) { if (m_party_members.ContainsKey(member.Key)) { m_party_members[member.Key] = member.Value; continue; } m_party_members.TryAdd(member.Key, member.Value); } return true; } public override IEntityAttributeTransactor onNewEntityAttributeTransactor() { return new PartyMemberAttributeTransactor(getOwner()); } public override async Task<(Result, DynamoDbDocBase?)> toDocBase(bool isForQuery = true) { await Task.CompletedTask; return (new Result(), null); } } public class PartyMemberAttributeTransactor : EntityAttributeTransactorBase, ICopyEntityAttributeTransactorFromEntityAttribute { public PartyMemberAttributeTransactor(EntityBase owner) : base(owner) { } public bool copyEntityAttributeTransactorFromEntityAttribute(EntityAttributeBase entityAttributeBase) { string err_msg; var copy_from_party_member_attribute = entityAttributeBase as PartyMemberAttribute; if (null == copy_from_party_member_attribute) { err_msg = $"Failed to copyEntityAttributeTransactorFromEntityAttribute() !!!, copy_from_party_member_attribute is null :{nameof(PartyMemberAttribute)}"; Log.getLogger().error(err_msg); return false; } var copy_to_party_member_attribute = getClonedEntityAttribute() as PartyMemberAttribute; if (null == copy_to_party_member_attribute) { err_msg = $"Failed to copyEntityAttributeTransactorFromEntityAttribute() !!!, copy_to_party_member_attribute is null :{nameof(PartyMemberAttribute)}"; Log.getLogger().error(err_msg); return false; } copy_to_party_member_attribute.copyEntityAttributeFromAttribute(copy_from_party_member_attribute); return true; } }