diff --git a/README.md b/README.md index 2c503a6..24923e9 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,6 @@ Community instances: ## TODO -* Sort comments in post * User attributes * Comment and post attributes (e.g. stickies) * Subreddit flairs and wikis diff --git a/dist/css/styles.css b/dist/css/styles.css index 7bccea4..8c4c4c7 100644 --- a/dist/css/styles.css +++ b/dist/css/styles.css @@ -692,6 +692,24 @@ input[type="submit"]:hover, width: calc(100% - 30px); margin: 10px 0px 10px 30px; } +#post .comments-sort details { + float: left; + width: auto; + cursor: pointer; + margin-bottom: 10px; +} +#post .comments-sort details ul li.active a { + font-weight: bold; +} +#post .comments-sort details li.active a { + font-weight: bold; +} +#post .comments-sort details { + font-size: 0.8rem; +} +#post .comments-sort details ul { + margin-left: 20px; +} #post .comment .meta p.stickied { color: green; } diff --git a/routes.js b/routes.js index c49a319..b511427 100644 --- a/routes.js +++ b/routes.js @@ -459,6 +459,7 @@ module.exports = (app, redis, fetch, RedditAPI) => { let subreddit = req.params.subreddit let id = req.params.id let snippet = encodeURIComponent(req.params.snippet) + let sortby = req.query.sort let comment_id = '' let viewing_comment = false let more_comments_cursor = req.query.cursor @@ -469,10 +470,20 @@ module.exports = (app, redis, fetch, RedditAPI) => { viewing_comment = true } + if(!sortby) { + sortby = config.post_comments_sort + } + + if(!['confidence', 'top', 'new', 'controversial', 'old', 'qa'].includes(sortby)) { + console.error(`Got invalid sort.`, req.originalUrl) + return res.redirect('/') + } + let comments_url = `/r/${subreddit}/comments/${id}/${snippet}/${comment_id}` let post_url = `/r/${subreddit}/comments/${id}/${snippet}/` - - redis.get(comments_url, (error, json) => { + let comments_key = `${comments_url}:sort:${sortby}` + + redis.get(comments_key, (error, json) => { if(error) { console.error(`Error getting the ${comments_url} key from redis.`, error) return res.render('index', { post: null, user_preferences: req.cookies }) @@ -489,55 +500,57 @@ module.exports = (app, redis, fetch, RedditAPI) => { viewing_comment: viewing_comment, post_url: post_url, subreddit: subreddit, + sortby: sortby, user_preferences: req.cookies }) } else { - let key = `morechildren:${post_url};1` - redis.get(key, (error, json) => { - if(error) { - console.error(`Error getting the ${key} key from redis.`, error) - return res.render('index', { json: null, user_preferences: req.cookies }) - } - if(json) { - console.log(`Got ${key} key from redis.`); - redis.get(post_url, (error, post_json) => { - if(error) { - console.error(`Error getting the ${post_url} key from redis.`, error) - return res.render('index', { json: null, user_preferences: req.cookies }) - } - if(post_json) { - redis.get(`morechildren_ids:${post_url}`, (error, morechildren_ids) => { - (async () => { - post_json = JSON.parse(post_json) - json = JSON.parse(json) - post_json[1].data.children = json - let processed_json = await processJsonPost(post_json, true) - let finalized_json = await finalizeJsonPost(processed_json, id, post_url, morechildren_ids) - - return res.render('post', { - post: finalized_json.post_data, - comments: finalized_json.comments, - viewing_comment: false, - post_url: post_url, - subreddit: req.params.subreddit, - more_comments_page: 1, - user_preferences: req.cookies - }) - })() - }) - } - }) - } - }) + let key = `morechildren:${post_url};1` + redis.get(key, (error, json) => { + if(error) { + console.error(`Error getting the ${key} key from redis.`, error) + return res.render('index', { json: null, user_preferences: req.cookies }) + } + if(json) { + console.log(`Got ${key} key from redis.`); + redis.get(post_url, (error, post_json) => { + if(error) { + console.error(`Error getting the ${post_url} key from redis.`, error) + return res.render('index', { json: null, user_preferences: req.cookies }) + } + if(post_json) { + redis.get(`morechildren_ids:${post_url}`, (error, morechildren_ids) => { + (async () => { + post_json = JSON.parse(post_json) + json = JSON.parse(json) + post_json[1].data.children = json + let processed_json = await processJsonPost(post_json, true) + let finalized_json = await finalizeJsonPost(processed_json, id, post_url, morechildren_ids) + + return res.render('post', { + post: finalized_json.post_data, + comments: finalized_json.comments, + viewing_comment: false, + post_url: post_url, + subreddit: req.params.subreddit, + sortby: sortby, + more_comments_page: 1, + user_preferences: req.cookies + }) + })() + }) + } + }) + } + }) } })() } else { - fetch(encodeURI(`https://oauth.reddit.com${comments_url}?api_type=json&sort=${config.post_comments_sort}&context=${context}`), redditApiGETHeaders()) + fetch(encodeURI(`https://oauth.reddit.com${comments_url}?api_type=json&sort=${sortby}&context=${context}`), redditApiGETHeaders()) .then(result => { if(result.status === 200) { result.json() .then(json => { - redis.setex(comments_url, config.setexs.posts, JSON.stringify(json), (error) => { + redis.setex(comments_key, config.setexs.posts, JSON.stringify(json), (error) => { if(error) { console.error(`Error setting the ${comments_url} key to redis.`, error) return res.render('post', { post: null, user_preferences: req.cookies }) @@ -552,6 +565,7 @@ module.exports = (app, redis, fetch, RedditAPI) => { viewing_comment: viewing_comment, post_url: post_url, subreddit: subreddit, + sortby: sortby, user_preferences: req.cookies }) })() @@ -753,7 +767,7 @@ module.exports = (app, redis, fetch, RedditAPI) => { console.log(`Redirecting to ${post_url} with cursor...`); return res.redirect(`${post_url}?cursor=${page}&page=${page}`) } else { - let url = `https://oauth.reddit.com/api/morechildren?api_type=json&children=${ids_to_show}&limit_children=false&link_id=t3_${post_id}&sort=${config.post_comments_sort}` + let url = `https://oauth.reddit.com/api/morechildren?api_type=json&children=${ids_to_show}&limit_children=false&link_id=t3_${post_id}` fetch(encodeURI(url), redditApiGETHeaders()) .then(result => { if(result.status === 200) { diff --git a/views/post.pug b/views/post.pug index 96c0114..861c8ce 100644 --- a/views/post.pug +++ b/views/post.pug @@ -137,5 +137,33 @@ html a(href="" + post_url + "") view the rest of the comments → .comments-info p all #{post.num_comments} comments + .comments-sort + details + summary + if sortby === 'confidence' + span sorted by: best + if sortby === 'top' + span sorted by: top + if sortby === 'new' + span sorted by: new + if sortby === 'controversial' + span sorted by: controversial + if sortby === 'old' + span sorted by: old + if sortby === 'qa' + span sorted by: q&a + ul + li(class=sortby === 'confidence' ? 'active' : '') + a(href="?sort=confidence") best + li(class=sortby === 'top' ? 'active' : '') + a(href="?sort=top") top + li(class=sortby === 'new' ? 'active' : '') + a(href="?sort=new") new + li(class=sortby === 'controversial' ? 'active' : '') + a(href="?sort=controversial") controversial + li(class=sortby === 'old' ? 'active' : '') + a(href="?sort=old") old + li(class=sortby === 'qa' ? 'active' : '') + a(href="?sort=qa") Q&A != comments