Files
caliverse_server/GameServer/Global/LandAuction/Helper/LandAuctionReservationHelper.cs
2025-05-01 07:20:41 +09:00

191 lines
9.1 KiB
C#

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ServerCore; using ServerBase;
using ServerCommon;
using META_ID = System.UInt32;
namespace GameServer
{
public static class LandAuctionReservationHelper
{
//=========================================================================================
// 예약된 랜드 경매 정보가 있는지 확인하고
// 있다면 활성화중인 랜드 경매의 종료 상태를 확인하여
// 종료 상태라면 LandAuctionActivityDoc.AuctionNumber를 예약된 정보로 변경 및 저장 한다.
//=========================================================================================
public static async Task<(Result, bool)> configureNextLandAuctionToDb(META_ID landMetaId)
{
var result = new Result();
var err_msg = string.Empty;
var server_logic = GameServerApp.getServerLogic();
var db_connector = server_logic.getDynamoDbClient();
var last_auction_number = 0;
(result, var found_activity_doc) = await LandAuctionDbHelper.readLandAuctionActivityDocFromDb(landMetaId, false);
if (result.isFail())
{
err_msg = $"Failed to readLandAuctionActivityDocFromDb() !!! : {result.toBasicString()} - landMetaId:{landMetaId}";
Log.getLogger().error(err_msg);
return (result, false);
}
if (null != found_activity_doc)
{
// 현재 활성화중인 랜드 경매 종료 상태를 체크 한다.
var curr_activity_attrib = found_activity_doc.getAttrib<LandAuctionActivityAttrib>();
NullReferenceCheckHelper.throwIfNull(curr_activity_attrib, () => $"curr_activity_attrib is null !!! - landMetaId:{landMetaId}");
var activity_auction_number = curr_activity_attrib.AuctionNumber;
ConditionValidCheckHelper.throwIfFalseWithCondition( () => 0 < activity_auction_number
, () => $"Invalid AuctionNubmer !!! : 0 < activityAuctionNumber:{activity_auction_number}"
+ $" - landMetaId:{landMetaId}");
last_auction_number = activity_auction_number;
(result, var last_registry_doc) = await LandAuctionDbHelper.readLandAuctionRegistryDocFromDb(landMetaId, last_auction_number);
if (result.isFail())
{
err_msg = $"Failed to readLandAuctionRegistryDocFromDb() !!! : {result.toBasicString()} - landMetaId:{landMetaId}, lastAuctionNumber:{last_auction_number}";
Log.getLogger().error(err_msg);
return (result, false);
}
NullReferenceCheckHelper.throwIfNull(last_registry_doc, () => $"last_registry_doc is null !!! - landMetaId:{landMetaId}, lastAuctionNumber:{last_auction_number}");
var last_registry_attrib = last_registry_doc.getAttrib<LandAuctionRegistryAttrib>();
NullReferenceCheckHelper.throwIfNull(last_registry_attrib, () => $"last_registry_attrib is null !!! - landMetaId:{landMetaId}, lastAuctionNumber:{last_auction_number}");
if(LandAuctionResult.None == last_registry_attrib.LandAuctionResult)
{
if (true == LandAuctionManager.It.hasActivitingLandAuction(landMetaId))
{
// 아직 경매 처리 진행전 이다 !!!
return (result, false);
}
else
{
// 활성화 목록에 로딩을 해야 한다 !!!
return (result, true);
}
}
}
// 다음 예약된 경매가 있는지 체크 한다.
// 있다면 LandAuctionActivityDoc.AuctionNumber에 설정 한다. !!!
var next_auction_number = last_auction_number + 1;
(result, var found_registry_doc) = await LandAuctionDbHelper.readLandAuctionRegistryDocFromDb(landMetaId, next_auction_number, false);
if (result.isFail())
{
err_msg = $"Failed to readLandAuctionRegistryDocFromDb() !!! : {result.toBasicString()} - landMetaId:{landMetaId}, auctionNumber:{next_auction_number}";
Log.getLogger().error(err_msg);
return (result, false);
}
if (null == found_registry_doc)
{
return (result, false);
}
var registry_attrib = found_registry_doc.getAttrib<LandAuctionRegistryAttrib>();
NullReferenceCheckHelper.throwIfNull(registry_attrib, () => $"registry_attrib is null !!! - landMetaId:{landMetaId}, auctionNumber:{next_auction_number}");
result = registry_attrib.checkValidLandAuctionRegistry();
if (result.isFail())
{
return (result, false);
}
if (null == found_activity_doc)
{
var new_activity_doc = new LandAuctionActivityDoc(landMetaId);
found_activity_doc = new_activity_doc;
}
var activity_attrib = found_activity_doc.getAttrib<LandAuctionActivityAttrib>();
NullReferenceCheckHelper.throwIfNull(activity_attrib, () => $"activity_attrib is null !!! - landMetaId:{landMetaId}");
if (next_auction_number <= activity_attrib.AuctionNumber)
{
// 이미 next_auction_number이상으로 설정 되었다면 갱신할 필요가 없다 !!!
return (result, false);
}
activity_attrib.AuctionNumber = next_auction_number;
result = await db_connector.simpleUpsertDocumentWithDocType(found_activity_doc);
if (result.isFail())
{
err_msg = $"Failed to simpleInsertDocumentWithDocType<LandAuctionActivityDoc> !!! : {result.toBasicString()}, auctionNumber:{next_auction_number} - landMetaId:{landMetaId}";
Log.getLogger().error(err_msg);
return (result, false);
}
LandAuctionBusinessLogHelper.writeBusinessLogByLandAuctionActivity(found_activity_doc);
err_msg = $"Configure Next LandAuctionKey !!!, nextAuctionNumber:{next_auction_number} - landMetaId:{landMetaId}";
Log.getLogger().debug(err_msg);
return (result, true);
}
public static async Task<(Result, Int32)> getNextLandAuctionNumber(META_ID landMetaId)
{
var result = new Result();
var err_msg = string.Empty;
var server_logic = GameServerApp.getServerLogic();
var db_connector = server_logic.getDynamoDbClient();
var last_auction_number = 0;
(result, var found_activity_doc) = await LandAuctionDbHelper.readLandAuctionActivityDocFromDb(landMetaId, false);
if (result.isFail())
{
err_msg = $"Failed to readLandAuctionActivityDocFromDb() !!! : {result.toBasicString()} - landMetaId:{landMetaId}";
Log.getLogger().error(err_msg);
return (result, 0);
}
if (null != found_activity_doc)
{
var activity_attrib = found_activity_doc.getAttrib<LandAuctionActivityAttrib>();
NullReferenceCheckHelper.throwIfNull(activity_attrib, () => $"activity_attrib is null !!! - landMetaId:{landMetaId}");
var activity_auction_number = activity_attrib.AuctionNumber;
ConditionValidCheckHelper.throwIfFalseWithCondition( () => 0 < activity_auction_number
, () => $"Invalid AuctionNubmer !!! : 0 < activityAuctionNumber:{activity_auction_number}"
+ $" - landMetaId:{landMetaId}" );
last_auction_number = activity_auction_number;
}
var next_auction_number = 0;
var is_continue = true;
while (is_continue)
{
next_auction_number = last_auction_number + 1;
(result, var found_registry_doc) = await LandAuctionDbHelper.readLandAuctionRegistryDocFromDb(landMetaId, next_auction_number, false);
if (result.isFail())
{
err_msg = $"Failed to readLandAuctionRegistryDocFromDb() !!! : {result.toBasicString()} - landMetaId:{landMetaId}, auctionNumber:{next_auction_number}";
Log.getLogger().error(err_msg);
return (result, 0);
}
if (null == found_registry_doc)
{
is_continue = false;
break;
}
last_auction_number = next_auction_number;
}
return (result, next_auction_number);
}
}
}