/// <summary> /// Listener for console commands /// </summary> public ConsoleCmdListener() { ListenerThread = new Thread(() => { Console.CursorSize = 35; while ((Command = Console.ReadLine()) != null) { if (!string.IsNullOrEmpty(Command) && !string.IsNullOrWhiteSpace(Command)) { switch (Command.ToLower()) { case "/help": Logger.Log("/jsonreload -> Reloads the JSON definitions"); Logger.Log("/clear -> Clears the entire console window"); Logger.Log("/restart -> Restarts the proxy"); Logger.Log("/shutdown -> Safely shuts the proxy down"); break; case "/jsonreload": JSONPacketManager.LoadDefinitions(); break; case "/clear": Console.Clear(); break; case "/restart": Program.Restart(); break; case "/shutdown": Logger.Log("Shutting down.."); Proxy.Stop(); Program.WaitAndClose(350); break; default: Logger.Log("Unknown command! Type \"/help\" to see all available console commands.", LogType.WARNING); break; } } else { Console.CursorTop -= 1; } } }); ListenerThread.Start(); }
/// <summary> /// Starts both threads /// </summary> public void Run() { ClientThread = new Thread(() => { while (ClientSocket.Receive(ClientHeader, 0, ClientHeader.Length, SocketFlags.None) != 0) { // Parse Packet Length var tmp = ClientHeader.Skip(2).Take(3).ToArray(); var PacketLength = ((0x00 << 24) | (tmp[0] << 16) | (tmp[1] << 8) | tmp[2]); // Initialize Client Buffer ClientBuf = new byte[PacketLength + HEADER_SIZE]; // Apply header for (int i = 0; i < HEADER_SIZE; i++) { ClientBuf[i] = ClientHeader[i]; } // Fill Client Buffer ClientSocket.Receive(ClientBuf, HEADER_SIZE, PacketLength, SocketFlags.None); // Parse & Export Packet Packet ClientPacket = new Packet(ClientBuf, PacketDestination.FROM_CLIENT); ClientPacket.Export(); // Log Packet Logger.Log(ClientPacket.ID + " | " + ClientPacket.DecryptedPayload.Length + " bytes", LogType.PACKET); JSONPacketManager.HandlePacket(ClientPacket); // Resend ServerSocket.Send(ClientPacket.Rebuilt); } }); ServerThread = new Thread(() => { while (ServerSocket.Receive(ServerHeader, 0, ServerHeader.Length, SocketFlags.None) != 0) { // Parse Packet Length var tmp = ServerHeader.Skip(2).Take(3).ToArray(); var PacketLength = ((0x00 << 24) | (tmp[0] << 16) | (tmp[1] << 8) | tmp[2]); // Initialize Server Buffer ServerBuf = new byte[PacketLength + HEADER_SIZE]; // Apply header for (int i = 0; i < HEADER_SIZE; i++) { ServerBuf[i] = ServerHeader[i]; } // Fill Server Buffer ServerSocket.Receive(ServerBuf, HEADER_SIZE, PacketLength, SocketFlags.None); // Parse & Export Packet Packet ServerPacket = new Packet(ServerBuf, PacketDestination.FROM_SERVER); ServerPacket.Export(); // Log Packet Logger.Log(ServerPacket.ID + " | " + ServerPacket.DecryptedPayload.Length + " bytes", LogType.PACKET); JSONPacketManager.HandlePacket(ServerPacket); // Resend ClientSocket.Send(ServerPacket.Rebuilt); } }); ClientThread.Start(); ServerThread.Start(); Running = true; }
/// <summary> /// Starts the proxy /// </summary> public static void Start() { try { // Check dirs Helper.CheckDirectories(); // ASCII art Console.ForegroundColor = Helper.ChooseRandomColor(); Logger.CenterString(@" _____ ____ "); Logger.CenterString(@" / ___/__ ______ ___ _____________ / / / "); Logger.CenterString(@" \__ \/ / / / __ \/ _ \/ ___/ ___/ _ \/ / / "); Logger.CenterString(@" _/ / /_/ / /_/ / __/ / / /__/ __/ / / "); Logger.CenterString(@"/____/\__,_/ .___/\___/_/ \___/\___/_/_/ "); Logger.CenterString(@" /_/____ "); Logger.CenterString(@" / __ \_________ _ ____ __ "); Logger.CenterString(@" / /_/ / ___/ __ \| |/_/ / / / "); Logger.CenterString(@" / ____/ / / /_/ /> </ /_/ / "); Logger.CenterString(@" /_/ /_/ \____/_/|_|\__, / "); Logger.CenterString(@" /____/ "); Logger.CenterString(@" "); Logger.CenterString(Helper.AssemblyVersion); Logger.CenterString("Coded by expl0itr"); Logger.CenterString("Apache Version 2.0 License - © 2016"); Logger.CenterString("https://github.com/expl0itr/SupercellProxy/"); Console.Write(Environment.NewLine); Console.ResetColor(); // Show configuration values Console.Write(Environment.NewLine); Logger.CenterString("==============================="); Logger.CenterString(Config.Game.ReadableName()); Logger.CenterString(Config.Host); Logger.CenterString("Local IP: " + Helper.LocalNetworkIP); Logger.CenterString("==============================="); Console.Write(Environment.NewLine); // Set latest public key Keys.SetPublicKey(); // Bind a new socket to the local EP IPEndPoint EP = new IPEndPoint(IPAddress.Any, Port); Socket ClientListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ClientListener.Bind(EP); ClientListener.Listen(Backlog); // Initialize the JSON Packets JSONPacketManager.LoadDefinitions(); // Listen for connections AcceptThread = new Thread(() => { while (true) { Socket ClientSocket = ClientListener.Accept(); Client c = new Client(ClientSocket); ClientPool.Add(c); Logger.Log("A client connected (" + ClientSocket.GetIP() + ")! Enqueuing.."); c.Enqueue(); } }); AcceptThread.Start(); Logger.Log("Proxy started. Waiting for incoming connections.."); } catch (Exception ex) { Logger.Log("Failed to start the proxy (" + ex.GetType() + ")!"); } }