diff --git a/package.json b/package.json index 3af2e105..f3f49b18 100755 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "frankerfacez", "author": "Dan Salvato LLC", - "version": "4.20.74", + "version": "4.20.75", "description": "FrankerFaceZ is a Twitch enhancement suite.", "license": "Apache-2.0", "scripts": { diff --git a/src/modules/chat/index.js b/src/modules/chat/index.js index 3b13bd59..fad5f6c0 100644 --- a/src/modules/chat/index.js +++ b/src/modules/chat/index.js @@ -24,6 +24,26 @@ import Actions from './actions'; export const SEPARATORS = '[\\s`~<>!-#%-\\x2A,-/:;\\x3F@\\x5B-\\x5D_\\x7B}\\u00A1\\u00A7\\u00AB\\u00B6\\u00B7\\u00BB\\u00BF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E3B\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]'; +function addSeparators(str) { + return `(^|.*?${SEPARATORS})(?:${str})(?=$|${SEPARATORS})` +} + +const TERM_FLAGS = ['g', 'gi']; + +function formatTerms(data) { + const out = []; + + for(let i=0; i < data.length; i++) { + const list = data[i]; + if ( list[0].length ) + list[1].push(addSeparators(list[0].join('|'))); + + out.push(list[1].length ? new RegExp(list[1].join('|'), TERM_FLAGS[i] || 'gi') : null); + } + + return out; +} + const ERROR_IMAGE = 'https://static-cdn.jtvnw.net/emoticons/v1/58765/2.0'; const EMOTE_CHARS = /[ .,!]/; @@ -227,7 +247,7 @@ export default class Chat extends Module { this.settings.add('chat.filtering.click-to-reveal', { default: false, ui: { - path: 'Chat > Filtering >> Behavior', + path: 'Chat > Filtering > General @{"sort":-1} >> Behavior', title: 'Click to reveal deleted terms.', component: 'setting-check-box' } @@ -283,7 +303,7 @@ export default class Chat extends Module { this.settings.add('chat.automod.delete-messages', { default: true, ui: { - path: 'Chat > Filtering >> AutoMod Filters @{"description": "Extra configuration for Twitch\'s native `Chat Filters`."}', + path: 'Chat > Filtering > General >> AutoMod Filters @{"description": "Extra configuration for Twitch\'s native `Chat Filters`."}', title: 'Mark messages as deleted if they contain filtered phrases.', component: 'setting-check-box' } @@ -292,7 +312,7 @@ export default class Chat extends Module { this.settings.add('chat.automod.remove-messages', { default: true, ui: { - path: 'Chat > Filtering >> AutoMod Filters', + path: 'Chat > Filtering > General >> AutoMod Filters', title: 'Remove messages entirely if they contain filtered phrases.', component: 'setting-check-box' } @@ -301,7 +321,7 @@ export default class Chat extends Module { this.settings.add('chat.automod.run-as-mod', { default: false, ui: { - path: 'Chat > Filtering >> AutoMod Filters', + path: 'Chat > Filtering > General >> AutoMod Filters', title: 'Use Chat Filters as a moderator.', description: 'By default, Twitch\'s Chat Filters feature does not function for moderators. This overrides that behavior.', component: 'setting-check-box' @@ -311,7 +331,7 @@ export default class Chat extends Module { this.settings.add('chat.filtering.process-own', { default: false, ui: { - path: 'Chat > Filtering >> Behavior', + path: 'Chat > Filtering > General >> Behavior', title: 'Filter your own messages.', component: 'setting-check-box' } @@ -372,7 +392,7 @@ export default class Chat extends Module { type: 'array_merge', always_inherit: true, ui: { - path: 'Chat > Filtering >> Highlight Users', + path: 'Chat > Filtering > Highlight >> Users', component: 'basic-terms', colored: true, words: false @@ -431,7 +451,7 @@ export default class Chat extends Module { type: 'array_merge', always_inherit: true, ui: { - path: 'Chat > Filtering >> Blocked Users', + path: 'Chat > Filtering > Block >> Users', component: 'basic-terms', removable: true, words: false @@ -480,7 +500,7 @@ export default class Chat extends Module { type: 'array_merge', always_inherit: true, ui: { - path: 'Chat > Filtering >> Highlight Badges', + path: 'Chat > Filtering > Highlight >> Badges', component: 'badge-highlighting', colored: true, data: () => this.badges.getSettingsBadges() @@ -516,7 +536,7 @@ export default class Chat extends Module { type: 'array_merge', always_inherit: true, ui: { - path: 'Chat > Filtering >> Blocked Badges @{"description": "**Note:** This section is for filtering messages out of chat from users with specific badges. If you wish to hide a badge, go to [Chat > Badges >> Visibility](~chat.badges.tabs.visibility)."}', + path: 'Chat > Filtering > Block >> Badges @{"description": "**Note:** This section is for filtering messages out of chat from users with specific badges. If you wish to hide a badge, go to [Chat > Badges >> Visibility](~chat.badges.tabs.visibility)."}', component: 'badge-highlighting', removable: true, data: () => this.badges.getSettingsBadges() @@ -549,35 +569,39 @@ export default class Chat extends Module { type: 'array_merge', always_inherit: true, ui: { - path: 'Chat > Filtering >> Highlight Terms', + path: 'Chat > Filtering > Highlight >> Terms @{"description": "Please see [Chat > Filtering > Syntax Help](~) for details on how to use terms."}', component: 'basic-terms', - colored: true + colored: true, + highlight: true } }); this.settings.add('chat.filtering.highlight-basic-terms--color-regex', { - requires: ['chat.filtering.highlight-basic-terms'], + requires: ['chat.filtering.highlight-tokens', 'chat.filtering.highlight-basic-terms'], equals: 'requirements', process(ctx) { + const can_highlight = ctx.get('chat.filtering.highlight-tokens'); const val = ctx.get('chat.filtering.highlight-basic-terms'); if ( ! val || ! val.length ) return null; const colors = new Map; + let has_highlight = false, + has_non = false; for(const item of val) { const c = item.c || null, - t = item.t; + highlight = can_highlight && (has(item, 'h') ? item.h : true), + sensitive = item.s, + t = item.t, + word = has(item, 'w') ? item.w : t !== 'raw'; - let v = item.v, word = true; + let v = item.v; if ( t === 'glob' ) v = glob_to_regex(v); - else if ( t === 'raw' ) - word = false; - - else if ( t !== 'regex' ) + else if ( t !== 'regex' && t !== 'raw' ) v = escape_regex(v); if ( ! v || ! v.length ) @@ -589,23 +613,55 @@ export default class Chat extends Module { continue; } - if ( colors.has(c) ) - colors.get(c)[word ? 0 : 1].push(v); - else { - const vals = [[],[]]; - colors.set(c, vals); - vals[word ? 0 : 1].push(v); - } + if ( highlight ) + has_highlight = true; + else + has_non = true; + + let data = colors.get(c); + if ( ! data ) + colors.set(c, data = [ + [ // highlight + [ // sensitive + [], [] // word + ], + [ + [], [] + ] + ], + [ + [ + [], [] + ], + [ + [], [] + ] + ] + ]); + + data[highlight ? 0 : 1][sensitive ? 0 : 1][word ? 0 : 1].push(v); } + if ( ! has_highlight && ! has_non ) + return null; + + const out = { + hl: has_highlight ? new Map : null, + non: has_non ? new Map : null + }; + for(const [key, list] of colors) { - if ( list[0].length ) - list[1].push(`(^|.*?${SEPARATORS})(?:${list[0].join('|')})(?=$|${SEPARATORS})`); + const highlights = formatTerms(list[0]), + non_highlights = formatTerms(list[1]); - colors.set(key, new RegExp(list[1].join('|'), 'gi')); + if ( highlights[0] || highlights[1] ) + out.hl.set(key, highlights); + + if ( non_highlights[0] || non_highlights[1] ) + out.non.set(key, non_highlights); } - return colors; + return out; } }); @@ -615,7 +671,7 @@ export default class Chat extends Module { type: 'array_merge', always_inherit: true, ui: { - path: 'Chat > Filtering >> Blocked Terms', + path: 'Chat > Filtering > Block >> Terms @{"description": "Please see [Chat > Filtering > Syntax Help](~) for details on how to use terms."}', component: 'basic-terms', removable: true } @@ -636,16 +692,14 @@ export default class Chat extends Module { ]; for(const item of val) { - const t = item.t; - let v = item.v, word = true; + const t = item.t, + word = has(item, 'w') ? item.w : t !== 'raw'; + let v = item.v; if ( t === 'glob' ) v = glob_to_regex(v); - else if ( t === 'raw' ) - word = false; - - else if ( t !== 'regex' ) + else if ( t !== 'regex' && t !== 'raw' ) v = escape_regex(v); if ( ! v || ! v.length ) @@ -677,7 +731,7 @@ export default class Chat extends Module { default: false, ui: { component: 'setting-check-box', - path: 'Chat > Filtering >> Appearance', + path: 'Chat > Filtering > General >> Appearance', title: 'Display mentions in chat with username colors.', description: '**Note:** Not compatible with color overrides as mentions do not include user IDs.' } @@ -687,7 +741,7 @@ export default class Chat extends Module { default: true, ui: { component: 'setting-check-box', - path: 'Chat > Filtering >> Appearance', + path: 'Chat > Filtering > General >> Appearance', title: 'Display mentions in chat with a bold font.' } }); @@ -695,7 +749,7 @@ export default class Chat extends Module { this.settings.add('chat.filtering.mention-color', { default: '', ui: { - path: 'Chat > Filtering >> Appearance', + path: 'Chat > Filtering > General >> Appearance', title: 'Custom Highlight Color', component: 'setting-color-box', description: 'If this is set, highlighted messages with no default color set will use this color rather than red.' @@ -705,7 +759,7 @@ export default class Chat extends Module { this.settings.add('chat.filtering.highlight-mentions', { default: false, ui: { - path: 'Chat > Filtering >> Appearance', + path: 'Chat > Filtering > General >> Appearance', title: 'Highlight messages that mention you.', component: 'setting-check-box' } @@ -714,7 +768,7 @@ export default class Chat extends Module { this.settings.add('chat.filtering.highlight-tokens', { default: false, ui: { - path: 'Chat > Filtering >> Appearance', + path: 'Chat > Filtering > General >> Appearance', title: 'Highlight matched words in chat.', component: 'setting-check-box' } diff --git a/src/modules/chat/tokenizers.jsx b/src/modules/chat/tokenizers.jsx index 91e0c46a..0f88a165 100644 --- a/src/modules/chat/tokenizers.jsx +++ b/src/modules/chat/tokenizers.jsx @@ -564,11 +564,35 @@ export const CustomHighlights = { if ( user && user.login && user.login == msg.user.login && ! this.context.get('chat.filtering.process-own') ) return tokens; - const colors = this.context.get('chat.filtering.highlight-basic-terms--color-regex'); - if ( ! colors || ! colors.size ) + const data = this.context.get('chat.filtering.highlight-basic-terms--color-regex'); + if ( ! data ) return tokens; - for(const [color, regex] of colors) { + if ( data.non ) { + for(const [color, regexes] of data.non) { + let matched = false; + if ( regexes[0] ) { + regexes[0].lastIndex = 0; + matched = regexes[0].test(msg.message); + } + if ( ! matched && regexes[1] ) { + regexes[1].lastIndex = 0; + matched = regexes[1].test(msg.message); + } + + if ( matched ) { + (msg.highlights = (msg.highlights || new Set())).add('term'); + msg.mentioned = true; + msg.mention_color = color || msg.mention_color; + break; + } + } + } + + if ( ! data.hl ) + return tokens; + + for(const [color, regexes] of data.hl) { const out = []; for(const token of tokens) { if ( token.type !== 'text' ) { @@ -576,11 +600,23 @@ export const CustomHighlights = { continue; } - regex.lastIndex = 0; const text = token.text; let idx = 0, match; - while((match = regex.exec(text))) { + while(idx < text.length) { + if ( regexes[0] ) + regexes[0].lastIndex = idx; + if ( regexes[1] ) + regexes[1].lastIndex = idx; + + match = regexes[0] ? regexes[0].exec(text) : null; + const second = regexes[1] ? regexes[1].exec(text) : null; + if ( second && (! match || match.index > second.index) ) + match = second; + + if ( ! match ) + break; + const raw_nix = match.index, offset = match[1] ? match[1].length : 0, nix = raw_nix + offset; @@ -590,7 +626,8 @@ export const CustomHighlights = { (msg.highlights = (msg.highlights || new Set())).add('term'); msg.mentioned = true; - msg.mention_color = color || msg.mention_color; + if ( ! msg.mention_color ) + msg.mention_color = color; out.push({ type: 'highlight', diff --git a/src/modules/main_menu/components/basic-terms.vue b/src/modules/main_menu/components/basic-terms.vue index 6e065103..74704a7c 100644 --- a/src/modules/main_menu/components/basic-terms.vue +++ b/src/modules/main_menu/components/basic-terms.vue @@ -3,6 +3,7 @@ import SettingMixin from '../setting-mixin'; -import {deep_copy} from 'utilities/object'; +import {deep_copy, has} from 'utilities/object'; let last_id = 0; @@ -43,6 +45,9 @@ export default { v: '', t: 'text', c: '', + s: false, + h: false, + w: true, remove: false } } @@ -61,9 +66,21 @@ export default { const out = []; if ( Array.isArray(this.val) ) - for(const term of this.val) + for(const term of this.val) { + if ( term && term.v ) { + if ( ! has(term.v, 'w') ) + term.v.w = term.v.t !== 'raw'; + + if ( ! has(term.v, 'h') ) + term.v.h = true; + + if ( term.v.t === 'raw' ) + term.v.t = 'regex'; + } + if ( term && term.t !== 'inherit' ) out.push(term); + } return out; }, diff --git a/src/modules/main_menu/components/main-menu.vue b/src/modules/main_menu/components/main-menu.vue index e9a6c31a..3a26e258 100644 --- a/src/modules/main_menu/components/main-menu.vue +++ b/src/modules/main_menu/components/main-menu.vue @@ -294,6 +294,12 @@ export default { this.$nextTick(bits); } + + this.$nextTick(() => { + const el = this.$el.querySelector(`.ffz--menu-tree li[data-key="${item.full_key}"]`); + if ( el ) + el.scrollIntoView(); + }); } } } diff --git a/src/modules/main_menu/components/menu-tree.vue b/src/modules/main_menu/components/menu-tree.vue index beef625a..9b4b0aa1 100644 --- a/src/modules/main_menu/components/menu-tree.vue +++ b/src/modules/main_menu/components/menu-tree.vue @@ -14,6 +14,7 @@ v-for="item in displayed" :key="item.full_key" :class="[currentItem === item ? 'active' : '']" + :data-key="item.full_key" role="presentation" >
-
+
@@ -48,37 +48,131 @@ -
-
-
+
+ + +
+ + {{ t('settings.terms.word', 'Abc') }} + +
+
+ {{ t('settings.terms.word.tip', 'Match Whole Words') }} +
+
+
+ + +
+ + {{ t('settings.terms.highlight', 'Hlt') }} + +
+
+ - +
+
+
+ + +
- - {{ t('setting.terms.remove.on', 'Remove matching messages from chat.') }} - - - {{ t('setting.terms.remove.off', 'Do not remove matching messages from chat.') }} - + {{ t('setting.terms.remove.on', 'Remove matching messages from chat.') }}
@@ -145,6 +239,10 @@ let id = 0; export default { props: { term: Object, + highlight: { + type: Boolean, + default: false + }, words: { type: Boolean, default: true @@ -166,14 +264,14 @@ export default { data() { if ( this.adding ) return { - editor_id: id++, + id: id++, deleting: false, editing: true, edit_data: deep_copy(this.term) }; return { - editor_id: id++, + id: id++, deleting: false, editing: false, edit_data: null diff --git a/src/modules/main_menu/index.js b/src/modules/main_menu/index.js index 4335f965..883f2437 100644 --- a/src/modules/main_menu/index.js +++ b/src/modules/main_menu/index.js @@ -85,6 +85,13 @@ export default class MainMenu extends Module { key: 'faq' }); + this.settings.addUI('chat.filtering.syntax-help', { + path: 'Chat > Filtering > Syntax Help @{"profile_warning": false}', + component: 'md-page', + key: 'term-syntax', + force_seen: true + }); + /*this.settings.addUI('privacy', { path: 'Home > Privacy @{"profile_warning": false}', component: 'md-page', diff --git a/src/modules/main_menu/term-syntax.md b/src/modules/main_menu/term-syntax.md new file mode 100644 index 00000000..a34ddf36 --- /dev/null +++ b/src/modules/main_menu/term-syntax.md @@ -0,0 +1,78 @@ +This is a guide to the different term syntax options available. Internally, +FrankerFaceZ converts your highlight and block terms into regular +expressions. + + +### Types + +#### 1. Text + +Text has no special behavior. Any characters with special meaning in regular +expressions are escaped. + + +#### 2. Glob + +[Globs](https://en.wikipedia.org/wiki/Glob_(programming)) provide simple, easy +to write pattern matching with wildcard characters. For example, the glob +`cir*` would match all words starting with the letters `cir`, including just +`cir` by itself. The `*` is a wildcard matching any number of characters. + +| Wildcard | Description | Example | Matches | Does Not Match | +| :------: | :---------- | :-----: | :-----: | :------------: | +| `*` | Matches any number of non-space characters, including none. | `cir*` | `cir`, `circle`, `cirFairy`, `circumstance` | `ci`, `sir`, `pizza` | +| `**` | Matches any number of any characters, including none. Unlike a single `*`, this will match space characters. | `hello**!` | `hello!`, `hello, streamer!` | +| `?` | Matches any single character. | `?at` | `cat`, `hat`, `pat` | `at` +| `[abc]` | Matches one character from within the brackets. | `[cp]at` | `cat`, `pat` | `hat`, `at` +| `[a-z]` | Matches one character from the range within the brackets. | `Kappa[0-9]` | `Kappa1`, `Kappa2`, ... `Kappa0` | `Kappa`, `KappaHD` +| `[!abc]` | Matches one character that is *not* within the brackets. | `[!cp]at` | `bat`, `rat`, `hat` | `at`, `cat`, `pat` +| `[!a-z]` | Matches one character that is *not* within the range within the brackets. | `Kappa[!0-9]` | `Kappa?`, `KappaF` | `Kappa`, `Kappa0`, `Kappa4` +| `'{'abc,d?f'}'` | Matches one of the possibilities from a comma-separated list. | `cir'{'no,Fairy'}'` | `cirno`, `cirFairy` | `cir`, `circle` + + +#### 3. Regex + +[Regular Expressions](https://en.wikipedia.org/wiki/Regular_expression) are complex +pattern strings used in programming. They are meant for advanced users. + +FrankerFaceZ uses your browser's built-in engine for handling regular expressions, +with all the limitations that come with it. Regex terms are packaged into the +generated regular expressions the same as both other modes. You should not and can +not use capture groups. + +FrankerFaceZ uses rudimentary logic to ensure your regular expression is not +catastrophically slow, but you should still be careful to avoid slow expressions +as they are run frequently. + + +### Modes + +#### Case Sensitive + +This attempts to match your term in a case-sensitive manner. Effectively, this +option disables the `/i` flag on the generated regular expression. Due to +limitations in your browser's regex engine, case insensitivity may not work on +some characters. + + +#### Match Whole Word + +This requires that your term is an entire word. For example, the term `test` +without "Match Whole Word" could just as easily match `testing` or `tested` +as it matches `test`. With "Match Whole Word" enabled, it will **only** match +`test`. + +This is done by wrapping the generated regular expression in extra pattern +matchers for non-word characters, such as spaces and punctuation. + + +#### Highlight Matches + +When this is enabled, and the matching setting in [Chat > Filtering > General](~) +is enabled, any matched terms will be highlighted in chat so you can see what +exactly matched your term. + +Any matches will not be displayed as emotes, links, etc. + +This is a bit slower than not highlighting the match, so you may wish to only use +this when testing and then disable it when you know your term works how you wish. diff --git a/src/modules/metadata.jsx b/src/modules/metadata.jsx index 59e0de30..45ff9858 100644 --- a/src/modules/metadata.jsx +++ b/src/modules/metadata.jsx @@ -71,7 +71,7 @@ export default class Metadata extends Module { }); this.settings.add('metadata.uptime', { - default: 1, + default: 2, ui: { path: 'Channel > Metadata >> Player', diff --git a/src/player.js b/src/player.js index e2471559..1cf3afeb 100644 --- a/src/player.js +++ b/src/player.js @@ -10,18 +10,20 @@ import {DEBUG} from 'utilities/constants'; import {timeout} from 'utilities/object'; import SettingsManager from './settings/index'; +import AddonManager from './addons'; import ExperimentManager from './experiments'; import {TranslationManager} from './i18n'; import Site from './sites/player'; -class FFZPlayer extends Module { +class FrankerFaceZ extends Module { constructor() { super(); const start_time = performance.now(), - VER = FFZPlayer.version_info; + VER = FrankerFaceZ.version_info; - FFZPlayer.instance = this; + FrankerFaceZ.instance = this; + this.flavor = 'player'; this.name = 'ffz_player'; this.__state = 0; this.__modules.core = this; @@ -49,6 +51,7 @@ class FFZPlayer extends Module { this.inject('experiments', ExperimentManager); this.inject('i18n', TranslationManager); this.inject('site', Site); + this.inject('addons', AddonManager); // ======================================================================== // Startup @@ -65,7 +68,7 @@ class FFZPlayer extends Module { } static get() { - return FFZPlayer.instance; + return FrankerFaceZ.instance; } // ======================================================================== @@ -111,9 +114,9 @@ ${typeof x[1] === 'string' ? x[1] : JSON.stringify(x[1], null, 4)}`).join('\n\n' } -FFZPlayer.Logger = Logger; +FrankerFaceZ.Logger = Logger; -const VER = FFZPlayer.version_info = { +const VER = FrankerFaceZ.version_info = { major: __version_major__, minor: __version_minor__, revision: __version_patch__, @@ -124,15 +127,16 @@ const VER = FFZPlayer.version_info = { `${VER.major}.${VER.minor}.${VER.revision}${VER.extra || ''}${DEBUG ? '-dev' : ''}` } -// We don't support addons in the player right now, so -/*FFZPlayer.utilities = { +// We don't support addons in the player right now, so a few +// of these are unavailable. +FrankerFaceZ.utilities = { addon: require('utilities/addon'), - color: require('utilities/color'), + //color: require('utilities/color'), constants: require('utilities/constants'), dom: require('utilities/dom'), events: require('utilities/events'), - fontAwesome: require('utilities/font-awesome'), - graphql: require('utilities/graphql'), + //fontAwesome: require('utilities/font-awesome'), + //graphql: require('utilities/graphql'), logging: require('utilities/logging'), module: require('utilities/module'), object: require('utilities/object'), @@ -141,8 +145,8 @@ const VER = FFZPlayer.version_info = { i18n: require('utilities/translation-core'), dayjs: require('dayjs'), popper: require('popper.js').default -}*/ +} -window.FFZPlayer = FFZPlayer; -window.ffz = new FFZPlayer(); \ No newline at end of file +window.FrankerFaceZ = FrankerFaceZ; +window.ffz = new FrankerFaceZ(); \ No newline at end of file diff --git a/src/settings/components/title.vue b/src/settings/components/title.vue index c924b35d..678a892d 100644 --- a/src/settings/components/title.vue +++ b/src/settings/components/title.vue @@ -50,7 +50,7 @@ type="checkbox" class="ffz-min-width-unset ffz-checkbox__input" > -