server-master/srcs/LoginServer/Network/LoginClientSession.cs
2026-02-10 18:21:30 +01:00

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();
}
}
}