) -> Result, String> {
let query = req.uri().query().unwrap_or_default().to_string();
let subscribed = setting(&req, "subscriptions");
let front_page = setting(&req, "front_page");
+ let remove_default_feeds = setting(&req, "remove_default_feeds") == "on";
let post_sort = req.cookie("post_sort").map_or_else(|| "hot".to_string(), |c| c.value().to_string());
let sort = req.param("sort").unwrap_or_else(|| req.param("id").unwrap_or(post_sort));
@@ -78,6 +82,21 @@ pub async fn community(req: Request) -> Result, String> {
} else {
front_page.clone()
});
+
+ if (sub_name == "popular" || sub_name == "all") && remove_default_feeds {
+ if subscribed.is_empty() {
+ return info(req, "Subscribe to some subreddits! (Default feeds disabled in settings)").await;
+ } else {
+ // If there are subscribed subs, but we get here, then the problem is that front_page pref is set to something besides default.
+ // Tell user to go to settings and change front page to default.
+ return info(
+ req,
+ "You have subscribed to some subreddits, but your front page is not set to default. Visit settings and change front page to default.",
+ )
+ .await;
+ }
+ }
+
let quarantined = can_access_quarantine(&req, &sub_name) || root;
// Handle random subreddits
@@ -213,6 +232,41 @@ pub fn can_access_quarantine(req: &Request, sub: &str) -> bool {
setting(req, &format!("allow_quaran_{}", sub.to_lowercase())).parse().unwrap_or_default()
}
+// Join items in chunks of 4000 bytes in length for cookies
+pub fn join_until_size_limit(vec: &[T]) -> Vec {
+ let mut result = Vec::new();
+ let mut list = String::new();
+ let mut current_size = 0;
+
+ for item in vec {
+ // Size in bytes
+ let item_size = item.to_string().len();
+ // Use 4000 bytes to leave us some headroom because the name and options of the cookie count towards the 4096 byte cap
+ if current_size + item_size > 4000 {
+ // If last item add a seperator on the end of the list so it's interpreted properly in tanden with the next cookie
+ list.push('+');
+
+ // Push current list to result vector
+ result.push(list);
+
+ // Reset the list variable so we can continue with only new items
+ list = String::new();
+ }
+ // Add separator if not the first item
+ if !list.is_empty() {
+ list.push('+');
+ }
+ // Add current item to list
+ list.push_str(&item.to_string());
+ current_size = list.len() + item_size;
+ }
+ // Make sure to push whatever the remaining subreddits are there into the result vector
+ result.push(list);
+
+ // Return resulting vector
+ result
+}
+
// Sub, filter, unfilter, quicklist, unquicklist or unsub by setting subscription cookie using response "Set-Cookie" header
pub async fn subscriptions_filters_quicklists(req: Request) -> Result, String> {
let sub = req.param("sub").unwrap_or_default();
@@ -314,39 +368,112 @@ pub async fn subscriptions_filters_quicklists(req: Request) -> Result) -> Result, String> {
.into_iter()
.map(|post| Item {
title: Some(post.title.to_string()),
- link: Some(utils::get_post_url(&post)),
+ link: Some(format_url(&utils::get_post_url(&post))),
author: Some(post.author.name),
- content: Some(rewrite_urls(&post.body)),
+ content: Some(rewrite_urls(&decode_html(&post.body).unwrap())),
+ pub_date: Some(DateTime::from_timestamp(post.created_ts as i64, 0).unwrap_or_default().to_rfc2822()),
description: Some(format!(
"Comments",
config::get_setting("REDLIB_FULL_URL").unwrap_or_default(),
diff --git a/templates/settings.html b/templates/settings.html
index 0aa9abb..2964d5f 100644
--- a/templates/settings.html
+++ b/templates/settings.html
@@ -37,12 +37,6 @@