376 lines
18 KiB
C#
376 lines
18 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
using ServerCore; using ServerBase;
|
|
using ServerCommon;
|
|
|
|
|
|
using ServerCommon.Cache;
|
|
using Amazon.DynamoDBv2.Model;
|
|
|
|
|
|
using META_ID = System.UInt32;
|
|
using USER_GUID = System.String;
|
|
using LAND_OWNER_GUID = System.String;
|
|
|
|
|
|
|
|
namespace GameServer
|
|
{
|
|
public static class LandAuctionHelper
|
|
{
|
|
public static string getWinningBidValue(this LandAuction landAuction)
|
|
{
|
|
var land_auction_action = landAuction.getEntityAction<LandAuctionAction>();
|
|
NullReferenceCheckHelper.throwIfNull(land_auction_action, () => $"land_auction_action is null !!! - {landAuction.toBasicString()}");
|
|
|
|
return land_auction_action.getHighestBidPrice().ToString("N0"); // 천 단위 구분 기호 포함, 소숫점은 없다 !!! - kangms
|
|
}
|
|
|
|
public static Result copyDocToEntityAttributeForRefundBidPrice( this LandAuctionRefundBidPrice refundBidPrice
|
|
, EntityAttributeBase toClonedAttributeBase, DynamoDbDocBase fromDoc )
|
|
{
|
|
var result = new Result();
|
|
var err_msg = string.Empty;
|
|
|
|
var refund_bid_price_attribute = toClonedAttributeBase as LandAuctionRefundBidPriceAttribute;
|
|
if (null != refund_bid_price_attribute)
|
|
{
|
|
var is_success = refund_bid_price_attribute.copyEntityAttributeFromDoc(fromDoc);
|
|
if (false == is_success)
|
|
{
|
|
err_msg = $"Failed to copyEntityAttributeFromDoc() !!! : docType:{fromDoc.getTypeName()} - {refundBidPrice.toBasicString()}";
|
|
result.setFail(ServerErrorCode.DynamoDbDocCopyToEntityAttributeFailed, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
return result;
|
|
}
|
|
|
|
var origin_attribute = refundBidPrice.getOriginEntityAttribute<LandAuctionRefundBidPriceAttribute>();
|
|
NullReferenceCheckHelper.throwIfNull(origin_attribute, () => $"origin_attribute is null !!! - {refundBidPrice.toBasicString()}");
|
|
origin_attribute.copyEntityAttributeFromDoc(fromDoc);
|
|
|
|
return result;
|
|
}
|
|
|
|
ConditionValidCheckHelper.throwIfFalseWithCondition(() => false
|
|
, () => $"Failed to copy EntityAttribute from Doc !!! : attributeType:{toClonedAttributeBase.getTypeName()} <= docType:{fromDoc.getTypeName()}"
|
|
+ $" - {refundBidPrice.toBasicString()}");
|
|
|
|
return result;
|
|
}
|
|
|
|
public static Result copyCacheToEntityAttributeForLandAuction( this LandAuction landAuction
|
|
, EntityAttributeBase toClonedAttributeBase, CacheBase fromCache )
|
|
{
|
|
var result = new Result();
|
|
var err_msg = string.Empty;
|
|
|
|
var auction_action = landAuction.getEntityAction<LandAuctionAction>();
|
|
NullReferenceCheckHelper.throwIfNull(auction_action, () => $"auction_action is null !!! - {landAuction.toBasicString()}");
|
|
|
|
var registry_attribute = toClonedAttributeBase as LandAuctionRegistryAttribute;
|
|
if (null != registry_attribute)
|
|
{
|
|
var origin_attribute = landAuction.getOriginEntityAttribute<LandAuctionRegistryAttribute>();
|
|
NullReferenceCheckHelper.throwIfNull(origin_attribute);
|
|
|
|
var land_auction_cache = fromCache as LandAuctionCache;
|
|
if (null != land_auction_cache)
|
|
{
|
|
registry_attribute.copyProcessInfoFromCache(land_auction_cache);
|
|
origin_attribute.copyProcessInfoFromCache(land_auction_cache);
|
|
|
|
auction_action.updateProcessVersion(land_auction_cache.ProcessVersionTime);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
var highest_bid_user_attribute = toClonedAttributeBase as LandAuctionHighestBidUserAttribute;
|
|
if (null != highest_bid_user_attribute)
|
|
{
|
|
var origin_attribute = landAuction.getOriginEntityAttribute<LandAuctionHighestBidUserAttribute>();
|
|
NullReferenceCheckHelper.throwIfNull(origin_attribute);
|
|
|
|
var normal_bid_highest_user_cache = fromCache as NormalBidHighestUserCache;
|
|
if (null != normal_bid_highest_user_cache)
|
|
{
|
|
highest_bid_user_attribute.copyEntityAttributeFromCache(normal_bid_highest_user_cache);
|
|
origin_attribute.copyEntityAttributeFromCache(normal_bid_highest_user_cache);
|
|
|
|
auction_action.updateHighestRankVersion(normal_bid_highest_user_cache.HighestRankVersionTime);
|
|
}
|
|
|
|
var top_bidder_cache = fromCache as LandAuctionTopBidderCache;
|
|
if (null != top_bidder_cache)
|
|
{
|
|
highest_bid_user_attribute.copyEntityAttributeFromCache(top_bidder_cache);
|
|
origin_attribute.copyEntityAttributeFromCache(top_bidder_cache);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
ConditionValidCheckHelper.throwIfFalseWithCondition( () => false
|
|
, () => $"Failed to copy EntityAttribute from Cache !!! : attributeType:{toClonedAttributeBase.getTypeName()} <= cacheType:{fromCache.getTypeName()}"
|
|
+ $" - {landAuction.toBasicString()}");
|
|
|
|
return result;
|
|
}
|
|
|
|
public static async Task<Result> copyDocToEntityAttributeForLandAuction( this LandAuction landAuction
|
|
, EntityAttributeBase toClonedAttributeBase, DynamoDbDocBase fromDoc
|
|
, bool isWithLock )
|
|
{
|
|
var result = new Result();
|
|
var err_msg = string.Empty;
|
|
|
|
var auction_action = landAuction.getEntityAction<LandAuctionAction>();
|
|
NullReferenceCheckHelper.throwIfNull(auction_action, () => $"auction_action is null !!! - {landAuction.toBasicString()}");
|
|
|
|
var activity_attribute = toClonedAttributeBase as LandAuctionActivityAttribute;
|
|
if(null != activity_attribute)
|
|
{
|
|
var is_success = activity_attribute.copyEntityAttributeFromDoc(fromDoc);
|
|
if(false == is_success)
|
|
{
|
|
err_msg = $"Failed to copyEntityAttributeFromDoc() !!! : docType:{fromDoc.getTypeName()} - {landAuction.toBasicString()}";
|
|
result.setFail(ServerErrorCode.DynamoDbDocCopyToEntityAttributeFailed, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
return result;
|
|
}
|
|
|
|
var origin_attribute = landAuction.getOriginEntityAttribute<LandAuctionActivityAttribute>();
|
|
NullReferenceCheckHelper.throwIfNull(origin_attribute, () => $"origin_attribute is null !!! - {landAuction.toBasicString()}");
|
|
origin_attribute.copyEntityAttributeFromDoc(fromDoc);
|
|
|
|
return result;
|
|
}
|
|
|
|
var registry_attribute = toClonedAttributeBase as LandAuctionRegistryAttribute;
|
|
if (null != registry_attribute)
|
|
{
|
|
var origin_attribute = landAuction.getOriginEntityAttribute<LandAuctionRegistryAttribute>();
|
|
NullReferenceCheckHelper.throwIfNull(origin_attribute);
|
|
|
|
var registry_doc = fromDoc as LandAuctionRegistryDoc;
|
|
NullReferenceCheckHelper.throwIfNull(registry_doc, () => $"registry_doc is null !!! : docType:{fromDoc.getTypeName()} - {landAuction.toBasicString()}");
|
|
var registry_attrib = registry_doc.getAttrib<LandAuctionRegistryAttrib>();
|
|
NullReferenceCheckHelper.throwIfNull(registry_attrib, () => $"registry_attrib is null !!! - {landAuction.toBasicString()}");
|
|
|
|
result = registry_attrib.checkValidLandAuctionRegistry();
|
|
if (result.isFail())
|
|
{
|
|
return result;
|
|
}
|
|
|
|
var fn_copy_to_attribute = delegate ()
|
|
{
|
|
if (origin_attribute.RegisteredVersionTime < registry_attrib.RegisteredVersionTime)
|
|
{
|
|
registry_attribute.copyRegisteredInfoFromDoc(registry_doc);
|
|
origin_attribute.copyRegisteredInfoFromDoc(registry_doc);
|
|
}
|
|
|
|
if (origin_attribute.ProcessVersionTime < registry_attrib.ProcessVersionTime)
|
|
{
|
|
registry_attribute.copyProcessInfoFromDoc(registry_doc);
|
|
origin_attribute.copyProcessInfoFromDoc(registry_doc);
|
|
}
|
|
|
|
auction_action.updateRegistryVersion( registry_attrib.RegisteredVersionTime, registry_attrib.ProcessVersionTime );
|
|
};
|
|
|
|
if (true == isWithLock)
|
|
{
|
|
using (var releaser = await landAuction.getAsyncLock())
|
|
{
|
|
fn_copy_to_attribute();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
fn_copy_to_attribute();
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
var highest_bid_user_attribute = toClonedAttributeBase as LandAuctionHighestBidUserAttribute;
|
|
if (null != highest_bid_user_attribute)
|
|
{
|
|
var origin_attribute = landAuction.getOriginEntityAttribute<LandAuctionHighestBidUserAttribute>();
|
|
NullReferenceCheckHelper.throwIfNull(origin_attribute);
|
|
|
|
var highest_bid_user_doc = fromDoc as LandAuctionHighestBidUserDoc;
|
|
NullReferenceCheckHelper.throwIfNull(highest_bid_user_doc, () => $"highest_bid_user_doc is null !!! : docType:{fromDoc.getTypeName()} - {landAuction.toBasicString()}");
|
|
var highest_bid_user_attrib = highest_bid_user_doc.getAttrib<LandAuctionHighestBidUserAttrib>();
|
|
NullReferenceCheckHelper.throwIfNull(highest_bid_user_attrib, () => $"highest_bid_user_attrib is null !!! - {landAuction.toBasicString()}");
|
|
|
|
if (origin_attribute.HighestRankVersionTime < highest_bid_user_attrib.HighestRankVersionTime)
|
|
{
|
|
highest_bid_user_attribute.copyEntityAttributeFromDoc(highest_bid_user_doc);
|
|
origin_attribute.copyEntityAttributeFromDoc(highest_bid_user_doc);
|
|
}
|
|
|
|
auction_action.updateHighestRankVersion(highest_bid_user_attrib.HighestRankVersionTime);
|
|
|
|
return result;
|
|
}
|
|
|
|
ConditionValidCheckHelper.throwIfFalseWithCondition( () => false
|
|
, () => $"Failed to copy EntityAttribute from Doc !!! : attributeType:{toClonedAttributeBase.getTypeName()} <= docType:{fromDoc.getTypeName()}"
|
|
+ $" - {landAuction.toBasicString()}");
|
|
|
|
return result;
|
|
}
|
|
|
|
public static (bool, LandAuctionVersion?) checkChangedVersion( this LandAuctionVersion preVersion
|
|
, DateTime registeredVersionTime, DateTime processVersionTime, DateTime highestRankVersionTime )
|
|
{
|
|
var version = new LandAuctionVersion(registeredVersionTime, processVersionTime, highestRankVersionTime);
|
|
if (true == preVersion.checkChangedVersion(version))
|
|
{
|
|
return (true, version);
|
|
}
|
|
|
|
return (false, null);
|
|
}
|
|
|
|
public static bool checkChangedVersion(this LandAuctionVersion preVersion, LandAuctionVersion currVersion)
|
|
{
|
|
if( preVersion.RegisteredVersionTime < currVersion.RegisteredVersionTime
|
|
|| preVersion.ProcessVersionTime < currVersion.ProcessVersionTime
|
|
|| preVersion.HighestRankVersionTime < currVersion.HighestRankVersionTime )
|
|
{
|
|
Log.getLogger().info( $"changed Version !!! "
|
|
+ $" : prevVersion.RegisteredVersion:{preVersion.RegisteredVersionTime} < currVersion.RegisteredVersion:{currVersion.RegisteredVersionTime}"
|
|
+ $", prevVersion.ProcessVersion:{preVersion.ProcessVersionTime} < currVersion.ProcessVersion:{currVersion.ProcessVersionTime}"
|
|
+ $", prevVersion.HighestRankVersion:{preVersion.HighestRankVersionTime} < currVersion.HighestRankVersion:{currVersion.HighestRankVersionTime}" );
|
|
|
|
if(preVersion.RegisteredVersionTime > currVersion.RegisteredVersionTime) { currVersion.RegisteredVersionTime = preVersion.RegisteredVersionTime; }
|
|
if(preVersion.ProcessVersionTime > currVersion.ProcessVersionTime) { currVersion.ProcessVersionTime = preVersion.ProcessVersionTime; }
|
|
if(preVersion.HighestRankVersionTime > currVersion.HighestRankVersionTime) { currVersion.HighestRankVersionTime = preVersion.HighestRankVersionTime; }
|
|
|
|
currVersion.IsSyncRequried = true;
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public static bool isLandAuctionStateByTime(this LandAuctionCheckResult checkResult, LandAuctionState state)
|
|
{
|
|
var land_auction_info = checkResult.LandAuctionInfo;
|
|
NullReferenceCheckHelper.throwIfNull(land_auction_info, () => $"land_auction_info is null !!!");
|
|
|
|
if (LandAuctionState.Waiting == state)
|
|
{
|
|
if (false == DateTimeHelper.hasTimeReached(land_auction_info.AuctionReservationNoticeStartTime.ToDateTime()))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
else if (LandAuctionState.Scheduled == state)
|
|
{
|
|
if ( true == DateTimeHelper.hasTimeReached(land_auction_info.AuctionReservationNoticeStartTime.ToDateTime())
|
|
&& false == DateTimeHelper.hasTimeReached(land_auction_info.AuctionStartTime.ToDateTime()))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
else if (LandAuctionState.Started == state)
|
|
{
|
|
if (true == DateTimeHelper.isBetween(land_auction_info.AuctionStartTime.ToDateTime(), land_auction_info.AuctionEndTime.ToDateTime()))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
else if (LandAuctionState.Ended == state)
|
|
{
|
|
if (true == DateTimeHelper.hasTimeReached(land_auction_info.AuctionEndTime.ToDateTime()))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
var err_msg = $"Invalid LandAuctionState !!! : {state}";
|
|
Log.getLogger().warn(err_msg);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public static bool isLandAuctionState(this LandAuctionCheckResult checkResult, LandAuctionState state)
|
|
{
|
|
var land_auction_info = checkResult.LandAuctionInfo;
|
|
NullReferenceCheckHelper.throwIfNull(land_auction_info, () => $"land_auction_info is null !!!");
|
|
|
|
if ( state == land_auction_info.LandAuctionState )
|
|
{
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public static string toBasicString(this LandAuctionCheckResult checkResult)
|
|
{
|
|
return $"{checkResult.getTypeName()}: LandAuctionInfo:{checkResult.LandAuctionInfo.toBasicString()}, BidType:{checkResult.LandAuctionBidType}"
|
|
+ $", CurrencyType:{checkResult.MyBidCurrencyType}, MyBidPrice:{checkResult.MyBidPrice}, {checkResult.Version.toBasicString()}";
|
|
|
|
}
|
|
|
|
public static string toBasicString(this LandAuctionBidResult bidResult)
|
|
{
|
|
return $"{bidResult.getTypeName()}: TargetLandAuction:{bidResult.TargetLandAuction?.toBasicString()}, BidType:{bidResult.CurrentBidType}"
|
|
+ $", BidTime:{bidResult.BidTime}";
|
|
}
|
|
|
|
public static bool isLandAuctionStateByTime(this LandAuctionRegistryAttribute registryAttribute, LandAuctionState state)
|
|
{
|
|
if (LandAuctionState.Waiting == state)
|
|
{
|
|
if (false == DateTimeHelper.hasTimeReached(registryAttribute.AuctionReservationNoticeStartTime))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
else if (LandAuctionState.Scheduled == state)
|
|
{
|
|
if ( true == DateTimeHelper.hasTimeReached(registryAttribute.AuctionReservationNoticeStartTime)
|
|
&& false == DateTimeHelper.hasTimeReached(registryAttribute.AuctionStartTime) )
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
else if (LandAuctionState.Started == state)
|
|
{
|
|
if (true == DateTimeHelper.isBetween( registryAttribute.AuctionStartTime, registryAttribute.AuctionEndTime) )
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
else if (LandAuctionState.Ended == state)
|
|
{
|
|
if (true == DateTimeHelper.hasTimeReached(registryAttribute.AuctionEndTime))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
var err_msg = $"Invalid LandAuctionState !!! : {state}";
|
|
Log.getLogger().warn(err_msg);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|
|
}
|