diff --git a/Cargo.lock b/Cargo.lock
index 2a802913..c6c17691 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -213,9 +213,9 @@ dependencies = [
[[package]]
name = "const_fn"
-version = "0.4.5"
+version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28b9d6de7f49e22cf97ad17fc4036ece69300032f45f78f30b4a4482cdc3f4a6"
+checksum = "076a6803b0dacd6a88cfe64deba628b01533ff5ef265687e6938280c1afd0a28"
[[package]]
name = "constant_time_eq"
@@ -356,9 +356,9 @@ checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0"
[[package]]
name = "dtoa"
-version = "0.4.7"
+version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88d7ed2934d741c6b37e33e3832298e8850b53fd2d2bea03873375596c7cea4e"
+checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0"
[[package]]
name = "either"
@@ -402,9 +402,9 @@ dependencies = [
[[package]]
name = "figment"
-version = "0.10.3"
+version = "0.10.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c38799b106530aa30f774f7fca6d8f7e5f6234a79f427c4fad3c975eaf678931"
+checksum = "0ca029e813a72b7526d28273d25f3e4a2f365d1b7a1018a6f93ec9053a119763"
dependencies = [
"atomic",
"pear",
@@ -693,9 +693,9 @@ dependencies = [
[[package]]
name = "hyper"
-version = "0.14.4"
+version = "0.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8e946c2b1349055e0b72ae281b238baf1a3ea7307c7e9f9d64673bdd9c26ac7"
+checksum = "8bf09f61b52cfcf4c00de50df88ae423d6c02354e385a86341133b5338630ad1"
dependencies = [
"bytes",
"futures-channel",
@@ -708,7 +708,7 @@ dependencies = [
"httpdate",
"itoa",
"pin-project",
- "socket2",
+ "socket2 0.4.0",
"tokio",
"tower-service",
"tracing",
@@ -764,6 +764,7 @@ checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3"
dependencies = [
"autocfg",
"hashbrown",
+ "serde",
]
[[package]]
@@ -793,7 +794,7 @@ version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7e2f18aece9709094573a9f24f483c4f65caa4298e2f7ae1b71cc65d853fad7"
dependencies = [
- "socket2",
+ "socket2 0.3.19",
"widestring",
"winapi",
"winreg 0.6.2",
@@ -846,9 +847,9 @@ checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2"
[[package]]
name = "js-sys"
-version = "0.3.49"
+version = "0.3.50"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc15e39392125075f60c95ba416f5381ff6c3a948ff02ab12464715adf56c821"
+checksum = "2d99f9e3e84b8f67f846ef5b4cbbc3b1c29f6c759fcbce6f01aa0e73d932a24c"
dependencies = [
"wasm-bindgen",
]
@@ -884,9 +885,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "libc"
-version = "0.2.91"
+version = "0.2.92"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8916b1f6ca17130ec6568feccee27c156ad12037880833a3b842a823236502e7"
+checksum = "56d855069fafbb9b344c0f962150cd2c1187975cb1c22c1522c240d8c4986714"
[[package]]
name = "linked-hash-map"
@@ -896,9 +897,9 @@ checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3"
[[package]]
name = "lock_api"
-version = "0.4.2"
+version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd96ffd135b2fd7b973ac026d28085defbe8983df057ced3eb4f2130b0831312"
+checksum = "5a3c91c24eae6777794bb1997ad98bbb87daf92890acab859f7eaa4320333176"
dependencies = [
"scopeguard",
]
@@ -956,9 +957,9 @@ checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525"
[[package]]
name = "memoffset"
-version = "0.6.2"
+version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc14fc54a812b4472b4113facc3e44d099fbc0ea2ce0551fa5c703f8edfbfd38"
+checksum = "f83fb6581e8ed1f85fd45c116db8405483899489e38406156c25eb743554361d"
dependencies = [
"autocfg",
]
@@ -1315,10 +1316,11 @@ dependencies = [
[[package]]
name = "proc-macro-crate"
-version = "0.1.5"
+version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785"
+checksum = "41fdbd1df62156fbc5945f4762632564d7d038153091c3fcf1067f6aef7cff92"
dependencies = [
+ "thiserror",
"toml",
]
@@ -1336,9 +1338,9 @@ checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086"
[[package]]
name = "proc-macro2"
-version = "1.0.24"
+version = "1.0.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
+checksum = "a152013215dca273577e18d2bf00fa862b89b24169fb78c4c95aeb07992c9cec"
dependencies = [
"unicode-xid",
]
@@ -1623,7 +1625,7 @@ dependencies = [
[[package]]
name = "ruma"
version = "0.0.2"
-source = "git+https://github.com/ruma/ruma?rev=f196f5b6f164973d6b343af31ab4e0457f743675#f196f5b6f164973d6b343af31ab4e0457f743675"
+source = "git+https://github.com/ruma/ruma?rev=a310ccc318a4eb51062923d570d5a86c1468e8a1#a310ccc318a4eb51062923d570d5a86c1468e8a1"
dependencies = [
"assign",
"js_int",
@@ -1643,7 +1645,7 @@ dependencies = [
[[package]]
name = "ruma-api"
version = "0.17.0-alpha.2"
-source = "git+https://github.com/ruma/ruma?rev=f196f5b6f164973d6b343af31ab4e0457f743675#f196f5b6f164973d6b343af31ab4e0457f743675"
+source = "git+https://github.com/ruma/ruma?rev=a310ccc318a4eb51062923d570d5a86c1468e8a1#a310ccc318a4eb51062923d570d5a86c1468e8a1"
dependencies = [
"http",
"percent-encoding",
@@ -1658,7 +1660,7 @@ dependencies = [
[[package]]
name = "ruma-api-macros"
version = "0.17.0-alpha.2"
-source = "git+https://github.com/ruma/ruma?rev=f196f5b6f164973d6b343af31ab4e0457f743675#f196f5b6f164973d6b343af31ab4e0457f743675"
+source = "git+https://github.com/ruma/ruma?rev=a310ccc318a4eb51062923d570d5a86c1468e8a1#a310ccc318a4eb51062923d570d5a86c1468e8a1"
dependencies = [
"proc-macro-crate",
"proc-macro2",
@@ -1669,7 +1671,7 @@ dependencies = [
[[package]]
name = "ruma-appservice-api"
version = "0.2.0-alpha.2"
-source = "git+https://github.com/ruma/ruma?rev=f196f5b6f164973d6b343af31ab4e0457f743675#f196f5b6f164973d6b343af31ab4e0457f743675"
+source = "git+https://github.com/ruma/ruma?rev=a310ccc318a4eb51062923d570d5a86c1468e8a1#a310ccc318a4eb51062923d570d5a86c1468e8a1"
dependencies = [
"ruma-api",
"ruma-common",
@@ -1683,7 +1685,7 @@ dependencies = [
[[package]]
name = "ruma-client-api"
version = "0.10.0-alpha.2"
-source = "git+https://github.com/ruma/ruma?rev=f196f5b6f164973d6b343af31ab4e0457f743675#f196f5b6f164973d6b343af31ab4e0457f743675"
+source = "git+https://github.com/ruma/ruma?rev=a310ccc318a4eb51062923d570d5a86c1468e8a1#a310ccc318a4eb51062923d570d5a86c1468e8a1"
dependencies = [
"assign",
"http",
@@ -1701,21 +1703,24 @@ dependencies = [
[[package]]
name = "ruma-common"
-version = "0.3.0-alpha.1"
-source = "git+https://github.com/ruma/ruma?rev=f196f5b6f164973d6b343af31ab4e0457f743675#f196f5b6f164973d6b343af31ab4e0457f743675"
+version = "0.3.1"
+source = "git+https://github.com/ruma/ruma?rev=a310ccc318a4eb51062923d570d5a86c1468e8a1#a310ccc318a4eb51062923d570d5a86c1468e8a1"
dependencies = [
+ "indexmap",
"js_int",
"maplit",
"ruma-identifiers",
"ruma-serde",
"serde",
"serde_json",
+ "tracing",
+ "wildmatch",
]
[[package]]
name = "ruma-events"
version = "0.22.0-alpha.2"
-source = "git+https://github.com/ruma/ruma?rev=f196f5b6f164973d6b343af31ab4e0457f743675#f196f5b6f164973d6b343af31ab4e0457f743675"
+source = "git+https://github.com/ruma/ruma?rev=a310ccc318a4eb51062923d570d5a86c1468e8a1#a310ccc318a4eb51062923d570d5a86c1468e8a1"
dependencies = [
"js_int",
"ruma-common",
@@ -1729,7 +1734,7 @@ dependencies = [
[[package]]
name = "ruma-events-macros"
version = "0.22.0-alpha.2"
-source = "git+https://github.com/ruma/ruma?rev=f196f5b6f164973d6b343af31ab4e0457f743675#f196f5b6f164973d6b343af31ab4e0457f743675"
+source = "git+https://github.com/ruma/ruma?rev=a310ccc318a4eb51062923d570d5a86c1468e8a1#a310ccc318a4eb51062923d570d5a86c1468e8a1"
dependencies = [
"proc-macro-crate",
"proc-macro2",
@@ -1740,7 +1745,7 @@ dependencies = [
[[package]]
name = "ruma-federation-api"
version = "0.1.0-alpha.1"
-source = "git+https://github.com/ruma/ruma?rev=f196f5b6f164973d6b343af31ab4e0457f743675#f196f5b6f164973d6b343af31ab4e0457f743675"
+source = "git+https://github.com/ruma/ruma?rev=a310ccc318a4eb51062923d570d5a86c1468e8a1#a310ccc318a4eb51062923d570d5a86c1468e8a1"
dependencies = [
"js_int",
"ruma-api",
@@ -1754,8 +1759,8 @@ dependencies = [
[[package]]
name = "ruma-identifiers"
-version = "0.18.0-alpha.1"
-source = "git+https://github.com/ruma/ruma?rev=f196f5b6f164973d6b343af31ab4e0457f743675#f196f5b6f164973d6b343af31ab4e0457f743675"
+version = "0.18.1"
+source = "git+https://github.com/ruma/ruma?rev=a310ccc318a4eb51062923d570d5a86c1468e8a1#a310ccc318a4eb51062923d570d5a86c1468e8a1"
dependencies = [
"paste",
"rand",
@@ -1768,8 +1773,8 @@ dependencies = [
[[package]]
name = "ruma-identifiers-macros"
-version = "0.18.0-alpha.1"
-source = "git+https://github.com/ruma/ruma?rev=f196f5b6f164973d6b343af31ab4e0457f743675#f196f5b6f164973d6b343af31ab4e0457f743675"
+version = "0.18.1"
+source = "git+https://github.com/ruma/ruma?rev=a310ccc318a4eb51062923d570d5a86c1468e8a1#a310ccc318a4eb51062923d570d5a86c1468e8a1"
dependencies = [
"proc-macro2",
"quote",
@@ -1779,13 +1784,13 @@ dependencies = [
[[package]]
name = "ruma-identifiers-validation"
-version = "0.2.0"
-source = "git+https://github.com/ruma/ruma?rev=f196f5b6f164973d6b343af31ab4e0457f743675#f196f5b6f164973d6b343af31ab4e0457f743675"
+version = "0.2.2"
+source = "git+https://github.com/ruma/ruma?rev=a310ccc318a4eb51062923d570d5a86c1468e8a1#a310ccc318a4eb51062923d570d5a86c1468e8a1"
[[package]]
name = "ruma-identity-service-api"
version = "0.0.1"
-source = "git+https://github.com/ruma/ruma?rev=f196f5b6f164973d6b343af31ab4e0457f743675#f196f5b6f164973d6b343af31ab4e0457f743675"
+source = "git+https://github.com/ruma/ruma?rev=a310ccc318a4eb51062923d570d5a86c1468e8a1#a310ccc318a4eb51062923d570d5a86c1468e8a1"
dependencies = [
"ruma-api",
"ruma-common",
@@ -1798,7 +1803,7 @@ dependencies = [
[[package]]
name = "ruma-push-gateway-api"
version = "0.0.1"
-source = "git+https://github.com/ruma/ruma?rev=f196f5b6f164973d6b343af31ab4e0457f743675#f196f5b6f164973d6b343af31ab4e0457f743675"
+source = "git+https://github.com/ruma/ruma?rev=a310ccc318a4eb51062923d570d5a86c1468e8a1#a310ccc318a4eb51062923d570d5a86c1468e8a1"
dependencies = [
"js_int",
"ruma-api",
@@ -1812,8 +1817,8 @@ dependencies = [
[[package]]
name = "ruma-serde"
-version = "0.3.0"
-source = "git+https://github.com/ruma/ruma?rev=f196f5b6f164973d6b343af31ab4e0457f743675#f196f5b6f164973d6b343af31ab4e0457f743675"
+version = "0.3.1"
+source = "git+https://github.com/ruma/ruma?rev=a310ccc318a4eb51062923d570d5a86c1468e8a1#a310ccc318a4eb51062923d570d5a86c1468e8a1"
dependencies = [
"form_urlencoded",
"itoa",
@@ -1825,8 +1830,8 @@ dependencies = [
[[package]]
name = "ruma-serde-macros"
-version = "0.3.0"
-source = "git+https://github.com/ruma/ruma?rev=f196f5b6f164973d6b343af31ab4e0457f743675#f196f5b6f164973d6b343af31ab4e0457f743675"
+version = "0.3.1"
+source = "git+https://github.com/ruma/ruma?rev=a310ccc318a4eb51062923d570d5a86c1468e8a1#a310ccc318a4eb51062923d570d5a86c1468e8a1"
dependencies = [
"proc-macro-crate",
"proc-macro2",
@@ -1836,8 +1841,8 @@ dependencies = [
[[package]]
name = "ruma-signatures"
-version = "0.6.0-alpha.1"
-source = "git+https://github.com/ruma/ruma?rev=f196f5b6f164973d6b343af31ab4e0457f743675#f196f5b6f164973d6b343af31ab4e0457f743675"
+version = "0.6.0"
+source = "git+https://github.com/ruma/ruma?rev=a310ccc318a4eb51062923d570d5a86c1468e8a1#a310ccc318a4eb51062923d570d5a86c1468e8a1"
dependencies = [
"base64 0.13.0",
"ring",
@@ -1915,9 +1920,9 @@ dependencies = [
[[package]]
name = "security-framework"
-version = "2.1.2"
+version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d493c5f39e02dfb062cd8f33301f90f9b13b650e8c1b1d0fd75c19dd64bff69d"
+checksum = "3670b1d2fdf6084d192bc71ead7aabe6c06aa2ea3fbd9cc3ac111fa5c2b1bd84"
dependencies = [
"bitflags",
"core-foundation",
@@ -1928,9 +1933,9 @@ dependencies = [
[[package]]
name = "security-framework-sys"
-version = "2.1.1"
+version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dee48cdde5ed250b0d3252818f646e174ab414036edb884dde62d80a3ac6082d"
+checksum = "3676258fd3cfe2c9a0ec99ce3038798d847ce3e4bb17746373eb9f0f1ac16339"
dependencies = [
"core-foundation-sys",
"libc",
@@ -2081,6 +2086,16 @@ dependencies = [
"winapi",
]
+[[package]]
+name = "socket2"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e3dfc207c526015c632472a77be09cf1b6e46866581aecae5cc38fb4235dea2"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
[[package]]
name = "spin"
version = "0.5.2"
@@ -2105,7 +2120,7 @@ checksum = "3015a7d0a5fd5105c91c3710d42f9ccf0abfb287d62206484dcc67f9569a6483"
[[package]]
name = "state-res"
version = "0.1.0"
-source = "git+https://github.com/timokoesters/state-res?branch=improvements#625c37cb776b381a83ab7ee58b13e32506849648"
+source = "git+https://github.com/ruma/state-res?rev=af450d0fe2b0e1c890284d0bc3b9d6d4008ac475#af450d0fe2b0e1c890284d0bc3b9d6d4008ac475"
dependencies = [
"itertools 0.10.0",
"log",
@@ -2167,9 +2182,9 @@ checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0"
[[package]]
name = "syn"
-version = "1.0.64"
+version = "1.0.68"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fd9d1e9976102a03c542daa2eff1b43f9d72306342f3f8b3ed5fb8908195d6f"
+checksum = "3ce15dd3ed8aa2f8eeac4716d6ef5ab58b6b9256db41d7e1a0224c2788e8fd87"
dependencies = [
"proc-macro2",
"quote",
@@ -2300,9 +2315,9 @@ dependencies = [
[[package]]
name = "tinyvec"
-version = "1.1.1"
+version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "317cca572a0e89c3ce0ca1f1bdc9369547fe318a683418e42ac8f59d14701023"
+checksum = "5b5220f05bb7de7f3f53c7c065e1199b3172696fe2db9f9c4d8ad9b4ee74c342"
dependencies = [
"tinyvec_macros",
]
@@ -2634,9 +2649,9 @@ checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
[[package]]
name = "wasm-bindgen"
-version = "0.2.72"
+version = "0.2.73"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fe8f61dba8e5d645a4d8132dc7a0a66861ed5e1045d2c0ed940fab33bac0fbe"
+checksum = "83240549659d187488f91f33c0f8547cbfef0b2088bc470c116d1d260ef623d9"
dependencies = [
"cfg-if",
"serde",
@@ -2646,9 +2661,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-backend"
-version = "0.2.72"
+version = "0.2.73"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "046ceba58ff062da072c7cb4ba5b22a37f00a302483f7e2a6cdc18fedbdc1fd3"
+checksum = "ae70622411ca953215ca6d06d3ebeb1e915f0f6613e3b495122878d7ebec7dae"
dependencies = [
"bumpalo",
"lazy_static",
@@ -2661,9 +2676,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-futures"
-version = "0.4.22"
+version = "0.4.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73157efb9af26fb564bb59a009afd1c7c334a44db171d280690d0c3faaec3468"
+checksum = "81b8b767af23de6ac18bf2168b690bed2902743ddf0fb39252e36f9e2bfc63ea"
dependencies = [
"cfg-if",
"js-sys",
@@ -2673,9 +2688,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.72"
+version = "0.2.73"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ef9aa01d36cda046f797c57959ff5f3c615c9cc63997a8d545831ec7976819b"
+checksum = "3e734d91443f177bfdb41969de821e15c516931c3c3db3d318fa1b68975d0f6f"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -2683,9 +2698,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.72"
+version = "0.2.73"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96eb45c1b2ee33545a813a92dbb53856418bf7eb54ab34f7f7ff1448a5b3735d"
+checksum = "d53739ff08c8a68b0fdbcd54c372b8ab800b1449ab3c9d706503bc7dd1621b2c"
dependencies = [
"proc-macro2",
"quote",
@@ -2696,15 +2711,15 @@ dependencies = [
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.72"
+version = "0.2.73"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7148f4696fb4960a346eaa60bbfb42a1ac4ebba21f750f75fc1375b098d5ffa"
+checksum = "d9a543ae66aa233d14bb765ed9af4a33e81b8b58d1584cf1b47ff8cd0b9e4489"
[[package]]
name = "web-sys"
-version = "0.3.49"
+version = "0.3.50"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "59fe19d70f5dacc03f6e46777213facae5ac3801575d56ca6cbd4c93dcd12310"
+checksum = "a905d57e488fec8861446d3393670fb50d27a262344013181c2cdf9fff5481be"
dependencies = [
"js-sys",
"wasm-bindgen",
@@ -2732,6 +2747,12 @@ version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c168940144dd21fd8046987c16a46a33d5fc84eec29ef9dcddc2ac9e31526b7c"
+[[package]]
+name = "wildmatch"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07ae7ce410f81ba679081aac1d4874f3b1c328535b630209aa5b4cdaaf895e20"
+
[[package]]
name = "winapi"
version = "0.3.9"
diff --git a/Cargo.toml b/Cargo.toml
index 453bc8e3..7bd1557b 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -18,12 +18,12 @@ rocket = { git = "https://github.com/SergioBenitez/Rocket.git", rev = "93e62c86e
#rocket = { git = "https://github.com/timokoesters/Rocket.git", branch = "empty_parameters", default-features = false, features = ["tls"] }
# Used for matrix spec type definitions and helpers
-ruma = { git = "https://github.com/ruma/ruma", features = ["rand", "appservice-api", "client-api", "federation-api", "push-gateway-api", "unstable-pre-spec", "unstable-synapse-quirks", "unstable-exhaustive-types"], rev = "f196f5b6f164973d6b343af31ab4e0457f743675" }
+ruma = { git = "https://github.com/ruma/ruma", rev = "a310ccc318a4eb51062923d570d5a86c1468e8a1", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "unstable-pre-spec", "unstable-exhaustive-types"] }
#ruma = { git = "https://github.com/DevinR528/ruma", features = ["rand", "client-api", "federation-api", "push-gateway-api", "unstable-exhaustive-types", "unstable-pre-spec", "unstable-synapse-quirks"], branch = "verified-export" }
#ruma = { path = "../ruma/ruma", features = ["unstable-exhaustive-types", "rand", "client-api", "federation-api", "push-gateway-api", "unstable-pre-spec", "unstable-synapse-quirks"] }
# Used when doing state resolution
-state-res = { git = "https://github.com/timokoesters/state-res", branch = "improvements", features = ["unstable-pre-spec"] }
+state-res = { git = "https://github.com/ruma/state-res", rev = "af450d0fe2b0e1c890284d0bc3b9d6d4008ac475", features = ["unstable-pre-spec"] }
# TODO: remove the gen-eventid feature
#state-res = { git = "https://github.com/ruma/state-res", branch = "main", features = ["unstable-pre-spec", "gen-eventid"] }
#state-res = { git = "https://github.com/ruma/state-res", rev = "1621a491a9e867a1ad4dff9f2f92b0c1e2d44aa0", features = ["unstable-pre-spec", "gen-eventid"] }
diff --git a/src/client_server/account.rs b/src/client_server/account.rs
index 10f5d75d..4c5b60cb 100644
--- a/src/client_server/account.rs
+++ b/src/client_server/account.rs
@@ -21,7 +21,7 @@ use ruma::{
},
EventType,
},
- RoomAliasId, RoomId, RoomVersionId, UserId,
+ push, RoomAliasId, RoomId, RoomVersionId, UserId,
};
use register::RegistrationKind;
@@ -181,7 +181,7 @@ pub async fn register_route(
EventType::PushRules,
&ruma::events::push_rules::PushRulesEvent {
content: ruma::events::push_rules::PushRulesEventContent {
- global: crate::push_rules::default_pushrules(&user_id),
+ global: push::Ruleset::server_default(&user_id),
},
},
&db.globals,
diff --git a/src/client_server/media.rs b/src/client_server/media.rs
index 57fc2b08..f9350e0f 100644
--- a/src/client_server/media.rs
+++ b/src/client_server/media.rs
@@ -46,7 +46,7 @@ pub async fn create_content_route(
db.flush().await?;
Ok(create_content::Response {
- content_uri: mxc,
+ content_uri: mxc.try_into().expect("Invalid mxc:// URI"),
blurhash: None,
}
.into())
diff --git a/src/client_server/push.rs b/src/client_server/push.rs
index 9de8c164..e37e660d 100644
--- a/src/client_server/push.rs
+++ b/src/client_server/push.rs
@@ -10,10 +10,7 @@ use ruma::{
},
},
events::{push_rules, EventType},
- push::{
- ConditionalPushRuleInit, ContentPushRule, OverridePushRule, PatternedPushRuleInit,
- RoomPushRule, SenderPushRule, SimplePushRuleInit, UnderridePushRule,
- },
+ push::{ConditionalPushRuleInit, PatternedPushRuleInit, SimplePushRuleInit},
};
#[cfg(feature = "conduit_bin")]
@@ -67,29 +64,24 @@ pub async fn get_pushrule_route(
let rule = match body.kind {
RuleKind::Override => global
.override_
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .map(|rule| rule.0.clone().into()),
+ .get(body.rule_id.as_str())
+ .map(|rule| rule.clone().into()),
RuleKind::Underride => global
.underride
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .map(|rule| rule.0.clone().into()),
+ .get(body.rule_id.as_str())
+ .map(|rule| rule.clone().into()),
RuleKind::Sender => global
.sender
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .map(|rule| rule.0.clone().into()),
+ .get(body.rule_id.as_str())
+ .map(|rule| rule.clone().into()),
RuleKind::Room => global
.room
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .map(|rule| rule.0.clone().into()),
+ .get(body.rule_id.as_str())
+ .map(|rule| rule.clone().into()),
RuleKind::Content => global
.content
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .map(|rule| rule.0.clone().into()),
+ .get(body.rule_id.as_str())
+ .map(|rule| rule.clone().into()),
RuleKind::_Custom(_) => None,
};
@@ -105,14 +97,15 @@ pub async fn get_pushrule_route(
#[cfg_attr(
feature = "conduit_bin",
- put("/_matrix/client/r0/pushrules/<_>/<_>/<_>", data = "
")
+ put("/_matrix/client/r0/pushrules/<_>/<_>/<_>", data = "")
)]
-#[tracing::instrument(skip(db, body))]
+#[tracing::instrument(skip(db, req))]
pub async fn set_pushrule_route(
db: State<'_, Database>,
- body: Ruma>,
+ req: Ruma>,
) -> ConduitResult {
- let sender_user = body.sender_user.as_ref().expect("user is authenticated");
+ let sender_user = req.sender_user.as_ref().expect("user is authenticated");
+ let body = req.body;
if body.scope != "global" {
return Err(Error::BadRequest(
@@ -132,107 +125,62 @@ pub async fn set_pushrule_route(
let global = &mut event.content.global;
match body.kind {
RuleKind::Override => {
- if let Some(rule) = global
- .override_
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .cloned()
- {
- global.override_.remove(&rule);
- }
-
- global.override_.insert(OverridePushRule(
+ global.override_.replace(
ConditionalPushRuleInit {
- actions: body.actions.clone(),
+ actions: body.actions,
default: false,
enabled: true,
- rule_id: body.rule_id.clone(),
- conditions: body.conditions.clone(),
+ rule_id: body.rule_id,
+ conditions: body.conditions,
}
.into(),
- ));
+ );
}
RuleKind::Underride => {
- if let Some(rule) = global
- .underride
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .cloned()
- {
- global.underride.remove(&rule);
- }
-
- global.underride.insert(UnderridePushRule(
+ global.underride.replace(
ConditionalPushRuleInit {
- actions: body.actions.clone(),
+ actions: body.actions,
default: false,
enabled: true,
- rule_id: body.rule_id.clone(),
- conditions: body.conditions.clone(),
+ rule_id: body.rule_id,
+ conditions: body.conditions,
}
.into(),
- ));
+ );
}
RuleKind::Sender => {
- if let Some(rule) = global
- .sender
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .cloned()
- {
- global.sender.remove(&rule);
- }
-
- global.sender.insert(SenderPushRule(
+ global.sender.replace(
SimplePushRuleInit {
- actions: body.actions.clone(),
+ actions: body.actions,
default: false,
enabled: true,
- rule_id: body.rule_id.clone(),
+ rule_id: body.rule_id,
}
.into(),
- ));
+ );
}
RuleKind::Room => {
- if let Some(rule) = global
- .room
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .cloned()
- {
- global.room.remove(&rule);
- }
-
- global.room.insert(RoomPushRule(
+ global.room.replace(
SimplePushRuleInit {
- actions: body.actions.clone(),
+ actions: body.actions,
default: false,
enabled: true,
- rule_id: body.rule_id.clone(),
+ rule_id: body.rule_id,
}
.into(),
- ));
+ );
}
RuleKind::Content => {
- if let Some(rule) = global
- .content
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .cloned()
- {
- global.content.remove(&rule);
- }
-
- global.content.insert(ContentPushRule(
+ global.content.replace(
PatternedPushRuleInit {
- actions: body.actions.clone(),
+ actions: body.actions,
default: false,
enabled: true,
- rule_id: body.rule_id.clone(),
- pattern: body.pattern.clone().unwrap_or_default(),
+ rule_id: body.rule_id,
+ pattern: body.pattern.unwrap_or_default(),
}
.into(),
- ));
+ );
}
RuleKind::_Custom(_) => {}
}
@@ -280,29 +228,24 @@ pub async fn get_pushrule_actions_route(
let actions = match body.kind {
RuleKind::Override => global
.override_
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .map(|rule| rule.0.actions.clone()),
+ .get(body.rule_id.as_str())
+ .map(|rule| rule.actions.clone()),
RuleKind::Underride => global
.underride
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .map(|rule| rule.0.actions.clone()),
+ .get(body.rule_id.as_str())
+ .map(|rule| rule.actions.clone()),
RuleKind::Sender => global
.sender
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .map(|rule| rule.0.actions.clone()),
+ .get(body.rule_id.as_str())
+ .map(|rule| rule.actions.clone()),
RuleKind::Room => global
.room
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .map(|rule| rule.0.actions.clone()),
+ .get(body.rule_id.as_str())
+ .map(|rule| rule.actions.clone()),
RuleKind::Content => global
.content
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .map(|rule| rule.0.actions.clone()),
+ .get(body.rule_id.as_str())
+ .map(|rule| rule.actions.clone()),
RuleKind::_Custom(_) => None,
};
@@ -343,63 +286,33 @@ pub async fn set_pushrule_actions_route(
let global = &mut event.content.global;
match body.kind {
RuleKind::Override => {
- if let Some(mut rule) = global
- .override_
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .cloned()
- {
- global.override_.remove(&rule);
- rule.0.actions = body.actions.clone();
- global.override_.insert(rule);
+ if let Some(mut rule) = global.override_.get(body.rule_id.as_str()).cloned() {
+ rule.actions = body.actions.clone();
+ global.override_.replace(rule);
}
}
RuleKind::Underride => {
- if let Some(mut rule) = global
- .underride
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .cloned()
- {
- global.underride.remove(&rule);
- rule.0.actions = body.actions.clone();
- global.underride.insert(rule);
+ if let Some(mut rule) = global.underride.get(body.rule_id.as_str()).cloned() {
+ rule.actions = body.actions.clone();
+ global.underride.replace(rule);
}
}
RuleKind::Sender => {
- if let Some(mut rule) = global
- .sender
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .cloned()
- {
- global.sender.remove(&rule);
- rule.0.actions = body.actions.clone();
- global.sender.insert(rule);
+ if let Some(mut rule) = global.sender.get(body.rule_id.as_str()).cloned() {
+ rule.actions = body.actions.clone();
+ global.sender.replace(rule);
}
}
RuleKind::Room => {
- if let Some(mut rule) = global
- .room
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .cloned()
- {
- global.room.remove(&rule);
- rule.0.actions = body.actions.clone();
- global.room.insert(rule);
+ if let Some(mut rule) = global.room.get(body.rule_id.as_str()).cloned() {
+ rule.actions = body.actions.clone();
+ global.room.replace(rule);
}
}
RuleKind::Content => {
- if let Some(mut rule) = global
- .content
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .cloned()
- {
- global.content.remove(&rule);
- rule.0.actions = body.actions.clone();
- global.content.insert(rule);
+ if let Some(mut rule) = global.content.get(body.rule_id.as_str()).cloned() {
+ rule.actions = body.actions.clone();
+ global.content.replace(rule);
}
}
RuleKind::_Custom(_) => {}
@@ -449,28 +362,28 @@ pub async fn get_pushrule_enabled_route(
RuleKind::Override => global
.override_
.iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .map_or(false, |rule| rule.0.enabled),
+ .find(|rule| rule.rule_id == body.rule_id)
+ .map_or(false, |rule| rule.enabled),
RuleKind::Underride => global
.underride
.iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .map_or(false, |rule| rule.0.enabled),
+ .find(|rule| rule.rule_id == body.rule_id)
+ .map_or(false, |rule| rule.enabled),
RuleKind::Sender => global
.sender
.iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .map_or(false, |rule| rule.0.enabled),
+ .find(|rule| rule.rule_id == body.rule_id)
+ .map_or(false, |rule| rule.enabled),
RuleKind::Room => global
.room
.iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .map_or(false, |rule| rule.0.enabled),
+ .find(|rule| rule.rule_id == body.rule_id)
+ .map_or(false, |rule| rule.enabled),
RuleKind::Content => global
.content
.iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .map_or(false, |rule| rule.0.enabled),
+ .find(|rule| rule.rule_id == body.rule_id)
+ .map_or(false, |rule| rule.enabled),
RuleKind::_Custom(_) => false,
};
@@ -508,62 +421,37 @@ pub async fn set_pushrule_enabled_route(
let global = &mut event.content.global;
match body.kind {
RuleKind::Override => {
- if let Some(mut rule) = global
- .override_
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .cloned()
- {
+ if let Some(mut rule) = global.override_.get(body.rule_id.as_str()).cloned() {
global.override_.remove(&rule);
- rule.0.enabled = body.enabled;
+ rule.enabled = body.enabled;
global.override_.insert(rule);
}
}
RuleKind::Underride => {
- if let Some(mut rule) = global
- .underride
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .cloned()
- {
+ if let Some(mut rule) = global.underride.get(body.rule_id.as_str()).cloned() {
global.underride.remove(&rule);
- rule.0.enabled = body.enabled;
+ rule.enabled = body.enabled;
global.underride.insert(rule);
}
}
RuleKind::Sender => {
- if let Some(mut rule) = global
- .sender
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .cloned()
- {
+ if let Some(mut rule) = global.sender.get(body.rule_id.as_str()).cloned() {
global.sender.remove(&rule);
- rule.0.enabled = body.enabled;
+ rule.enabled = body.enabled;
global.sender.insert(rule);
}
}
RuleKind::Room => {
- if let Some(mut rule) = global
- .room
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .cloned()
- {
+ if let Some(mut rule) = global.room.get(body.rule_id.as_str()).cloned() {
global.room.remove(&rule);
- rule.0.enabled = body.enabled;
+ rule.enabled = body.enabled;
global.room.insert(rule);
}
}
RuleKind::Content => {
- if let Some(mut rule) = global
- .content
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .cloned()
- {
+ if let Some(mut rule) = global.content.get(body.rule_id.as_str()).cloned() {
global.content.remove(&rule);
- rule.0.enabled = body.enabled;
+ rule.enabled = body.enabled;
global.content.insert(rule);
}
}
@@ -612,52 +500,27 @@ pub async fn delete_pushrule_route(
let global = &mut event.content.global;
match body.kind {
RuleKind::Override => {
- if let Some(rule) = global
- .override_
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .cloned()
- {
+ if let Some(rule) = global.override_.get(body.rule_id.as_str()).cloned() {
global.override_.remove(&rule);
}
}
RuleKind::Underride => {
- if let Some(rule) = global
- .underride
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .cloned()
- {
+ if let Some(rule) = global.underride.get(body.rule_id.as_str()).cloned() {
global.underride.remove(&rule);
}
}
RuleKind::Sender => {
- if let Some(rule) = global
- .sender
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .cloned()
- {
+ if let Some(rule) = global.sender.get(body.rule_id.as_str()).cloned() {
global.sender.remove(&rule);
}
}
RuleKind::Room => {
- if let Some(rule) = global
- .room
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .cloned()
- {
+ if let Some(rule) = global.room.get(body.rule_id.as_str()).cloned() {
global.room.remove(&rule);
}
}
RuleKind::Content => {
- if let Some(rule) = global
- .content
- .iter()
- .find(|rule| rule.0.rule_id == body.rule_id)
- .cloned()
- {
+ if let Some(rule) = global.content.get(body.rule_id.as_str()).cloned() {
global.content.remove(&rule);
}
}
diff --git a/src/client_server/state.rs b/src/client_server/state.rs
index 54c5fa5c..88cce031 100644
--- a/src/client_server/state.rs
+++ b/src/client_server/state.rs
@@ -3,10 +3,7 @@ use crate::{pdu::PduBuilder, ConduitResult, Database, Error, Result, Ruma};
use ruma::{
api::client::{
error::ErrorKind,
- r0::state::{
- get_state_events, get_state_events_for_empty_key, get_state_events_for_key,
- send_state_event_for_empty_key, send_state_event_for_key,
- },
+ r0::state::{get_state_events, get_state_events_for_key, send_state_event},
},
events::{
room::history_visibility::{HistoryVisibility, HistoryVisibilityEventContent},
@@ -25,8 +22,8 @@ use rocket::{get, put};
#[tracing::instrument(skip(db, body))]
pub async fn send_state_event_for_key_route(
db: State<'_, Database>,
- body: Ruma>,
-) -> ConduitResult {
+ body: Ruma>,
+) -> ConduitResult {
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
let content = serde_json::from_str::(
@@ -49,7 +46,7 @@ pub async fn send_state_event_for_key_route(
db.flush().await?;
- Ok(send_state_event_for_key::Response { event_id }.into())
+ Ok(send_state_event::Response { event_id }.into())
}
#[cfg_attr(
@@ -59,8 +56,8 @@ pub async fn send_state_event_for_key_route(
#[tracing::instrument(skip(db, body))]
pub async fn send_state_event_for_empty_key_route(
db: State<'_, Database>,
- body: Ruma>,
-) -> ConduitResult {
+ body: Ruma>,
+) -> ConduitResult {
// This just calls send_state_event_for_key_route
let Ruma {
body,
@@ -81,7 +78,7 @@ pub async fn send_state_event_for_empty_key_route(
&db,
sender_user
.as_ref()
- .expect("no user for send state empty key rout"),
+ .expect("no user for send state empty key route"),
&body.content,
json,
&body.room_id,
@@ -91,7 +88,7 @@ pub async fn send_state_event_for_empty_key_route(
db.flush().await?;
- Ok(send_state_event_for_empty_key::Response { event_id }.into())
+ Ok(send_state_event::Response { event_id }.into())
}
#[cfg_attr(
@@ -199,8 +196,8 @@ pub async fn get_state_events_for_key_route(
#[tracing::instrument(skip(db, body))]
pub async fn get_state_events_for_empty_key_route(
db: State<'_, Database>,
- body: Ruma>,
-) -> ConduitResult {
+ body: Ruma>,
+) -> ConduitResult {
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
#[allow(clippy::blocks_in_if_conditions)]
@@ -236,7 +233,7 @@ pub async fn get_state_events_for_empty_key_route(
"State event not found.",
))?;
- Ok(get_state_events_for_empty_key::Response {
+ Ok(get_state_events_for_key::Response {
content: serde_json::value::to_raw_value(&event.content)
.map_err(|_| Error::bad_database("Invalid event content in database"))?,
}
diff --git a/src/database/pusher.rs b/src/database/pusher.rs
index 8e9b24e3..6a88d5ef 100644
--- a/src/database/pusher.rs
+++ b/src/database/pusher.rs
@@ -9,15 +9,8 @@ use ruma::{
},
OutgoingRequest,
},
- events::{
- room::{
- member::{MemberEventContent, MembershipState},
- message::{MessageEventContent, MessageType, TextMessageEventContent},
- power_levels::PowerLevelsEventContent,
- },
- EventType,
- },
- push::{Action, PushCondition, PushFormat, Ruleset, Tweak},
+ events::{room::power_levels::PowerLevelsEventContent, EventType},
+ push::{Action, PushConditionRoomCtx, PushFormat, Ruleset, Tweak},
uint, UInt, UserId,
};
use sled::IVec;
@@ -181,276 +174,56 @@ pub async fn send_push_notice(
pdu: &PduEvent,
db: &Database,
) -> Result<()> {
- if let Some(msgtype) = pdu.content.get("msgtype").and_then(|b| b.as_str()) {
- if msgtype == "m.notice" {
- return Ok(());
+ let power_levels: PowerLevelsEventContent = db
+ .rooms
+ .room_state_get(&pdu.room_id, &EventType::RoomPowerLevels, "")?
+ .map(|ev| {
+ serde_json::from_value(ev.content)
+ .map_err(|_| Error::bad_database("invalid m.room.power_levels event"))
+ })
+ .transpose()?
+ .unwrap_or_default();
+
+ let ctx = PushConditionRoomCtx {
+ room_id: pdu.room_id.clone(),
+ member_count: (db.rooms.room_members(&pdu.room_id).count() as u32).into(),
+ user_display_name: user.localpart().into(), // TODO: Use actual display name
+ users_power_levels: power_levels.users,
+ default_power_level: power_levels.users_default,
+ notification_power_levels: power_levels.notifications,
+ };
+
+ let mut notify = None;
+ let mut tweaks = Vec::new();
+
+ for action in ruleset.get_actions(&pdu.to_sync_state_event(), &ctx) {
+ let n = match action {
+ Action::DontNotify => false,
+ // TODO: Implement proper support for coalesce
+ Action::Notify | Action::Coalesce => true,
+ Action::SetTweak(tweak) => {
+ tweaks.push(tweak.clone());
+ continue;
+ }
+ };
+
+ if notify.is_some() {
+ return Err(Error::bad_database(
+ r#"Malformed pushrule contains more than one of these actions: ["dont_notify", "notify", "coalesce"]"#,
+ ));
}
+
+ notify = Some(n);
}
- for rule in ruleset.into_iter() {
- // TODO: can actions contain contradictory Actions
- if rule
- .actions
- .iter()
- .any(|act| matches!(act, ruma::push::Action::DontNotify))
- || !rule.enabled
- {
- continue;
- }
+ let notify = notify.ok_or_else(|| {
+ Error::bad_database(
+ r#"Malformed pushrule contains none of these actions: ["dont_notify", "notify", "coalesce"]"#,
+ )
+ })?;
- match rule.rule_id.as_str() {
- ".m.rule.master" => {}
- ".m.rule.suppress_notices" => {
- if pdu.kind == EventType::RoomMessage
- && pdu
- .content
- .get("msgtype")
- .map_or(false, |ty| ty == "m.notice")
- {
- let tweaks = rule
- .actions
- .iter()
- .filter_map(|a| match a {
- Action::SetTweak(tweak) => Some(tweak.clone()),
- _ => None,
- })
- .collect::>();
- send_notice(unread, pusher, tweaks, pdu, db).await?;
- break;
- }
- }
- ".m.rule.invite_for_me" => {
- if let EventType::RoomMember = &pdu.kind {
- if pdu.state_key.as_deref() == Some(user.as_str())
- && serde_json::from_value::(pdu.content.clone())
- .map_err(|_| Error::bad_database("PDU contained bad message content"))?
- .membership
- == MembershipState::Invite
- {
- let tweaks = rule
- .actions
- .iter()
- .filter_map(|a| match a {
- Action::SetTweak(tweak) => Some(tweak.clone()),
- _ => None,
- })
- .collect::>();
- send_notice(unread, pusher, tweaks, pdu, db).await?;
- break;
- }
- }
- }
- ".m.rule.member_event" => {
- if let EventType::RoomMember = &pdu.kind {
- // TODO use this?
- let _member = serde_json::from_value::(pdu.content.clone())
- .map_err(|_| Error::bad_database("PDU contained bad message content"))?;
- if let Some(conditions) = rule.conditions {
- if conditions.iter().any(|cond| match cond {
- PushCondition::EventMatch { key, pattern } => {
- let mut json =
- serde_json::to_value(pdu).expect("PDU is valid JSON");
- for key in key.split('.') {
- json = json[key].clone();
- }
- // TODO: this is baddddd
- json.to_string().contains(pattern)
- }
- _ => false,
- }) {
- let tweaks = rule
- .actions
- .iter()
- .filter_map(|a| match a {
- Action::SetTweak(tweak) => Some(tweak.clone()),
- _ => None,
- })
- .collect::>();
- send_notice(unread, pusher, tweaks, pdu, db).await?;
- break;
- }
- }
- }
- }
- ".m.rule.contains_display_name" => {
- if let EventType::RoomMessage = &pdu.kind {
- let msg_content =
- serde_json::from_value::(pdu.content.clone())
- .map_err(|_| {
- Error::bad_database("PDU contained bad message content")
- })?;
- if let MessageType::Text(TextMessageEventContent { body, .. }) =
- &msg_content.msgtype
- {
- if body.contains(user.localpart()) {
- let tweaks = rule
- .actions
- .iter()
- .filter_map(|a| match a {
- Action::SetTweak(tweak) => Some(tweak.clone()),
- _ => None,
- })
- .collect::>();
- send_notice(unread, pusher, tweaks, pdu, db).await?;
- break;
- }
- }
- }
- }
- ".m.rule.tombstone" => {
- if pdu.kind == EventType::RoomTombstone && pdu.state_key.as_deref() == Some("") {
- let tweaks = rule
- .actions
- .iter()
- .filter_map(|a| match a {
- Action::SetTweak(tweak) => Some(tweak.clone()),
- _ => None,
- })
- .collect::>();
- send_notice(unread, pusher, tweaks, pdu, db).await?;
- break;
- }
- }
- ".m.rule.roomnotif" => {
- if let EventType::RoomMessage = &pdu.kind {
- let msg_content =
- serde_json::from_value::(pdu.content.clone())
- .map_err(|_| {
- Error::bad_database("PDU contained bad message content")
- })?;
- if let MessageType::Text(TextMessageEventContent { body, .. }) =
- &msg_content.msgtype
- {
- let power_level_cmp = |pl: PowerLevelsEventContent| {
- &pl.notifications.room
- <= pl.users.get(&pdu.sender).unwrap_or(&ruma::int!(0))
- };
- let deserialize = |pl: PduEvent| {
- serde_json::from_value::(pl.content).ok()
- };
- if body.contains("@room")
- && db
- .rooms
- .room_state_get(&pdu.room_id, &EventType::RoomPowerLevels, "")?
- .map(deserialize)
- .flatten()
- .map_or(false, power_level_cmp)
- {
- let tweaks = rule
- .actions
- .iter()
- .filter_map(|a| match a {
- Action::SetTweak(tweak) => Some(tweak.clone()),
- _ => None,
- })
- .collect::>();
- send_notice(unread, pusher, tweaks, pdu, db).await?;
- break;
- }
- }
- }
- }
- ".m.rule.contains_user_name" => {
- if let EventType::RoomMessage = &pdu.kind {
- let msg_content =
- serde_json::from_value::(pdu.content.clone())
- .map_err(|_| {
- Error::bad_database("PDU contained bad message content")
- })?;
- if let MessageType::Text(TextMessageEventContent { body, .. }) =
- &msg_content.msgtype
- {
- if body.contains(user.localpart()) {
- let tweaks = rule
- .actions
- .iter()
- .filter_map(|a| match a {
- Action::SetTweak(tweak) => Some(tweak.clone()),
- _ => None,
- })
- .collect::>();
- send_notice(unread, pusher, tweaks, pdu, db).await?;
- break;
- }
- }
- }
- }
- ".m.rule.call" => {
- if pdu.kind == EventType::CallInvite {
- let tweaks = rule
- .actions
- .iter()
- .filter_map(|a| match a {
- Action::SetTweak(tweak) => Some(tweak.clone()),
- _ => None,
- })
- .collect::>();
- send_notice(unread, pusher, tweaks, pdu, db).await?;
- break;
- }
- }
- ".m.rule.encrypted_room_one_to_one" => {
- if db.rooms.room_members(&pdu.room_id).count() == 2
- && pdu.kind == EventType::RoomEncrypted
- {
- let tweaks = rule
- .actions
- .iter()
- .filter_map(|a| match a {
- Action::SetTweak(tweak) => Some(tweak.clone()),
- _ => None,
- })
- .collect::>();
- send_notice(unread, pusher, tweaks, pdu, db).await?;
- break;
- }
- }
- ".m.rule.room_one_to_one" => {
- if db.rooms.room_members(&pdu.room_id).count() == 2
- && pdu.kind == EventType::RoomMessage
- {
- let tweaks = rule
- .actions
- .iter()
- .filter_map(|a| match a {
- Action::SetTweak(tweak) => Some(tweak.clone()),
- _ => None,
- })
- .collect::>();
- send_notice(unread, pusher, tweaks, pdu, db).await?;
- break;
- }
- }
- ".m.rule.message" => {
- if pdu.kind == EventType::RoomMessage {
- let tweaks = rule
- .actions
- .iter()
- .filter_map(|a| match a {
- Action::SetTweak(tweak) => Some(tweak.clone()),
- _ => None,
- })
- .collect::>();
- send_notice(unread, pusher, tweaks, pdu, db).await?;
- break;
- }
- }
- ".m.rule.encrypted" => {
- if pdu.kind == EventType::RoomEncrypted {
- let tweaks = rule
- .actions
- .iter()
- .filter_map(|a| match a {
- Action::SetTweak(tweak) => Some(tweak.clone()),
- _ => None,
- })
- .collect::>();
- send_notice(unread, pusher, tweaks, pdu, db).await?;
- break;
- }
- }
- _ => {}
- }
+ if notify {
+ send_notice(unread, pusher, tweaks, pdu, db).await?;
}
Ok(())
diff --git a/src/database/sending.rs b/src/database/sending.rs
index 82d2cdd1..b0f9c4da 100644
--- a/src/database/sending.rs
+++ b/src/database/sending.rs
@@ -16,7 +16,7 @@ use rocket::futures::stream::{FuturesUnordered, StreamExt};
use ruma::{
api::{appservice, federation, OutgoingRequest},
events::{push_rules, EventType},
- uint, ServerName, UInt, UserId,
+ push, uint, ServerName, UInt, UserId,
};
use sled::IVec;
use tokio::{select, sync::Semaphore};
@@ -428,7 +428,7 @@ impl Sending {
.get::(None, &userid, EventType::PushRules)
.map_err(|e| (OutgoingKind::Push(user.clone(), pushkey.clone()), e))?
.map(|ev| ev.content.global)
- .unwrap_or_else(|| crate::push_rules::default_pushrules(&userid));
+ .unwrap_or_else(|| push::Ruleset::server_default(&userid));
let unread: UInt = if let Some(last_read) = db
.rooms
diff --git a/src/database/users.rs b/src/database/users.rs
index e5bc16e7..ddbfd38a 100644
--- a/src/database/users.rs
+++ b/src/database/users.rs
@@ -9,6 +9,7 @@ use ruma::{
},
encryption::DeviceKeys,
events::{AnyToDeviceEvent, EventType},
+ identifiers::MxcUri,
serde::Raw,
DeviceId, DeviceKeyAlgorithm, DeviceKeyId, UInt, UserId,
};
@@ -150,21 +151,22 @@ impl Users {
}
/// Get a the avatar_url of a user.
- pub fn avatar_url(&self, user_id: &UserId) -> Result