초기커밋

This commit is contained in:
2025-05-01 07:20:41 +09:00
commit 98bb2e3c5c
2747 changed files with 646947 additions and 0 deletions

View File

@@ -0,0 +1,305 @@
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
using PARTY_GUID = System.String;
using USER_GUID = System.String;
namespace GameServer.PacketHandler;
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.ReplyInvitePartyReq), typeof(ReplyInvitePartyPacketHandler), typeof(GameLoginListener))]
public class ReplyInvitePartyPacketHandler : PacketRecvHandler
{
private static void send_S2C_ACK_REPLAY_INVITE_PARTY(Player owner, Result result)
{
var ack_packet = new ClientToGame
{
Response = new ClientToGameRes
{
ErrorCode = result.ErrorCode,
ReplyInvitePartyRes = new()
}
};
GameServerApp.getServerLogic().onSendPacket(owner, ack_packet);
}
public override async Task<Result> onProcessPacket(ISession entityWithSession, IMessage recvMessage)
{
Log.getLogger().info($"{nameof(ReplyInvitePartyPacketHandler)}.{nameof(onProcessPacket)}: - {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.ReplyInvitePartyReq;
if (null == request)
{
err_msg = $"Failed to get request type !!! : {nameof(ClientToGame.Request.ReplyInvitePartyReq)}";
result.setFail(ServerErrorCode.InvalidArgument, err_msg);
Log.getLogger().error(result.toBasicString());
send_S2C_ACK_REPLAY_INVITE_PARTY(entity_player, result);
return result;
}
// 2. 조건 체크
result = await checkReplayInvitePartyAsync(entity_player, request.InvitePartyGuid);
if (result.isFail()) return result;
// 3. 파티 초대 응답 로직 체크
result = await replyInvitePartyAsync(entity_player, request.InvitePartyGuid, request.Result);
return result;
}
private async Task<Result> checkReplayInvitePartyAsync(Player entity_player, PARTY_GUID invite_party_guid)
{
var result = new Result();
string err_msg;
// 1. 초대 수신 시간 체크
var invite_recv_time = await entity_player.getEntityAction<PartyInvitePartyRecvAction>()
.getPartyInvitePartyRecvTime(invite_party_guid);
if (null == invite_recv_time)
{
err_msg = $"Failed to find invite party recv !!! : {invite_party_guid}";
result.setFail(ServerErrorCode.NotFoundPartyInvite, err_msg);
Log.getLogger().error(err_msg);
return result;
}
// 2. 파티 가입 여부 체크
var login_cache_request = PartyHelper.getOwnUserLoginCacheRequest(entity_player);
NullReferenceCheckHelper.throwIfNull(login_cache_request, () => $"login_cache_request is null !!! - party_guid : {invite_party_guid} - {entity_player.toBasicString()}");
var loginCache = login_cache_request.getLoginCache();
NullReferenceCheckHelper.throwIfNull(loginCache, () => $"loginCache is null !!! - party_guid : {invite_party_guid} -");
if (string.IsNullOrEmpty(loginCache.PartyGuid)) return result;
var global_party = GameServerApp.getServerLogic().findGlobalEntity<GlobalParty>();
NullReferenceCheckHelper.throwIfNull(global_party, () => $"global_party is null !!! - party_guid : {invite_party_guid} - {entity_player.toBasicString()}");
var party = global_party.getParty(loginCache.PartyGuid);
NullReferenceCheckHelper.throwIfNull(party, () => $"party is null !!! - party_guid : {invite_party_guid} - {entity_player.toBasicString()}");
// 3. 파티원 수가 여러명인지 체크
var party_member_action = party.getEntityAction<GlobalPartyDetailMemberAction>();
NullReferenceCheckHelper.throwIfNull(party_member_action, () => $"party_member_action is null !!! - party_guid : {invite_party_guid} - {entity_player.toBasicString()}");
if (party_member_action.getMemberCount() > 1)
{
err_msg = $"Failed to reply invite party !!! : already party member - party_guid : {invite_party_guid} - {entity_player.getUserGuid()} ";
result.setFail(ServerErrorCode.AlreadyPartyMember, err_msg);
Log.getLogger().error(err_msg);
return result;
}
return result;
}
private async Task<Result> replyInvitePartyAsync(Player entity_player, PARTY_GUID party_guid, BoolType reply_invite)
{
var result = new Result();
string err_msg;
// 1. 파티 정보 조회
var global_party_action = GameServerApp.getServerLogic().findGlobalEntity<GlobalParty>()
?.getEntityAction<GlobalPartyAction>();
NullReferenceCheckHelper.throwIfNull(global_party_action, () => $"global_party_action is null !!! - {entity_player.toBasicString()}");
var party_info = await global_party_action.getPartyLeaderGuidAndMemberCount(party_guid);
if (PARTY_GUID.IsNullOrEmpty(party_info.leader_guid))
{
err_msg = $"Failed to find party info !!! : {party_guid}";
result.setFail(ServerErrorCode.NotFoundParty, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
// 2. Invite 승인 로직 처리
if (reply_invite == BoolType.True)
{
result = await acceptInvitePartyAsync(entity_player, party_guid);
if (result.isFail())
{
send_S2C_ACK_REPLAY_INVITE_PARTY(entity_player, result);
return result;
}
}
// 3. leader 에게 통보
result = await sendReplyInvitePartyResultAsync(entity_player, party_guid, party_info.leader_guid, reply_invite);
send_S2C_ACK_REPLAY_INVITE_PARTY(entity_player, result);
// 4. Business Log 기록
writeBusinessLog(entity_player, party_guid, reply_invite);
return result;
}
private async Task<Result> acceptInvitePartyAsync(Player entity_player, PARTY_GUID party_guid)
{
var result = new Result();
var global_party = GameServerApp.getServerLogic().findGlobalEntity<GlobalParty>();
NullReferenceCheckHelper.throwIfNull(global_party, () => $"global_party is null !!! - {entity_player.toBasicString()}");
var global_party_action = global_party.getEntityAction<GlobalPartyAction>();
NullReferenceCheckHelper.throwIfNull(global_party_action, () => $"global_party_action is null !!! - {entity_player.toBasicString()}");
// 0. 기존 요청 정보 정리
result = await clearMyInvitePartySendAsync(entity_player);
if (result.isFail()) return result;
// 1. user 정보 수정
result = await setInvitePartyToUserAsync(entity_player, party_guid);
if (result.isFail()) return result;
// 2. party join 처리
var party_member = PartyHelper.makePartyMember(entity_player.getUserGuid(), entity_player.getUserNickname());
result = await global_party_action.joinParty(party_guid, party_member);
if (result.isFail())
{
// 2-1. user 정보 롤백
result = await setInvitePartyToUserAsync(entity_player, string.Empty);
}
return result;
}
private async Task<Result> clearMyInvitePartySendAsync(Player entity_player)
{
var result = new Result();
// 1. 파티 정보 조회
var personal_party_action = entity_player.getEntityAction<PersonalPartyAction>();
var personal_party = personal_party_action.getPersonalParty();
if (null == personal_party) return result;
var global_party = GameServerApp.getServerLogic().findGlobalEntity<GlobalParty>();
NullReferenceCheckHelper.throwIfNull(global_party, () => $"global_party is null !!! - {entity_player.toBasicString()}");
var party = global_party.getParty(personal_party.getPartyGuid());
if (null == party) return result;
// 2. 파티 인원수 체크
var party_member_action = party.getEntityAction<GlobalPartyDetailMemberAction>();
NullReferenceCheckHelper.throwIfNull(party_member_action, () => $"party_member_action is null !!! - {entity_player.toBasicString()}");
if (party_member_action.getMemberCount() > 1)
{
var err_msg = $"Failed to reply invite party !!! : already party member - {party.PartyGuid}";
result.setFail(ServerErrorCode.AlreadyPartyMember, err_msg);
Log.getLogger().error(err_msg);
return result;
}
// 3. 파티 destroy
var global_party_acton = global_party.getEntityAction<GlobalPartyAction>();
NullReferenceCheckHelper.throwIfNull(global_party_acton, () => $"global_party_acton is null !!! - {entity_player.toBasicString()}");
result = await global_party_acton.destroyParty(party.PartyGuid, false);
if (result.isFail()) return result;
// 4. user 정보 정리
result = await personal_party_action.clearPersonalParty();
return result;
}
private async Task<Result> setInvitePartyToUserAsync(Player entity_player, PARTY_GUID party_guid)
{
// 1. 파티 정보 설정
var personal_party_action = entity_player.getEntityAction<PersonalPartyAction>();
var result = await personal_party_action.setPersonalPartyGuid(party_guid);
if (result.isFail()) return result;
// 2. 파티 설정
await personal_party_action.setPersonalParty(party_guid);
return result;
}
private async Task<Result> sendReplyInvitePartyResultAsync(Player entity_player, PARTY_GUID party_guid, USER_GUID leader_guid, BoolType replay_invite)
{
var result = new Result();
// 1. party leader 세션 체크
var leader_login_cache = await PartyHelper.getOtherUserLoginCache(entity_player, leader_guid);
if (null == leader_login_cache)
{
var err_msg = $"Failed to get party leader session !!! - {leader_guid}";
result.setFail(ServerErrorCode.NotFoundParty, err_msg);
Log.getLogger().error(err_msg);
return result;
}
// 2. invite 응답 결과 전송
var message_to_leader = new ServerMessage
{
ReplyInvitePartyNoti = new ServerMessage.Types.ReplyInvitePartyNoti()
{
InvitePartyGuid = party_guid,
InviteUserGuid = entity_player.getUserGuid(),
InviteUserNickname = entity_player.getUserNickname(),
Result = replay_invite
}
};
var rabbit_mq = GameServerApp.getServerLogic().getRabbitMqConnector() as RabbitMqConnector;
NullReferenceCheckHelper.throwIfNull(rabbit_mq, () => $"rabbit_mq is null !!!");
rabbit_mq.SendMessage(leader_login_cache.CurrentServer, message_to_leader);
// 3. 파티 초대 Recv 메시지 삭제
var party_recv_action = entity_player.getEntityAction<PartyInvitePartyRecvAction>();
result = await party_recv_action.deleteInvitePartyRecv(party_guid);
return result;
}
private void writeBusinessLog(Player player, string partyGuid, BoolType isInviteAccept)
{
PartyMemberBusinessLog party_member_business_log;
// 1. 파티 초대 응답 기록
var party_member_log =
PartyBusinessLogHelper.toPartyMemberLogData(partyGuid, player.getUserGuid(), PartyMemberActionType.None);
if (BoolType.True != isInviteAccept)
{
party_member_log.PartyMemberActionType = PartyMemberActionType.InviteReject;
party_member_business_log = new PartyMemberBusinessLog(party_member_log);
BusinessLogger.collectLog(player, party_member_business_log);
return;
}
party_member_log.PartyMemberActionType = PartyMemberActionType.InviteAccept;
party_member_business_log = new PartyMemberBusinessLog(party_member_log);
BusinessLogger.collectLog(player, party_member_business_log);
// 2. 파티 정보 기록
var log_invokers = new List<ILogInvoker>(2);
var party_log_data = PartyBusinessLogHelper.toPartyLogData(partyGuid, false);
var party_business_log = new PartyBusinessLog(party_log_data);
log_invokers.Add(party_business_log);
// 3. 파티 가입 기록
party_member_log.PartyMemberActionType = PartyMemberActionType.JoinParty;
party_member_business_log = new PartyMemberBusinessLog(party_member_log);
log_invokers.Add(party_member_business_log);
BusinessLogger.collectLogs(new LogActionEx(LogActionType.JoinParty), player, log_invokers);
}
}