import {OperatorConfig, OperatorJsonConfig} from "../src/Common/interfaces"; import Snoowrap from "snoowrap"; import Bot from "../src/Bot/index" import {buildOperatorConfigWithDefaults, insertNameFilters} from "../src/ConfigBuilder"; import {App} from "../src/App"; import {YamlOperatorConfigDocument} from "../src/Common/Config/Operator"; import {NoopLogger} from "../src/Utils/loggerFactory"; import {ManagerEntity} from "../src/Common/Entities/ManagerEntity"; import {Bot as BotEntity} from "../src/Common/Entities/Bot"; import {SubredditResources} from "../src/Subreddit/SubredditResources"; import {Subreddit, Comment, Submission} from 'snoowrap/dist/objects'; import dayjs from 'dayjs'; import { FilterOptions, MaybeAnonymousCriteria, MinimalOrFullFilter, MinimalOrFullFilterJson, MinimalOrFullMaybeAnonymousFilter, NamedCriteria } from "../src/Common/Infrastructure/Filters/FilterShapes"; import {AuthorCriteria} from "../src"; import {TypedActivityState} from "../src/Common/Infrastructure/Filters/FilterCriteria"; const mockSnoowrap = new Snoowrap({userAgent: 'test', accessToken: 'test'}); const memoryConfig: OperatorJsonConfig = { databaseConfig: { connection: { type: 'sqljs', location: ':memory:' } }, logging: { level: 'debug', file: { dirname: false } }, bots: [ { name: 'test', credentials: { reddit: { clientId: 'test', clientSecret: 'test', accessToken: 'test', refreshToken: 'test' } } } ] }; let config: OperatorConfig; let app: App; let snoowrap: Snoowrap; let bot: Bot; let resource: SubredditResources; let subreddit: Subreddit; export const getConfig = async () => { if (config === undefined) { config = await buildOperatorConfigWithDefaults(memoryConfig); } return config; } export const getApp = async () => { if (app === undefined) { const config = await getConfig(); app = new App({...config, fileConfig: {document: new YamlOperatorConfigDocument('')}}); await app.initDatabase(); } return app; } export const getSnoowrap = async () => { if (snoowrap === undefined) { const bot = await getBot(); snoowrap = bot.client; } return snoowrap; } export const getBot = async () => { if (bot === undefined) { await getApp(); const config = await getConfig(); bot = new Bot(config.bots[0], NoopLogger); await bot.cacheManager.set('test', { logger: NoopLogger, caching: { authorTTL: false, submissionTTL: false, commentTTL: false, provider: 'memory' }, subreddit: bot.client.getSubreddit('test'), client: bot.client, statFrequency: 'minute', managerEntity: new ManagerEntity(), botEntity: new BotEntity() }); } return bot; } export const getResource = async () => { if (resource === undefined) { const bot = await getBot(); resource = bot.cacheManager.get('test') as SubredditResources; } return resource; } // @ts-ignore export const getSubreddit = async () => { if (subreddit === undefined) { const snoo = await getSnoowrap(); subreddit = new Subreddit({id: 't3_test', name: 'test'}, snoo, true); } // @ts-ignore return subreddit; } export const sampleActivity = { moddable: { commentRemovedByMod: (snoowrap = mockSnoowrap) => { return new Submission({ can_mod_post: true, banned_at_utc: dayjs().subtract(10, 'minutes').unix(), removed_by_category: 'mod' }, snoowrap, true); }, activityRemovedByMod: (snoowrap = mockSnoowrap) => { return new Submission({ can_mod_post: true, banned_at_utc: dayjs().subtract(10, 'minutes').unix(), removed_by_category: 'mod' }, snoowrap, true) }, activityFilteredByAutomod: (snoowrap = mockSnoowrap) => { return new Submission({ can_mod_post: true, banned_at_utc: dayjs().subtract(10, 'minutes').unix(), removed_by_category: 'automod_filtered' }, snoowrap, true); }, commentFiltered: (snoowrap = mockSnoowrap) => { return new Comment({ can_mod_post: true, banned_at_utc: dayjs().subtract(10, 'minutes').unix(), removed: false, replies: '' }, snoowrap, true) }, commentRemoved: (snoowrap = mockSnoowrap) => { return new Comment({ can_mod_post: true, banned_at_utc: dayjs().subtract(10, 'minutes').unix(), removed: true, replies: '' }, snoowrap, true); }, submissionDeleted: (snoowrap = mockSnoowrap) => { return new Submission({ can_mod_post: true, banned_at_utc: dayjs().subtract(10, 'minutes').unix(), removed_by_category: 'deleted' }, snoowrap, true); }, commentDeleted: (snoowrap = mockSnoowrap) => { return new Comment({ can_mod_post: true, banned_at_utc: dayjs().subtract(10, 'minutes').unix(), removed: false, replies: '', author: { name: '[deleted]' } }, snoowrap, true); } }, public: { submissionRemoved: (snoowrap = mockSnoowrap) => { return new Submission({ can_mod_post: false, removed_by_category: 'moderator' }, snoowrap, true) }, submissionDeleted: (snoowrap = mockSnoowrap) => { return new Submission({ can_mod_post: false, removed_by_category: 'deleted' }, snoowrap, true); }, commentRemoved: (snoowrap = mockSnoowrap) => { return new Comment({ can_mod_post: false, body: '[removed]', replies: '' }, snoowrap, true) }, activityRemoved: (snoowrap = mockSnoowrap) => { return new Submission({ can_mod_post: false, banned_at_utc: dayjs().subtract(10, 'minutes').unix(), removed_by_category: 'moderator' }, snoowrap, true); } } } export const authorAgeDayCrit = (): AuthorCriteria => ({ age: '> 1 day' }); export const authorAgeMonthCrit = (): AuthorCriteria => ({ age: '> 1 month' }); export const authorFlair1Crit = (): AuthorCriteria => ({ flairText: 'flair 1' }); export const authorFlair2Crit = (): AuthorCriteria => ({ flairText: 'flair 2' }); export const fullAuthorFullInclude = (): FilterOptions => ({ include: [ { criteria: authorAgeDayCrit() }, { criteria: authorFlair1Crit() } ] }) export const fullAuthorFullExclude = (): FilterOptions => ({ exclude: [ { criteria: authorAgeMonthCrit() }, { criteria: authorFlair2Crit() } ] }) export const fullAuthorFullAll = (): FilterOptions => ({ include: fullAuthorFullInclude().include, }) export const fullAuthorAnonymousInclude = (): MinimalOrFullFilterJson => ({ include: [ authorAgeDayCrit(), authorFlair1Crit() ] }) export const fullAuthorAnonymousExclude = (): MinimalOrFullFilterJson => ({ exclude: [ authorAgeMonthCrit(), authorFlair2Crit() ] }); export const fullAuthorAnonymousAll = (): MinimalOrFullFilterJson => ({ include: (fullAuthorAnonymousInclude() as FilterOptions).include, exclude: (fullAuthorAnonymousExclude() as FilterOptions).exclude, }) export const namedAuthorFilter = (): NamedCriteria => ({ name: 'test1Author', criteria: authorAgeDayCrit() }); export const itemRemovedCrit = (): TypedActivityState => ({ removed: false }); export const itemApprovedCrit = (): TypedActivityState => ({ approved: true }); export const itemFlairCrit = (): TypedActivityState => ({ link_flair_text: ['test1','test2'] }); export const fullItemFullInclude = (): FilterOptions => ({ include: [ { criteria: itemRemovedCrit() }, { criteria: itemApprovedCrit() } ] }) export const fullItemFullExclude = (): FilterOptions => ({ exclude: [ { criteria: itemRemovedCrit() }, { criteria: itemFlairCrit() } ] }) export const fullItemFullAll = (): FilterOptions => ({ include: fullItemFullInclude().include, }) export const fullItemAnonymousInclude = (): MinimalOrFullFilterJson => ({ include: [ itemRemovedCrit(), itemApprovedCrit() ] }) export const fullItemAnonymousExclude = (): MinimalOrFullFilterJson => ({ exclude: [ itemRemovedCrit(), itemFlairCrit() ] }); export const fullItemAnonymousAll = (): MinimalOrFullFilterJson => ({ include: (fullItemAnonymousInclude() as FilterOptions).include, exclude: (fullItemAnonymousExclude() as FilterOptions).exclude, }) export const namedItemFilter = (): NamedCriteria => ({ name: 'test1Item', criteria: itemRemovedCrit() }); export const namedAuthorFilters = new Map([['test1author', namedAuthorFilter()]]); export const namedItemFilters = new Map([['test1item', namedItemFilter()]]); export const minimalAuthorFilter = (): MinimalOrFullMaybeAnonymousFilter => ([ { criteria: authorAgeDayCrit() }, { criteria: authorAgeMonthCrit() } ]); export const maybeAnonymousFullAuthorFilter = (): MinimalOrFullMaybeAnonymousFilter => ({ include: [ { criteria: authorAgeDayCrit() }, { criteria: authorAgeMonthCrit() } ], exclude: [ { criteria: authorAgeDayCrit() }, { criteria: authorAgeMonthCrit() } ] });