/// <summary> /// Set access token for httpClient in use by room /// </summary> /// <param name="token">Access token</param> public void SetAccessToken(string token) => _backendHttpClient.SetAccessToken(token);
/// <summary> /// Login to a Matrix account /// </summary> /// <param name="host">Homeserver the account uses</param> /// <param name="credentials">MatrixCredentials object that contains login info</param> /// <returns>Bool based on success or failure</returns> public async Task <bool> Login(string host, MatrixCredentials credentials) { _backendHttpClient = new MatrixHttp(host); JObject loginJObject = JObject.FromObject(credentials); HttpResponseMessage loginResponse = await _backendHttpClient.Post("/_matrix/client/r0/login", false, loginJObject); string loginResponseContent = string.Empty; try { loginResponseContent = await loginResponse.Content.ReadAsStringAsync(); loginResponse.EnsureSuccessStatusCode(); } catch (HttpRequestException) { JObject error = JObject.Parse(loginResponseContent); switch (loginResponse.StatusCode) { case HttpStatusCode.BadRequest: throw new MatrixRequestException($"{error["errcode"]} - {error["error"]}. Bad login request"); case HttpStatusCode.Forbidden: throw new MatrixRequestException($"{error["error"]}. Login credentials were incorrect"); case HttpStatusCode.TooManyRequests: var rateLimit = (int)error["retry_after_ms"]; Console.WriteLine($"You're being rate-limited, waiting {rateLimit}ms"); await Task.Delay(rateLimit); return(false); default: throw new MatrixRequestException( $"{error["errcode"] ?? ""} - {error["error"] ?? ""}. Unknown error occured, error code {loginResponse.StatusCode.ToString()}"); } } catch (NullReferenceException) { Console.WriteLine("Unknown error occurred in request"); return(false); } JObject loginResponseJObject = JObject.Parse(loginResponseContent); AccessToken = (string)loginResponseJObject["access_token"]; DeviceId = (string)loginResponseJObject["device_id"]; HomeServer = (string)loginResponseJObject["home_server"]; UserId = (string)loginResponseJObject["user_id"]; _backendHttpClient.SetAccessToken(AccessToken); bool filtersResult = await UploadFilters(); if (!filtersResult) { Console.WriteLine("Failed to upload filters"); } return(true); }