summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimo Kösters <timo@koesters.xyz>2023-08-07 17:54:08 +0200
committerTimo Kösters <timo@koesters.xyz>2023-08-07 17:54:08 +0200
commitd82c26f0a9a92d0193924ddc3d81b7b0a152862b (patch)
tree9e2fc99ecd8e794cb54dc6c1ad9d18d310a84106
parentc1e2ffc0cdcf11a2d9763ab85af27e1a6f6f909a (diff)
downloadconduit-d82c26f0a9a92d0193924ddc3d81b7b0a152862b.zip
Avatars for sliding sync DMs
-rw-r--r--Cargo.lock29
-rw-r--r--Cargo.toml2
-rw-r--r--src/api/client_server/sync.rs86
-rw-r--r--src/service/rooms/state_accessor/mod.rs12
4 files changed, 80 insertions, 49 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 7ddf487..b357bb9 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1296,7 +1296,6 @@ checksum = "1d9a8bb6c7c71d151b25936b03e012a4c00daea99e3a3797c6ead66b0a0d55e2"
dependencies = [
"const_panic",
"konst_kernel",
- "konst_proc_macros",
"typewit",
]
@@ -1310,12 +1309,6 @@ dependencies = [
]
[[package]]
-name = "konst_proc_macros"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e28ab1dc35e09d60c2b8c90d12a9a8d9666c876c10a3739a3196db0103b6043"
-
-[[package]]
name = "lazy_static"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2146,7 +2139,7 @@ dependencies = [
[[package]]
name = "ruma"
version = "0.8.2"
-source = "git+https://github.com/ruma/ruma?rev=07bc06038fded40d4e9180637f056d256f9a1fbc#07bc06038fded40d4e9180637f056d256f9a1fbc"
+source = "git+https://github.com/ruma/ruma?rev=3bd58e3c899457c2d55c45268dcb8a65ae682d54#3bd58e3c899457c2d55c45268dcb8a65ae682d54"
dependencies = [
"assign",
"js_int",
@@ -2164,7 +2157,7 @@ dependencies = [
[[package]]
name = "ruma-appservice-api"
version = "0.8.1"
-source = "git+https://github.com/ruma/ruma?rev=07bc06038fded40d4e9180637f056d256f9a1fbc#07bc06038fded40d4e9180637f056d256f9a1fbc"
+source = "git+https://github.com/ruma/ruma?rev=3bd58e3c899457c2d55c45268dcb8a65ae682d54#3bd58e3c899457c2d55c45268dcb8a65ae682d54"
dependencies = [
"js_int",
"ruma-common",
@@ -2175,7 +2168,7 @@ dependencies = [
[[package]]
name = "ruma-client-api"
version = "0.16.2"
-source = "git+https://github.com/ruma/ruma?rev=07bc06038fded40d4e9180637f056d256f9a1fbc#07bc06038fded40d4e9180637f056d256f9a1fbc"
+source = "git+https://github.com/ruma/ruma?rev=3bd58e3c899457c2d55c45268dcb8a65ae682d54#3bd58e3c899457c2d55c45268dcb8a65ae682d54"
dependencies = [
"assign",
"bytes",
@@ -2192,7 +2185,7 @@ dependencies = [
[[package]]
name = "ruma-common"
version = "0.11.3"
-source = "git+https://github.com/ruma/ruma?rev=07bc06038fded40d4e9180637f056d256f9a1fbc#07bc06038fded40d4e9180637f056d256f9a1fbc"
+source = "git+https://github.com/ruma/ruma?rev=3bd58e3c899457c2d55c45268dcb8a65ae682d54#3bd58e3c899457c2d55c45268dcb8a65ae682d54"
dependencies = [
"base64 0.21.2",
"bytes",
@@ -2220,7 +2213,7 @@ dependencies = [
[[package]]
name = "ruma-federation-api"
version = "0.7.1"
-source = "git+https://github.com/ruma/ruma?rev=07bc06038fded40d4e9180637f056d256f9a1fbc#07bc06038fded40d4e9180637f056d256f9a1fbc"
+source = "git+https://github.com/ruma/ruma?rev=3bd58e3c899457c2d55c45268dcb8a65ae682d54#3bd58e3c899457c2d55c45268dcb8a65ae682d54"
dependencies = [
"js_int",
"ruma-common",
@@ -2231,7 +2224,7 @@ dependencies = [
[[package]]
name = "ruma-identifiers-validation"
version = "0.9.1"
-source = "git+https://github.com/ruma/ruma?rev=07bc06038fded40d4e9180637f056d256f9a1fbc#07bc06038fded40d4e9180637f056d256f9a1fbc"
+source = "git+https://github.com/ruma/ruma?rev=3bd58e3c899457c2d55c45268dcb8a65ae682d54#3bd58e3c899457c2d55c45268dcb8a65ae682d54"
dependencies = [
"js_int",
"thiserror",
@@ -2240,7 +2233,7 @@ dependencies = [
[[package]]
name = "ruma-identity-service-api"
version = "0.7.1"
-source = "git+https://github.com/ruma/ruma?rev=07bc06038fded40d4e9180637f056d256f9a1fbc#07bc06038fded40d4e9180637f056d256f9a1fbc"
+source = "git+https://github.com/ruma/ruma?rev=3bd58e3c899457c2d55c45268dcb8a65ae682d54#3bd58e3c899457c2d55c45268dcb8a65ae682d54"
dependencies = [
"js_int",
"ruma-common",
@@ -2250,7 +2243,7 @@ dependencies = [
[[package]]
name = "ruma-macros"
version = "0.11.3"
-source = "git+https://github.com/ruma/ruma?rev=07bc06038fded40d4e9180637f056d256f9a1fbc#07bc06038fded40d4e9180637f056d256f9a1fbc"
+source = "git+https://github.com/ruma/ruma?rev=3bd58e3c899457c2d55c45268dcb8a65ae682d54#3bd58e3c899457c2d55c45268dcb8a65ae682d54"
dependencies = [
"once_cell",
"proc-macro-crate",
@@ -2265,7 +2258,7 @@ dependencies = [
[[package]]
name = "ruma-push-gateway-api"
version = "0.7.1"
-source = "git+https://github.com/ruma/ruma?rev=07bc06038fded40d4e9180637f056d256f9a1fbc#07bc06038fded40d4e9180637f056d256f9a1fbc"
+source = "git+https://github.com/ruma/ruma?rev=3bd58e3c899457c2d55c45268dcb8a65ae682d54#3bd58e3c899457c2d55c45268dcb8a65ae682d54"
dependencies = [
"js_int",
"ruma-common",
@@ -2276,7 +2269,7 @@ dependencies = [
[[package]]
name = "ruma-signatures"
version = "0.13.1"
-source = "git+https://github.com/ruma/ruma?rev=07bc06038fded40d4e9180637f056d256f9a1fbc#07bc06038fded40d4e9180637f056d256f9a1fbc"
+source = "git+https://github.com/ruma/ruma?rev=3bd58e3c899457c2d55c45268dcb8a65ae682d54#3bd58e3c899457c2d55c45268dcb8a65ae682d54"
dependencies = [
"base64 0.21.2",
"ed25519-dalek",
@@ -2292,7 +2285,7 @@ dependencies = [
[[package]]
name = "ruma-state-res"
version = "0.9.1"
-source = "git+https://github.com/ruma/ruma?rev=07bc06038fded40d4e9180637f056d256f9a1fbc#07bc06038fded40d4e9180637f056d256f9a1fbc"
+source = "git+https://github.com/ruma/ruma?rev=3bd58e3c899457c2d55c45268dcb8a65ae682d54#3bd58e3c899457c2d55c45268dcb8a65ae682d54"
dependencies = [
"itertools",
"js_int",
diff --git a/Cargo.toml b/Cargo.toml
index 7a157f4..9d1e9cc 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -26,7 +26,7 @@ tower-http = { version = "0.4.1", features = ["add-extension", "cors", "sensitiv
# Used for matrix spec type definitions and helpers
#ruma = { version = "0.4.0", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-pre-spec", "unstable-exhaustive-types"] }
-ruma = { git = "https://github.com/ruma/ruma", rev = "07bc06038fded40d4e9180637f056d256f9a1fbc", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-msc2448", "unstable-msc3575", "unstable-exhaustive-types", "ring-compat", "unstable-unspecified" ] }
+ruma = { git = "https://github.com/ruma/ruma", rev = "3bd58e3c899457c2d55c45268dcb8a65ae682d54", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-msc2448", "unstable-msc3575", "unstable-exhaustive-types", "ring-compat", "unstable-unspecified" ] }
#ruma = { git = "https://github.com/timokoesters/ruma", rev = "4ec9c69bb7e09391add2382b3ebac97b6e8f4c64", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-msc2448", "unstable-msc3575", "unstable-exhaustive-types", "ring-compat", "unstable-unspecified" ] }
#ruma = { path = "../ruma/crates/ruma", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-msc2448", "unstable-msc3575", "unstable-exhaustive-types", "ring-compat", "unstable-unspecified" ] }
diff --git a/src/api/client_server/sync.rs b/src/api/client_server/sync.rs
index 527625a..a0edc43 100644
--- a/src/api/client_server/sync.rs
+++ b/src/api/client_server/sync.rs
@@ -1558,6 +1558,56 @@ pub async fn sync_events_v4_route(
.map(|state| state.to_sync_state_event())
.collect();
+ // Heroes
+ let heroes = services()
+ .rooms
+ .state_cache
+ .room_members(&room_id)
+ .filter_map(|r| r.ok())
+ .filter(|member| member != &sender_user)
+ .map(|member| {
+ Ok::<_, Error>(
+ services()
+ .rooms
+ .state_accessor
+ .get_member(&room_id, &member)?
+ .map(|memberevent| {
+ (
+ memberevent
+ .displayname
+ .unwrap_or_else(|| member.to_string()),
+ memberevent.avatar_url,
+ )
+ }),
+ )
+ })
+ .filter_map(|r| r.ok())
+ .filter_map(|o| o)
+ .take(5)
+ .collect::<Vec<_>>();
+ let name = if heroes.len() > 1 {
+ let last = heroes[0].0.clone();
+ Some(
+ heroes[1..]
+ .iter()
+ .map(|h| h.0.clone())
+ .collect::<Vec<_>>()
+ .join(", ")
+ + " and "
+ + &last,
+ )
+ } else if heroes.len() == 1 {
+ Some(heroes[0].0.clone())
+ } else {
+ None
+ };
+
+ let avatar = if heroes.len() == 1 {
+ heroes[0].1.clone()
+ } else {
+ None
+ };
+
rooms.insert(
room_id.clone(),
sync_events::v4::SlidingSyncRoom {
@@ -1565,36 +1615,12 @@ pub async fn sync_events_v4_route(
.rooms
.state_accessor
.get_name(&room_id)?
- .or_else(|| {
- // Heroes
- let mut names = services()
- .rooms
- .state_cache
- .room_members(&room_id)
- .filter_map(|r| r.ok())
- .filter(|member| member != &sender_user)
- .map(|member| {
- Ok::<_, Error>(
- services()
- .rooms
- .state_accessor
- .get_member(&room_id, &member)?
- .and_then(|memberevent| memberevent.displayname)
- .unwrap_or(member.to_string()),
- )
- })
- .filter_map(|r| r.ok())
- .take(5)
- .collect::<Vec<_>>();
- if names.len() > 1 {
- let last = names.pop().unwrap();
- Some(names.join(", ") + " and " + &last)
- } else if names.len() == 1 {
- Some(names.pop().unwrap())
- } else {
- None
- }
- }),
+ .or_else(|| name),
+ avatar: services()
+ .rooms
+ .state_accessor
+ .get_avatar(&room_id)?
+ .map_or(avatar, |a| a.url),
initial: Some(!known),
is_dm: None,
invite_state: None,
diff --git a/src/service/rooms/state_accessor/mod.rs b/src/service/rooms/state_accessor/mod.rs
index 435f4df..a4a62fe 100644
--- a/src/service/rooms/state_accessor/mod.rs
+++ b/src/service/rooms/state_accessor/mod.rs
@@ -9,6 +9,7 @@ use lru_cache::LruCache;
use ruma::{
events::{
room::{
+ avatar::RoomAvatarEventContent,
history_visibility::{HistoryVisibility, RoomHistoryVisibilityEventContent},
member::{MembershipState, RoomMemberEventContent},
name::RoomNameEventContent,
@@ -283,6 +284,17 @@ impl Service {
})
}
+ pub fn get_avatar(&self, room_id: &RoomId) -> Result<Option<RoomAvatarEventContent>> {
+ services()
+ .rooms
+ .state_accessor
+ .room_state_get(&room_id, &StateEventType::RoomAvatar, "")?
+ .map_or(Ok(None), |s| {
+ serde_json::from_str(s.content.get())
+ .map_err(|_| Error::bad_database("Invalid room avatar event in database."))
+ })
+ }
+
pub fn get_member(
&self,
room_id: &RoomId,