From 6350008ec24570bd451f5ab3b78196f50d4824b5 Mon Sep 17 00:00:00 2001 From: FoxxMD Date: Tue, 1 Nov 2022 13:12:11 -0400 Subject: [PATCH] feat: Implement replies count detection for submissions --- .../Infrastructure/Filters/FilterCriteria.ts | 10 +++++++++ src/Common/Infrastructure/Reddit.ts | 6 ++++++ src/Subreddit/SubredditResources.ts | 14 +++++++++++++ src/Utils/SnoowrapUtils.ts | 21 +++++++++++++++++++ tests/itemCriteria.test.ts | 6 ++++++ 5 files changed, 57 insertions(+) diff --git a/src/Common/Infrastructure/Filters/FilterCriteria.ts b/src/Common/Infrastructure/Filters/FilterCriteria.ts index cf54ce1f..22b2b16b 100644 --- a/src/Common/Infrastructure/Filters/FilterCriteria.ts +++ b/src/Common/Infrastructure/Filters/FilterCriteria.ts @@ -582,6 +582,12 @@ export interface ActivityState { * * If string or list of strings then color is matched, case-insensitive, without #. String may also be a regular expression enclosed in forward slashes. * */ authorFlairBackgroundColor?: boolean | string | string[] + + // submission => num_comments + // comment => replies[] + // but on comments this is only initially hydrated if comments were parsed from a submission + // otherwise its EMPTY and we need to make an API call to get them + //replies?: CompareValue } /** @@ -589,6 +595,10 @@ export interface ActivityState { * @examples [{"over_18": true, "removed": false}] * */ export interface SubmissionState extends ActivityState { + + // num_comments property + replies?: CompareValue + pinned?: boolean spoiler?: boolean /** diff --git a/src/Common/Infrastructure/Reddit.ts b/src/Common/Infrastructure/Reddit.ts index 930f97b9..aa3218f5 100644 --- a/src/Common/Infrastructure/Reddit.ts +++ b/src/Common/Infrastructure/Reddit.ts @@ -166,3 +166,9 @@ export interface RedditRemovalMessageOptions { title?: string lock?: boolean } + +export interface ListingMore { + count: number + children: string[] + depth: number +} diff --git a/src/Subreddit/SubredditResources.ts b/src/Subreddit/SubredditResources.ts index 216f99cb..8b6ac24d 100644 --- a/src/Subreddit/SubredditResources.ts +++ b/src/Subreddit/SubredditResources.ts @@ -4,6 +4,7 @@ import { activityIsFiltered, activityIsRemoved, getAuthorHistoryAPIOptions, + getNumberOfReplies, renderContent, TemplateContext } from "../Utils/SnoowrapUtils"; @@ -2312,6 +2313,19 @@ export class SubredditResources { propResultsMap.depth!.found = depth; propResultsMap.depth!.passed = criteriaPassWithIncludeBehavior(comparisonTextOp(depth, depthCompare.operator, depthCompare.value), include); break; + case 'replies': + if(asComment(item)) { + const repliesError = `Testing for number of replies on a Comment is not currently implemented`; + log.debug(repliesError); + propResultsMap.replies!.passed = false; + propResultsMap.replies!.reason = repliesError; + break; + } + const repliesCompare = parseGenericValueComparison(itemOptVal as string); + const replies = getNumberOfReplies(item); + propResultsMap.replies!.found = replies; + propResultsMap.replies!.passed = criteriaPassWithIncludeBehavior(comparisonTextOp(replies, repliesCompare.operator, repliesCompare.value), include); + break; case 'upvoteRatio': if(asSubmission(item)) { diff --git a/src/Utils/SnoowrapUtils.ts b/src/Utils/SnoowrapUtils.ts index e20104a4..58aee693 100644 --- a/src/Utils/SnoowrapUtils.ts +++ b/src/Utils/SnoowrapUtils.ts @@ -38,6 +38,7 @@ import {StrongSubredditCriteria, SubredditCriteria} from "../Common/Infrastructu import {DurationVal, GenericContentTemplateData} from "../Common/Infrastructure/Atomic"; import {ActivityWindowCriteria} from "../Common/Infrastructure/ActivityWindow"; import { + ListingMore, SnoowrapActivity, SubredditActivityAbsoluteBreakdown, SubredditActivityBreakdown, SubredditActivityBreakdownByType @@ -566,3 +567,23 @@ export const formatSubredditBreakdownAsMarkdownList = (data: SubredditActivityBr return `${bd}\n`; } + +export const getListingMoreObj = (list: Listing): ListingMore | undefined => { + // @ts-ignore + if(list._more === null) { + return undefined; + } + // @ts-ignore + return (list._more as ListingMore); +} + +export const getNumberOfReplies = (activity: SnoowrapActivity): number => { + if(asSubmission(activity)) { + return activity.num_comments; + } + const more = getListingMoreObj(activity.replies); + if(more === undefined) { + return activity.replies.length; + } + return activity.replies.length + more.children.length; +} diff --git a/tests/itemCriteria.test.ts b/tests/itemCriteria.test.ts index 4da082be..98893794 100644 --- a/tests/itemCriteria.test.ts +++ b/tests/itemCriteria.test.ts @@ -224,6 +224,12 @@ describe('Item Criteria', function () { }, snoowrap, false), {depth: '> 1'}, NoopLogger, true)).passed); }); + it('Should detect number of replies on Submission', async function () { + assert.isTrue((await resource.isItem(new Submission({ + num_comments: 3, + }, snoowrap, false), {depth: '> 1'}, NoopLogger, true)).passed); + }); + it('Should detect upvote ratio on submission', async function () { assert.isTrue((await resource.isItem(new Submission({ upvote_ratio: 0.55,