using System.Collections.Concurrent; using Newtonsoft.Json; using Google.Protobuf; using Google.Protobuf.WellKnownTypes; using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; using MetaAssets; namespace GameServer; public class SystemMetaMailManager : EntityBase, IWithLogActor { ConcurrentDictionary m_system_meta_mails = new(); private bool m_is_all_load = false; private HashSet m_active_user_send_mail_ids = new (); public SystemMetaMailManager() : base(EntityType.SystemMailManager) { } //서버 뜰때만 사용 public async Task LoadDB() { var result = new Result(); var server_logic = GameServerApp.getServerLogic(); var dynamo_db_client = server_logic.getDynamoDbClient(); var doc = new SystemMetaMailDoc(); var query_config = dynamo_db_client.makeQueryConfigForReadByPKOnly(doc.getPK()); (result, var read_doc_list) = await dynamo_db_client.simpleQueryDocTypesWithQueryOperationConfig(query_config); if (result.isFail()) { return result; } var now = DateTimeHelper.Current; foreach (var read_doc in read_doc_list) { (result, var system_meta_mail) = await SystemMetaMail.createMailFromDoc(this, read_doc); if (result.isFail() || system_meta_mail == null) { return result; } var system_mail_attribute = system_meta_mail.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(system_mail_attribute, () => $"system_mail_attribute is null !!!"); if (system_mail_attribute.EndTime < now) continue; if(false == m_system_meta_mails.TryAdd(system_mail_attribute.MailId, system_meta_mail)) { Log.getLogger().warn($"m_system_meta_mails try add error. mailId : {system_mail_attribute.MailId}"); continue; } //여기까진 정상적으로 온것이고 시간대가 활성화 시간대이면 발동시점에 첫 메일 보상처리를 위해 별도 데이터로 관리 if (system_mail_attribute.StartTime <= now && now <= system_mail_attribute.EndTime) { m_active_user_send_mail_ids.Add(system_mail_attribute.MailId); } } m_is_all_load = true; return result; } public async Task refreshDB() { var result = new Result(); if (m_is_all_load == false) return result; var server_logic = GameServerApp.getServerLogic(); var dynamo_db_client = server_logic.getDynamoDbClient(); var doc = new SystemMetaMailDoc(); var query_config = dynamo_db_client.makeQueryConfigForReadByPKOnly(doc.getPK()); (result, var read_doc_list) = await dynamo_db_client.simpleQueryDocTypesWithQueryOperationConfig(query_config); if (result.isFail()) { Log.getLogger().error("SystemMetaMailDoc read error"); return result; } var now = DateTimeHelper.Current; foreach (var read_doc in read_doc_list) { var attrib = read_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(attrib, () => $"attrib is null !!!"); if (false == m_system_meta_mails.ContainsKey(attrib.MailId)) { if (attrib.EndTime < now) continue; (result, var system_meta_mail) = await SystemMetaMail.createMailFromDoc(this, read_doc); if (result.isFail() || system_meta_mail == null) { Log.getLogger().error($"SystemMetaMailDoc create error, {result.toBasicString()}"); continue; } var system_mail_attribute = system_meta_mail.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(system_mail_attribute, () => $"system_mail_attribute is null !!!"); if (false == m_system_meta_mails.TryAdd(system_mail_attribute.MailId, system_meta_mail)) { Log.getLogger().error($"SystemMetaMailDoc refresh Add error, mailid : {system_mail_attribute.MailId}"); continue; } } else { if (attrib.EndTime < now) { if (false == m_system_meta_mails.TryRemove(attrib.MailId, out var removed_attribute)) { Log.getLogger().error($"SystemMetaMailDoc refresh Add error, mailid : {attrib.MailId}"); continue; } else { Log.getLogger().info($"SystemMetaMailDoc is old : {JsonConvert.SerializeObject(removed_attribute)}"); continue; } } } } return result; } //24-10-23 Ticker에서 new Noti 안보내는걸로 처리 public async Task notifyNewSystemMail() { var result = new Result(); if (m_is_all_load == false) return result; var now = DateTimeHelper.Current; bool need_noti = false; foreach (var system_mail in m_system_meta_mails.Values) { var system_mail_attribute = system_mail.getEntityAttribute(); if (system_mail_attribute == null) continue; if (m_active_user_send_mail_ids.Contains(system_mail_attribute.MailId)) continue; if (now < system_mail_attribute.StartTime) continue; //여기 오면 신규 메일이 있는거니까 new 처리 해준다. need_noti = true; m_active_user_send_mail_ids.Add(system_mail_attribute.MailId); } if(need_noti) AllPlayerSystemMailNoti(); return await Task.FromResult(result); } public List GetSystemMail(HashSet receivedSystemMail) { var systemMailList = new List(); var mails = CopyData(); foreach (var systemMail in mails) { var now = DateTime.UtcNow; var system_meta_mail_attribute = systemMail.getEntityAttribute(); if (system_meta_mail_attribute == null) { continue; } if (now < system_meta_mail_attribute.StartTime || system_meta_mail_attribute.EndTime < now) continue; if (receivedSystemMail.Contains(system_meta_mail_attribute.MailId)) { continue; } if (system_meta_mail_attribute.StartTime <= now && now <= system_meta_mail_attribute.EndTime ) { systemMailList.Add(systemMail); } } return systemMailList; } public List GetSystemMail(Dictionary receivedSystemMails) { var systemMailList = new List(); var mails = CopyData(); foreach (var systemMail in mails) { var now = DateTime.UtcNow; var system_meta_mail_attribute = systemMail.getEntityAttribute(); if (system_meta_mail_attribute == null) { continue; } if (now < system_meta_mail_attribute.StartTime || system_meta_mail_attribute.EndTime < now) continue; if (receivedSystemMails.ContainsKey(system_meta_mail_attribute.MailId)) { continue; } systemMailList.Add(systemMail); } return systemMailList; } private List CopyData() { return new List(m_system_meta_mails.Values.ToList()); } public async Task CheatFuncSaveSystemMetaMail() { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); var dynamo_db_client = server_logic.getDynamoDbClient(); var fn_cheat_system_meta_mail_whrite = async delegate () { var result = new Result(); int mailId = 0; var mailList = CopyData(); foreach (var systemMail in mailList) { var system_mail_attribute = systemMail.getEntityAttribute(); if (system_mail_attribute == null) { continue; } int mail_id = system_mail_attribute.MailId; if (mailId < mail_id) { mailId = mail_id; } } (result, var system_mail) = await SystemMetaMail.createTestSystemMail(this, mailId); if (result.isFail() || system_mail == null) { return result; } var batch = new QueryBatchEx( this, LogActionType.TestWriteSystemMail , server_logic.getDynamoDbClient() ); { batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner()); } result = await QueryHelper.sendQueryAndBusinessLog(batch); if (result.isFail()) { return result; } if (false == m_system_meta_mails.TryAdd(mailId, system_mail)) { } return result; }; result = await this.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "CheatSystemMetaMailWrite", fn_cheat_system_meta_mail_whrite); if (result.isFail()) { err_msg = $"Failed to runTransactionRunnerSafely()!!! : {result.toBasicString()} - {this.toBasicString()}"; Log.getLogger().error(err_msg); } return result; } public void AllPlayerSystemMailNoti() { var server_logic = GameServerApp.getServerLogic(); var users = server_logic.getPlayerManager().getUsers(); foreach( var user in users ) { var mail_action = user.Value.getEntityAction(); mail_action.NewReceivedSystemMail(); } } public override string toBasicString() { return $"{this.getTypeName()}"; } public override string toSummaryString() { return $"{this.getTypeName()}"; } public ILogActor toLogActor() { var server_logic = ServerLogicApp.getServerLogicApp(); var log_info = new SystemMailActorLog(); if (server_logic == null) return log_info; log_info.initLogInfo( // 서버 정보 server_logic.getServerConfig().getRegionId() , server_logic.getServerConfig().getWorldId() , server_logic.getServerType().toServerType() ); return log_info; } public bool isAllLoad() { return m_is_all_load; } }