using System.Text; using ServerBase; using ServerCommon; using ServerCore; namespace BrokerApiCore; using MetaAssets; using ServerCommon.BusinessLogDomain; public class BrokerMailSendAction : EntityActionBase { private readonly DynamoDbClient m_dynamo_db_client; public BrokerMailSendAction(EntityBase owner, DynamoDbClient dynamoDbClient) : base(owner) { m_dynamo_db_client = dynamoDbClient; } public override void onClear() { } public override Task onInit() { return Task.FromResult(new Result()); } string makeMailGuid(DateTime now) { var guid = Guid.NewGuid().ToString("N"); return $"{now.ToString("yyyy/MM/dd/HH:mm:ss:ff")}-{guid}"; } private void setMailAttribute(MailSendOption option) { DateTime now = DateTimeHelper.Current; var expire_date = now.AddSeconds(MetaHelper.GameConfigMeta.SystemMailStoragePeriod); string mail_guid = makeMailGuid(now); var mail_attribute = getOwner().getEntityAttributeNotNull(); mail_attribute.MailGuid = mail_guid; mail_attribute.SenderNickName = option.SenderNickName; mail_attribute.SenderGuid = option.SenderGuid; mail_attribute.ReceiverNickName = option.ReceiverNickName; mail_attribute.ReceiverGuid = option.ReceiverUserGuid; mail_attribute.Title = option.Title; mail_attribute.Text = option.Text; mail_attribute.CreateTime = now; mail_attribute.ExpireTime = expire_date; mail_attribute.IsSystemMail = option.IsSystemMail; mail_attribute.IsRead = false; mail_attribute.IsGetItem = false; mail_attribute.IsTextByMetaData = option.IsTextByMetaData; mail_attribute.ItemList = option.ItemList; mail_attribute.newEntityAttribute(); } public async Task sendMail(MailSendOption mailSendOption, Func operationSuccess, Func operationFail) { var result = new Result(); var user_guid = mailSendOption.ReceiverUserGuid; StringBuilder str_builder = new(); str_builder.Append($"guid : {user_guid}, nickname : {mailSendOption.ReceiverNickName}"); str_builder.Append($" accountId : {mailSendOption.AccountId}"); setMailAttribute(mailSendOption); var (doc_result, doc) = await getOwner().getEntityAttributeNotNull().toDocBase()!; if (doc_result.isFail() || doc is null) { Log.getLogger().error($"fail create system mail, {str_builder.ToString()}"); return doc_result; } var mail_doc = doc as ReceivedMailDoc; NullReferenceCheckHelper.throwIfNull(mail_doc, () => $"mail_doc is null !!! - receiverUserGuid:{mailSendOption.ReceiverUserGuid}"); var log_actor = getOwner() as IWithLogActor; NullReferenceCheckHelper.throwIfNull(log_actor, () => $"log_actor is null !!! - receiverUserGuid:{mailSendOption.ReceiverUserGuid}"); var batch = new QueryBatchEx(log_actor, LogActionType.MailSend, m_dynamo_db_client, true); batch.addQuery(new DBQEntityWrite(mail_doc)); batch.addQuery(new QueryFinal(), async (query) => { // actionSuccess 실행하기 await operationSuccess(); return QueryBatchBase.QueryResultType.Success; }, async (query, errorResult) => { await operationFail(); return QueryBatchBase.QueryResultType.QueryFailed; } ); var query_result = await batch.doQueryWithStopwatch(); if (query_result.isFail()) { Log.getLogger().error($"broker system mail send error, {str_builder.ToString()}"); return query_result; } var mail_attrib = mail_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(mail_attrib, () => $"mail_attrib is null !!! - receiverUserGuid:{mailSendOption.ReceiverUserGuid}"); // 비즈니스 로그 작성 var log_data = new MailLogData(); setMailData(log_data, mail_attrib); BusinessLogger.collectLog(log_actor, new MailBusinessLog(log_data)); Log.getLogger().info($"system mail send success, {str_builder.ToString()}"); return result; } private void setMailData(in MailLogData logData, in MailAttrib mailAttrib) { logData.MailGuid = mailAttrib.MailGuid; logData.Title = mailAttrib.Title; logData.Text = mailAttrib.Text; logData.IsSystemMail = mailAttrib.IsSystemMail; logData.IsReadMail = mailAttrib.IsRead; logData.IsGetItem = mailAttrib.IsGetItem; logData.SenderNickname = mailAttrib.SenderNickName; logData.SenderGuid = mailAttrib.SenderGuid; logData.ReceiverNickname = mailAttrib.ReceiverNickName; logData.ReceiverGuid = mailAttrib.ReceiverGuid; logData.CreateTime = mailAttrib.CreateTime; logData.ExpireTime = mailAttrib.ExpireTime; logData.IsTextByMetaData = mailAttrib.IsTextByMetaData; logData.packageOrderId = mailAttrib.packageOrderId; logData.ItemList = mailAttrib.ItemList; } public MailSendOption createSystemSendMailOptionByMeta( ProductMetaData productMeta, SystemMailMetaData mailMeta, string receiverUserGuid, string receiverNickName, int amount) { DateTime now = DateTimeHelper.Current; var expire_date = now.AddSeconds(MetaHelper.GameConfigMeta.SystemMailStoragePeriod); // if (productMeta.Storage_Period_First != 0) // { // expire_date = DateTime.UtcNow.AddMinutes(productMeta.Storage_Period_First); // } var mail_send_option = new MailSendOption { ReceiverUserGuid = receiverUserGuid, ReceiverNickName = receiverNickName, IsSystemMail = true, IsTextByMetaData = true, Title = mailMeta.Mail_Title, Text = mailMeta.Mail_Desc, ExpireDate = expire_date, ItemList = getMailItems(productMeta, amount).ToList(), PackageOrderId = string.Empty, }; return mail_send_option; } private static IEnumerable getMailItems(ProductMetaData productMetaData, int amount) { if (productMetaData.ItemID_First != 0) { IEnumerable total_items = Enumerable.Range(0, amount).Select(i => { return productMetaData.First_List.Select(itemMeta => new ServerCommon.MailItem() { ItemId = (UInt32)itemMeta.Id, Count = itemMeta.Value, ProductId = (UInt32)productMetaData.Id, isRepeatProduct = false }); }).SelectMany(x => x); return total_items; } return new List(); } } public class BrokerMailRecvAction : EntityActionBase { private readonly DynamoDbClient m_dynamo_db_client; public BrokerMailRecvAction(EntityBase owner, DynamoDbClient dynamoDbClient) : base(owner) { m_dynamo_db_client = dynamoDbClient; } public override void onClear() { throw new NotImplementedException(); } public override Task onInit() { return Task.FromResult(new Result()); } public async Task<(Result, List)> findReceivedMailDoc(string userGuid) { var err_msg = string.Empty; var dynamo_db_client = m_dynamo_db_client; var received_mail_docs = new List(); var doc = new ReceivedMailDoc(userGuid); var event_tid = Guid.NewGuid().ToString("N"); var query_config = dynamo_db_client.makeQueryConfigForReadByPKOnly(doc.getPK()); var (result, read_docs) = await dynamo_db_client.simpleQueryDocTypesWithQueryOperationConfig(query_config); if (result.isSuccess()) { foreach (var recv_mail_doc in read_docs) { var mail_attrib = recv_mail_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(mail_attrib, () => $"mail_attrib is null !!! - userGuid:{userGuid}"); if (DateTimeHelper.Current > mail_attrib.ExpireTime) { var to_delete_result = await dynamo_db_client.simpleDeleteDocumentWithDocType(recv_mail_doc, event_tid); if (to_delete_result.isFail()) { err_msg = $"Failed to simpleDeleteDocumentWithDocType() !!!, can't received mail : Mail:{mail_attrib.toBasicString()} - userGuid:{userGuid}"; Log.getLogger().error(err_msg); } else { err_msg = $"Mail deleted with expired retention period !!! : deletedMail:{mail_attrib.toBasicString()} - userGuid:{userGuid}"; Log.getLogger().info(err_msg); } continue; } received_mail_docs.Add(recv_mail_doc); } } return (result, received_mail_docs); } public async Task deleteMail(string mailGuid) { var result = new Result(); var err_msg = string.Empty; var mail_doc = new ReceivedMailDoc(mailGuid); var event_tid = Guid.NewGuid().ToString("N"); result = await m_dynamo_db_client.simpleDeleteDocumentWithDocType(mail_doc, event_tid); if (result.isFail()) { err_msg = $"Failed to simpleDeleteDocumentWithDocType() !!!, can't received mail : Mail:{mail_doc.toBasicString()}"; Log.getLogger().error(err_msg); return result; } return result; } }