using System; using System.Net; using System.Linq; using System.Timers; using System.Threading; using System.Reflection; using System.Net.Sockets; using System.Collections.Generic; using FilterAPI.Networking; namespace FilterLogin.LoginNetworking { internal class LoginClient : DualClientV2, IDisposable { public Guid ClientGUID = Guid.NewGuid(); public FiestaCrypto CCrypto; public FiestaCrypto SCrypto; public Int32 nUserNo; public LoginClient(Socket AcceptedSocket, IPEndPoint AcceptedEndPoint) : base(AcceptedSocket, AcceptedEndPoint, new IPEndPoint(IPAddress.Parse(Program.Conf.GetConfigValue("LoginConnectIP")), Convert.ToInt32(Program.Conf.GetConfigValue("LoginConnectPort")))) { Program.LoginClients.TryAdd(ClientGUID, this); Program.SendConsoleText(ConsoleColor.Cyan, $"Added Client || ENDPOINT: {CIPEP.Address}:{CIPEP.Port}"); } public void SendCrypto() { CCrypto = new FiestaCrypto(Program.Conf, 2); using (var ServerPacket = new Packet(NETCMD.LOGIN_SET_XOR)) { ServerPacket.PacketWriter.Write((UInt16)2); SendPacketClient(ServerPacket); } } public override void RecdClient(Byte[] Buffer) { if (CCrypto != null) { CCrypto.Crypt(Buffer, 0, Buffer.Length); } if (Buffer != null && Buffer.Length >= 2) { using (var ClientPacket = new Packet(Buffer)) { if (!ClientPacket.SetOPCode()) { Dispose(); } else if (Program.LoginHandlers.HasHandler(ClientPacket.OPCode)) { //Console.WriteLine($"HANDLING Client -- Header: {ClientPacket.Header} || Type: {ClientPacket.Type}"); try { MethodInfo PacketMethod = Program.LoginHandlers.GetHandler(ClientPacket.OPCode); Action PacketAction = Program.LoginHandlers.GetAction(PacketMethod, this, ClientPacket); PacketAction(); } catch (Exception Error) { SendPacketServer(ClientPacket); //Console.WriteLine(String.Format("Header: {0} || Type: {1}\n{2}", ClientPacket.Header, ClientPacket.Type, Error.ToString())); Program.SendConsoleText(ConsoleColor.Red, String.Format("Header: {0} || Type: {1}\n{2}", ClientPacket.Header, ClientPacket.Type, Error.ToString())); } } else { SendPacketServer(ClientPacket); } } } } public void SendPacketClient(Packet ServerPacket) { Byte[] PacketBuffer; ServerPacket.ToArray(out PacketBuffer); SendClient(PacketBuffer); } public override void RecdServer(Byte[] Buffer) { if (Buffer != null && Buffer.Length >= 2) { using (var ServerPacket = new Packet(Buffer)) { if (!ServerPacket.SetOPCode()) { Dispose(); } else if (Program.LoginHandlers.HasHandler(ServerPacket.OPCode)) { //Console.WriteLine($"HANDLING SERVER -- Header: {ServerPacket.Header} || Type: {ServerPacket.Type}"); try { MethodInfo PacketMethod = Program.LoginHandlers.GetHandler(ServerPacket.OPCode); Action PacketAction = Program.LoginHandlers.GetAction(PacketMethod, this, ServerPacket); PacketAction(); } catch (Exception Error) { SendPacketClient(ServerPacket); //Console.WriteLine(String.Format("Header: {0} || Type: {1}\n{2}", ServerPacket.Header, ServerPacket.Type, Error.ToString())); Program.SendConsoleText(ConsoleColor.Red, String.Format("Header: {0} || Type: {1}\n{2}", ServerPacket.Header, ServerPacket.Type, Error.ToString())); } } else { SendPacketClient(ServerPacket); } } } } public void SendPacketServer(Packet ClientPacket) { Byte[] PacketBuffer; ClientPacket.ToArray(SCrypto, out PacketBuffer); SendServer(PacketBuffer); } public override void Disconnected() { LoginClient LClient; Program.LoginClients.TryRemove(ClientGUID, out LClient); } } }