From 6b0ee8eafbe57b785d70ee028c3f38c909209182 Mon Sep 17 00:00:00 2001 From: ayaka Date: Sat, 24 May 2025 01:02:46 +1200 Subject: [PATCH] quick bodge (fix later) --- Cargo.lock | 20 ++--- src/main.rs | 2 +- src/subreddit.rs | 186 +++++++++++++++++++++++++++++++++------- templates/settings.html | 16 ++-- 4 files changed, 176 insertions(+), 48 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1d881f8..9c5175e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1355,7 +1355,16 @@ dependencies = [ ] [[package]] -name = "redlib" +name = "redox_syscall" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redsunlib" version = "0.36.0" dependencies = [ "arc-swap", @@ -1402,15 +1411,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "redox_syscall" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" -dependencies = [ - "bitflags", -] - [[package]] name = "regex" version = "1.11.1" diff --git a/src/main.rs b/src/main.rs index ca3b550..2128ad7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -342,7 +342,7 @@ async fn main() { // Configure settings app.at("/settings").get(|r| settings::get(r).boxed()).post(|r| settings::set(r).boxed()); app.at("/settings/restore").get(|r| settings::restore(r).boxed()); - app.at("/settings/encoded-restore").post(|r| settings::encoded_restore(r).boxed()); + // app.at("/settings/encoded-restore").post(|r| settings::encoded_restore(r).boxed()); NOTE: TODO (Well, TOFIX) app.at("/settings/update").get(|r| settings::update(r).boxed()); // Mascots diff --git a/src/subreddit.rs b/src/subreddit.rs index 2eea14c..a9b5f21 100644 --- a/src/subreddit.rs +++ b/src/subreddit.rs @@ -3,13 +3,16 @@ use crate::{config, utils}; // CRATES use crate::utils::{ - catch_random, error, filter_posts, format_num, format_url, get_filters, nsfw_landing, param, redirect, rewrite_urls, setting, template, val, Post, Preferences, Subreddit, + catch_random, error, filter_posts, format_num, format_url, get_filters, info, nsfw_landing, param, redirect, rewrite_urls, setting, template, val, Post, Preferences, + Subreddit, }; use crate::{client::json, server::RequestExt, server::ResponseExt}; use cookie::Cookie; +use htmlescape::decode_html; use hyper::{Body, Request, Response}; use rinja::Template; +use chrono::DateTime; use once_cell::sync::Lazy; use regex::Regex; use time::{macros::format_description, Duration, OffsetDateTime}; @@ -66,6 +69,7 @@ pub async fn community(req: Request) -> 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 @@
Interface -
- - - -
+
+ + + +
@@ -219,7 +219,7 @@
{% endif %} -
+
{% endblock %} \ No newline at end of file