diff --git a/package.json b/package.json index a18cd5ed..d8b58b27 100755 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "frankerfacez", "author": "Dan Salvato LLC", - "version": "4.35.2", + "version": "4.36.0", "description": "FrankerFaceZ is a Twitch enhancement suite.", "private": true, "license": "Apache-2.0", diff --git a/src/modules/chat/badges.jsx b/src/modules/chat/badges.jsx index c4ab7f19..c485af81 100644 --- a/src/modules/chat/badges.jsx +++ b/src/modules/chat/badges.jsx @@ -44,7 +44,10 @@ const CSS_BADGES = { turbo: { 1: { color: '#59399A' } }, premium: { 1: { color: '#00A0D6' } }, 'anonymous-cheerer': { 1: { color: '#4B367C' } }, - 'clip-champ': { 1: { color: '#9146FF' } } + 'clip-champ': { 1: { color: '#9146FF' } }, + 'artist-badge': { 1: { color: '#1e69ff' } }, + 'no_audio': { 1: { color: '#323239' } }, + 'no_video': { 1: { color: '#323239' } } } } diff --git a/src/modules/chat/index.js b/src/modules/chat/index.js index 702ee3fc..75ab4b1a 100644 --- a/src/modules/chat/index.js +++ b/src/modules/chat/index.js @@ -37,6 +37,10 @@ function sortPriorityColorTerms(list) { const TERM_FLAGS = ['g', 'gi']; +const UNBLOCKABLE_TOKENS = [ + 'filter_test' +]; + function formatTerms(data) { const out = []; @@ -441,6 +445,29 @@ export default class Chat extends Module { } }); + this.settings.add('chat.filtering.hidden-tokens', { + default: [], + type: 'array_merge', + always_inherit: true, + process(ctx, val) { + const out = new Set; + for(const v of val) + if ( v?.v || ! UNBLOCKABLE_TOKENS.includes(v.v) ) + out.add(v.v); + + return out; + }, + + ui: { + path: 'Chat > Appearance >> Hidden Token Types @{"description":"This filter allows you to prevent specific content token types from appearing chat messages, such as hiding all cheers or emotes."}', + component: 'blocked-types', + data: () => Object + .keys(this.tokenizers) + .filter(key => ! UNBLOCKABLE_TOKENS.includes(key) && this.tokenizers[key]?.render) + .sort() + } + }); + this.settings.add('chat.filtering.highlight-basic-users', { default: [], type: 'array_merge', @@ -1978,12 +2005,14 @@ export default class Chat extends Module { tokenizers = this.tokenizers, l = tokens.length; + const hidden = this.context.get('chat.filtering.hidden-tokens'); + for(let i=0; i < l; i++) { const token = tokens[i], type = token.type, tk = tokenizers[type]; - if ( token.hidden ) + if ( token.hidden || hidden.has(type) ) continue; let res; diff --git a/src/modules/main_menu/components/filter-editor.vue b/src/modules/main_menu/components/filter-editor.vue index 34ee05e7..f16ecb20 100644 --- a/src/modules/main_menu/components/filter-editor.vue +++ b/src/modules/main_menu/components/filter-editor.vue @@ -10,6 +10,7 @@ :key="rule.id" :value="rule" :filters="filters" + :preview="preview" :context="context" :data-id="rule.id" @input="updateRule(rule.id, $event)" @@ -61,10 +62,15 @@ export default { value: Array, filters: Object, maxRules: { - tpye: Number, + type: Number, required: false, default: 0 }, + preview: { + type: Boolean, + required: false, + default: true + }, context: { type: Object, required: false diff --git a/src/modules/main_menu/components/filter-rule-editor.vue b/src/modules/main_menu/components/filter-rule-editor.vue index 5cbb4bb9..2e60acb1 100644 --- a/src/modules/main_menu/components/filter-rule-editor.vue +++ b/src/modules/main_menu/components/filter-rule-editor.vue @@ -10,10 +10,11 @@ :type="type" :filters="filters" :context="context" + :preview="preview" />
@@ -31,7 +32,7 @@ :class="[isShort ? '' : 'tw-mg-l-1']" class="tw-border-l tw-pd-l-1 tw-flex tw-flex-column tw-flex-wrap tw-justify-content-start tw-align-items-start" > -
+
@@ -80,6 +81,11 @@ export default { context: { type: Object, required: false + }, + preview: { + type: Boolean, + required: false, + default: true } }, @@ -93,7 +99,7 @@ export default { computed: { passes() { - return this.tester && this.tester(this.context); + return this.preview && this.tester && this.tester(this.context); }, type() { diff --git a/src/modules/main_menu/components/profile-editor.vue b/src/modules/main_menu/components/profile-editor.vue index f2d7958c..b8f645fc 100644 --- a/src/modules/main_menu/components/profile-editor.vue +++ b/src/modules/main_menu/components/profile-editor.vue @@ -176,6 +176,7 @@ v-model="rules" :filters="filters" :context="test_context" + :preview="true" />
diff --git a/src/modules/main_menu/components/setting-filter-editor.vue b/src/modules/main_menu/components/setting-filter-editor.vue new file mode 100644 index 00000000..86bf4ce1 --- /dev/null +++ b/src/modules/main_menu/components/setting-filter-editor.vue @@ -0,0 +1,60 @@ + + + \ No newline at end of file diff --git a/src/sites/shared/player.jsx b/src/sites/shared/player.jsx index 913bda2c..bf6abe96 100644 --- a/src/sites/shared/player.jsx +++ b/src/sites/shared/player.jsx @@ -13,6 +13,9 @@ import { getFontsList, useFont } from 'utilities/fonts'; const STYLE_VALIDATOR = createElement('span'); +const LEFT_CONTROLS = '.video-player__default-player .player-controls__left-control-group'; +const RIGHT_CONTROLS = '.video-player__default-player .player-controls__right-control-group'; + const HAS_COMPRESSOR = window.AudioContext && window.DynamicsCompressorNode != null, HAS_GAIN = HAS_COMPRESSOR && window.GainNode != null; @@ -75,6 +78,9 @@ export default class PlayerBase extends Module { this.onShortcut = this.onShortcut.bind(this); + this.LEFT_CONTROLS = LEFT_CONTROLS; + this.RIGHT_CONTROLS = RIGHT_CONTROLS; + this.registerSettings(); } @@ -1171,7 +1177,7 @@ export default class PlayerBase extends Module { addGainSlider(inst, visible_only, tries = 0) { const outer = inst.props.containerRef || this.fine.getChildNode(inst), video = inst.props.mediaPlayerInstance?.mediaSinkManager?.video || inst.props.mediaPlayerInstance?.core?.mediaSinkManager?.video, - container = outer && outer.querySelector('.video-player__default-player .player-controls__left-control-group'); + container = outer && outer.querySelector(LEFT_CONTROLS); let gain = video != null && video._ffz_compressed && video._ffz_gain; if ( this.areControlsDisabled(inst) ) @@ -1302,7 +1308,7 @@ export default class PlayerBase extends Module { addCompressorButton(inst, visible_only, tries = 0) { const outer = inst.props.containerRef || this.fine.getChildNode(inst), video = inst.props.mediaPlayerInstance?.mediaSinkManager?.video || inst.props.mediaPlayerInstance?.core?.mediaSinkManager?.video, - container = outer && outer.querySelector('.video-player__default-player .player-controls__left-control-group'), + container = outer && outer.querySelector(LEFT_CONTROLS), has_comp = HAS_COMPRESSOR && video != null && this.settings.get('player.compressor.enable'); if ( ! container ) { @@ -1730,7 +1736,7 @@ export default class PlayerBase extends Module { const outer = inst.props.containerRef || this.fine.getChildNode(inst), video = inst.props.mediaPlayerInstance?.mediaSinkManager?.video || inst.props.mediaPlayerInstance?.core?.mediaSinkManager?.video, is_fs = video && document.fullscreenElement && document.fullscreenElement.contains(video), - container = outer && outer.querySelector('.video-player__default-player .player-controls__right-control-group'), + container = outer && outer.querySelector(RIGHT_CONTROLS), has_pip = document.pictureInPictureEnabled && this.settings.get('player.button.pip'); if ( ! container ) { @@ -1833,7 +1839,7 @@ export default class PlayerBase extends Module { addResetButton(inst, tries = 0) { const outer = inst.props.containerRef || this.fine.getChildNode(inst), - container = outer && outer.querySelector('.video-player__default-player .player-controls__right-control-group'), + container = outer && outer.querySelector(RIGHT_CONTROLS), has_reset = this.settings.get('player.button.reset'); if ( ! container ) { @@ -2055,7 +2061,7 @@ export default class PlayerBase extends Module { return; const outer = inst.props.containerRef || this.fine.getChildNode(inst), - container = outer && outer.querySelector('.video-player__default-player .player-controls__right-control-group'); + container = outer && outer.querySelector(RIGHT_CONTROLS); if ( ! container ) return; diff --git a/src/utilities/constants.js b/src/utilities/constants.js index c1724aab..0d3b902f 100644 --- a/src/utilities/constants.js +++ b/src/utilities/constants.js @@ -45,7 +45,8 @@ export const RERENDER_SETTINGS = [ 'chat.filtering.display-deleted', 'chat.filtering.display-mod-action', 'chat.replies.style', - 'chat.bits.cheer-notice' + 'chat.bits.cheer-notice', + 'chat.filtering.hidden-tokens' ]; export const UPDATE_BADGE_SETTINGS = [