Files
caliverse_server/GameServer/Contents/Shop/PacketHandler/RePurchaseItemPacketHandler.cs
2025-05-01 07:20:41 +09:00

165 lines
6.6 KiB
C#

using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
namespace GameServer.PacketHandler;
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.RePurchaseItemReq), typeof(RePurchaseItemPacketHandler), typeof(GameLoginListener))]
public class RePurchaseItemPacketHandler : PacketRecvHandler
{
private static void send_S2C_ACK_SHOP_RE_PURCHASE_LIST(Player? owner, Result result, List<Item>? rePurchaseItems)
{
var ack_packet = new ClientToGame
{
Response = new ClientToGameRes
{
ErrorCode = result.ErrorCode,
RePurchaseItemRes = new ClientToGameRes.Types.RePurchaseItemRes()
}
};
// 데이터 가져오기
if (result.isSuccess())
{
if (null != rePurchaseItems)
{
foreach (var info in rePurchaseItems)
{
var attribute = info.getEntityAttribute<ItemAttributeBase>();
var item = new global::Item
{
ItemGuid = attribute!.ItemGuid,
ItemId = (int)attribute.ItemMetaId,
Count = attribute.ItemStackCount,
Level = attribute.Level,
Slot = attribute.EquipedPos
};
item.Attributeids.AddRange(attribute.Attributes.Select(attrib => (int)attrib));
ack_packet.Response.RePurchaseItemRes.Items.Add(item);
}
}
var account_attribute = owner!.getEntityAttribute<AccountAttribute>();
var level_attribute = owner.getEntityAttribute<LevelAttribute>();
var money_attribute = owner.getEntityAttribute<MoneyAttribute>();
var nickname_attribute = owner.getEntityAttribute<NicknameAttribute>();
var char_info = new CharInfo
{
Level = (int)level_attribute!.Level,
Exp = (int)level_attribute.Exp,
Gold = money_attribute!.Gold,
Sapphire = money_attribute.Sapphire,
Calium = money_attribute.Calium,
Ruby = money_attribute.Ruby,
Usergroup = account_attribute!.AuthAdminLevelType.ToString(),
Operator = (int)account_attribute.AuthAdminLevelType,
DisplayName = nickname_attribute!.Nickname,
LanguageInfo = (int)account_attribute.LanguageType,
IsIntroComplete = 1
};
ack_packet.Response.RePurchaseItemRes.CurrencyInfo = char_info;
}
GameServerApp.getServerLogic().onSendPacket(owner!, ack_packet);
}
public override async Task<Result> onProcessPacket(ISession entityWithSession, IMessage recvMessage)
{
var result = new Result();
string err_msg;
var entity_player = entityWithSession as Player;
NullReferenceCheckHelper.throwIfNull(entity_player, () => $"entity_player is null !!!");
// 1. 기본 정보 체크
var request = (recvMessage as ClientToGame)?.Request.RePurchaseItemReq;
if (null == request)
{
err_msg = $"Failed to get Request !!! : {nameof(ClientToGame.Request.RePurchaseItemReq)}";
result.setFail(ServerErrorCode.InvalidArgument, err_msg);
Log.getLogger().error(result.toBasicString());
send_S2C_ACK_SHOP_RE_PURCHASE_LIST(entity_player, result, null);
return result;
}
result = await entity_player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "RePurchaseSoldItem", rePurchaseItemDelegate);
if (result.isFail())
{
err_msg = $"Failed to runTransactionRunnerSafely()!!! : {result.toBasicString()} - {entity_player.toBasicString()}";
Log.getLogger().error(err_msg);
send_S2C_ACK_SHOP_RE_PURCHASE_LIST(entity_player, result, null);
}
return result;
async Task<Result> rePurchaseItemDelegate() => await rePurchaseItemAsync(entity_player, request.ItemGuid);
}
private async Task<Result> rePurchaseItemAsync(Player entity_player, string item_guid)
{
var result = new Result();
string err_msg;
var shop_action = entity_player.getEntityAction<ShopAction>();
var sold_action = shop_action.getSolProductAction();
// 1. 재구매 아이템 체크
var sold_item = sold_action.findSoldProduct(item_guid);
if (null == sold_item)
{
err_msg = $"Fail to get item info () !!! : {nameof(ShopSoldProductAction.findSoldProduct)} - {item_guid}";
result.setFail(ServerErrorCode.NotFoundItemTableId, err_msg);
Log.getLogger().error(err_msg);
return result;
}
// 2. item 정보 체크
var item_attrib = sold_item.ItemDoc.getAttrib<ItemAttrib>();
NullReferenceCheckHelper.throwIfNull(item_attrib, () => $"item_attrib is null !!! - {entity_player.toBasicString()}");
(result, var item_data) = ShopHelper.checkItemIdFromTableData((int)item_attrib.ItemMetaId);
if (result.isFail()) return result;
NullReferenceCheckHelper.throwIfNull(item_data, () => $"item_data is null !!! - {entity_player.toBasicString()}");
// 3. 아이템 지급
var process_re_purchase = await shop_action.processRePurchase(item_data, sold_item);
if (process_re_purchase.result.isFail()) return process_re_purchase.result;
NullReferenceCheckHelper.throwIfNull(process_re_purchase.changed_item, () => $"process_re_purchase.changed_item is null !!! - {entity_player.toBasicString()}");
// 4. 재화 감소
result = await shop_action.processSpent(process_re_purchase.spent_currency_type, process_re_purchase.spent_currency);
if (result.isFail()) return result;
// 5. DB 갱신
var batch = new QueryBatchEx<QueryRunnerWithDocument>( entity_player, LogActionType.ShopRePurchase, GameServerApp.getServerLogic().getDynamoDbClient());
{
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
batch.addQuery(new QueryFinal());
}
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail()) return result;
send_S2C_ACK_SHOP_RE_PURCHASE_LIST(entity_player, result, new List<Item> { process_re_purchase.changed_item } );
return result;
}
}