From f2cd0db6a83e4bb2b56d14b9047a18d4a6ebf932 Mon Sep 17 00:00:00 2001 From: Harsha Raghu Date: Tue, 11 Oct 2022 09:42:02 +0530 Subject: [PATCH 1/7] feat: Never treat apps or titles as afk - Never treat some app with process names or titles matching a Regex pattern as AFK - Added a browser setting for the same - Future todo can be to implement a server query function of the form filter_keyvalues_regex( , "*", ) which will match all attr's of event like categorize() (future url support etc.) --- src/queries.ts | 12 ++++++- src/stores/activity.ts | 8 ++++- src/stores/settings.ts | 5 +++ src/views/activity/Activity.vue | 2 ++ src/views/settings/NeverAfkFilterSettings.vue | 35 +++++++++++++++++++ src/views/settings/Settings.vue | 6 ++++ 6 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 src/views/settings/NeverAfkFilterSettings.vue diff --git a/src/queries.ts b/src/queries.ts index f8d5c8ab..5711f642 100644 --- a/src/queries.ts +++ b/src/queries.ts @@ -39,6 +39,7 @@ interface DesktopQueryParams extends BaseQueryParams { bid_window: string; bid_afk: string; filter_afk: boolean; + neverTreatAsAfkFilter: string; } interface AndroidQueryParams extends BaseQueryParams { @@ -48,6 +49,7 @@ interface AndroidQueryParams extends BaseQueryParams { interface MultiQueryParams extends BaseQueryParams { hosts: string[]; filter_afk: boolean; + neverTreatAsAfkFilter: string; // This can be used to override params on a per-host basis host_params: { [host: string]: DesktopQueryParams | AndroidQueryParams }; } @@ -102,6 +104,7 @@ function isMultiParams(object: any): object is MultiQueryParams { export function canonicalEvents(params: DesktopQueryParams | AndroidQueryParams): string { // Needs escaping for regex patterns like '\w' to work (JSON.stringify adds extra unecessary escaping) const categories_str = JSON.stringify(params.categories).replace(/\\\\/g, '\\'); + const neverTreatAsAfkFilter_str = isDesktopParams(params)? JSON.stringify(params.neverTreatAsAfkFilter).replace(/\\\\/g, '\\'): undefined; const cat_filter_str = JSON.stringify(params.filter_categories); // For simplicity, we assume that bid_window and bid_android are exchangeable (note however it needs special treatment) @@ -115,7 +118,14 @@ export function canonicalEvents(params: DesktopQueryParams | AndroidQueryParams) // Fetch not-afk events isDesktopParams(params) ? `not_afk = flood(query_bucket("${params.bid_afk}")); - not_afk = filter_keyvals(not_afk, "status", ["not-afk"]);` + not_afk = filter_keyvals(not_afk, "status", ["not-afk"]);` + + (neverTreatAsAfkFilter_str + ? + `not_treat_as_afk = filter_keyvals_regex(events, "app", ${neverTreatAsAfkFilter_str}); + not_afk = period_union(not_afk, not_treat_as_afk); + not_treat_as_afk = filter_keyvals_regex(events, "title", ${neverTreatAsAfkFilter_str}); + not_afk = period_union(not_afk, not_treat_as_afk);` + : '') : '', // Fetch browser events isDesktopParams(params) && params.bid_browsers diff --git a/src/stores/activity.ts b/src/stores/activity.ts index d8078e59..3fa7c066 100644 --- a/src/stores/activity.ts +++ b/src/stores/activity.ts @@ -58,6 +58,7 @@ export interface QueryOptions { filter_categories?: string[][]; dont_query_inactive?: boolean; force?: boolean; + neverTreatAsAfkFilter?: string; } interface State { @@ -301,7 +302,7 @@ export const useActivityStore = defineStore('activity', { }, async query_multidevice_full( - { timeperiod, filter_categories, filter_afk }: QueryOptions, + { timeperiod, filter_categories, filter_afk, neverTreatAsAfkFilter }: QueryOptions, hosts: string[] ) { const periods = [timeperiodToStr(timeperiod)]; @@ -313,6 +314,7 @@ export const useActivityStore = defineStore('activity', { categories, filter_categories, host_params: {}, + neverTreatAsAfkFilter }); const data = await getClient().query(periods, q); const data_window = data[0].window; @@ -329,6 +331,7 @@ export const useActivityStore = defineStore('activity', { filter_afk, include_audible, include_stopwatch, + neverTreatAsAfkFilter, }: QueryOptions) { const periods = [timeperiodToStr(timeperiod)]; const categories = useCategoryStore().classes_for_query; @@ -345,6 +348,7 @@ export const useActivityStore = defineStore('activity', { categories, filter_categories, include_audible, + neverTreatAsAfkFilter, }); const data = await getClient().query(periods, q); const data_window = data[0].window; @@ -382,6 +386,7 @@ export const useActivityStore = defineStore('activity', { filter_afk, include_stopwatch, dontQueryInactive, + neverTreatAsAfkFilter, }: QueryOptions & { dontQueryInactive: boolean }) { // TODO: Needs to be adapted for Android let periods: string[]; @@ -454,6 +459,7 @@ export const useActivityStore = defineStore('activity', { categories, filter_categories, filter_afk, + neverTreatAsAfkFilter }) ); data = data.concat(result); diff --git a/src/stores/settings.ts b/src/stores/settings.ts index cb173747..140c4d0e 100644 --- a/src/stores/settings.ts +++ b/src/stores/settings.ts @@ -18,6 +18,7 @@ interface State { newReleaseCheckData: Record; userSatisfactionPollData: Record; + ActivityData: Record; // Whether to show certain WIP features devmode: boolean; @@ -49,6 +50,10 @@ export const useSettingsStore = defineStore('settings', { }, userSatisfactionPollData: {}, + ActivityData: { + neverTreatAsAfkFilter: '', + }, + // Developer settings // NOTE: PRODUCTION might be undefined (in tests, for example) devmode: typeof PRODUCTION === 'undefined' ? true : !PRODUCTION, diff --git a/src/views/activity/Activity.vue b/src/views/activity/Activity.vue index 2b9d361a..0641f7b4 100644 --- a/src/views/activity/Activity.vue +++ b/src/views/activity/Activity.vue @@ -203,6 +203,7 @@ export default { computed: { ...mapState(useViewsStore, ['views']), ...mapState(useSettingsStore, ['devmode']), + ...mapState(useSettingsStore, ['ActivityData']), // number of filters currently set (different from defaults) filters_set() { @@ -406,6 +407,7 @@ export default { include_audible: this.include_audible, include_stopwatch: this.include_stopwatch, filter_categories: this.filter_categories, + neverTreatAsAfkFilter: this.ActivityData.neverTreatAsAfkFilter, }; await this.activityStore.ensure_loaded(queryOptions); }, diff --git a/src/views/settings/NeverAfkFilterSettings.vue b/src/views/settings/NeverAfkFilterSettings.vue new file mode 100644 index 00000000..f28a20a7 --- /dev/null +++ b/src/views/settings/NeverAfkFilterSettings.vue @@ -0,0 +1,35 @@ + + + diff --git a/src/views/settings/Settings.vue b/src/views/settings/Settings.vue index 14e3c409..7558c04f 100644 --- a/src/views/settings/Settings.vue +++ b/src/views/settings/Settings.vue @@ -28,6 +28,10 @@ div ColorSettings + hr + + NeverAfkFilterSettings + hr CategorizationSettings @@ -48,6 +52,7 @@ import LandingPageSettings from '~/views/settings/LandingPageSettings.vue'; import DeveloperSettings from '~/views/settings/DeveloperSettings.vue'; import Theme from '~/views/settings/Theme.vue'; import ColorSettings from '~/views/settings/ColorSettings.vue'; +import NeverAfkFilterSettings from '~/views/settings/NeverAfkFilterSettings.vue'; export default { name: 'Settings', @@ -60,6 +65,7 @@ export default { Theme, ColorSettings, DeveloperSettings, + NeverAfkFilterSettings, }, async created() { await this.init(); From f8c91f8f7dd6893c95abba30365ead34fbab2218 Mon Sep 17 00:00:00 2001 From: Harsha Raghu Date: Wed, 12 Oct 2022 21:41:34 +0530 Subject: [PATCH 2/7] prettify code --- src/queries.ts | 9 +++++---- src/stores/activity.ts | 4 ++-- src/views/settings/NeverAfkFilterSettings.vue | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/queries.ts b/src/queries.ts index 5711f642..465f5472 100644 --- a/src/queries.ts +++ b/src/queries.ts @@ -104,7 +104,9 @@ function isMultiParams(object: any): object is MultiQueryParams { export function canonicalEvents(params: DesktopQueryParams | AndroidQueryParams): string { // Needs escaping for regex patterns like '\w' to work (JSON.stringify adds extra unecessary escaping) const categories_str = JSON.stringify(params.categories).replace(/\\\\/g, '\\'); - const neverTreatAsAfkFilter_str = isDesktopParams(params)? JSON.stringify(params.neverTreatAsAfkFilter).replace(/\\\\/g, '\\'): undefined; + const neverTreatAsAfkFilter_str = isDesktopParams(params) + ? JSON.stringify(params.neverTreatAsAfkFilter).replace(/\\\\/g, '\\') + : undefined; const cat_filter_str = JSON.stringify(params.filter_categories); // For simplicity, we assume that bid_window and bid_android are exchangeable (note however it needs special treatment) @@ -119,9 +121,8 @@ export function canonicalEvents(params: DesktopQueryParams | AndroidQueryParams) isDesktopParams(params) ? `not_afk = flood(query_bucket("${params.bid_afk}")); not_afk = filter_keyvals(not_afk, "status", ["not-afk"]);` + - (neverTreatAsAfkFilter_str - ? - `not_treat_as_afk = filter_keyvals_regex(events, "app", ${neverTreatAsAfkFilter_str}); + (neverTreatAsAfkFilter_str + ? `not_treat_as_afk = filter_keyvals_regex(events, "app", ${neverTreatAsAfkFilter_str}); not_afk = period_union(not_afk, not_treat_as_afk); not_treat_as_afk = filter_keyvals_regex(events, "title", ${neverTreatAsAfkFilter_str}); not_afk = period_union(not_afk, not_treat_as_afk);` diff --git a/src/stores/activity.ts b/src/stores/activity.ts index 3fa7c066..2ef6db9d 100644 --- a/src/stores/activity.ts +++ b/src/stores/activity.ts @@ -314,7 +314,7 @@ export const useActivityStore = defineStore('activity', { categories, filter_categories, host_params: {}, - neverTreatAsAfkFilter + neverTreatAsAfkFilter, }); const data = await getClient().query(periods, q); const data_window = data[0].window; @@ -459,7 +459,7 @@ export const useActivityStore = defineStore('activity', { categories, filter_categories, filter_afk, - neverTreatAsAfkFilter + neverTreatAsAfkFilter, }) ); data = data.concat(result); diff --git a/src/views/settings/NeverAfkFilterSettings.vue b/src/views/settings/NeverAfkFilterSettings.vue index f28a20a7..819a0579 100644 --- a/src/views/settings/NeverAfkFilterSettings.vue +++ b/src/views/settings/NeverAfkFilterSettings.vue @@ -27,7 +27,7 @@ export default { }, set(value) { console.log('Setting NeverAfkFilterSetting to ' + value); - this.settingsStore.update({ ActivityData : { neverTreatAsAfkFilter: value }}); + this.settingsStore.update({ ActivityData: { neverTreatAsAfkFilter: value } }); }, }, }, From 1432a16fb41799a1f381b04843ed1a61a693d419 Mon Sep 17 00:00:00 2001 From: Harsha Raghu Date: Wed, 12 Oct 2022 22:06:16 +0530 Subject: [PATCH 3/7] fix: queries unit test --- test/unit/__snapshots__/queries.test.node.js.snap | 4 ++++ test/unit/queries.test.node.js | 2 ++ 2 files changed, 6 insertions(+) diff --git a/test/unit/__snapshots__/queries.test.node.js.snap b/test/unit/__snapshots__/queries.test.node.js.snap index 2d55ae3b..56a50d29 100644 --- a/test/unit/__snapshots__/queries.test.node.js.snap +++ b/test/unit/__snapshots__/queries.test.node.js.snap @@ -4,6 +4,10 @@ exports[`generate fullDesktopQuery 1`] = ` "events = flood(query_bucket(\\"\\")); not_afk = flood(query_bucket(\\"\\")); not_afk = filter_keyvals(not_afk, \\"status\\", [\\"not-afk\\"]); +not_treat_as_afk = filter_keyvals_regex(events, \\"app\\", \\"\\"); +not_afk = period_union(not_afk, not_treat_as_afk); +not_treat_as_afk = filter_keyvals_regex(events, \\"title\\", \\"\\"); +not_afk = period_union(not_afk, not_treat_as_afk); browser_events = []; audible_events = filter_keyvals(browser_events, \\"audible\\", [true]); not_afk = period_union(not_afk, audible_events); diff --git a/test/unit/queries.test.node.js b/test/unit/queries.test.node.js index 3f03c073..93ef5d94 100644 --- a/test/unit/queries.test.node.js +++ b/test/unit/queries.test.node.js @@ -8,6 +8,7 @@ test('generate fullDesktopQuery', () => { const categories = []; const filter_categories = true; const include_audible = true; + const neverTreatAsAfkFilter = ''; const query_lines = queries.fullDesktopQuery({ bid_window, bid_afk, @@ -16,6 +17,7 @@ test('generate fullDesktopQuery', () => { categories, filter_categories, include_audible, + neverTreatAsAfkFilter, }); // join query lines into a single string From 63755e0808c9af630542a62750539c3b0bf63d56 Mon Sep 17 00:00:00 2001 From: Harsha Raghu Date: Wed, 12 Oct 2022 22:23:09 +0530 Subject: [PATCH 4/7] perf: remove unnecessary stringify and update unit test --- src/queries.ts | 6 +++--- test/unit/__snapshots__/queries.test.node.js.snap | 4 ++-- test/unit/queries.test.node.js | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/queries.ts b/src/queries.ts index 465f5472..efdde591 100644 --- a/src/queries.ts +++ b/src/queries.ts @@ -105,7 +105,7 @@ export function canonicalEvents(params: DesktopQueryParams | AndroidQueryParams) // Needs escaping for regex patterns like '\w' to work (JSON.stringify adds extra unecessary escaping) const categories_str = JSON.stringify(params.categories).replace(/\\\\/g, '\\'); const neverTreatAsAfkFilter_str = isDesktopParams(params) - ? JSON.stringify(params.neverTreatAsAfkFilter).replace(/\\\\/g, '\\') + ? params.neverTreatAsAfkFilter.replace(/\\\\/g, '\\') : undefined; const cat_filter_str = JSON.stringify(params.filter_categories); @@ -122,9 +122,9 @@ export function canonicalEvents(params: DesktopQueryParams | AndroidQueryParams) ? `not_afk = flood(query_bucket("${params.bid_afk}")); not_afk = filter_keyvals(not_afk, "status", ["not-afk"]);` + (neverTreatAsAfkFilter_str - ? `not_treat_as_afk = filter_keyvals_regex(events, "app", ${neverTreatAsAfkFilter_str}); + ? `not_treat_as_afk = filter_keyvals_regex(events, "app", "${neverTreatAsAfkFilter_str}"); not_afk = period_union(not_afk, not_treat_as_afk); - not_treat_as_afk = filter_keyvals_regex(events, "title", ${neverTreatAsAfkFilter_str}); + not_treat_as_afk = filter_keyvals_regex(events, "title", "${neverTreatAsAfkFilter_str}"); not_afk = period_union(not_afk, not_treat_as_afk);` : '') : '', diff --git a/test/unit/__snapshots__/queries.test.node.js.snap b/test/unit/__snapshots__/queries.test.node.js.snap index 56a50d29..a5d0451e 100644 --- a/test/unit/__snapshots__/queries.test.node.js.snap +++ b/test/unit/__snapshots__/queries.test.node.js.snap @@ -4,9 +4,9 @@ exports[`generate fullDesktopQuery 1`] = ` "events = flood(query_bucket(\\"\\")); not_afk = flood(query_bucket(\\"\\")); not_afk = filter_keyvals(not_afk, \\"status\\", [\\"not-afk\\"]); -not_treat_as_afk = filter_keyvals_regex(events, \\"app\\", \\"\\"); +not_treat_as_afk = filter_keyvals_regex(events, \\"app\\", \\"meow|nyaan\\"); not_afk = period_union(not_afk, not_treat_as_afk); -not_treat_as_afk = filter_keyvals_regex(events, \\"title\\", \\"\\"); +not_treat_as_afk = filter_keyvals_regex(events, \\"title\\", \\"meow|nyaan\\"); not_afk = period_union(not_afk, not_treat_as_afk); browser_events = []; audible_events = filter_keyvals(browser_events, \\"audible\\", [true]); diff --git a/test/unit/queries.test.node.js b/test/unit/queries.test.node.js index 93ef5d94..7b7e925f 100644 --- a/test/unit/queries.test.node.js +++ b/test/unit/queries.test.node.js @@ -8,7 +8,7 @@ test('generate fullDesktopQuery', () => { const categories = []; const filter_categories = true; const include_audible = true; - const neverTreatAsAfkFilter = ''; + const neverTreatAsAfkFilter = 'meow|nyaan'; const query_lines = queries.fullDesktopQuery({ bid_window, bid_afk, From a1b27b81c021d15bfa1437c0bdfa9d853a012f53 Mon Sep 17 00:00:00 2001 From: Harsha Raghu Date: Wed, 12 Oct 2022 22:42:07 +0530 Subject: [PATCH 5/7] refactor: simplify var name --- src/queries.ts | 14 +++++++------- src/stores/activity.ts | 14 +++++++------- src/stores/settings.ts | 2 +- src/views/activity/Activity.vue | 2 +- src/views/settings/NeverAfkFilterSettings.vue | 6 +++--- test/unit/queries.test.node.js | 4 ++-- 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/queries.ts b/src/queries.ts index efdde591..573a2158 100644 --- a/src/queries.ts +++ b/src/queries.ts @@ -39,7 +39,7 @@ interface DesktopQueryParams extends BaseQueryParams { bid_window: string; bid_afk: string; filter_afk: boolean; - neverTreatAsAfkFilter: string; + always_active_pattern: string; } interface AndroidQueryParams extends BaseQueryParams { @@ -49,7 +49,7 @@ interface AndroidQueryParams extends BaseQueryParams { interface MultiQueryParams extends BaseQueryParams { hosts: string[]; filter_afk: boolean; - neverTreatAsAfkFilter: string; + always_active_pattern: string; // This can be used to override params on a per-host basis host_params: { [host: string]: DesktopQueryParams | AndroidQueryParams }; } @@ -104,8 +104,8 @@ function isMultiParams(object: any): object is MultiQueryParams { export function canonicalEvents(params: DesktopQueryParams | AndroidQueryParams): string { // Needs escaping for regex patterns like '\w' to work (JSON.stringify adds extra unecessary escaping) const categories_str = JSON.stringify(params.categories).replace(/\\\\/g, '\\'); - const neverTreatAsAfkFilter_str = isDesktopParams(params) - ? params.neverTreatAsAfkFilter.replace(/\\\\/g, '\\') + const always_active_pattern_str = isDesktopParams(params) + ? params.always_active_pattern.replace(/\\\\/g, '\\') : undefined; const cat_filter_str = JSON.stringify(params.filter_categories); @@ -121,10 +121,10 @@ export function canonicalEvents(params: DesktopQueryParams | AndroidQueryParams) isDesktopParams(params) ? `not_afk = flood(query_bucket("${params.bid_afk}")); not_afk = filter_keyvals(not_afk, "status", ["not-afk"]);` + - (neverTreatAsAfkFilter_str - ? `not_treat_as_afk = filter_keyvals_regex(events, "app", "${neverTreatAsAfkFilter_str}"); + (always_active_pattern_str + ? `not_treat_as_afk = filter_keyvals_regex(events, "app", "${always_active_pattern_str}"); not_afk = period_union(not_afk, not_treat_as_afk); - not_treat_as_afk = filter_keyvals_regex(events, "title", "${neverTreatAsAfkFilter_str}"); + not_treat_as_afk = filter_keyvals_regex(events, "title", "${always_active_pattern_str}"); not_afk = period_union(not_afk, not_treat_as_afk);` : '') : '', diff --git a/src/stores/activity.ts b/src/stores/activity.ts index 2ef6db9d..72a2f98e 100644 --- a/src/stores/activity.ts +++ b/src/stores/activity.ts @@ -58,7 +58,7 @@ export interface QueryOptions { filter_categories?: string[][]; dont_query_inactive?: boolean; force?: boolean; - neverTreatAsAfkFilter?: string; + always_active_pattern?: string; } interface State { @@ -302,7 +302,7 @@ export const useActivityStore = defineStore('activity', { }, async query_multidevice_full( - { timeperiod, filter_categories, filter_afk, neverTreatAsAfkFilter }: QueryOptions, + { timeperiod, filter_categories, filter_afk, always_active_pattern }: QueryOptions, hosts: string[] ) { const periods = [timeperiodToStr(timeperiod)]; @@ -314,7 +314,7 @@ export const useActivityStore = defineStore('activity', { categories, filter_categories, host_params: {}, - neverTreatAsAfkFilter, + always_active_pattern, }); const data = await getClient().query(periods, q); const data_window = data[0].window; @@ -331,7 +331,7 @@ export const useActivityStore = defineStore('activity', { filter_afk, include_audible, include_stopwatch, - neverTreatAsAfkFilter, + always_active_pattern, }: QueryOptions) { const periods = [timeperiodToStr(timeperiod)]; const categories = useCategoryStore().classes_for_query; @@ -348,7 +348,7 @@ export const useActivityStore = defineStore('activity', { categories, filter_categories, include_audible, - neverTreatAsAfkFilter, + always_active_pattern, }); const data = await getClient().query(periods, q); const data_window = data[0].window; @@ -386,7 +386,7 @@ export const useActivityStore = defineStore('activity', { filter_afk, include_stopwatch, dontQueryInactive, - neverTreatAsAfkFilter, + always_active_pattern, }: QueryOptions & { dontQueryInactive: boolean }) { // TODO: Needs to be adapted for Android let periods: string[]; @@ -459,7 +459,7 @@ export const useActivityStore = defineStore('activity', { categories, filter_categories, filter_afk, - neverTreatAsAfkFilter, + always_active_pattern, }) ); data = data.concat(result); diff --git a/src/stores/settings.ts b/src/stores/settings.ts index 140c4d0e..1f28fcfc 100644 --- a/src/stores/settings.ts +++ b/src/stores/settings.ts @@ -51,7 +51,7 @@ export const useSettingsStore = defineStore('settings', { userSatisfactionPollData: {}, ActivityData: { - neverTreatAsAfkFilter: '', + always_active_pattern: '', }, // Developer settings diff --git a/src/views/activity/Activity.vue b/src/views/activity/Activity.vue index 0641f7b4..3e734809 100644 --- a/src/views/activity/Activity.vue +++ b/src/views/activity/Activity.vue @@ -407,7 +407,7 @@ export default { include_audible: this.include_audible, include_stopwatch: this.include_stopwatch, filter_categories: this.filter_categories, - neverTreatAsAfkFilter: this.ActivityData.neverTreatAsAfkFilter, + always_active_pattern: this.ActivityData.always_active_pattern, }; await this.activityStore.ensure_loaded(queryOptions); }, diff --git a/src/views/settings/NeverAfkFilterSettings.vue b/src/views/settings/NeverAfkFilterSettings.vue index 819a0579..ce6e2d36 100644 --- a/src/views/settings/NeverAfkFilterSettings.vue +++ b/src/views/settings/NeverAfkFilterSettings.vue @@ -5,7 +5,7 @@ div h5.mb-2.mb-sm-0 Never Treat as Afk Filter div b-form-input(size="sm" v-model="NeverAfkFilterSettings") - + small | Apps or Titles passing this Regex filter will never be counted as afk. @@ -23,11 +23,11 @@ export default { computed: { NeverAfkFilterSettings: { get() { - return this.settingsStore.ActivityData.neverTreatAsAfkFilter; + return this.settingsStore.ActivityData.always_active_pattern; }, set(value) { console.log('Setting NeverAfkFilterSetting to ' + value); - this.settingsStore.update({ ActivityData: { neverTreatAsAfkFilter: value } }); + this.settingsStore.update({ ActivityData: { always_active_pattern: value } }); }, }, }, diff --git a/test/unit/queries.test.node.js b/test/unit/queries.test.node.js index 7b7e925f..4fd3e397 100644 --- a/test/unit/queries.test.node.js +++ b/test/unit/queries.test.node.js @@ -8,7 +8,7 @@ test('generate fullDesktopQuery', () => { const categories = []; const filter_categories = true; const include_audible = true; - const neverTreatAsAfkFilter = 'meow|nyaan'; + const always_active_pattern = 'meow|nyaan'; const query_lines = queries.fullDesktopQuery({ bid_window, bid_afk, @@ -17,7 +17,7 @@ test('generate fullDesktopQuery', () => { categories, filter_categories, include_audible, - neverTreatAsAfkFilter, + always_active_pattern, }); // join query lines into a single string From 4a9de9675e736681cf29d6b100094aee7992abed Mon Sep 17 00:00:00 2001 From: Harsha Raghu Date: Wed, 12 Oct 2022 23:46:57 +0530 Subject: [PATCH 6/7] added suggested modifications - remove ActivityData wrapping - Added some consumer friendly explanation in Settings - Added validation to skip some events --- src/stores/settings.ts | 6 ++---- src/views/activity/Activity.vue | 4 ++-- src/views/settings/NeverAfkFilterSettings.vue | 12 +++++++----- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/stores/settings.ts b/src/stores/settings.ts index 1f28fcfc..6f90c861 100644 --- a/src/stores/settings.ts +++ b/src/stores/settings.ts @@ -18,7 +18,7 @@ interface State { newReleaseCheckData: Record; userSatisfactionPollData: Record; - ActivityData: Record; + always_active_pattern: string; // Whether to show certain WIP features devmode: boolean; @@ -50,9 +50,7 @@ export const useSettingsStore = defineStore('settings', { }, userSatisfactionPollData: {}, - ActivityData: { - always_active_pattern: '', - }, + always_active_pattern: '', // Developer settings // NOTE: PRODUCTION might be undefined (in tests, for example) diff --git a/src/views/activity/Activity.vue b/src/views/activity/Activity.vue index 3e734809..31726cb2 100644 --- a/src/views/activity/Activity.vue +++ b/src/views/activity/Activity.vue @@ -203,7 +203,7 @@ export default { computed: { ...mapState(useViewsStore, ['views']), ...mapState(useSettingsStore, ['devmode']), - ...mapState(useSettingsStore, ['ActivityData']), + ...mapState(useSettingsStore, ['always_active_pattern']), // number of filters currently set (different from defaults) filters_set() { @@ -407,7 +407,7 @@ export default { include_audible: this.include_audible, include_stopwatch: this.include_stopwatch, filter_categories: this.filter_categories, - always_active_pattern: this.ActivityData.always_active_pattern, + always_active_pattern: this.always_active_pattern, }; await this.activityStore.ensure_loaded(queryOptions); }, diff --git a/src/views/settings/NeverAfkFilterSettings.vue b/src/views/settings/NeverAfkFilterSettings.vue index ce6e2d36..a5cec4ce 100644 --- a/src/views/settings/NeverAfkFilterSettings.vue +++ b/src/views/settings/NeverAfkFilterSettings.vue @@ -2,12 +2,12 @@ div div.d-sm-flex.justify-content-between div - h5.mb-2.mb-sm-0 Never Treat as Afk Filter + h5.mb-2.mb-sm-0 Never Treat as AFK Filter div b-form-input(size="sm" v-model="NeverAfkFilterSettings") small - | Apps or Titles passing this Regex filter will never be counted as afk. + | Apps or Titles passing this regular expression filter will never be counted as AFK. Can be used to count time spent in meetings where there is little to no input, or games that use input methods not detected by the AFK watcher. Example expression, #[code(style="font-size:100%") Zoom Meeting|Google Meet] diff --git a/src/views/settings/NeverAfkFilterSettings.vue b/src/views/settings/NeverAfkFilterSettings.vue deleted file mode 100644 index a5cec4ce..00000000 --- a/src/views/settings/NeverAfkFilterSettings.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - diff --git a/src/views/settings/Settings.vue b/src/views/settings/Settings.vue index 7558c04f..b8868349 100644 --- a/src/views/settings/Settings.vue +++ b/src/views/settings/Settings.vue @@ -29,8 +29,8 @@ div ColorSettings hr - - NeverAfkFilterSettings + + ActivePatternSettings hr @@ -52,7 +52,7 @@ import LandingPageSettings from '~/views/settings/LandingPageSettings.vue'; import DeveloperSettings from '~/views/settings/DeveloperSettings.vue'; import Theme from '~/views/settings/Theme.vue'; import ColorSettings from '~/views/settings/ColorSettings.vue'; -import NeverAfkFilterSettings from '~/views/settings/NeverAfkFilterSettings.vue'; +import ActivePatternSettings from '~/views/settings/ActivePatternSettings.vue'; export default { name: 'Settings', @@ -65,7 +65,7 @@ export default { Theme, ColorSettings, DeveloperSettings, - NeverAfkFilterSettings, + ActivePatternSettings, }, async created() { await this.init();