attempt keeping track/cache remote profiles locally again

also fixes logic error where we always say
we couldnt find the profile

Signed-off-by: strawberry <strawberry@puppygock.gay>
This commit is contained in:
strawberry 2024-03-04 19:51:00 -05:00 committed by June
parent b527ec4666
commit 465533d32b
2 changed files with 62 additions and 68 deletions

View file

@ -1,4 +1,5 @@
use crate::{service::pdu::PduBuilder, services, Error, Result, Ruma}; use std::sync::Arc;
use ruma::{ use ruma::{
api::{ api::{
client::{ client::{
@ -7,13 +8,14 @@ use ruma::{
get_avatar_url, get_display_name, get_profile, set_avatar_url, set_display_name, get_avatar_url, get_display_name, get_profile, set_avatar_url, set_display_name,
}, },
}, },
federation::{self, query::get_profile_information::v1::ProfileField}, federation,
}, },
events::{room::member::RoomMemberEventContent, StateEventType, TimelineEventType}, events::{room::member::RoomMemberEventContent, StateEventType, TimelineEventType},
presence::PresenceState, presence::PresenceState,
}; };
use serde_json::value::to_raw_value; use serde_json::value::to_raw_value;
use std::sync::Arc;
use crate::{service::pdu::PduBuilder, services, Error, Result, Ruma};
/// # `PUT /_matrix/client/r0/profile/{userId}/displayname` /// # `PUT /_matrix/client/r0/profile/{userId}/displayname`
/// ///
@ -113,39 +115,35 @@ pub async fn set_displayname_route(
pub async fn get_displayname_route( pub async fn get_displayname_route(
body: Ruma<get_display_name::v3::Request>, body: Ruma<get_display_name::v3::Request>,
) -> Result<get_display_name::v3::Response> { ) -> Result<get_display_name::v3::Response> {
if (services().users.exists(&body.user_id)?) if body.user_id.server_name() != services().globals.server_name() {
&& (body.user_id.server_name() != services().globals.server_name())
{
let response = services() let response = services()
.sending .sending
.send_federation_request( .send_federation_request(
body.user_id.server_name(), body.user_id.server_name(),
federation::query::get_profile_information::v1::Request { federation::query::get_profile_information::v1::Request {
user_id: body.user_id.clone(), user_id: body.user_id.clone(),
field: Some(ProfileField::DisplayName), field: None, // we want the full user's profile to update locally too
}, },
) )
.await?; .await?;
/* // Create and update our local copy of the user for only the fields we request for
TODO: ignore errors properly? if !services().users.exists(&body.user_id)? {
// Create and update our local copy of the user services().users.create(&body.user_id, None)?;
// these are `let _` because it's fine if we can't find these for the user. }
// also these requests are sent on room join so dead servers will make room joins annoying again
let _ = services().users.create(&body.user_id, None); services()
let _ = services()
.users .users
.set_displayname(&body.user_id, response.displayname.clone()) .set_displayname(&body.user_id, response.displayname.clone())
.await; .await?;
let _ = services() services()
.users .users
.set_avatar_url(&body.user_id, response.avatar_url) .set_avatar_url(&body.user_id, response.avatar_url.clone())
.await; .await?;
let _ = services() services()
.users .users
.set_blurhash(&body.user_id, response.blurhash) .set_blurhash(&body.user_id, response.blurhash.clone())
.await; .await?;
*/
return Ok(get_display_name::v3::Response { return Ok(get_display_name::v3::Response {
displayname: response.displayname, displayname: response.displayname,
@ -260,39 +258,35 @@ pub async fn set_avatar_url_route(
pub async fn get_avatar_url_route( pub async fn get_avatar_url_route(
body: Ruma<get_avatar_url::v3::Request>, body: Ruma<get_avatar_url::v3::Request>,
) -> Result<get_avatar_url::v3::Response> { ) -> Result<get_avatar_url::v3::Response> {
if (services().users.exists(&body.user_id)?) if body.user_id.server_name() != services().globals.server_name() {
&& (body.user_id.server_name() != services().globals.server_name())
{
let response = services() let response = services()
.sending .sending
.send_federation_request( .send_federation_request(
body.user_id.server_name(), body.user_id.server_name(),
federation::query::get_profile_information::v1::Request { federation::query::get_profile_information::v1::Request {
user_id: body.user_id.clone(), user_id: body.user_id.clone(),
field: Some(ProfileField::AvatarUrl), field: None, // we want the full user's profile to update locally as well
}, },
) )
.await?; .await?;
/*
TODO: ignore errors properly?
// Create and update our local copy of the user // Create and update our local copy of the user
// these are `let _` because it's fine if we can't find these for the user. if !services().users.exists(&body.user_id)? {
// also these requests are sent on room join so dead servers will make room joins annoying again services().users.create(&body.user_id, None)?;
let _ = services().users.create(&body.user_id, None); }
let _ = services()
services()
.users .users
.set_displayname(&body.user_id, response.displayname) .set_displayname(&body.user_id, response.displayname.clone())
.await; .await?;
let _ = services() services()
.users .users
.set_avatar_url(&body.user_id, response.avatar_url.clone()) .set_avatar_url(&body.user_id, response.avatar_url.clone())
.await; .await?;
let _ = services() services()
.users .users
.set_blurhash(&body.user_id, response.blurhash.clone()) .set_blurhash(&body.user_id, response.blurhash.clone())
.await; .await?;
*/
return Ok(get_avatar_url::v3::Response { return Ok(get_avatar_url::v3::Response {
avatar_url: response.avatar_url, avatar_url: response.avatar_url,
@ -315,9 +309,7 @@ pub async fn get_avatar_url_route(
pub async fn get_profile_route( pub async fn get_profile_route(
body: Ruma<get_profile::v3::Request>, body: Ruma<get_profile::v3::Request>,
) -> Result<get_profile::v3::Response> { ) -> Result<get_profile::v3::Response> {
if (services().users.exists(&body.user_id)?) if body.user_id.server_name() != services().globals.server_name() {
&& (body.user_id.server_name() != services().globals.server_name())
{
let response = services() let response = services()
.sending .sending
.send_federation_request( .send_federation_request(
@ -329,25 +321,23 @@ pub async fn get_profile_route(
) )
.await?; .await?;
/*
TODO: ignore errors properly?
// Create and update our local copy of the user // Create and update our local copy of the user
// these are `let _` because it's fine if we can't find these for the user. if !services().users.exists(&body.user_id)? {
// also these requests are sent on room join so dead servers will make room joins annoying again services().users.create(&body.user_id, None)?;
let _ = services().users.create(&body.user_id, None); }
let _ = services()
services()
.users .users
.set_displayname(&body.user_id, response.displayname.clone()) .set_displayname(&body.user_id, response.displayname.clone())
.await; .await?;
let _ = services() services()
.users .users
.set_avatar_url(&body.user_id, response.avatar_url.clone()) .set_avatar_url(&body.user_id, response.avatar_url.clone())
.await; .await?;
let _ = services() services()
.users .users
.set_blurhash(&body.user_id, response.blurhash.clone()) .set_blurhash(&body.user_id, response.blurhash.clone())
.await; .await?;
*/
return Ok(get_profile::v3::Response { return Ok(get_profile::v3::Response {
displayname: response.displayname, displayname: response.displayname,

View file

@ -1,8 +1,6 @@
mod data;
use std::{collections::HashSet, sync::Arc}; use std::{collections::HashSet, sync::Arc};
pub use data::Data; use ruma::api::federation;
use ruma::{ use ruma::{
api::appservice::Registration, api::appservice::Registration,
events::{ events::{
@ -20,8 +18,12 @@ use ruma::{
}; };
use tracing::warn; use tracing::warn;
pub use data::Data;
use crate::{services, Error, Result}; use crate::{services, Error, Result};
mod data;
pub struct Service { pub struct Service {
pub db: &'static dyn Data, pub db: &'static dyn Data,
} }
@ -39,12 +41,14 @@ impl Service {
update_joined_count: bool, update_joined_count: bool,
) -> Result<()> { ) -> Result<()> {
let membership = membership_event.membership; let membership = membership_event.membership;
// Keep track what remote users exist by adding them as "deactivated" users // Keep track what remote users exist by adding them as "deactivated" users
if user_id.server_name() != services().globals.server_name() { if user_id.server_name() != services().globals.server_name() {
services().users.create(user_id, None)?; if !services().users.exists(user_id)? {
/* services().users.create(user_id, None)?;
}
// Try to update our local copy of the user if ours does not match // Try to update our local copy of the user if ours does not match
// TODO: ignore errors properly?
if ((services().users.displayname(user_id)? != membership_event.displayname) if ((services().users.displayname(user_id)? != membership_event.displayname)
|| (services().users.avatar_url(user_id)? != membership_event.avatar_url) || (services().users.avatar_url(user_id)? != membership_event.avatar_url)
|| (services().users.blurhash(user_id)? != membership_event.blurhash)) || (services().users.blurhash(user_id)? != membership_event.blurhash))
@ -56,24 +60,24 @@ impl Service {
user_id.server_name(), user_id.server_name(),
federation::query::get_profile_information::v1::Request { federation::query::get_profile_information::v1::Request {
user_id: user_id.into(), user_id: user_id.into(),
field: Some(ProfileField::AvatarUrl), field: None, // we want the full user's profile to update locally too
}, },
) )
.await?; .await?;
let _ = services()
services()
.users .users
.set_displayname(user_id, response.displayname.clone()) .set_displayname(user_id, response.displayname.clone())
.await; .await?;
let _ = services() services()
.users .users
.set_avatar_url(user_id, response.avatar_url) .set_avatar_url(user_id, response.avatar_url)
.await; .await?;
let _ = services() services()
.users .users
.set_blurhash(user_id, response.blurhash) .set_blurhash(user_id, response.blurhash)
.await; .await?;
}; };
*/
} }
match &membership { match &membership {