add: hide posts from users who have blocked you from timelines
This commit is contained in:
parent
22ae479bd7
commit
8de5c0ea76
10 changed files with 84 additions and 81 deletions
|
@ -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()
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1138,7 +1138,7 @@ show_kick=false, secondary=false) -%}
|
|||
|
||||
<div
|
||||
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) }}
|
||||
<div class="user_status">{{ self::user_status(other_user=user) }}</div>
|
||||
|
|
|
@ -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
|
||||
.0
|
||||
|
@ -322,7 +322,7 @@ pub async fn channels_request(
|
|||
};
|
||||
|
||||
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();
|
||||
channel.members.insert(0, channel.owner); // include the owner in the members list (at the start)
|
||||
|
|
|
@ -392,11 +392,7 @@ pub async fn feed_request(
|
|||
let (can_read, _) = check_permissions!(community, jar, data, user);
|
||||
|
||||
// ...
|
||||
let ignore_users = if let Some(ref ua) = user {
|
||||
data.0.get_userblocks_receivers(ua.id).await
|
||||
} else {
|
||||
Vec::new()
|
||||
};
|
||||
let ignore_users = crate::ignore_users_gen!(user, data);
|
||||
|
||||
let feed = match data
|
||||
.0
|
||||
|
@ -494,11 +490,7 @@ pub async fn questions_request(
|
|||
let (can_read, _) = check_permissions!(community, jar, data, user);
|
||||
|
||||
// ...
|
||||
let ignore_users = if let Some(ref ua) = user {
|
||||
data.0.get_userblocks_receivers(ua.id).await
|
||||
} else {
|
||||
Vec::new()
|
||||
};
|
||||
let ignore_users = crate::ignore_users_gen!(user, data);
|
||||
|
||||
let feed = match data
|
||||
.0
|
||||
|
@ -673,11 +665,7 @@ pub async fn post_request(
|
|||
Err(e) => return Err(Html(render_error(e, &jar, &data, &user).await)),
|
||||
};
|
||||
|
||||
let ignore_users = if let Some(ref ua) = user {
|
||||
data.0.get_userblocks_receivers(ua.id).await
|
||||
} else {
|
||||
Vec::new()
|
||||
};
|
||||
let ignore_users = crate::ignore_users_gen!(user, data);
|
||||
|
||||
// ...
|
||||
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 {
|
||||
data.0.get_userblocks_receivers(ua.id).await
|
||||
} else {
|
||||
Vec::new()
|
||||
};
|
||||
let ignore_users = crate::ignore_users_gen!(user, data);
|
||||
|
||||
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 {
|
||||
|
@ -827,11 +811,7 @@ pub async fn reposts_request(
|
|||
Err(e) => return Err(Html(render_error(e, &jar, &data, &user).await)),
|
||||
};
|
||||
|
||||
let ignore_users = if let Some(ref ua) = user {
|
||||
data.0.get_userblocks_receivers(ua.id).await
|
||||
} else {
|
||||
Vec::new()
|
||||
};
|
||||
let ignore_users = crate::ignore_users_gen!(user, data);
|
||||
|
||||
// ...
|
||||
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 {
|
||||
data.0.get_userblocks_receivers(ua.id).await
|
||||
} else {
|
||||
Vec::new()
|
||||
};
|
||||
let ignore_users = crate::ignore_users_gen!(user, data);
|
||||
|
||||
let list = if props.quotes {
|
||||
match data
|
||||
|
@ -973,7 +949,7 @@ pub async fn likes_request(
|
|||
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());
|
||||
|
@ -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) {
|
||||
// all reactions
|
||||
|
@ -1213,11 +1189,7 @@ pub async fn question_request(
|
|||
}
|
||||
|
||||
// ...
|
||||
let ignore_users = if let Some(ref ua) = user {
|
||||
data.0.get_userblocks_receivers(ua.id).await
|
||||
} else {
|
||||
Vec::new()
|
||||
};
|
||||
let ignore_users = crate::ignore_users_gen!(user, data);
|
||||
|
||||
let feed = match data
|
||||
.0
|
||||
|
|
|
@ -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
|
||||
.0
|
||||
|
@ -97,11 +97,7 @@ pub async fn popular_request(
|
|||
let data = data.read().await;
|
||||
let user = get_user_from_token!(jar, data.0);
|
||||
|
||||
let ignore_users = if let Some(ref ua) = user {
|
||||
data.0.get_userblocks_receivers(ua.id).await
|
||||
} else {
|
||||
Vec::new()
|
||||
};
|
||||
let ignore_users = crate::ignore_users_gen!(user, data);
|
||||
|
||||
let list = match data.0.get_popular_posts(12, req.page, 604_800_000).await {
|
||||
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
|
||||
.0
|
||||
|
@ -181,11 +177,7 @@ pub async fn all_request(
|
|||
let data = data.read().await;
|
||||
let user = get_user_from_token!(jar, data.0);
|
||||
|
||||
let ignore_users = if let Some(ref ua) = user {
|
||||
data.0.get_userblocks_receivers(ua.id).await
|
||||
} else {
|
||||
Vec::new()
|
||||
};
|
||||
let ignore_users = crate::ignore_users_gen!(user, data);
|
||||
|
||||
let list = match data.0.get_latest_posts(12, req.page).await {
|
||||
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
|
||||
.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
|
||||
.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
|
||||
.0
|
||||
|
@ -343,11 +335,7 @@ pub async fn all_questions_request(
|
|||
let data = data.read().await;
|
||||
let user = get_user_from_token!(jar, data.0);
|
||||
|
||||
let ignore_users = if let Some(ref ua) = user {
|
||||
data.0.get_userblocks_receivers(ua.id).await
|
||||
} else {
|
||||
Vec::new()
|
||||
};
|
||||
let ignore_users = crate::ignore_users_gen!(user, data);
|
||||
|
||||
let list = match data.0.get_latest_global_questions(12, req.page).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)),
|
||||
};
|
||||
|
||||
let ignore_users = data.0.get_userblocks_receivers(user.id).await;
|
||||
let ignore_users = crate::ignore_users_gen!(user!, data);
|
||||
|
||||
let questions = match data
|
||||
.0
|
||||
|
@ -533,7 +521,7 @@ pub async fn search_request(
|
|||
|
||||
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() {
|
||||
Vec::new()
|
||||
|
|
|
@ -234,11 +234,7 @@ pub async fn posts_request(
|
|||
}
|
||||
|
||||
// fetch data
|
||||
let ignore_users = if let Some(ref ua) = user {
|
||||
data.0.get_userblocks_receivers(ua.id).await
|
||||
} else {
|
||||
Vec::new()
|
||||
};
|
||||
let ignore_users = crate::ignore_users_gen!(user, data);
|
||||
|
||||
let posts = if props.tag.is_empty() {
|
||||
match data
|
||||
|
@ -387,11 +383,7 @@ pub async fn replies_request(
|
|||
check_user_blocked_or_private!(user, other_user, data, jar);
|
||||
|
||||
// fetch data
|
||||
let ignore_users = if let Some(ref ua) = user {
|
||||
data.0.get_userblocks_receivers(ua.id).await
|
||||
} else {
|
||||
Vec::new()
|
||||
};
|
||||
let ignore_users = crate::ignore_users_gen!(user, data);
|
||||
|
||||
let posts = match data
|
||||
.0
|
||||
|
@ -496,11 +488,7 @@ pub async fn media_request(
|
|||
check_user_blocked_or_private!(user, other_user, data, jar);
|
||||
|
||||
// fetch data
|
||||
let ignore_users = if let Some(ref ua) = user {
|
||||
data.0.get_userblocks_receivers(ua.id).await
|
||||
} else {
|
||||
Vec::new()
|
||||
};
|
||||
let ignore_users = crate::ignore_users_gen!(user, data);
|
||||
|
||||
let posts = match data
|
||||
.0
|
||||
|
|
|
@ -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
|
||||
.0
|
||||
.get_stack_posts(
|
||||
|
|
|
@ -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!(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!(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!(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);
|
||||
|
|
|
@ -283,9 +283,10 @@ impl DataManager {
|
|||
// use changed_count to update user counts
|
||||
if read == false {
|
||||
// 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 {
|
||||
self.set_user_notifications(user.id, 0).await?;
|
||||
self.update_user_notification_count(user.id, 0).await?;
|
||||
}
|
||||
|
||||
// ...
|
||||
|
|
|
@ -143,6 +143,35 @@ impl DataManager {
|
|||
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.
|
||||
///
|
||||
/// # Arguments
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue