// ClassicalSharp copyright 2014-2016 UnknownShadow200 | Licensed under MIT using System; using System.ComponentModel; using System.Diagnostics; using System.IO; using ClassicalSharp; using OpenTK; namespace Launcher { public static class Client { static DateTime lastJoin; public static bool Start( ClientStartData data, bool classicubeSkins, ref bool shouldExit ) { if( (DateTime.UtcNow - lastJoin).TotalSeconds < 1 ) return false; lastJoin = DateTime.UtcNow; string skinServer = classicubeSkins ? "http://static.classicube.net/skins/" : "http://s3.amazonaws.com/MinecraftSkins/"; string args = data.Username + " " + data.Mppass + " " + data.Ip + " " + data.Port + " " + skinServer; return StartImpl( data, classicubeSkins, args, ref shouldExit ); } public static bool Start( string args, ref bool shouldExit ) { return StartImpl( null, true, args, ref shouldExit ); } static bool StartImpl( ClientStartData data, bool classicubeSkins, string args, ref bool shouldExit ) { string path = Path.Combine( Program.AppDirectory, "ClassicalSharp.exe" ); if( !File.Exists( path ) ) return false; CheckSettings( data, classicubeSkins, out shouldExit ); try { StartProcess( path, args ); } catch( Win32Exception ex ) { if( (uint)ex.ErrorCode != 0x80004005 ) throw; // HRESULT when user clicks 'cancel' to 'are you sure you want to run ClassicalSharp.exe' shouldExit = false; return false; } return true; } static void StartProcess( string path, string args ) { if( Configuration.RunningOnMono ) { // We also need to handle the case of running Mono through wine if( Configuration.RunningOnWindows ) { try { Process.Start( "mono", "\"" + path + "\" " + args ); } catch( Win32Exception ex ) { if( !((uint)ex.ErrorCode == 0x80070002 || (uint)ex.ErrorCode == 0x80004005) ) throw; // File not found HRESULT, HRESULT thrown when running on wine Process.Start( path, args ); } } else { Process.Start( "mono", "\"" + path + "\" " + args ); } } else { Process.Start( path, args ); } } internal static void CheckSettings( ClientStartData data, bool ccSkins, out bool shouldExit ) { shouldExit = false; // Make sure if the client has changed some settings in the meantime, we keep the changes if( !Options.Load() ) return; shouldExit = Options.GetBool( OptionsKey.AutoCloseLauncher, false ); if( data == null ) return; Options.Set( "launcher-username", data.Username ); Options.Set( "launcher-ip", data.Ip ); Options.Set( "launcher-port", data.Port ); Options.Set( "launcher-mppass", Secure.Encode( data.Mppass, data.Username ) ); Options.Set( "launcher-ccskins", ccSkins ); Options.Save(); } } public class ClientStartData { public string Username, Mppass, Ip, Port; public ClientStartData( string user, string mppass, string ip, string port ) { Username = user; Mppass = mppass; Ip = ip; Port = port; } } }