초기커밋

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

View File

@@ -0,0 +1,150 @@
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
namespace GameServer;
public class SystemMetaMail : EntityBase
{
private SystemMetaMail(EntityBase parent)
: base(EntityType.SystemMail, parent)
{
}
public override async Task<Result> onInit()
{
addEntityAttribute(new SystemMetaMailAttribute(this));
return await base.onInit();
}
public static async Task<(Result, SystemMetaMail?)> createTestSystemMail(EntityBase owner, int mail_sequence_num)
{
var system_mail = new SystemMetaMail(owner);
var result = await system_mail.onInit();
if (result.isFail())
{
return (result, null);
}
var err_msg = string.Empty;
DateTime now = DateTime.UtcNow;
var system_meta_mail_attribute = system_mail.getEntityAttribute<SystemMetaMailAttribute>();
NullReferenceCheckHelper.throwIfNull(system_meta_mail_attribute, () => $"system_meta_mail_attribute is null !!! - {owner.toBasicString()}");
List<ServerCommon.MailItem> data = new List<ServerCommon.MailItem>();
data.Add(new ServerCommon.MailItem() { ItemId = 15231470, Count = 1 });
data.Add(new ServerCommon.MailItem() { ItemId = 31020014, Count = 1 });
system_meta_mail_attribute.MailId = mail_sequence_num + 1;
List<OperationSystemMessage> titles = new();
OperationSystemMessage title_ko = new();
title_ko.LanguageType = LanguageType.Ko;
title_ko.Text = "한국어 타이틀";
titles.Add(title_ko);
OperationSystemMessage title_ja = new();
title_ja.LanguageType = LanguageType.Ja;
title_ja.Text = "日本語 タイトル";//メッセージ 送信者
titles.Add(title_ja);
OperationSystemMessage title_en = new();
title_en.LanguageType = LanguageType.En;
title_en.Text = "English Title";
titles.Add(title_en);
system_meta_mail_attribute.Title = titles;
List<OperationSystemMessage> messages = new();
OperationSystemMessage msg_ko = new();
msg_ko.LanguageType = LanguageType.Ko;
msg_ko.Text = "한국어 메시지";
messages.Add(msg_ko);
OperationSystemMessage msg_ja = new();
msg_ja.LanguageType = LanguageType.Ja;
msg_ja.Text = "日本語 メッセージ";// 送信者
messages.Add(msg_ja);
OperationSystemMessage msg_en = new();
msg_en.LanguageType = LanguageType.En;
msg_en.Text = "English Message";
messages.Add(msg_en);
system_meta_mail_attribute.Text = messages;
List<OperationSystemMessage> senders = new();
OperationSystemMessage senders_ko = new();
senders_ko.LanguageType = LanguageType.Ko;
senders_ko.Text = "한국어 보낸이";
senders.Add(senders_ko);
OperationSystemMessage senders_ja = new();
senders_ja.LanguageType = LanguageType.Ja;
senders_ja.Text = "日本語 送信者";//
senders.Add(senders_ja);
OperationSystemMessage senders_en = new();
senders_en.LanguageType = LanguageType.En;
senders_en.Text = "English Sender";
senders.Add(senders_en);
system_meta_mail_attribute.SenderNickName = messages;
system_meta_mail_attribute.StartTime = now;
system_meta_mail_attribute.EndTime = now.AddDays(2);
system_meta_mail_attribute.ItemList.AddRange(data);
system_meta_mail_attribute.newEntityAttribute();
return (result, system_mail);
}
public static async Task<(Result, SystemMetaMail?)> createMailFromDoc(EntityBase parent, SystemMetaMailDoc doc)
{
var system_mail = new SystemMetaMail(parent);
var result = await system_mail.onInit();
if (result.isFail())
{
return (result, null);
}
var err_msg = string.Empty;
var system_mail_attribute = system_mail.getEntityAttribute<SystemMetaMailAttribute>();
NullReferenceCheckHelper.throwIfNull(system_mail_attribute, () => $"system_mail_attribute is null !!! - {parent.toBasicString()}");
if (system_mail_attribute.copyEntityAttributeFromDoc(doc) == false)
{
err_msg = $"Failed to copyEntityAttributeFromDoc !!! : doc_type {doc.GetType()} - {system_mail.getRootParent()?.toBasicString()}";
result.setFail(ServerErrorCode.DynamoDbDocCopyToEntityAttributeFailed, err_msg);
Log.getLogger().error(err_msg);
return (result, null);
}
return (result, system_mail);
}
public override string toBasicString()
{
return $"{this.getTypeName()} - {getRootParent()?.toBasicString()}";
}
public override string toSummaryString()
{
return $"{this.getTypeName()} - {getRootParent()?.toSummaryString()}";
}
}

View File

@@ -0,0 +1,338 @@
using System.Collections.Concurrent;
using Newtonsoft.Json;
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
namespace GameServer;
public class SystemMetaMailManager : EntityBase, IWithLogActor
{
ConcurrentDictionary<Int32, SystemMetaMail> m_system_meta_mails = new();
private bool m_is_all_load = false;
private HashSet<Int32> m_active_user_send_mail_ids = new ();
public SystemMetaMailManager()
: base(EntityType.SystemMailManager)
{
}
//서버 뜰때만 사용
public async Task<Result> LoadDB()
{
var result = new Result();
var server_logic = GameServerApp.getServerLogic();
var dynamo_db_client = server_logic.getDynamoDbClient();
var doc = new SystemMetaMailDoc();
var query_config = dynamo_db_client.makeQueryConfigForReadByPKOnly(doc.getPK());
(result, var read_doc_list) = await dynamo_db_client.simpleQueryDocTypesWithQueryOperationConfig<SystemMetaMailDoc>(query_config);
if (result.isFail())
{
return result;
}
var now = DateTimeHelper.Current;
foreach (var read_doc in read_doc_list)
{
(result, var system_meta_mail) = await SystemMetaMail.createMailFromDoc(this, read_doc);
if (result.isFail() || system_meta_mail == null)
{
return result;
}
var system_mail_attribute = system_meta_mail.getEntityAttribute<SystemMetaMailAttribute>();
NullReferenceCheckHelper.throwIfNull(system_mail_attribute, () => $"system_mail_attribute is null !!!");
if (system_mail_attribute.EndTime < now) continue;
if(false == m_system_meta_mails.TryAdd(system_mail_attribute.MailId, system_meta_mail))
{
Log.getLogger().warn($"m_system_meta_mails try add error. mailId : {system_mail_attribute.MailId}");
continue;
}
//여기까진 정상적으로 온것이고 시간대가 활성화 시간대이면 발동시점에 첫 메일 보상처리를 위해 별도 데이터로 관리
if (system_mail_attribute.StartTime <= now && now <= system_mail_attribute.EndTime)
{
m_active_user_send_mail_ids.Add(system_mail_attribute.MailId);
}
}
m_is_all_load = true;
return result;
}
public async Task<Result> refreshDB()
{
var result = new Result();
if (m_is_all_load == false) return result;
var server_logic = GameServerApp.getServerLogic();
var dynamo_db_client = server_logic.getDynamoDbClient();
var doc = new SystemMetaMailDoc();
var query_config = dynamo_db_client.makeQueryConfigForReadByPKOnly(doc.getPK());
(result, var read_doc_list) = await dynamo_db_client.simpleQueryDocTypesWithQueryOperationConfig<SystemMetaMailDoc>(query_config);
if (result.isFail())
{
Log.getLogger().error("SystemMetaMailDoc read error");
return result;
}
var now = DateTimeHelper.Current;
foreach (var read_doc in read_doc_list)
{
var attrib = read_doc.getAttrib<SystemMetaMailAttrib>();
NullReferenceCheckHelper.throwIfNull(attrib, () => $"attrib is null !!!");
if (false == m_system_meta_mails.ContainsKey(attrib.MailId))
{
if (attrib.EndTime < now) continue;
(result, var system_meta_mail) = await SystemMetaMail.createMailFromDoc(this, read_doc);
if (result.isFail() || system_meta_mail == null)
{
Log.getLogger().error($"SystemMetaMailDoc create error, {result.toBasicString()}");
continue;
}
var system_mail_attribute = system_meta_mail.getEntityAttribute<SystemMetaMailAttribute>();
NullReferenceCheckHelper.throwIfNull(system_mail_attribute, () => $"system_mail_attribute is null !!!");
if (false == m_system_meta_mails.TryAdd(system_mail_attribute.MailId, system_meta_mail))
{
Log.getLogger().error($"SystemMetaMailDoc refresh Add error, mailid : {system_mail_attribute.MailId}");
continue;
}
}
else
{
if (attrib.EndTime < now)
{
if (false == m_system_meta_mails.TryRemove(attrib.MailId, out var removed_attribute))
{
Log.getLogger().error($"SystemMetaMailDoc refresh Add error, mailid : {attrib.MailId}");
continue;
}
else
{
Log.getLogger().info($"SystemMetaMailDoc is old : {JsonConvert.SerializeObject(removed_attribute)}");
continue;
}
}
}
}
return result;
}
//24-10-23 Ticker에서 new Noti 안보내는걸로 처리
public async Task<Result> notifyNewSystemMail()
{
var result = new Result();
if (m_is_all_load == false) return result;
var now = DateTimeHelper.Current;
bool need_noti = false;
foreach (var system_mail in m_system_meta_mails.Values)
{
var system_mail_attribute = system_mail.getEntityAttribute<SystemMetaMailAttribute>();
if (system_mail_attribute == null) continue;
if (m_active_user_send_mail_ids.Contains(system_mail_attribute.MailId)) continue;
if (now < system_mail_attribute.StartTime) continue;
//여기 오면 신규 메일이 있는거니까 new 처리 해준다.
need_noti = true;
m_active_user_send_mail_ids.Add(system_mail_attribute.MailId);
}
if(need_noti) AllPlayerSystemMailNoti();
return await Task.FromResult(result);
}
public List<SystemMetaMail> GetSystemMail(HashSet<Int32> receivedSystemMail)
{
var systemMailList = new List<SystemMetaMail>();
var mails = CopyData();
foreach (var systemMail in mails)
{
var now = DateTime.UtcNow;
var system_meta_mail_attribute = systemMail.getEntityAttribute<SystemMetaMailAttribute>();
if (system_meta_mail_attribute == null)
{
continue;
}
if (now < system_meta_mail_attribute.StartTime || system_meta_mail_attribute.EndTime < now) continue;
if (receivedSystemMail.Contains(system_meta_mail_attribute.MailId))
{
continue;
}
if (system_meta_mail_attribute.StartTime <= now && now <= system_meta_mail_attribute.EndTime )
{
systemMailList.Add(systemMail);
}
}
return systemMailList;
}
public List<SystemMetaMail> GetSystemMail(Dictionary<Int32, DateTime> receivedSystemMails)
{
var systemMailList = new List<SystemMetaMail>();
var mails = CopyData();
foreach (var systemMail in mails)
{
var now = DateTime.UtcNow;
var system_meta_mail_attribute = systemMail.getEntityAttribute<SystemMetaMailAttribute>();
if (system_meta_mail_attribute == null)
{
continue;
}
if (now < system_meta_mail_attribute.StartTime || system_meta_mail_attribute.EndTime < now) continue;
if (receivedSystemMails.ContainsKey(system_meta_mail_attribute.MailId))
{
continue;
}
systemMailList.Add(systemMail);
}
return systemMailList;
}
private List<SystemMetaMail> CopyData()
{
return new List<SystemMetaMail>(m_system_meta_mails.Values.ToList());
}
public async Task<Result> CheatFuncSaveSystemMetaMail()
{
var result = new Result();
var err_msg = string.Empty;
var server_logic = GameServerApp.getServerLogic();
var dynamo_db_client = server_logic.getDynamoDbClient();
var fn_cheat_system_meta_mail_whrite = async delegate ()
{
var result = new Result();
int mailId = 0;
var mailList = CopyData();
foreach (var systemMail in mailList)
{
var system_mail_attribute = systemMail.getEntityAttribute<SystemMetaMailAttribute>();
if (system_mail_attribute == null)
{
continue;
}
int mail_id = system_mail_attribute.MailId;
if (mailId < mail_id)
{
mailId = mail_id;
}
}
(result, var system_mail) = await SystemMetaMail.createTestSystemMail(this, mailId);
if (result.isFail() || system_mail == null)
{
return result;
}
var batch = new QueryBatchEx<QueryRunnerWithDocument>( this, LogActionType.TestWriteSystemMail
, server_logic.getDynamoDbClient() );
{
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
}
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
return result;
}
if (false == m_system_meta_mails.TryAdd(mailId, system_mail))
{
}
return result;
};
result = await this.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "CheatSystemMetaMailWrite", fn_cheat_system_meta_mail_whrite);
if (result.isFail())
{
err_msg = $"Failed to runTransactionRunnerSafely()!!! : {result.toBasicString()} - {this.toBasicString()}";
Log.getLogger().error(err_msg);
}
return result;
}
public void AllPlayerSystemMailNoti()
{
var server_logic = GameServerApp.getServerLogic();
var users = server_logic.getPlayerManager().getUsers();
foreach( var user in users )
{
var mail_action = user.Value.getEntityAction<MailAction>();
mail_action.NewReceivedSystemMail();
}
}
public override string toBasicString()
{
return $"{this.getTypeName()}";
}
public override string toSummaryString()
{
return $"{this.getTypeName()}";
}
public ILogActor toLogActor()
{
var server_logic = ServerLogicApp.getServerLogicApp();
var log_info = new SystemMailActorLog();
if (server_logic == null)
return log_info;
log_info.initLogInfo(
// 서버 정보
server_logic.getServerConfig().getRegionId()
, server_logic.getServerConfig().getWorldId()
, server_logic.getServerType().toServerType()
);
return log_info;
}
public bool isAllLoad()
{
return m_is_all_load;
}
}