add: hide posts from users who have blocked you from timelines

This commit is contained in:
trisua 2025-05-29 18:59:53 -04:00
parent 22ae479bd7
commit 8de5c0ea76
10 changed files with 84 additions and 81 deletions

View file

@ -224,3 +224,29 @@ macro_rules! check_user_blocked_or_private {
} }
}; };
} }
#[macro_export]
macro_rules! ignore_users_gen {
($user:ident, $data:ident) => {
if let Some(ref ua) = $user {
[
$data.0.get_userblocks_receivers(ua.id).await,
$data.0.get_userblocks_initiator_by_receivers(ua.id).await,
]
.concat()
} else {
Vec::new()
}
};
($user:ident!, $data:ident) => {
[
$data.0.get_userblocks_receivers($user.id).await,
$data
.0
.get_userblocks_initiator_by_receivers($user.id)
.await,
]
.concat()
};
}

View file

@ -1138,7 +1138,7 @@ show_kick=false, secondary=false) -%}
<div <div
class="flex justify-center flex-col" class="flex justify-center flex-col"
style="{% if show_menu or show_kick -%}width: 60%{% else %}max-width: 200px{%- endif %}" style="{% if show_menu or show_kick -%}width: 60%{% else %}max-width: 150px{%- endif %}"
> >
{{ self::full_username(user=user) }} {{ self::full_username(user=user) }}
<div class="user_status">{{ self::user_status(other_user=user) }}</div> <div class="user_status">{{ self::user_status(other_user=user) }}</div>

View file

@ -157,7 +157,7 @@ pub async fn stream_request(
} }
}; };
let ignore_users = data.0.get_userblocks_receivers(user.id).await; let ignore_users = crate::ignore_users_gen!(user!, data);
let membership = match data let membership = match data
.0 .0
@ -322,7 +322,7 @@ pub async fn channels_request(
}; };
let members = if community == 0 && channel.is_some() { let members = if community == 0 && channel.is_some() {
let ignore_users = data.0.get_userblocks_receivers(user.id).await; let ignore_users = crate::ignore_users_gen!(user!, data);
let mut channel = channel.as_ref().unwrap().clone(); let mut channel = channel.as_ref().unwrap().clone();
channel.members.insert(0, channel.owner); // include the owner in the members list (at the start) channel.members.insert(0, channel.owner); // include the owner in the members list (at the start)

View file

@ -392,11 +392,7 @@ pub async fn feed_request(
let (can_read, _) = check_permissions!(community, jar, data, user); let (can_read, _) = check_permissions!(community, jar, data, user);
// ... // ...
let ignore_users = if let Some(ref ua) = user { let ignore_users = crate::ignore_users_gen!(user, data);
data.0.get_userblocks_receivers(ua.id).await
} else {
Vec::new()
};
let feed = match data let feed = match data
.0 .0
@ -494,11 +490,7 @@ pub async fn questions_request(
let (can_read, _) = check_permissions!(community, jar, data, user); let (can_read, _) = check_permissions!(community, jar, data, user);
// ... // ...
let ignore_users = if let Some(ref ua) = user { let ignore_users = crate::ignore_users_gen!(user, data);
data.0.get_userblocks_receivers(ua.id).await
} else {
Vec::new()
};
let feed = match data let feed = match data
.0 .0
@ -673,11 +665,7 @@ pub async fn post_request(
Err(e) => return Err(Html(render_error(e, &jar, &data, &user).await)), Err(e) => return Err(Html(render_error(e, &jar, &data, &user).await)),
}; };
let ignore_users = if let Some(ref ua) = user { let ignore_users = crate::ignore_users_gen!(user, data);
data.0.get_userblocks_receivers(ua.id).await
} else {
Vec::new()
};
// ... // ...
let owner = match data.0.get_user_by_id(post.owner).await { let owner = match data.0.get_user_by_id(post.owner).await {
@ -739,11 +727,7 @@ pub async fn post_request(
} }
// ... // ...
let ignore_users = if let Some(ref ua) = user { let ignore_users = crate::ignore_users_gen!(user, data);
data.0.get_userblocks_receivers(ua.id).await
} else {
Vec::new()
};
let feed = match data.0.get_post_comments(post.id, 12, props.page).await { let feed = match data.0.get_post_comments(post.id, 12, props.page).await {
Ok(p) => match data.0.fill_posts(p, &ignore_users, &user).await { Ok(p) => match data.0.fill_posts(p, &ignore_users, &user).await {
@ -827,11 +811,7 @@ pub async fn reposts_request(
Err(e) => return Err(Html(render_error(e, &jar, &data, &user).await)), Err(e) => return Err(Html(render_error(e, &jar, &data, &user).await)),
}; };
let ignore_users = if let Some(ref ua) = user { let ignore_users = crate::ignore_users_gen!(user, data);
data.0.get_userblocks_receivers(ua.id).await
} else {
Vec::new()
};
// ... // ...
let owner = match data.0.get_user_by_id(post.owner).await { let owner = match data.0.get_user_by_id(post.owner).await {
@ -860,11 +840,7 @@ pub async fn reposts_request(
} }
// ... // ...
let ignore_users = if let Some(ref ua) = user { let ignore_users = crate::ignore_users_gen!(user, data);
data.0.get_userblocks_receivers(ua.id).await
} else {
Vec::new()
};
let list = if props.quotes { let list = if props.quotes {
match data match data
@ -973,7 +949,7 @@ pub async fn likes_request(
Err(e) => return Err(Html(render_error(e, &jar, &data, &Some(user)).await)), Err(e) => return Err(Html(render_error(e, &jar, &data, &Some(user)).await)),
}; };
let ignore_users = data.0.get_userblocks_receivers(user.id).await; let ignore_users = crate::ignore_users_gen!(user!, data);
// ... // ...
let ua = Some(user.clone()); let ua = Some(user.clone());
@ -1015,7 +991,7 @@ pub async fn likes_request(
} }
// ... // ...
let ignore_users = data.0.get_userblocks_receivers(user.id).await; let ignore_users = crate::ignore_users_gen!(user!, data);
let list = match if user.permissions.check(FinePermission::MANAGE_REACTIONS) { let list = match if user.permissions.check(FinePermission::MANAGE_REACTIONS) {
// all reactions // all reactions
@ -1213,11 +1189,7 @@ pub async fn question_request(
} }
// ... // ...
let ignore_users = if let Some(ref ua) = user { let ignore_users = crate::ignore_users_gen!(user, data);
data.0.get_userblocks_receivers(ua.id).await
} else {
Vec::new()
};
let feed = match data let feed = match data
.0 .0

View file

@ -62,7 +62,7 @@ pub async fn index_request(
} }
}; };
let ignore_users = data.0.get_userblocks_receivers(user.id).await; let ignore_users = crate::ignore_users_gen!(user!, data);
let list = match data let list = match data
.0 .0
@ -97,11 +97,7 @@ pub async fn popular_request(
let data = data.read().await; let data = data.read().await;
let user = get_user_from_token!(jar, data.0); let user = get_user_from_token!(jar, data.0);
let ignore_users = if let Some(ref ua) = user { let ignore_users = crate::ignore_users_gen!(user, data);
data.0.get_userblocks_receivers(ua.id).await
} else {
Vec::new()
};
let list = match data.0.get_popular_posts(12, req.page, 604_800_000).await { let list = match data.0.get_popular_posts(12, req.page, 604_800_000).await {
Ok(l) => match data Ok(l) => match data
@ -144,7 +140,7 @@ pub async fn following_request(
} }
}; };
let ignore_users = data.0.get_userblocks_receivers(user.id).await; let ignore_users = crate::ignore_users_gen!(user!, data);
let list = match data let list = match data
.0 .0
@ -181,11 +177,7 @@ pub async fn all_request(
let data = data.read().await; let data = data.read().await;
let user = get_user_from_token!(jar, data.0); let user = get_user_from_token!(jar, data.0);
let ignore_users = if let Some(ref ua) = user { let ignore_users = crate::ignore_users_gen!(user, data);
data.0.get_userblocks_receivers(ua.id).await
} else {
Vec::new()
};
let list = match data.0.get_latest_posts(12, req.page).await { let list = match data.0.get_latest_posts(12, req.page).await {
Ok(l) => match data Ok(l) => match data
@ -226,7 +218,7 @@ pub async fn index_questions_request(
} }
}; };
let ignore_users = data.0.get_userblocks_receivers(user.id).await; let ignore_users = crate::ignore_users_gen!(user!, data);
let list = match data let list = match data
.0 .0
@ -266,7 +258,7 @@ pub async fn popular_questions_request(
} }
}; };
let ignore_users = data.0.get_userblocks_receivers(user.id).await; let ignore_users = crate::ignore_users_gen!(user!, data);
let list = match data let list = match data
.0 .0
@ -308,7 +300,7 @@ pub async fn following_questions_request(
} }
}; };
let ignore_users = data.0.get_userblocks_receivers(user.id).await; let ignore_users = crate::ignore_users_gen!(user!, data);
let list = match data let list = match data
.0 .0
@ -343,11 +335,7 @@ pub async fn all_questions_request(
let data = data.read().await; let data = data.read().await;
let user = get_user_from_token!(jar, data.0); let user = get_user_from_token!(jar, data.0);
let ignore_users = if let Some(ref ua) = user { let ignore_users = crate::ignore_users_gen!(user, data);
data.0.get_userblocks_receivers(ua.id).await
} else {
Vec::new()
};
let list = match data.0.get_latest_global_questions(12, req.page).await { let list = match data.0.get_latest_global_questions(12, req.page).await {
Ok(l) => match data.0.fill_questions(l, &ignore_users).await { Ok(l) => match data.0.fill_questions(l, &ignore_users).await {
@ -419,7 +407,7 @@ pub async fn requests_request(
Err(e) => return Err(Html(render_error(e, &jar, &data, &Some(user)).await)), Err(e) => return Err(Html(render_error(e, &jar, &data, &Some(user)).await)),
}; };
let ignore_users = data.0.get_userblocks_receivers(user.id).await; let ignore_users = crate::ignore_users_gen!(user!, data);
let questions = match data let questions = match data
.0 .0
@ -533,7 +521,7 @@ pub async fn search_request(
req.query = req.query.trim().replace(" ", " & "); // change spaces into & for tsquery req.query = req.query.trim().replace(" ", " & "); // change spaces into & for tsquery
let ignore_users = data.0.get_userblocks_receivers(user.id).await; let ignore_users = crate::ignore_users_gen!(user!, data);
let list = if req.query.is_empty() { let list = if req.query.is_empty() {
Vec::new() Vec::new()

View file

@ -234,11 +234,7 @@ pub async fn posts_request(
} }
// fetch data // fetch data
let ignore_users = if let Some(ref ua) = user { let ignore_users = crate::ignore_users_gen!(user, data);
data.0.get_userblocks_receivers(ua.id).await
} else {
Vec::new()
};
let posts = if props.tag.is_empty() { let posts = if props.tag.is_empty() {
match data match data
@ -387,11 +383,7 @@ pub async fn replies_request(
check_user_blocked_or_private!(user, other_user, data, jar); check_user_blocked_or_private!(user, other_user, data, jar);
// fetch data // fetch data
let ignore_users = if let Some(ref ua) = user { let ignore_users = crate::ignore_users_gen!(user, data);
data.0.get_userblocks_receivers(ua.id).await
} else {
Vec::new()
};
let posts = match data let posts = match data
.0 .0
@ -496,11 +488,7 @@ pub async fn media_request(
check_user_blocked_or_private!(user, other_user, data, jar); check_user_blocked_or_private!(user, other_user, data, jar);
// fetch data // fetch data
let ignore_users = if let Some(ref ua) = user { let ignore_users = crate::ignore_users_gen!(user, data);
data.0.get_userblocks_receivers(ua.id).await
} else {
Vec::new()
};
let posts = match data let posts = match data
.0 .0

View file

@ -65,7 +65,7 @@ pub async fn posts_request(
)); ));
} }
let ignore_users = data.0.get_userblocks_receivers(user.id).await; let ignore_users = crate::ignore_users_gen!(user!, data);
let list = match data let list = match data
.0 .0
.get_stack_posts( .get_stack_posts(

View file

@ -706,7 +706,6 @@ impl DataManager {
auto_method!(update_user_notification_count(i32)@get_user_by_id -> "UPDATE users SET notification_count = $1 WHERE id = $2" --cache-key-tmpl=cache_clear_user); auto_method!(update_user_notification_count(i32)@get_user_by_id -> "UPDATE users SET notification_count = $1 WHERE id = $2" --cache-key-tmpl=cache_clear_user);
auto_method!(incr_user_notifications()@get_user_by_id -> "UPDATE users SET notification_count = notification_count + 1 WHERE id = $1" --cache-key-tmpl=cache_clear_user --incr); auto_method!(incr_user_notifications()@get_user_by_id -> "UPDATE users SET notification_count = notification_count + 1 WHERE id = $1" --cache-key-tmpl=cache_clear_user --incr);
auto_method!(decr_user_notifications()@get_user_by_id -> "UPDATE users SET notification_count = notification_count - 1 WHERE id = $1" --cache-key-tmpl=cache_clear_user --decr=notification_count); auto_method!(decr_user_notifications()@get_user_by_id -> "UPDATE users SET notification_count = notification_count - 1 WHERE id = $1" --cache-key-tmpl=cache_clear_user --decr=notification_count);
auto_method!(set_user_notifications(i32)@get_user_by_id -> "UPDATE users SET notification_count = $1 WHERE id = $2" --cache-key-tmpl=cache_clear_user);
auto_method!(incr_user_follower_count()@get_user_by_id -> "UPDATE users SET follower_count = follower_count + 1 WHERE id = $1" --cache-key-tmpl=cache_clear_user --incr); auto_method!(incr_user_follower_count()@get_user_by_id -> "UPDATE users SET follower_count = follower_count + 1 WHERE id = $1" --cache-key-tmpl=cache_clear_user --incr);
auto_method!(decr_user_follower_count()@get_user_by_id -> "UPDATE users SET follower_count = follower_count - 1 WHERE id = $1" --cache-key-tmpl=cache_clear_user --decr=follower_count); auto_method!(decr_user_follower_count()@get_user_by_id -> "UPDATE users SET follower_count = follower_count - 1 WHERE id = $1" --cache-key-tmpl=cache_clear_user --decr=follower_count);

View file

@ -283,9 +283,10 @@ impl DataManager {
// use changed_count to update user counts // use changed_count to update user counts
if read == false { if read == false {
// we don't need to update when marking things as read since that should just be 0 // we don't need to update when marking things as read since that should just be 0
self.set_user_notifications(user.id, changed_count).await?; self.update_user_notification_count(user.id, changed_count)
.await?;
} else { } else {
self.set_user_notifications(user.id, 0).await?; self.update_user_notification_count(user.id, 0).await?;
} }
// ... // ...

View file

@ -143,6 +143,35 @@ impl DataManager {
res.unwrap() res.unwrap()
} }
/// Get the owner of all user blocks for the given `receiver`.
pub async fn get_userblocks_initiator_by_receivers(&self, receiver: usize) -> Vec<usize> {
let conn = match self.connect().await {
Ok(c) => c,
Err(_) => return Vec::new(),
};
let res = query_rows!(
&conn,
"SELECT * FROM userblocks WHERE receiver = $1",
&[&(receiver as i64)],
|x| { Self::get_userblock_from_row(x) }
);
if res.is_err() {
return Vec::new();
}
// get owner
let mut out: Vec<usize> = Vec::new();
for b in res.unwrap() {
out.push(b.initiator);
}
// return
out
}
/// Create a new user block in the database. /// Create a new user block in the database.
/// ///
/// # Arguments /// # Arguments