124 lines
No EOL
3.4 KiB
C#
124 lines
No EOL
3.4 KiB
C#
// WingsEmu
|
|
//
|
|
// Developed by NosWings Team
|
|
|
|
using System;
|
|
using System.Net;
|
|
using System.Net.Sockets;
|
|
using System.Text;
|
|
using LoginServer.Handlers;
|
|
using NetCoreServer;
|
|
using PhoenixLib.Logging;
|
|
using WingsEmu.Packets;
|
|
|
|
namespace LoginServer.Network
|
|
{
|
|
public class LoginClientSession : TcpSession
|
|
{
|
|
private readonly IPacketDeserializer _deserializer;
|
|
private readonly IGlobalPacketProcessor _loginHandlers;
|
|
|
|
|
|
public LoginClientSession(TcpServer server, IGlobalPacketProcessor globalPacketProcessor, IPacketDeserializer deserializer) : base(server)
|
|
{
|
|
_loginHandlers = globalPacketProcessor;
|
|
_deserializer = deserializer;
|
|
}
|
|
|
|
public string IpAddress { get; private set; }
|
|
|
|
public void SendPacket(string packet) => Send(NostaleLoginEncrypter.Encode(packet, Encoding.Default).ToArray());
|
|
|
|
protected override void OnConnected()
|
|
{
|
|
try
|
|
{
|
|
if (IsDisposed)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (IsSocketDisposed)
|
|
{
|
|
Disconnect();
|
|
return;
|
|
}
|
|
|
|
if (Socket == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (Socket?.RemoteEndPoint is IPEndPoint ip)
|
|
{
|
|
IpAddress = ip.Address.ToString();
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Log.Error("[LOGIN_SERVER_SESSION] OnConnected", e);
|
|
Disconnect();
|
|
}
|
|
}
|
|
|
|
protected override void OnReceived(byte[] buffer, long offset, long size)
|
|
{
|
|
try
|
|
{
|
|
string packet = NostaleLoginDecrypter.Decode(buffer.AsSpan((int)offset, (int)size));
|
|
string[] packetSplit = packet.Replace('^', ' ').Split(' ');
|
|
string packetHeader = packetSplit[0];
|
|
if (string.IsNullOrWhiteSpace(packetHeader))
|
|
{
|
|
Disconnect();
|
|
return;
|
|
}
|
|
|
|
TriggerHandler(packetHeader.Replace("#", ""), packet);
|
|
}
|
|
catch
|
|
{
|
|
Disconnect();
|
|
}
|
|
}
|
|
|
|
|
|
private void TriggerHandler(string packetHeader, string packetString)
|
|
{
|
|
if (IsDisposed)
|
|
{
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
(IClientPacket typedPacket, Type packetType) = _deserializer.Deserialize(packetString, false);
|
|
|
|
if (packetType == typeof(UnresolvedPacket) && typedPacket != null)
|
|
{
|
|
Log.Warn($"UNRESOLVED_PACKET : {packetHeader}");
|
|
return;
|
|
}
|
|
|
|
if (packetType == null && typedPacket == null)
|
|
{
|
|
Log.Debug($"DESERIALIZATION_ERROR : {packetString}");
|
|
return;
|
|
}
|
|
|
|
_loginHandlers.Execute(this, typedPacket, packetType);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
// disconnect if something unexpected happens
|
|
Log.Error("Handler Error SessionId: " + Id, ex);
|
|
Disconnect();
|
|
}
|
|
}
|
|
|
|
protected override void OnError(SocketError error)
|
|
{
|
|
Disconnect();
|
|
}
|
|
}
|
|
} |