using Google.Protobuf.WellKnownTypes; using ServerCore; using ServerBase; using ServerCommon; using USER_GUID = System.String; using USER_NICKNAME = System.String; using MetaAssets; namespace GameServer { public class Mail : EntityBase { private Mail(EntityBase parent) : base(EntityType.Mail, parent) { } public override async Task onInit() { var parent = getDirectParent(); NullReferenceCheckHelper.throwIfNull(parent, () => "Parent Entity is null !!"); addEntityAttribute(new MailAttribute(this, parent)); return await base.onInit(); } public static async Task<(Result, Mail?)> createSendMail(Player owner, string toNickname, string toGuid, string title, string mailText) { var mail = new Mail(owner); var result = await mail.onInit(); if (result.isFail()) { return (result, null); } var err_msg = string.Empty; DateTime now = DateTimeHelper.Current; var expireDate = now.AddSeconds(MetaHelper.GameConfigMeta.SendMailStoragePeriod); string mailGuid = MailHelper.makeMailGuid(now); var mail_attribute = mail.getEntityAttribute(); if (mail_attribute == null) { err_msg = $"Failed to get mail attribute : {nameof(MailAttribute)}"; result.setFail(ServerErrorCode.EntityAttributeIsNull, err_msg); Log.getLogger().error(err_msg); return (result, null); } mail_attribute.MailGuid = mailGuid; mail_attribute.SenderNickName = owner.getUserNickname(); mail_attribute.SenderGuid = owner.getUserGuid(); mail_attribute.ReceiverNickName = toNickname; mail_attribute.ReceiverGuid = toGuid; mail_attribute.Title = title; mail_attribute.Text = mailText; mail_attribute.CreateTime = now; mail_attribute.ExpireTime = expireDate; mail_attribute.IsSystemMail = false; mail_attribute.IsRead = false; mail_attribute.IsGetItem = false; mail_attribute.IsTextByMetaData = false; mail_attribute.newEntityAttribute(); return (result, mail); } public static async Task<(Result, Mail?)> createMailFromDoc(EntityBase parent, MailDoc doc) { var mail = new Mail(parent); var result = await mail.onInit(); if (result.isFail()) { return (result, null); } var err_msg = string.Empty; var mail_attribute = mail.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(mail_attribute, () => $"mail_attribute is null !!! - {parent.toBasicString()}"); if (mail_attribute.copyEntityAttributeFromDoc(doc) == false) { err_msg = $"Failed to copyEntityAttributeFromDoc !!! : doc_type {doc.GetType()} - {mail.getRootParent().toBasicString()}"; result.setFail(ServerErrorCode.DynamoDbDocCopyToEntityAttributeFailed, err_msg); Log.getLogger().error(err_msg); return (result, null); } return (result, mail); } public static async Task<(Result, ReceivedMailDoc?)> createSystemMailWithMeta( USER_GUID receiverUserGuid, USER_NICKNAME receiverNickname , SystemMailMetaData systemMailData , List mailItems, DateTime expireDate, string packageOrderId = "") { ArgumentNullReferenceCheckHelper.throwIfNull(systemMailData, () => $"systemMailData is null !!! - receiver:{receiverNickname}"); ArgumentNullReferenceCheckHelper.throwIfNull(mailItems, () => $"mailItems is null !!! - receiver:{receiverNickname}, sender:{systemMailData.Sender}"); (var result, ReceivedMailDoc? to_receive_mail_doc) = await Mail.createSystemMail( receiverUserGuid, receiverNickname , systemMailData.Sender , systemMailData.Mail_Title, systemMailData.Mail_Desc, new List() , true, mailItems, expireDate, packageOrderId); if (result.isFail()) { return (result, null); } return (result, to_receive_mail_doc); } public static async Task<(Result, ReceivedMailDoc?)> createSystemMailWithMeta( USER_GUID receiverUserGuid, USER_NICKNAME receiverNickname , SystemMailMetaData systemMailData, List contensArguments , List mailItems, DateTime expireDate, string packageOrderId = "") { ArgumentNullReferenceCheckHelper.throwIfNull(systemMailData, () => $"systemMailData is null !!! - receiver:{receiverNickname}"); ArgumentNullReferenceCheckHelper.throwIfNull(mailItems, () => $"mailItems is null !!! - receiver:{receiverNickname}, sender:{systemMailData.Sender}"); (var result, ReceivedMailDoc? to_receive_mail_doc) = await Mail.createSystemMail( receiverUserGuid, receiverNickname , systemMailData.Sender , systemMailData.Mail_Title, systemMailData.Mail_Desc, contensArguments , true, mailItems, expireDate, packageOrderId); if (result.isFail()) { return (result, null); } return (result, to_receive_mail_doc); } public static async Task<(Result, ReceivedMailDoc?)> createSystemMailWithMeta( USER_GUID receiverUserGuid, USER_NICKNAME receiverNickname , SystemMailMetaData systemMailData , List mailItems, Int64 TTL_Period, string packageOrderId = "") { ArgumentNullReferenceCheckHelper.throwIfNull(systemMailData, () => $"systemMailData is null !!! - receiver:{receiverNickname}"); ArgumentNullReferenceCheckHelper.throwIfNull(mailItems, () => $"mailItems is null !!! - receiver:{receiverNickname}, sender:{systemMailData.Sender}"); (var result, ReceivedMailDoc? to_receive_mail_doc) = await Mail.createSystemMail(receiverUserGuid, receiverNickname , systemMailData.Sender , systemMailData.Mail_Title, systemMailData.Mail_Desc, new List() , true, mailItems, TTL_Period, packageOrderId); if (result.isFail()) { return (result, null); } return (result, to_receive_mail_doc); } public static async Task<(Result, ReceivedMailDoc?)> createSystemMailWithMeta( USER_GUID receiverUserGuid, USER_NICKNAME receiverNickname , SystemMailMetaData systemMailData, List contentsArguments , List mailItems, Int64 TTL_Period, string packageOrderId = "") { ArgumentNullReferenceCheckHelper.throwIfNull(systemMailData, () => $"systemMailData is null !!! - receiver:{receiverNickname}"); ArgumentNullReferenceCheckHelper.throwIfNull(mailItems, () => $"mailItems is null !!! - receiver:{receiverNickname}, sender:{systemMailData.Sender}"); (var result, ReceivedMailDoc? to_receive_mail_doc) = await Mail.createSystemMail( receiverUserGuid, receiverNickname , systemMailData.Sender , systemMailData.Mail_Title, systemMailData.Mail_Desc, contentsArguments , true, mailItems, TTL_Period, packageOrderId ); if (result.isFail()) { return (result, null); } return (result, to_receive_mail_doc); } public static async Task<(Result, ReceivedMailDoc?)> createSystemMailWithMeta( USER_GUID receiverUserGuid, USER_NICKNAME receiverNickname , SystemMailMetaData systemMailData, string mailBodyText , List mailItems, Int64 TTL_Period, string packageOrderId = "") { ArgumentNullReferenceCheckHelper.throwIfNull(systemMailData, () => $"systemMailData is null !!! - receiver:{receiverNickname}"); ArgumentNullReferenceCheckHelper.throwIfNull(mailItems, () => $"mailItems is null !!! - receiver:{receiverNickname}, sender:{systemMailData.Sender}"); (var result, ReceivedMailDoc? to_receive_mail_doc) = await Mail.createSystemMail(receiverUserGuid, receiverNickname , systemMailData.Sender , systemMailData.Mail_Title, mailBodyText, new List() , true, mailItems, TTL_Period, packageOrderId); if (result.isFail()) { return (result, null); } return (result, to_receive_mail_doc); } public static async Task createAndSendSystemMailWithMeta( USER_GUID receiverUserGuid, USER_NICKNAME receiverNickname , SystemMailMetaData systemMailData, List contensArguments , List mailItems, Int64 TTL_Period, string packageOrderId = "") { ArgumentNullReferenceCheckHelper.throwIfNull(systemMailData, () => $"systemMailData is null !!! - receiver:{receiverNickname}"); ArgumentNullReferenceCheckHelper.throwIfNull(mailItems, () => $"mailItems is null !!! - receiver:{receiverNickname}, sender:{systemMailData.Sender}"); var result = new Result(); result = await createAndSendSystemMail(receiverUserGuid, receiverNickname , systemMailData.Sender , systemMailData.Mail_Title, systemMailData.Mail_Desc, contensArguments , true, mailItems, TTL_Period, packageOrderId); if (result.isFail()) { return result; } return result; } public static async Task createAndSendSystemMail( USER_GUID receiverUserGuid, USER_NICKNAME receiverNickname , string senderNickName, string title, string text, List contentsArguments , bool isTextByMetaData , List mailItems, Int64 TTL_Period, string packageOrderId = "") { ArgumentNullReferenceCheckHelper.throwIfNull(mailItems, () => $"mailItems is null !!! - receiver:{receiverNickname}, sender:{senderNickName}"); var server_logic = GameServerApp.getServerLogic(); var dynamo_db_client = server_logic.getDynamoDbClient(); NullReferenceCheckHelper.throwIfNull(dynamo_db_client, () => $"dynamo_db_client is null !!! - receiver:{receiverNickname}, sender:{senderNickName}"); var result = new Result(); (result, ReceivedMailDoc? received_mail_doc) = await Mail.createSystemMail( receiverUserGuid , receiverNickname , senderNickName, title, text, contentsArguments, isTextByMetaData , mailItems, TTL_Period, packageOrderId); if (result.isFail()) { return result; } NullReferenceCheckHelper.throwIfNull(received_mail_doc, () => $"received_mail_doc is null !!!"); result = await dynamo_db_client.simpleUpsertDocumentWithDocType(received_mail_doc); if (result.isFail()) { return result; } return result; } public static async Task<(Result, ReceivedMailDoc?)> createSystemMail( USER_GUID receiverUserGuid, USER_NICKNAME receiverNickname , string senderNickName, string title, string text, List contentsArguments, bool isTextByMetaData , List mailItems, Int64 TTL_Period, string packageOrderId = "") { var now = DateTime.UtcNow; var expireDate = DateTimeHelper.MaxTime; if (0 < TTL_Period) { expireDate = now.AddMinutes(TTL_Period); } return await createSystemMail( receiverUserGuid , receiverNickname , senderNickName, title, text, contentsArguments , isTextByMetaData , mailItems, expireDate, packageOrderId); } public static async Task<(Result, ReceivedMailDoc?)> createSystemMail( USER_GUID receiverUserGuid, USER_NICKNAME receiverNickname , string senderNickName, string title, string text, List contentsArguments , bool isTextByMetaData , List mailItems, DateTime expireDate, string packageOrderId = "" ) { ArgumentNullReferenceCheckHelper.throwIfNull(mailItems, () => $"mailItems is null !!! - receiver:{receiverNickname}, sender:{senderNickName}"); var server_logic = GameServerApp.getServerLogic(); var dynamo_db_client = server_logic.getDynamoDbClient(); NullReferenceCheckHelper.throwIfNull(dynamo_db_client, () => $"dynamo_db_client is null !!! - receiver:{receiverNickname}, sender:{senderNickName}"); var result = new Result(); var now = DateTime.UtcNow; string mail_guid = MailHelper.makeMailGuid(now); ReceivedMailDoc? to_create_doc; if (expireDate == DateTimeHelper.MaxTime) { to_create_doc = new ReceivedMailDoc(receiverUserGuid, mail_guid); } else { var ttlTime = DynamoDbClientHelper.makeTTLTimeForDynamoDB(expireDate); to_create_doc = new ReceivedMailDoc(receiverUserGuid, mail_guid, ttlTime); } var mail_attrib = to_create_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(mail_attrib, () => $"mail_attrib is null !!! - receiverUserGuid:{receiverUserGuid}"); mail_attrib.MailGuid = mail_guid; mail_attrib.SenderNickName = senderNickName; mail_attrib.ReceiverNickName = receiverNickname; mail_attrib.ReceiverGuid = receiverUserGuid; mail_attrib.Title = title; mail_attrib.Text = text; mail_attrib.CreateTime = now; mail_attrib.ExpireTime = expireDate; mail_attrib.IsSystemMail = true; mail_attrib.IsRead = false; mail_attrib.IsGetItem = false; mail_attrib.IsTextByMetaData = isTextByMetaData; mail_attrib.packageOrderId = packageOrderId; mail_attrib.ContentsArguments = contentsArguments; foreach (var itemInfo in mailItems) { mail_attrib.ItemList.Add(new ServerCommon.MailItem() { ItemId = itemInfo.ItemId, Count = itemInfo.Count, ProductId = itemInfo.ProductId, isRepeatProduct = itemInfo.isRepeatProduct }); } result = await to_create_doc.newDoc4Query(); if (result.isFail()) { return (result, null); } return (result, to_create_doc); } public override string toBasicString() { return $"{this.getTypeName()}, MailGuid:{getOriginEntityAttribute()?.MailGuid}, SenderNickName:{getOriginEntityAttribute()?.SenderNickName}, ReceiverNickName:{getEntityAttribute()?.ReceiverNickName}, Title:{getEntityAttribute()?.Title}"; } public override string toSummaryString() { return $"{this.getTypeName()}, {getEntityAttribute()?.toBasicString()}"; } public MailInfo toMailData4Client(MailType mailType) { var mail_4_client = new MailInfo(); var mail_attribute = getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(mail_attribute, () => "mail_attribute is null !!!"); mail_4_client.MailKey = mail_attribute.MailGuid; mail_4_client.IsRead = mail_attribute.IsRead == true ? 1 : 0; mail_4_client.IsGetItem = mail_attribute.IsGetItem == true ? 1 : 0; mail_4_client.IsSystemMail = mail_attribute.IsSystemMail == true ? 1 : 0; mail_4_client.NickName = mailType == MailType.ReceivedMail ? mail_attribute.SenderNickName : mail_attribute.ReceiverNickName; mail_4_client.Guid = mailType == MailType.ReceivedMail ? mail_attribute.SenderGuid : mail_attribute.ReceiverGuid; mail_4_client.Title = mail_attribute.Title; mail_4_client.Text = mail_attribute.Text; mail_4_client.CreateTime = Timestamp.FromDateTime(mail_attribute.CreateTime); mail_4_client.ExpireTime = Timestamp.FromDateTime(mail_attribute.ExpireTime); mail_4_client.MailType = (int)mailType; mail_4_client.IsTextByMetaData = mail_attribute.IsTextByMetaData == true ? BoolType.True : BoolType.False; mail_4_client.IsPermanentMail = mail_attribute.ExpireTime == DateTimeHelper.MaxTime ? BoolType.True : BoolType.False; mail_4_client.ContentsArguments.AddRange(mail_attribute.ContentsArguments); foreach (var mailItemInfo in mail_attribute.ItemList) { var mailItem = new MailItem(); mailItem.ItemId = (int)mailItemInfo.ItemId; mailItem.Count = mailItemInfo.Count; mail_4_client.ItemList.Add(mailItem); } return mail_4_client; } public static async Task<(Result, ReceivedMailDoc?)> createSystemMailDocByMOS2User( USER_GUID receiverUserGuid, USER_NICKNAME receiverNickname , string senderNickName, string title, string text, List mailItems) { var server_logic = GameServerApp.getServerLogic(); var dynamo_db_client = server_logic.getDynamoDbClient(); NullReferenceCheckHelper.throwIfNull(dynamo_db_client, () => $"dynamo_db_client is null !!! - receiver:{receiverNickname}, sender:{senderNickName}"); var result = new Result(); var now = DateTime.UtcNow; string mail_guid = MailHelper.makeMailGuid(now); var expireDate = DateTime.UtcNow.AddMinutes(MetaHelper.GameConfigMeta.SystemMailStoragePeriod); var ttlTime = DynamoDbClientHelper.makeTTLTimeForDynamoDB(expireDate); var to_create_doc = new ReceivedMailDoc(receiverUserGuid, mail_guid, ttlTime); var mail_attrib = to_create_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(mail_attrib, () => $"mail_attrib is null !!! - receiverUserGuid:{receiverUserGuid}"); mail_attrib.MailGuid = mail_guid; mail_attrib.SenderNickName = senderNickName; mail_attrib.ReceiverNickName = receiverNickname; mail_attrib.ReceiverGuid = receiverUserGuid; mail_attrib.Title = title; mail_attrib.Text = text; mail_attrib.CreateTime = now; mail_attrib.ExpireTime = expireDate; mail_attrib.IsSystemMail = true; mail_attrib.IsRead = false; mail_attrib.IsGetItem = false; mail_attrib.IsTextByMetaData = false; mail_attrib.packageOrderId = ""; foreach (var itemInfo in mailItems) { mail_attrib.ItemList.Add(new ServerCommon.MailItem() { ItemId = itemInfo.ItemId, Count = itemInfo.Count, ProductId = itemInfo.ProductId, isRepeatProduct = itemInfo.isRepeatProduct }); } result = await to_create_doc.newDoc4Query(); if (result.isFail()) { return (result, null); } return (result, to_create_doc); } } }