Add NoS0577 login packet support in LoginServer
This commit is contained in:
parent
468e8b2b2a
commit
2f767aa609
4 changed files with 205 additions and 0 deletions
|
|
@ -0,0 +1,182 @@
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using LoginServer.Network;
|
||||||
|
using PhoenixLib.Logging;
|
||||||
|
using PhoenixLib.MultiLanguage;
|
||||||
|
using WingsAPI.Communication;
|
||||||
|
using WingsAPI.Communication.DbServer.AccountService;
|
||||||
|
using WingsAPI.Communication.ServerApi;
|
||||||
|
using WingsAPI.Communication.ServerApi.Protocol;
|
||||||
|
using WingsAPI.Communication.Sessions;
|
||||||
|
using WingsAPI.Communication.Sessions.Model;
|
||||||
|
using WingsAPI.Communication.Sessions.Request;
|
||||||
|
using WingsAPI.Communication.Sessions.Response;
|
||||||
|
using WingsAPI.Data.Account;
|
||||||
|
using WingsEmu.DTOs.Account;
|
||||||
|
using WingsEmu.Health;
|
||||||
|
using WingsEmu.Packets.ClientPackets;
|
||||||
|
using WingsEmu.Packets.Enums;
|
||||||
|
|
||||||
|
namespace LoginServer.Handlers
|
||||||
|
{
|
||||||
|
public class TypedCredentialsLogin0577PacketHandler : GenericLoginPacketHandlerBase<Nos0577Packet>
|
||||||
|
{
|
||||||
|
private readonly IAccountService _accountService;
|
||||||
|
private readonly IMaintenanceManager _maintenanceManager;
|
||||||
|
private readonly IServerApiService _serverApiService;
|
||||||
|
private readonly ISessionService _sessionService;
|
||||||
|
|
||||||
|
public TypedCredentialsLogin0577PacketHandler(ISessionService sessionService, IServerApiService serverApiService, IMaintenanceManager maintenanceManager, IAccountService accountService)
|
||||||
|
{
|
||||||
|
_sessionService = sessionService;
|
||||||
|
_serverApiService = serverApiService;
|
||||||
|
_maintenanceManager = maintenanceManager;
|
||||||
|
_accountService = accountService;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override async Task HandlePacketAsync(LoginClientSession session, Nos0577Packet packet)
|
||||||
|
{
|
||||||
|
if (packet == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AccountLoadResponse accountLoadResponse = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
accountLoadResponse = await _accountService.LoadAccountByName(new AccountLoadByNameRequest
|
||||||
|
{
|
||||||
|
Name = packet.Name
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Log.Error("[NEW_TYPED_AUTH_0577] Unexpected error: ", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (accountLoadResponse?.ResponseType != RpcResponseType.SUCCESS)
|
||||||
|
{
|
||||||
|
Log.Warn($"[NEW_TYPED_AUTH_0577] Failed to load account for accountName: '{packet.Name}'");
|
||||||
|
session.SendPacket(session.GenerateFailcPacket(LoginFailType.AccountOrPasswordWrong));
|
||||||
|
session.Disconnect();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AccountDTO loadedAccount = accountLoadResponse.AccountDto;
|
||||||
|
if (!string.Equals(loadedAccount.Password, packet.Password, StringComparison.CurrentCultureIgnoreCase))
|
||||||
|
{
|
||||||
|
session.SendPacket(session.GenerateFailcPacket(LoginFailType.AccountOrPasswordWrong));
|
||||||
|
Log.Debug($"[NEW_TYPED_AUTH_0577] WRONG_CREDENTIALS : {loadedAccount.Name}");
|
||||||
|
session.Disconnect();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SessionResponse modelResponse = await _sessionService.CreateSession(new CreateSessionRequest
|
||||||
|
{
|
||||||
|
AccountId = loadedAccount.Id,
|
||||||
|
AccountName = loadedAccount.Name,
|
||||||
|
AuthorityType = loadedAccount.Authority,
|
||||||
|
IpAddress = session.IpAddress
|
||||||
|
});
|
||||||
|
|
||||||
|
if (modelResponse.ResponseType != RpcResponseType.SUCCESS)
|
||||||
|
{
|
||||||
|
Log.Debug($"[NEW_TYPED_AUTH_0577] FAILED TO CREATE SESSION {loadedAccount.Id}");
|
||||||
|
session.SendPacket(session.GenerateFailcPacket(LoginFailType.AlreadyConnected));
|
||||||
|
session.Disconnect();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AuthorityType type = loadedAccount.Authority;
|
||||||
|
|
||||||
|
AccountBanGetResponse banResponse = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
banResponse = await _accountService.GetAccountBan(new AccountBanGetRequest
|
||||||
|
{
|
||||||
|
AccountId = loadedAccount.Id
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Log.Error("[NEW_TYPED_AUTH_0577] Unexpected error: ", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (banResponse?.ResponseType != RpcResponseType.SUCCESS)
|
||||||
|
{
|
||||||
|
Log.Warn($"[NEW_TYPED_AUTH_0577] Failed to get account ban for accountId: '{loadedAccount.Id}'");
|
||||||
|
session.SendPacket(session.GenerateFailcPacket(LoginFailType.UnhandledError));
|
||||||
|
session.Disconnect();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AccountBanDto characterPenalty = banResponse.AccountBanDto;
|
||||||
|
if (characterPenalty != null)
|
||||||
|
{
|
||||||
|
session.SendPacket(session.GenerateFailcPacket(LoginFailType.Banned));
|
||||||
|
Log.Debug($"[NEW_TYPED_AUTH_0577] ACCOUNT_BANNED : {loadedAccount.Name}");
|
||||||
|
session.Disconnect();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case AuthorityType.Banned:
|
||||||
|
session.SendPacket(session.GenerateFailcPacket(LoginFailType.Banned));
|
||||||
|
Log.Debug("[NEW_TYPED_AUTH_0577] ACCOUNT_BANNED");
|
||||||
|
session.Disconnect();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AuthorityType.Unconfirmed:
|
||||||
|
case AuthorityType.Closed:
|
||||||
|
session.SendPacket(session.GenerateFailcPacket(LoginFailType.CantConnect));
|
||||||
|
Log.Debug("[NEW_TYPED_AUTH_0577] ACCOUNT_NOT_VERIFIED");
|
||||||
|
session.Disconnect();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if (_maintenanceManager.IsMaintenanceActive && loadedAccount.Authority < AuthorityType.GameMaster)
|
||||||
|
{
|
||||||
|
session.SendPacket(session.GenerateFailcPacket(LoginFailType.Maintenance));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SessionResponse connectResponse = await _sessionService.ConnectToLoginServer(new ConnectToLoginServerRequest
|
||||||
|
{
|
||||||
|
AccountId = loadedAccount.Id,
|
||||||
|
ClientVersion = "BYPASS",
|
||||||
|
HardwareId = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||||
|
});
|
||||||
|
|
||||||
|
if (connectResponse.ResponseType != RpcResponseType.SUCCESS)
|
||||||
|
{
|
||||||
|
Log.Warn("[NEW_TYPED_AUTH_0577] General Error SessionId: " + session.Id);
|
||||||
|
session.SendPacket(session.GenerateFailcPacket(LoginFailType.CantConnect));
|
||||||
|
session.Disconnect();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Session connectedSession = connectResponse.Session;
|
||||||
|
|
||||||
|
Log.Debug($"[NEW_TYPED_AUTH_0577] Connected : {packet.Name}:{connectedSession.EncryptionKey}:{connectedSession.HardwareId}");
|
||||||
|
|
||||||
|
RetrieveRegisteredWorldServersResponse worldServersResponse = await _serverApiService.RetrieveRegisteredWorldServers(new RetrieveRegisteredWorldServersRequest
|
||||||
|
{
|
||||||
|
RequesterAuthority = loadedAccount.Authority
|
||||||
|
});
|
||||||
|
|
||||||
|
if (worldServersResponse?.WorldServers is null || !worldServersResponse.WorldServers.Any())
|
||||||
|
{
|
||||||
|
session.SendPacket(session.GenerateFailcPacket(LoginFailType.Maintenance));
|
||||||
|
session.Disconnect();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
session.SendChannelPacketList(connectedSession.EncryptionKey, loadedAccount.Name, RegionLanguageType.EN, worldServersResponse.WorldServers, true);
|
||||||
|
session.Disconnect();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -65,6 +65,7 @@ namespace LoginServer
|
||||||
IGlobalPacketProcessor processor = services.GetRequiredService<IGlobalPacketProcessor>();
|
IGlobalPacketProcessor processor = services.GetRequiredService<IGlobalPacketProcessor>();
|
||||||
|
|
||||||
processor.RegisterHandler(typeof(Nos0575Packet), services.GetRequiredService<TypedCredentialsLoginPacketHandler>());
|
processor.RegisterHandler(typeof(Nos0575Packet), services.GetRequiredService<TypedCredentialsLoginPacketHandler>());
|
||||||
|
processor.RegisterHandler(typeof(Nos0577Packet), services.GetRequiredService<TypedCredentialsLogin0577PacketHandler>());
|
||||||
|
|
||||||
IServerApiService master = services.GetRequiredService<IServerApiService>();
|
IServerApiService master = services.GetRequiredService<IServerApiService>();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ namespace LoginServer
|
||||||
services.TryAddSingleton<IPacketDeserializer, PacketDeserializer>();
|
services.TryAddSingleton<IPacketDeserializer, PacketDeserializer>();
|
||||||
|
|
||||||
services.AddTransient<TypedCredentialsLoginPacketHandler>();
|
services.AddTransient<TypedCredentialsLoginPacketHandler>();
|
||||||
|
services.AddTransient<TypedCredentialsLogin0577PacketHandler>();
|
||||||
|
|
||||||
services.TryAddConnectionMultiplexerFromEnv();
|
services.TryAddConnectionMultiplexerFromEnv();
|
||||||
|
|
||||||
|
|
|
||||||
21
srcs/WingsAPI.Packets/ClientPackets/Nos0577Packet.cs
Normal file
21
srcs/WingsAPI.Packets/ClientPackets/Nos0577Packet.cs
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
namespace WingsEmu.Packets.ClientPackets
|
||||||
|
{
|
||||||
|
[PacketHeader("NoS0577")]
|
||||||
|
public class Nos0577Packet : ClientPacket
|
||||||
|
{
|
||||||
|
[PacketIndex(0)]
|
||||||
|
public int Number { get; set; }
|
||||||
|
|
||||||
|
[PacketIndex(1)]
|
||||||
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
[PacketIndex(2)]
|
||||||
|
public string Password { get; set; }
|
||||||
|
|
||||||
|
[PacketIndex(3)]
|
||||||
|
public string ClientData { get; set; }
|
||||||
|
|
||||||
|
[PacketIndex(4)]
|
||||||
|
public string AuthCode { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue