private async Task <bool> UploadFilters() { var filterJObject = new JObject { ["room"] = new JObject { ["state"] = new JObject { ["not_types"] = new JArray("*") }, ["timeline"] = new JObject { ["limit"] = _messageLimit, ["types"] = new JArray("m.room.message") }, ["ephemeral"] = new JObject { ["not_types"] = new JArray("*") } }, ["presence"] = new JObject { ["not_types"] = new JArray("*") }, ["event_format"] = "client", ["event_fields"] = new JArray("content", "sender") }; string filterUrl = $"/_matrix/client/r0/user/{HttpUtility.UrlEncode(UserId)}/filter"; HttpResponseMessage filterResponse = await _backendHttpClient.Post(filterUrl, true, filterJObject); try { filterResponse.EnsureSuccessStatusCode(); } catch (Exception ex) { if (ex is HttpRequestException || ex is NullReferenceException) { return(false); } throw; } string filterResponseContent = await filterResponse.Content.ReadAsStringAsync(); JObject filterJObjectParsed = JObject.Parse(filterResponseContent); FilterId = (string)filterJObjectParsed["filter_id"]; return(true); }
private async Task <bool> SendMessageRequest(JObject jsonContent) { if (RoomId == null && RoomAlias == null) { throw new NullReferenceException("Both RoomId and RoomAlias are null"); } if (string.IsNullOrWhiteSpace(RoomId)) { HttpResponseMessage getRoomIdResponse = await _backendHttpClient.Get($"/_matrix/client/r0/directory/room/{HttpUtility.UrlEncode(RoomAlias)}", false); try { getRoomIdResponse.EnsureSuccessStatusCode(); } catch (Exception ex) { if (ex is HttpRequestException || ex is NullReferenceException) { Console.WriteLine("Failed to get room ID from room alias"); return(false); } throw; } string getRoomIdResponseContent = await getRoomIdResponse.Content.ReadAsStringAsync(); JObject roomIdJObject = JObject.Parse(getRoomIdResponseContent); RoomId = (string)roomIdJObject["room_id"]; } HttpResponseMessage sendResponse = await _backendHttpClient.Post( $"/_matrix/client/r0/rooms/{HttpUtility.UrlEncode(RoomId)}/send/m.room.message", true, jsonContent); try { sendResponse.EnsureSuccessStatusCode(); return(true); } catch (Exception ex) { if (ex is HttpRequestException || ex is NullReferenceException) { return(false); } throw; } }
/// <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); }