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:
parent
b527ec4666
commit
465533d32b
2 changed files with 62 additions and 68 deletions
|
@ -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,
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue