초기커밋
This commit is contained in:
1425
GameServer/Contents/Mail/Action/MailAction.cs
Normal file
1425
GameServer/Contents/Mail/Action/MailAction.cs
Normal file
File diff suppressed because it is too large
Load Diff
139
GameServer/Contents/Mail/DbQuery/DBQMailReadAll.cs
Normal file
139
GameServer/Contents/Mail/DbQuery/DBQMailReadAll.cs
Normal file
@@ -0,0 +1,139 @@
|
||||
using ServerCommon;
|
||||
using ServerCore; using ServerBase;
|
||||
|
||||
namespace GameServer
|
||||
{
|
||||
public class DBQMailReadAll : QueryExecutorBase
|
||||
{
|
||||
private string m_combination_key_for_pk = string.Empty;
|
||||
|
||||
private string m_sent_pk = string.Empty;
|
||||
private string m_received_pk = string.Empty;
|
||||
|
||||
private readonly Dictionary<MailType, List<MailDoc>> m_to_read_mail_docs = new();
|
||||
|
||||
public DBQMailReadAll(string combinationKeyForPK)
|
||||
: base(typeof(DBQMailReadAll).Name)
|
||||
{
|
||||
m_combination_key_for_pk = combinationKeyForPK;
|
||||
|
||||
m_to_read_mail_docs.Add(MailType.ReceivedMail, new List<MailDoc>());
|
||||
m_to_read_mail_docs.Add(MailType.SentMail, new List<MailDoc>());
|
||||
}
|
||||
|
||||
//=====================================================================================
|
||||
// DB 쿼리 직전에 준비해야 할 로직들을 작성한다.
|
||||
//=====================================================================================
|
||||
public override Task<Result> onPrepareQuery()
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var owner = getOwner();
|
||||
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
|
||||
|
||||
var sent_doc = new SentMailDoc();
|
||||
sent_doc.setCombinationKeyForPK(m_combination_key_for_pk);
|
||||
|
||||
var error_code = sent_doc.onApplyPKSK();
|
||||
if (error_code.isFail())
|
||||
{
|
||||
err_msg = $"Failed to onApplyPKSK() !!! : {error_code.toBasicString()} - {toBasicString()}, {owner.toBasicString()}";
|
||||
result.setFail(error_code, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
return Task.FromResult(result);
|
||||
}
|
||||
|
||||
m_sent_pk = sent_doc.getPK();
|
||||
var received_doc = new ReceivedMailDoc();
|
||||
received_doc.setCombinationKeyForPK(m_combination_key_for_pk);
|
||||
|
||||
error_code = received_doc.onApplyPKSK();
|
||||
if (error_code.isFail())
|
||||
{
|
||||
err_msg = $"Failed to onApplyPKSK() !!! : {error_code.toBasicString()} - {toBasicString()}, {owner.toBasicString()}";
|
||||
result.setFail(error_code, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
return Task.FromResult(result);
|
||||
}
|
||||
|
||||
m_received_pk = received_doc.getPK();
|
||||
return Task.FromResult(result);
|
||||
}
|
||||
|
||||
//=====================================================================================
|
||||
// onPrepareQuery()를 성공할 경우 호출된다.
|
||||
//=====================================================================================
|
||||
public override async Task<Result> onQuery()
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var owner = getOwner();
|
||||
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
|
||||
|
||||
var query_batch = getQueryBatch();
|
||||
NullReferenceCheckHelper.throwIfNull(query_batch, () => $"query_batch is null !!!");
|
||||
|
||||
var db_connector = query_batch.getDynamoDbConnector();
|
||||
var sent_query_config = db_connector.makeQueryConfigForReadByPKOnly(m_sent_pk);
|
||||
|
||||
var mail_action = owner.getEntityAction<MailAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(mail_action, () => $"mail_action is null !!!");
|
||||
|
||||
(result, var sent_read_docs) = await db_connector.simpleQueryDocTypesWithQueryOperationConfig<SentMailDoc>(sent_query_config, eventTid: query_batch.getTransId());
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
var received_query_config = db_connector.makeQueryConfigForReadByPKOnly(m_received_pk);
|
||||
|
||||
(result, var received_read_docs) = await db_connector.simpleQueryDocTypesWithQueryOperationConfig<ReceivedMailDoc>(received_query_config, eventTid: query_batch.getTransId());
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
result = await mail_action.AddMailFromDocs(sent_read_docs);
|
||||
if (result.isFail()) return result;
|
||||
|
||||
if (m_to_read_mail_docs.TryGetValue(MailType.SentMail, out var sentMailList))
|
||||
{
|
||||
sentMailList.AddRange(sent_read_docs);
|
||||
}
|
||||
|
||||
result = await mail_action.AddMailFromDocs(received_read_docs);
|
||||
if (result.isFail()) return result;
|
||||
|
||||
if (m_to_read_mail_docs.TryGetValue(MailType.ReceivedMail, out var receivedMailList))
|
||||
{
|
||||
receivedMailList.AddRange(received_read_docs);
|
||||
}
|
||||
|
||||
return await Task.FromResult(result);
|
||||
}
|
||||
|
||||
public Dictionary<MailType, List<MailDoc>> getToReadItemDocs() => m_to_read_mail_docs;
|
||||
|
||||
//=====================================================================================
|
||||
// DB 쿼리를 성공하고, doFnCommit()가 QueryResultType.NotCalledQueryFunc를 반환할 경우 호출된다.
|
||||
//=====================================================================================
|
||||
public override async Task onQueryResponseCommit()
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
return;
|
||||
}
|
||||
|
||||
//=====================================================================================
|
||||
// DB 쿼리를 실패하고, doFnRollback()가 QueryResultType.NotCalledQueryFunc를 반환할 경우 호출된다.
|
||||
//=====================================================================================
|
||||
public override async Task onQueryResponseRollback(Result errorResult)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
return;
|
||||
}
|
||||
|
||||
public new Player? getOwner() => getQueryBatch()?.getLogActor() as Player;
|
||||
}
|
||||
}
|
||||
105
GameServer/Contents/Mail/Helper/MailHelper.cs
Normal file
105
GameServer/Contents/Mail/Helper/MailHelper.cs
Normal file
@@ -0,0 +1,105 @@
|
||||
using Pipelines.Sockets.Unofficial.Arenas;
|
||||
using ServerCommon;
|
||||
using ServerCore; using ServerBase;
|
||||
|
||||
using USER_GUID = System.String;
|
||||
using MAIL_GUID = System.String;
|
||||
using GameServer.PacketHandler;
|
||||
using MetaAssets;
|
||||
|
||||
namespace GameServer
|
||||
{
|
||||
public static class MailHelper
|
||||
{
|
||||
public static bool isDeletableMail(this MailAttribute mailAttribute)
|
||||
{
|
||||
var has_creatable_item = false;
|
||||
foreach (var mail_item in mailAttribute.ItemList)
|
||||
{
|
||||
var item_meta_id = mail_item.ItemId;
|
||||
if (false == MetaData.Instance._ItemTable.TryGetValue((Int32)item_meta_id, out var found_item_meta_data))
|
||||
{
|
||||
var err_msg = $"Not found ItemMeta !!! : itemMetaId:{item_meta_id} - {mailAttribute.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
return false;
|
||||
}
|
||||
|
||||
// 메타버스 서버에서 우편에 첨부 아이템이 생성 가능한 아이템이 존재할 경우
|
||||
// 우편을 삭제할 수 없다 !!!
|
||||
if(true == found_item_meta_data.isCreatableItem())
|
||||
{
|
||||
has_creatable_item = true;
|
||||
}
|
||||
}
|
||||
|
||||
if ( mailAttribute.ItemList.Count > 0 && mailAttribute.IsGetItem == false
|
||||
&& true == has_creatable_item )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static string makeMailGuid(DateTime now)
|
||||
{
|
||||
var guid = Guid.NewGuid().ToString("N");
|
||||
return $"{now.ToString("yyyy/MM/dd/HH:mm:ss:ff")}-{guid}";
|
||||
}
|
||||
|
||||
public static void toAttrib(this MailAttribute mailAttribute, MailAttrib mailAttrib)
|
||||
{
|
||||
mailAttrib.MailGuid = mailAttribute.MailGuid;
|
||||
mailAttrib.IsRead = mailAttribute.IsRead;
|
||||
mailAttrib.IsGetItem = mailAttribute.IsGetItem;
|
||||
mailAttrib.IsSystemMail = mailAttribute.IsSystemMail;
|
||||
mailAttrib.SenderNickName = mailAttribute.SenderNickName;
|
||||
mailAttrib.SenderGuid = mailAttribute.SenderGuid;
|
||||
mailAttrib.ReceiverNickName = mailAttribute.ReceiverNickName;
|
||||
mailAttrib.ReceiverGuid = mailAttribute.ReceiverGuid;
|
||||
mailAttrib.Title = mailAttribute.Title;
|
||||
mailAttrib.Text = mailAttribute.Text;
|
||||
mailAttrib.CreateTime = mailAttribute.CreateTime;
|
||||
mailAttrib.ExpireTime = mailAttribute.ExpireTime;
|
||||
|
||||
mailAttrib.ItemList = mailAttribute.ItemList;
|
||||
mailAttrib.ItemList = mailAttribute.ItemList.Select(x => new ServerCommon.MailItem() { ItemId = x.ItemId, Count = x.Count }).ToList();
|
||||
}
|
||||
|
||||
public static ReceivedMailDoc CreateReceivedMail(USER_GUID to_user_guid, MAIL_GUID mail_guid)
|
||||
{
|
||||
var ttlTime = MetaHelper.GameConfigMeta.UserMailStoragePeriod;
|
||||
var received_mail_doc = new ReceivedMailDoc(to_user_guid, mail_guid, ttlTime);
|
||||
return received_mail_doc;
|
||||
}
|
||||
|
||||
public async static Task<ReceivedMailDoc?> CreateReceivedMailBySendMail(USER_GUID to_user_guid, MAIL_GUID mail_guid, MailAttribute send_mail_attribute)
|
||||
{
|
||||
var ttlTime = DynamoDbClientHelper.makeTTLTimeForDynamoDB(send_mail_attribute.ExpireTime);
|
||||
//var ttlTime = MetaHelper.GameConfigMeta.UserMailStoragePeriod;
|
||||
var received_mail_doc = new ReceivedMailDoc(to_user_guid, mail_guid, ttlTime);
|
||||
|
||||
var received_mail_attrib = received_mail_doc.getAttrib<MailAttrib>();
|
||||
if (received_mail_attrib == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
send_mail_attribute.toAttrib(received_mail_attrib);
|
||||
received_mail_attrib.ExpireTime = DateTimeHelper.Current.AddSeconds(MetaHelper.GameConfigMeta.UserMailStoragePeriod);
|
||||
var result = await received_mail_doc.newDoc4Query();
|
||||
if (result.isFail())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return received_mail_doc;
|
||||
}
|
||||
|
||||
public async static Task loadSystemMail(this Player player, bool isFirstLogin)
|
||||
{
|
||||
var mail_action = player.getEntityAction<MailAction>();
|
||||
await mail_action.checkSystemMail();
|
||||
}
|
||||
}
|
||||
}
|
||||
416
GameServer/Contents/Mail/Mail.cs
Normal file
416
GameServer/Contents/Mail/Mail.cs
Normal file
@@ -0,0 +1,416 @@
|
||||
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<Result> 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<MailAttribute>();
|
||||
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<MailAttribute>();
|
||||
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<ServerCommon.MailItem> 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<string>()
|
||||
, 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<string> contensArguments
|
||||
, List<ServerCommon.MailItem> 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<ServerCommon.MailItem> 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<string>()
|
||||
, 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<string> contentsArguments
|
||||
, List<ServerCommon.MailItem> 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<ServerCommon.MailItem> 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<string>()
|
||||
, true, mailItems, TTL_Period, packageOrderId);
|
||||
if (result.isFail())
|
||||
{
|
||||
return (result, null);
|
||||
}
|
||||
|
||||
return (result, to_receive_mail_doc);
|
||||
}
|
||||
|
||||
public static async Task<Result> createAndSendSystemMailWithMeta( USER_GUID receiverUserGuid, USER_NICKNAME receiverNickname
|
||||
, SystemMailMetaData systemMailData, List<string> contensArguments
|
||||
, List<ServerCommon.MailItem> 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<Result> createAndSendSystemMail( USER_GUID receiverUserGuid, USER_NICKNAME receiverNickname
|
||||
, string senderNickName, string title, string text, List<string> contentsArguments
|
||||
, bool isTextByMetaData
|
||||
, List<ServerCommon.MailItem> 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<ReceivedMailDoc>(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<string> contentsArguments, bool isTextByMetaData
|
||||
, List<ServerCommon.MailItem> 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<string> contentsArguments
|
||||
, bool isTextByMetaData
|
||||
, List<ServerCommon.MailItem> 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<MailAttrib>();
|
||||
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<MailAttribute>()?.MailGuid}, SenderNickName:{getOriginEntityAttribute<MailAttribute>()?.SenderNickName}, ReceiverNickName:{getEntityAttribute<MailAttribute>()?.ReceiverNickName}, Title:{getEntityAttribute<MailAttribute>()?.Title}";
|
||||
}
|
||||
|
||||
public override string toSummaryString()
|
||||
{
|
||||
return $"{this.getTypeName()}, {getEntityAttribute<MailAttribute>()?.toBasicString()}";
|
||||
}
|
||||
|
||||
public MailInfo toMailData4Client(MailType mailType)
|
||||
{
|
||||
var mail_4_client = new MailInfo();
|
||||
|
||||
var mail_attribute = getEntityAttribute<MailAttribute>();
|
||||
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<ServerCommon.MailItem> 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<MailAttrib>();
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
98
GameServer/Contents/Mail/MailCheat.cs
Normal file
98
GameServer/Contents/Mail/MailCheat.cs
Normal file
@@ -0,0 +1,98 @@
|
||||
using ServerCommon;
|
||||
using ServerCore; using ServerBase;
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
[ChatCommandAttribute("mailsetremainedtime", typeof(ChatCommandMailSetRemainedTime), AuthAdminLevelType.Developer, AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)]
|
||||
internal class ChatCommandMailSetRemainedTime : ChatCommandBase
|
||||
{
|
||||
#pragma warning disable CS1998 // 이 비동기 메서드에는 'await' 연산자가 없으며 메서드가 동시에 실행됩니다.
|
||||
public override async Task invoke(Player player, string token, string[] args)
|
||||
#pragma warning restore CS1998 // 이 비동기 메서드에는 'await' 연산자가 없으며 메서드가 동시에 실행됩니다.
|
||||
{
|
||||
Log.getLogger().info($"HandleMailDecreaseTime");
|
||||
|
||||
if (args.Length < 2)
|
||||
{
|
||||
Log.getLogger().error($"Invalid Argument");
|
||||
return;
|
||||
}
|
||||
|
||||
// var session = ClientSessionManager.Instance.GetSession(player.HostId);
|
||||
//
|
||||
// if (session is null)
|
||||
// {
|
||||
// Log.getLogger().error($"session is null.");
|
||||
// return;
|
||||
// }
|
||||
// try
|
||||
// {
|
||||
// ServerErrorCode errorCode = await session.ownedMail.SetRemainedTime(int.Parse(args[0]) == 0 ? false : true, int.Parse(args[1]));
|
||||
// if (errorCode != ServerErrorCode.Success)
|
||||
// {
|
||||
// Log.getLogger().error($"HandleMailDecreaseTime Cheat Failed.");
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
// catch (Exception ex)
|
||||
// {
|
||||
// Log.getLogger().error($"{ex}");
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[ChatCommandAttribute("mailsendtome", typeof(ChatCommandMailSendToMe), AuthAdminLevelType.Developer, AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)]
|
||||
internal class ChatCommandMailSendToMe : ChatCommandBase
|
||||
{
|
||||
public override async Task invoke(Player player, string token, string[] args)
|
||||
{
|
||||
Log.getLogger().info($"HandleMailSendToMe");
|
||||
|
||||
if (args.Length < 1)
|
||||
{
|
||||
Log.getLogger().error($"Invalid Argument");
|
||||
return;
|
||||
}
|
||||
|
||||
if (int.TryParse(args[0], out int mailCount) == false)
|
||||
return;
|
||||
|
||||
int permanent = 0;
|
||||
|
||||
if (args.Length < 2 || int.TryParse(args[1], out permanent) == false)
|
||||
permanent = 0;
|
||||
|
||||
var mail_action = player.getEntityAction<MailAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(mail_action, () => $"mail_action is null !!!- {player.toBasicString()}");
|
||||
|
||||
await mail_action.cheatSendMailToMe(mailCount, permanent == 0 ? false : true);
|
||||
}
|
||||
}
|
||||
|
||||
[ChatCommandAttribute("mailsendcountinit", typeof(ChatCommandMailSendCountInit), AuthAdminLevelType.Developer, AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)]
|
||||
internal class ChatCommandMailSendCountInit : ChatCommandBase
|
||||
{
|
||||
public override async Task invoke(Player player, string token, string[] args)
|
||||
{
|
||||
Log.getLogger().info($"HandleMailSendCountInit");
|
||||
|
||||
var mail_action = player.getEntityAction<MailAction>();
|
||||
await mail_action.CheatMailSendUpdateDay();
|
||||
}
|
||||
}
|
||||
|
||||
[ChatCommandAttribute("addsystemmail", typeof(ChatCommandAddSystemMail), AuthAdminLevelType.Developer, AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)]
|
||||
internal class ChatCommandAddSystemMail : ChatCommandBase
|
||||
{
|
||||
public override async Task invoke(Player player, string token, string[] args)
|
||||
{
|
||||
Log.getLogger().info($"HandleAddSystemMail");
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
|
||||
var systemMailManager = server_logic.getSystemMailManager();
|
||||
await systemMailManager.CheatFuncSaveSystemMetaMail();
|
||||
systemMailManager.AllPlayerSystemMailNoti();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,102 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
using static ClientToGameRes.Types;
|
||||
|
||||
|
||||
namespace GameServer.PacketHandler;
|
||||
|
||||
|
||||
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.DeleteMailReq), typeof(DeleteMailPacketHandler), typeof(GameLoginListener))]
|
||||
public class DeleteMailPacketHandler : PacketRecvHandler
|
||||
{
|
||||
public static bool send_S2C_ACK_DELETE_MAIL(Player player, Result result)
|
||||
{
|
||||
var ack_packet = new ClientToGame();
|
||||
ack_packet.Response = new ClientToGameRes();
|
||||
|
||||
ack_packet.Response.ErrorCode = result.ErrorCode;
|
||||
ack_packet.Response.DeleteMailRes = new DeleteMailRes();
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(player, ack_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override async Task<Result> onProcessPacket(ISession entityWithSession, IMessage recvMessage)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var entity_player = entityWithSession as Player;
|
||||
ArgumentNullException.ThrowIfNull(entity_player);
|
||||
|
||||
var mail_action = entity_player.getEntityAction<MailAction>();
|
||||
if (mail_action == null)
|
||||
{
|
||||
err_msg = $"Failed to get mail action : {nameof(MailAction)}";
|
||||
result.setFail(ServerErrorCode.EntityActionNotFound, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
send_S2C_ACK_DELETE_MAIL(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var game_msg = recvMessage as ClientToGame;
|
||||
if (game_msg == null)
|
||||
{
|
||||
err_msg = $"Failed to cast ClientToGame !!! : {nameof(ClientToGame.Request.DeleteMailReq)}";
|
||||
result.setFail(ServerErrorCode.ClassTypeCastIsNull, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
send_S2C_ACK_DELETE_MAIL(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var request = game_msg.Request.DeleteMailReq;
|
||||
|
||||
if(EnumHelper.isDefined<MailType>(request.MailType) == false)
|
||||
{
|
||||
err_msg = $"is Not Defined MailType !!! MailType : {request.MailType} - {entity_player.toBasicString()}";
|
||||
result.setFail(ServerErrorCode.ServerTypeInvalid, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
send_S2C_ACK_DELETE_MAIL(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var mail_type = (MailType)request.MailType;
|
||||
|
||||
result = await mail_action.DeleteMail(request.MailKey, mail_type);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to DeleteMail() !!! : {result.toBasicString()} - {entity_player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public override async Task onProcessPacketException(ISession entityWithSession, IMessage recvMessage
|
||||
, Result errorResult)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
var player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!! - {entityWithSession.toBasicString()}");
|
||||
|
||||
send_S2C_ACK_DELETE_MAIL(player, errorResult);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
using static ClientToGameRes.Types;
|
||||
|
||||
|
||||
namespace GameServer.PacketHandler;
|
||||
|
||||
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.GetItemsMailReq), typeof(GetItemsMailPacketHandler), typeof(GameLoginListener))]
|
||||
public class GetItemsMailPacketHandler : PacketRecvHandler
|
||||
{
|
||||
public static bool send_S2C_ACK_GET_ITEMS_MAIL(Player player, Result result, CommonResult? commonResult = null)
|
||||
{
|
||||
var ack_packet = new ClientToGame();
|
||||
ack_packet.Response = new ClientToGameRes();
|
||||
|
||||
ack_packet.Response.ErrorCode = result.ErrorCode;
|
||||
ack_packet.Response.GetItemsMailRes = new GetItemsMailRes();
|
||||
|
||||
if (result.isSuccess() && commonResult != null)
|
||||
{
|
||||
ack_packet.Response.GetItemsMailRes.CommonResult = commonResult;
|
||||
}
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(player, ack_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override async Task<Result> onProcessPacket(ISession entityWithSession, IMessage recvMessage)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var entity_player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(entity_player, () => "player is null !!!");
|
||||
|
||||
var mail_action = entity_player.getEntityAction<MailAction>();
|
||||
if (mail_action == null)
|
||||
{
|
||||
err_msg = $"Failed to get mail action : {nameof(MailAction)}";
|
||||
result.setFail(ServerErrorCode.EntityActionNotFound, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
send_S2C_ACK_GET_ITEMS_MAIL(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var game_msg = recvMessage as ClientToGame;
|
||||
if (game_msg == null)
|
||||
{
|
||||
err_msg = $"Failed to cast ClientToGame !!! : {nameof(ClientToGame.Request.GetItemsMailReq)}";
|
||||
result.setFail(ServerErrorCode.ClassTypeCastIsNull, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
send_S2C_ACK_GET_ITEMS_MAIL(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
var request = game_msg.Request.GetItemsMailReq;
|
||||
result = await mail_action.GetItemsReceivedMail(request.MailKey);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to GetItemsReceivedMail() !!! : {result.toBasicString()} - {entity_player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public override async Task onProcessPacketException(ISession entityWithSession, IMessage recvMessage
|
||||
, Result errorResult)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
var player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!! - {entityWithSession.toBasicString()}");
|
||||
|
||||
send_S2C_ACK_GET_ITEMS_MAIL(player, errorResult);
|
||||
}
|
||||
}
|
||||
111
GameServer/Contents/Mail/PacketHandler/GetMailPacketHandler.cs
Normal file
111
GameServer/Contents/Mail/PacketHandler/GetMailPacketHandler.cs
Normal file
@@ -0,0 +1,111 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
using static ClientToGameRes.Types;
|
||||
|
||||
|
||||
namespace GameServer.PacketHandler;
|
||||
|
||||
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.GetMailReq), typeof(GetMailPacketHandler), typeof(GameLoginListener))]
|
||||
public class GetMailPacketHandler : PacketRecvHandler
|
||||
{
|
||||
public static bool send_S2C_ACK_GET_MAIL(Player player, Result result, List<Mail>? new_mail_list = null, MailType mailType = MailType.None, int sendCount = 0)
|
||||
{
|
||||
var ack_packet = new ClientToGame();
|
||||
ack_packet.Response = new ClientToGameRes();
|
||||
|
||||
ack_packet.Response.ErrorCode = result.ErrorCode;
|
||||
ack_packet.Response.GetMailRes = new GetMailRes();
|
||||
|
||||
ack_packet.Response.GetMailRes.MailType = (int)mailType;
|
||||
ack_packet.Response.GetMailRes.SendCount = sendCount;
|
||||
|
||||
if (new_mail_list != null)
|
||||
{
|
||||
foreach (var new_mail in new_mail_list)
|
||||
{
|
||||
ack_packet.Response.GetMailRes.MailList.Add(new_mail.toMailData4Client(mailType));
|
||||
}
|
||||
}
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(player, ack_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override async Task<Result> onProcessPacket(ISession entityWithSession, IMessage recvMessage)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var entity_player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(entity_player, () => "player is null !!!");
|
||||
|
||||
var mail_action = entity_player.getEntityAction<MailAction>();
|
||||
if (mail_action == null)
|
||||
{
|
||||
err_msg = $"Failed to get mail action : {nameof(MailAction)}";
|
||||
result.setFail(ServerErrorCode.EntityActionNotFound, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
send_S2C_ACK_GET_MAIL(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var game_msg = recvMessage as ClientToGame;
|
||||
if (game_msg == null)
|
||||
{
|
||||
err_msg = $"Failed to cast ClientToGame !!! : {nameof(ClientToGame.Request.GetMailReq)}";
|
||||
result.setFail(ServerErrorCode.ClassTypeCastIsNull, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
send_S2C_ACK_GET_MAIL(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var request = game_msg.Request.GetMailReq;
|
||||
|
||||
if(EnumHelper.isDefined<MailType>(request.MailType) == false)
|
||||
{
|
||||
err_msg = $"is Not Defined MailType !!! MailType : {request.MailType} - {entity_player.toBasicString()}";
|
||||
result.setFail(ServerErrorCode.ServerTypeInvalid, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
send_S2C_ACK_GET_MAIL(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var mail_type = (MailType)request.MailType;
|
||||
|
||||
result = await mail_action.ProcessGetMail(mail_type);
|
||||
if(result.isFail() == true)
|
||||
{
|
||||
err_msg = $"Failed to ProcessGetMail() !!! : {result.toBasicString()} - {entity_player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public override async Task onProcessPacketException(ISession entityWithSession, IMessage recvMessage
|
||||
, Result errorResult)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
var player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!! - {entityWithSession.toBasicString()}");
|
||||
|
||||
send_S2C_ACK_GET_MAIL(player, errorResult);
|
||||
}
|
||||
}
|
||||
91
GameServer/Contents/Mail/PacketHandler/MailNotifyHelper.cs
Normal file
91
GameServer/Contents/Mail/PacketHandler/MailNotifyHelper.cs
Normal file
@@ -0,0 +1,91 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
|
||||
|
||||
using Nettention.Proud;
|
||||
|
||||
|
||||
using ServerCore; using ServerBase;
|
||||
using ServerCommon;
|
||||
|
||||
|
||||
using static ClientToGameRes.Types;
|
||||
using static ServerMessage.Types;
|
||||
|
||||
|
||||
|
||||
using USER_GUID = System.String;
|
||||
|
||||
|
||||
|
||||
namespace GameServer
|
||||
{
|
||||
public static class MailNotifyHelper
|
||||
{
|
||||
public static void send_GS2GS_NTF_NEW_MAIL(string targetServer, USER_GUID targetUserGuid)
|
||||
{
|
||||
ConditionValidCheckHelper.throwIfFalseWithCondition( () => true != targetServer.isNullOrWhiteSpace()
|
||||
, () => $"targetServer is NullOrWhiteSpace !!! - targetServer:{targetServer}, targetUserGuid:{targetUserGuid}");
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
|
||||
var rabbit_mq_4_game = server_logic.getRabbitMqConnector() as RabbitMQ4Game;
|
||||
NullReferenceCheckHelper.throwIfNull(rabbit_mq_4_game, () => $"rabbit_mq_4_game is null !! - targetServer:{targetServer}, targetUserGuid:{targetUserGuid}");
|
||||
|
||||
var ntf_packet = new ServerMessage();
|
||||
var ntf_recv_mail = new ReceiveMailNoti();
|
||||
ntf_packet.ReceiveMailNoti = ntf_recv_mail;
|
||||
|
||||
ntf_recv_mail.AccountGuid = targetUserGuid;
|
||||
|
||||
rabbit_mq_4_game.SendMessage(targetServer, ntf_packet);
|
||||
}
|
||||
|
||||
|
||||
public static bool send_S2C_NTF_NEW_MAIL(this Player player)
|
||||
{
|
||||
var mail_action = player.getEntityAction<MailAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(mail_action, () => $"mail_action is null !!! - {player.toBasicString()}");
|
||||
if (mail_action.isNewReceivedMail() == false)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
var noti_packet = new ClientToGame();
|
||||
noti_packet.Message = new();
|
||||
noti_packet.Message.NewMailNoti = new();
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(player, noti_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static bool send_S2C_NTF_NEW_SYSTEM_MAIL_MAIL(this Player player)
|
||||
{
|
||||
var mail_action = player.getEntityAction<MailAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(mail_action, () => $"mail_action is null !!! - {player.toBasicString()}");
|
||||
if (mail_action.isNewSystemMail() == false)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
var noti_packet = new ClientToGame();
|
||||
noti_packet.Message = new();
|
||||
noti_packet.Message.NewMailNoti = new();
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(player, noti_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
using static ClientToGameReq.Types;
|
||||
using static ClientToGameRes.Types;
|
||||
|
||||
|
||||
namespace GameServer.PacketHandler;
|
||||
|
||||
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.ReadMailReq), typeof(ReadMailPacketHandler), typeof(GameLoginListener))]
|
||||
public class ReadMailPacketHandler : PacketRecvHandler
|
||||
{
|
||||
public static bool send_S2C_ACK_READ_MAIL(Player player, Result result)
|
||||
{
|
||||
var ack_packet = new ClientToGame();
|
||||
ack_packet.Response = new ClientToGameRes();
|
||||
|
||||
ack_packet.Response.ErrorCode = result.ErrorCode;
|
||||
ack_packet.Response.ReadMailRes = new ReadMailRes();
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(player, ack_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override async Task<Result> onProcessPacket(ISession entityWithSession, IMessage recvMessage)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var entity_player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(entity_player, () => $"entity_player is null !!!");
|
||||
|
||||
var mail_action = entity_player.getEntityAction<MailAction>();
|
||||
if (mail_action == null)
|
||||
{
|
||||
err_msg = $"Failed to get mail action : {nameof(MailAction)}";
|
||||
result.setFail(ServerErrorCode.EntityActionNotFound, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
send_S2C_ACK_READ_MAIL(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var game_msg = recvMessage as ClientToGame;
|
||||
if (game_msg == null)
|
||||
{
|
||||
err_msg = $"Failed to cast ClientToGame !!! : {nameof(ClientToGame.Request.ReadMailReq)}";
|
||||
result.setFail(ServerErrorCode.ClassTypeCastIsNull, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
send_S2C_ACK_READ_MAIL(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var request = game_msg.Request.ReadMailReq;
|
||||
|
||||
result = await mail_action.ReadReceivedMail(request.MailKey);
|
||||
if(result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
public override async Task onProcessPacketException(ISession entityWithSession, IMessage recvMessage
|
||||
, Result errorResult)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
var player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!! - {entityWithSession.toBasicString()}");
|
||||
|
||||
send_S2C_ACK_READ_MAIL(player, errorResult);
|
||||
}
|
||||
}
|
||||
148
GameServer/Contents/Mail/PacketHandler/SendMailPacketHandler.cs
Normal file
148
GameServer/Contents/Mail/PacketHandler/SendMailPacketHandler.cs
Normal file
@@ -0,0 +1,148 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
using static ClientToGameReq.Types;
|
||||
using static ClientToGameRes.Types;
|
||||
|
||||
|
||||
namespace GameServer.PacketHandler;
|
||||
|
||||
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.SendMailReq), typeof(SendMailPacketHandler), typeof(GameLoginListener))]
|
||||
public class SendMailPacketHandler : PacketRecvHandler
|
||||
{
|
||||
public static bool send_S2C_ACK_SEND_MAIL(Player player, Result result, Mail? sent_mail = null)
|
||||
{
|
||||
var ack_packet = new ClientToGame();
|
||||
ack_packet.Response = new ClientToGameRes();
|
||||
|
||||
ack_packet.Response.ErrorCode = result.ErrorCode;
|
||||
ack_packet.Response.SendMailRes = new SendMailRes();
|
||||
|
||||
if(sent_mail != null)
|
||||
{
|
||||
ack_packet.Response.SendMailRes.MailInfo = new();
|
||||
ack_packet.Response.SendMailRes.MailInfo = sent_mail.toMailData4Client(MailType.SentMail);
|
||||
}
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(player, ack_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override async Task<Result> onProcessPacket(ISession entityWithSession, IMessage recvMessage)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var entity_player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(entity_player, () => $"entity_player is null !!!");
|
||||
|
||||
var mail_action = entity_player.getEntityAction<MailAction>();
|
||||
if (mail_action == null)
|
||||
{
|
||||
err_msg = $"Failed to get mail action : {nameof(MailAction)}";
|
||||
result.setFail(ServerErrorCode.EntityActionNotFound, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
send_S2C_ACK_SEND_MAIL(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var game_msg = recvMessage as ClientToGame;
|
||||
if (game_msg == null)
|
||||
{
|
||||
err_msg = $"Failed to cast ClientToGame !!! : {nameof(ClientToGame.Request.SendMailReq)}";
|
||||
result.setFail(ServerErrorCode.ClassTypeCastIsNull, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
send_S2C_ACK_SEND_MAIL(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var request = game_msg.Request.SendMailReq;
|
||||
string to_user_guid = request.ToGuid;
|
||||
|
||||
if(to_user_guid == string.Empty)
|
||||
{
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
var dynamo_db_client = server_logic.getDynamoDbClient();
|
||||
|
||||
(result, var nickname_attrib) = await NicknameHelper.findNickname(request.ToNickName);
|
||||
if (result.isFail())
|
||||
{
|
||||
send_S2C_ACK_SEND_MAIL(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
NullReferenceCheckHelper.throwIfNull(nickname_attrib, () => $"nickname_attrib is null !!!");
|
||||
|
||||
to_user_guid = nickname_attrib.UserGuid;
|
||||
}
|
||||
|
||||
var user_block_action = entity_player.getEntityAction<BlockUserAgentAction>();
|
||||
if (user_block_action == null)
|
||||
{
|
||||
err_msg = $"Failed to get user block action : {nameof(BlockUserAgentAction)}";
|
||||
result.setFail(ServerErrorCode.EntityActionNotFound, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
send_S2C_ACK_SEND_MAIL(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
//내가 차단한 유저면 보내지 않는다.
|
||||
if (user_block_action.isBlockUser(to_user_guid))
|
||||
{
|
||||
err_msg = $"Failed send mail with blocked user.";
|
||||
result.setFail(ServerErrorCode.MailBlockUserCannotSend, err_msg);
|
||||
send_S2C_ACK_SEND_MAIL(entity_player, result);
|
||||
}
|
||||
|
||||
//상대방이 차단한경우 상대방에겐 보내지 않고 정상 처리 되도록
|
||||
(result, bool isblocked) = await user_block_action.amIBockedFromOthers(to_user_guid);
|
||||
if (result.isFail())
|
||||
{
|
||||
send_S2C_ACK_SEND_MAIL(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
if (isblocked == true)
|
||||
{
|
||||
send_S2C_ACK_SEND_MAIL(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
result = await mail_action.trySendMail(request.ToNickName, to_user_guid, request.Title, request.MailText);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to trySendMail() !!! : {result.toBasicString()} - {entity_player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
send_S2C_ACK_SEND_MAIL(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
await QuestManager.It.QuestCheck(entity_player, new QuestMail(EQuestEventTargetType.MAIL, EQuestEventNameType.SENDED, request.MailText));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public override async Task onProcessPacketException(ISession entityWithSession, IMessage recvMessage
|
||||
, Result errorResult)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
var player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!! - {entityWithSession.toBasicString()}");
|
||||
|
||||
send_S2C_ACK_SEND_MAIL(player, errorResult);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,173 @@
|
||||
using System.Text;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
using META_ID = System.UInt32;
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
|
||||
public class RabbitMailSendHandler
|
||||
{
|
||||
public async Task MOS2GS_mailSend(ServerMessage.Types.MOS2GS_NTF_MAIL_SEND mailSendMsg)
|
||||
{
|
||||
var user_guid = mailSendMsg.UserGuid;
|
||||
StringBuilder str_builder = new();
|
||||
|
||||
if (user_guid is null)
|
||||
{
|
||||
Log.getLogger().error($"user_gudi is null");
|
||||
return;
|
||||
}
|
||||
|
||||
Log.getLogger().debug($"MOS2GS_mailSend start user_guid : {user_guid}");
|
||||
|
||||
(var result, var nickname_attrib) = await NicknameDoc.findNicknameFromGuid(user_guid);
|
||||
if (result.isFail())
|
||||
{
|
||||
Log.getLogger().error($"Not found user Nickname, guid : {user_guid}");
|
||||
return;
|
||||
}
|
||||
NullReferenceCheckHelper.throwIfNull(nickname_attrib, () => $"nickname_attrib is null !!!");
|
||||
|
||||
str_builder.Append($"guid : {user_guid}, nickname : {nickname_attrib.Nickname}");
|
||||
|
||||
(result, var nickname_registry_attrib) = await NicknameHelper.findNickname(nickname_attrib.Nickname);
|
||||
if (result.isFail())
|
||||
{
|
||||
Log.getLogger().error($"Not found user Nickname registry, {str_builder.ToString()}");
|
||||
return;
|
||||
}
|
||||
NullReferenceCheckHelper.throwIfNull(nickname_registry_attrib, () => $"nickname_registry_attrib is null !!!");
|
||||
|
||||
str_builder.Append($" accountId : {nickname_registry_attrib.AccountId}");
|
||||
|
||||
(result, var account_base_doc) =
|
||||
await AccountBaseDoc.findUserGuidFromAccountId(nickname_registry_attrib.AccountId);
|
||||
if (result.isFail())
|
||||
{
|
||||
Log.getLogger().error($"Not found user accountId registry, {str_builder.ToString()}");
|
||||
return;
|
||||
}
|
||||
NullReferenceCheckHelper.throwIfNull(account_base_doc, () => $"account_base_doc is null !!!");
|
||||
|
||||
var account_base_attrib = account_base_doc.getAttrib<AccountBaseAttrib>();
|
||||
if (account_base_attrib == null)
|
||||
{
|
||||
Log.getLogger().error($"Not found user accountBaseAttrib, {str_builder.ToString()}");
|
||||
return;
|
||||
}
|
||||
|
||||
string title_txt = string.Empty;
|
||||
foreach (var title in mailSendMsg.Title)
|
||||
{
|
||||
if ((int)title.LanguageType == (int)account_base_attrib.LanguageType)
|
||||
{
|
||||
var txt = StringRuleHelper.convertStringFromBase64(title.Text);
|
||||
title_txt = txt;
|
||||
str_builder.Append($" title_txt : {title_txt}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//일단 하드코딩, sender에 대한 정의가 확정되면 바꿀것.
|
||||
//string sender = "시스템 관리자";
|
||||
string senderName = string.Empty;
|
||||
foreach (var sender in mailSendMsg.Sender)
|
||||
{
|
||||
if ((int)sender.LanguageType == (int)account_base_attrib.LanguageType)
|
||||
{
|
||||
var txt = StringRuleHelper.convertStringFromBase64(sender.Text);
|
||||
senderName = txt;
|
||||
str_builder.Append($" senderName : {senderName}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
string mail_msg = string.Empty;
|
||||
foreach (var msg in mailSendMsg.Msg)
|
||||
{
|
||||
if ((int)msg.LanguageType == (int)account_base_attrib.LanguageType)
|
||||
{
|
||||
var txt = StringRuleHelper.convertStringFromBase64(msg.Text);
|
||||
mail_msg = txt;
|
||||
str_builder.Append($" mail_msg : {mail_msg}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
List<ServerCommon.MailItem> mail_items = new();
|
||||
foreach (var item in mailSendMsg.ItemList)
|
||||
{
|
||||
var item_id = item.ItemId;
|
||||
var item_cnt = item.Count;
|
||||
if (MetaData.Instance._ItemTable.TryGetValue(item_id, out var item_data) == false)
|
||||
{
|
||||
Log.getLogger().error($"Not found item data, item_id : {item_id}, {str_builder.ToString()}");
|
||||
return;
|
||||
}
|
||||
|
||||
ServerCommon.MailItem mail_item = new();
|
||||
mail_item.ItemId = (META_ID)item_id;
|
||||
mail_item.Count = item_cnt;
|
||||
mail_item.ProductId = 0;
|
||||
mail_item.isRepeatProduct = false;
|
||||
str_builder.Append($" ItemId : {item_id}").Append($" item_cnt : {item_cnt}");
|
||||
mail_items.Add(mail_item);
|
||||
}
|
||||
|
||||
(result, var mail_doc) = await Mail.createSystemMailDocByMOS2User(user_guid, nickname_attrib.Nickname, senderName, title_txt, mail_msg, mail_items);
|
||||
if (result.isFail() || mail_doc is null)
|
||||
{
|
||||
Log.getLogger().error($"fail create system mail, {str_builder.ToString()}");
|
||||
return;
|
||||
}
|
||||
var to_write_docs = new List<DynamoDbDocBase>();
|
||||
to_write_docs.Add(mail_doc);
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
var system_manager = server_logic.getSystemMailManager();
|
||||
|
||||
var batch = new QueryBatchEx<QueryRunnerWithDocument>(system_manager, LogActionType.MailSend, server_logic.getDynamoDbClient(), true);
|
||||
{
|
||||
batch.addQuery(new DBQEntityWrite(to_write_docs));
|
||||
batch.addQuery(new QueryFinal(), async (_query) =>
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
var player_manager = server_logic.getPlayerManager();
|
||||
if (player_manager.tryGetUserByPrimaryKey(user_guid, out var found_user) == true)
|
||||
{
|
||||
var found_user_mail_action = found_user.getEntityAction<MailAction>();
|
||||
found_user_mail_action.NewReceivedMail();
|
||||
}
|
||||
|
||||
return QueryBatchBase.QueryResultType.Success;
|
||||
});
|
||||
}
|
||||
|
||||
List<ILogInvoker> invokers = new List<ILogInvoker>();
|
||||
|
||||
var task_log_data = MailBusinessLogHelper.toMailLogInfo(mail_doc);
|
||||
invokers.Add(new MailBusinessLog(task_log_data));
|
||||
batch.appendBusinessLogs(invokers);
|
||||
|
||||
result = await QueryHelper.sendQueryAndBusinessLog(batch);
|
||||
|
||||
if (result.isFail())
|
||||
{
|
||||
Log.getLogger().error($"system mail send error, {str_builder.ToString()}");
|
||||
return;
|
||||
}
|
||||
Log.getLogger().info($"system mail send success, {str_builder.ToString()}");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user