147 lines
6.1 KiB
C#
147 lines
6.1 KiB
C#
using Newtonsoft.Json;
|
|
using Google.Protobuf;
|
|
using Google.Protobuf.WellKnownTypes;
|
|
|
|
|
|
using ServerCore;
|
|
using ServerBase;
|
|
using ServerCommon;
|
|
|
|
|
|
using static ServerMessage.Types;
|
|
|
|
|
|
namespace GameServer.PacketHandler;
|
|
|
|
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.InviteFriendToMyhomeReq), typeof(InviteFriendToMyhomePacketHandler), typeof(GameLoginListener))]
|
|
public class InviteFriendToMyhomePacketHandler : PacketRecvHandler
|
|
{
|
|
public override async Task<Result> onProcessPacket(ISession entityWithSession, IMessage recvMessage)
|
|
{
|
|
var player = entityWithSession as Player;
|
|
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !");
|
|
|
|
var recv_msg = recvMessage as ClientToGame;
|
|
ArgumentNullReferenceCheckHelper.throwIfNull(recv_msg, () => $"recv_msg is null !!! - {player.toBasicString()}");
|
|
var request = recv_msg.Request.InviteFriendToMyhomeReq;
|
|
ArgumentNullReferenceCheckHelper.throwIfNull(request, () => $"recv_msg is null !!! - {player.toBasicString()}");
|
|
|
|
var result = new Result();
|
|
var err_msg = string.Empty;
|
|
|
|
var player_action = player.getEntityAction<PlayerAction>();
|
|
NullReferenceCheckHelper.throwIfNull(player_action, () => $"player_action is null !!! - {player.toBasicString()}");
|
|
|
|
var selected_character = player_action.getSelectedCharacter();
|
|
if (null == selected_character)
|
|
{
|
|
err_msg = $"Not selected Character !!! - {player.toBasicString()}";
|
|
result.setFail(ServerErrorCode.CharacterNotSelected, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
|
|
send_GS2C_ACK_INVITE_FRIEND_TO_MYHOME(player, result);
|
|
return result;
|
|
}
|
|
|
|
var character_action = selected_character.getEntityAction<CharacterAction>();
|
|
NullReferenceCheckHelper.throwIfNull(character_action, () => $"character_action is null !!! - {selected_character.toBasicString()}");
|
|
if (character_action.isFarming())
|
|
{
|
|
err_msg = $"Character is Farming !!! - {selected_character.toBasicString()}, {player.toBasicString()}";
|
|
result.setFail(ServerErrorCode.FarimgState, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
|
|
send_GS2C_ACK_INVITE_FRIEND_TO_MYHOME(player, result);
|
|
return result;
|
|
}
|
|
|
|
var friend_infos = request.Infos.ToList();
|
|
|
|
var friend_myhome_action = player.getEntityAction<FriendInviteMyhomeAction>();
|
|
NullReferenceCheckHelper.throwIfNull(friend_myhome_action, () => $"friend_myhome_action is null !!! - {player.toBasicString()}");
|
|
|
|
(result, var fail_infos, var noti_infos) = await friend_myhome_action.inviteFriendToMyhome(friend_infos);
|
|
if (result.isFail())
|
|
{
|
|
send_GS2C_ACK_INVITE_FRIEND_TO_MYHOME(player, result);
|
|
return result;
|
|
}
|
|
|
|
send_GS2C_ACK_INVITE_FRIEND_TO_MYHOME(player, fail_infos, noti_infos);
|
|
|
|
//초대 Noti 전송
|
|
await send_GS2C_NTF_RECEIVE_INVITE_MYHOME(player, noti_infos);
|
|
|
|
//로그
|
|
var invokers = new List<ILogInvoker>();
|
|
Dictionary<string, string> invite_result = new Dictionary<string, string>();
|
|
foreach (var noti in noti_infos)
|
|
{
|
|
invite_result.Add(noti.BaseInfo.ReceiverGuid, ServerErrorCode.Success.ToString());
|
|
}
|
|
foreach (var fail_info in fail_infos)
|
|
{
|
|
invite_result.Add(fail_info.Guid, fail_info.ErrorCode.ToString());
|
|
}
|
|
invokers.Add(new InviteFriendToMyhomeBusinessLog(player.getUserGuid(), invite_result));
|
|
|
|
var log_action = new LogActionEx(LogActionType.RefuseFriendRequest);
|
|
BusinessLogger.collectLogs(log_action, player, invokers);
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
private async Task<bool> send_GS2C_NTF_RECEIVE_INVITE_MYHOME(Player owner, List<ReceiveInviteMyHomeNoti> noties)
|
|
{
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
var rabbit_mq = server_logic.getRabbitMqConnector() as RabbitMQ4Game;
|
|
NullReferenceCheckHelper.throwIfNull(rabbit_mq, () => $"rabbit mq is null !! - player:{owner.toBasicString()}");
|
|
|
|
foreach (var noti in noties)
|
|
{
|
|
ServerMessage messgae = new ServerMessage();
|
|
messgae.ReceiveInviteMyHomeNoti = noti;
|
|
|
|
var login_cache_request = new LoginCacheOtherUserRequest(owner, server_logic.getRedisConnector(), noti.BaseInfo.ReceiverGuid);
|
|
var result = await login_cache_request.fetchLogin();
|
|
if (result.isFail())
|
|
{
|
|
Log.getLogger().info($"send_GS2C_NTF_RECEIVE_INVITE_MYHOME - fetchLogin fail - {result.ErrorCode}, noti : {JsonConvert.SerializeObject(noti)}");
|
|
continue;
|
|
}
|
|
var login_cache = login_cache_request.getLoginCache();
|
|
NullReferenceCheckHelper.throwIfNull(login_cache, () => $"LoginCache is null !! - player:{owner.toBasicString()}");
|
|
|
|
rabbit_mq.SendMessage(login_cache.CurrentServer, messgae);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private static bool send_GS2C_ACK_INVITE_FRIEND_TO_MYHOME(Player owner, Result result)
|
|
{
|
|
ClientToGame ack_packet = new();
|
|
ack_packet.Response = new();
|
|
ack_packet.Response.ErrorCode = result.ErrorCode;
|
|
ack_packet.Response.InviteFriendToMyhomeRes = new();
|
|
|
|
if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) return false;
|
|
return true;
|
|
|
|
}
|
|
|
|
private static bool send_GS2C_ACK_INVITE_FRIEND_TO_MYHOME(Player owner, List<FriendErrorMember> failInfos, List<ReceiveInviteMyHomeNoti> noties)
|
|
{
|
|
ClientToGame ack_packet = new();
|
|
ack_packet.Response = new();
|
|
ack_packet.Response.ErrorCode = ServerErrorCode.Success;
|
|
ack_packet.Response.InviteFriendToMyhomeRes = new();
|
|
ack_packet.Response.InviteFriendToMyhomeRes.FailInfos.AddRange(failInfos);
|
|
ack_packet.Response.InviteFriendToMyhomeRes.SuccessGuids.AddRange(noties.Select(x => x.BaseInfo.ReceiverGuid));
|
|
|
|
if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) return false;
|
|
return true;
|
|
|
|
}
|
|
}
|