using Filter; using Filter.Handlers.Instances; using Filter.Handlers.IRC; using Filter.Networking.Instances; using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Reflection; using System.Timers; namespace Filter.Networking.IRC { internal class IRCClient : Client, IDisposable { private FiestaCrypto Crypto; private Timer PingTimer; public int IRCID; public IRCClient(Socket AcceptedSocket, IPEndPoint AcceptedEndPoint) : base(AcceptedSocket, AcceptedEndPoint) { this.SendCrypto(); base.Receive(); } public override void Connected() { } public override void ConnectFailed(SocketException Exception) { } public override void Disconnected() { if (this.IRCID != -1) { Program.IRCConnections.Remove(this.IRCID); } } private void PingTimer_Elapsed(object Sender, ElapsedEventArgs Args) { this.SendPacket(new Packet(IRC1TypeServer.Ping)); } public override void Received(byte[] Buffer) { if (this.IsConnected != 0) { return; } if (this.Crypto != null) { this.Crypto.Crypt(Buffer, 0, (int)Buffer.Length); } Packet packet = new Packet(Buffer); if (!packet.SetHeaderAndType()) { base.Disconnect(); return; } if (!Program.IRCHandlers.HasHandler(packet.Header, packet.Type)) { base.Disconnect(); } else { try { MethodInfo handler = Program.IRCHandlers.GetHandler(packet.Header, packet.Type); IRCHandlerLoader rCHandlers = Program.IRCHandlers; object[] objArray = new object[] { this, packet }; rCHandlers.GetAction(handler, objArray)(); } catch (Exception exception) { base.Disconnect(); } } } public void SendCrypto() { if (this.IsConnected != 0) { return; } this.Crypto = new FiestaCrypto(2); Packet packet = new Packet(IRC1TypeServer.SetXor); packet.WriteInt16(2); this.SendPacket(packet); } public void SendPacket(Packet ServerPacket) { byte[] numArray; if (this.IsConnected != 0) { return; } ServerPacket.ToArray(out numArray); base.Send(numArray); } public void StartPing() { this.PingTimer = new Timer() { AutoReset = true }; this.PingTimer.Elapsed += new ElapsedEventHandler(this.PingTimer_Elapsed); this.PingTimer.Interval = 2000; this.PingTimer.Start(); } } }