Пример #1
0
        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;
            }
        }
Пример #3
0
        /// <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);
        }