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(); 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(); 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(); 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(); 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 !!! : {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(); 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); } } }