339 lines
11 KiB
C#
339 lines
11 KiB
C#
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;
|
|
}
|
|
}
|