132 lines
5.4 KiB
C#
132 lines
5.4 KiB
C#
using Google.Protobuf;
|
|
using Google.Protobuf.WellKnownTypes;
|
|
|
|
|
|
using ServerCore;
|
|
using ServerBase;
|
|
using ServerCommon;
|
|
|
|
|
|
namespace GameServer.PacketHandler;
|
|
|
|
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.SendFriendRequestReq), typeof(SendFriendRequestPacketHandler), typeof(GameLoginListener))]
|
|
public class SendFriendRequestPacketHandler : PacketRecvHandler
|
|
{
|
|
public override async Task<Result> onProcessPacket(ISession session, IMessage recvMessage)
|
|
{
|
|
var owner = session as Player;
|
|
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
|
|
var recv_msg = recvMessage as ClientToGame;
|
|
NullReferenceCheckHelper.throwIfNull(recv_msg, () => $"recv_msg is null !!!");
|
|
var request = recv_msg.Request.SendFriendRequestReq;
|
|
var nickname = request.NickName;
|
|
|
|
var friend_agent_action = owner.getEntityAction<FriendAgentAction>();
|
|
|
|
//닉네임 없으면 존재하지 않는 캐릭터
|
|
(var result, var nickname_attrib) = await NicknameHelper.findNickname(nickname);
|
|
if (result.isFail())
|
|
{
|
|
Log.getLogger().error($"SendFriendRequestReq nickname not found. nickname : {nickname}");
|
|
result.setFail(ServerErrorCode.FriendRequestNotExistInfo);
|
|
send_GS2C_ACK_SEND_FRIEND_REQUEST(owner, result);
|
|
|
|
return result;
|
|
}
|
|
|
|
NullReferenceCheckHelper.throwIfNull(nickname_attrib, () => $"nickname_attrib is null !!!");
|
|
|
|
var friend_guid = nickname_attrib.UserGuid;
|
|
var send_friend_request_action = owner.getEntityAction<SendFriendRequestAction>();
|
|
|
|
result = await send_friend_request_action.addRequestToCache(nickname, friend_guid);
|
|
if(result.isFail())
|
|
{
|
|
//에러 패킷 리턴
|
|
send_GS2C_ACK_SEND_FRIEND_REQUEST(owner, result);
|
|
return result;
|
|
}
|
|
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
var friend_request_cache = new FriendReqCacheRequest(owner, owner.getUserGuid(), friend_guid, server_logic.getRedisConnector());
|
|
|
|
(result, var req) = await friend_agent_action.sendedRequestExistCheck(friend_request_cache, friend_guid);
|
|
if (result.isFail() || friend_request_cache is null)
|
|
{
|
|
send_GS2C_ACK_SEND_FRIEND_REQUEST(owner, result);
|
|
return result;
|
|
}
|
|
|
|
NullReferenceCheckHelper.throwIfNull(req, () => $"req is null !!!");
|
|
|
|
FriendRequestInfo info = new();
|
|
info.NickName = nickname;
|
|
info.Guid = req.m_receiver_guid;
|
|
info.IsNew = req.m_is_new;
|
|
info.RequestTime = Timestamp.FromDateTime(req.m_request_time);
|
|
send_GS2C_ACK_SEND_FRIEND_REQUEST(owner, result, info);
|
|
|
|
await send_GS2CS_NTF_FRIEND_REQUEST(owner, info);
|
|
|
|
//Log
|
|
List<ILogInvoker> invokers = new List<ILogInvoker>();
|
|
invokers.Add(new SendFriendRequestBusinessLog(owner.getUserGuid(), friend_guid));
|
|
var log_action = new LogActionEx(LogActionType.SendFriendRequest);
|
|
BusinessLogger.collectLogs(log_action, owner, invokers);
|
|
|
|
|
|
await QuestManager.It.QuestCheck(owner, new QuestFriend(EQuestEventTargetType.FRIEND, EQuestEventNameType.REQUESTED));
|
|
|
|
return result;
|
|
}
|
|
|
|
private static async Task<bool> send_GS2CS_NTF_FRIEND_REQUEST(Player owner, FriendRequestInfo info)
|
|
{
|
|
var message = new ServerMessage();
|
|
message.FriendRequestNoti = new();
|
|
message.FriendRequestNoti.RequestInfo = new();
|
|
message.FriendRequestNoti.RequestInfo.Guid = info.Guid;
|
|
message.FriendRequestNoti.RequestInfo.NickName = info.NickName;
|
|
message.FriendRequestNoti.RequestInfo.RequestTime = info.RequestTime;
|
|
message.FriendRequestNoti.RequestInfo.IsNew = info.IsNew;
|
|
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
var rabbit_mq = server_logic.getRabbitMqConnector() as RabbitMqConnector;
|
|
NullReferenceCheckHelper.throwIfNull(rabbit_mq, () => $"rabbit_mq is null !!!");
|
|
var login_cache_request = new LoginCacheOtherUserRequest(owner, server_logic.getRedisConnector(), info.Guid);
|
|
var result = await login_cache_request.fetchLogin();
|
|
if (result.isSuccess())
|
|
{
|
|
var login_cache = login_cache_request.getLoginCache();
|
|
NullReferenceCheckHelper.throwIfNull(login_cache, () => $"login_cache is null !!!");
|
|
rabbit_mq.SendMessage(login_cache.CurrentServer, message);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
private static bool send_GS2C_ACK_SEND_FRIEND_REQUEST(Player owner, Result result)
|
|
{
|
|
var ack_packet = new ClientToGame();
|
|
ack_packet.Response = new ClientToGameRes();
|
|
ack_packet.Response.ErrorCode = result.ErrorCode;
|
|
ack_packet.Response.SendFriendRequestRes = new();
|
|
|
|
if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) { return false; }
|
|
return true;
|
|
}
|
|
|
|
|
|
private static bool send_GS2C_ACK_SEND_FRIEND_REQUEST(Player owner, Result result, FriendRequestInfo info)
|
|
{
|
|
var ack_packet = new ClientToGame();
|
|
ack_packet.Response = new ClientToGameRes();
|
|
ack_packet.Response.ErrorCode = result.ErrorCode;
|
|
ack_packet.Response.SendFriendRequestRes = new();
|
|
ack_packet.Response.SendFriendRequestRes.FriendRequestInfo = info;
|
|
|
|
if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) { return false; }
|
|
return true;
|
|
}
|
|
}
|