초기커밋

This commit is contained in:
2025-05-01 07:20:41 +09:00
commit 98bb2e3c5c
2747 changed files with 646947 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View 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;
}
}

View 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();
}
}
}

View 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);
}
}
}

View 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();
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View 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);
}
}

View 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;
}
}
}

View File

@@ -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);
}
}

View 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);
}
}

View File

@@ -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;
}
}