Files
caliverse_server/GameServer/Contents/Mail/RabbitMessageHandler/RabbitMailSendHandler.cs
2025-05-01 07:20:41 +09:00

174 lines
6.2 KiB
C#

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