private void HandleAccount(ClashAccount account) { if (account.Authorized && account.Username == UsernameBox.Text && account.Password == PasswordBox.Text) { Edited(account, index); Close(); return; } account.Username = UsernameBox.Text; account.Password = PasswordBox.Text; DoneButton.Text = "Authorizing..."; DoneButton.Enabled = false; var clashAuthorization = new ClashAuthorization(); clashAuthorization.AddAccount(account); if (clashAuthorization.LastReason != 0) { DoneButton.Text = "Done"; DoneButton.Enabled = true; MessageBox.Show(clashAuthorization.LastMessage, "Server response", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } Edited(account, index); Close(); }
// Everything below here is undocumented and taken // from the official launcher through memory dumps. // Therefore, routes may or may not break in the future. public void AddAccount(ClashAccount account) { string friendly = "Tunetoon-" + RandomString(16); var data = new Dictionary <string, string>(); using (var request = new HttpRequestMessage(HttpMethod.Post, ClashBaseAddress + "/api/launcher/v1/register")) { data.Add("username", account.Username); data.Add("password", account.Password); // Friendly is a way of saying "Launcher nickname" // It also has to be unique compared to previous entries data.Add("friendly", friendly); request.Content = new FormUrlEncodedContent(data); var response = httpClient.SendAsync(request).Result; string responseString = response.Content.ReadAsStringAsync().Result; var authObject = JsonConvert.DeserializeObject <ClashAuthorizationResult>(responseString); if (authObject.Status) { account.Authorized = true; account.LoginToken = authObject.Token; } else { account.Authorized = false; account.LoginToken = null; LastMessage = authObject.Message; } LastReason = authObject.Reason; } }
// This requires an authenticated account to use // We just use the mirror URL directly // Provided for reference public void GetMetadata(ClashAccount account) { using (var request = new HttpRequestMessage(HttpMethod.Get, ClashBaseAddress + "/api/launcher/v1/metadata")) { request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", account.LoginToken); var response = httpClient.SendAsync(request).Result; string responseString = response.Content.ReadAsStringAsync().Result; } }
public void LoginAccount(ClashAccount account) { using (var request = new HttpRequestMessage(HttpMethod.Post, ClashBaseAddress + "/api/launcher/v1/login")) { request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", account.LoginToken); request.Headers.Add("x-realm", "production"); var response = httpClient.SendAsync(request).Result; string responseString = response.Content.ReadAsStringAsync().Result; account.LoginResult = JsonConvert.DeserializeObject <ClashLoginResult>(responseString); } }
public void FindClashIngameToons(ClashAccount account) { if (account.Username == null) { return; } string usernameLowercase = account.Username.ToLower(); if (!clashIngameToons.ContainsKey(usernameLowercase)) { return; } var toons = clashIngameToons[usernameLowercase]; foreach (var toon in toons) { if (!account.ClashIngameToons.ContainsKey(toon.Value)) { account.ClashIngameToons.Add(toon.Value, toon.Key); } } }