diff --git a/package.json b/package.json index 7a1a3b5e..0869b7bd 100755 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "frankerfacez", "author": "Dan Salvato LLC", - "version": "4.20.11", + "version": "4.20.12", "description": "FrankerFaceZ is a Twitch enhancement suite.", "license": "Apache-2.0", "scripts": { diff --git a/src/settings/filters.js b/src/settings/filters.js index fe3ed2db..1e59442c 100644 --- a/src/settings/filters.js +++ b/src/settings/filters.js @@ -4,17 +4,25 @@ // Profile Filters for Settings // ============================================================================ -import safety from 'safe-regex'; - import {glob_to_regex, escape_regex} from 'utilities/object'; import {createTester} from 'utilities/filtering'; +let safety = null; + +function loadSafety(cb) { + import(/* webpackChunkName: 'regex' */ 'safe-regex').then(thing => { + safety = thing.default; + if ( cb ) + cb(); + }) +} + // Logical Components export const Invert = { - createTest(config, rule_types) { - return createTester(config, rule_types, true) + createTest(config, rule_types, rebuild) { + return createTester(config, rule_types, true, false, rebuild) }, maxRules: 1, @@ -29,8 +37,8 @@ export const Invert = { }; export const Or = { - createTest(config, rule_types) { - return createTester(config, rule_types, false, true); + createTest(config, rule_types, rebuild) { + return createTester(config, rule_types, false, true, rebuild); }, childRules: true, @@ -44,10 +52,10 @@ export const Or = { }; export const If = { - createTest(config, rule_types) { - const cond = createTester(config[0], rule_types), - if_true = createTester(config[1], rule_types), - if_false = createTester(config[2], rule_types); + createTest(config, rule_types, rebuild) { + const cond = createTester(config[0], rule_types, false, false, rebuild), + if_true = createTester(config[1], rule_types, false, false, rebuild), + if_false = createTester(config[2], rule_types, false, false, rebuild); return ctx => cond(ctx) ? if_true(ctx) : if_false(ctx) }, @@ -289,20 +297,30 @@ export const Category = { } export const Title = { - createTest(config = {}) { + createTest(config = {}, _, reload) { const mode = config.mode; - let title = config.title; + let title = config.title, + need_safety = true; if ( ! title || ! mode ) return () => false; - if ( mode === 'text' ) + if ( mode === 'text' ) { title = escape_regex(title); - else if ( mode === 'glob' ) + need_safety = false; + } else if ( mode === 'glob' ) title = glob_to_regex(title); else if ( mode !== 'raw' ) return () => false; + if ( need_safety ) { + if ( ! safety ) + loadSafety(reload); + + if ( ! safety || ! safety(title) ) + return () => false; + } + if ( ! safety(title) ) return () => false; diff --git a/src/settings/index.js b/src/settings/index.js index 32da7753..0f22b4b4 100644 --- a/src/settings/index.js +++ b/src/settings/index.js @@ -5,7 +5,7 @@ // ============================================================================ import Module from 'utilities/module'; -import {deep_equals, has} from 'utilities/object'; +import {deep_equals, has, debounce} from 'utilities/object'; import {CloudStorageProvider, LocalStorageProvider} from './providers'; import SettingsProfile from './profile'; @@ -32,6 +32,8 @@ export default class SettingsManager extends Module { constructor(...args) { super(...args); + this.updateSoon = debounce(() => this.updateRoutes(), 50, false); + // State this.__contexts = []; this.__profiles = []; diff --git a/src/settings/profile.js b/src/settings/profile.js index 6706ea1f..226703b0 100644 --- a/src/settings/profile.js +++ b/src/settings/profile.js @@ -58,7 +58,7 @@ export default class SettingsProfile extends EventEmitter { matches(context) { if ( ! this.matcher ) - this.matcher = createTester(this.context, this.manager.filters); + this.matcher = createTester(this.context, this.manager.filters, false, false, () => this.manager.updateSoon()); return this.matcher(context); } diff --git a/src/sites/twitch-twilight/modules/channel.js b/src/sites/twitch-twilight/modules/channel.js index 87c2d341..71d63ed1 100644 --- a/src/sites/twitch-twilight/modules/channel.js +++ b/src/sites/twitch-twilight/modules/channel.js @@ -7,7 +7,6 @@ import Module from 'utilities/module'; import { Color } from 'utilities/color'; import {debounce} from 'utilities/object'; -import { valueToNode } from 'C:/Users/Stendec/AppData/Local/Microsoft/TypeScript/3.8/node_modules/@babel/types/lib/index'; const USER_PAGES = ['user', 'video', 'user-video', 'user-clip', 'user-videos', 'user-clips', 'user-collections', 'user-events', 'user-followers', 'user-following']; @@ -182,13 +181,23 @@ export default class Channel extends Module { } const react = this.fine.getReactInstance(el), - props = react?.memoizedProps?.children?.props; + props = react?.child?.memoizedProps; if ( ! el._ffz_cont || ! props?.channelID ) { this.updateSubscription(null); return; } + const other_props = react.child.child?.child?.child?.child?.child?.child?.child?.child?.memoizedProps, + title = other_props?.title; + + if ( title !== el._ffz_title_cache ) { + el._ffz_title_cache = title; + this.settings.updateContext({ + title + }); + } + if ( ! this.settings.get('channel.hosting.enable') && props.hostLogin ) this.setHost(props.channelID, props.channelLogin, null, null); diff --git a/src/utilities/filtering.js b/src/utilities/filtering.js index c561b59f..6c289e40 100644 --- a/src/utilities/filtering.js +++ b/src/utilities/filtering.js @@ -4,7 +4,7 @@ // Advanced Filter System // ============================================================================ -export function createTester(rules, filter_types, inverted = false, or = false) { +export function createTester(rules, filter_types, inverted = false, or = false, rebuild) { if ( ! Array.isArray(rules) || ! filter_types ) return inverted ? () => false : () => true; @@ -21,7 +21,7 @@ export function createTester(rules, filter_types, inverted = false, or = false) continue; i++; - tests.push(type.createTest(rule.data, filter_types)); + tests.push(type.createTest(rule.data, filter_types, rebuild)); names.push(`f${i}`); }