diff --git a/inc/processSearchResults.js b/inc/processSearchResults.js index de4a186..bb71ef2 100644 --- a/inc/processSearchResults.js +++ b/inc/processSearchResults.js @@ -15,6 +15,15 @@ module.exports = function() { search_firstpage = true } + let suggested_subreddits = false + if(json.suggested_subreddits) { + if(json.suggested_subreddits.data) { + if(json.suggested_subreddits.data.children.length > 0) { + suggested_subreddits = json.suggested_subreddits.data.children + } + } + } + if(json.data.children) { let view_more_posts = false let posts_limit = 25 @@ -90,7 +99,8 @@ module.exports = function() { search_firstpage: search_firstpage, before: before, after: after, - posts: posts + posts: posts, + suggested_subreddits: suggested_subreddits, } resolve(obj) diff --git a/routes.js b/routes.js index 9551a31..67f7a6e 100644 --- a/routes.js +++ b/routes.js @@ -916,28 +916,43 @@ module.exports = (app, redis, fetch, RedditAPI) => { if(result.status === 200) { result.json() .then(json => { - redis.setex(key, config.setexs.searches, JSON.stringify(json), (error) => { - if(error) { - console.error('Error setting the searches key to redis.', error) - return res.render('index', { json: null, user_preferences: req.cookies }) - } else { - console.log('Fetched search results from Reddit.'); - (async () => { - let processed_json = await processSearchResults(json, true, after, before, req.cookies) - return res.render('search', { - no_query: false, - json: processed_json, - q: q, - restrict_sr: restrict_sr, - nsfw: nsfw, - subreddit: subreddit, - sortby: sortby, - past: past, - user_preferences: req.cookies - }) - })() + (async () => { + /** + * Fetch suggested subreddits when the restrict_sr option is + * turned off ("limit my search to") and we are on the first search + * page (just like in Reddit). + */ + json.suggested_subreddits = {} + if(restrict_sr === 'off' && before == '' && after == '') { + let url = `https://reddit.com/subreddits/search.json?q=${q}&include_over_18=${nsfw}&limit=3` + const response = await fetch(url) + const data = await response.json() + json.suggested_subreddits = data } - }) + + redis.setex(key, config.setexs.searches, JSON.stringify(json), (error) => { + if(error) { + console.error('Error setting the searches key to redis.', error) + return res.render('index', { json: null, user_preferences: req.cookies }) + } else { + console.log('Fetched search results from Reddit.'); + (async () => { + let processed_json = await processSearchResults(json, true, after, before, req.cookies) + return res.render('search', { + no_query: false, + json: processed_json, + q: q, + restrict_sr: restrict_sr, + nsfw: nsfw, + subreddit: subreddit, + sortby: sortby, + past: past, + user_preferences: req.cookies + }) + })() + } + }) + })() }) } else { console.error(`Something went wrong while fetching data from Reddit. ${result.status} – ${result.statusText}`) diff --git a/static/css/styles.css b/static/css/styles.css index 3b45e44..7a732aa 100644 --- a/static/css/styles.css +++ b/static/css/styles.css @@ -1228,6 +1228,23 @@ a.sub-to-subreddit.gray { border-radius: 0; margin-bottom: 11px; } +/* SUGGESTED SUBREDDITS ON SEARCH PAGES */ +.suggested-subreddits { + margin: 0px 0px 30px 1%; +} +.suggested-subreddits h3 { + border-bottom: 1px solid #7d7d7d; + max-width: 820px; + margin: 0px 0px 16px 10px; + padding: 0px 0px 5px 0px; + font-size: 0.9rem; +} +.suggested-subreddits .sub-button { + margin: 0px 0px 7px 0px; +} +.suggested-subreddits .description { + font-size: 0.8rem; +} /* REDDIT STYLES */ .md .md-spoiler-text { border-radius:2px; diff --git a/views/search.pug b/views/search.pug index f5bdf12..6d2a12f 100644 --- a/views/search.pug +++ b/views/search.pug @@ -100,6 +100,40 @@ html if json.posts.length === 0 && !no_query p no results else + if json.suggested_subreddits + .suggested-subreddits + h3 suggested subreddits + each suggested_subreddit in json.suggested_subreddits + .link + .entry + - + let subbed_to_this_subreddit = false + let subbed = [] + if(user_preferences.subbed_subreddits && Array.isArray(user_preferences.subbed_subreddits)) + subbed = user_preferences.subbed_subreddits + for(let i = 0; i < subbed.length; i++) { + if(subbed[i].toLowerCase() === suggested_subreddit.data.display_name.toLowerCase()) + subbed_to_this_subreddit = true + } + .content + .title + a(href="" + suggested_subreddit.data.url + "", rel="noopener noreferrer") + h2 #{suggested_subreddit.data.display_name_prefixed}: #{cleanTitle(suggested_subreddit.data.title)} + .sub-button + if subbed_to_this_subreddit + a(href="/unsubscribe/" + suggested_subreddit.data.display_name + "?b=/r/" + subreddit + "?q=" + q + "§nsfw=" + nsfw + "", class="sub-to-subreddit gray", title="subscriptions are saved in your browser's cookies") unsubscribe + else + a(href="/subscribe/" + suggested_subreddit.data.display_name + "?b=/r/" + subreddit + "?q=" + q + "§nsfw=" + nsfw + "", class="sub-to-subreddit", title="subscriptions are saved in your browser's cookies") subscribe + .description + p #{cleanTitle(suggested_subreddit.data.public_description)} + .meta + p.subscribers #{kFormatter(suggested_subreddit.data.subscribers)} subscribers, + p.submitted   created + span(title="" + toUTCString(suggested_subreddit.data.created) + "") #{timeDifference(suggested_subreddit.data.created)} + .links + if suggested_subreddit.data.over_18 + span.tag.nsfw NSFW + a(href="/subreddits/search?q="+ q +"", class="btn") show more similar subreddits each link in json.posts .link .upvotes